1 | //# sourceURL=J_IPX800.js |
---|
2 | //------------------------------------------------------------- |
---|
3 | // IPX 800 Plugin javascript Tabs |
---|
4 | //------------------------------------------------------------- |
---|
5 | var ipx800_Svs = 'urn:upnp-org:serviceId:IPX8001'; |
---|
6 | var ip_address = data_request_url; |
---|
7 | |
---|
8 | //------------------------------------------------------------- |
---|
9 | // Utilities Javascript |
---|
10 | //------------------------------------------------------------- |
---|
11 | if (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 | |
---|
27 | function isFunction(x) { |
---|
28 | return Object.prototype.toString.call(x) == '[object Function]'; |
---|
29 | } |
---|
30 | |
---|
31 | //------------------------------------------------------------- |
---|
32 | // Utilities for searching Vera devices |
---|
33 | //------------------------------------------------------------- |
---|
34 | function 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 | |
---|
44 | function 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 | |
---|
54 | function findRootDevice(deviceID) |
---|
55 | { |
---|
56 | var idx = findRootDeviceIdx(deviceID) ; |
---|
57 | return jsonp.ud.devices[idx].id; |
---|
58 | } |
---|
59 | |
---|
60 | //------------------------------------------------------------- |
---|
61 | // Device TAB : Settings |
---|
62 | //------------------------------------------------------------- |
---|
63 | function 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 | //------------------------------------------------------------- |
---|
73 | function 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 | //------------------------------------------------------------- |
---|
141 | function handleCheckbox(deviceID, varName, cb) { |
---|
142 | return save(deviceID, varName, cb.checked?"1":"0"); |
---|
143 | } |
---|
144 | |
---|
145 | function ipx_SetIpAddress(deviceID, varName, varVal) { |
---|
146 | return save(deviceID, varName, varVal, goodip); |
---|
147 | } |
---|
148 | function ipx_SetOutputRelays(deviceID, varName, varVal) { |
---|
149 | return save(deviceID, varName, varVal, goodcsvoutput, true); |
---|
150 | } |
---|
151 | function ipx_SetInputRelays(deviceID, varName, varVal) { |
---|
152 | return save(deviceID, varName, varVal, goodcsvinput, true); |
---|
153 | } |
---|
154 | function ipx_SetAnalogInputs(deviceID, varName, varVal) { |
---|
155 | return save(deviceID, varName, varVal, goodcsvanalog, true); |
---|
156 | } |
---|
157 | function ipx_SetUpdateFrequency(deviceID, varName, varVal) { |
---|
158 | return save(deviceID, varName, varVal, goodint); |
---|
159 | } |
---|
160 | function 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 | } |
---|
166 | function goodint(v) |
---|
167 | { |
---|
168 | var reg = new RegExp('^[0-9]+$', 'i'); |
---|
169 | return(reg.test(v)); |
---|
170 | } |
---|
171 | function goodcsv(v) |
---|
172 | { |
---|
173 | var reg = new RegExp('^[0-9]*(,[0-9]+)*$', 'i'); |
---|
174 | return(reg.test(v)); |
---|
175 | } |
---|
176 | function 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 | } |
---|
182 | function goodcsvinput(v) |
---|
183 | { |
---|
184 | var reg = new RegExp('^[0-9]*[PM]?(,[0-9]+[PM]?)*$', 'i'); |
---|
185 | return(reg.test(v)); |
---|
186 | } |
---|
187 | function goodcsvanalog(v) |
---|
188 | { |
---|
189 | var reg = new RegExp('^[0-9]*[TL]?(,[0-9]+[TLH]?)*$', 'i'); |
---|
190 | return(reg.test(v)); |
---|
191 | } |
---|
192 | function 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 | //------------------------------------------------------------- |
---|
215 | function 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 | //------------------------------------------------------------- |
---|
240 | function 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 | |
---|
249 | function 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 | |
---|
255 | function 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 | |
---|