node-red-contrib-knx-ultimate 2.1.10 → 2.1.11

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ <p>
10
+ <b>Version 2.1.11</b> - June 2023<br/>
11
+ - KNX Global Context node: added the optional datastore to choose from.<br/>
12
+ </p>
9
13
  <p>
10
14
  <b>Version 2.1.10</b> - June 2023<br/>
11
15
  - KNX Gateway Node: Migrated documentation to the standard node-red documentation box.<br/>
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "knxultimate",
3
- "version": "1.0.22",
3
+ "version": "1.0.36",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "knxultimate",
9
- "version": "1.0.22",
9
+ "version": "1.0.36",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@types/node": "^6.14.4",
@@ -14,16 +14,16 @@
14
14
  "binary-parser": "1.1.5",
15
15
  "binary-protocol": "0.0.0",
16
16
  "caller-id": "^0.1.0",
17
- "crypto-js": ">=4.1.1",
17
+ "crypto-js": "4.1.1",
18
18
  "fs": "0.0.1-security",
19
- "ipaddr.js": ">=2.0.0",
20
- "lodash": ">=4.17.21",
19
+ "ipaddr.js": "2.0.0",
20
+ "lodash": "4.17.21",
21
21
  "log-driver": "1.2.7",
22
22
  "mkdirp": "^0.5.1",
23
- "os": ">=0.1.1",
24
- "path": ">=0.12.7",
25
- "ping": ">=0.4.1",
26
- "xml2js": ">=0.4.23"
23
+ "os": "0.1.1",
24
+ "path": "0.12.7",
25
+ "ping": "0.4.1",
26
+ "xml2js": "0.5.0"
27
27
  },
28
28
  "devDependencies": {},
29
29
  "engines": {
@@ -85,9 +85,9 @@
85
85
  "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
86
86
  },
87
87
  "node_modules/ipaddr.js": {
88
- "version": "2.0.1",
89
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
90
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
88
+ "version": "2.0.0",
89
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz",
90
+ "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w==",
91
91
  "engines": {
92
92
  "node": ">= 10"
93
93
  }
@@ -106,9 +106,12 @@
106
106
  }
107
107
  },
108
108
  "node_modules/minimist": {
109
- "version": "1.2.5",
110
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
111
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
109
+ "version": "1.2.8",
110
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
111
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
112
+ "funding": {
113
+ "url": "https://github.com/sponsors/ljharb"
114
+ }
112
115
  },
113
116
  "node_modules/mkdirp": {
114
117
  "version": "0.5.5",
@@ -122,9 +125,9 @@
122
125
  }
123
126
  },
124
127
  "node_modules/os": {
125
- "version": "0.1.2",
126
- "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
127
- "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
128
+ "version": "0.1.1",
129
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
130
+ "integrity": "sha512-jg06S2xr5De63mLjZVJDf3/k37tpjppr2LR7MUOsxv8XuUCVpCnvbCksXCBcB5gQqQf/K0+87WGTRlAj5q7r1A=="
128
131
  },
129
132
  "node_modules/path": {
130
133
  "version": "0.12.7",
@@ -191,9 +194,9 @@
191
194
  }
192
195
  },
193
196
  "node_modules/xml2js": {
194
- "version": "0.4.23",
195
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
196
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
197
+ "version": "0.5.0",
198
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
199
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
197
200
  "dependencies": {
198
201
  "sax": ">=0.6.0",
199
202
  "xmlbuilder": "~11.0.0"
@@ -264,9 +267,9 @@
264
267
  "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
265
268
  },
266
269
  "ipaddr.js": {
267
- "version": "2.0.1",
268
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
269
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng=="
270
+ "version": "2.0.0",
271
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz",
272
+ "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w=="
270
273
  },
271
274
  "lodash": {
272
275
  "version": "4.17.21",
@@ -279,9 +282,9 @@
279
282
  "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg=="
280
283
  },
281
284
  "minimist": {
282
- "version": "1.2.5",
283
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
284
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
285
+ "version": "1.2.8",
286
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
287
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
285
288
  },
286
289
  "mkdirp": {
287
290
  "version": "0.5.5",
@@ -292,9 +295,9 @@
292
295
  }
293
296
  },
294
297
  "os": {
295
- "version": "0.1.2",
296
- "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
297
- "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
298
+ "version": "0.1.1",
299
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
300
+ "integrity": "sha512-jg06S2xr5De63mLjZVJDf3/k37tpjppr2LR7MUOsxv8XuUCVpCnvbCksXCBcB5gQqQf/K0+87WGTRlAj5q7r1A=="
298
301
  },
299
302
  "path": {
300
303
  "version": "0.12.7",
@@ -348,9 +351,9 @@
348
351
  }
349
352
  },
350
353
  "xml2js": {
351
- "version": "0.4.23",
352
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
353
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
354
+ "version": "0.5.0",
355
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
356
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
354
357
  "requires": {
355
358
  "sax": ">=0.6.0",
356
359
  "xmlbuilder": "~11.0.0"
@@ -47,7 +47,7 @@
47
47
  "caller-id": "^0.1.0",
48
48
  "path": "0.12.7",
49
49
  "crypto-js": "4.1.1",
50
- "xml2js": "0.4.23",
50
+ "xml2js": "0.5.0",
51
51
  "aes-cbc-mac": "1.0.1"
52
52
  },
53
53
  "devDependencies": {}
@@ -7,7 +7,8 @@
7
7
  server: { type: "knxUltimate-config", required: true },
8
8
  name: { value: "KNXGlobalContext", validate: RED.validators.regex(/^[a-zA-Z]+$/) },
9
9
  exposeAsVariable: { value: "exposeAsVariableREADWRITE", required: false },
10
- writeExecutionInterval: { value: 1000 }
10
+ writeExecutionInterval: { value: 1000 },
11
+ contextStorage: { value: "" }
11
12
  },
12
13
  inputs: 0,
13
14
  outputs: 0,
@@ -98,5 +99,11 @@
98
99
  </select>
99
100
  </div>
100
101
 
102
+ <div class="form-row">
103
+ <label for="node-input-contextStorage" style="width:60%;">
104
+ <i class="fa fa-tag"></i> Context storage
105
+ </label>
106
+ <input style="width:35%;" type="text" id="node-input-contextStorage" placeholder="Optional context storage name" />
107
+ </div>
101
108
 
102
109
  </script>
@@ -26,7 +26,7 @@ module.exports = function (RED) {
26
26
  // payload
27
27
  // }
28
28
 
29
- function knxUltimateGlobalContext (config) {
29
+ function knxUltimateGlobalContext(config) {
30
30
  RED.nodes.createNode(this, config)
31
31
  const node = this
32
32
  node.server = RED.nodes.getNode(config.server)
@@ -50,7 +50,7 @@ module.exports = function (RED) {
50
50
  node.formatnegativevalue = 'leave'
51
51
  node.formatdecimalsvalue = 999
52
52
  node.writeExecutionInterval = config.writeExecutionInterval === undefined ? 1000 : config.writeExecutionInterval
53
-
53
+ node.contextStorage = config.contextStorage !== undefined ? config.contextStorage : ''
54
54
  node.exposeAsVariable = config.exposeAsVariable !== undefined ? config.exposeAsVariable : 'exposeAsVariableREADONLY' // Should expose the Group Addresses to the Global Context?
55
55
  node.exposedGAs = []
56
56
  node.timerExposedGAs = null
@@ -83,8 +83,8 @@ module.exports = function (RED) {
83
83
  node.goTimerGo = function () {
84
84
  if (node.timerExposedGAs !== null) clearTimeout(node.timerExposedGAs) // 21/03/2021
85
85
  node.timerExposedGAs = setTimeout(() => {
86
- let oContext = node.context().global.get(node.name + '_WRITE') || []
87
- node.context().global.set(node.name + '_WRITE', []) // Delete the var
86
+ let oContext = node.context().global.get(node.name + '_WRITE', node.contextStorage) || []
87
+ node.context().global.set(node.name + '_WRITE', [], node.contextStorage) // Delete the var
88
88
  for (let index = 0; index < oContext.length; index++) {
89
89
  const element = oContext[index]
90
90
  if (!element.hasOwnProperty('address')) {
@@ -129,7 +129,7 @@ module.exports = function (RED) {
129
129
  node.setNodeStatus({ fill: 'green', shape: 'dot', text: 'Start Writing', payload: '', GA: '', dpt: '', devicename: '' })
130
130
  } else {
131
131
  if (node.timerExposedGAs !== null) clearTimeout(node.timerExposedGAs)
132
- node.context().global.set(node.name + '_WRITE', []) // Delete the var
132
+ node.context().global.set(node.name + '_WRITE', [], node.contextStorage) // Delete the var
133
133
  }
134
134
  // #endregion
135
135
 
@@ -149,14 +149,14 @@ module.exports = function (RED) {
149
149
  }
150
150
  // Save into the global Context
151
151
  try {
152
- node.context().global.set(node.name + '_READ', node.exposedGAs)
152
+ node.context().global.set(node.name + '_READ', node.exposedGAs, node.contextStorage)
153
153
  } catch (error) {
154
154
  console.log(error)
155
155
  }
156
156
  oGa = null // 21/03/2022
157
157
  } else {
158
158
  node.exposedGAs = []
159
- node.context().global.set(node.name + '_READ', node.exposedGAs)
159
+ node.context().global.set(node.name + '_READ', node.exposedGAs, node.contextStorage)
160
160
  }
161
161
  }
162
162
 
@@ -28,6 +28,14 @@
28
28
  GALightColorState: { value: "" },
29
29
  dptLightColorState: { value: "" },
30
30
 
31
+ nameLightHSV: { value: "" },
32
+ GALightHSV: { value: "" },
33
+ dptLightHSV: { value: "" },
34
+
35
+ nameLightHSVState: { value: "" },
36
+ GALightHSVState: { value: "" },
37
+ dptLightHSVState: { value: "" },
38
+
31
39
  nameLightBrightness: { value: "" },
32
40
  GALightBrightness: { value: "" },
33
41
  dptLightBrightness: { value: "" },
@@ -237,7 +245,7 @@
237
245
  });
238
246
 
239
247
 
240
- // DPT dptLightColor and dptLightColorStateƒ
248
+ // DPT dptLightColor and dptLightColorState
241
249
  // ########################
242
250
  $.getJSON('knxUltimateDpts', (data) => {
243
251
  data.forEach(dpt => {
@@ -320,6 +328,98 @@
320
328
 
321
329
 
322
330
 
331
+
332
+
333
+
334
+ // DPT dptLightTunableWhite and dptLightTunableWhiteState
335
+ // ########################
336
+ $.getJSON('knxUltimateDpts', (data) => {
337
+ data.forEach(dpt => {
338
+ if (dpt.value === "3.007" || dpt.value === "5.001") {
339
+ $("#node-input-dptLightHSV").append($("<option></option>")
340
+ .attr("value", dpt.value)
341
+ .text(dpt.text))
342
+ $("#node-input-dptLightHSVState").append($("<option></option>")
343
+ .attr("value", dpt.value)
344
+ .text(dpt.text))
345
+ }
346
+ });
347
+
348
+ $("#node-input-dptLightHSV").val(this.dptLightHSV)
349
+ $("#node-input-dptLightHSVState").val(this.dptLightHSVState)
350
+
351
+ })
352
+
353
+ // Autocomplete suggestion with ETS csv File
354
+ $("#node-input-GALightHSV").autocomplete({
355
+ minLength: 1,
356
+ source: function (request, response) {
357
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
358
+ response($.map(data, function (value, key) {
359
+ if (value.dpt === "3.007" || value.dpt === "5.001") {
360
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
361
+ if (fullSearch(sSearch, request.term)) {
362
+ return {
363
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
364
+ value: value.ga // Value
365
+ }
366
+ } else {
367
+ return null;
368
+ }
369
+ }
370
+ }));
371
+ });
372
+ }, select: function (event, ui) {
373
+ // Sets Datapoint and device name automatically
374
+ var sDevName = ui.item.label.split("#")[1].trim();
375
+ try {
376
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
377
+ } catch (error) {
378
+ }
379
+ $('#node-input-nameLightHSV').val(sDevName);
380
+ var optVal = $("#node-input-dptLightHSV option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
381
+ // Select the option value
382
+ $("#node-input-dptLightHSV").val(optVal);
383
+ }
384
+ });
385
+
386
+ // Autocomplete suggestion with ETS csv File
387
+ $("#node-input-GALightHSVState").autocomplete({
388
+ minLength: 1,
389
+ source: function (request, response) {
390
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
391
+ response($.map(data, function (value, key) {
392
+ if (value.dpt === "3.007" || value.dpt === "5.001") {
393
+ var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
394
+ if (fullSearch(sSearch, request.term)) {
395
+ return {
396
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
397
+ value: value.ga // Value
398
+ }
399
+ } else {
400
+ return null;
401
+ }
402
+ }
403
+ }));
404
+ });
405
+ }, select: function (event, ui) {
406
+ // Sets Datapoint and device name automatically
407
+ var sDevName = ui.item.label.split("#")[1].trim();
408
+ try {
409
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
410
+ } catch (error) {
411
+ }
412
+ $('#node-input-nameLightHSVState').val(sDevName);
413
+ var optVal = $("#node-input-dptLightHSVState option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
414
+ // Select the option value
415
+ $("#node-input-dptLightHSVState").val(optVal);
416
+ }
417
+ });
418
+ // ########################
419
+
420
+
421
+
422
+
323
423
  // DPT dptLightBrightness and dptLightBrightnessState
324
424
  // ########################
325
425
  $.getJSON('knxUltimateDpts', (data) => {
@@ -583,8 +683,6 @@
583
683
 
584
684
  <br/>
585
685
 
586
- <!-- <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> -->
587
-
588
686
  <p>
589
687
  <b>KNX LINK</b>
590
688
  </p>
@@ -612,8 +710,8 @@
612
710
  <label for="node-input-nameLightState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
613
711
  <input type="text" id="node-input-nameLightState" style="width:200px;margin-left: 5px; text-align: left;">
614
712
  </div>
615
- <br/>
616
- </div>
713
+
714
+
617
715
  <div class="form-row">
618
716
  <label for="node-input-nameLightDIM" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspDimming</label>
619
717
 
@@ -625,9 +723,8 @@
625
723
 
626
724
  <label for="node-input-nameLightDIM" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
627
725
  <input type="text" id="node-input-nameLightDIM" style="width:200px;margin-left: 5px; text-align: left;">
628
- </div>
629
- <br/>
630
- </div>
726
+ </div>
727
+
631
728
  <div class="form-row">
632
729
  <label for="node-input-nameLightColor" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspColor</label>
633
730
 
@@ -639,7 +736,7 @@
639
736
 
640
737
  <label for="node-input-nameLightColor" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
641
738
  <input type="text" id="node-input-nameLightColor" style="width:200px;margin-left: 5px; text-align: left;">
642
- </div>
739
+ </div>
643
740
  <div class="form-row">
644
741
  <label for="node-input-nameLightColorState" style="width:100px;"><i class="fa fa-play-circle-o"></i> Color Status</label>
645
742
 
@@ -651,10 +748,12 @@
651
748
 
652
749
  <label for="node-input-nameLightColorState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
653
750
  <input type="text" id="node-input-nameLightColorState" style="width:200px;margin-left: 5px; text-align: left;">
654
- </div>
655
- <br/>
656
- </div>
657
751
  </div>
752
+
753
+
754
+
755
+
756
+
658
757
  <div class="form-row">
659
758
  <label for="node-input-nameLightBrightness" style="width:100px;"><i class="fa fa-play-circle-o"></i>&nbspBrightness</label>
660
759
 
@@ -666,8 +765,8 @@
666
765
 
667
766
  <label for="node-input-nameLightBrightness" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
668
767
  <input type="text" id="node-input-nameLightBrightness" style="width:200px;margin-left: 5px; text-align: left;">
669
- </div>
670
- </div>
768
+ </div>
769
+
671
770
  <div class="form-row">
672
771
  <label for="node-input-nameLightBrightnessState" style="width:100px;"><i class="fa fa-play-circle-o"></i> Brightness Status</label>
673
772
 
@@ -679,10 +778,9 @@
679
778
 
680
779
  <label for="node-input-nameLightBrightnessState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
681
780
  <input type="text" id="node-input-nameLightBrightnessState" style="width:200px;margin-left: 5px; text-align: left;">
682
- </div>
683
- <br/>
684
- <br/>
685
- </div>
781
+ </div>
782
+
783
+
686
784
  <div class="form-row">
687
785
  <label for="node-input-nameLightBlink" style="width:100px;"><i class="fa fa-play-circle-o"></i> Blink</label>
688
786
 
@@ -694,8 +792,8 @@
694
792
 
695
793
  <label for="node-input-nameLightBlink" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
696
794
  <input type="text" id="node-input-nameLightBlink" style="width:200px;margin-left: 5px; text-align: left;">
697
- </div>
698
- </div>
795
+ </div>
796
+
699
797
  <div class="form-row">
700
798
  <label for="node-input-nameLightColorCycle" style="width:100px;"><i class="fa fa-play-circle-o"></i> Color Cycle</label>
701
799
 
@@ -707,7 +805,7 @@
707
805
 
708
806
  <label for="node-input-nameLightColorCycle" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
709
807
  <input type="text" id="node-input-nameLightColorCycle" style="width:200px;margin-left: 5px; text-align: left;">
710
- </div>
808
+ </div>
711
809
  <br/>
712
810
  <br/>
713
811
  <br/>
@@ -738,6 +836,8 @@ Start typing in the GA field, the name or group address of your KNX device, the
738
836
  | Dimming | Relative DIM the HUE light |
739
837
  | Color | This command is used to change the HUE light's color. Accepted datapoint is RGB triplet (r,g,b). The node handles the gamut color correction. As soon as you send a color KNX telegran, the light turns on and sets color and brightness, derived from the brightness human perception. As soon as you send a KNX telegram with r,g,b set to zero, the light turns off |
740
838
  | Color Status | Link this to the light's color status group address. Accepted datapoint is RGB triplet (r,g,b)|
839
+ | Tunable white | This command is used to change the HUE light's white temperature. There are a bunch of Datapoints you can choose from, to suit your needs. |
840
+ | Tunable white Status | Link this to the light temperature status group address. |
741
841
  | Brightness | This command is used to change the absolute HUE light's brightness |
742
842
  | Brightness Status| Link this to the light's brightness status group address |
743
843
  | Blink| *true* Blink the light, *false* Stop blinking. Blinks the light on and off. Useful for signalling. Works with all HUE lights. |
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=16.0.0"
5
5
  },
6
- "version": "2.1.10",
6
+ "version": "2.1.11",
7
7
  "description": "Control your KNX intallation via Node-Red! Single Node KNX IN/OUT with optional ETS group address importer. Easy to use and highly configurable. With integrated Philips HUE devices handling.",
8
8
  "dependencies": {
9
9
  "mkdirp": "1.0.4",