node-red-contrib-knx-ultimate 2.2.1 → 2.2.3

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.
@@ -1,109 +1,107 @@
1
1
  <script type="text/javascript">
2
- RED.nodes.registerType('knxUltimateHueLight', {
3
- category: "KNX Ultimate",
4
- color: '#C0C7E9',
5
- defaults: {
6
- //buttonState: {value: true},
7
- server: { type: "knxUltimate-config", required: true },
8
- serverHue: { type: "hue-config", required: true },
9
- name: { value: "" },
10
-
11
- nameLightSwitch: { value: "" },
12
- GALightSwitch: { value: "" },
13
- dptLightSwitch: { value: "" },
14
-
15
- nameLightState: { value: "" },
16
- GALightState: { value: "" },
17
- dptLightState: { value: "" },
18
-
19
- nameLightDIM: { value: "" },
20
- GALightDIM: { value: "" },
21
- dptLightDIM: { value: "" },
22
-
23
- nameLightColor: { value: "" },
24
- GALightColor: { value: "" },
25
- dptLightColor: { value: "" },
26
-
27
- nameLightColorState: { value: "" },
28
- GALightColorState: { value: "" },
29
- dptLightColorState: { value: "" },
30
-
31
- nameLightHSV: { value: "" },
32
- GALightHSV: { value: "" },
33
- dptLightHSV: { value: "" },
34
-
35
- nameLightHSVPercentage: { value: "" },
36
- GALightHSVPercentage: { value: "" },
37
- dptLightHSVPercentage: { value: "" },
38
-
39
- nameLightHSVState: { value: "" },
40
- GALightHSVState: { value: "" },
41
- dptLightHSVState: { value: "" },
42
-
43
- nameLightBrightness: { value: "" },
44
- GALightBrightness: { value: "" },
45
- dptLightBrightness: { value: "" },
46
-
47
- nameLightBrightnessState: { value: "" },
48
- GALightBrightnessState: { value: "" },
49
- dptLightBrightnessState: { value: "" },
50
-
51
- nameLightBlink: { value: "" },
52
- GALightBlink: { value: "" },
53
- dptLightBlink: { value: "" },
54
-
55
- nameLightColorCycle: { value: "" },
56
- GALightColorCycle: { value: "" },
57
- dptLightColorCycle: { value: "" },
58
-
59
- enableDayNightLighting: { value: "no" },
60
- colorAtSwitchOnDayTime: { value: '{"red":255, "green":255, "blue":255}' },
61
- colorAtSwitchOnNightTime: { value: '{"red":23, "green":4, "blue":0}' },
62
- invertDayNight: { value: false },
63
-
64
- nameDaylightSensor: { value: "" },
65
- GADaylightSensor: { value: "" },
66
- dptDaylightSensor: { value: "" },
67
-
68
- specifySwitchOnBrightness: { value: "yes" },
69
- updateKNXBrightnessStatusOnHUEOnOff: { value: "onhueoff" },
70
- dimSpeed: { value: 5000, required: false},
71
- minDimLevelLight: { value: 3, required: false },
72
- maxDimLevelLight: { value: 100, required: false },
73
-
74
- hueDevice: { value: "" }
75
- },
76
- inputs: 0,
77
- outputs: 0,
78
- icon: "node-hue-icon.svg",
79
- label: function () {
80
- return (this.name);
81
- },
82
- paletteLabel: "Hue Light",
83
- // button: {
84
- // enabled: function() {
85
- // // return whether or not the button is enabled, based on the current
86
- // // configuration of the node
87
- // return !this.changed
88
- // },
89
- // visible: function() {
90
- // // return whether or not the button is visible, based on the current
91
- // // configuration of the node
92
- // return this.hasButton
93
- // },
94
- // //toggle: "buttonState",
95
- // onclick: function() {}
96
- // },
97
- oneditprepare: function () {
98
- var node = this;
99
- var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
100
- var oNodeServerHue = RED.nodes.node($("#node-input-serverHue").val()); // Store the config-node
101
-
102
-
103
-
104
- // Create the TAB in Node-Red
105
- // ####################################
106
- const content = `<html>
2
+ RED.nodes.registerType("knxUltimateHueLight", {
3
+ category: "KNX Ultimate",
4
+ color: "#C0C7E9",
5
+ defaults: {
6
+ //buttonState: {value: true},
7
+ server: { type: "knxUltimate-config", required: true },
8
+ serverHue: { type: "hue-config", required: true },
9
+ name: { value: "" },
10
+
11
+ nameLightSwitch: { value: "" },
12
+ GALightSwitch: { value: "" },
13
+ dptLightSwitch: { value: "" },
14
+
15
+ nameLightState: { value: "" },
16
+ GALightState: { value: "" },
17
+ dptLightState: { value: "" },
18
+
19
+ nameLightDIM: { value: "" },
20
+ GALightDIM: { value: "" },
21
+ dptLightDIM: { value: "" },
22
+
23
+ nameLightColor: { value: "" },
24
+ GALightColor: { value: "" },
25
+ dptLightColor: { value: "" },
26
+
27
+ nameLightColorState: { value: "" },
28
+ GALightColorState: { value: "" },
29
+ dptLightColorState: { value: "" },
30
+
31
+ nameLightHSV: { value: "" },
32
+ GALightHSV: { value: "" },
33
+ dptLightHSV: { value: "" },
34
+
35
+ nameLightHSVPercentage: { value: "" },
36
+ GALightHSVPercentage: { value: "" },
37
+ dptLightHSVPercentage: { value: "" },
38
+
39
+ nameLightHSVState: { value: "" },
40
+ GALightHSVState: { value: "" },
41
+ dptLightHSVState: { value: "" },
42
+
43
+ nameLightBrightness: { value: "" },
44
+ GALightBrightness: { value: "" },
45
+ dptLightBrightness: { value: "" },
46
+
47
+ nameLightBrightnessState: { value: "" },
48
+ GALightBrightnessState: { value: "" },
49
+ dptLightBrightnessState: { value: "" },
50
+
51
+ nameLightBlink: { value: "" },
52
+ GALightBlink: { value: "" },
53
+ dptLightBlink: { value: "" },
54
+
55
+ nameLightColorCycle: { value: "" },
56
+ GALightColorCycle: { value: "" },
57
+ dptLightColorCycle: { value: "" },
58
+
59
+ enableDayNightLighting: { value: "no" },
60
+ colorAtSwitchOnDayTime: { value: '{"red":255, "green":255, "blue":255}' },
61
+ colorAtSwitchOnNightTime: { value: '{"red":23, "green":4, "blue":0}' },
62
+ invertDayNight: { value: false },
63
+
64
+ nameDaylightSensor: { value: "" },
65
+ GADaylightSensor: { value: "" },
66
+ dptDaylightSensor: { value: "" },
67
+
68
+ specifySwitchOnBrightness: { value: "yes" },
69
+ updateKNXBrightnessStatusOnHUEOnOff: { value: "no" },
70
+ dimSpeed: { value: 5000, required: false },
71
+ minDimLevelLight: { value: 10, required: false },
72
+ maxDimLevelLight: { value: 100, required: false },
73
+
74
+ hueDevice: { value: "" },
75
+ },
76
+ inputs: 0,
77
+ outputs: 0,
78
+ icon: "node-hue-icon.svg",
79
+ label: function () {
80
+ return this.name;
81
+ },
82
+ paletteLabel: "Hue Light",
83
+ // button: {
84
+ // enabled: function() {
85
+ // // return whether or not the button is enabled, based on the current
86
+ // // configuration of the node
87
+ // return !this.changed
88
+ // },
89
+ // visible: function() {
90
+ // // return whether or not the button is visible, based on the current
91
+ // // configuration of the node
92
+ // return this.hasButton
93
+ // },
94
+ // //toggle: "buttonState",
95
+ // onclick: function() {}
96
+ // },
97
+ oneditprepare: function () {
98
+ var node = this;
99
+ var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
100
+ var oNodeServerHue = RED.nodes.node($("#node-input-serverHue").val()); // Store the config-node
101
+
102
+ // Create the TAB in Node-Red
103
+ // ####################################
104
+ const content = `<html>
107
105
 
108
106
  <head>
109
107
  <div class="red-ui-sidebar-header">Color Selector</div>
@@ -136,784 +134,795 @@
136
134
  </html>
137
135
  `;
138
136
 
139
- // COLOR BAR HANDLING ###########################
140
- RED.sidebar.addTab({
141
- id: "tabNRColor",
142
- label: "Color Picker",
143
- name: "Color Picker",
144
- iconClass: "fa fa-pencil",
145
- content: content,
146
- enableOnEdit: true
147
- });
148
-
149
- // Temperature
150
- node.kelvinPicker = new iro.ColorPicker("#kelvinPicker", {
151
- width: 250,
152
- color: "rgb(255, 0, 0)",
153
- borderWidth: 1,
154
- borderColor: "#fff",
155
- layoutDirection: 'vertical',
156
- layout: [
157
- {
158
- component: iro.ui.Slider,
159
- options: {
160
- sliderType: 'kelvin',
161
- sliderSize: 20,
162
- }
163
- },
164
- ]
165
- });
166
- // color:change callbacks receive the current color
167
- node.kelvinPicker.on("color:change", function (color) {
168
- const resultRGBForNode = '{"red": ' + color.rgb.r + ', "green": ' + color.rgb.g + ', "blue": ' + color.rgb.b + '}';
169
- $("#resultRGB").val(resultRGBForNode)
170
- });
171
-
172
-
173
- // Color
174
- node.colorPicker = new iro.ColorPicker("#colorPicker", {
175
- width: 250,
176
- color: "rgb(255, 0, 0)",
177
- borderWidth: 1,
178
- borderColor: "#fff",
179
- layout: [
180
- {
181
- component: iro.ui.Box,
182
- },
183
- {
184
- component: iro.ui.Slider,
185
- options: {
186
- id: 'hue-slider',
187
- sliderType: 'hue'
188
- }
189
- }
190
- ]
191
- });
192
- // color:change callbacks receive the current color
193
- node.colorPicker.on("color:change", function (color) {
194
- // Transform to compatible value for the node { "red": 255, "green": 255, "blue": 255 }
195
- const resultRGBForNode = '{"red": ' + color.rgb.r + ', "green": ' + color.rgb.g + ', "blue": ' + color.rgb.b + '}';
196
- $("#resultRGB").val(resultRGBForNode)
197
- });
198
- $("#resultRGB").on("keyup", function () {
199
- setIroColor()
200
- });
201
- function setIroColor() {
202
- try {
203
- const color = JSON.parse($("#resultRGB").val())
204
- node.colorPicker.color.setChannel('rgb', 'r', color.red);
205
- node.colorPicker.color.setChannel('rgb', 'g', color.green);
206
- node.colorPicker.color.setChannel('rgb', 'b', color.blue);
207
- } catch (error) { }
137
+ // COLOR BAR HANDLING ###########################
138
+ RED.sidebar.addTab({
139
+ id: "tabNRColor",
140
+ label: "Color Picker",
141
+ name: "Color Picker",
142
+ iconClass: "fa fa-pencil",
143
+ content: content,
144
+ enableOnEdit: true,
145
+ });
146
+
147
+ // Temperature
148
+ node.kelvinPicker = new iro.ColorPicker("#kelvinPicker", {
149
+ width: 250,
150
+ color: "rgb(255, 0, 0)",
151
+ borderWidth: 1,
152
+ borderColor: "#fff",
153
+ layoutDirection: "vertical",
154
+ layout: [
155
+ {
156
+ component: iro.ui.Slider,
157
+ options: {
158
+ sliderType: "kelvin",
159
+ sliderSize: 20,
160
+ },
161
+ },
162
+ ],
163
+ });
164
+ // color:change callbacks receive the current color
165
+ node.kelvinPicker.on("color:change", function (color) {
166
+ const resultRGBForNode = '{"red": ' + color.rgb.r + ', "green": ' + color.rgb.g + ', "blue": ' + color.rgb.b + "}";
167
+ $("#resultRGB").val(resultRGBForNode);
168
+ });
169
+
170
+ // Color
171
+ node.colorPicker = new iro.ColorPicker("#colorPicker", {
172
+ width: 250,
173
+ color: "rgb(255, 0, 0)",
174
+ borderWidth: 1,
175
+ borderColor: "#fff",
176
+ layout: [
177
+ {
178
+ component: iro.ui.Box,
179
+ },
180
+ {
181
+ component: iro.ui.Slider,
182
+ options: {
183
+ id: "hue-slider",
184
+ sliderType: "hue",
185
+ },
186
+ },
187
+ ],
188
+ });
189
+ // color:change callbacks receive the current color
190
+ node.colorPicker.on("color:change", function (color) {
191
+ // Transform to compatible value for the node { "red": 255, "green": 255, "blue": 255 }
192
+ const resultRGBForNode = '{"red": ' + color.rgb.r + ', "green": ' + color.rgb.g + ', "blue": ' + color.rgb.b + "}";
193
+ $("#resultRGB").val(resultRGBForNode);
194
+ });
195
+ $("#resultRGB").on("keyup", function () {
196
+ setIroColor();
197
+ });
198
+ function setIroColor() {
199
+ try {
200
+ const color = JSON.parse($("#resultRGB").val());
201
+ node.colorPicker.color.setChannel("rgb", "r", color.red);
202
+ node.colorPicker.color.setChannel("rgb", "g", color.green);
203
+ node.colorPicker.color.setChannel("rgb", "b", color.blue);
204
+ } catch (error) { }
205
+ }
206
+ // Copy to clipboard button
207
+ $("#tabNRColor_colorSelectorTABApplyTextButton").on("click", function () {
208
+ // const aa = $("#resultRGB").val()
209
+ // navigator.clipboard.writeText(aa)
210
+ const destTextBox = "#" + $("#tabNRColor_destinationTextbox").val();
211
+ const resultRGB = $("#resultRGB").val();
212
+ $(destTextBox).val(resultRGB);
213
+ // Flash the destination control
214
+ $(destTextBox).css("background-color", "lightgreen");
215
+ $("#tabNRColor_divApplyCancel").hide();
216
+ RED.sidebar.show("help");
217
+ setTimeout(() => {
218
+ $(destTextBox).css("background-color", "");
219
+ }, 500);
220
+ });
221
+ $("#tabNRColor_colorSelectorTABCancelTextButton").on("click", function () {
222
+ $("#tabNRColor_destinationTextbox").val("");
223
+ RED.sidebar.show("help");
224
+ $("#tabNRColor_divApplyCancel").hide();
225
+ });
226
+ $("#node-input-colorAtSwitchOnDayTime").on("focus", function () {
227
+ RED.sidebar.show("tabNRColor"); // Node-Red custom color TAB
228
+ $("#tabNRColor_destinationTextbox").val("node-input-colorAtSwitchOnDayTime");
229
+ $("#tabNRColor_divApplyCancel").show();
230
+ const color = $("#node-input-colorAtSwitchOnDayTime").val();
231
+ $("#resultRGB").val(color);
232
+ setIroColor();
233
+ });
234
+ // $("#node-input-colorAtSwitchOnDayTime").on("blur", function () {
235
+ // RED.sidebar.show("help");
236
+ // });
237
+ $("#node-input-colorAtSwitchOnNightTime").on("focus", function () {
238
+ RED.sidebar.show("tabNRColor"); // Node-Red custom color TAB
239
+ $("#tabNRColor_destinationTextbox").val("node-input-colorAtSwitchOnNightTime");
240
+ $("#tabNRColor_divApplyCancel").show();
241
+ const color = $("#node-input-colorAtSwitchOnNightTime").val();
242
+ $("#resultRGB").val(color);
243
+ setIroColor();
244
+ });
245
+ // ####################################
246
+
247
+ $("#tabs").tabs(); // Tabs gestione KNX
248
+
249
+ // 19/02/2020 Used to get the server sooner als deploy.
250
+ $("#node-input-server").change(function () {
251
+ try {
252
+ oNodeServer = RED.nodes.node($(this).val());
253
+ } catch (error) { }
254
+ });
255
+ // 19/02/2020 Used to get the server sooner als deploy.
256
+ $("#node-input-serverHue").change(function () {
257
+ try {
258
+ oNodeServerHue = RED.nodes.node($(this).val());
259
+ } catch (error) { }
260
+ });
261
+
262
+ // 31/03/2020 Search Helper
263
+ function fullSearch(sourceText, searchString) {
264
+ // This searches for all words in a string
265
+ var aSearchWords = searchString.toLowerCase().split(" ");
266
+ var i = 0;
267
+ for (let index = 0; index < aSearchWords.length; index++) {
268
+ if (sourceText.toLowerCase().indexOf(aSearchWords[index]) > -1) i += 1;
269
+ }
270
+ return i == aSearchWords.length;
271
+ }
272
+
273
+ function getDPT(_dpt, _destinationWidget) {
274
+ // DPT Switch command
275
+ // ########################
276
+ $.getJSON("knxUltimateDpts", (data) => {
277
+ data.forEach((dpt) => {
278
+ if (dpt.value.startsWith(_dpt)) {
279
+ $(_destinationWidget).append($("<option></option>").attr("value", dpt.value).text(dpt.text));
208
280
  }
209
- // Copy to clipboard button
210
- $("#tabNRColor_colorSelectorTABApplyTextButton").on("click", function () {
211
- // const aa = $("#resultRGB").val()
212
- // navigator.clipboard.writeText(aa)
213
- const destTextBox = "#" + $("#tabNRColor_destinationTextbox").val()
214
- const resultRGB = $("#resultRGB").val()
215
- $(destTextBox).val(resultRGB)
216
- // Flash the destination control
217
- $(destTextBox).css("background-color", "lightgreen");
218
- $("#tabNRColor_divApplyCancel").hide()
219
- RED.sidebar.show("help")
220
- setTimeout(() => {
221
- $(destTextBox).css("background-color", "");
222
- }, 500);
223
- });
224
- $("#tabNRColor_colorSelectorTABCancelTextButton").on("click", function () {
225
- $("#tabNRColor_destinationTextbox").val("")
226
- RED.sidebar.show("help")
227
- $("#tabNRColor_divApplyCancel").hide()
228
- })
229
- $("#node-input-colorAtSwitchOnDayTime").on("focus", function () {
230
- RED.sidebar.show("tabNRColor"); // Node-Red custom color TAB
231
- $("#tabNRColor_destinationTextbox").val("node-input-colorAtSwitchOnDayTime")
232
- $("#tabNRColor_divApplyCancel").show()
233
- const color = $("#node-input-colorAtSwitchOnDayTime").val()
234
- $("#resultRGB").val(color)
235
- setIroColor();
236
- });
237
- // $("#node-input-colorAtSwitchOnDayTime").on("blur", function () {
238
- // RED.sidebar.show("help");
239
- // });
240
- $("#node-input-colorAtSwitchOnNightTime").on("focus", function () {
241
- RED.sidebar.show("tabNRColor"); // Node-Red custom color TAB
242
- $("#tabNRColor_destinationTextbox").val("node-input-colorAtSwitchOnNightTime")
243
- $("#tabNRColor_divApplyCancel").show()
244
- const color = $("#node-input-colorAtSwitchOnNightTime").val()
245
- $("#resultRGB").val(color)
246
- setIroColor();
247
- });
248
- // ####################################
249
-
250
-
251
- $("#tabs").tabs(); // Tabs gestione KNX
252
-
253
- // 19/02/2020 Used to get the server sooner als deploy.
254
- $("#node-input-server").change(function () {
255
- try {
256
- oNodeServer = RED.nodes.node($(this).val());
257
- } catch (error) { }
258
- });
259
- // 19/02/2020 Used to get the server sooner als deploy.
260
- $("#node-input-serverHue").change(function () {
261
- try {
262
- oNodeServerHue = RED.nodes.node($(this).val());
263
- } catch (error) { }
281
+ });
282
+ // Eval
283
+ const format = "node." + _destinationWidget.replace("#node-input-", "");
284
+ $(_destinationWidget).val(eval(format).toString());
285
+ });
286
+ }
287
+
288
+ function getGroupAddress(_sourceWidgetAutocomplete, _destinationWidgetName, _destinationWidgetDPT, _additionalSearchTerm) {
289
+ $(_sourceWidgetAutocomplete).autocomplete({
290
+ minLength: 1,
291
+ source: function (request, response) {
292
+ //$.getJSON("csv", request, function( data, status, xhr ) {
293
+ $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
294
+ response(
295
+ $.map(data, function (value, key) {
296
+ var sSearch = value.ga + " (" + value.devicename + ") DPT" + value.dpt;
297
+ if (fullSearch(sSearch, request.term + _additionalSearchTerm)) {
298
+ return {
299
+ label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
300
+ value: value.ga, // Value
301
+ };
302
+ } else {
303
+ return null;
304
+ }
305
+ })
306
+ );
264
307
  });
265
-
266
- // 31/03/2020 Search Helper
267
- function fullSearch(sourceText, searchString) {
268
- // This searches for all words in a string
269
- var aSearchWords = searchString.toLowerCase().split(" ");
270
- var i = 0;
271
- for (let index = 0; index < aSearchWords.length; index++) {
272
- if (sourceText.toLowerCase().indexOf(aSearchWords[index]) > -1) i += 1;
308
+ },
309
+ select: function (event, ui) {
310
+ // Sets Datapoint and device name automatically
311
+ var sDevName = ui.item.label.split("#")[1].trim();
312
+ try {
313
+ sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
314
+ } catch (error) { }
315
+ $(_destinationWidgetName).val(sDevName);
316
+ var optVal = $(_destinationWidgetDPT + " option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr("value");
317
+ // Select the option value
318
+ $(_destinationWidgetDPT).val(optVal);
319
+ },
320
+ });
321
+ }
322
+
323
+ getDPT("1.", "#node-input-dptLightSwitch");
324
+ getGroupAddress("#node-input-GALightSwitch", "#node-input-nameLightSwitch", "#node-input-dptLightSwitch", " 1.");
325
+
326
+ getDPT("1.", "#node-input-dptLightState");
327
+ getGroupAddress("#node-input-GALightState", "#node-input-nameLightState", "#node-input-dptLightState", " 1.");
328
+
329
+ getDPT("3.007", "#node-input-dptLightDIM");
330
+ getGroupAddress("#node-input-GALightDIM", "#node-input-nameLightDIM", "#node-input-dptLightDIM", " 3.007");
331
+
332
+ getDPT("5.001", "#node-input-dptLightBrightness");
333
+ getGroupAddress("#node-input-GALightBrightness", "#node-input-nameLightBrightness", "#node-input-dptLightBrightness", " 5.001");
334
+
335
+ getDPT("5.001", "#node-input-dptLightBrightnessState");
336
+ getGroupAddress("#node-input-GALightBrightnessState", "#node-input-nameLightBrightnessState", "#node-input-dptLightBrightnessState", " 5.001");
337
+
338
+ getDPT("232.600", "#node-input-dptLightColor");
339
+ getGroupAddress("#node-input-GALightColor", "#node-input-nameLightColor", "#node-input-dptLightColor", " 232.600");
340
+
341
+ getDPT("232.600", "#node-input-dptLightColorState");
342
+ getGroupAddress("#node-input-GALightColorState", "#node-input-nameLightColorState", "#node-input-dptLightColorState", " 232.600");
343
+
344
+ getDPT("3.007", "#node-input-dptLightHSV");
345
+ getGroupAddress("#node-input-GALightHSV", "#node-input-nameLightHSV", "#node-input-dptLightHSV", " 3.007");
346
+
347
+ getDPT("5.001", "#node-input-dptLightHSVPercentage");
348
+ getGroupAddress("#node-input-GALightHSVPercentage", "#node-input-nameLightHSVPercentage", "#node-input-dptLightHSVPercentage", " 5.001");
349
+
350
+ getDPT("5.001", "#node-input-dptLightHSVState");
351
+ getGroupAddress("#node-input-GALightHSVState", "#node-input-nameLightHSVState", "#node-input-dptLightHSVState", " 5.001");
352
+
353
+ getDPT("1.", "#node-input-dptLightBlink");
354
+ getGroupAddress("#node-input-GALightBlink", "#node-input-nameLightBlink", "#node-input-dptLightBlink", " 1.");
355
+
356
+ getDPT("1.", "#node-input-dptLightColorCycle");
357
+ getGroupAddress("#node-input-GALightColorCycle", "#node-input-nameLightColorCycle", "#node-input-dptLightColorCycle", " 1.");
358
+
359
+ getDPT("1.", "#node-input-dptDaylightSensor");
360
+ getGroupAddress("#node-input-GADaylightSensor", "#node-input-nameDaylightSensor", "#node-input-dptDaylightSensor", " 1.");
361
+
362
+ // Show/Hide and enable/disable day/night Lighting behaviour
363
+ if (this.enableDayNightLighting === "yes") {
364
+ $("#divEnableDayNightLighting").show();
365
+ $("#divCCSBoxayNightLighting").css({ border: "1px solid dimgrey", "border-radius": "12px", padding: "5px" }); // Add little box to better understand the property page
366
+ } else {
367
+ $("#divEnableDayNightLighting").hide();
368
+ $("#divCCSBoxayNightLighting").css({ border: "", "border-radius": "", padding: "" });
369
+ }
370
+
371
+ $("#node-input-enableDayNightLighting").on("change", function () {
372
+ if ($("#node-input-enableDayNightLighting").val() === "yes") {
373
+ $("#divEnableDayNightLighting").show();
374
+ $("#divCCSBoxayNightLighting").css({ border: "1px solid dimgrey", "border-radius": "12px", padding: "5px" }); // Add little box to better understand the property page
375
+ } else {
376
+ $("#divEnableDayNightLighting").hide();
377
+ $("#divCCSBoxayNightLighting").css({ border: "", "border-radius": "", padding: "" });
378
+ }
379
+ });
380
+
381
+ // Show/Hide the div of the color at swich on
382
+ if (this.specifySwitchOnBrightness === "yes") {
383
+ $("#divColorsAtSwitchOn").show();
384
+ } else {
385
+ $("#divColorsAtSwitchOn").hide();
386
+ $("#node-input-colorAtSwitchOnDayTime").val("");
387
+ }
388
+
389
+ $("#node-input-specifySwitchOnBrightness").on("change", function () {
390
+ if ($("#node-input-specifySwitchOnBrightness").val() === "yes") {
391
+ $("#divColorsAtSwitchOn").show();
392
+ if ($("#node-input-colorAtSwitchOnDayTime").val() === "") $("#node-input-colorAtSwitchOnDayTime").val('{ "red": 255, "green": 255, "blue": 255 }');
393
+ } else {
394
+ $("#divColorsAtSwitchOn").hide();
395
+ $("#node-input-colorAtSwitchOnDayTime").val("");
396
+ }
397
+ });
398
+
399
+ // Autocomplete suggestion with HUE Lights
400
+ $("#node-input-name").autocomplete({
401
+ minLength: 1,
402
+ source: function (request, response) {
403
+ $.getJSON("KNXUltimateGetResourcesHUE?rtype=light&nodeID=" + oNodeServerHue.id, (data) => {
404
+ response(
405
+ $.map(data.devices, function (value, key) {
406
+ //alert(JSON.stringify(value) + " "+ key)
407
+ var sSearch = value.name;
408
+ if (fullSearch(sSearch, request.term)) {
409
+ return {
410
+ hueDevice: value.id,
411
+ value: value.name,
412
+ };
413
+ } else {
414
+ return null;
273
415
  }
274
- return i == aSearchWords.length;
416
+ })
417
+ );
418
+ });
419
+ },
420
+ select: function (event, ui) {
421
+ // Distinguish between group of lights an single light.
422
+ if (ui.item.value.toLowerCase().startsWith("grouped_light")) {
423
+ $("#node-input-hueDevice").val(ui.item.hueDevice + "#grouped_light");
424
+ $("#getColorAtSwitchOnDayTimeButton").hide();
425
+ $("#getColorAtSwitchOnNightTimeButton").hide();
426
+ } else {
427
+ $("#node-input-hueDevice").val(ui.item.hueDevice + "#light");
428
+ $("#getColorAtSwitchOnDayTimeButton").show();
429
+ $("#getColorAtSwitchOnNightTimeButton").show();
430
+ }
431
+ $("#tabs").show();
432
+ },
433
+ });
434
+
435
+ // Get the HUE capabilities to enable/disable UI parts
436
+ $.getJSON("KNXUltimateGetResourcesHUE?rtype=light&nodeID=" + oNodeServerHue.id, (data) => {
437
+ data.devices.forEach((element) => {
438
+ if (element.id === this.hueDevice.split("#")[0] && element.deviceObject !== undefined) {
439
+ // Check dimming
440
+ if (element.deviceObject.dimming === undefined) {
441
+ $("#tabs").tabs("disable", "#tabs-2");
442
+ $("#divColorsAtSwitchOn").hide();
443
+ $("#divColorCycle").hide();
275
444
  }
276
-
277
- function getDPT(_dpt, _destinationWidget) {
278
- // DPT Switch command
279
- // ########################
280
- $.getJSON('knxUltimateDpts', (data) => {
281
- data.forEach(dpt => {
282
- if (dpt.value.startsWith(_dpt)) {
283
- $(_destinationWidget).append($("<option></option>")
284
- .attr("value", dpt.value)
285
- .text(dpt.text))
286
- }
287
- });
288
- // Eval
289
- const format = "node." + _destinationWidget.replace("#node-input-", "");
290
- $(_destinationWidget).val(eval(format).toString());
291
- })
445
+ // Check color
446
+ if (element.deviceObject.color_temperature === undefined) $("#tabs").tabs("disable", "#tabs-3");
447
+ if (element.deviceObject.color === undefined) {
448
+ $("#tabs").tabs("disable", "#tabs-4");
449
+ $("#divColorsAtSwitchOn").hide();
450
+ $("#divColorCycle").hide();
292
451
  }
293
-
294
- function getGroupAddress(_sourceWidgetAutocomplete, _destinationWidgetName, _destinationWidgetDPT, _additionalSearchTerm) {
295
- $(_sourceWidgetAutocomplete).autocomplete({
296
- minLength: 1,
297
- source: function (request, response) {
298
- //$.getJSON("csv", request, function( data, status, xhr ) {
299
- $.getJSON("knxUltimatecsv?nodeID=" + oNodeServer.id, (data) => {
300
- response($.map(data, function (value, key) {
301
- var sSearch = (value.ga + " (" + value.devicename + ") DPT" + value.dpt);
302
- if (fullSearch(sSearch, request.term + _additionalSearchTerm)) {
303
- return {
304
- label: value.ga + " # " + value.devicename + " # " + value.dpt, // Label for Display
305
- value: value.ga // Value
306
- }
307
- } else {
308
- return null;
309
- }
310
- }));
311
- });
312
- }, select: function (event, ui) {
313
- // Sets Datapoint and device name automatically
314
- var sDevName = ui.item.label.split("#")[1].trim();
315
- try {
316
- sDevName = sDevName.substr(sDevName.indexOf(")") + 1).trim();
317
- } catch (error) {
318
- }
319
- $(_destinationWidgetName).val(sDevName);
320
- var optVal = $(_destinationWidgetDPT + " option:contains('" + ui.item.label.split("#")[2].trim() + "')").attr('value');
321
- // Select the option value
322
- $(_destinationWidgetDPT).val(optVal);
323
- }
324
- });
452
+ // Check if grouped, to hide/show the "Get current" buttons
453
+ if (element.deviceObject.type === "grouped_light") {
454
+ $("#getColorAtSwitchOnDayTimeButton").hide();
455
+ $("#getColorAtSwitchOnNightTimeButton").hide();
456
+ } else {
457
+ $("#getColorAtSwitchOnDayTimeButton").show();
458
+ $("#getColorAtSwitchOnNightTimeButton").show();
325
459
  }
460
+ return;
461
+ }
462
+ });
463
+ });
464
+
465
+ $("#getColorAtSwitchOnDayTimeButton").on("click", function () {
466
+ // Get the HUE capabilities to enable/disable UI parts
467
+ $("#getColorAtSwitchOnDayTimeButton").text("Wait...");
468
+ $.getJSON("knxUltimateGetHueColor?id=" + $("#node-input-hueDevice").val().split("#")[0], (data) => {
469
+ $("#node-input-colorAtSwitchOnDayTime").val(data.toString());
470
+ $("#node-input-colorAtSwitchOnDayTime").css("background-color", "lightgreen");
471
+ setTimeout(() => {
472
+ $("#node-input-colorAtSwitchOnDayTime").css("background-color", "");
473
+ }, 500);
474
+ $("#getColorAtSwitchOnDayTimeButton").text("Get current");
475
+ });
476
+ });
477
+ $("#getColorAtSwitchOnNightTimeButton").on("click", function () {
478
+ // Get the HUE capabilities to enable/disable UI parts
479
+ $("#getColorAtSwitchOnNightTimeButton").text("Wait...");
480
+ $.getJSON("knxUltimateGetHueColor?id=" + $("#node-input-hueDevice").val().split("#")[0], (data) => {
481
+ $("#node-input-colorAtSwitchOnNightTime").val(data.toString());
482
+ $("#node-input-colorAtSwitchOnNightTime").css("background-color", "lightgreen");
483
+ setTimeout(() => {
484
+ $("#node-input-colorAtSwitchOnNightTime").css("background-color", "");
485
+ }, 500);
486
+ $("#getColorAtSwitchOnNightTimeButton").text("Get current");
487
+ });
488
+ });
489
+
490
+ // Fill options for minDimLevel and maxDimLevel
491
+ for (let index = 0; index <= 90; index++) {
492
+ if (index === 0){
493
+ $("#node-input-minDimLevelLight").append($("<option>").val(index).text(index.toString() + "% (Switch Off)"));
494
+ }else{
495
+ $("#node-input-minDimLevelLight").append($("<option>").val(index).text(index.toString() + "%"));
496
+ }
497
+
498
+ }
499
+ $("#node-input-minDimLevelLight").val(node.minDimLevelLight);
500
+ for (let index = 100; index >= 10; index--) {
501
+ $("#node-input-maxDimLevelLight").append(
502
+ $("<option>")
503
+ .val(index)
504
+ .text(index.toString() + "%")
505
+ );
506
+ }
507
+ $("#node-input-maxDimLevelLight").val(node.maxDimLevelLight);
508
+
509
+ if (this.hueDevice !== "") $("#tabs").show();
510
+ },
511
+ oneditsave: function () {
512
+ RED.sidebar.removeTab("tabNRColor");
513
+ RED.sidebar.show("help");
514
+ },
515
+ oneditcancel: function () {
516
+ RED.sidebar.removeTab("tabNRColor");
517
+ RED.sidebar.show("help");
518
+ },
519
+ });
520
+ </script>
521
+ <script src="https://kit.fontawesome.com/11f26b4500.js" crossorigin="anonymous"></script>
522
+ <script src="https://cdn.jsdelivr.net/npm/@jaames/iro@5"></script>
326
523
 
327
- getDPT("1.", "#node-input-dptLightSwitch")
328
- getGroupAddress("#node-input-GALightSwitch", "#node-input-nameLightSwitch", "#node-input-dptLightSwitch", " 1.")
329
-
330
- getDPT("1.", "#node-input-dptLightState")
331
- getGroupAddress("#node-input-GALightState", "#node-input-nameLightState", "#node-input-dptLightState", " 1.")
332
-
333
- getDPT("3.007", "#node-input-dptLightDIM")
334
- getGroupAddress("#node-input-GALightDIM", "#node-input-nameLightDIM", "#node-input-dptLightDIM", " 3.007")
524
+ <script type="text/html" data-template-name="knxUltimateHueLight">
335
525
 
336
- getDPT("5.001", "#node-input-dptLightBrightness")
337
- getGroupAddress("#node-input-GALightBrightness", "#node-input-nameLightBrightness", "#node-input-dptLightBrightness", " 5.001")
338
526
 
339
- getDPT("5.001", "#node-input-dptLightBrightnessState")
340
- getGroupAddress("#node-input-GALightBrightnessState", "#node-input-nameLightBrightnessState", "#node-input-dptLightBrightnessState", " 5.001")
527
+ <div class="form-row">
528
+ <b>HUE Light/Group node</b>&nbsp&nbsp<span style="color:red"
529
+ &nbsp
530
+ &nbsp<i class="fa fa-youtube"></i></span>&nbsp<a target="_blank" href="https://youtu.be/jjEUI1J8bkA"><u>Youtube sample</u></a>
531
+ <br />
532
+ <br />
533
+ <p align="center">
534
+ <i class="fa-regular fa-lightbulb fa-bounce fa-8x"></i>
535
+ </p>
536
+ <br />
537
+ <label for="node-input-server" >
538
+ <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>
539
+ KNX GW
540
+ </label>
541
+ <input type="text" id="node-input-server" />
542
+ </div>
543
+
544
+ <div class="form-row">
545
+ <label for="node-input-serverHue">
546
+ <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg=="/>
547
+ HUE Bridge
548
+ </label>
549
+ <input type="text" id="node-input-serverHue" />
550
+ </div>
551
+
552
+ <br/>
553
+ <p>
554
+ <b>Philips HUE</b>
555
+ </p>
556
+
557
+ <div class="form-row">
558
+ <label for="node-input-hueDevice" >
559
+ <i class="fa fa-play-circle"></i>&nbspName</label>
560
+ <input type="text" id="node-input-name" placeholder="Enter your hue device name"/>
561
+ <input type="hidden" id="node-input-hueDevice"/>
562
+ </div>
563
+
564
+ <br/>
565
+
566
+
567
+ <div id="tabs" style="width:680px" hidden>
568
+ <ul>
569
+ <li><a href="#tabs-1">Switching</a></li>
570
+ <li><a href="#tabs-2">Dim/Brightness</a></li>
571
+ <li><a href="#tabs-3">Tunable white</a></li>
572
+ <li><a href="#tabs-4">Colors</a></li>
573
+ <li><a href="#tabs-5">Effects</a></li>
574
+ <li><a href="#tabs-6">Behaviour</a></li>
575
+ </ul>
576
+ <div id="tabs-1">
577
+ <p>
578
+ <div class="form-row">
579
+ <label for="node-input-nameLightSwitch" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
341
580
 
342
- getDPT("232.600", "#node-input-dptLightColor")
343
- getGroupAddress("#node-input-GALightColor", "#node-input-nameLightColor", "#node-input-dptLightColor", " 232.600")
581
+ <label for="node-input-GALightSwitch" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightSwitch"></span></label>
582
+ <input type="text" id="node-input-GALightSwitch" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
344
583
 
345
- getDPT("232.600", "#node-input-dptLightColorState")
346
- getGroupAddress("#node-input-GALightColorState", "#node-input-nameLightColorState", "#node-input-dptLightColorState", " 232.600")
584
+ <label for="node-input-dptLightSwitch" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
585
+ <select id="node-input-dptLightSwitch" style="width:140px;"></select>
347
586
 
348
- getDPT("3.007", "#node-input-dptLightHSV")
349
- getGroupAddress("#node-input-GALightHSV", "#node-input-nameLightHSV", "#node-input-dptLightHSV", " 3.007")
587
+ <label for="node-input-nameLightSwitch" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
588
+ <input type="text" id="node-input-nameLightSwitch" style="width:190px;margin-left: 5px; text-align: left;">
589
+ </div>
590
+ <div class="form-row">
591
+ <label for="node-input-nameLightState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
350
592
 
351
- getDPT("5.001", "#node-input-dptLightHSVPercentage")
352
- getGroupAddress("#node-input-GALightHSVPercentage", "#node-input-nameLightHSVPercentage", "#node-input-dptLightHSVPercentage", " 5.001")
593
+ <label for="node-input-GALightState" style="width:20px;">GA</label>
594
+ <input type="text" id="node-input-GALightState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
353
595
 
354
- getDPT("5.001", "#node-input-dptLightHSVState")
355
- getGroupAddress("#node-input-GALightHSVState", "#node-input-nameLightHSVState", "#node-input-dptLightHSVState", " 5.001")
596
+ <label for="node-input-dptLightState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
597
+ <select id="node-input-dptLightState" style="width:140px;"></select>
356
598
 
357
- getDPT("1.", "#node-input-dptLightBlink")
358
- getGroupAddress("#node-input-GALightBlink", "#node-input-nameLightBlink", "#node-input-dptLightBlink", " 1.")
599
+ <label for="node-input-nameLightState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
600
+ <input type="text" id="node-input-nameLightState" style="width:190px;margin-left: 5px; text-align: left;">
601
+ </div>
602
+ </p>
603
+ </div>
604
+ <div id="tabs-2">
605
+ <p>
606
+ <div class="form-row">
607
+ <label for="node-input-nameLightDIM" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
359
608
 
360
- getDPT("1.", "#node-input-dptLightColorCycle")
361
- getGroupAddress("#node-input-GALightColorCycle", "#node-input-nameLightColorCycle", "#node-input-dptLightColorCycle", " 1.")
609
+ <label for="node-input-GALightDIM" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
610
+ <input type="text" id="node-input-GALightDIM" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
362
611
 
363
- getDPT("1.", "#node-input-dptDaylightSensor")
364
- getGroupAddress("#node-input-GADaylightSensor", "#node-input-nameDaylightSensor", "#node-input-dptDaylightSensor", " 1.")
612
+ <label for="node-input-dptLightDIM" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
613
+ <select id="node-input-dptLightDIM" style="width:140px;"></select>
365
614
 
615
+ <label for="node-input-nameLightDIM" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
616
+ <input type="text" id="node-input-nameLightDIM" style="width:190px;margin-left: 5px; text-align: left;">
617
+ </div>
618
+ <div class="form-row">
619
+ <label for="node-input-nameLightBrightness" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control %</label>
366
620
 
367
- // Show/Hide and enable/disable day/night Lighting behaviour
368
- if (this.enableDayNightLighting === "yes") {
369
- $("#DivEnableDayNightLighting").show()
370
- } else {
371
- $("#DivEnableDayNightLighting").hide()
372
- }
621
+ <label for="node-input-GALightBrightness" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
622
+ <input type="text" id="node-input-GALightBrightness" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
373
623
 
374
- $("#node-input-enableDayNightLighting").on('change', function () {
375
- if ($("#node-input-enableDayNightLighting").val() === 'yes') {
376
- $("#DivEnableDayNightLighting").show()
377
- } else {
378
- $("#DivEnableDayNightLighting").hide()
379
- }
380
- })
624
+ <label for="node-input-dptLightBrightness" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
625
+ <select id="node-input-dptLightBrightness" style="width:140px;"></select>
381
626
 
382
- // Show/Hide the div of the color at swich on
383
- if (this.specifySwitchOnBrightness === 'yes') {
384
- $("#divColorsAtSwitchOn").show()
385
- } else {
386
- $("#divColorsAtSwitchOn").hide()
387
- $("#node-input-colorAtSwitchOnDayTime").val('')
388
- }
627
+ <label for="node-input-nameLightBrightness" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
628
+ <input type="text" id="node-input-nameLightBrightness" style="width:190px;margin-left: 5px; text-align: left;">
629
+ </div>
389
630
 
390
- $("#node-input-specifySwitchOnBrightness").on('change', function () {
391
- if ($("#node-input-specifySwitchOnBrightness").val() === 'yes') {
392
- $("#divColorsAtSwitchOn").show()
393
- if ($("#node-input-colorAtSwitchOnDayTime").val() === '') $("#node-input-colorAtSwitchOnDayTime").val('{ "red": 255, "green": 255, "blue": 255 }')
394
- } else {
395
- $("#divColorsAtSwitchOn").hide()
396
- $("#node-input-colorAtSwitchOnDayTime").val('')
397
- }
398
- })
399
-
400
- // Autocomplete suggestion with HUE Lights
401
- $("#node-input-name").autocomplete({
402
- minLength: 1,
403
- source: function (request, response) {
404
- $.getJSON("KNXUltimateGetResourcesHUE?rtype=light&nodeID=" + oNodeServerHue.id, (data) => {
405
- response($.map(data.devices, function (value, key) {
406
- //alert(JSON.stringify(value) + " "+ key)
407
- var sSearch = (value.name);
408
- if (fullSearch(sSearch, request.term)) {
409
- return {
410
- hueDevice: value.id,
411
- value: value.name
412
- }
413
- } else {
414
- return null;
415
- }
416
- }));
417
- });
418
- }, select: function (event, ui) {
419
- // Distinguish between group of lights an single light.
420
- if (ui.item.value.toLowerCase().startsWith('grouped_light')) {
421
- $('#node-input-hueDevice').val(ui.item.hueDevice + "#grouped_light");
422
- $("#getColorAtSwitchOnDayTimeButton").hide();
423
- $("#getColorAtSwitchOnNightTimeButton").hide();
424
- } else {
425
- $('#node-input-hueDevice').val(ui.item.hueDevice + "#light");
426
- $("#getColorAtSwitchOnDayTimeButton").show();
427
- $("#getColorAtSwitchOnNightTimeButton").show();
428
- }
429
- $('#tabs').show();
430
- }
431
- });
631
+ <div class="form-row">
632
+ <label for="node-input-nameLightBrightnessState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
432
633
 
433
- // Get the HUE capabilities to enable/disable UI parts
434
- $.getJSON("KNXUltimateGetResourcesHUE?rtype=light&nodeID=" + oNodeServerHue.id, (data) => {
435
- data.devices.forEach(element => {
436
- if (element.id === this.hueDevice.split('#')[0] && element.deviceObject !== undefined) {
437
- // Check dimming
438
- if (element.deviceObject.dimming === undefined) {
439
- $('#tabs').tabs("disable", "#tabs-2");
440
- $('#divColorsAtSwitchOn').hide()
441
- $('#divColorCycle').hide()
442
- }
443
- // Check color
444
- if (element.deviceObject.color_temperature === undefined) $('#tabs').tabs("disable", "#tabs-3");
445
- if (element.deviceObject.color === undefined) {
446
- $('#tabs').tabs("disable", "#tabs-4");
447
- $('#divColorsAtSwitchOn').hide()
448
- $('#divColorCycle').hide()
449
- }
450
- // Check if grouped, to hide/show the "Get current" buttons
451
- if (element.deviceObject.type === "grouped_light") {
452
- $("#getColorAtSwitchOnDayTimeButton").hide();
453
- $("#getColorAtSwitchOnNightTimeButton").hide();
454
- } else {
455
- $("#getColorAtSwitchOnDayTimeButton").show();
456
- $("#getColorAtSwitchOnNightTimeButton").show();
457
- }
458
- return
459
- }
460
- });
461
- });
634
+ <label for="node-input-GALightBrightnessState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
635
+ <input type="text" id="node-input-GALightBrightnessState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
462
636
 
463
- $("#getColorAtSwitchOnDayTimeButton").on("click", function () {
464
- // Get the HUE capabilities to enable/disable UI parts
465
- $("#getColorAtSwitchOnDayTimeButton").text("Wait...")
466
- $.getJSON("knxUltimateGetHueColor?id=" + $('#node-input-hueDevice').val().split('#')[0], (data) => {
467
- $('#node-input-colorAtSwitchOnDayTime').val(data.toString());
468
- $("#node-input-colorAtSwitchOnDayTime").css("background-color", "lightgreen");
469
- setTimeout(() => {
470
- $("#node-input-colorAtSwitchOnDayTime").css("background-color", "");
471
- }, 500);
472
- $("#getColorAtSwitchOnDayTimeButton").text("Get current")
473
- });
474
- });
475
- $("#getColorAtSwitchOnNightTimeButton").on("click", function () {
476
- // Get the HUE capabilities to enable/disable UI parts
477
- $("#getColorAtSwitchOnNightTimeButton").text("Wait...")
478
- $.getJSON("knxUltimateGetHueColor?id=" + $('#node-input-hueDevice').val().split('#')[0], (data) => {
479
- $('#node-input-colorAtSwitchOnNightTime').val(data.toString());
480
- $("#node-input-colorAtSwitchOnNightTime").css("background-color", "lightgreen");
481
- setTimeout(() => {
482
- $("#node-input-colorAtSwitchOnNightTime").css("background-color", "");
483
- }, 500);
484
- $("#getColorAtSwitchOnNightTimeButton").text("Get current")
485
- });
486
- });
637
+ <label for="node-input-dptLightBrightnessState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
638
+ <select id="node-input-dptLightBrightnessState" style="width:140px;"></select>
487
639
 
488
- for (let index = 1; index <= 90; index++) {
489
- $('#node-input-minDimLevelLight').append($('<option>').val(index).text(index.toString() + "%"))
490
- }
491
- $('#node-input-minDimLevelLight').val(node.minDimLevelLight)
492
- for (let index = 100; index >= 10; index--) {
493
- $('#node-input-maxDimLevelLight').append($('<option>').val(index).text(index.toString() + "%"))
494
- }
495
- $('#node-input-maxDimLevelLight').val(node.maxDimLevelLight)
640
+ <label for="node-input-nameLightBrightnessState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
641
+ <input type="text" id="node-input-nameLightBrightnessState" style="width:190px;margin-left: 5px; text-align: left;">
642
+ </div>
643
+ </p>
644
+ </div>
645
+ <div id="tabs-3">
646
+ <p>
647
+ <div class="form-row">
648
+ <label for="node-input-nameLightHSV" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
496
649
 
497
- if (this.hueDevice !== "") $('#tabs').show();
498
- },
499
- oneditsave: function () {
500
- RED.sidebar.removeTab("tabNRColor");
501
- RED.sidebar.show("help")
502
- },
503
- oneditcancel: function () {
504
- RED.sidebar.removeTab("tabNRColor");
505
- RED.sidebar.show("help")
506
- }
507
- })
650
+ <label for="node-input-GALightHSV" style="width:20px;">GA</label>
651
+ <input type="text" id="node-input-GALightHSV" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
508
652
 
509
- </script>
510
- <script src="https://kit.fontawesome.com/11f26b4500.js" crossorigin="anonymous"></script>
511
- <script src="https://cdn.jsdelivr.net/npm/@jaames/iro@5"></script>
653
+ <label for="node-input-dptLightHSV" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
654
+ <select id="node-input-dptLightHSV" style="width:140px;"></select>
512
655
 
513
- <script type="text/html" data-template-name="knxUltimateHueLight">
656
+ <label for="node-input-nameLightHSV" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
657
+ <input type="text" id="node-input-nameLightHSV" style="width:190px;margin-left: 5px; text-align: left;">
658
+ </div>
659
+ <div class="form-row">
660
+ <label for="node-input-nameLightHSVPercentage" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control %</label>
514
661
 
662
+ <label for="node-input-GALightHSVPercentage" style="width:20px;">GA</label>
663
+ <input type="text" id="node-input-GALightHSVPercentage" placeholder="Ex: 1/1/1"
664
+ style="width:70px;margin-left: 5px; text-align: left;">
515
665
 
516
- <div class="form-row">
517
- <b>HUE Light/Group node</b>&nbsp&nbsp<span style="color:red"
518
- &nbsp
519
- &nbsp<i class="fa fa-youtube"></i></span>&nbsp<a target="_blank" href="https://youtu.be/jjEUI1J8bkA"><u>Youtube sample</u></a>
520
- <br />
521
- <br />
522
- <p align="center">
523
- <i class="fa-regular fa-lightbulb fa-bounce fa-8x"></i>
524
- </p>
525
- <br />
526
- <label for="node-input-server" >
527
- <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>
528
- KNX GW
529
- </label>
530
- <input type="text" id="node-input-server" />
531
- </div>
666
+ <label for="node-input-dptLightHSVPercentage" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
667
+ <select id="node-input-dptLightHSVPercentage" style="width:140px;"></select>
532
668
 
533
- <div class="form-row">
534
- <label for="node-input-serverHue">
535
- <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg=="/>
536
- HUE Bridge
537
- </label>
538
- <input type="text" id="node-input-serverHue" />
539
- </div>
669
+ <label for="node-input-nameLightHSVPercentage" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
670
+ <input type="text" id="node-input-nameLightHSVPercentage" style="width:190px;margin-left: 5px; text-align: left;">
671
+ </div>
672
+ <div class="form-row">
673
+ <label for="node-input-nameLightHSVState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
540
674
 
541
- <br/>
542
- <p>
543
- <b>Philips HUE</b>
544
- </p>
545
-
546
- <div class="form-row">
547
- <label for="node-input-hueDevice" >
548
- <i class="fa fa-play-circle"></i>&nbspName</label>
549
- <input type="text" id="node-input-name" placeholder="Enter your hue device name"/>
550
- <input type="hidden" id="node-input-hueDevice"/>
551
- </div>
675
+ <label for="node-input-GALightHSVState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
676
+ <input type="text" id="node-input-GALightHSVState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
552
677
 
553
- <br/>
554
-
555
-
556
- <div id="tabs" style="width:680px" hidden>
557
- <ul>
558
- <li><a href="#tabs-1">Switching</a></li>
559
- <li><a href="#tabs-2">Dim/Brightness</a></li>
560
- <li><a href="#tabs-3">Tunable white</a></li>
561
- <li><a href="#tabs-4">Colors</a></li>
562
- <li><a href="#tabs-5">Effects</a></li>
563
- <li><a href="#tabs-6">Behaviour</a></li>
564
- </ul>
565
- <div id="tabs-1">
566
- <p>
567
- <div class="form-row">
568
- <label for="node-input-nameLightSwitch" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
569
-
570
- <label for="node-input-GALightSwitch" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightSwitch"></span></label>
571
- <input type="text" id="node-input-GALightSwitch" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
572
-
573
- <label for="node-input-dptLightSwitch" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
574
- <select id="node-input-dptLightSwitch" style="width:140px;"></select>
575
-
576
- <label for="node-input-nameLightSwitch" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
577
- <input type="text" id="node-input-nameLightSwitch" style="width:190px;margin-left: 5px; text-align: left;">
578
- </div>
579
- <div class="form-row">
580
- <label for="node-input-nameLightState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
678
+ <label for="node-input-dptLightHSVState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
679
+ <select id="node-input-dptLightHSVState" style="width:140px;"></select>
581
680
 
582
- <label for="node-input-GALightState" style="width:20px;">GA</label>
583
- <input type="text" id="node-input-GALightState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
584
-
585
- <label for="node-input-dptLightState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
586
- <select id="node-input-dptLightState" style="width:140px;"></select>
587
-
588
- <label for="node-input-nameLightState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
589
- <input type="text" id="node-input-nameLightState" style="width:190px;margin-left: 5px; text-align: left;">
590
- </div>
591
- </p>
592
- </div>
593
- <div id="tabs-2">
594
- <p>
595
- <div class="form-row">
596
- <label for="node-input-nameLightDIM" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
597
-
598
- <label for="node-input-GALightDIM" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
599
- <input type="text" id="node-input-GALightDIM" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
600
-
601
- <label for="node-input-dptLightDIM" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
602
- <select id="node-input-dptLightDIM" style="width:140px;"></select>
603
-
604
- <label for="node-input-nameLightDIM" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
605
- <input type="text" id="node-input-nameLightDIM" style="width:190px;margin-left: 5px; text-align: left;">
606
- </div>
607
- <div class="form-row">
608
- <label for="node-input-nameLightBrightness" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control %</label>
609
-
610
- <label for="node-input-GALightBrightness" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
611
- <input type="text" id="node-input-GALightBrightness" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
612
-
613
- <label for="node-input-dptLightBrightness" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
614
- <select id="node-input-dptLightBrightness" style="width:140px;"></select>
615
-
616
- <label for="node-input-nameLightBrightness" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
617
- <input type="text" id="node-input-nameLightBrightness" style="width:190px;margin-left: 5px; text-align: left;">
618
- </div>
619
-
620
- <div class="form-row">
621
- <label for="node-input-nameLightBrightnessState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
622
-
623
- <label for="node-input-GALightBrightnessState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
624
- <input type="text" id="node-input-GALightBrightnessState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
625
-
626
- <label for="node-input-dptLightBrightnessState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
627
- <select id="node-input-dptLightBrightnessState" style="width:140px;"></select>
628
-
629
- <label for="node-input-nameLightBrightnessState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
630
- <input type="text" id="node-input-nameLightBrightnessState" style="width:190px;margin-left: 5px; text-align: left;">
631
- </div>
632
- </p>
633
- </div>
634
- <div id="tabs-3">
635
- <p>
636
- <div class="form-row">
637
- <label for="node-input-nameLightHSV" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
638
-
639
- <label for="node-input-GALightHSV" style="width:20px;">GA</label>
640
- <input type="text" id="node-input-GALightHSV" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
641
-
642
- <label for="node-input-dptLightHSV" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
643
- <select id="node-input-dptLightHSV" style="width:140px;"></select>
644
-
645
- <label for="node-input-nameLightHSV" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
646
- <input type="text" id="node-input-nameLightHSV" style="width:190px;margin-left: 5px; text-align: left;">
647
- </div>
648
- <div class="form-row">
649
- <label for="node-input-nameLightHSVPercentage" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control %</label>
650
-
651
- <label for="node-input-GALightHSVPercentage" style="width:20px;">GA</label>
652
- <input type="text" id="node-input-GALightHSVPercentage" placeholder="Ex: 1/1/1"
653
- style="width:70px;margin-left: 5px; text-align: left;">
654
-
655
- <label for="node-input-dptLightHSVPercentage" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
656
- <select id="node-input-dptLightHSVPercentage" style="width:140px;"></select>
657
-
658
- <label for="node-input-nameLightHSVPercentage" style="width:50px; margin-left: 0px; text-align: right;">Name</label>
659
- <input type="text" id="node-input-nameLightHSVPercentage" style="width:190px;margin-left: 5px; text-align: left;">
660
- </div>
661
- <div class="form-row">
662
- <label for="node-input-nameLightHSVState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
663
-
664
- <label for="node-input-GALightHSVState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
665
- <input type="text" id="node-input-GALightHSVState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
666
-
667
- <label for="node-input-dptLightHSVState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
668
- <select id="node-input-dptLightHSVState" style="width:140px;"></select>
669
-
670
- <label for="node-input-nameLightHSVState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
671
- <input type="text" id="node-input-nameLightHSVState" style="width:190px;margin-left: 5px; text-align: left;">
672
- </div>
673
- </p>
674
- </div>
675
- <div id="tabs-4">
676
- <p>
677
- <div class="form-row">
678
- <label for="node-input-nameLightColor" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
679
-
680
- <label for="node-input-GALightColor" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
681
- <input type="text" id="node-input-GALightColor" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
682
-
683
- <label for="node-input-dptLightColor" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
684
- <select id="node-input-dptLightColor" style="width:140px;"></select>
685
-
686
- <label for="node-input-nameLightColor" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
687
- <input type="text" id="node-input-nameLightColor" style="width:190px;margin-left: 5px; text-align: left;">
688
- </div>
689
- <div class="form-row">
690
- <label for="node-input-nameLightColorState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
691
-
692
- <label for="node-input-GALightColorState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
693
- <input type="text" id="node-input-GALightColorState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
694
-
695
- <label for="node-input-dptLightColorState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
696
- <select id="node-input-dptLightColorState" style="width:140px;"></select>
697
-
698
- <label for="node-input-nameLightColorState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
699
- <input type="text" id="node-input-nameLightColorState" style="width:190px;margin-left: 5px; text-align: left;">
700
- </div>
701
- </p>
702
- </div>
703
-
704
- <div id="tabs-5">
681
+ <label for="node-input-nameLightHSVState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
682
+ <input type="text" id="node-input-nameLightHSVState" style="width:190px;margin-left: 5px; text-align: left;">
683
+ </div>
684
+ </p>
685
+ </div>
686
+ <div id="tabs-4">
687
+ <p>
688
+ <div class="form-row">
689
+ <label for="node-input-nameLightColor" style="width:110px;"><i class="fa fa-play-circle-o"></i> Control</label>
690
+
691
+ <label for="node-input-GALightColor" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
692
+ <input type="text" id="node-input-GALightColor" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
693
+
694
+ <label for="node-input-dptLightColor" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
695
+ <select id="node-input-dptLightColor" style="width:140px;"></select>
696
+
697
+ <label for="node-input-nameLightColor" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
698
+ <input type="text" id="node-input-nameLightColor" style="width:190px;margin-left: 5px; text-align: left;">
699
+ </div>
700
+ <div class="form-row">
701
+ <label for="node-input-nameLightColorState" style="width:110px;"><i class="fa fa-play-circle-o"></i> Status</label>
702
+
703
+ <label for="node-input-GALightColorState" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
704
+ <input type="text" id="node-input-GALightColorState" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
705
+
706
+ <label for="node-input-dptLightColorState" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
707
+ <select id="node-input-dptLightColorState" style="width:140px;"></select>
708
+
709
+ <label for="node-input-nameLightColorState" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
710
+ <input type="text" id="node-input-nameLightColorState" style="width:190px;margin-left: 5px; text-align: left;">
711
+ </div>
712
+ </p>
713
+ </div>
714
+ <div id="tabs-5">
715
+ <p>
716
+ <div class="form-row">
717
+ <label for="node-input-nameLightBlink" style="width:110px;"><i class="fa fa-play-circle-o"></i> Blink</label>
718
+
719
+ <label for="node-input-GALightBlink" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
720
+ <input type="text" id="node-input-GALightBlink" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
721
+
722
+ <label for="node-input-dptLightBlink" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
723
+ <select id="node-input-dptLightBlink" style="width:140px;"></select>
724
+
725
+ <label for="node-input-nameLightBlink" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
726
+ <input type="text" id="node-input-nameLightBlink" style="width:190px;margin-left: 5px; text-align: left;">
727
+ </div>
728
+
729
+ <div id="divColorCycle">
730
+ <div class="form-row">
731
+ <label for="node-input-nameLightColorCycle" style="width:110px;"><i class="fa fa-play-circle-o"></i> Color Cycle</label>
732
+
733
+ <label for="node-input-GALightColorCycle" style="width:20px;">GA</label>
734
+ <input type="text" id="node-input-GALightColorCycle" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
735
+
736
+ <label for="node-input-dptLightColorCycle" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
737
+ <select id="node-input-dptLightColorCycle" style="width:140px;"></select>
738
+
739
+ <label for="node-input-nameLightColorCycle" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
740
+ <input type="text" id="node-input-nameLightColorCycle" style="width:190px;margin-left: 5px; text-align: left;">
741
+ </div>
742
+ </div>
743
+ </p>
744
+ </div>
745
+ <div id="tabs-6">
705
746
  <p>
747
+ <div class="form-row">
748
+ <label for="node-input-updateKNXBrightnessStatusOnHUEOnOff" style="width:260px;">
749
+ <i class="fa fa-tag"></i> KNX Brightness Status
750
+ </label>
751
+ <select id="node-input-updateKNXBrightnessStatusOnHUEOnOff">
752
+ <option value="onhueoff">When HUE light is Off, send 0% (Default KNX behaviour)</option>
753
+ <option value="no">Leave as is (default HUE behaviour)</option>
754
+ </select>
755
+ </div>
756
+ <div class="form-row">
757
+ <label for="node-input-specifySwitchOnBrightness" style="width:260px;">
758
+ <i class="fa fa-tag"></i> Specify switch on brightness
759
+ </label>
760
+ <select id="node-input-specifySwitchOnBrightness">
761
+ <option value="yes">Yes</option>
762
+ <option value="no">No</option>
763
+ </select>
764
+ </div>
765
+
766
+ <div class="form-row" id="divColorsAtSwitchOn">
767
+ <label for="node-input-colorAtSwitchOnDayTime" style="width:260px">
768
+ <i class="fa fa-sun-o"></i> Switch On - color/brightness
769
+ </label>
770
+ <input type="text" id="node-input-colorAtSwitchOnDayTime"
771
+ placeholder='For example, {"red":255, "green":255, "blue":255}' style="width:260px">
772
+ <button id="getColorAtSwitchOnDayTimeButton" type="button" class="red-ui-button">Get current</button>
773
+ </div>
774
+ <div id="divCCSBoxayNightLighting">
706
775
  <div class="form-row">
707
- <label for="node-input-nameLightBlink" style="width:110px;"><i class="fa fa-play-circle-o"></i> Blink</label>
708
-
709
- <label for="node-input-GALightBlink" style="width:20px;"><span data-i18n="knxUltimateHueLight.node-input-GALightState"></span></label>
710
- <input type="text" id="node-input-GALightBlink" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
711
-
712
- <label for="node-input-dptLightBlink" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
713
- <select id="node-input-dptLightBlink" style="width:140px;"></select>
714
-
715
- <label for="node-input-nameLightBlink" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
716
- <input type="text" id="node-input-nameLightBlink" style="width:190px;margin-left: 5px; text-align: left;">
717
- </div>
718
-
719
- <div id="divColorCycle">
720
- <div class="form-row">
721
- <label for="node-input-nameLightColorCycle" style="width:110px;"><i class="fa fa-play-circle-o"></i> Color Cycle</label>
722
-
723
- <label for="node-input-GALightColorCycle" style="width:20px;">GA</label>
724
- <input type="text" id="node-input-GALightColorCycle" placeholder="Ex: 1/1/1" style="width:70px;margin-left: 5px; text-align: left;">
725
-
726
- <label for="node-input-dptLightColorCycle" style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
727
- <select id="node-input-dptLightColorCycle" style="width:140px;"></select>
728
-
729
- <label for="node-input-nameLightColorCycle" style="width:50px; margin-left: 0px; text-align: right;"><span data-i18n="knxUltimateHueLight.node-input-name"></span></label>
730
- <input type="text" id="node-input-nameLightColorCycle" style="width:190px;margin-left: 5px; text-align: left;">
731
- </div>
732
- </div>
733
- </p>
734
- </div>
735
- <div id="tabs-6">
736
- <p>
737
- <div class="form-row">
738
- <label for="node-input-updateKNXBrightnessStatusOnHUEOnOff" style="width:260px;">
739
- <i class="fa fa-tag"></i> KNX Brightness Status
776
+ <label for="node-input-enableDayNightLighting" style="width:260px;">
777
+ <i class="fa fa-clone"></i> Night Lighting
740
778
  </label>
741
- <select id="node-input-updateKNXBrightnessStatusOnHUEOnOff">
742
- <option value="onhueoff">When HUE light is Off, send 0% (Default KNX behaviour)</option>
743
- <option value="no">Leave as is (default HUE behaviour)</option>
744
- </select>
745
- </div>
746
- <div class="form-row">
747
- <label for="node-input-specifySwitchOnBrightness" style="width:260px;">
748
- <i class="fa fa-tag"></i> Specify switch on brightness
749
- </label>
750
- <select id="node-input-specifySwitchOnBrightness">
779
+ <select id="node-input-enableDayNightLighting">
751
780
  <option value="yes">Yes</option>
752
781
  <option value="no">No</option>
753
782
  </select>
754
- </div>
755
- <div id="divColorsAtSwitchOn">
756
- <div class="form-row" >
757
- <label for="node-input-colorAtSwitchOnDayTime" style="width:260px">
758
- <i class="fa fa-sun-o"></i> Switch On - color/brightness
759
- </label>
760
- <input type="text" id="node-input-colorAtSwitchOnDayTime"
761
- placeholder='For example, {"red":255, "green":255, "blue":255}' style="width:260px">
762
- <button id="getColorAtSwitchOnDayTimeButton" type="button" class="red-ui-button">Get current</button>
763
- </div>
764
- <div class="form-row">
765
- <label for="node-input-enableDayNightLighting" style="width:260px;">
766
- <i class="fa fa-clone"></i> Night Lighting
767
- </label>
768
- <select id="node-input-enableDayNightLighting">
769
- <option value="yes">Yes</option>
770
- <option value="no">No</option>
771
- </select>
772
- </div>
773
-
774
- <div id="DivEnableDayNightLighting">
775
- <div class="form-row">
776
- <label for="node-input-colorAtSwitchOnNightTime" style="width:260px">
777
- <i class="fa fa-moon-o"></i> Switch On color/brigh. at Night
778
- </label>
779
- <input type="text" id="node-input-colorAtSwitchOnNightTime"
780
- placeholder='Example {"red":100, "green":0, "blue":50}' style="width:260px">
781
- <button id="getColorAtSwitchOnNightTimeButton" type="button" class="red-ui-button">Get current</button>
782
- </div>
783
- <div class="form-row">
784
- <label for="node-input-nameDaylightSensor" style="width:110px;"><i class="fa fa-clock-o"></i>
785
- Day/Night</label>
786
-
787
- <label for="node-input-GADaylightSensor" style="width:20px;">GA</label>
788
- <input type="text" id="node-input-GADaylightSensor" placeholder="Ex: 1/1/1"
789
- style="width:70px;margin-left: 5px; text-align: left;">
790
-
791
- <label for="node-input-dptDaylightSensor"
792
- style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
793
- <select id="node-input-dptDaylightSensor" style="width:140px;"></select>
794
-
795
- <label for="node-input-nameDaylightSensor" style="width:50px; margin-left: 0px; text-align: right;"><span
796
- data-i18n="knxUltimateHueLight.node-input-name"></span></label>
797
- <input type="text" id="node-input-nameDaylightSensor"
798
- style="width:190px;margin-left: 5px; text-align: left;">
799
- </div>
800
- <div class="form-row">
801
- <label style="width:170px" for="node-input-invertDayNight">
802
- <i class="fa fa-shuffle"></i> Invert day/night values
803
- </label>
804
- <input type="checkbox" id="node-input-invertDayNight"
805
- style="display:inline-block; width:auto; vertical-align:top;" />
806
-
807
- </div>
808
- </div>
809
- </div>
783
+ </div>
784
+ <div id="divEnableDayNightLighting">
810
785
  <div class="form-row">
811
- <label for="node-input-dimSpeed" style="width:260px">
812
- <i class="fa fa-bolt"></i> Dim Speed (ms)
786
+ <label for="node-input-colorAtSwitchOnNightTime" style="width:260px">
787
+ <i class="fa fa-moon-o"></i> Switch On color/brigh. at Night
813
788
  </label>
814
- <input type="text" id="node-input-dimSpeed" placeholder='5000' style="width:260px">
789
+ <input type="text" id="node-input-colorAtSwitchOnNightTime"
790
+ placeholder='Example {"red":100, "green":0, "blue":50}' style="width:260px">
791
+ <button id="getColorAtSwitchOnNightTimeButton" type="button" class="red-ui-button">Get current</button>
815
792
  </div>
816
793
  <div class="form-row">
817
- <label for="node-input-minDimLevelLight" style="width:260px;">
818
- <i class="fa fa-clone"></i> Min Dim Brightness
819
- </label>
820
- <select id="node-input-minDimLevelLight">
821
- <option value="useHueLightLevel">Use minimum brightness specified in the HUE light</option>
822
- </select>
794
+ <label for="node-input-nameDaylightSensor" style="width:110px;"><i class="fa fa-clock-o"></i>
795
+ Day/Night</label>
796
+ <label for="node-input-GADaylightSensor" style="width:20px;">GA</label>
797
+ <input type="text" id="node-input-GADaylightSensor" placeholder="Ex: 1/1/1"
798
+ style="width:70px;margin-left: 5px; text-align: left;">
799
+
800
+ <label for="node-input-dptDaylightSensor"
801
+ style="width:40px; margin-left: 0px; text-align: right;">DPT</label>
802
+ <select id="node-input-dptDaylightSensor" style="width:140px;"></select>
803
+
804
+ <label for="node-input-nameDaylightSensor" style="width:50px; margin-left: 0px; text-align: right;"><span
805
+ data-i18n="knxUltimateHueLight.node-input-name"></span></label>
806
+ <input type="text" id="node-input-nameDaylightSensor"
807
+ style="width:190px;margin-left: 5px; text-align: left;">
823
808
  </div>
824
809
  <div class="form-row">
825
- <label for="node-input-maxDimLevelLight" style="width:260px;">
826
- <i class="fa fa-clone"></i> Max Dim Brightness
827
- </label>
828
- <select id="node-input-maxDimLevelLight"></select>
829
- </div>
830
-
810
+ <label style="width:170px" for="node-input-invertDayNight">
811
+ <i class="fa fa-shuffle"></i> Invert day/night values
812
+ </label>
813
+ <input type="checkbox" id="node-input-invertDayNight"
814
+ style="display:inline-block; width:auto; vertical-align:top;" />
815
+ </div>
816
+ </div>
817
+ </div>
818
+ <br />
819
+ <div class="form-row">
820
+ <label for="node-input-dimSpeed" style="width:260px">
821
+ <i class="fa fa-bolt"></i> Dim Speed (ms)
822
+ </label>
823
+ <input type="text" id="node-input-dimSpeed" placeholder='Default is 5000' style="width:260px">
824
+ </div>
825
+ <div class="form-row">
826
+ <label for="node-input-minDimLevelLight" style="width:260px;">
827
+ <i class="fa fa-clone"></i> Min Dim Brightness
828
+ </label>
829
+ <select id="node-input-minDimLevelLight">
830
+ <option value="useHueLightLevel">Use minimum brightness specified in the HUE light</option>
831
+ </select>
832
+ </div>
833
+ <div class="form-row">
834
+ <label for="node-input-maxDimLevelLight" style="width:260px;">
835
+ <i class="fa fa-clone"></i> Max Dim Brightness
836
+ </label>
837
+ <select id="node-input-maxDimLevelLight"></select>
838
+ </div>
831
839
  </p>
832
- </div>
833
-
834
- <br/>
840
+ </div>
841
+
842
+ <br/>
835
843
  </script>
836
844
 
837
845
  <script type="text/markdown" data-help-name="knxUltimateHueLight">
838
- <p>This node lets you control your Philips HUE light and grouped lights and also gets the states of this lights, to be sent to the KNX bus.</p>
839
-
840
- **General**
841
- |Property|Description|
842
- |--|--|
843
- | KNX GW | Select the KNX gateway to be used |
844
- | HUE Bridge | Select the HUE Bridge to be used |
845
- | Name | HUE light or HUE grouped light to be used. The avaiable lights and groups start showing up while you're typing.|
846
-
847
- <br/>
848
-
849
- **OPTIONS**
850
-
851
- Here you can choose the KNX addresses to be linked to the avaiable HUE light commands/states.<br/>
852
- 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.
853
-
854
- **Switching**
855
- |Property|Description|
856
- |--|--|
857
- | Control | This GA is used to turn on/off the HUE light via a boolean KNX value true/false|
858
- | Status | Link this to the light's switch status group address|
859
-
860
- <br/>
861
-
862
- **Dim/Brightness**
863
- |Property|Description|
864
- |--|--|
865
- | Control | Relative DIM the HUE light. You can set the dimming speed in the ***Behaviour*** tab. |
866
- | Control % | Changes the absolute HUE light's brightness (0-100%)|
867
- | Status| Link this to the light's brightness status group address |
868
-
869
- <br/>
870
-
871
- **Tunable white**
872
- |Property|Description|
873
- |--|--|
874
- | Control| Changes the HUE light's white temperature, using DPT 3.007 dimming. You can set the dimming speed in the ***Behaviour*** tab.|
875
- | Control % | Changes the HUE light's white temperature, using the DPT 5.001. A value of 0 is full warm, a value of 100 is full cold.|
876
- | Status | Link this to the light temperature status group address. Datapoint is 5.001 absolute value. 0 is full warm, 100 is full cold.|
877
-
878
- <br/>
879
-
880
- **Colors**
881
- |Property|Description|
882
- |--|--|
883
- | Control | 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 |
884
- | Status | Link this to the light's color status group address. Accepted datapoint is RGB triplet (r,g,b)|
885
-
886
- <br/>
887
-
888
- **Effects**
889
- |Property|Description|
890
- |--|--|
891
- | Blink | *true* Blink the light, *false* Stop blinking. Blinks the light on and off. Useful for signalling. Works with all HUE lights. |
892
- | Color Cycle | *true* start cycle, *false* Stop cycle. Randomly changes the HUE light's color at regular interval. Works with all HUE lights having color capabilities. The color effect will start 10 seconds after set. |
893
-
894
- <br/>
895
-
896
- **Behaviour**
897
-
898
- |Property|Description|
899
- |--|--|
900
- | KNX Brightness Status | Updates the KNX brightness group address whenever the HUE lamp is switched ON/OFF. The options are `When HUE light is Off, send 0% (Default KNX behaviour)` and `Leave as is (default HUE behaviour)` |
901
- | Specify switch on brightness | It enables the brightness value to follow the on/off status of the light. If you change the HUE brightness value to 0% (from the HUE App), an "off" telegram is also sent to the KNX bus; if you set it other than 0%, an "on" telegram is also sent to the KNX bus. This is valid also vice-versa: if you change the brightness via KNX bus, the HUE on/off value is also sent to the lamp. If you set it to **No**, the previous HUE light brightness value is retained. Default value is **Yes**. |
902
- | Switch On - color/brightness | You can choose the color/brightness of your light, at switch on. Set it as JSON object, for example **{ "red": 255, "green": 255, "blue": 255 }** |
903
- | Night Lighting | It allows to set a particular light color/brightness at nighttime. If **checked**, a further set of option shows up and the light changes the behaviour based on these options, everytime you switch the light *on*. |
904
- | Switch On - color/brightness at Nighttime | You can choose the color/brightness of your light, at switch on, on night time. Set it as JSON object. Default value if you leave blank is **{ "red": 100, "green": 0, "blue": 0 }** |
905
- | Day/Night | Select the group address used to set the day/night behaviour. The group address value is *true* if daytime, *false* if nighttime. |
906
- | Invert day/night values | Invert the values of *Day/Night* group address. Default value is **unchecked**.|
907
- | Dim Speed (ms) | The dimming speed, in Milliseconds. This applies to the **light** and also to the **tunable white** dimming datapoints. It' calculated from 0% to 100%.|
908
- | Min Dim brightness | Tha Minimum brightness that the lamp can reach. For example, if you are dimming the light down, the light will stop dimming at the specified brightness %. |
909
- | Max Dim brightness | Tha Maximum brightness that the lamp can reach. For example, if you are dimming the light up, the light will stop dimming at the specified brightness %. |
910
-
911
- ### Note
912
- The Dimming function works in **KNX mode `start` and `stop`**. To start dimming, send only one "start" KNX telegram. To stop dimming, send a "stop" KNX telegram. Please **remember that**, when you set your wall swiches properties.
913
-
914
- <br/>
915
-
916
- [Find it useful?](https://www.paypal.me/techtoday)
917
-
918
- <br/>
846
+ <p>This node lets you control your Philips HUE light and grouped lights and also gets the states of this lights, to be sent to the KNX bus.</p>
847
+
848
+ **General**
849
+ |Property|Description|
850
+ |--|--|
851
+ | KNX GW | Select the KNX gateway to be used |
852
+ | HUE Bridge | Select the HUE Bridge to be used |
853
+ | Name | HUE light or HUE grouped light to be used. The avaiable lights and groups start showing up while you're typing.|
854
+
855
+ <br/>
856
+
857
+ **OPTIONS**
858
+
859
+ Here you can choose the KNX addresses to be linked to the avaiable HUE light commands/states.<br/>
860
+ 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.
861
+
862
+ **Switching**
863
+ |Property|Description|
864
+ |--|--|
865
+ | Control | This GA is used to turn on/off the HUE light via a boolean KNX value true/false|
866
+ | Status | Link this to the light's switch status group address|
867
+
868
+ <br/>
869
+
870
+ **Dim/Brightness**
871
+ |Property|Description|
872
+ |--|--|
873
+ | Control | Relative DIM the HUE light. You can set the dimming speed in the **_Behaviour_** tab. |
874
+ | Control % | Changes the absolute HUE light's brightness (0-100%)|
875
+ | Status| Link this to the light's brightness status group address |
876
+
877
+ <br/>
878
+
879
+ **Tunable white**
880
+ |Property|Description|
881
+ |--|--|
882
+ | Control| Changes the HUE light's white temperature, using DPT 3.007 dimming. You can set the dimming speed in the **_Behaviour_** tab.|
883
+ | Control % | Changes the HUE light's white temperature, using the DPT 5.001. A value of 0 is full warm, a value of 100 is full cold.|
884
+ | Status | Link this to the light temperature status group address. Datapoint is 5.001 absolute value. 0 is full warm, 100 is full cold.|
885
+
886
+ <br/>
887
+
888
+ **Colors**
889
+ |Property|Description|
890
+ |--|--|
891
+ | Control | 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 |
892
+ | Status | Link this to the light's color status group address. Accepted datapoint is RGB triplet (r,g,b)|
893
+
894
+ <br/>
895
+
896
+ **Effects**
897
+ |Property|Description|
898
+ |--|--|
899
+ | Blink | _true_ Blink the light, _false_ Stop blinking. Blinks the light on and off. Useful for signalling. Works with all HUE lights. |
900
+ | Color Cycle | _true_ start cycle, _false_ Stop cycle. Randomly changes the HUE light's color at regular interval. Works with all HUE lights having color capabilities. The color effect will start 10 seconds after set. |
901
+
902
+ <br/>
903
+
904
+ **Behaviour**
905
+
906
+ | Property | Description |
907
+ | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
908
+ | KNX Brightness Status | Updates the KNX brightness group address whenever the HUE lamp is switched ON/OFF. The options are `When HUE light is Off, send 0% (Default KNX behaviour)` and `Leave as is (default HUE behaviour)` |
909
+ | Specify switch on brightness | It enables the brightness value to follow the on/off status of the light. If you change the HUE brightness value to 0% (from the HUE App), an "off" telegram is also sent to the KNX bus; if you set it other than 0%, an "on" telegram is also sent to the KNX bus. This is valid also vice-versa: if you change the brightness via KNX bus, the HUE on/off value is also sent to the lamp. If you set it to **No**, the previous HUE light brightness value is retained. Default value is **Yes**. |
910
+ | Switch On - color/brightness | You can choose the color/brightness of your light, at switch on. Set it as JSON object, for example **{ "red": 255, "green": 255, "blue": 255 }** |
911
+ | Night Lighting | It allows to set a particular light color/brightness at nighttime. If **checked**, a further set of option shows up and the light changes the behaviour based on these options, everytime you switch the light _on_. |
912
+ | Switch On - color/brightness at Nighttime | You can choose the color/brightness of your light, at switch on, on night time. Set it as JSON object. Default value if you leave blank is **{ "red": 100, "green": 0, "blue": 0 }** |
913
+ | Day/Night | Select the group address used to set the day/night behaviour. The group address value is _true_ if daytime, _false_ if nighttime. |
914
+ | Invert day/night values | Invert the values of _Day/Night_ group address. Default value is **unchecked**. |
915
+ | Dim Speed (ms) | The dimming speed, in Milliseconds. This applies to the **light** and also to the **tunable white** dimming datapoints. It' calculated from 0% to 100%. |
916
+ | Min Dim brightness | Tha Minimum brightness that the lamp can reach. For example, if you are dimming the light down, the light will stop dimming at the specified brightness %. |
917
+ | Max Dim brightness | Tha Maximum brightness that the lamp can reach. For example, if you are dimming the light up, the light will stop dimming at the specified brightness %. |
918
+
919
+ ### Note
920
+
921
+ The Dimming function works in **KNX mode `start` and `stop`**. To start dimming, send only one "start" KNX telegram. To stop dimming, send a "stop" KNX telegram. Please **remember that**, when you set your wall swiches properties.
922
+
923
+ <br/>
924
+
925
+ [Find it useful?](https://www.paypal.me/techtoday)
926
+
927
+ <br/>
919
928
  </script>