node-red-contrib-homekit-bridged 1.7.0-dev.0 → 1.7.0-dev.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +1 -1
  2. package/build/lib/HAPHostNode.js +21 -10
  3. package/build/lib/HAPServiceNode.js +4 -2
  4. package/build/lib/HAPServiceNode2.js +4 -2
  5. package/build/lib/api.js +12 -11
  6. package/build/lib/hap/HAPCharacteristic.d.ts +9 -0
  7. package/build/lib/hap/HAPCharacteristic.js +6 -0
  8. package/build/lib/hap/HAPService.d.ts +6 -0
  9. package/build/lib/hap/HAPService.js +6 -0
  10. package/build/lib/hap/eve-app/EveCharacteristics.d.ts +20 -0
  11. package/build/lib/hap/eve-app/EveCharacteristics.js +89 -0
  12. package/build/lib/hap/eve-app/EveServices.d.ts +5 -0
  13. package/build/lib/hap/eve-app/EveServices.js +20 -0
  14. package/build/lib/types/HAPHostConfigType.d.ts +3 -1
  15. package/build/lib/types/HAPHostNodeType.d.ts +2 -3
  16. package/build/lib/types/HAPService2ConfigType.d.ts +3 -20
  17. package/build/lib/types/HAPService2NodeType.d.ts +1 -30
  18. package/build/lib/types/HAPServiceConfigType.d.ts +4 -0
  19. package/build/lib/types/HAPServiceNodeType.d.ts +2 -1
  20. package/build/lib/types/PublishTimersType.d.ts +0 -1
  21. package/build/lib/types/hap-nodejs/BonjourMulticastOptions.d.ts +10 -0
  22. package/build/lib/types/hap-nodejs/BonjourMulticastOptions.js +2 -0
  23. package/build/lib/types/hap-nodejs/HapAdaptiveLightingControllerMode.d.ts +5 -0
  24. package/build/lib/types/hap-nodejs/HapAdaptiveLightingControllerMode.js +8 -0
  25. package/build/lib/utils/NodeStatusUtils.d.ts +0 -1
  26. package/build/lib/utils/ServiceUtils.js +101 -12
  27. package/build/lib/utils/ServiceUtils2.js +17 -7
  28. package/build/nodes/bridge.html +87 -18
  29. package/build/nodes/nrchkb.html +148 -117
  30. package/build/nodes/service.html +41 -1
  31. package/build/nodes/service2.html +41 -1
  32. package/build/nodes/standalone.html +93 -24
  33. package/package.json +12 -12
  34. /package/build/lib/types/{HapCategories.d.ts → hap-nodejs/HapCategories.d.ts} +0 -0
  35. /package/build/lib/types/{HapCategories.js → hap-nodejs/HapCategories.js} +0 -0
@@ -7,6 +7,7 @@
7
7
  border-radius: .25rem;
8
8
  margin-right: 60px;
9
9
  }
10
+
10
11
  .alert-warning {
11
12
  color: #856404;
12
13
  background-color: #fff3cd;
@@ -56,55 +57,55 @@
56
57
 
57
58
  $('#node-input-customCharacteristics-container').css('min-height', '150px').css('min-width', '550px').editableList({
58
59
  addItem: function (container, i, opt) {
59
- $(".properties-accordion").accordion("option", "active", false);
60
+ $('.properties-accordion').accordion('option', 'active', false)
60
61
 
61
62
  const {name, UUID, ...props} = opt
62
63
 
63
64
  container.css({
64
65
  overflow: 'hidden',
65
66
  whiteSpace: 'nowrap'
66
- });
67
+ })
67
68
 
68
- const fragment = document.createDocumentFragment();
69
- const row1 = $('<div/>', {style: "display:flex; align-items: center;"}).appendTo(fragment);
70
- const row2 = $('<div/>', {style: "display:flex; margin-top:8px; align-items: center;"}).appendTo(fragment);
71
- const row3 = $('<div/>', {style: "margin-top:8px; align-items: center;"}).appendTo(fragment);
69
+ const fragment = document.createDocumentFragment()
70
+ const row1 = $('<div/>', {style: 'display:flex; align-items: center;'}).appendTo(fragment)
71
+ const row2 = $('<div/>', {style: 'display:flex; margin-top:8px; align-items: center;'}).appendTo(fragment)
72
+ const row3 = $('<div/>', {style: 'margin-top:8px; align-items: center;'}).appendTo(fragment)
72
73
 
73
74
  $('<div/>', {
74
- style: "display:inline-block;text-align:left; width:120px; padding-left:10px; box-sizing:border-box;",
75
- required: "required"
75
+ style: 'display:inline-block;text-align:left; width:120px; padding-left:10px; box-sizing:border-box;',
76
+ required: 'required'
76
77
  })
77
78
  .text('UUID ')
78
- .appendTo(row1);
79
- $('<input/>', {class: "property-uuid", type: "text"})
79
+ .appendTo(row1)
80
+ $('<input/>', {class: 'property-uuid', type: 'text'})
80
81
  .val(UUID ? UUID : uuidv4)
81
82
  .appendTo(row1)
82
83
 
83
84
  $('<div/>', {
84
- style: "display:inline-block;text-align:left; width:120px; padding-left:10px; box-sizing:border-box;",
85
- required: "required"
85
+ style: 'display:inline-block;text-align:left; width:120px; padding-left:10px; box-sizing:border-box;',
86
+ required: 'required'
86
87
  })
87
88
  .text('Name ')
88
- .appendTo(row2);
89
- $('<input/>', {class: "property-name", type: "text"})
89
+ .appendTo(row2)
90
+ $('<input/>', {class: 'property-name', type: 'text'})
90
91
  .val(name)
91
92
  .appendTo(row2)
92
93
 
93
- const row3_properties_accordion = $('<div/>', {class: "properties-accordion"})
94
- .appendTo(row3);
94
+ const row3_properties_accordion = $('<div/>', {class: 'properties-accordion'})
95
+ .appendTo(row3)
95
96
 
96
- $('<h3/>').text('Properties').appendTo(row3_properties_accordion);
97
+ $('<h3/>').text('Properties').appendTo(row3_properties_accordion)
97
98
 
98
- const row3_properties = $('<div/>', {class: "properties"}).appendTo(row3_properties_accordion);
99
+ const row3_properties = $('<div/>', {class: 'properties'}).appendTo(row3_properties_accordion)
99
100
 
100
- const formatRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
101
+ const formatRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
101
102
  $('<label/>', {
102
- class: "form-row",
103
- htmlFor: "property-format"
104
- }).text('Format *').appendTo(formatRow);
103
+ class: 'form-row',
104
+ htmlFor: 'property-format'
105
+ }).text('Format *').appendTo(formatRow)
105
106
  const formatInput = $('<select/>', {
106
- class: "property-format",
107
- required: "required"
107
+ class: 'property-format',
108
+ required: 'required'
108
109
  }).appendTo(formatRow)
109
110
  $('<option/>').val(undefined).text('Choose...').appendTo(formatInput)
110
111
  $('<option/>').val('bool').text('BOOL').appendTo(formatInput)
@@ -121,9 +122,9 @@
121
122
  $('<option/>').val('dict').text('DICTIONARY').appendTo(formatInput)
122
123
  formatInput.val(props.format)
123
124
 
124
- const unitRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
125
- $('<label/>', {class: "form-row", htmlFor: "property-unit"}).text('Unit').appendTo(unitRow)
126
- const unitSelect = $('<select/>', {class: "property-unit"}).appendTo(unitRow)
125
+ const unitRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
126
+ $('<label/>', {class: 'form-row', htmlFor: 'property-unit'}).text('Unit').appendTo(unitRow)
127
+ const unitSelect = $('<select/>', {class: 'property-unit'}).appendTo(unitRow)
127
128
  $('<option/>').val(undefined).text('Choose...').appendTo(unitSelect)
128
129
  $('<option/>').val('celsius').text('CELSIUS').appendTo(unitSelect)
129
130
  $('<option/>').val('percentage').text('PERCENTAGE').appendTo(unitSelect)
@@ -132,14 +133,14 @@
132
133
  $('<option/>').val('seconds').text('SECONDS').appendTo(unitSelect)
133
134
  unitSelect.val(props.unit)
134
135
 
135
- const permsRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
136
+ const permsRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
136
137
  $('<label/>', {
137
- class: "form-row",
138
- htmlFor: "property-perms"
138
+ class: 'form-row',
139
+ htmlFor: 'property-perms'
139
140
  }).text('Permissions').appendTo(permsRow)
140
141
  const permsSelect = $('<select/>', {
141
- class: "property-perms",
142
- multiple: "multiple"
142
+ class: 'property-perms',
143
+ multiple: 'multiple'
143
144
  }).appendTo(permsRow)
144
145
  $('<option/>').val('pr').text('PAIRED_READ / READ').appendTo(permsSelect)
145
146
  $('<option/>').val('pw').text('PAIRED_WRITE / WRITE').appendTo(permsSelect)
@@ -150,94 +151,94 @@
150
151
  $('<option/>').val('wr').text('WRITE_RESPONSE').appendTo(permsSelect)
151
152
  permsSelect.val(props.perms)
152
153
 
153
- const evRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
154
+ const evRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
154
155
  $('<label/>', {
155
- class: "form-row",
156
- htmlFor: "property-ev"
156
+ class: 'form-row',
157
+ htmlFor: 'property-ev'
157
158
  }).text('Event Notifications').appendTo(evRow)
158
159
  $('<input/>', {
159
- class: "property-ev",
160
- type: "checkbox",
160
+ class: 'property-ev',
161
+ type: 'checkbox',
161
162
  checked: props.ev
162
163
  }).appendTo(evRow)
163
164
 
164
- const descriptionRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
165
+ const descriptionRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
165
166
  $('<label/>', {
166
- class: "form-row",
167
- htmlFor: "property-description"
167
+ class: 'form-row',
168
+ htmlFor: 'property-description'
168
169
  }).text('Description').appendTo(descriptionRow)
169
170
  $('<input/>', {
170
- class: "property-description",
171
+ class: 'property-description',
171
172
  type: 'text'
172
173
  }).appendTo(descriptionRow).val(props.description)
173
174
 
174
- const minValueRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
175
+ const minValueRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
175
176
  $('<label/>', {
176
- class: "form-row",
177
- htmlFor: "property-minValue"
177
+ class: 'form-row',
178
+ htmlFor: 'property-minValue'
178
179
  }).text('Minimum Value').appendTo(minValueRow)
179
180
  $('<input/>', {
180
- class: "property-minValue",
181
+ class: 'property-minValue',
181
182
  type: 'number'
182
183
  }).appendTo(minValueRow).val(props.minValue)
183
184
 
184
- const maxValueRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
185
+ const maxValueRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
185
186
  $('<label/>', {
186
- class: "form-row",
187
- htmlFor: "property-maxValue"
187
+ class: 'form-row',
188
+ htmlFor: 'property-maxValue'
188
189
  }).text('Maximum Value').appendTo(maxValueRow)
189
190
  $('<input/>', {
190
- class: "property-maxValue",
191
+ class: 'property-maxValue',
191
192
  type: 'number'
192
193
  }).appendTo(maxValueRow).val(props.maxValue)
193
194
 
194
- const minStepRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
195
+ const minStepRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
195
196
  $('<label/>', {
196
- class: "form-row",
197
- htmlFor: "property-minStep"
197
+ class: 'form-row',
198
+ htmlFor: 'property-minStep'
198
199
  }).text('Minimum Step').appendTo(minStepRow)
199
200
  $('<input/>', {
200
- class: "property-minStep",
201
+ class: 'property-minStep',
201
202
  type: 'number'
202
203
  }).appendTo(minStepRow).val(props.minStep)
203
204
 
204
- const maxLenRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
205
+ const maxLenRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
205
206
  $('<label/>', {
206
- class: "form-row",
207
- htmlFor: "property-maxLen"
207
+ class: 'form-row',
208
+ htmlFor: 'property-maxLen'
208
209
  }).text('Maximum Length').appendTo(maxLenRow)
209
210
  $('<input/>', {
210
- class: "property-maxLen",
211
+ class: 'property-maxLen',
211
212
  type: 'number'
212
213
  }).appendTo(maxLenRow).val(props.maxLen)
213
214
 
214
- const maxDataLenRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
215
+ const maxDataLenRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
215
216
  $('<label/>', {
216
- class: "form-row",
217
- htmlFor: "property-maxDataLen"
217
+ class: 'form-row',
218
+ htmlFor: 'property-maxDataLen'
218
219
  }).text('Maximum Data Length').appendTo(maxDataLenRow)
219
220
  $('<input/>', {
220
- class: "property-maxDataLen",
221
+ class: 'property-maxDataLen',
221
222
  type: 'number'
222
223
  }).appendTo(maxDataLenRow).val(props.maxDataLen)
223
224
 
224
- const validValuesRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
225
+ const validValuesRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
225
226
  $('<label/>', {
226
- class: "form-row",
227
- htmlFor: "property-validValues"
227
+ class: 'form-row',
228
+ htmlFor: 'property-validValues'
228
229
  }).text('Valid Values').appendTo(validValuesRow)
229
230
  $('<input/>', {
230
- class: "property-validValues",
231
+ class: 'property-validValues',
231
232
  type: 'text'
232
233
  }).appendTo(validValuesRow).val(props.validValues)
233
234
 
234
- const validValueRangesRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
235
+ const validValueRangesRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
235
236
  const validValueRangesLabel = $('<label/>', {
236
- class: "form-row property-validValueRanges-label",
237
- htmlFor: "property-validValueRanges"
237
+ class: 'form-row property-validValueRanges-label',
238
+ htmlFor: 'property-validValueRanges'
238
239
  }).text('Valid Value Ranges: ').appendTo(validValueRangesRow)
239
240
  const validValueRangesSlider = $('<div/>', {
240
- class: "property-validValueRanges",
241
+ class: 'property-validValueRanges',
241
242
  type: 'text'
242
243
  }).appendTo(validValueRangesRow)
243
244
 
@@ -247,19 +248,19 @@
247
248
  max: 500,
248
249
  values: props.validValueRanges,
249
250
  slide: function (event, ui) {
250
- validValueRangesLabel.text("Valid Value Ranges: [" + ui.values[0] + ", " + ui.values[1] + "]");
251
+ validValueRangesLabel.text('Valid Value Ranges: [' + ui.values[0] + ', ' + ui.values[1] + ']')
251
252
  }
252
- });
253
- validValueRangesLabel.text("Valid Value Ranges: [" + validValueRangesSlider.slider("values", 0) + ", " + validValueRangesSlider.slider("values", 1) + "]");
253
+ })
254
+ validValueRangesLabel.text('Valid Value Ranges: [' + validValueRangesSlider.slider('values', 0) + ', ' + validValueRangesSlider.slider('values', 1) + ']')
254
255
 
255
- const adminOnlyAccessRow = $('<div/>', {class: "form-row"}).appendTo(row3_properties);
256
+ const adminOnlyAccessRow = $('<div/>', {class: 'form-row'}).appendTo(row3_properties)
256
257
  $('<label/>', {
257
- class: "form-row",
258
- htmlFor: "property-adminOnlyAccess"
258
+ class: 'form-row',
259
+ htmlFor: 'property-adminOnlyAccess'
259
260
  }).text('Admin Only Access').appendTo(adminOnlyAccessRow)
260
261
  const adminOnlyAccessSelect = $('<select/>', {
261
- class: "property-adminOnlyAccess",
262
- multiple: "multiple"
262
+ class: 'property-adminOnlyAccess',
263
+ multiple: 'multiple'
263
264
  }).appendTo(adminOnlyAccessRow)
264
265
  $('<option/>').val(0).text('READ').appendTo(adminOnlyAccessSelect)
265
266
  $('<option/>').val(1).text('WRITE').appendTo(adminOnlyAccessSelect)
@@ -269,30 +270,30 @@
269
270
  row3_properties_accordion.accordion({
270
271
  collapsible: true,
271
272
  active: 'UUID' in opt ? false : 0,
272
- heightStyle: "content"
273
- });
273
+ heightStyle: 'content'
274
+ })
274
275
 
275
- container[0].appendChild(fragment);
276
+ container[0].appendChild(fragment)
276
277
  },
277
278
  removable: true,
278
279
  sortable: true
279
- });
280
+ })
280
281
 
281
282
  for (let i = 0; i < config.customCharacteristics.length; i++) {
282
- const customCharacteristic = config.customCharacteristics[i];
283
- $("#node-input-customCharacteristics-container").editableList('addItem', customCharacteristic);
283
+ const customCharacteristic = config.customCharacteristics[i]
284
+ $('#node-input-customCharacteristics-container').editableList('addItem', customCharacteristic)
284
285
  }
285
286
  },
286
287
  oneditresize: function (size) {
287
- const rows = $("#dialog-form>div:not(.node-input-customCharacteristics-container-row)");
288
- let height = size.height;
288
+ const rows = $('#dialog-form>div:not(.node-input-customCharacteristics-container-row)')
289
+ let height = size.height
289
290
  for (let i = 0; i < rows.length; i++) {
290
- height -= $(rows[i]).outerHeight(true);
291
+ height -= $(rows[i]).outerHeight(true)
291
292
  }
292
- const editorRow = $("#dialog-form>div.node-input-customCharacteristics-container-row");
293
- height -= (parseInt(editorRow.css("marginTop")) + parseInt(editorRow.css("marginBottom")));
294
- height += 16;
295
- $("#node-input-customCharacteristics-container").editableList('height', height);
293
+ const editorRow = $('#dialog-form>div.node-input-customCharacteristics-container-row')
294
+ height -= (parseInt(editorRow.css('marginTop')) + parseInt(editorRow.css('marginBottom')))
295
+ height += 16
296
+ $('#node-input-customCharacteristics-container').editableList('height', height)
296
297
  }
297
298
  })
298
299
  }
@@ -352,27 +353,27 @@
352
353
 
353
354
  const saveCustomCharacteristics = function (self) {
354
355
  const customCharacteristics = []
355
- const items = $("#node-input-customCharacteristics-container").editableList('items');
356
+ const items = $('#node-input-customCharacteristics-container').editableList('items')
356
357
 
357
358
  items.each(function () {
358
- const item = $(this);
359
- const name = item.find(".property-name").val();
360
- const UUID = item.find(".property-uuid").val();
361
- const format = item.find(".property-format").val();
362
- const unit = item.find(".property-unit").val();
363
- const perms = item.find(".property-perms").val();
364
- const ev = item.find(".property-ev").prop('checked');
365
- const description = item.find(".property-description").val();
366
- const minValue = item.find(".property-minValue").val();
367
- const maxValue = item.find(".property-maxValue").val();
368
- const minStep = item.find(".property-minStep").val();
369
- const maxLen = item.find(".property-maxLen").val();
370
- const maxDataLen = item.find(".property-maxDataLen").val();
371
- const validValues = item.find(".property-validValues").val();
372
- const validValueRangesMin = item.find(".property-validValueRanges").slider("values", 0);
373
- const validValueRangesMax = item.find(".property-validValueRanges").slider("values", 1);
359
+ const item = $(this)
360
+ const name = item.find('.property-name').val()
361
+ const UUID = item.find('.property-uuid').val()
362
+ const format = item.find('.property-format').val()
363
+ const unit = item.find('.property-unit').val()
364
+ const perms = item.find('.property-perms').val()
365
+ const ev = item.find('.property-ev').prop('checked')
366
+ const description = item.find('.property-description').val()
367
+ const minValue = item.find('.property-minValue').val()
368
+ const maxValue = item.find('.property-maxValue').val()
369
+ const minStep = item.find('.property-minStep').val()
370
+ const maxLen = item.find('.property-maxLen').val()
371
+ const maxDataLen = item.find('.property-maxDataLen').val()
372
+ const validValues = item.find('.property-validValues').val()
373
+ const validValueRangesMin = item.find('.property-validValueRanges').slider('values', 0)
374
+ const validValueRangesMax = item.find('.property-validValueRanges').slider('values', 1)
374
375
  const validValueRanges = validValueRangesMin && validValueRangesMax ? [validValueRangesMin, validValueRangesMax] : undefined
375
- const adminOnlyAccess = item.find(".property-adminOnlyAccess").val();
376
+ const adminOnlyAccess = item.find('.property-adminOnlyAccess').val()
376
377
  customCharacteristics.push({
377
378
  name,
378
379
  UUID,
@@ -389,8 +390,8 @@
389
390
  validValues,
390
391
  validValueRanges,
391
392
  adminOnlyAccess
392
- });
393
- });
393
+ })
394
+ })
394
395
 
395
396
  config.customCharacteristics = customCharacteristics
396
397
 
@@ -399,27 +400,57 @@
399
400
  url: 'nrchkb/config',
400
401
  dataType: 'json',
401
402
  data: {customCharacteristics}
402
- });
403
+ })
403
404
  }
404
405
 
405
406
  const uuidv4 = function () {
406
407
  return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
407
408
  (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
408
- );
409
+ )
409
410
  }
410
411
 
411
412
  const getRandomIntInclusive = function (min, max) {
412
- min = Math.ceil(min);
413
- max = Math.floor(max);
414
- return Math.floor(Math.random() * (max - min + 1) + min);
413
+ min = Math.ceil(min)
414
+ max = Math.floor(max)
415
+ return Math.floor(Math.random() * (max - min + 1) + min)
415
416
  }
416
417
 
418
+ const forbiddenPinCodes = [
419
+ '00000000',
420
+ '11111111',
421
+ '22222222',
422
+ '33333333',
423
+ '44444444',
424
+ '55555555',
425
+ '66666666',
426
+ '77777777',
427
+ '88888888',
428
+ '99999999',
429
+ '12345678',
430
+ '87654321'
431
+ ]
432
+
417
433
  const generatePinCode = function () {
418
- const [a, b, c, d, e, f, g, h] = Array.from({length: 9}, () => getRandomIntInclusive(0, 9));
434
+ const [a, b, c, d, e, f, g, h] = Array.from({length: 9}, () => getRandomIntInclusive(0, 9))
435
+
436
+ if (forbiddenPinCodes.includes(`${a}${b}${c}${d}${e}${f}${g}${h}`)) {
437
+ return generatePinCode()
438
+ }
439
+
419
440
  return `${a}${b}${c}${d}-${e}${f}${g}${h}`
420
441
  }
421
442
 
422
- const pinCodeRegex = RED.validators.regex(/([0-9]{3}-[0-9]{2}-[0-9]{3}|[0-9]{4}-[0-9]{4})/)
443
+ const validatePinCode = function (value) {
444
+ if (!value) {
445
+ return false
446
+ }
447
+
448
+ if (!RED.validators.regex(/([0-9]{3}-[0-9]{2}-[0-9]{3}|[0-9]{4}-[0-9]{4})/)(value)) {
449
+ return false
450
+ }
451
+
452
+ return !forbiddenPinCodes.includes(value.replaceAll('-', ''))
453
+ }
423
454
  </script>
424
455
 
425
456
  <script data-template-name="nrchkb" type="text/x-red">
@@ -194,6 +194,26 @@
194
194
  </div>
195
195
  </div>
196
196
 
197
+ <div id="adaptive-lightning-configuration" style="display: none; border: 1px solid var(--red-ui-secondary-border-color); padding: 12px 12px 0 12px; margin-bottom: 12px;">
198
+ <label>&nbsp;&nbsp;<i class="fa fa-cog"></i> Adaptive Lightning Configuration</label>
199
+ <div class="form-row">
200
+ <label for="node-input-adaptiveLightingOptionsEnable"><i class="fa fa-toggle-on"></i> Enable</label>
201
+ <input type="checkbox" id="node-input-adaptiveLightingOptionsEnable">
202
+ </div>
203
+ <div class="form-row">
204
+ <label for="node-input-adaptiveLightingOptionsMode"><i class="fa fa-hand-o-up"></i> Mode</label>
205
+ <select id="node-input-adaptiveLightingOptionsMode">
206
+ <option value="" selected hidden disabled>AUTOMATIC</option>
207
+ <option value="1">AUTOMATIC</option>
208
+ <option value="2">MANUAL</option>
209
+ </select>
210
+ </div>
211
+ <div class="form-row">
212
+ <label for="node-input-adaptiveLightingOptionsCustomTemperatureAdjustment"><i class="fa fa-thermometer-quarter"></i> Custom Temperature Adjustment</label>
213
+ <input type="number" id="node-input-adaptiveLightingOptionsCustomTemperatureAdjustment" placeholder="0">
214
+ </div>
215
+ </div>
216
+
197
217
  <div class="form-row">
198
218
  <label for="node-input-characteristicProperties"><i class="fa fa-wrench"></i> Characteristic Properties</label>
199
219
  <input type="text" id="node-input-characteristicProperties" style="width: 70%">
@@ -474,7 +494,16 @@
474
494
  },
475
495
  outputs: {
476
496
  value: 2,
477
- }
497
+ },
498
+ adaptiveLightingOptionsEnable: {
499
+ value: false,
500
+ },
501
+ adaptiveLightingOptionsMode: {
502
+ validate: RED.validators.number(true)
503
+ },
504
+ adaptiveLightingOptionsCustomTemperatureAdjustment: {
505
+ validate: RED.validators.number(true)
506
+ },
478
507
  },
479
508
  inputs: 1,
480
509
  outputs: 2,
@@ -581,6 +610,7 @@
581
610
  })
582
611
 
583
612
  let cameraConfiguration = $('#camera-configuration')
613
+ let adaptiveLightningConfiguration = $('#adaptive-lightning-configuration')
584
614
 
585
615
  selectServiceName
586
616
  .find('option')
@@ -601,6 +631,16 @@
601
631
  })
602
632
  .change()
603
633
 
634
+ selectServiceName
635
+ .change(function () {
636
+ if (this.value === 'Lightbulb') {
637
+ adaptiveLightningConfiguration.fadeIn('fast')
638
+ } else {
639
+ adaptiveLightningConfiguration.fadeOut('fast')
640
+ }
641
+ })
642
+ .change()
643
+
604
644
  $('#node-input-characteristicProperties').typedInput({
605
645
  type: 'json',
606
646
  types: ['json'],
@@ -194,6 +194,26 @@
194
194
  </div>
195
195
  </div>
196
196
 
197
+ <div id="adaptive-lightning-configuration" style="display: none; border: 1px solid var(--red-ui-secondary-border-color); padding: 12px 12px 0 12px; margin-bottom: 12px;">
198
+ <label>&nbsp;&nbsp;<i class="fa fa-cog"></i> Adaptive Lightning Configuration</label>
199
+ <div class="form-row">
200
+ <label for="node-input-adaptiveLightingOptionsEnable"><i class="fa fa-toggle-on"></i> Enable</label>
201
+ <input type="checkbox" id="node-input-adaptiveLightingOptionsEnable">
202
+ </div>
203
+ <div class="form-row">
204
+ <label for="node-input-adaptiveLightingOptionsMode"><i class="fa fa-hand-o-up"></i> Mode</label>
205
+ <select id="node-input-adaptiveLightingOptionsMode">
206
+ <option value="" selected hidden disabled>AUTOMATIC</option>
207
+ <option value="1">AUTOMATIC</option>
208
+ <option value="2">MANUAL</option>
209
+ </select>
210
+ </div>
211
+ <div class="form-row">
212
+ <label for="node-input-adaptiveLightingOptionsCustomTemperatureAdjustment"><i class="fa fa-thermometer-quarter"></i> Custom Temperature Adjustment</label>
213
+ <input type="number" id="node-input-adaptiveLightingOptionsCustomTemperatureAdjustment" placeholder="0">
214
+ </div>
215
+ </div>
216
+
197
217
  <div class="form-row">
198
218
  <label for="node-input-characteristicProperties"><i class="fa fa-wrench"></i> Characteristic Properties</label>
199
219
  <input type="text" id="node-input-characteristicProperties" style="width: 70%">
@@ -484,7 +504,16 @@ if (nrchkbExperimental) {
484
504
  },
485
505
  outputs: {
486
506
  value: 1,
487
- }
507
+ },
508
+ adaptiveLightingOptionsEnable: {
509
+ value: false,
510
+ },
511
+ adaptiveLightingOptionsMode: {
512
+ validate: RED.validators.number(true)
513
+ },
514
+ adaptiveLightingOptionsCustomTemperatureAdjustment: {
515
+ validate: RED.validators.number(true)
516
+ },
488
517
  },
489
518
  inputs: 1,
490
519
  outputs: 1,
@@ -583,6 +612,7 @@ if (nrchkbExperimental) {
583
612
  })
584
613
 
585
614
  let cameraConfiguration = $('#camera-configuration')
615
+ let adaptiveLightningConfiguration = $('#adaptive-lightning-configuration')
586
616
 
587
617
  selectServiceName
588
618
  .find('option')
@@ -603,6 +633,16 @@ if (nrchkbExperimental) {
603
633
  })
604
634
  .change()
605
635
 
636
+ selectServiceName
637
+ .change(function () {
638
+ if (this.value === 'Lightbulb') {
639
+ adaptiveLightningConfiguration.fadeIn('fast')
640
+ } else {
641
+ adaptiveLightningConfiguration.fadeOut('fast')
642
+ }
643
+ })
644
+ .change()
645
+
606
646
  $('#node-input-characteristicProperties').typedInput({
607
647
  type: 'json',
608
648
  types: ['json'],