node-red-contrib-knx-ultimate 6.2.2 → 6.2.3-beta.0

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 (141) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/nodes/knxUltimateAI.js +7 -1
  3. package/nodes/knxUltimateHueAreaMotion.html +15 -4
  4. package/nodes/knxUltimateHueBattery.html +15 -4
  5. package/nodes/knxUltimateHueButton.html +15 -4
  6. package/nodes/knxUltimateHueCameraMotion.html +15 -4
  7. package/nodes/knxUltimateHueContactSensor.html +15 -4
  8. package/nodes/knxUltimateHueController.html +1386 -0
  9. package/nodes/knxUltimateHueController.js +28 -0
  10. package/nodes/knxUltimateHueHumiditySensor.html +15 -4
  11. package/nodes/knxUltimateHueLight.html +15 -4
  12. package/nodes/knxUltimateHueLightSensor.html +15 -4
  13. package/nodes/knxUltimateHueMotion.html +15 -4
  14. package/nodes/knxUltimateHuePlug.html +15 -4
  15. package/nodes/knxUltimateHueScene.html +18 -7
  16. package/nodes/knxUltimateHueTapDial.html +15 -4
  17. package/nodes/knxUltimateHueTemperatureSensor.html +15 -4
  18. package/nodes/knxUltimateHueZigbeeConnectivity.html +15 -4
  19. package/nodes/knxUltimateHuedevice_software_update.html +15 -4
  20. package/nodes/locales/de/knxUltimateHueAreaMotion.html +1 -1
  21. package/nodes/locales/de/knxUltimateHueBattery.html +1 -0
  22. package/nodes/locales/de/knxUltimateHueButton.html +1 -0
  23. package/nodes/locales/de/knxUltimateHueCameraMotion.html +1 -0
  24. package/nodes/locales/de/knxUltimateHueContactSensor.html +1 -0
  25. package/nodes/locales/de/knxUltimateHueController.html +669 -0
  26. package/nodes/locales/de/knxUltimateHueController.json +48 -0
  27. package/nodes/locales/de/knxUltimateHueHumiditySensor.html +1 -0
  28. package/nodes/locales/de/knxUltimateHueLight.html +1 -0
  29. package/nodes/locales/de/knxUltimateHueLightSensor.html +1 -0
  30. package/nodes/locales/de/knxUltimateHueMotion.html +1 -0
  31. package/nodes/locales/de/knxUltimateHuePlug.html +1 -0
  32. package/nodes/locales/de/knxUltimateHueScene.html +1 -0
  33. package/nodes/locales/de/knxUltimateHueTapDial.html +1 -0
  34. package/nodes/locales/de/knxUltimateHueTemperatureSensor.html +1 -0
  35. package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.html +1 -0
  36. package/nodes/locales/de/knxUltimateHuedevice_software_update.html +1 -0
  37. package/nodes/locales/en/knxUltimateHueAreaMotion.html +1 -1
  38. package/nodes/locales/en/knxUltimateHueBattery.html +1 -0
  39. package/nodes/locales/en/knxUltimateHueButton.html +1 -0
  40. package/nodes/locales/en/knxUltimateHueCameraMotion.html +1 -0
  41. package/nodes/locales/en/knxUltimateHueContactSensor.html +1 -0
  42. package/nodes/locales/en/knxUltimateHueController.html +672 -0
  43. package/nodes/locales/en/knxUltimateHueController.json +48 -0
  44. package/nodes/locales/en/knxUltimateHueHumiditySensor.html +1 -0
  45. package/nodes/locales/en/knxUltimateHueLight.html +1 -0
  46. package/nodes/locales/en/knxUltimateHueLightSensor.html +1 -0
  47. package/nodes/locales/en/knxUltimateHueMotion.html +1 -0
  48. package/nodes/locales/en/knxUltimateHuePlug.html +1 -0
  49. package/nodes/locales/en/knxUltimateHueScene.html +1 -0
  50. package/nodes/locales/en/knxUltimateHueTapDial.html +1 -0
  51. package/nodes/locales/en/knxUltimateHueTemperatureSensor.html +1 -0
  52. package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.html +1 -0
  53. package/nodes/locales/en/knxUltimateHuedevice_software_update.html +1 -0
  54. package/nodes/locales/es/knxUltimateHueAreaMotion.html +1 -1
  55. package/nodes/locales/es/knxUltimateHueBattery.html +1 -0
  56. package/nodes/locales/es/knxUltimateHueButton.html +1 -0
  57. package/nodes/locales/es/knxUltimateHueCameraMotion.html +1 -0
  58. package/nodes/locales/es/knxUltimateHueContactSensor.html +1 -0
  59. package/nodes/locales/es/knxUltimateHueController.html +672 -0
  60. package/nodes/locales/es/knxUltimateHueController.json +48 -0
  61. package/nodes/locales/es/knxUltimateHueHumiditySensor.html +1 -0
  62. package/nodes/locales/es/knxUltimateHueLight.html +1 -0
  63. package/nodes/locales/es/knxUltimateHueLightSensor.html +1 -0
  64. package/nodes/locales/es/knxUltimateHueMotion.html +1 -0
  65. package/nodes/locales/es/knxUltimateHuePlug.html +1 -0
  66. package/nodes/locales/es/knxUltimateHueScene.html +1 -0
  67. package/nodes/locales/es/knxUltimateHueTapDial.html +1 -0
  68. package/nodes/locales/es/knxUltimateHueTemperatureSensor.html +1 -0
  69. package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.html +1 -0
  70. package/nodes/locales/es/knxUltimateHuedevice_software_update.html +1 -0
  71. package/nodes/locales/fr/knxUltimateHueAreaMotion.html +1 -1
  72. package/nodes/locales/fr/knxUltimateHueBattery.html +1 -0
  73. package/nodes/locales/fr/knxUltimateHueButton.html +1 -0
  74. package/nodes/locales/fr/knxUltimateHueCameraMotion.html +1 -0
  75. package/nodes/locales/fr/knxUltimateHueContactSensor.html +1 -0
  76. package/nodes/locales/fr/knxUltimateHueController.html +672 -0
  77. package/nodes/locales/fr/knxUltimateHueController.json +48 -0
  78. package/nodes/locales/fr/knxUltimateHueHumiditySensor.html +1 -0
  79. package/nodes/locales/fr/knxUltimateHueLight.html +1 -0
  80. package/nodes/locales/fr/knxUltimateHueLightSensor.html +1 -0
  81. package/nodes/locales/fr/knxUltimateHueMotion.html +1 -0
  82. package/nodes/locales/fr/knxUltimateHuePlug.html +1 -0
  83. package/nodes/locales/fr/knxUltimateHueScene.html +1 -0
  84. package/nodes/locales/fr/knxUltimateHueTapDial.html +1 -0
  85. package/nodes/locales/fr/knxUltimateHueTemperatureSensor.html +1 -0
  86. package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.html +1 -0
  87. package/nodes/locales/fr/knxUltimateHuedevice_software_update.html +1 -0
  88. package/nodes/locales/it/knxUltimateHueAreaMotion.html +1 -1
  89. package/nodes/locales/it/knxUltimateHueBattery.html +1 -0
  90. package/nodes/locales/it/knxUltimateHueButton.html +1 -0
  91. package/nodes/locales/it/knxUltimateHueCameraMotion.html +1 -0
  92. package/nodes/locales/it/knxUltimateHueContactSensor.html +1 -0
  93. package/nodes/locales/it/knxUltimateHueController.html +672 -0
  94. package/nodes/locales/it/knxUltimateHueController.json +48 -0
  95. package/nodes/locales/it/knxUltimateHueHumiditySensor.html +1 -0
  96. package/nodes/locales/it/knxUltimateHueLight.html +1 -0
  97. package/nodes/locales/it/knxUltimateHueLightSensor.html +1 -0
  98. package/nodes/locales/it/knxUltimateHueMotion.html +1 -0
  99. package/nodes/locales/it/knxUltimateHuePlug.html +1 -0
  100. package/nodes/locales/it/knxUltimateHueScene.html +1 -0
  101. package/nodes/locales/it/knxUltimateHueTapDial.html +1 -0
  102. package/nodes/locales/it/knxUltimateHueTemperatureSensor.html +1 -0
  103. package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.html +1 -0
  104. package/nodes/locales/it/knxUltimateHuedevice_software_update.html +1 -0
  105. package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.html +1 -1
  106. package/nodes/locales/zh-CN/knxUltimateHueBattery.html +1 -0
  107. package/nodes/locales/zh-CN/knxUltimateHueButton.html +1 -0
  108. package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.html +1 -0
  109. package/nodes/locales/zh-CN/knxUltimateHueContactSensor.html +1 -0
  110. package/nodes/locales/zh-CN/knxUltimateHueController.html +674 -0
  111. package/nodes/locales/zh-CN/knxUltimateHueController.json +48 -0
  112. package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.html +1 -0
  113. package/nodes/locales/zh-CN/knxUltimateHueLight.html +1 -0
  114. package/nodes/locales/zh-CN/knxUltimateHueLightSensor.html +1 -0
  115. package/nodes/locales/zh-CN/knxUltimateHueMotion.html +1 -0
  116. package/nodes/locales/zh-CN/knxUltimateHuePlug.html +1 -0
  117. package/nodes/locales/zh-CN/knxUltimateHueScene.html +1 -0
  118. package/nodes/locales/zh-CN/knxUltimateHueTapDial.html +1 -0
  119. package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.html +1 -0
  120. package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.html +1 -0
  121. package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.html +1 -0
  122. package/nodes/utils/hueControllerProfileAdapter.js +104 -0
  123. package/nodes/utils/hueControllerProfiles/runtime/area_motion.js +221 -0
  124. package/nodes/utils/hueControllerProfiles/runtime/button.js +295 -0
  125. package/nodes/utils/hueControllerProfiles/runtime/camera_motion.js +221 -0
  126. package/nodes/utils/hueControllerProfiles/runtime/contact.js +191 -0
  127. package/nodes/utils/hueControllerProfiles/runtime/device_power.js +185 -0
  128. package/nodes/utils/hueControllerProfiles/runtime/device_software_update.js +185 -0
  129. package/nodes/utils/hueControllerProfiles/runtime/humidity.js +204 -0
  130. package/nodes/utils/hueControllerProfiles/runtime/light.js +1583 -0
  131. package/nodes/utils/hueControllerProfiles/runtime/light_level.js +180 -0
  132. package/nodes/utils/hueControllerProfiles/runtime/motion.js +185 -0
  133. package/nodes/utils/hueControllerProfiles/runtime/plug.js +344 -0
  134. package/nodes/utils/hueControllerProfiles/runtime/relative_rotary.js +271 -0
  135. package/nodes/utils/hueControllerProfiles/runtime/scene.js +352 -0
  136. package/nodes/utils/hueControllerProfiles/runtime/temperature.js +187 -0
  137. package/nodes/utils/hueControllerProfiles/runtime/zigbee_connectivity.js +185 -0
  138. package/package.json +5 -2
  139. package/resources/hueControllerMigration.js +199 -0
  140. package/resources/hueControllerMigrationDialog.js +189 -0
  141. package/resources/hueControllerProfiles.js +9290 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 6.2.3-beta.0** - August 2026<br/>
10
+
11
+ - **HUE Controller — unified Hue API v2 node**: added one controller node covering the complete set of existing Hue functions: lights and grouped lights, plugs, buttons, Tap dial, motion and camera motion, contacts, light level, temperature, humidity, scenes, battery, Zigbee connectivity and device software update. The compact device-function selector uses one third of the available width and opens the established dedicated editor with its localized labels; KNX mapping fields are hidden whenever no **KNX Gateway** is selected, including `none`, an empty value and **Add new...**. The YouTube tutorial playlist now appears once at the top of the editor, while inline `form-tips` are removed from the unified UI and their useful guidance remains in the multilingual help. A local paste-in migration tool converts a complete exported flow from the dedicated HUE node types to HUE Controller without inspecting or changing the open flow, preserving IDs, configuration references, properties, positions, wires and dynamic pin counts in the copyable JSON output. Because Node-RED excludes credentials from flow exports, same-instance migration now omits the referenced Hue and KNX config-node definitions by default while retaining their IDs, so the imported controllers reuse the existing configurations and their stored credentials; an explicit option keeps config nodes for cross-instance migration with a warning to re-enter credentials. Copying the converted flow now uses the asynchronous browser Clipboard API with a real selected-textarea fallback and selects the visible output for manual copying if the browser blocks both paths. Each profile executes the same mature runtime contract, preserving KNX telegram types, Hue event/status direction, flow pins and loop protection. Runtime implementations, editor definitions, templates and all six translation catalogs are embedded as package-internal HUE Controller profiles; registration order no longer matters, the KNX and Hue gateway fields remain real config-node selectors, and the controller has no runtime or editor dependency on deprecated node types. The original Hue Light node remains unchanged. Existing dedicated Hue nodes remain fully compatible and registered, use Node-RED's special `deprecated` category so they no longer appear in the palette, retain the lighter `#E7E9F6` color and `(deprecated)` canvas suffix without changing saved names, and show a localized HUE Controller migration notice at the top of their editors.<br/>
12
+ - **HUE Controller — complete per-function help**: the established help of every dedicated Hue node is now incorporated under the corresponding HUE Controller function key, with an anchor index and automatic sidebar focus when the function changes. The same 15-section reference is included in the Controller wiki documentation in EN, IT, DE, FR, ES and zh-CN; legacy deprecation notices are deliberately excluded from the embedded copies.<br/>
13
+ - **HUE Controller — legacy-independent maintenance boundary**: private runtime profiles and the private editor/template/translation sources are now the canonical implementation of HUE Controller. Its generator and consistency check read only those private sources and never inspect the frozen legacy nodes, so future Controller fixes remain isolated and the dedicated deprecated nodes can eventually be removed without breaking either runtime or UI. Added detailed architecture and lifecycle comments around runtime constructor capture, RED facades, editor mounting, profile drafts, dynamic pins, translations and the Hue Light bootstrap path.<br/>
14
+ - **HUE Controller — consolidated documentation**: removed all dedicated legacy Hue nodes from the multilingual documentation home cards and HUE navigation, leaving only Hue Bridge configuration and HUE Controller. Reworked the Controller page in EN, IT, DE, FR, ES and zh-CN with a responsive visual overview, the complete 15-function capability map, common Controller behavior, a four-step setup path, optional-KNX guidance, migration details and the full per-function reference inherited from the former dedicated nodes.<br/>
15
+ - **HUE Controller — visible migration action**: highlighted the legacy-flow migration button with a high-contrast orange treatment, darker hover/active states and an accessible keyboard focus ring so it is immediately recognizable in light and dark Node-RED editor themes.<br/>
16
+ - **HUE Controller documentation routing**: added canonical Jekyll front matter and localized permalinks to every HUE Controller wiki page, fixing the GitHub Pages `404` and restoring correct links between EN, IT, DE, FR, ES and zh-CN.<br/>
17
+ - **Matter documentation visual refresh**: redesigned the Matter Controller, Matter Bridge configuration and Expose KNX to Matter wiki introductions in EN, IT, DE, FR, ES and zh-CN. The responsive visual overviews now surface the controller lifecycle, commissioning and backup workflow, persistent multi-fabric bridge identity, live endpoint reconciliation, the complete 17-profile device map and concise setup paths while retaining the established technical reference below.<br/>
18
+ - **HUE Controller — contextual migration action**: the highlighted legacy-flow migration button now appears in HUE Controller only when the Node-RED editor finds at least one registered legacy HUE node in the current flows, and the same orange action is available directly below the deprecation notice in every dedicated legacy HUE editor. All 15 legacy editors share one delegated dialog implementation and the canonical converter; the read-only Controller scan affects visibility only, while conversion remains isolated from editor state and processes exclusively the flow JSON pasted by the user.<br/>
19
+ - **HUE Controller — light capability discovery**: fixed single lights losing their Dim, Tunable White, RGB/HSV and native-effects KNX sections while the embedded Light editor was bootstrapping. Capability discovery now resolves the persisted Hue Bridge configuration instead of Node-RED's temporary `_ADD_` selector sentinel, so Hue API v2 `dimming`, `color_temperature`, `color` and `effects` capabilities enable the corresponding mappings correctly. The legacy Hue Light node remains unchanged.<br/>
20
+ - **HUE Controller — bounded Hue Bridge wait**: restored the Light editor's spinning-hourglass dialog while the selected Hue Bridge is still loading resources. Readiness is polled every 500 ms and the editor is always released after about 10 seconds with a localized error; Save, Cancel, Close and function changes cancel the timer. Removed the Controller wrapper overrides that had forced the wait icon hidden, and replaced the legacy global-`this` timer with strict-mode-safe private state. The legacy Hue Light node remains unchanged.<br/>
21
+ - **HUE Controller — compact KNX rows**: reduced the DPT selector to 90–105 px and the Name field to 70–115 px within Controller mapping rows, keeping GA, DPT and Name on one line instead of wrapping on narrower editor trays. Rows are identified from their strict DPT field IDs after the private profile is mounted, so the scoped layout applies consistently without changing any frozen legacy template or persisted value.<br/>
22
+
9
23
  **Version 6.2.2** - July 2026<br/>
10
24
 
11
25
  - Bump KNX Engine to 6.0.2<br/>
@@ -214,7 +214,12 @@ const buildKnxAiPackageNodeCatalog = () => {
214
214
  const inputsRaw = knxAiMatchAfter(objText, /\binputs\s*:\s*(\d+)/)
215
215
  const outputsRaw = knxAiMatchAfter(objText, /\boutputs\s*:\s*(\d+)/)
216
216
  let fields = {}
217
- const defIdx = objText.search(/\bdefaults\s*:\s*\{/)
217
+ let defIdx = objText.search(/\bdefaults\s*:\s*\{/)
218
+ // Profile-driven editors may compose their full Node-RED defaults from
219
+ // already registered node definitions. They can expose a compact static
220
+ // catalogDefaults block so the backend Flow Builder still discovers
221
+ // configuration references and essential persisted fields.
222
+ if (defIdx < 0) defIdx = objText.search(/\bcatalogDefaults\s*:\s*\{/)
218
223
  if (defIdx >= 0) {
219
224
  const braceIdx = objText.indexOf('{', defIdx)
220
225
  const defaultsBlock = knxAiSliceBalanced(objText, braceIdx)
@@ -10074,6 +10079,7 @@ module.exports = function (RED) {
10074
10079
  }
10075
10080
 
10076
10081
  module.exports.__test = {
10082
+ buildKnxAiPackageNodeCatalog,
10077
10083
  buildKnxAiConfirmationRequest,
10078
10084
  buildKnxAiUniversalMessage,
10079
10085
  classifyKnxAiConfirmation,
@@ -375,8 +375,8 @@
375
375
  };
376
376
 
377
377
  RED.nodes.registerType('knxUltimateHueAreaMotion', {
378
- category: 'KNX Ultimate HUE',
379
- color: '#C0C7E9',
378
+ category: 'deprecated',
379
+ color: '#E7E9F6',
380
380
  defaults: {
381
381
  server: { type: 'knxUltimate-config', required: false },
382
382
  serverHue: { type: 'hue-config', required: true },
@@ -395,9 +395,9 @@
395
395
  outputs: 1,
396
396
  icon: 'node-hue-icon.svg',
397
397
  label() {
398
- return this.name || RED._('node-red-contrib-knx-ultimate/knxUltimateHueAreaMotion:knxUltimateHueAreaMotion.paletteLabel');
398
+ return `${this.name || RED._('node-red-contrib-knx-ultimate/knxUltimateHueAreaMotion:knxUltimateHueAreaMotion.paletteLabel')} (deprecated)`;
399
399
  },
400
- paletteLabel: 'Hue Motion Area',
400
+ paletteLabel: 'Hue Motion Area (deprecated)',
401
401
  oneditprepare() {
402
402
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
403
403
  const node = this;
@@ -519,6 +519,15 @@
519
519
  </script>
520
520
 
521
521
  <script type="text/html" data-template-name="knxUltimateHueAreaMotion">
522
+ <div class="form-row hue-legacy-controller-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
523
+ <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
524
+ <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
525
+ </div>
526
+ <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
527
+ <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
528
+ <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
529
+ </button>
530
+ </div>
522
531
  <div class="form-row" style="margin-bottom:10px;">
523
532
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
524
533
  </div>
@@ -604,6 +613,8 @@
604
613
 
605
614
 
606
615
  <script type="text/markdown" data-help-name="knxUltimateHueAreaMotion">
616
+ > **Deprecated:** This dedicated HUE node remains available for existing flows. Use **HUE Controller** for new work. The legacy node is marked `(deprecated)` in the palette and on the canvas, uses a lighter color than HUE Controller, and its editor opens with a migration notice.
617
+
607
618
  <p>The Hue Motion Area node listens to MotionAware area motion events (Hue Bridge Pro) and mirrors the aggregated detected/not-detected state to KNX or your Node-RED flow.</p>
608
619
 
609
620
  Start typing in the GA field (name or Group Address) to link the KNX GA; devices appear while you type.
@@ -359,8 +359,8 @@
359
359
  };
360
360
 
361
361
  RED.nodes.registerType('knxUltimateHueBattery', {
362
- category: 'KNX Ultimate HUE',
363
- color: '#C0C7E9',
362
+ category: 'deprecated',
363
+ color: '#E7E9F6',
364
364
  defaults: {
365
365
  server: { type: 'knxUltimate-config', required: false },
366
366
  serverHue: { type: 'hue-config', required: true },
@@ -377,9 +377,9 @@
377
377
  outputs: 1,
378
378
  icon: 'node-hue-icon.svg',
379
379
  label() {
380
- return this.name || RED._('node-red-contrib-knx-ultimate/knxUltimateHueBattery:knxUltimateHueBattery.paletteLabel');
380
+ return `${this.name || RED._('node-red-contrib-knx-ultimate/knxUltimateHueBattery:knxUltimateHueBattery.paletteLabel')} (deprecated)`;
381
381
  },
382
- paletteLabel: 'Hue Battery Sensor',
382
+ paletteLabel: 'Hue Battery Sensor (deprecated)',
383
383
  oneditprepare() {
384
384
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
385
385
  const node = this;
@@ -498,6 +498,15 @@
498
498
  </script>
499
499
 
500
500
  <script type="text/html" data-template-name="knxUltimateHueBattery">
501
+ <div class="form-row hue-legacy-controller-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
502
+ <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
503
+ <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
504
+ </div>
505
+ <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
506
+ <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
507
+ <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
508
+ </button>
509
+ </div>
501
510
  <div class="form-row" style="margin-bottom:10px;">
502
511
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
503
512
  </div>
@@ -587,6 +596,8 @@
587
596
 
588
597
 
589
598
  <script type="text/markdown" data-help-name="knxUltimateHueBattery">
599
+ > **Deprecated:** This dedicated HUE node remains available for existing flows. Use **HUE Controller** for new work. The legacy node is marked `(deprecated)` in the palette and on the canvas, uses a lighter color than HUE Controller, and its editor opens with a migration notice.
600
+
590
601
  <p>This node exposes the battery level of a Hue device to KNX and raises an event whenever the value changes.</p>
591
602
 
592
603
  Start typing the KNX device name or Group Address in the GA field; matching entries appear while you type. Use the refresh icon next to <q>Hue sensor</q> to reload the list from the Hue bridge after adding new devices.
@@ -405,8 +405,8 @@
405
405
  };
406
406
 
407
407
  RED.nodes.registerType('knxUltimateHueButton', {
408
- category: 'KNX Ultimate HUE',
409
- color: '#C0C7E9',
408
+ category: 'deprecated',
409
+ color: '#E7E9F6',
410
410
  defaults: {
411
411
  server: { type: 'knxUltimate-config', required: false },
412
412
  serverHue: { type: 'hue-config', required: true },
@@ -429,9 +429,9 @@
429
429
  outputs: 1,
430
430
  icon: 'node-hue-icon.svg',
431
431
  label() {
432
- return this.name || 'Hue Button';
432
+ return `${this.name || 'Hue Button'} (deprecated)`;
433
433
  },
434
- paletteLabel: 'Hue Button',
434
+ paletteLabel: 'Hue Button (deprecated)',
435
435
  oneditprepare() {
436
436
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
437
437
  const node = this;
@@ -616,6 +616,15 @@
616
616
  </script>
617
617
 
618
618
  <script type="text/html" data-template-name="knxUltimateHueButton">
619
+ <div class="form-row hue-legacy-controller-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
620
+ <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
621
+ <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
622
+ </div>
623
+ <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
624
+ <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
625
+ <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
626
+ </button>
627
+ </div>
619
628
  <div class="form-row" style="margin-bottom:10px;">
620
629
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
621
630
  </div>
@@ -730,6 +739,8 @@
730
739
 
731
740
 
732
741
  <script type="text/markdown" data-help-name="knxUltimateHueButton">
742
+ > **Deprecated:** This dedicated HUE node remains available for existing flows. Use **HUE Controller** for new work. The legacy node is marked `(deprecated)` in the palette and on the canvas, uses a lighter color than HUE Controller, and its editor opens with a migration notice.
743
+
733
744
  <p>The Hue Button node maps Hue button events to KNX group addresses and exposes the same events on its flow output via <code>button.button_report.event</code>.</p>
734
745
 
735
746
  Start typing in the GA field (name or Group Address) to link the KNX GA; devices appear while you type.
@@ -376,8 +376,8 @@
376
376
  };
377
377
 
378
378
  RED.nodes.registerType('knxUltimateHueCameraMotion', {
379
- category: 'KNX Ultimate HUE',
380
- color: '#C0C7E9',
379
+ category: 'deprecated',
380
+ color: '#E7E9F6',
381
381
  defaults: {
382
382
  server: { type: 'knxUltimate-config', required: false },
383
383
  serverHue: { type: 'hue-config', required: true },
@@ -396,9 +396,9 @@
396
396
  outputs: 1,
397
397
  icon: 'node-hue-icon.svg',
398
398
  label() {
399
- return this.name || 'Hue Camera Motion';
399
+ return `${this.name || 'Hue Camera Motion'} (deprecated)`;
400
400
  },
401
- paletteLabel: 'Hue Camera Motion',
401
+ paletteLabel: 'Hue Camera Motion (deprecated)',
402
402
  oneditprepare() {
403
403
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
404
404
  const node = this;
@@ -529,6 +529,15 @@
529
529
  </script>
530
530
 
531
531
  <script type="text/html" data-template-name="knxUltimateHueCameraMotion">
532
+ <div class="form-row hue-legacy-controller-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
533
+ <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
534
+ <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
535
+ </div>
536
+ <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
537
+ <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
538
+ <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
539
+ </button>
540
+ </div>
532
541
  <div class="form-row" style="margin-bottom:10px;">
533
542
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
534
543
  </div>
@@ -613,6 +622,8 @@
613
622
  </script>
614
623
 
615
624
  <script type="text/markdown" data-help-name="knxUltimateHueCameraMotion">
625
+ > **Deprecated:** This dedicated HUE node remains available for existing flows. Use **HUE Controller** for new work. The legacy node is marked `(deprecated)` in the palette and on the canvas, uses a lighter color than HUE Controller, and its editor opens with a migration notice.
626
+
616
627
  <p>This node listens to motion events reported by a Philips Hue camera and mirrors them to KNX.</p>
617
628
 
618
629
  Start typing in the GA field (name or Group Address) to link the KNX GA; devices appear while you type.
@@ -357,8 +357,8 @@
357
357
  };
358
358
 
359
359
  RED.nodes.registerType('knxUltimateHueContactSensor', {
360
- category: 'KNX Ultimate HUE',
361
- color: '#C0C7E9',
360
+ category: 'deprecated',
361
+ color: '#E7E9F6',
362
362
  defaults: {
363
363
  server: { type: 'knxUltimate-config', required: false },
364
364
  serverHue: { type: 'hue-config', required: true },
@@ -372,9 +372,9 @@
372
372
  outputs: 1,
373
373
  icon: 'node-hue-icon.svg',
374
374
  label() {
375
- return this.name || 'Hue Contact Sensor';
375
+ return `${this.name || 'Hue Contact Sensor'} (deprecated)`;
376
376
  },
377
- paletteLabel: 'Hue Contact Sensor',
377
+ paletteLabel: 'Hue Contact Sensor (deprecated)',
378
378
  oneditprepare() {
379
379
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
380
380
  const node = this;
@@ -489,6 +489,15 @@
489
489
  </script>
490
490
 
491
491
  <script type="text/html" data-template-name="knxUltimateHueContactSensor">
492
+ <div class="form-row hue-legacy-controller-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:14px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
493
+ <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
494
+ <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
495
+ </div>
496
+ <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
497
+ <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
498
+ <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
499
+ </button>
500
+ </div>
492
501
  <div class="form-row" style="margin-bottom:10px;">
493
502
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
494
503
  </div>
@@ -552,6 +561,8 @@
552
561
 
553
562
 
554
563
  <script type="text/markdown" data-help-name="knxUltimateHueContactSensor">
564
+ > **Deprecated:** This dedicated HUE node remains available for existing flows. Use **HUE Controller** for new work. The legacy node is marked `(deprecated)` in the palette and on the canvas, uses a lighter color than HUE Controller, and its editor opens with a migration notice.
565
+
555
566
  <p>This node forwards events from a Hue contact sensor and maps them to KNX group addresses.</p>
556
567
 
557
568
  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.