node-red-contrib-knx-ultimate 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/KNXEngine/dptlib/index.js +1 -1
  3. package/KNXUltimate.code-workspace +11 -1
  4. package/README.md +1 -1
  5. package/img/hue.png +0 -0
  6. package/img/hueButton.png +0 -0
  7. package/img/hueLight.png +0 -0
  8. package/img/knx.png +0 -0
  9. package/nodes/hue-config.js +20 -6
  10. package/nodes/knxUltimateHueButton.html +586 -0
  11. package/nodes/knxUltimateHueButton.js +159 -0
  12. package/nodes/knxUltimateHueLight.html +363 -55
  13. package/nodes/knxUltimateHueLight.js +70 -13
  14. package/nodes/locales/en-US/knxUltimateHueLight.json +3 -3
  15. package/nodes/utils/hueColorConverter.js +237 -0
  16. package/nodes/utils/hueUtils.js +37 -21
  17. package/package.json +6 -4
  18. package/nodes/locales/en-US/knxUltimateHueLight.html +0 -10
  19. /package/nodes/locales/{de → de-disabled}/hue-config.html +0 -0
  20. /package/nodes/locales/{de → de-disabled}/hue-config.json +0 -0
  21. /package/nodes/locales/{de → de-disabled}/knxUltimate-config.html +0 -0
  22. /package/nodes/locales/{de → de-disabled}/knxUltimate-config.json +0 -0
  23. /package/nodes/locales/{de → de-disabled}/knxUltimate.html +0 -0
  24. /package/nodes/locales/{de → de-disabled}/knxUltimate.json +0 -0
  25. /package/nodes/locales/{de → de-disabled}/knxUltimateAlerter.html +0 -0
  26. /package/nodes/locales/{de → de-disabled}/knxUltimateAlerter.json +0 -0
  27. /package/nodes/locales/{de → de-disabled}/knxUltimateGlobalContext.html +0 -0
  28. /package/nodes/locales/{de → de-disabled}/knxUltimateGlobalContext.json +0 -0
  29. /package/nodes/locales/{de → de-disabled}/knxUltimateHueLight.html +0 -0
  30. /package/nodes/locales/{de → de-disabled}/knxUltimateHueLight.json +0 -0
  31. /package/nodes/locales/{de → de-disabled}/knxUltimateLoadControl.html +0 -0
  32. /package/nodes/locales/{de → de-disabled}/knxUltimateLoadControl.json +0 -0
  33. /package/nodes/locales/{de → de-disabled}/knxUltimateLogger.html +0 -0
  34. /package/nodes/locales/{de → de-disabled}/knxUltimateLogger.json +0 -0
  35. /package/nodes/locales/{de → de-disabled}/knxUltimateSceneController.html +0 -0
  36. /package/nodes/locales/{de → de-disabled}/knxUltimateSceneController.json +0 -0
  37. /package/nodes/locales/{de → de-disabled}/knxUltimateViewer.html +0 -0
  38. /package/nodes/locales/{de → de-disabled}/knxUltimateViewer.json +0 -0
  39. /package/nodes/locales/{de → de-disabled}/knxUltimateWatchDog.html +0 -0
  40. /package/nodes/locales/{de → de-disabled}/knxUltimateWatchDog.json +0 -0
@@ -0,0 +1,586 @@
1
+ <script type="text/javascript">
2
+ RED.nodes.registerType('knxUltimateHueButton', {
3
+ category: "KNX Ultimate",
4
+ color: '#C7E9C0',
5
+ defaults: {
6
+ //buttonState: {value: true},
7
+ server: { type: "knxUltimate-config", required: true },
8
+ serverHue: { type: "hue-config", required: true },
9
+ name: { value: "Hue Button (beta)" },
10
+
11
+ nameinitial_press: { value: "" },
12
+ GAinitial_press: { value: "" },
13
+ dptinitial_press: { value: "" },
14
+
15
+ namerepeat: { value: "" },
16
+ GArepeat: { value: "" },
17
+ dptrepeat: { value: "" },
18
+
19
+ nameshort_release: { value: "" },
20
+ GAshort_release: { value: "" },
21
+ dptshort_release: { value: "" },
22
+
23
+ namelong_release: { value: "" },
24
+ GAlong_release: { value: "" },
25
+ dptlong_release: { value: "" },
26
+
27
+ namedouble_short_release: { value: "" },
28
+ GAdouble_short_release: { value: "" },
29
+ dptdouble_short_release: { value: "" },
30
+
31
+ namelong_press: { value: "" },
32
+ GAlong_press: { value: "" },
33
+ dptlong_press: { value: "" },
34
+
35
+ toggleValues: { value: true },
36
+ hueDevice: { value: "" }
37
+ },
38
+ inputs: 0,
39
+ outputs: 0,
40
+ icon: "node-hue-icon.svg",
41
+ label: function () {
42
+ return (this.name);
43
+ },
44
+ paletteLabel: "Hue Button",
45
+ // button: {
46
+ // enabled: function() {
47
+ // // return whether or not the button is enabled, based on the current
48
+ // // configuration of the node
49
+ // return !this.changed
50
+ // },
51
+ // visible: function() {
52
+ // // return whether or not the button is visible, based on the current
53
+ // // configuration of the node
54
+ // return this.hasButton
55
+ // },
56
+ // //toggle: "buttonState",
57
+ // onclick: function() {}
58
+ // },
59
+ oneditprepare: function () {
60
+ var node = this;
61
+ var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
62
+ var oNodeServerHue = RED.nodes.node($("#node-input-serverHue").val()); // Store the config-node
63
+
64
+ // 19/02/2020 Used to get the server sooner als deploy.
65
+ $("#node-input-server").change(function () {
66
+ try {
67
+ oNodeServer = RED.nodes.node($(this).val());
68
+ } catch (error) { }
69
+ });
70
+ // 19/02/2020 Used to get the server sooner als deploy.
71
+ $("#node-input-serverHue").change(function () {
72
+ try {
73
+ oNodeServerHue = RED.nodes.node($(this).val());
74
+ } catch (error) { }
75
+ });
76
+
77
+ // 31/03/2020 Search Helper
78
+ function fullSearch(sourceText, searchString) {
79
+ // This searches for all words in a string
80
+ var aSearchWords = searchString.toLowerCase().split(" ");
81
+ var i = 0;
82
+ for (let index = 0; index < aSearchWords.length; index++) {
83
+ if (sourceText.toLowerCase().indexOf(aSearchWords[index]) > -1) i += 1;
84
+ }
85
+ return i == aSearchWords.length;
86
+ }
87
+
88
+ // DPT Switch command
89
+ // ########################
90
+ $.getJSON('knxUltimateDpts', (data) => {
91
+ data.forEach(dpt => {
92
+ if (dpt.value.startsWith("1.")) {
93
+ $("#node-input-dptinitial_press").append($("<option></option>")
94
+ .attr("value", dpt.value)
95
+ .text(dpt.text))
96
+ }
97
+ });
98
+ $("#node-input-dptinitial_press").val(this.dptinitial_press)
99
+ })
100
+
101
+ // Autocomplete suggestion with ETS csv File
102
+ $("#node-input-GAinitial_press").autocomplete({
103
+ minLength: 1,
104
+ source: function (request, response) {
105
+ //$.getJSON("csv", request, function( data, status, xhr ) {
106
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
107
+ response($.map(data, function (value, key) {
108
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
109
+ if (fullSearch(sSearch, request.term + " 1.")) {
110
+ return {
111
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
112
+ value: value.ga // Value
113
+ }
114
+ } else {
115
+ return null;
116
+ }
117
+ }));
118
+ });
119
+ }, select: function (event, ui) {
120
+ // Sets Datapoint and device name automatically
121
+ var sDevName = ui.item.label.split("#")[1].trim();
122
+ try {
123
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
124
+ } catch (error) {
125
+ }
126
+ $('#node-input-nameinitial_press').val(sDevName);
127
+ var optVal = $("#node-input-dptinitial_press option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
128
+ // Select the option value
129
+ $("#node-input-dptinitial_press").val(optVal);
130
+ }
131
+ });
132
+ // ########################
133
+
134
+
135
+
136
+ // DPT repeat
137
+ // ########################
138
+ $.getJSON('knxUltimateDpts', (data) => {
139
+ data.forEach(dpt => {
140
+ if (dpt.value.startsWith("1.") || dpt.value.startsWith("3.007")) {
141
+ $("#node-input-dptrepeat").append($("<option></option>")
142
+ .attr("value", dpt.value)
143
+ .text(dpt.text))
144
+ }
145
+ });
146
+
147
+ $("#node-input-dptrepeat").val(this.dptrepeat)
148
+ })
149
+
150
+ // Autocomplete suggestion with ETS csv File
151
+ $("#node-input-GArepeat").autocomplete({
152
+ minLength: 1,
153
+ source: function (request, response) {
154
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
155
+ response($.map(data, function (value, key) {
156
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
157
+ if (fullSearch(sSearch, request.term)) {
158
+ if (value.dpt.startsWith('1.') || value.dpt.startsWith('3.007')) {
159
+ return {
160
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
161
+ value: value.ga // Value
162
+ }
163
+ } else { return null; }
164
+ } else {
165
+ return null;
166
+ }
167
+ }));
168
+ });
169
+ }, select: function (event, ui) {
170
+ // Sets Datapoint and device name automatically
171
+ var sDevName = ui.item.label.split("#")[1].trim();
172
+ try {
173
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
174
+ } catch (error) {
175
+ }
176
+ $('#node-input-namerepeat').val(sDevName);
177
+ var optVal = $("#node-input-dptrepeat option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
178
+ // Select the option value
179
+ $("#node-input-dptrepeat").val(optVal);
180
+ }
181
+ });
182
+
183
+
184
+ // DPT dptshort_release
185
+ // ########################
186
+ $.getJSON('knxUltimateDpts', (data) => {
187
+ data.forEach(dpt => {
188
+ if (dpt.value.startsWith('1.')) {
189
+ $("#node-input-dptshort_release").append($("<option></option>")
190
+ .attr("value", dpt.value)
191
+ .text(dpt.text))
192
+ }
193
+ });
194
+
195
+ $("#node-input-dptshort_release").val(this.dptshort_release)
196
+
197
+ })
198
+
199
+ // Autocomplete suggestion with ETS csv File
200
+ $("#node-input-GAshort_release").autocomplete({
201
+ minLength: 1,
202
+ source: function (request, response) {
203
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
204
+ response($.map(data, function (value, key) {
205
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
206
+ if (fullSearch(sSearch, request.term + " 1.")) {
207
+ return {
208
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
209
+ value: value.ga // Value
210
+ }
211
+ } else {
212
+ return null;
213
+ }
214
+ }));
215
+ });
216
+ }, select: function (event, ui) {
217
+ // Sets Datapoint and device name automatically
218
+ var sDevName = ui.item.label.split("#")[1].trim();
219
+ try {
220
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
221
+ } catch (error) {
222
+ }
223
+ $('#node-input-nameshort_release').val(sDevName);
224
+ var optVal = $("#node-input-dptshort_release option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
225
+ // Select the option value
226
+ $("#node-input-dptshort_release").val(optVal);
227
+ }
228
+ });
229
+
230
+
231
+ // DPT dptlong_release and dptLightColorStateƒ
232
+ // ########################
233
+ $.getJSON('knxUltimateDpts', (data) => {
234
+ data.forEach(dpt => {
235
+ if (dpt.value.startsWith('1.')) {
236
+ $("#node-input-dptlong_release").append($("<option></option>")
237
+ .attr("value", dpt.value)
238
+ .text(dpt.text))
239
+ $("#node-input-dptdouble_short_release").append($("<option></option>")
240
+ .attr("value", dpt.value)
241
+ .text(dpt.text))
242
+ }
243
+ });
244
+
245
+ $("#node-input-dptlong_release").val(this.dptlong_release)
246
+ $("#node-input-dptdouble_short_release").val(this.dptdouble_short_release)
247
+
248
+ })
249
+
250
+ // Autocomplete suggestion with ETS csv File
251
+ $("#node-input-GAlong_release").autocomplete({
252
+ minLength: 1,
253
+ source: function (request, response) {
254
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
255
+ response($.map(data, function (value, key) {
256
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
257
+ if (fullSearch(sSearch, request.term + " 1.")) {
258
+ return {
259
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
260
+ value: value.ga // Value
261
+ }
262
+ } else {
263
+ return null;
264
+ }
265
+ }));
266
+ });
267
+ }, select: function (event, ui) {
268
+ // Sets Datapoint and device name automatically
269
+ var sDevName = ui.item.label.split("#")[1].trim();
270
+ try {
271
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
272
+ } catch (error) {
273
+ }
274
+ $('#node-input-namelong_release').val(sDevName);
275
+ var optVal = $("#node-input-dptlong_release option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
276
+ // Select the option value
277
+ $("#node-input-dptlong_release").val(optVal);
278
+ }
279
+ });
280
+
281
+ // Autocomplete suggestion with ETS csv File
282
+ $("#node-input-GAdouble_short_release").autocomplete({
283
+ minLength: 1,
284
+ source: function (request, response) {
285
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
286
+ response($.map(data, function (value, key) {
287
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
288
+ if (fullSearch(sSearch, request.term + " 1.")) {
289
+ return {
290
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
291
+ value: value.ga // Value
292
+ }
293
+ } else {
294
+ return null;
295
+ }
296
+ }));
297
+ });
298
+ }, select: function (event, ui) {
299
+ // Sets Datapoint and device name automatically
300
+ var sDevName = ui.item.label.split("#")[1].trim();
301
+ try {
302
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
303
+ } catch (error) {
304
+ }
305
+ $('#node-input-namedouble_short_release').val(sDevName);
306
+ var optVal = $("#node-input-dptdouble_short_release option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
307
+ // Select the option value
308
+ $("#node-input-dptdouble_short_release").val(optVal);
309
+ }
310
+ });
311
+
312
+
313
+
314
+ // DPT dptlong_press
315
+ // ########################
316
+ $.getJSON('knxUltimateDpts', (data) => {
317
+ data.forEach(dpt => {
318
+ if (dpt.value.startsWith('1.')) {
319
+ $("#node-input-dptlong_press").append($("<option></option>")
320
+ .attr("value", dpt.value)
321
+ .text(dpt.text))
322
+ }
323
+ });
324
+
325
+ $("#node-input-dptlong_press").val(this.dptlong_press)
326
+
327
+ })
328
+
329
+ // Autocomplete suggestion with ETS csv File
330
+ $("#node-input-GAlong_press").autocomplete({
331
+ minLength: 1,
332
+ source: function (request, response) {
333
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
334
+ response($.map(data, function (value, key) {
335
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
336
+ if (fullSearch(sSearch, request.term + " 1.")) {
337
+ return {
338
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
339
+ value: value.ga // Value
340
+ }
341
+ } else {
342
+ return null;
343
+ }
344
+ }));
345
+ });
346
+ }, select: function (event, ui) {
347
+ // Sets Datapoint and device name automatically
348
+ var sDevName = ui.item.label.split("#")[1].trim();
349
+ try {
350
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
351
+ } catch (error) {
352
+ }
353
+ $('#node-input-namelong_press').val(sDevName);
354
+ var optVal = $("#node-input-dptlong_press option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
355
+ // Select the option value
356
+ $("#node-input-dptlong_press").val(optVal);
357
+ }
358
+ });
359
+
360
+
361
+
362
+
363
+
364
+
365
+ // Autocomplete suggestion with HUE Lights
366
+ $("#node-input-name").autocomplete({
367
+ minLength: 1,
368
+ source: function (request, response) {
369
+ $.getJSON("KNXUltimateGetDevicesHUE?rtype=button&nodeID=" + oNodeServerHue.id, (data) => {
370
+ response($.map(data.devices, function (value, key) {
371
+ //alert(JSON.stringify(value) + " "+ key)
372
+ var sSearch = (value.name);
373
+ if (fullSearch(sSearch, request.term)) {
374
+ return {
375
+ hueDevice: value.id, // Label for Display
376
+ value: value.name // Value
377
+ }
378
+ } else {
379
+ return null;
380
+ }
381
+ }));
382
+ });
383
+ }, select: function (event, ui) {
384
+ // Sets the fields
385
+ $('#node-input-hueDevice').val(ui.item.hueDevice);
386
+ }
387
+ });
388
+
389
+
390
+ // ########################
391
+
392
+
393
+ },
394
+ oneditsave: function () {
395
+
396
+
397
+ },
398
+ oneditcancel: function () {
399
+
400
+ }
401
+ })
402
+
403
+ </script>
404
+
405
+ <script type="text/x-red" data-template-name="knxUltimateHueButton">
406
+
407
+
408
+ <div class="form-row">
409
+ <b>HUE Light</b>&nbsp&nbsp<span style="color:red"
410
+ &nbsp<i class="fa fa-question-circle"></i></span>
411
+ &nbsp<a target="_blank" href="https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/en-hue-configuration"><u>Configuration</u></a>
412
+ <br />
413
+ <p align="center"><img src='https://raw.githubusercontent.com/Supergiovane/node-red-contrib-knx-ultimate/master/img/hueButton.png'></p>
414
+ <br />
415
+ <label for="node-input-server" >
416
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAKnRFWHRDcmVhdGlvbiBUaW1lAEZyIDYgQXVnIDIwMTAgMjE6NTI6MTkgKzAxMDD84aS8AAAAB3RJTUUH3gYYCicNV+4WIQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAACUSURBVHjaY2CgFZg5c+Z/ZEyWAZ8+f/6/ZsWs/xoamqMGkGrA6Wla/1+fVARjEBuGsSoGmY4eZSCNL59d/g8DIDbIAHR14OgFGQByKjIGKX5+6/T///8gGMQGiV1+/B0Fg70GIkD+RMYgxf/O5/7//2MSmAZhkBi6OrgB6Bg5DGB4ajr3f2xqsYYLSDE2THJUDg0AAAqyDVd4tp4YAAAAAElFTkSuQmCC"></img>
417
+ KNX GW
418
+ </label>
419
+ <input type="text" id="node-input-server" />
420
+ </div>
421
+
422
+ <div class="form-row">
423
+ <label for="node-input-serverHue">
424
+ <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg=="/>
425
+ HUE Bridge
426
+ </label>
427
+ <input type="text" id="node-input-serverHue" />
428
+ </div>
429
+
430
+ <br/>
431
+ <p>
432
+ <b>Philips HUE</b>
433
+ </p>
434
+
435
+ <div class="form-row">
436
+ <label for="node-input-hueDevice" >
437
+ <i class="fa fa-play-circle"></i>&nbspHue Button</label>
438
+ <input type="text" id="node-input-name" placeholder="Enter your hue device name" />
439
+ <input type="hidden" id="node-input-hueDevice" />
440
+ </div>
441
+
442
+ <br/>
443
+
444
+ <!-- <p> <img src='https://raw.githubusercontent.com/Supergiovane/node-red-contrib-knx-ultimate/master/img/knx.png' width='32px'> -> <img src='https://raw.githubusercontent.com/Supergiovane/node-red-contrib-knx-ultimate/master/img/hue.png' width='32px'></p> -->
445
+
446
+ <p>
447
+ <b>PHILIPS HUE BUTTON EVENTS -> TO KNX</b>
448
+ </p>
449
+
450
+ <div class="form-row">
451
+ <label for="node-input-nameinitial_press" style="width:100px;"><i class="fa fa-play-circle-o"></i> Initial press</span></label>
452
+
453
+ <label for="node-input-GAinitial_press" style="width:20px;">GA</label>
454
+ <input type="text" id="node-input-GAinitial_press" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
455
+
456
+ <label for="node-input-dptinitial_press" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
457
+ <select id="node-input-dptinitial_press" style="width:140px;"></select>
458
+
459
+ <label for="node-input-nameinitial_press" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
460
+ <input type="text" id="node-input-nameinitial_press" style="width:200px;margin-left: 5px; text-align: left;">
461
+ </div>
462
+
463
+ <div class="form-row">
464
+ <label for="node-input-namerepeat" style="width:100px;"><i class="fa fa-play-circle-o"></i> Repeat</span></label>
465
+
466
+ <label for="node-input-GArepeat" style="width:20px;">GA</label>
467
+ <input type="text" id="node-input-GArepeat" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
468
+
469
+ <label for="node-input-dptrepeat" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
470
+ <select id="node-input-dptrepeat" style="width:140px;"></select>
471
+
472
+ <label for="node-input-namerepeat" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
473
+ <input type="text" id="node-input-namerepeat" style="width:200px;margin-left: 5px; text-align: left;">
474
+ </div>
475
+
476
+ <div class="form-row">
477
+ <label for="node-input-nameshort_release" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspShort release</label>
478
+
479
+ <label for="node-input-GAhort_release" style="width:20px;">GA</label>
480
+ <input type="text" id="node-input-GAshort_release" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
481
+
482
+ <label for="node-input-dptshort_release" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
483
+ <select id="node-input-dptshort_release" style="width:140px;"></select>
484
+
485
+ <label for="node-input-nameshort_release" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
486
+ <input type="text" id="node-input-nameshort_release" style="width:200px;margin-left: 5px; text-align: left;">
487
+ </div>
488
+
489
+ <div class="form-row">
490
+ <label for="node-input-namelong_release" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspLong release</label>
491
+
492
+ <label for="node-input-GAhort_release" style="width:20px;">GA</label>
493
+ <input type="text" id="node-input-GAlong_release" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
494
+
495
+ <label for="node-input-dptlong_release" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
496
+ <select id="node-input-dptlong_release" style="width:140px;"></select>
497
+
498
+ <label for="node-input-namelong_release" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
499
+ <input type="text" id="node-input-namelong_release" style="width:200px;margin-left: 5px; text-align: left;">
500
+ </div>
501
+
502
+ <div class="form-row">
503
+ <label for="node-input-namedouble_short_release" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspDouble short release</label>
504
+
505
+ <label for="node-input-GAdouble_short_release" style="width:20px;">GA</label>
506
+ <input type="text" id="node-input-GAdouble_short_release" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
507
+
508
+ <label for="node-input-dptdouble_short_release" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
509
+ <select id="node-input-dptdouble_short_release" style="width:140px;"></select>
510
+
511
+ <label for="node-input-namedouble_short_release" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueButton.node-input-name"></span></label>
512
+ <input type="text" id="node-input-namedouble_short_release" style="width:200px;margin-left: 5px; text-align: left;">
513
+ </div>
514
+
515
+ <div class="form-row">
516
+ <label for="node-input-namelong_press" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspLong press</label>
517
+
518
+ <label for="node-input-GAhort_release" style="width:20px;">GA</label>
519
+ <input type="text" id="node-input-GAlong_press" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
520
+
521
+ <label for="node-input-dptlong_press" style="width:40px; margin-left: 0px; text-align: right;">dpt</label>
522
+ <select id="node-input-dptlong_press" style="width:140px;"></select>
523
+
524
+ <label for="node-input-namelong_press" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
525
+ <input type="text" id="node-input-namelong_press" style="width:200px;margin-left: 5px; text-align: left;">
526
+ </div>
527
+
528
+ <div class="form-row">
529
+ <input type="checkbox" id="node-input-toggleValues" style="display:inline-block; width:auto; vertical-align:top;" />
530
+ <label style="width:auto" for="node-input-toggleValues">
531
+ <img
532
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAFGmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjM6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMzoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nhtLUgAAAE9JREFUKJG1UMsOACAIgub//7IdqvVQtjrExU1EEQLuiGCvgTNgl5D74MmVZPu4wIxQAgm+/sDec2VhgQPgf0sq1unjMlYJE/3MZrvy+kMFZQkZEWfC7ikAAAAASUVORK5CYII="></img>
533
+ Toggle values
534
+ </label>
535
+ </div>
536
+
537
+ </div>
538
+
539
+
540
+ <br/>
541
+ <br/>
542
+ <br/>
543
+ <br/>
544
+ <br/>
545
+ <br/>
546
+ <br/>
547
+ <br/>
548
+
549
+
550
+ </script>
551
+
552
+ <script type="text/markdown" data-help-name="knxUltimateHueButton">
553
+
554
+ [Find it useful?](https://www.paypal.me/techtoday)
555
+
556
+ This node lets you get the events of your HUE button.<br/>
557
+ There are many event you can choose from. The relevants one are *short release* and *repeat*.<br/>
558
+ In *short release* you can send true/false to your KNX group address to, for example, toggle a light.<br/>
559
+ In *repeat* event, you can DIM a KNX light.<br/>
560
+ The **toggle values** option is enabled by default. This option toggles the value of each KNX group address (*true/false, increase/decrease dim*))
561
+
562
+ **General**
563
+ |Property|Description|
564
+ |--|--|
565
+ | KNX GW | Select the KNX gateway to be used |
566
+ | HUE Bridge | Select the HUE Bridge to be used |
567
+ | Hue Button | HUE button to be used. The avaiable buttons start showing up while you're typing.|
568
+
569
+ <br/>
570
+
571
+ **PHILIPS HUE BUTTON EVENTS -> TO KNX**
572
+ Here you can get the HUE button events.<br/>
573
+ Start typing in the GA field, the name or group address of your KNX device, the avaiable devices start showing up while you're typing.
574
+
575
+ |Property|Description|
576
+ |--|--|
577
+ | Initial press | As soon as you press your HUE button, this event fires|
578
+ | Repeat | This command is used either to send DIM (increase/decrease) or true/false commands to the KNX group address |
579
+ | Short release | Rapid push of the button, fired as soon as you release your finger from the button. Usually used to toggle a KNX light true/false |
580
+ | Long release | Long press of the button, fired as soon as you release your finger from the button |
581
+ | Long press | Long press of the button, fired as soon as you long press the button |
582
+ | Toggle values | Enable or disable toggling values. If enabled, all values toggles, otherwise, all values are sent as *true* or *increase dim*, to the selected KNX group address. |
583
+
584
+
585
+ <br/>
586
+ </script>