node-red-contrib-knx-ultimate 7.1.4 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/CHANGELOG.md +20 -10
  2. package/MIGRATION.md +40 -0
  3. package/README.md +32 -6
  4. package/docs/README.md +34 -0
  5. package/docs/assets/brand/made-in-italy.svg +12 -0
  6. package/examples/Alerter - Device Alert Aggregation.json +5 -2
  7. package/examples/Auto Responder - Read Request Defaults.json +5 -2
  8. package/examples/Garage - Door Controller.json +5 -2
  9. package/examples/Global Context - Expose KNX Values.json +5 -2
  10. package/examples/KNX DateTime - Set Date and Time to Bus.json +111 -89
  11. package/examples/Load Control - Manual Shedding Mode.json +5 -2
  12. package/examples/Logger ETS File and Telegram Count.json +10 -2
  13. package/examples/Scene Controller Recall and Save.json +33 -6
  14. package/examples/Staircase - Timer, Override and Block.json +5 -2
  15. package/examples/WatchDog Connect Disconnect.json +98 -70
  16. package/nodes/commonFunctions.js +0 -587
  17. package/nodes/knxUltimate-config.html +0 -14
  18. package/nodes/knxUltimate-config.js +1 -18
  19. package/nodes/knxUltimate.html +1 -6
  20. package/nodes/knxUltimateIoTBridge.html +0 -14
  21. package/nodes/knxUltimateLegacyMigration.js +75 -0
  22. package/nodes/knxUltimateMultiRouting.html +1 -7
  23. package/nodes/knxUltimateRouterFilter.html +1 -7
  24. package/nodes/knxUltimateUtility.html +0 -6
  25. package/nodes/knxUltimateViewer.html +0 -6
  26. package/nodes/locales/de/knxUltimate-config.html +0 -8
  27. package/nodes/locales/de/knxUltimate.html +0 -8
  28. package/nodes/locales/de/knxUltimateIoTBridge.html +0 -8
  29. package/nodes/locales/de/knxUltimateMultiRouting.html +0 -8
  30. package/nodes/locales/de/knxUltimateRouterFilter.html +0 -8
  31. package/nodes/locales/de/knxUltimateUtility.html +0 -8
  32. package/nodes/locales/de/knxUltimateUtility.json +16 -1
  33. package/nodes/locales/de/knxUltimateViewer.html +0 -8
  34. package/nodes/locales/en/knxUltimate-config.html +0 -8
  35. package/nodes/locales/en/knxUltimate.html +0 -8
  36. package/nodes/locales/en/knxUltimateIoTBridge.html +0 -8
  37. package/nodes/locales/en/knxUltimateMultiRouting.html +0 -8
  38. package/nodes/locales/en/knxUltimateRouterFilter.html +0 -8
  39. package/nodes/locales/en/knxUltimateUtility.html +0 -8
  40. package/nodes/locales/en/knxUltimateUtility.json +16 -1
  41. package/nodes/locales/en/knxUltimateViewer.html +0 -8
  42. package/nodes/locales/es/knxUltimate-config.html +0 -8
  43. package/nodes/locales/es/knxUltimate.html +0 -8
  44. package/nodes/locales/es/knxUltimateIoTBridge.html +0 -8
  45. package/nodes/locales/es/knxUltimateMultiRouting.html +0 -8
  46. package/nodes/locales/es/knxUltimateRouterFilter.html +0 -8
  47. package/nodes/locales/es/knxUltimateUtility.html +0 -8
  48. package/nodes/locales/es/knxUltimateUtility.json +17 -2
  49. package/nodes/locales/es/knxUltimateViewer.html +0 -8
  50. package/nodes/locales/fr/knxUltimate-config.html +0 -8
  51. package/nodes/locales/fr/knxUltimate.html +0 -8
  52. package/nodes/locales/fr/knxUltimateIoTBridge.html +0 -8
  53. package/nodes/locales/fr/knxUltimateMultiRouting.html +0 -8
  54. package/nodes/locales/fr/knxUltimateRouterFilter.html +0 -8
  55. package/nodes/locales/fr/knxUltimateUtility.html +0 -8
  56. package/nodes/locales/fr/knxUltimateUtility.json +16 -1
  57. package/nodes/locales/fr/knxUltimateViewer.html +0 -8
  58. package/nodes/locales/it/knxUltimate-config.html +0 -8
  59. package/nodes/locales/it/knxUltimate.html +0 -8
  60. package/nodes/locales/it/knxUltimateIoTBridge.html +0 -8
  61. package/nodes/locales/it/knxUltimateMultiRouting.html +0 -8
  62. package/nodes/locales/it/knxUltimateRouterFilter.html +0 -8
  63. package/nodes/locales/it/knxUltimateUtility.html +0 -8
  64. package/nodes/locales/it/knxUltimateUtility.json +16 -1
  65. package/nodes/locales/it/knxUltimateViewer.html +0 -8
  66. package/nodes/locales/zh-CN/knxUltimate-config.html +0 -8
  67. package/nodes/locales/zh-CN/knxUltimate.html +0 -8
  68. package/nodes/locales/zh-CN/knxUltimateIoTBridge.html +0 -8
  69. package/nodes/locales/zh-CN/knxUltimateMultiRouting.html +0 -8
  70. package/nodes/locales/zh-CN/knxUltimateRouterFilter.html +0 -8
  71. package/nodes/locales/zh-CN/knxUltimateUtility.html +0 -8
  72. package/nodes/locales/zh-CN/knxUltimateUtility.json +16 -1
  73. package/nodes/locales/zh-CN/knxUltimateViewer.html +0 -8
  74. package/nodes/plugins/knxUltimate-v8-migration-recovery-plugin.html +140 -0
  75. package/package.json +22 -69
  76. package/resources/11f26b4500.js +2 -2
  77. package/resources/KNXAIChatAdapterMappings.js +2 -416
  78. package/resources/configNodeEditorSelection.js +2 -32
  79. package/resources/hueControllerEditorSelection.js +2 -32
  80. package/resources/hueControllerMigrationDialog.js +2 -254
  81. package/resources/hueControllerProfiles.js +2 -9319
  82. package/resources/knxUtilityProfiles.js +2041 -2082
  83. package/resources/legacyMigrationNotice.js +23 -111
  84. package/resources/matterQrScanner.js +2 -98
  85. package/resources/upgradeToV8.js +94 -26
  86. package/scripts/check-legacy-flows.js +142 -0
  87. package/examples/Hue Area Motion - Zone Presence.json +0 -77
  88. package/examples/Hue Battery - Level Status.json +0 -77
  89. package/examples/Hue Button - Short and Dim Commands.json +0 -83
  90. package/examples/Hue Camera Motion - Presence.json +0 -77
  91. package/examples/Hue Config - Bridge Template.json +0 -27
  92. package/examples/Hue Contact Sensor - Open Closed.json +0 -75
  93. package/examples/Hue Device Software Update - Availability.json +0 -77
  94. package/examples/Hue Humidity Sensor - Relative Humidity.json +0 -77
  95. package/examples/Hue Light - Switch and Brightness.json +0 -67
  96. package/examples/Hue Light Sensor - Lux to KNX.json +0 -77
  97. package/examples/Hue Motion - Presence Sensor.json +0 -76
  98. package/examples/Hue Plug - Switch and State.json +0 -63
  99. package/examples/Hue Scene - Recall from KNX.json +0 -63
  100. package/examples/Hue Tap Dial - Relative Dimming.json +0 -76
  101. package/examples/Hue Temperature Sensor - Celsius to KNX.json +0 -77
  102. package/examples/Hue Zigbee Connectivity - Online Status.json +0 -77
  103. package/examples/Matter Controller - Semantic Flow Input.json +0 -248
  104. package/nodes/hue-config.html +0 -378
  105. package/nodes/hue-config.js +0 -846
  106. package/nodes/icons/node-alerter-icon.png +0 -0
  107. package/nodes/icons/node-homekit-icon.png +0 -0
  108. package/nodes/icons/node-homekit-icon.svg +0 -10
  109. package/nodes/icons/node-hue-icon.svg +0 -10
  110. package/nodes/icons/node-knx-icon.png +0 -0
  111. package/nodes/icons/node-logger-icon.png +0 -0
  112. package/nodes/icons/node-logger2-icon.png +0 -0
  113. package/nodes/icons/node-logger2-icon.svg +0 -32
  114. package/nodes/icons/node-matter-bridge-icon.svg +0 -6
  115. package/nodes/icons/node-matter-controller-icon.svg +0 -6
  116. package/nodes/icons/node-matter-icon.svg +0 -12
  117. package/nodes/icons/node-scene-icon.png +0 -0
  118. package/nodes/icons/node-watchdog-icon.png +0 -0
  119. package/nodes/knxUltimateAI.html +0 -1826
  120. package/nodes/knxUltimateAI.js +0 -16797
  121. package/nodes/knxUltimateAIHomeAssistant.html +0 -54
  122. package/nodes/knxUltimateAIHomeAssistant.js +0 -152
  123. package/nodes/knxUltimateAlerter.html +0 -267
  124. package/nodes/knxUltimateAlerter.js +0 -300
  125. package/nodes/knxUltimateAutoResponder.html +0 -128
  126. package/nodes/knxUltimateAutoResponder.js +0 -264
  127. package/nodes/knxUltimateDateTime.html +0 -579
  128. package/nodes/knxUltimateDateTime.js +0 -282
  129. package/nodes/knxUltimateGarage.html +0 -337
  130. package/nodes/knxUltimateGarage.js +0 -504
  131. package/nodes/knxUltimateGlobalContext.html +0 -145
  132. package/nodes/knxUltimateGlobalContext.js +0 -208
  133. package/nodes/knxUltimateHATranslator.html +0 -85
  134. package/nodes/knxUltimateHATranslator.js +0 -83
  135. package/nodes/knxUltimateHueAreaMotion.html +0 -670
  136. package/nodes/knxUltimateHueAreaMotion.js +0 -218
  137. package/nodes/knxUltimateHueBattery.html +0 -646
  138. package/nodes/knxUltimateHueBattery.js +0 -182
  139. package/nodes/knxUltimateHueButton.html +0 -804
  140. package/nodes/knxUltimateHueButton.js +0 -292
  141. package/nodes/knxUltimateHueCameraMotion.html +0 -671
  142. package/nodes/knxUltimateHueCameraMotion.js +0 -218
  143. package/nodes/knxUltimateHueContactSensor.html +0 -609
  144. package/nodes/knxUltimateHueContactSensor.js +0 -188
  145. package/nodes/knxUltimateHueController.html +0 -1765
  146. package/nodes/knxUltimateHueController.js +0 -28
  147. package/nodes/knxUltimateHueHumiditySensor.html +0 -641
  148. package/nodes/knxUltimateHueHumiditySensor.js +0 -201
  149. package/nodes/knxUltimateHueLight.html +0 -2516
  150. package/nodes/knxUltimateHueLight.js +0 -1582
  151. package/nodes/knxUltimateHueLightSensor.html +0 -636
  152. package/nodes/knxUltimateHueLightSensor.js +0 -177
  153. package/nodes/knxUltimateHueMotion.html +0 -634
  154. package/nodes/knxUltimateHueMotion.js +0 -182
  155. package/nodes/knxUltimateHuePlug.html +0 -576
  156. package/nodes/knxUltimateHuePlug.js +0 -341
  157. package/nodes/knxUltimateHueScene.html +0 -967
  158. package/nodes/knxUltimateHueScene.js +0 -349
  159. package/nodes/knxUltimateHueTapDial.html +0 -640
  160. package/nodes/knxUltimateHueTapDial.js +0 -268
  161. package/nodes/knxUltimateHueTemperatureSensor.html +0 -639
  162. package/nodes/knxUltimateHueTemperatureSensor.js +0 -184
  163. package/nodes/knxUltimateHueZigbeeConnectivity.html +0 -648
  164. package/nodes/knxUltimateHueZigbeeConnectivity.js +0 -182
  165. package/nodes/knxUltimateHuedevice_software_update.html +0 -650
  166. package/nodes/knxUltimateHuedevice_software_update.js +0 -182
  167. package/nodes/knxUltimateLoadControl.html +0 -425
  168. package/nodes/knxUltimateLoadControl.js +0 -443
  169. package/nodes/knxUltimateLogger.html +0 -197
  170. package/nodes/knxUltimateLogger.js +0 -224
  171. package/nodes/knxUltimateMatterBridge.html +0 -689
  172. package/nodes/knxUltimateMatterBridge.js +0 -464
  173. package/nodes/knxUltimateMatterControllerDevice.html +0 -2851
  174. package/nodes/knxUltimateMatterControllerDevice.js +0 -1747
  175. package/nodes/knxUltimateSceneController.html +0 -529
  176. package/nodes/knxUltimateSceneController.js +0 -437
  177. package/nodes/knxUltimateStaircase.html +0 -346
  178. package/nodes/knxUltimateStaircase.js +0 -463
  179. package/nodes/knxUltimateWatchDog.html +0 -241
  180. package/nodes/knxUltimateWatchDog.js +0 -230
  181. package/nodes/locales/de/hue-config.html +0 -33
  182. package/nodes/locales/de/hue-config.json +0 -21
  183. package/nodes/locales/de/knxUltimateAI.html +0 -13
  184. package/nodes/locales/de/knxUltimateAI.json +0 -231
  185. package/nodes/locales/de/knxUltimateAIHomeAssistant.html +0 -11
  186. package/nodes/locales/de/knxUltimateAlerter.html +0 -159
  187. package/nodes/locales/de/knxUltimateAlerter.json +0 -27
  188. package/nodes/locales/de/knxUltimateAutoResponder.html +0 -96
  189. package/nodes/locales/de/knxUltimateAutoResponder.json +0 -8
  190. package/nodes/locales/de/knxUltimateDateTime.html +0 -45
  191. package/nodes/locales/de/knxUltimateDateTime.json +0 -32
  192. package/nodes/locales/de/knxUltimateGarage.html +0 -79
  193. package/nodes/locales/de/knxUltimateGarage.json +0 -51
  194. package/nodes/locales/de/knxUltimateGlobalContext.html +0 -76
  195. package/nodes/locales/de/knxUltimateGlobalContext.json +0 -24
  196. package/nodes/locales/de/knxUltimateHATranslator.html +0 -25
  197. package/nodes/locales/de/knxUltimateHATranslator.json +0 -8
  198. package/nodes/locales/de/knxUltimateHueAreaMotion.html +0 -44
  199. package/nodes/locales/de/knxUltimateHueAreaMotion.json +0 -31
  200. package/nodes/locales/de/knxUltimateHueBattery.html +0 -37
  201. package/nodes/locales/de/knxUltimateHueBattery.json +0 -30
  202. package/nodes/locales/de/knxUltimateHueButton.html +0 -52
  203. package/nodes/locales/de/knxUltimateHueButton.json +0 -34
  204. package/nodes/locales/de/knxUltimateHueCameraMotion.html +0 -38
  205. package/nodes/locales/de/knxUltimateHueCameraMotion.json +0 -30
  206. package/nodes/locales/de/knxUltimateHueContactSensor.html +0 -35
  207. package/nodes/locales/de/knxUltimateHueContactSensor.json +0 -26
  208. package/nodes/locales/de/knxUltimateHueController.html +0 -690
  209. package/nodes/locales/de/knxUltimateHueController.json +0 -64
  210. package/nodes/locales/de/knxUltimateHueHumiditySensor.html +0 -38
  211. package/nodes/locales/de/knxUltimateHueHumiditySensor.json +0 -30
  212. package/nodes/locales/de/knxUltimateHueLight.html +0 -121
  213. package/nodes/locales/de/knxUltimateHueLight.json +0 -94
  214. package/nodes/locales/de/knxUltimateHueLightSensor.html +0 -38
  215. package/nodes/locales/de/knxUltimateHueLightSensor.json +0 -19
  216. package/nodes/locales/de/knxUltimateHueMotion.html +0 -41
  217. package/nodes/locales/de/knxUltimateHueMotion.json +0 -27
  218. package/nodes/locales/de/knxUltimateHuePlug.html +0 -50
  219. package/nodes/locales/de/knxUltimateHuePlug.json +0 -33
  220. package/nodes/locales/de/knxUltimateHueScene.html +0 -45
  221. package/nodes/locales/de/knxUltimateHueScene.json +0 -41
  222. package/nodes/locales/de/knxUltimateHueTapDial.html +0 -40
  223. package/nodes/locales/de/knxUltimateHueTapDial.json +0 -28
  224. package/nodes/locales/de/knxUltimateHueTemperatureSensor.html +0 -38
  225. package/nodes/locales/de/knxUltimateHueTemperatureSensor.json +0 -30
  226. package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.html +0 -39
  227. package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.json +0 -30
  228. package/nodes/locales/de/knxUltimateHuedevice_software_update.html +0 -36
  229. package/nodes/locales/de/knxUltimateHuedevice_software_update.json +0 -30
  230. package/nodes/locales/de/knxUltimateLoadControl.html +0 -69
  231. package/nodes/locales/de/knxUltimateLoadControl.json +0 -28
  232. package/nodes/locales/de/knxUltimateLogger.html +0 -126
  233. package/nodes/locales/de/knxUltimateLogger.json +0 -31
  234. package/nodes/locales/de/knxUltimateMatterBridge.html +0 -65
  235. package/nodes/locales/de/knxUltimateMatterBridge.json +0 -123
  236. package/nodes/locales/de/knxUltimateMatterControllerDevice.html +0 -57
  237. package/nodes/locales/de/knxUltimateMatterControllerDevice.json +0 -146
  238. package/nodes/locales/de/knxUltimateSceneController.html +0 -98
  239. package/nodes/locales/de/knxUltimateSceneController.json +0 -32
  240. package/nodes/locales/de/knxUltimateStaircase.html +0 -77
  241. package/nodes/locales/de/knxUltimateStaircase.json +0 -62
  242. package/nodes/locales/de/knxUltimateWatchDog.html +0 -178
  243. package/nodes/locales/de/knxUltimateWatchDog.json +0 -27
  244. package/nodes/locales/de/matter-config.html +0 -47
  245. package/nodes/locales/de/matter-config.json +0 -47
  246. package/nodes/locales/de/matterbridge-config.html +0 -45
  247. package/nodes/locales/de/matterbridge-config.json +0 -25
  248. package/nodes/locales/en/hue-config.html +0 -31
  249. package/nodes/locales/en/hue-config.json +0 -21
  250. package/nodes/locales/en/knxUltimateAI.html +0 -13
  251. package/nodes/locales/en/knxUltimateAI.json +0 -234
  252. package/nodes/locales/en/knxUltimateAIHomeAssistant.html +0 -11
  253. package/nodes/locales/en/knxUltimateAlerter.html +0 -164
  254. package/nodes/locales/en/knxUltimateAlerter.json +0 -27
  255. package/nodes/locales/en/knxUltimateAutoResponder.html +0 -94
  256. package/nodes/locales/en/knxUltimateAutoResponder.json +0 -8
  257. package/nodes/locales/en/knxUltimateDateTime.html +0 -67
  258. package/nodes/locales/en/knxUltimateDateTime.json +0 -32
  259. package/nodes/locales/en/knxUltimateGarage.html +0 -79
  260. package/nodes/locales/en/knxUltimateGarage.json +0 -51
  261. package/nodes/locales/en/knxUltimateGlobalContext.html +0 -124
  262. package/nodes/locales/en/knxUltimateGlobalContext.json +0 -24
  263. package/nodes/locales/en/knxUltimateHATranslator.html +0 -25
  264. package/nodes/locales/en/knxUltimateHATranslator.json +0 -8
  265. package/nodes/locales/en/knxUltimateHueAreaMotion.html +0 -44
  266. package/nodes/locales/en/knxUltimateHueAreaMotion.json +0 -31
  267. package/nodes/locales/en/knxUltimateHueBattery.html +0 -37
  268. package/nodes/locales/en/knxUltimateHueBattery.json +0 -30
  269. package/nodes/locales/en/knxUltimateHueButton.html +0 -52
  270. package/nodes/locales/en/knxUltimateHueButton.json +0 -34
  271. package/nodes/locales/en/knxUltimateHueCameraMotion.html +0 -38
  272. package/nodes/locales/en/knxUltimateHueCameraMotion.json +0 -30
  273. package/nodes/locales/en/knxUltimateHueContactSensor.html +0 -35
  274. package/nodes/locales/en/knxUltimateHueContactSensor.json +0 -26
  275. package/nodes/locales/en/knxUltimateHueController.html +0 -691
  276. package/nodes/locales/en/knxUltimateHueController.json +0 -64
  277. package/nodes/locales/en/knxUltimateHueHumiditySensor.html +0 -38
  278. package/nodes/locales/en/knxUltimateHueHumiditySensor.json +0 -30
  279. package/nodes/locales/en/knxUltimateHueLight.html +0 -124
  280. package/nodes/locales/en/knxUltimateHueLight.json +0 -94
  281. package/nodes/locales/en/knxUltimateHueLightSensor.html +0 -38
  282. package/nodes/locales/en/knxUltimateHueLightSensor.json +0 -19
  283. package/nodes/locales/en/knxUltimateHueMotion.html +0 -41
  284. package/nodes/locales/en/knxUltimateHueMotion.json +0 -27
  285. package/nodes/locales/en/knxUltimateHuePlug.html +0 -50
  286. package/nodes/locales/en/knxUltimateHuePlug.json +0 -33
  287. package/nodes/locales/en/knxUltimateHueScene.html +0 -45
  288. package/nodes/locales/en/knxUltimateHueScene.json +0 -41
  289. package/nodes/locales/en/knxUltimateHueTapDial.html +0 -40
  290. package/nodes/locales/en/knxUltimateHueTapDial.json +0 -28
  291. package/nodes/locales/en/knxUltimateHueTemperatureSensor.html +0 -38
  292. package/nodes/locales/en/knxUltimateHueTemperatureSensor.json +0 -30
  293. package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.html +0 -39
  294. package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.json +0 -30
  295. package/nodes/locales/en/knxUltimateHuedevice_software_update.html +0 -36
  296. package/nodes/locales/en/knxUltimateHuedevice_software_update.json +0 -30
  297. package/nodes/locales/en/knxUltimateLoadControl.html +0 -76
  298. package/nodes/locales/en/knxUltimateLoadControl.json +0 -28
  299. package/nodes/locales/en/knxUltimateLogger.html +0 -161
  300. package/nodes/locales/en/knxUltimateLogger.json +0 -31
  301. package/nodes/locales/en/knxUltimateMatterBridge.html +0 -65
  302. package/nodes/locales/en/knxUltimateMatterBridge.json +0 -123
  303. package/nodes/locales/en/knxUltimateMatterControllerDevice.html +0 -57
  304. package/nodes/locales/en/knxUltimateMatterControllerDevice.json +0 -146
  305. package/nodes/locales/en/knxUltimateSceneController.html +0 -117
  306. package/nodes/locales/en/knxUltimateSceneController.json +0 -32
  307. package/nodes/locales/en/knxUltimateStaircase.html +0 -77
  308. package/nodes/locales/en/knxUltimateStaircase.json +0 -62
  309. package/nodes/locales/en/knxUltimateWatchDog.html +0 -244
  310. package/nodes/locales/en/knxUltimateWatchDog.json +0 -27
  311. package/nodes/locales/en/matter-config.html +0 -47
  312. package/nodes/locales/en/matter-config.json +0 -48
  313. package/nodes/locales/en/matterbridge-config.html +0 -45
  314. package/nodes/locales/en/matterbridge-config.json +0 -25
  315. package/nodes/locales/es/hue-config.html +0 -31
  316. package/nodes/locales/es/hue-config.json +0 -21
  317. package/nodes/locales/es/knxUltimateAI.html +0 -13
  318. package/nodes/locales/es/knxUltimateAI.json +0 -231
  319. package/nodes/locales/es/knxUltimateAIHomeAssistant.html +0 -11
  320. package/nodes/locales/es/knxUltimateAlerter.html +0 -164
  321. package/nodes/locales/es/knxUltimateAlerter.json +0 -27
  322. package/nodes/locales/es/knxUltimateAutoResponder.html +0 -81
  323. package/nodes/locales/es/knxUltimateAutoResponder.json +0 -8
  324. package/nodes/locales/es/knxUltimateDateTime.html +0 -45
  325. package/nodes/locales/es/knxUltimateDateTime.json +0 -32
  326. package/nodes/locales/es/knxUltimateGarage.html +0 -79
  327. package/nodes/locales/es/knxUltimateGarage.json +0 -51
  328. package/nodes/locales/es/knxUltimateGlobalContext.html +0 -128
  329. package/nodes/locales/es/knxUltimateGlobalContext.json +0 -24
  330. package/nodes/locales/es/knxUltimateHATranslator.html +0 -25
  331. package/nodes/locales/es/knxUltimateHATranslator.json +0 -8
  332. package/nodes/locales/es/knxUltimateHueAreaMotion.html +0 -44
  333. package/nodes/locales/es/knxUltimateHueAreaMotion.json +0 -31
  334. package/nodes/locales/es/knxUltimateHueBattery.html +0 -37
  335. package/nodes/locales/es/knxUltimateHueBattery.json +0 -30
  336. package/nodes/locales/es/knxUltimateHueButton.html +0 -52
  337. package/nodes/locales/es/knxUltimateHueButton.json +0 -34
  338. package/nodes/locales/es/knxUltimateHueCameraMotion.html +0 -38
  339. package/nodes/locales/es/knxUltimateHueCameraMotion.json +0 -30
  340. package/nodes/locales/es/knxUltimateHueContactSensor.html +0 -35
  341. package/nodes/locales/es/knxUltimateHueContactSensor.json +0 -26
  342. package/nodes/locales/es/knxUltimateHueController.html +0 -691
  343. package/nodes/locales/es/knxUltimateHueController.json +0 -64
  344. package/nodes/locales/es/knxUltimateHueHumiditySensor.html +0 -38
  345. package/nodes/locales/es/knxUltimateHueHumiditySensor.json +0 -30
  346. package/nodes/locales/es/knxUltimateHueLight.html +0 -124
  347. package/nodes/locales/es/knxUltimateHueLight.json +0 -94
  348. package/nodes/locales/es/knxUltimateHueLightSensor.html +0 -38
  349. package/nodes/locales/es/knxUltimateHueLightSensor.json +0 -19
  350. package/nodes/locales/es/knxUltimateHueMotion.html +0 -41
  351. package/nodes/locales/es/knxUltimateHueMotion.json +0 -27
  352. package/nodes/locales/es/knxUltimateHuePlug.html +0 -50
  353. package/nodes/locales/es/knxUltimateHuePlug.json +0 -33
  354. package/nodes/locales/es/knxUltimateHueScene.html +0 -45
  355. package/nodes/locales/es/knxUltimateHueScene.json +0 -41
  356. package/nodes/locales/es/knxUltimateHueTapDial.html +0 -40
  357. package/nodes/locales/es/knxUltimateHueTapDial.json +0 -28
  358. package/nodes/locales/es/knxUltimateHueTemperatureSensor.html +0 -38
  359. package/nodes/locales/es/knxUltimateHueTemperatureSensor.json +0 -30
  360. package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.html +0 -39
  361. package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.json +0 -30
  362. package/nodes/locales/es/knxUltimateHuedevice_software_update.html +0 -36
  363. package/nodes/locales/es/knxUltimateHuedevice_software_update.json +0 -30
  364. package/nodes/locales/es/knxUltimateLoadControl.html +0 -76
  365. package/nodes/locales/es/knxUltimateLoadControl.json +0 -28
  366. package/nodes/locales/es/knxUltimateLogger.html +0 -162
  367. package/nodes/locales/es/knxUltimateLogger.json +0 -31
  368. package/nodes/locales/es/knxUltimateMatterBridge.html +0 -65
  369. package/nodes/locales/es/knxUltimateMatterBridge.json +0 -123
  370. package/nodes/locales/es/knxUltimateMatterControllerDevice.html +0 -57
  371. package/nodes/locales/es/knxUltimateMatterControllerDevice.json +0 -146
  372. package/nodes/locales/es/knxUltimateSceneController.html +0 -115
  373. package/nodes/locales/es/knxUltimateSceneController.json +0 -32
  374. package/nodes/locales/es/knxUltimateStaircase.html +0 -77
  375. package/nodes/locales/es/knxUltimateStaircase.json +0 -62
  376. package/nodes/locales/es/knxUltimateWatchDog.html +0 -230
  377. package/nodes/locales/es/knxUltimateWatchDog.json +0 -27
  378. package/nodes/locales/es/matter-config.html +0 -47
  379. package/nodes/locales/es/matter-config.json +0 -47
  380. package/nodes/locales/es/matterbridge-config.html +0 -45
  381. package/nodes/locales/es/matterbridge-config.json +0 -25
  382. package/nodes/locales/fr/hue-config.html +0 -31
  383. package/nodes/locales/fr/hue-config.json +0 -21
  384. package/nodes/locales/fr/knxUltimateAI.html +0 -13
  385. package/nodes/locales/fr/knxUltimateAI.json +0 -231
  386. package/nodes/locales/fr/knxUltimateAIHomeAssistant.html +0 -11
  387. package/nodes/locales/fr/knxUltimateAlerter.html +0 -164
  388. package/nodes/locales/fr/knxUltimateAlerter.json +0 -27
  389. package/nodes/locales/fr/knxUltimateAutoResponder.html +0 -92
  390. package/nodes/locales/fr/knxUltimateAutoResponder.json +0 -8
  391. package/nodes/locales/fr/knxUltimateDateTime.html +0 -45
  392. package/nodes/locales/fr/knxUltimateDateTime.json +0 -32
  393. package/nodes/locales/fr/knxUltimateGarage.html +0 -79
  394. package/nodes/locales/fr/knxUltimateGarage.json +0 -51
  395. package/nodes/locales/fr/knxUltimateGlobalContext.html +0 -122
  396. package/nodes/locales/fr/knxUltimateGlobalContext.json +0 -24
  397. package/nodes/locales/fr/knxUltimateHATranslator.html +0 -25
  398. package/nodes/locales/fr/knxUltimateHATranslator.json +0 -8
  399. package/nodes/locales/fr/knxUltimateHueAreaMotion.html +0 -44
  400. package/nodes/locales/fr/knxUltimateHueAreaMotion.json +0 -31
  401. package/nodes/locales/fr/knxUltimateHueBattery.html +0 -37
  402. package/nodes/locales/fr/knxUltimateHueBattery.json +0 -30
  403. package/nodes/locales/fr/knxUltimateHueButton.html +0 -52
  404. package/nodes/locales/fr/knxUltimateHueButton.json +0 -34
  405. package/nodes/locales/fr/knxUltimateHueCameraMotion.html +0 -38
  406. package/nodes/locales/fr/knxUltimateHueCameraMotion.json +0 -30
  407. package/nodes/locales/fr/knxUltimateHueContactSensor.html +0 -35
  408. package/nodes/locales/fr/knxUltimateHueContactSensor.json +0 -26
  409. package/nodes/locales/fr/knxUltimateHueController.html +0 -691
  410. package/nodes/locales/fr/knxUltimateHueController.json +0 -64
  411. package/nodes/locales/fr/knxUltimateHueHumiditySensor.html +0 -38
  412. package/nodes/locales/fr/knxUltimateHueHumiditySensor.json +0 -30
  413. package/nodes/locales/fr/knxUltimateHueLight.html +0 -124
  414. package/nodes/locales/fr/knxUltimateHueLight.json +0 -86
  415. package/nodes/locales/fr/knxUltimateHueLightSensor.html +0 -38
  416. package/nodes/locales/fr/knxUltimateHueLightSensor.json +0 -19
  417. package/nodes/locales/fr/knxUltimateHueMotion.html +0 -41
  418. package/nodes/locales/fr/knxUltimateHueMotion.json +0 -27
  419. package/nodes/locales/fr/knxUltimateHuePlug.html +0 -50
  420. package/nodes/locales/fr/knxUltimateHuePlug.json +0 -33
  421. package/nodes/locales/fr/knxUltimateHueScene.html +0 -45
  422. package/nodes/locales/fr/knxUltimateHueScene.json +0 -41
  423. package/nodes/locales/fr/knxUltimateHueTapDial.html +0 -40
  424. package/nodes/locales/fr/knxUltimateHueTapDial.json +0 -28
  425. package/nodes/locales/fr/knxUltimateHueTemperatureSensor.html +0 -38
  426. package/nodes/locales/fr/knxUltimateHueTemperatureSensor.json +0 -30
  427. package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.html +0 -39
  428. package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.json +0 -30
  429. package/nodes/locales/fr/knxUltimateHuedevice_software_update.html +0 -36
  430. package/nodes/locales/fr/knxUltimateHuedevice_software_update.json +0 -30
  431. package/nodes/locales/fr/knxUltimateLoadControl.html +0 -76
  432. package/nodes/locales/fr/knxUltimateLoadControl.json +0 -28
  433. package/nodes/locales/fr/knxUltimateLogger.html +0 -160
  434. package/nodes/locales/fr/knxUltimateLogger.json +0 -31
  435. package/nodes/locales/fr/knxUltimateMatterBridge.html +0 -65
  436. package/nodes/locales/fr/knxUltimateMatterBridge.json +0 -123
  437. package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +0 -57
  438. package/nodes/locales/fr/knxUltimateMatterControllerDevice.json +0 -146
  439. package/nodes/locales/fr/knxUltimateSceneController.html +0 -117
  440. package/nodes/locales/fr/knxUltimateSceneController.json +0 -32
  441. package/nodes/locales/fr/knxUltimateStaircase.html +0 -77
  442. package/nodes/locales/fr/knxUltimateStaircase.json +0 -62
  443. package/nodes/locales/fr/knxUltimateWatchDog.html +0 -228
  444. package/nodes/locales/fr/knxUltimateWatchDog.json +0 -27
  445. package/nodes/locales/fr/matter-config.html +0 -47
  446. package/nodes/locales/fr/matter-config.json +0 -47
  447. package/nodes/locales/fr/matterbridge-config.html +0 -45
  448. package/nodes/locales/fr/matterbridge-config.json +0 -25
  449. package/nodes/locales/it/hue-config.html +0 -33
  450. package/nodes/locales/it/hue-config.json +0 -21
  451. package/nodes/locales/it/knxUltimateAI.html +0 -13
  452. package/nodes/locales/it/knxUltimateAI.json +0 -234
  453. package/nodes/locales/it/knxUltimateAIHomeAssistant.html +0 -11
  454. package/nodes/locales/it/knxUltimateAlerter.html +0 -159
  455. package/nodes/locales/it/knxUltimateAlerter.json +0 -27
  456. package/nodes/locales/it/knxUltimateAutoResponder.html +0 -96
  457. package/nodes/locales/it/knxUltimateAutoResponder.json +0 -8
  458. package/nodes/locales/it/knxUltimateDateTime.html +0 -67
  459. package/nodes/locales/it/knxUltimateDateTime.json +0 -32
  460. package/nodes/locales/it/knxUltimateGarage.html +0 -79
  461. package/nodes/locales/it/knxUltimateGarage.json +0 -51
  462. package/nodes/locales/it/knxUltimateGlobalContext.html +0 -81
  463. package/nodes/locales/it/knxUltimateGlobalContext.json +0 -24
  464. package/nodes/locales/it/knxUltimateHATranslator.html +0 -24
  465. package/nodes/locales/it/knxUltimateHATranslator.json +0 -8
  466. package/nodes/locales/it/knxUltimateHueAreaMotion.html +0 -44
  467. package/nodes/locales/it/knxUltimateHueAreaMotion.json +0 -31
  468. package/nodes/locales/it/knxUltimateHueBattery.html +0 -37
  469. package/nodes/locales/it/knxUltimateHueBattery.json +0 -30
  470. package/nodes/locales/it/knxUltimateHueButton.html +0 -52
  471. package/nodes/locales/it/knxUltimateHueButton.json +0 -34
  472. package/nodes/locales/it/knxUltimateHueCameraMotion.html +0 -38
  473. package/nodes/locales/it/knxUltimateHueCameraMotion.json +0 -30
  474. package/nodes/locales/it/knxUltimateHueContactSensor.html +0 -35
  475. package/nodes/locales/it/knxUltimateHueContactSensor.json +0 -26
  476. package/nodes/locales/it/knxUltimateHueController.html +0 -690
  477. package/nodes/locales/it/knxUltimateHueController.json +0 -64
  478. package/nodes/locales/it/knxUltimateHueHumiditySensor 2.html +0 -11
  479. package/nodes/locales/it/knxUltimateHueHumiditySensor.html +0 -38
  480. package/nodes/locales/it/knxUltimateHueHumiditySensor.json +0 -30
  481. package/nodes/locales/it/knxUltimateHueLight.html +0 -124
  482. package/nodes/locales/it/knxUltimateHueLight.json +0 -94
  483. package/nodes/locales/it/knxUltimateHueLightSensor.html +0 -38
  484. package/nodes/locales/it/knxUltimateHueLightSensor.json +0 -19
  485. package/nodes/locales/it/knxUltimateHueMotion.html +0 -41
  486. package/nodes/locales/it/knxUltimateHueMotion.json +0 -27
  487. package/nodes/locales/it/knxUltimateHuePlug.html +0 -50
  488. package/nodes/locales/it/knxUltimateHuePlug.json +0 -33
  489. package/nodes/locales/it/knxUltimateHueScene.html +0 -45
  490. package/nodes/locales/it/knxUltimateHueScene.json +0 -41
  491. package/nodes/locales/it/knxUltimateHueTapDial.html +0 -40
  492. package/nodes/locales/it/knxUltimateHueTapDial.json +0 -28
  493. package/nodes/locales/it/knxUltimateHueTemperatureSensor.html +0 -38
  494. package/nodes/locales/it/knxUltimateHueTemperatureSensor.json +0 -30
  495. package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.html +0 -39
  496. package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.json +0 -30
  497. package/nodes/locales/it/knxUltimateHuedevice_software_update.html +0 -35
  498. package/nodes/locales/it/knxUltimateHuedevice_software_update.json +0 -30
  499. package/nodes/locales/it/knxUltimateLoadControl.html +0 -76
  500. package/nodes/locales/it/knxUltimateLoadControl.json +0 -28
  501. package/nodes/locales/it/knxUltimateLogger.html +0 -132
  502. package/nodes/locales/it/knxUltimateLogger.json +0 -31
  503. package/nodes/locales/it/knxUltimateMatterBridge.html +0 -65
  504. package/nodes/locales/it/knxUltimateMatterBridge.json +0 -123
  505. package/nodes/locales/it/knxUltimateMatterControllerDevice.html +0 -57
  506. package/nodes/locales/it/knxUltimateMatterControllerDevice.json +0 -146
  507. package/nodes/locales/it/knxUltimateSceneController.html +0 -101
  508. package/nodes/locales/it/knxUltimateSceneController.json +0 -32
  509. package/nodes/locales/it/knxUltimateStaircase.html +0 -77
  510. package/nodes/locales/it/knxUltimateStaircase.json +0 -62
  511. package/nodes/locales/it/knxUltimateWatchDog.html +0 -194
  512. package/nodes/locales/it/knxUltimateWatchDog.json +0 -27
  513. package/nodes/locales/it/matter-config.html +0 -47
  514. package/nodes/locales/it/matter-config.json +0 -48
  515. package/nodes/locales/it/matterbridge-config.html +0 -45
  516. package/nodes/locales/it/matterbridge-config.json +0 -25
  517. package/nodes/locales/zh-CN/hue-config.html +0 -33
  518. package/nodes/locales/zh-CN/hue-config.json +0 -21
  519. package/nodes/locales/zh-CN/knxUltimateAI.html +0 -13
  520. package/nodes/locales/zh-CN/knxUltimateAI.json +0 -231
  521. package/nodes/locales/zh-CN/knxUltimateAIHomeAssistant.html +0 -11
  522. package/nodes/locales/zh-CN/knxUltimateAlerter.html +0 -159
  523. package/nodes/locales/zh-CN/knxUltimateAlerter.json +0 -27
  524. package/nodes/locales/zh-CN/knxUltimateAutoResponder.html +0 -94
  525. package/nodes/locales/zh-CN/knxUltimateAutoResponder.json +0 -8
  526. package/nodes/locales/zh-CN/knxUltimateDateTime.html +0 -45
  527. package/nodes/locales/zh-CN/knxUltimateDateTime.json +0 -32
  528. package/nodes/locales/zh-CN/knxUltimateGarage.html +0 -79
  529. package/nodes/locales/zh-CN/knxUltimateGarage.json +0 -51
  530. package/nodes/locales/zh-CN/knxUltimateGlobalContext.html +0 -77
  531. package/nodes/locales/zh-CN/knxUltimateGlobalContext.json +0 -24
  532. package/nodes/locales/zh-CN/knxUltimateHATranslator.html +0 -25
  533. package/nodes/locales/zh-CN/knxUltimateHATranslator.json +0 -8
  534. package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.html +0 -44
  535. package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.json +0 -31
  536. package/nodes/locales/zh-CN/knxUltimateHueBattery.html +0 -37
  537. package/nodes/locales/zh-CN/knxUltimateHueBattery.json +0 -30
  538. package/nodes/locales/zh-CN/knxUltimateHueButton.html +0 -52
  539. package/nodes/locales/zh-CN/knxUltimateHueButton.json +0 -34
  540. package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.html +0 -38
  541. package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.json +0 -30
  542. package/nodes/locales/zh-CN/knxUltimateHueContactSensor.html +0 -35
  543. package/nodes/locales/zh-CN/knxUltimateHueContactSensor.json +0 -26
  544. package/nodes/locales/zh-CN/knxUltimateHueController.html +0 -693
  545. package/nodes/locales/zh-CN/knxUltimateHueController.json +0 -64
  546. package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.html +0 -38
  547. package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.json +0 -30
  548. package/nodes/locales/zh-CN/knxUltimateHueLight.html +0 -126
  549. package/nodes/locales/zh-CN/knxUltimateHueLight.json +0 -86
  550. package/nodes/locales/zh-CN/knxUltimateHueLightSensor.html +0 -38
  551. package/nodes/locales/zh-CN/knxUltimateHueLightSensor.json +0 -9
  552. package/nodes/locales/zh-CN/knxUltimateHueMotion.html +0 -41
  553. package/nodes/locales/zh-CN/knxUltimateHueMotion.json +0 -27
  554. package/nodes/locales/zh-CN/knxUltimateHuePlug.html +0 -50
  555. package/nodes/locales/zh-CN/knxUltimateHuePlug.json +0 -33
  556. package/nodes/locales/zh-CN/knxUltimateHueScene.html +0 -45
  557. package/nodes/locales/zh-CN/knxUltimateHueScene.json +0 -41
  558. package/nodes/locales/zh-CN/knxUltimateHueTapDial.html +0 -40
  559. package/nodes/locales/zh-CN/knxUltimateHueTapDial.json +0 -28
  560. package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.html +0 -38
  561. package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.json +0 -30
  562. package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.html +0 -39
  563. package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.json +0 -30
  564. package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.html +0 -36
  565. package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.json +0 -30
  566. package/nodes/locales/zh-CN/knxUltimateLoadControl.html +0 -76
  567. package/nodes/locales/zh-CN/knxUltimateLoadControl.json +0 -28
  568. package/nodes/locales/zh-CN/knxUltimateLogger.html +0 -126
  569. package/nodes/locales/zh-CN/knxUltimateLogger.json +0 -31
  570. package/nodes/locales/zh-CN/knxUltimateMatterBridge.html +0 -65
  571. package/nodes/locales/zh-CN/knxUltimateMatterBridge.json +0 -123
  572. package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +0 -57
  573. package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.json +0 -146
  574. package/nodes/locales/zh-CN/knxUltimateSceneController.html +0 -98
  575. package/nodes/locales/zh-CN/knxUltimateSceneController.json +0 -32
  576. package/nodes/locales/zh-CN/knxUltimateStaircase.html +0 -77
  577. package/nodes/locales/zh-CN/knxUltimateStaircase.json +0 -62
  578. package/nodes/locales/zh-CN/knxUltimateWatchDog.html +0 -178
  579. package/nodes/locales/zh-CN/knxUltimateWatchDog.json +0 -27
  580. package/nodes/locales/zh-CN/matter-config.html +0 -47
  581. package/nodes/locales/zh-CN/matter-config.json +0 -47
  582. package/nodes/locales/zh-CN/matterbridge-config.html +0 -45
  583. package/nodes/locales/zh-CN/matterbridge-config.json +0 -25
  584. package/nodes/matter-config.html +0 -578
  585. package/nodes/matter-config.js +0 -387
  586. package/nodes/matterbridge-config.html +0 -198
  587. package/nodes/matterbridge-config.js +0 -261
  588. package/nodes/plugins/knxUltimate-cerebrum-runtime-plugin.js +0 -79
  589. package/nodes/plugins/knxUltimate-migration-notice-plugin.html +0 -44
  590. package/nodes/plugins/knxUltimateAI-vue/assets/app.css +0 -1
  591. package/nodes/plugins/knxUltimateAI-vue/assets/app.js +0 -13
  592. package/nodes/plugins/knxUltimateAI-vue/assets/chunk-html2canvas.esm.js +0 -5
  593. package/nodes/plugins/knxUltimateAI-vue/assets/chunk-index.es.js +0 -5
  594. package/nodes/plugins/knxUltimateAI-vue/assets/chunk-jspdf.es.min.js +0 -79
  595. package/nodes/plugins/knxUltimateAI-vue/assets/chunk-purify.es.js +0 -3
  596. package/nodes/plugins/knxUltimateAI-vue/index.html +0 -13
  597. package/nodes/utils/HueEventStream.mjs +0 -176
  598. package/nodes/utils/colorManipulators/XYFromRGB_Supergiovane.js +0 -113
  599. package/nodes/utils/colorManipulators/hueColorConverter.js +0 -521
  600. package/nodes/utils/http.js +0 -291
  601. package/nodes/utils/hueControllerProfileAdapter.js +0 -104
  602. package/nodes/utils/hueControllerProfiles/runtime/area_motion.js +0 -221
  603. package/nodes/utils/hueControllerProfiles/runtime/button.js +0 -295
  604. package/nodes/utils/hueControllerProfiles/runtime/camera_motion.js +0 -221
  605. package/nodes/utils/hueControllerProfiles/runtime/contact.js +0 -191
  606. package/nodes/utils/hueControllerProfiles/runtime/device_power.js +0 -185
  607. package/nodes/utils/hueControllerProfiles/runtime/device_software_update.js +0 -185
  608. package/nodes/utils/hueControllerProfiles/runtime/humidity.js +0 -204
  609. package/nodes/utils/hueControllerProfiles/runtime/light.js +0 -1585
  610. package/nodes/utils/hueControllerProfiles/runtime/light_level.js +0 -180
  611. package/nodes/utils/hueControllerProfiles/runtime/motion.js +0 -185
  612. package/nodes/utils/hueControllerProfiles/runtime/plug.js +0 -344
  613. package/nodes/utils/hueControllerProfiles/runtime/relative_rotary.js +0 -271
  614. package/nodes/utils/hueControllerProfiles/runtime/scene.js +0 -352
  615. package/nodes/utils/hueControllerProfiles/runtime/temperature.js +0 -187
  616. package/nodes/utils/hueControllerProfiles/runtime/zigbee_connectivity.js +0 -185
  617. package/nodes/utils/hueControllerResourceCatalog.js +0 -71
  618. package/nodes/utils/hueEngine.mjs +0 -469
  619. package/nodes/utils/knxAiCamera.js +0 -302
  620. package/nodes/utils/knxAiCatalogRetrieval.js +0 -349
  621. package/nodes/utils/knxAiCerebrum.js +0 -406
  622. package/nodes/utils/knxAiChatContext.js +0 -496
  623. package/nodes/utils/knxAiEventHistory.js +0 -521
  624. package/nodes/utils/knxAiHomeMemory.js +0 -1021
  625. package/nodes/utils/knxAiScheduler.js +0 -445
  626. package/nodes/utils/knxAiSemanticContext.js +0 -662
  627. package/nodes/utils/knxAiTelegramVoice.js +0 -545
  628. package/nodes/utils/knxAiWebAccess.js +0 -631
  629. package/nodes/utils/lightEngines/canonicalLight.js +0 -75
  630. package/nodes/utils/lightEngines/hueLightEngine.js +0 -51
  631. package/nodes/utils/lightEngines/index.js +0 -25
  632. package/nodes/utils/lightEngines/knxLightCommand.js +0 -79
  633. package/nodes/utils/lightEngines/lightEngine.js +0 -46
  634. package/nodes/utils/lightEngines/matterHueShim.js +0 -59
  635. package/nodes/utils/lightEngines/matterLightEngine.js +0 -117
  636. package/nodes/utils/matterBridgeDeviceFactory.mjs +0 -780
  637. package/nodes/utils/matterBridgeEngine.mjs +0 -297
  638. package/nodes/utils/matterControllerCommandGate.js +0 -47
  639. package/nodes/utils/matterControllerProfiles/doorLock.js +0 -258
  640. package/nodes/utils/matterControllerProfiles/fan.js +0 -19
  641. package/nodes/utils/matterControllerProfiles/index.js +0 -34
  642. package/nodes/utils/matterControllerProfiles/mappedEndpoint.js +0 -217
  643. package/nodes/utils/matterControllerProfiles/switch.js +0 -13
  644. package/nodes/utils/matterControllerProfiles/thermostat.js +0 -19
  645. package/nodes/utils/matterControllerProfiles/universal.js +0 -462
  646. package/nodes/utils/matterControllerProfiles/windowCovering.js +0 -19
  647. package/nodes/utils/matterControllerSemanticInput.js +0 -212
  648. package/nodes/utils/matterEngine.mjs +0 -894
  649. package/nodes/utils/matterEnvironmentLock.mjs +0 -32
  650. package/nodes/utils/matterKnxConverter.js +0 -204
  651. package/nodes/utils/matterStorageBackup.js +0 -100
  652. package/resources/HA-icon.png +0 -0
  653. package/resources/dim.png +0 -0
  654. package/resources/rgb.png +0 -0
  655. package/resources/tunablewhite.png +0 -0
  656. package/resources/zxing-browser-0.2.0.min.js +0 -1
  657. package/resources/zxing-browser-LICENSE.txt +0 -21
@@ -1,967 +0,0 @@
1
- <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/11f26b4500.js"></script>
2
- <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
3
-
4
- <script type="text/javascript">
5
- (function () {
6
- let $tabs = null;
7
- let $requiresBridgeElems = null;
8
- let $knxSections = null;
9
- let $deviceName = null;
10
- let $refreshButton = null;
11
- let $loadingIndicator = null;
12
- let $enablePinsSelect = null;
13
- let $outputInfo = null;
14
- let $modeHiddenInput = null;
15
- let $dptSceneSelect = null;
16
- let $dptSceneStatusSelect = null;
17
- let $dptSceneMultiSelect = null;
18
- let $sceneValueRow = null;
19
- let cachedScenes = [];
20
- let defaultDevicePlaceholder = '';
21
- let showingNoDevicesPlaceholder = false;
22
- let currentNode = null;
23
-
24
- const EMPTY_SERVER_VALUES = new Set(['', 'none', '_add_', '__none__', '__null__', 'null', 'undefined']);
25
-
26
- const ensureVerticalTabsStyle = () => {
27
- if ($('#knxUltimateHueSceneVerticalTabs').length) return;
28
- const style = `
29
- <style id="knxUltimateHueSceneVerticalTabs">
30
- .hue-vertical-tabs.ui-tabs.ui-widget.ui-widget-content.ui-corner-all {
31
- display: flex;
32
- border: none;
33
- padding: 0;
34
- }
35
- .hue-vertical-tabs > ul.ui-tabs-nav {
36
- flex: 0 0 160px;
37
- border-right: 1px solid #ccc;
38
- border-left: none;
39
- border-top: none;
40
- border-bottom: none;
41
- padding: 0.5em 0.3em;
42
- }
43
- .hue-vertical-tabs > ul.ui-tabs-nav li {
44
- float: none;
45
- width: 100%;
46
- margin: 0 0 2px 0;
47
- }
48
- .hue-vertical-tabs > ul.ui-tabs-nav li a {
49
- display: block;
50
- width: 100%;
51
- white-space: nowrap;
52
- position: relative;
53
- border-bottom: none !important;
54
- }
55
- .hue-vertical-tabs > ul.ui-tabs-nav li.ui-tabs-active {
56
- border-bottom: none !important;
57
- }
58
- .hue-vertical-tabs > ul.ui-tabs-nav li.ui-tabs-active a::after {
59
- content: "";
60
- position: absolute;
61
- left: 0;
62
- bottom: 0;
63
- width: 50%;
64
- height: 3px;
65
- background: currentColor;
66
- }
67
- .hue-vertical-tabs .ui-tabs-panel {
68
- flex: 1;
69
- padding: 0.8em 1em;
70
- box-sizing: border-box;
71
- border: none;
72
- background: transparent;
73
- }
74
- .hue-vertical-tabs .form-row {
75
- display: flex;
76
- flex-wrap: nowrap;
77
- align-items: center;
78
- gap: 4px;
79
- }
80
- .hue-vertical-tabs .node-input-rule-container-row {
81
- align-items: stretch;
82
- }
83
- .hue-vertical-tabs #node-input-rule-container {
84
- width: 100%;
85
- min-height: 200px;
86
- }
87
- .hue-vertical-tabs .hue-form-tip {
88
- display: flex;
89
- align-items: center;
90
- gap: 6px;
91
- width: 100%;
92
- margin-left: 0 !important;
93
- max-width: none;
94
- color: #1b7d33;
95
- margin-bottom: 6px;
96
- padding: 6px 10px;
97
- box-sizing: border-box;
98
- }
99
- .hue-vertical-tabs .hue-form-tip .fa {
100
- color: forestgreen;
101
- flex: 0 0 auto;
102
- }
103
- .hue-vertical-tabs .hue-form-tip span {
104
- flex: 1 1 auto;
105
- min-width: 0;
106
- white-space: normal;
107
- }
108
- </style>`;
109
- $('head').append(style);
110
- };
111
-
112
- const detachHandlers = () => {
113
- $('#node-input-server').off('.knxUltimateHueScene');
114
- $('#node-input-serverHue').off('.knxUltimateHueScene');
115
- if ($deviceName) {
116
- $deviceName.off('.knxUltimateHueScene');
117
- if ($deviceName.data('ui-autocomplete')) {
118
- try { $deviceName.autocomplete('destroy'); } catch (error) { /* empty */ }
119
- }
120
- }
121
- if ($refreshButton) {
122
- $refreshButton.off('.knxUltimateHueScene');
123
- }
124
- ['#node-input-GAscene', '#node-input-GAsceneStatus', '#node-input-GAsceneMulti'].forEach((selector) => {
125
- const $input = $(selector);
126
- if ($input.length) {
127
- $input.off('.knxUltimateHueScene');
128
- if ($input.data('ui-autocomplete')) {
129
- try { $input.autocomplete('destroy'); } catch (error) { /* empty */ }
130
- }
131
- }
132
- });
133
- if ($enablePinsSelect) {
134
- $enablePinsSelect.off('.knxUltimateHueScene');
135
- }
136
- if ($tabs && $tabs.data('ui-tabs')) {
137
- try { $tabs.tabs('destroy'); } catch (error) { /* empty */ }
138
- }
139
- };
140
-
141
- const ensureConfigSelection = (selector) => {
142
- const $select = $(selector);
143
- if (!$select.length) return;
144
- if ($select.val() !== '_ADD_') return;
145
- try { $select.prop('selectedIndex', 0); } catch (error) { /* empty */ }
146
- };
147
-
148
- const resolveServerId = (value) => {
149
- if (value === undefined || value === null) return null;
150
- if (value === false) return null;
151
- if (typeof value === 'string') {
152
- const trimmed = value.trim();
153
- if (trimmed === '') return null;
154
- if (EMPTY_SERVER_VALUES.has(trimmed.toLowerCase())) return null;
155
- return trimmed;
156
- }
157
- const asString = String(value).trim();
158
- if (asString === '' || EMPTY_SERVER_VALUES.has(asString.toLowerCase())) return null;
159
- return value;
160
- };
161
-
162
- const getKnxServer = (allowFallback = true) => {
163
- const resolved = resolveServerId($('#node-input-server').val());
164
- if (resolved) return RED.nodes.node(resolved);
165
- if (!allowFallback) return null;
166
- const fallback = resolveServerId(currentNode ? currentNode.server : null);
167
- return fallback ? RED.nodes.node(fallback) : null;
168
- };
169
-
170
- const getHueServer = (allowFallback = true) => {
171
- const resolved = resolveServerId($('#node-input-serverHue').val());
172
- if (resolved) return RED.nodes.node(resolved);
173
- if (!allowFallback) return null;
174
- const fallback = resolveServerId(currentNode ? currentNode.serverHue : null);
175
- return fallback ? RED.nodes.node(fallback) : null;
176
- };
177
-
178
- const hasHueSelection = () => {
179
- const resolved = resolveServerId($('#node-input-serverHue').val());
180
- if (resolved) return true;
181
- if ($('#node-input-serverHue').length) return false;
182
- return resolveServerId(currentNode ? currentNode.serverHue : null) !== null;
183
- };
184
-
185
- const hasKnxSelection = () => {
186
- const resolved = resolveServerId($('#node-input-server').val());
187
- if (resolved) return true;
188
- if ($('#node-input-server').length) return false;
189
- return resolveServerId(currentNode ? currentNode.server : null) !== null;
190
- };
191
-
192
- const normalizePinsValue = (value) => {
193
- if (value === undefined || value === null) return 'yes';
194
- if (value === true || value === 'true') return 'yes';
195
- if (value === false || value === 'false') return 'no';
196
- return value === 'no' ? 'no' : 'yes';
197
- };
198
-
199
- const applyNoDevicesPlaceholder = (hasDevices) => {
200
- if (!$deviceName) return;
201
- const noDevicesText = RED._('node-red-contrib-knx-ultimate/knxUltimateHueScene:knxUltimateHueScene.no_scenes');
202
- if (!hasDevices) {
203
- if (!showingNoDevicesPlaceholder) {
204
- $deviceName.attr('placeholder', noDevicesText);
205
- showingNoDevicesPlaceholder = true;
206
- }
207
- } else if (showingNoDevicesPlaceholder) {
208
- $deviceName.attr('placeholder', defaultDevicePlaceholder);
209
- showingNoDevicesPlaceholder = false;
210
- }
211
- };
212
-
213
- const filterScenes = (list, term) => {
214
- const matcher = (term || '').replace(/exactmatch/gi, '').trim().toLowerCase();
215
- return list
216
- .filter((item) => (item.name || '').toLowerCase().includes(matcher))
217
- .map((item) => ({
218
- hueDevice: item.id,
219
- value: item.name,
220
- }));
221
- };
222
-
223
- const fetchScenes = (hueServer, term, reply, { forceRefresh = false } = {}) => {
224
- if (!hueServer) {
225
- applyNoDevicesPlaceholder(false);
226
- reply([]);
227
- return;
228
- }
229
- if (!forceRefresh && cachedScenes.length > 0) {
230
- applyNoDevicesPlaceholder(cachedScenes.length > 0);
231
- reply(filterScenes(cachedScenes, term));
232
- return;
233
- }
234
- if ($loadingIndicator) $loadingIndicator.show();
235
- const refreshQuery = forceRefresh ? '&forceRefresh=1' : '';
236
- $.getJSON(`KNXUltimateGetResourcesHUE?rtype=scene&serverId=${encodeURIComponent(hueServer.id)}${refreshQuery}&_=${Date.now()}`, (data) => {
237
- const devices = Array.isArray(data) ? data : (Array.isArray(data?.devices) ? data.devices : []);
238
- cachedScenes = devices.map((value) => ({
239
- id: value.id || value.rid,
240
- name: value.name || value.metadata?.name || '',
241
- }));
242
- if (currentNode) currentNode._cachedSceneDevices = cachedScenes;
243
- applyNoDevicesPlaceholder(cachedScenes.length > 0);
244
- reply(filterScenes(cachedScenes, term));
245
- }).always(() => {
246
- if ($loadingIndicator) $loadingIndicator.hide();
247
- }).fail(() => {
248
- cachedScenes = [];
249
- if (currentNode) currentNode._cachedSceneDevices = cachedScenes;
250
- applyNoDevicesPlaceholder(false);
251
- reply([]);
252
- });
253
- };
254
-
255
- const populateSceneValues = (node) => {
256
- const $valSelect = $('#node-input-valscene');
257
- if (!$valSelect.length) return;
258
- $valSelect.empty();
259
- for (let index = 1; index <= 64; index += 1) {
260
- $valSelect.append($('<option></option>').attr('value', index).text(`Scene ${index}`));
261
- }
262
- const target = node?.valscene || '1';
263
- $valSelect.val(target);
264
- };
265
-
266
- const toggleSceneValueVisibility = () => {
267
- if (!$dptSceneSelect || !$sceneValueRow) return;
268
- const current = $dptSceneSelect.val();
269
- if (!current) {
270
- $sceneValueRow.hide();
271
- return;
272
- }
273
- if (current.startsWith('1.')) {
274
- $sceneValueRow.hide();
275
- } else {
276
- $sceneValueRow.show();
277
- }
278
- };
279
-
280
- const loadDPTOptions = (serverCandidate, nodeRef) => {
281
- const server = (() => {
282
- const resolved = resolveServerId(serverCandidate);
283
- if (resolved) return RED.nodes.node(resolved);
284
- return getKnxServer(false);
285
- })();
286
- if (!server) return;
287
- const selects = [
288
- { element: $dptSceneSelect, filter: (value) => value.startsWith('1.') || value.startsWith('18.'), target: nodeRef?.dptscene },
289
- { element: $dptSceneStatusSelect, filter: (value) => value.startsWith('1.'), target: nodeRef?.dptsceneStatus },
290
- { element: $dptSceneMultiSelect, filter: (value) => value.startsWith('18.'), target: nodeRef?.dptsceneMulti },
291
- ];
292
- selects.forEach(({ element }) => { if (element) element.empty(); });
293
- $.getJSON(`knxUltimateDpts?serverId=${server.id}`, (data) => {
294
- data.forEach((dpt) => {
295
- selects.forEach(({ element, filter }) => {
296
- if (!element || !filter(dpt.value)) return;
297
- element.append($('<option></option>').attr('value', dpt.value).text(dpt.text));
298
- });
299
- });
300
- selects.forEach(({ element, target }) => {
301
- if (!element || !element.children().length) return;
302
- const resolved = target && target !== '' ? target : element.children().first().attr('value');
303
- if (resolved !== undefined) element.val(resolved);
304
- });
305
- toggleSceneValueVisibility();
306
- });
307
- };
308
-
309
- const setupKnxAutocomplete = (options) => {
310
- const {
311
- inputSelector,
312
- nameSelector,
313
- dptSelector,
314
- allowedPrefixes,
315
- } = options;
316
- const $input = $(inputSelector);
317
- if (!$input.length) return;
318
- const $name = nameSelector ? $(nameSelector) : null;
319
- const $dptSelect = dptSelector ? $(dptSelector) : null;
320
- if ($input.data('ui-autocomplete')) {
321
- try { $input.autocomplete('destroy'); } catch (error) { /* empty */ }
322
- }
323
- $input.autocomplete({
324
- minLength: 0,
325
- source(request, response) {
326
- const server = getKnxServer(false);
327
- if (!server) {
328
- response([]);
329
- return;
330
- }
331
- $.getJSON(`knxUltimatecsv?nodeID=${server.id}`, (data) => {
332
- const matches = [];
333
- data.forEach((value) => {
334
- if (!value.dpt) return;
335
- if (Array.isArray(allowedPrefixes) && !allowedPrefixes.some((prefix) => value.dpt.startsWith(prefix))) return;
336
- const sSearch = `${value.ga} (${value.devicename}) DPT${value.dpt}`;
337
- if (htmlUtilsfullCSVSearch(sSearch, request.term)) {
338
- matches.push({
339
- label: `${value.ga} # ${value.devicename} # ${value.dpt}`,
340
- value: value.ga,
341
- });
342
- }
343
- });
344
- response(matches);
345
- });
346
- },
347
- select(event, ui) {
348
- if ($name) {
349
- let sDevName = ui.item.label.split('#')[1]?.trim() || '';
350
- try {
351
- sDevName = sDevName.substr(sDevName.indexOf(')') + 1).trim();
352
- } catch (error) { /* empty */ }
353
- $name.val(sDevName);
354
- }
355
- if ($dptSelect) {
356
- const dptLabel = ui.item.label.split('#')[2]?.trim();
357
- const optVal = dptLabel ? $dptSelect.find(`option:contains('${dptLabel}')`).attr('value') : undefined;
358
- if (optVal !== undefined && optVal !== null) {
359
- $dptSelect.val(optVal).trigger('change');
360
- } else {
361
- $dptSelect.trigger('change');
362
- }
363
- }
364
- },
365
- });
366
- $input.on('focus.knxUltimateHueScene', function () {
367
- $(this).autocomplete('search', `${$(this).val()}exactmatch`);
368
- });
369
- const server = getKnxServer(false);
370
- if (server && server.id) {
371
- try { KNX_enableSecureFormatting($input, server.id); } catch (error) { /* empty */ }
372
- }
373
- };
374
-
375
- const setupEditableList = (node) => {
376
- const $list = $('#node-input-rule-container');
377
- if (!$list.length) return;
378
- if ($list.data('editableList')) {
379
- try { $list.editableList('destroy'); } catch (error) { /* empty */ }
380
- }
381
- const resizeRule = () => { /* empty */ };
382
- $list.editableList({
383
- addButton: true,
384
- removable: true,
385
- sortable: true,
386
- scrollOnAdd: true,
387
- addItem(container, i, opt) {
388
- if (!opt.hasOwnProperty('r')) opt.r = {};
389
- const rule = opt.r;
390
- const row = $('<div class="form-row"/>').appendTo(container);
391
- const rowRuleKNXSceneNumber = $('<select/>', {
392
- class: 'rowRuleKNXSceneNumber',
393
- style: 'width:25%; margin-left:5px; text-align:left;',
394
- }).appendTo(row);
395
- const rowRuleHUESceneName = $('<input/>', {
396
- class: 'rowRuleHUESceneName',
397
- type: 'text',
398
- placeholder: RED._('node-red-contrib-knx-ultimate/knxUltimateHueScene:knxUltimateHueScene.multi_scene_placeholder'),
399
- style: 'width:45%; margin-left:5px; text-align:left;',
400
- }).appendTo(row);
401
- const rowRuleHUESceneID = $('<input/>', {
402
- class: 'rowRuleHUESceneID',
403
- type: 'hidden',
404
- }).appendTo(row);
405
- const rowRuleRecallAs = $('<select/>', {
406
- class: 'rowRuleRecallAs',
407
- style: 'width:25%; margin-left:5px; text-align:left;',
408
- }).appendTo(row);
409
- const finalspan = $('<span/>').appendTo(row);
410
- finalspan.append('<span class="node-input-rule-index"></span> ');
411
-
412
- for (let index = 1; index <= 64; index += 1) {
413
- rowRuleKNXSceneNumber.append(
414
- $('<option></option>')
415
- .val(index)
416
- .text(node._('knxUltimateHueScene.knx_scene_n') + index.toString()),
417
- );
418
- }
419
- rowRuleRecallAs.append(
420
- $('<option></option>').val('active').text(node._('knxUltimateHueScene.recall_active')),
421
- );
422
- rowRuleRecallAs.append(
423
- $('<option></option>').val('dynamic_palette').text(node._('knxUltimateHueScene.recall_dynamic')),
424
- );
425
- rowRuleRecallAs.append(
426
- $('<option></option>').val('static').text(node._('knxUltimateHueScene.recall_static')),
427
- );
428
-
429
- rowRuleKNXSceneNumber.val(rule.rowRuleKNXSceneNumber);
430
- rowRuleRecallAs.val(rule.rowRuleRecallAs);
431
- rowRuleHUESceneName.val(rule.rowRuleHUESceneName);
432
- rowRuleHUESceneID.val(rule.rowRuleHUESceneID);
433
-
434
- rowRuleHUESceneName.autocomplete({
435
- minLength: 0,
436
- source(request, response) {
437
- const hueServer = getHueServer(false);
438
- if (!hueServer) { response([]); return; }
439
- fetchScenes(hueServer, request.term, response);
440
- },
441
- select(event, ui) {
442
- rowRuleHUESceneID.val(ui.item.hueDevice);
443
- },
444
- });
445
- rowRuleHUESceneName.on('focus.knxUltimateHueScene', function () {
446
- $(this).autocomplete('search', `${$(this).val()}exactmatch`);
447
- });
448
- },
449
- removeItem() {},
450
- resizeItem: resizeRule,
451
- sortItems() {},
452
- });
453
-
454
- $list.editableList('empty');
455
- if (Array.isArray(node.rules)) {
456
- node.rules.forEach((rule, index) => {
457
- $list.editableList('addItem', { r: rule, i: index });
458
- });
459
- }
460
- };
461
-
462
- const updateTabsVisibility = () => {
463
- if (!$tabs) return;
464
- const hueSelected = hasHueSelection();
465
- const knxSelected = hasKnxSelection();
466
- if ($requiresBridgeElems) {
467
- if (hueSelected) {
468
- $requiresBridgeElems.show();
469
- } else {
470
- $requiresBridgeElems.hide();
471
- }
472
- }
473
- if (hueSelected && knxSelected) {
474
- $tabs.show();
475
- $tabs.tabs('refresh');
476
- } else {
477
- $tabs.hide();
478
- }
479
- if ($outputInfo) {
480
- if (knxSelected) {
481
- $outputInfo.hide();
482
- } else {
483
- $outputInfo.show();
484
- }
485
- }
486
- if ($enablePinsSelect && $enablePinsSelect.length) {
487
- const desiredPins = knxSelected ? 'no' : 'yes';
488
- if ($enablePinsSelect.val() !== desiredPins) {
489
- $enablePinsSelect.val(desiredPins).trigger('change');
490
- }
491
- }
492
- };
493
-
494
- const updateKnxVisibility = () => {
495
- const knxSelected = hasKnxSelection();
496
- if ($knxSections) {
497
- if (knxSelected) {
498
- $knxSections.show();
499
- } else {
500
- $knxSections.hide();
501
- }
502
- }
503
- updateTabsVisibility();
504
- };
505
-
506
- const updatePinsState = () => {
507
- if (!$enablePinsSelect || !currentNode) return;
508
- const val = normalizePinsValue($enablePinsSelect.val());
509
- currentNode.enableNodePINS = val;
510
- currentNode.outputs = val === 'yes' ? 1 : 0;
511
- currentNode.inputs = currentNode.outputs;
512
- };
513
-
514
- RED.nodes.registerType('knxUltimateHueScene', {
515
- category: 'deprecated',
516
- color: '#E7E9F6',
517
- defaults: {
518
- server: { type: 'knxUltimate-config', required: false },
519
- serverHue: { type: 'hue-config', required: true },
520
- name: { value: '' },
521
- namescene: { value: '' },
522
- GAscene: { value: '' },
523
- dptscene: { value: '' },
524
- valscene: { value: '1' },
525
- namesceneStatus: { value: '' },
526
- GAsceneStatus: { value: '' },
527
- dptsceneStatus: { value: '' },
528
- enableNodePINS: { value: 'no' },
529
- outputs: { value: 0 },
530
- inputs: { value: 0 },
531
- hueDevice: { value: '' },
532
- hueSceneRecallType: { value: 'active' },
533
- GAsceneMulti: { value: '' },
534
- namesceneMulti: { value: '' },
535
- dptsceneMulti: { value: '' },
536
- rules: { value: [{ t: 'eq', v: '', vt: 'str' }] },
537
- selectedModeTabNumber: { value: 0 },
538
- },
539
- inputs: 0,
540
- outputs: 0,
541
- icon: 'node-hue-icon.svg',
542
- label() {
543
- let nodeLabel = this.name;
544
- if (Number(this.selectedModeTabNumber) === 0) nodeLabel = this.name || this.namescene || 'Hue Scene';
545
- if (Number(this.selectedModeTabNumber) === 1) nodeLabel = this.namesceneMulti || this.name || 'Hue Scene';
546
- return `${nodeLabel || 'Hue Scene'} (deprecated)`;
547
- },
548
- paletteLabel: 'Hue Scene (deprecated)',
549
- oneditprepare() {
550
- const node = this;
551
- try {
552
- onEditPrepareCore.call(node);
553
- } catch (error) {
554
- try {
555
- console.error('knxUltimateHueScene oneditprepare error', error);
556
- RED.notify(`Hue Scene editor error: ${error.message || error}`, { type: 'error', timeout: 8000 });
557
- } catch (notifyError) {
558
- console.error('knxUltimateHueScene notify failure', notifyError);
559
- }
560
- throw error;
561
- }
562
- },
563
- oneditsave() {
564
- try { onEditSaveCore.call(this); } catch (error) {
565
- console.error('knxUltimateHueScene oneditsave error', error);
566
- throw error;
567
- }
568
- },
569
- oneditcancel() {
570
- try { onEditCancelCore.call(this); } catch (error) {
571
- console.error('knxUltimateHueScene oneditcancel error', error);
572
- throw error;
573
- }
574
- },
575
- oneditresize() {},
576
- });
577
-
578
- function onEditPrepareCore() {
579
- const node = this;
580
- try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
581
- currentNode = node;
582
-
583
- ensureConfigSelection('#node-input-serverHue');
584
- ensureVerticalTabsStyle();
585
-
586
- $tabs = $('#hue-scene-tabs');
587
- $requiresBridgeElems = $('.hue-requires-bridge');
588
- $knxSections = $('.hue-knx-section');
589
- $deviceName = $('#node-input-name');
590
- $refreshButton = $('.hue-refresh-devices');
591
- $loadingIndicator = $('.hue-devices-loading');
592
- $enablePinsSelect = $('#node-input-enableNodePINS');
593
- $outputInfo = $('.hue-output-info');
594
- $modeHiddenInput = $('#node-input-selectedModeTabNumber');
595
- $dptSceneSelect = $('#node-input-dptscene');
596
- $dptSceneStatusSelect = $('#node-input-dptsceneStatus');
597
- $dptSceneMultiSelect = $('#node-input-dptsceneMulti');
598
- $sceneValueRow = $('#divValScene');
599
-
600
- cachedScenes = Array.isArray(node._cachedSceneDevices) ? node._cachedSceneDevices : [];
601
- node._cachedSceneDevices = cachedScenes;
602
-
603
- defaultDevicePlaceholder = $deviceName.attr('placeholder') || '';
604
- showingNoDevicesPlaceholder = false;
605
- applyNoDevicesPlaceholder(cachedScenes.length > 0);
606
-
607
- populateSceneValues(node);
608
-
609
- $tabs.addClass('hue-vertical-tabs');
610
- const initialTab = Number(node.selectedModeTabNumber || 0);
611
- if ($modeHiddenInput) {
612
- $modeHiddenInput.val(Number.isNaN(initialTab) ? 0 : initialTab);
613
- }
614
- $tabs.tabs({
615
- activate(event, ui) {
616
- const index = ui.newTab.index();
617
- if ($modeHiddenInput) $modeHiddenInput.val(index);
618
- node.selectedModeTabNumber = index;
619
- },
620
- active: Number.isNaN(initialTab) ? 0 : initialTab,
621
- });
622
- $tabs.find('li').removeClass('ui-corner-top').addClass('ui-corner-left');
623
-
624
- $('#node-input-hueSceneRecallType').val(node.hueSceneRecallType || 'active');
625
-
626
- const initialServerDomValue = $('#node-input-server').val();
627
- const initialServerId = initialServerDomValue === undefined ? node.server : initialServerDomValue;
628
- loadDPTOptions(initialServerId, node);
629
-
630
- setupKnxAutocomplete({
631
- inputSelector: '#node-input-GAscene',
632
- nameSelector: '#node-input-namescene',
633
- dptSelector: '#node-input-dptscene',
634
- allowedPrefixes: ['1.', '18.'],
635
- });
636
- setupKnxAutocomplete({
637
- inputSelector: '#node-input-GAsceneStatus',
638
- nameSelector: '#node-input-namesceneStatus',
639
- dptSelector: '#node-input-dptsceneStatus',
640
- allowedPrefixes: ['1.'],
641
- });
642
- setupKnxAutocomplete({
643
- inputSelector: '#node-input-GAsceneMulti',
644
- nameSelector: '#node-input-namesceneMulti',
645
- dptSelector: '#node-input-dptsceneMulti',
646
- allowedPrefixes: ['18.'],
647
- });
648
-
649
- $('#node-input-dptscene').on('change.knxUltimateHueScene', toggleSceneValueVisibility);
650
- toggleSceneValueVisibility();
651
-
652
- setupEditableList(node);
653
-
654
- if ($deviceName) {
655
- $deviceName.autocomplete({
656
- minLength: 0,
657
- source(request, response) {
658
- const hueServer = getHueServer(false);
659
- if (!hueServer) { response([]); return; }
660
- fetchScenes(hueServer, request.term, response);
661
- },
662
- select(event, ui) {
663
- $('#node-input-hueDevice').val(ui.item.hueDevice);
664
- updateTabsVisibility();
665
- },
666
- });
667
- $deviceName.on('focus.knxUltimateHueScene', function () {
668
- $(this).autocomplete('search', `${$(this).val()}exactmatch`);
669
- });
670
- }
671
-
672
- if ($refreshButton) {
673
- $refreshButton.on('click.knxUltimateHueScene', () => {
674
- cachedScenes = [];
675
- if (currentNode) currentNode._cachedSceneDevices = cachedScenes;
676
- const hueServer = getHueServer(false);
677
- if (!hueServer) return;
678
- fetchScenes(hueServer, '', () => {
679
- if ($deviceName) {
680
- $deviceName.autocomplete('search', `${$deviceName.val()}exactmatch`);
681
- }
682
- }, { forceRefresh: true });
683
- });
684
- }
685
-
686
- if ($enablePinsSelect) {
687
- $enablePinsSelect.val(normalizePinsValue(node.enableNodePINS));
688
- $enablePinsSelect.on('change.knxUltimateHueScene', updatePinsState);
689
- updatePinsState();
690
- }
691
-
692
- $('#node-input-server').on('change.knxUltimateHueScene', function () {
693
- const serverId = $(this).val();
694
- loadDPTOptions(serverId, node);
695
- setupKnxAutocomplete({
696
- inputSelector: '#node-input-GAscene',
697
- nameSelector: '#node-input-namescene',
698
- dptSelector: '#node-input-dptscene',
699
- allowedPrefixes: ['1.', '18.'],
700
- });
701
- setupKnxAutocomplete({
702
- inputSelector: '#node-input-GAsceneStatus',
703
- nameSelector: '#node-input-namesceneStatus',
704
- dptSelector: '#node-input-dptsceneStatus',
705
- allowedPrefixes: ['1.'],
706
- });
707
- setupKnxAutocomplete({
708
- inputSelector: '#node-input-GAsceneMulti',
709
- nameSelector: '#node-input-namesceneMulti',
710
- dptSelector: '#node-input-dptsceneMulti',
711
- allowedPrefixes: ['18.'],
712
- });
713
- updateKnxVisibility();
714
- });
715
-
716
- $('#node-input-serverHue').on('change.knxUltimateHueScene', () => {
717
- cachedScenes = [];
718
- if (currentNode) currentNode._cachedSceneDevices = cachedScenes;
719
- if ($deviceName) {
720
- $deviceName.val('');
721
- $('#node-input-hueDevice').val('');
722
- applyNoDevicesPlaceholder(false);
723
- }
724
- updateTabsVisibility();
725
- });
726
-
727
- updateKnxVisibility();
728
- }
729
-
730
- function onEditSaveCore() {
731
- try { RED.sidebar.show('info'); } catch (error) { /* empty */ }
732
- detachHandlers();
733
- cachedScenes = cachedScenes || [];
734
- const pinsSelection = $enablePinsSelect ? normalizePinsValue($enablePinsSelect.val()) : 'no';
735
- this.enableNodePINS = pinsSelection;
736
- this.outputs = pinsSelection === 'yes' ? 1 : 0;
737
- this.inputs = this.outputs;
738
- this._cachedSceneDevices = cachedScenes;
739
- if ($modeHiddenInput) {
740
- const idx = parseInt($modeHiddenInput.val(), 10);
741
- this.selectedModeTabNumber = Number.isNaN(idx) ? 0 : idx;
742
- }
743
- const self = this;
744
- const rules = $('#node-input-rule-container').editableList('items');
745
- self.rules = [];
746
- rules.each(function () {
747
- const rule = $(this);
748
- const rowRuleKNXSceneNumber = rule.find('.rowRuleKNXSceneNumber').val();
749
- const rowRuleHUESceneName = rule.find('.rowRuleHUESceneName').val();
750
- const rowRuleHUESceneID = rule.find('.rowRuleHUESceneID').val();
751
- const rowRuleRecallAs = rule.find('.rowRuleRecallAs').val();
752
- self.rules.push({
753
- rowRuleKNXSceneNumber,
754
- rowRuleHUESceneName,
755
- rowRuleHUESceneID,
756
- rowRuleRecallAs,
757
- });
758
- });
759
- currentNode = null;
760
- }
761
-
762
- function onEditCancelCore() {
763
- try { RED.sidebar.show('info'); } catch (error) { /* empty */ }
764
- detachHandlers();
765
- cachedScenes = [];
766
- if (currentNode) currentNode._cachedSceneDevices = cachedScenes;
767
- currentNode = null;
768
- }
769
- }());
770
- </script>
771
-
772
- <script type="text/html" data-template-name="knxUltimateHueScene">
773
- <div class="form-row knx-ultimate-v8-upgrade-row">
774
- <button type="button" class="red-ui-button knx-ultimate-v8-upgrade-button" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.v8_upgrade.button_title">
775
- <i class="fa fa-arrow-circle-up" aria-hidden="true"></i>
776
- <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.v8_upgrade.button"></span>
777
- </button>
778
- </div>
779
- <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;">
780
- <i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#a15c00; margin-right:6px;"></i>
781
- <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.legacy_node_notice"></span>
782
- </div>
783
- <div class="form-row hue-legacy-migration-action" style="margin-top:-6px; margin-bottom:14px;">
784
- <a class="hue-legacy-migration-video" href="https://youtu.be/f0Evf2QFI7c" target="_blank" rel="noopener noreferrer" style="display:inline-flex; align-items:center; gap:5px; margin-right:10px;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_video_title">
785
- <i class="fa fa-youtube-play" aria-hidden="true" style="color:#ff0000;"></i>
786
- <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_video"></span>
787
- </a>
788
- <button type="button" class="red-ui-button hue-legacy-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff !important; font-weight:700;" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button_title">
789
- <i class="fa fa-exchange"></i> <span data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_button"></span>
790
- </button>
791
- <div class="form-tips hue-controller-migration-disclaimer" style="margin-top:8px;" data-i18n="node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.migration_disclaimer"></div>
792
- </div>
793
- <div class="form-row" style="margin-bottom:10px;">
794
- <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>
795
- </div>
796
- <input type="hidden" id="node-input-selectedModeTabNumber">
797
- <div class="form-row">
798
- <label for="node-input-server">
799
- <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" />
800
- <span data-i18n="common.knx_gw"></span>
801
- </label>
802
- <input type="text" id="node-input-server">
803
- </div>
804
-
805
- <div class="form-row">
806
- <label for="node-input-serverHue">
807
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABFUlEQVQ4EZWSsWoCQRCG1yiENEFEi6QSkjqWWoqFoBYJ+Br6JHkMn8Iibd4ihQpaJIhWNkry/ZtdGZY78Qa+m39nZ+dm9s4550awglNBluS/gVtAX6KgDclf68w2OThgfR9iT/jnoEv4TtByDThWTCDKW4SSZTf/zj9/eZbN+izTDuKGimu0vPF8B/YN8aC8LmcOj/AAn9CFTEs70Js/oGqy79C69bqJ5XbQI2kGO5N8QL9D08S8zBtBF5ZaVsznpCMoqJnVdjTpb1Db0fwIWmQV6BLXzFOYgA6/gDVfQN9bBWp2J2hdWDPoBV5FrKnAJutHikk/CHHR8i7x4iG7qQ720IYvu3GFbpHjx3pFrOFYkA354z/5bkK826phyAAAAABJRU5ErkJggg=="/>
808
- <span data-i18n="common.hue_bridge"></span>
809
- </label>
810
- <input type="text" id="node-input-serverHue">
811
- </div>
812
-
813
- <div class="form-row hue-requires-bridge">
814
- <label for="node-input-name">
815
- <i class="fa fa-play-circle"></i> <span data-i18n="knxUltimateHueScene.hue_scene"></span>
816
- </label>
817
- <input type="text" id="node-input-name" placeholder="Hue scene" style="flex:1 1 240px; min-width:240px; max-width:240px;">
818
- <button type="button" class="red-ui-button hue-refresh-devices" style="margin-left:6px; color:#1b7d33; border-color:#1b7d33;">
819
- <i class="fa fa-sync"></i>
820
- </button>
821
- <span class="hue-devices-loading" style="margin-left:6px; display:none; color:#1b7d33;">
822
- <i class="fa fa-circle-notch fa-spin"></i>
823
- </span>
824
- </div>
825
-
826
- <div id="hue-scene-tabs">
827
- <ul>
828
- <li><a href="#hue-scene-tab-single"><i class="fa fa-map"></i> <span data-i18n="knxUltimateHueScene.tabs.single"></span></a></li>
829
- <li><a href="#hue-scene-tab-multi"><i class="fa fa-list"></i> <span data-i18n="knxUltimateHueScene.tabs.multi"></span></a></li>
830
- <li><a href="#hue-scene-tab-behaviour"><i class="fa fa-gear"></i> <span data-i18n="knxUltimateHueScene.tabs.behaviour"></span></a></li>
831
- </ul>
832
-
833
- <div id="hue-scene-tab-single">
834
- <div class="form-tips hue-form-tip hue-requires-bridge">
835
- <i class="fa fa-circle-info"></i>
836
- <span data-i18n="knxUltimateHueScene.single_info"></span>
837
- </div>
838
- <div class="form-row hue-requires-bridge">
839
- <label for="node-input-hueSceneRecallType" style="width:220px;">
840
- <i class="fa fa-bolt"></i> <span data-i18n="knxUltimateHueScene.recall_as"></span>
841
- </label>
842
- <select id="node-input-hueSceneRecallType" style="width:200px;">
843
- <option value="active" data-i18n="knxUltimateHueScene.recall_active"></option>
844
- <option value="dynamic_palette" data-i18n="knxUltimateHueScene.recall_dynamic"></option>
845
- <option value="static" data-i18n="knxUltimateHueScene.recall_static"></option>
846
- </select>
847
- </div>
848
-
849
- <div class="form-tips hue-form-tip hue-knx-section">
850
- <i class="fa fa-circle-info"></i>
851
- <span data-i18n="knxUltimateHueScene.mapping_info"></span>
852
- </div>
853
- <div class="form-row hue-knx-section">
854
- <label for="node-input-GAscene" style="width:70px;"><span data-i18n="common.ga"></span></label>
855
- <input type="text" id="node-input-GAscene" placeholder="1/1/1" style="width:80px; text-align:left;">
856
- <label for="node-input-dptscene" style="width:40px; text-align:right;"><span data-i18n="common.dpt"></span></label>
857
- <select id="node-input-dptscene" style="width:130px;"></select>
858
- <label for="node-input-namescene" style="width:50px; text-align:right;"><span data-i18n="common.name"></span></label>
859
- <input type="text" id="node-input-namescene" style="flex:1 1 140px; min-width:120px; text-align:left;" placeholder="Scene recall">
860
- </div>
861
- <div class="form-row hue-knx-section" id="divValScene" style="display:none;">
862
- <label for="node-input-valscene" style="width:70px;">#</label>
863
- <select id="node-input-valscene" style="width:130px;"></select>
864
- </div>
865
- <div class="form-row hue-knx-section">
866
- <label for="node-input-GAsceneStatus" style="width:70px;"><span data-i18n="knxUltimateHueScene.status_ga"></span></label>
867
- <input type="text" id="node-input-GAsceneStatus" placeholder="1/1/1" style="width:80px; text-align:left;">
868
- <label for="node-input-dptsceneStatus" style="width:40px; text-align:right;"><span data-i18n="common.dpt"></span></label>
869
- <select id="node-input-dptsceneStatus" style="width:130px;"></select>
870
- <label for="node-input-namesceneStatus" style="width:50px; text-align:right;"><span data-i18n="common.name"></span></label>
871
- <input type="text" id="node-input-namesceneStatus" style="flex:1 1 140px; min-width:120px; text-align:left;" placeholder="Scene status">
872
- </div>
873
- </div>
874
-
875
- <div id="hue-scene-tab-multi">
876
- <div class="form-tips hue-form-tip hue-knx-section">
877
- <i class="fa fa-circle-info"></i>
878
- <span data-i18n="knxUltimateHueScene.multi_info"></span>
879
- </div>
880
- <div class="form-row hue-knx-section">
881
- <label for="node-input-GAsceneMulti" style="width:70px;"><span data-i18n="common.ga"></span></label>
882
- <input type="text" id="node-input-GAsceneMulti" placeholder="1/1/1" style="width:80px; text-align:left;">
883
- <label for="node-input-dptsceneMulti" style="width:40px; text-align:right;"><span data-i18n="common.dpt"></span></label>
884
- <select id="node-input-dptsceneMulti" style="width:130px;"></select>
885
- <label for="node-input-namesceneMulti" style="width:50px; text-align:right;"><span data-i18n="common.name"></span></label>
886
- <input type="text" id="node-input-namesceneMulti" style="flex:1 1 140px; min-width:120px; text-align:left;" placeholder="Multi-scene">
887
- </div>
888
- <div class="form-row hue-knx-section">
889
- <label style="width:100%;"><i class="fa fa-code-fork"></i> <span data-i18n="knxUltimateHueScene.scene_selector"></span></label>
890
- </div>
891
- <div class="form-row hue-knx-section node-input-rule-container-row">
892
- <ol id="node-input-rule-container"></ol>
893
- </div>
894
- </div>
895
-
896
- <div id="hue-scene-tab-behaviour">
897
- <div class="form-tips hue-form-tip">
898
- <i class="fa fa-circle-info"></i>
899
- <span data-i18n="knxUltimateHueScene.behaviour_info"></span>
900
- </div>
901
- <div class="form-row">
902
- <label for="node-input-enableNodePINS" style="width:220px;">
903
- <i class="fa fa-code"></i> <span data-i18n="knxUltimateHueScene.node_pins"></span>
904
- </label>
905
- <select id="node-input-enableNodePINS" style="width:200px;">
906
- <option value="yes" data-i18n="knxUltimateHueScene.node_pins_show"></option>
907
- <option value="no" data-i18n="knxUltimateHueScene.node_pins_hide"></option>
908
- </select>
909
- </div>
910
- </div>
911
- </div>
912
-
913
- <div class="form-tips hue-form-tip hue-output-info" style="display:none;">
914
- <i class="fa fa-circle-info"></i>
915
- <span data-i18n="knxUltimateHueScene.output_info"></span>
916
- </div>
917
-
918
- <input type="hidden" id="node-input-hueDevice">
919
- </script>
920
-
921
-
922
- <script type="text/markdown" data-help-name="knxUltimateHueScene">
923
- ### Upgrade to KNX Ultimate 8
924
-
925
- Version 7 shows a compact **Upgrade to v8** button at the top of this editor. It downloads a flow backup, installs the required HUE/Matter packages, converts compatible nodes, performs a full Deploy, verifies the saved flows and installs version 8. Restart the Node-RED service when prompted; reloading only the browser is not enough. Legacy KNX AI nodes stop the automatic operation.
926
-
927
- [Full upgrade guide](https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/Upgrade-to-v8)
928
-
929
- <br/>
930
-
931
- > **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.
932
-
933
- The **Hue Scene** node exposes Hue scenes to KNX and can forward the raw Hue events to a Node-RED flow. The scene field supports autocomplete; use the refresh icon after adding scenes on the bridge so the list stays up to date.
934
-
935
- ### Tabs at a glance
936
-
937
- - **Mapping** - link KNX group addresses to the selected Hue scene. DPT 1.xxx performs boolean recall, while DPT 18.xxx sends a KNX scene number.
938
- - **Multi scene** - build a rule list that associates KNX scene numbers with different Hue scenes and chooses whether each scene is recalled as _active_, _dynamic\_palette_ or _static_.
939
- - **Behaviour** - toggle the Node-RED output pin. When no KNX gateway is configured the pin remains enabled so bridge events still reach the flow.
940
-
941
- ### General settings
942
-
943
- |Property|Description|
944
- |--|--|
945
- | KNX GW | KNX gateway supplying the address catalogue used for autocomplete. |
946
- | Hue Bridge | Hue Bridge that hosts the scenes. |
947
- | Hue Scene | Scene to recall (autocomplete; refresh button reloads the bridge catalogue). |
948
-
949
- ### Mapping tab
950
-
951
- |Property|Description|
952
- |--|--|
953
- | Recall | KNX group address that recalls the scene. Use DPT 1.xxx for boolean control or DPT 18.xxx to transmit a KNX scene number. |
954
- | DPT | Datapoint used with the recall GA (1.xxx or 18.001). |
955
- | Name | Friendly label for the recall GA. |
956
- | # | Appears when a KNX scene DPT is chosen; select the KNX scene number to send. |
957
- | Status GA | Optional boolean GA that mirrors whether the scene is currently active. |
958
-
959
- ### Multi scene tab
960
-
961
- |Property|Description|
962
- |--|--|
963
- | Recall | KNX GA (DPT 18.001) that selects scenes by number. |
964
- | Scene selector | Editable list that maps KNX scene numbers to Hue scenes with the desired recall mode. Drag handles reorder entries. |
965
-
966
- > ℹ️ KNX-specific widgets only appear after a KNX gateway is selected. The Mapping tabs remain hidden until both the bridge and the gateway are configured.
967
- </script>