source: trunk/J_IPX800.js @ 406

Revision 406, 13.5 KB checked in by amg0, 10 years ago (diff)

different up cycle time and down cycle time

Line 
1//# sourceURL=J_IPX800.js
2//-------------------------------------------------------------
3// IPX 800 Plugin javascript Tabs
4//-------------------------------------------------------------
5var ipx800_Svs = 'urn:upnp-org:serviceId:IPX8001';
6var ip_address = data_request_url;
7
8//-------------------------------------------------------------
9// Utilities Javascript
10//-------------------------------------------------------------
11if (typeof String.prototype.format == 'undefined') {
12    String.prototype.format = function()
13    {
14       var content = this;
15       for (var i=0; i < arguments.length; i++)
16       {
17            var replacement = new RegExp('\\{' + i + '\\}', 'g');   // regex requires \ and assignment into string requires \\,
18            // if ($.type(arguments[i]) === "string")
19                // arguments[i] = arguments[i].replace(/\$/g,'$');
20            content = content.replace(replacement, arguments[i]); 
21       }
22       return content;
23    };
24};
25
26
27function isFunction(x) {
28  return Object.prototype.toString.call(x) == '[object Function]';
29}
30
31//-------------------------------------------------------------
32// Utilities for searching Vera devices
33//-------------------------------------------------------------
34function findDeviceIdx(deviceID) 
35{
36    //jsonp.ud.devices
37    for(var i=0; i<jsonp.ud.devices.length; i++) {
38        if (jsonp.ud.devices[i].id == deviceID) 
39            return i;
40    }
41    return null;
42}
43
44function findRootDeviceIdx(deviceID) 
45{
46    var idx = findDeviceIdx(deviceID);
47    while (jsonp.ud.devices[idx].id_parent != 0)
48    {
49        idx = findDeviceIdx(jsonp.ud.devices[idx].id_parent);
50    }
51    return idx;
52}
53
54function findRootDevice(deviceID)
55{
56    var idx = findRootDeviceIdx(deviceID) ;
57    return jsonp.ud.devices[idx].id;
58}
59
60//-------------------------------------------------------------
61// Device TAB : Settings
62//-------------------------------------------------------------
63function ipx800_Donate(deviceID) {
64    var htmlDonate='For those who really like this plugin and feel like it, you can donate what you want here on Paypal. It will not buy you more support not any garantee that this can be maintained or evolve in the future but if you want to show you are happy and would like my kids to transform some of the time I steal from them into some <i>concrete</i> returns, please feel very free ( and absolutely not forced to ) to donate whatever you want.  thank you ! ';
65    htmlDonate += '<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----"><input type="image" src="https://www.paypalobjects.com/en_US/FR/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"><img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1"></form>';
66    var html = '<div>'+htmlDonate+'</div>';
67    set_panel_html(html);
68}
69
70//-------------------------------------------------------------
71// Device TAB : Settings
72//-------------------------------------------------------------
73function ipx800_Settings(deviceID) {
74    // first determine if it is a child device or not
75    //var device = findDeviceIdx(deviceID);
76    //var debug  = get_device_state(deviceID,  ipx800_Svs, 'Debug',1);
77    //var root = (device!=null) && (jsonp.ud.devices[device].id_parent==0);
78    var present  = get_device_state(deviceID,  ipx800_Svs, 'Present',1);
79    var ipaddr = get_device_state(deviceID,  ipx800_Svs, 'IpxIpAddress',1);
80    var updatefrequency = get_device_state(deviceID,  ipx800_Svs, 'UpdateFrequency',1);
81    var outputRelays = get_device_state(deviceID,  ipx800_Svs, 'OutputRelays',1);
82    var inputRelays = get_device_state(deviceID,  ipx800_Svs, 'InputRelays',1);
83    var analogInputs = get_device_state(deviceID,  ipx800_Svs, 'AnalogInputs',1);
84   
85    var htmlopenipx = '<button class="btn btn-default" id="ipx800_OpenWeb" type="button">Configure</button>';
86    var htmlipaddr = 'IPX ip(:port) :</td><td><input id="ipx800_IpxIpAddress" type="text" size="15" value="'+ipaddr+'" onchange="ipx_SetIpAddress(' + deviceID + ', \'IpxIpAddress\', this.value);"> <button class="btn btn-default" id="ipx800_TestRefresh">Test</button>'+htmlopenipx;
87    var htmlrefresh = 'Update Frequency:</td><td><input id="updatefrequency" size="5" min="0" max="9999" type="number" value="'+updatefrequency+'" onchange="ipx_SetUpdateFrequency(' + deviceID + ', \'UpdateFrequency\', this.value)"> seconds.';
88    var htmlpushmsg = 'you can also configure a PUSH from the ipx800 with the following path: /data_request?id=lr_IPX800_Handler&mac=$M&deviceID='+deviceID;
89    var htmloutput = 'Show Output Relays:</td><td><input id="ipx800_OutputRelays" type="text" size="15" value="'+outputRelays+'" onchange="ipx_SetOutputRelays(' + deviceID + ', \'OutputRelays\', this.value);">'+' csv list of numbers (1..32) & optional type W for window cover.ex: 1,5,6 or 1W-2-3-30-40,5,6 for up,"W","-",stop,"-",down,"-",up cycle,"-",down cycle duration in sec. Relays must be configured in pulse mode for window cover )';
90    var htmlinput = 'Show Digital Input:</td><td><input id="ipx800_InputRelays" type="text" size="15" value="'+inputRelays+'" onchange="ipx_SetInputRelays(' + deviceID + ', \'InputRelays\', this.value);">'+' csv list of numbers & optional type : 1,2 or 1P,2M';
91    var htmlanainput = 'Show Analog Inputs:</td><td><input id="ipx800_AnalogInputs" type="text" size="15" value="'+analogInputs+'" onchange="ipx_SetAnalogInputs(' + deviceID + ', \'AnalogInputs\', this.value);">'+' csv list of numbers & optional type TLH : 1,2 or 1T,2L';
92    var htmlrefreshnames = 'Special actions:</td><td><button class="btn btn-default" id="ipx800_IpxNames" type="button">Get IPX Names</button>';
93
94    var style=' <style>\
95      table#ipx800_table td:first-child{\
96        background-color: #E0E0E0;\
97        width: 140px;\
98      }\
99    </style>';
100    var html =
101        style+
102        '<div class="pane" id="pane"> '+ 
103        '<table class="table" id="ipx800_table">'+
104        '<tr><td>'+htmlipaddr+'</td></tr>' +
105        '<tr><td>'+htmlrefresh+'</td></tr>' +
106        '<tr><td></td><td>'+htmlpushmsg+'</td></tr>' +
107        '<tr><td>'+htmloutput+'</td></tr>' +
108        '<tr><td>'+htmlinput+'</td></tr>' +
109        '<tr><td>'+htmlanainput+'</td></tr>' +
110        '<tr><td>'+htmlrefreshnames+'</td></tr>' +
111        '</table>'+
112        '</div>' ;
113
114    //html = html + '<button id="button_save" type="button">Save</button>'
115    set_panel_html(html);
116
117    // click  handler to get pattern value and add it to target names
118    jQuery( "#ipx800_OpenWeb" ).click(function() {
119        ipaddr = get_device_state(deviceID,  ipx800_Svs, 'IpxIpAddress',1);
120        var url = "http://{0}".format(ipaddr);
121        window.open(url);
122    });
123    jQuery( "#ipx800_IpxNames" ).click(function() {
124        var url = buildUPnPActionUrl(deviceID,ipx800_Svs,"IPXNames");
125        jQuery.get( url );
126    });
127    jQuery( "#ipx800_TestRefresh" ).click(function() {
128        var url = buildUPnPActionUrl(deviceID,ipx800_Svs,"Refresh");
129        jQuery.get( url ,function( data ) {
130            //alert("Success:"+data);
131        })
132        .fail(function() {
133            alert("Internal failure, could not run the VERA action");
134        });
135    });
136}
137
138//-------------------------------------------------------------
139// Save functions
140//-------------------------------------------------------------
141function handleCheckbox(deviceID, varName, cb) {
142    return save(deviceID, varName, cb.checked?"1":"0");
143}
144
145function ipx_SetIpAddress(deviceID, varName, varVal) {
146    return save(deviceID, varName, varVal, goodip);
147}
148function ipx_SetOutputRelays(deviceID, varName, varVal) {
149    return save(deviceID, varName, varVal, goodcsvoutput, true);
150}
151function ipx_SetInputRelays(deviceID, varName, varVal) {
152    return save(deviceID, varName, varVal, goodcsvinput, true);
153}
154function ipx_SetAnalogInputs(deviceID, varName, varVal) {
155    return save(deviceID, varName, varVal, goodcsvanalog, true);
156}
157function ipx_SetUpdateFrequency(deviceID, varName, varVal) {
158    return save(deviceID, varName, varVal, goodint);
159}
160function goodip(ip)
161{
162    // @duiffie contribution
163    var reg = new RegExp('^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:\\d{1,5})?$', 'i');
164    return(reg.test(ip));
165}
166function goodint(v)
167{
168    var reg = new RegExp('^[0-9]+$', 'i');
169    return(reg.test(v));
170}
171function goodcsv(v)
172{
173    var reg = new RegExp('^[0-9]*(,[0-9]+)*$', 'i');
174    return(reg.test(v));
175}
176function goodcsvoutput(v)
177{
178    // ex: 1W-2-3-20,2,3W-2-3-40,3W-2-3-40
179    var reg =  /^(\d+(W-\d+-\d+(-\d+)*|P)?)+(,\d+(W-\d+-\d+(-\d+)*|P)?)*$/; 
180    return(reg.test(v));
181}
182function goodcsvinput(v)
183{
184    var reg = new RegExp('^[0-9]*[PM]?(,[0-9]+[PM]?)*$', 'i');
185    return(reg.test(v));
186}
187function goodcsvanalog(v)
188{
189    var reg = new RegExp('^[0-9]*[TL]?(,[0-9]+[TLH]?)*$', 'i');
190    return(reg.test(v));
191}
192function save(deviceID, varName, varVal, func, reload) {
193    // reload is optional parameter and defaulted to false
194    if (typeof reload === "undefined" || reload === null) { 
195        reload = false; 
196    }
197
198    if ((!func) || func(varVal)) {
199        //set_device_state(deviceID,  ipx800_Svs, varName, varVal);
200        saveVar(deviceID,  ipx800_Svs, varName, varVal, reload)
201        jQuery('#ipx800_' + varName).css('color', 'black');
202    } else {
203        jQuery('#ipx800_' + varName).css('color', 'red');
204        alert(varName+':'+varVal+' is not correct');
205    }
206}
207
208//-------------------------------------------------------------
209// Pattern Matching functions
210//-------------------------------------------------------------
211
212//-------------------------------------------------------------
213// Variable saving ( log , then full save )
214//-------------------------------------------------------------
215function saveVar(deviceID,  ipx800_Svs, varName, varVal, reload)
216{
217    // set_device_state (deviceID, ipx800_Svs, varName, varVal, 0); // only updated at time of luup restart
218    set_device_state (deviceID, ipx800_Svs, varName, varVal, (reload==true) ? 0 : 1);   // lost in case of luup restart
219   
220    // 3rd method : updated immediately but not reflected !
221    var url = buildVariableSetUrl( deviceID, varName, varVal)
222    var jqxhr = jQuery.ajax({
223        url:url,
224        async:false     // important to be in synchronous mode in that case
225    }) 
226    .done(function() {
227        // success, remove pending save for this variable
228
229    })
230    .fail(function() {
231        // error, keep track of error, keep entry in DB for next save
232
233    });
234}
235
236
237//-------------------------------------------------------------
238// Helper functions to build URLs to call VERA code from JS
239//-------------------------------------------------------------
240function buildVeraURL( deviceID, fnToUse, varName, varValue)
241{
242    var urlHead = '' + ip_address + 'id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunLua&Code=';
243    if (varValue != null)
244        return urlHead + fnToUse + '("' + ipx800_Svs + '", "' + varName + '", "' + varValue + '", ' + deviceID + ')';
245
246    return urlHead + fnToUse + '("' + ipx800_Svs + '", "' + varName + '", "", ' + deviceID + ')';
247}
248
249function buildVariableSetUrl( deviceID, varName, varValue)
250{
251    var urlHead = '' + ip_address + 'id=variableset&DeviceNum='+deviceID+'&serviceId='+ipx800_Svs+'&Variable='+varName+'&Value='+varValue;
252    return urlHead;
253}
254
255function buildUPnPActionUrl(deviceID,service,action)
256{
257    var urlHead = ip_address +'id=action&output_format=json&DeviceNum='+deviceID+'&serviceId='+service+'&action='+action;//'&newTargetValue=1';
258    return urlHead;
259}
260
261
Note: See TracBrowser for help on using the repository browser.