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,846 +0,0 @@
1
- /* eslint-disable camelcase */
2
- /* eslint-disable no-underscore-dangle */
3
- /* eslint-disable no-lonely-if */
4
- /* eslint-disable no-param-reassign */
5
- /* eslint-disable no-inner-declarations */
6
- /* eslint-disable max-len */
7
- const cloneDeep = require('lodash/cloneDeep')
8
- const LoggerClass = require('./utils/sysLogger')
9
- const {
10
- HUE_CONTROLLER_RESOURCE_TYPES,
11
- buildHueControllerResourceCatalog
12
- } = require('./utils/hueControllerResourceCatalog')
13
- // const classHUE = require("./utils/hueEngine").classHUE;
14
- const hueColorConverter = require('./utils/colorManipulators/hueColorConverter')
15
-
16
- module.exports = (RED) => {
17
- function hueConfig (config) {
18
- RED.nodes.createNode(this, config)
19
- const node = this
20
- node.host = config.host
21
- node.nodeClients = [] // Stores the registered clients
22
- node.loglevel = config.loglevel !== undefined ? config.loglevel : 'error' // loglevel doesn'e exists yet
23
- node.sysLogger = null
24
- node.hueAllResources = undefined
25
- node.timerHUEConfigCheckState = null // Timer that check the connection to the hue bridge every xx seconds
26
- node.pendingHueResourceReload = null
27
- node.activeHueIdentifySessions = new Map()
28
- try {
29
- node.sysLogger = new LoggerClass({ loglevel: node.loglevel, setPrefix: 'hue-config.js' })
30
- } catch (error) { console.log(error.stack) }
31
- node.name = config.name === undefined || config.name === '' ? node.host : config.name
32
-
33
- // Helper not to write everytime the "node.hueManager === null || node.hueManager === "undefined" || node.hueManager.HUEBridgeConnectionStatus === undefined"
34
- Object.defineProperty(node, 'linkStatus', {
35
- get: function () {
36
- return node.hueManager?.HUEBridgeConnectionStatus ?? 'disconnected'
37
- }
38
- })
39
-
40
- // Connect to Bridge and get the resources
41
- const HUE_IDENTIFY_DEFAULT_INTERVAL_MS = 2000
42
- const HUE_IDENTIFY_MAX_DURATION_MS = 600000
43
-
44
- node.isHueIdentifySessionActive = (sessionKey) => {
45
- if (!sessionKey) return false
46
- return node.activeHueIdentifySessions.has(sessionKey)
47
- }
48
-
49
- node.stopHueIdentifySession = (sessionKey, reason = 'manual') => {
50
- if (!sessionKey) return false
51
- const session = node.activeHueIdentifySessions.get(sessionKey)
52
- if (!session) return false
53
- try {
54
- if (session.intervalHandle) {
55
- clearInterval(session.intervalHandle)
56
- }
57
- if (session.timeoutHandle) {
58
- clearTimeout(session.timeoutHandle)
59
- }
60
- node.activeHueIdentifySessions.delete(sessionKey)
61
- session.intervalHandle = null
62
- session.timeoutHandle = null
63
- if (typeof session.onStop === 'function') {
64
- try { session.onStop(reason) } catch (error) { node.sysLogger?.warn(`Hue identify session stop callback error: ${error.message}`) }
65
- }
66
- return true
67
- } catch (error) {
68
- node.sysLogger?.warn(`Hue identify session stop error: ${error.message}`)
69
- return false
70
- }
71
- }
72
-
73
- node.stopAllHueIdentifySessions = (reason = 'manual') => {
74
- const keys = Array.from(node.activeHueIdentifySessions.keys())
75
- keys.forEach((key) => {
76
- node.stopHueIdentifySession(key, reason)
77
- })
78
- }
79
-
80
- node.startHueIdentifySession = async ({
81
- sessionKey,
82
- targets,
83
- intervalMs = HUE_IDENTIFY_DEFAULT_INTERVAL_MS,
84
- maxDurationMs = HUE_IDENTIFY_MAX_DURATION_MS
85
- }) => {
86
- if (!sessionKey) return false
87
- if (!Array.isArray(targets) || targets.length === 0) return false
88
- node.stopHueIdentifySession(sessionKey, 'restart')
89
- const resolvedInterval = HUE_IDENTIFY_DEFAULT_INTERVAL_MS
90
- const resolvedDuration = HUE_IDENTIFY_MAX_DURATION_MS
91
- const session = {
92
- sessionKey,
93
- targets,
94
- intervalMs: resolvedInterval,
95
- maxDurationMs: resolvedDuration,
96
- startedAt: Date.now(),
97
- inFlight: false,
98
- intervalHandle: null,
99
- timeoutHandle: null,
100
- onStop: (reason) => {
101
- node.sysLogger?.debug(`Hue identify session ${sessionKey} stopped (${reason})`)
102
- }
103
- }
104
-
105
- session.runIdentify = async (label = 'interval') => {
106
- if (session.inFlight) return { attempted: 0, succeeded: 0, lastError: null }
107
- if (!node.hueManager || !node.hueManager.hueApiV2 || typeof node.hueManager.hueApiV2.put !== 'function') {
108
- return { attempted: 0, succeeded: 0, lastError: new Error('Hue bridge not ready') }
109
- }
110
- if (node.linkStatus !== 'connected') {
111
- return { attempted: 0, succeeded: 0, lastError: new Error('Hue bridge is not connected') }
112
- }
113
- session.inFlight = true
114
- let attempted = 0
115
- let succeeded = 0
116
- let lastError = null
117
- try {
118
- for (const target of session.targets) {
119
- if (!target || !target.id || !target.type) continue
120
- attempted += 1
121
- try {
122
- await node.hueManager.hueApiV2.put(`/resource/${target.type}/${target.id}`, { identify: { action: 'identify' } })
123
- succeeded += 1
124
- } catch (error) {
125
- lastError = error
126
- node.sysLogger?.warn(`Hue identify ${target.type}:${target.id} failed (${label}): ${error.message}`)
127
- }
128
- }
129
- } finally {
130
- session.inFlight = false
131
- }
132
- return { attempted, succeeded, lastError }
133
- }
134
-
135
- session.intervalHandle = setInterval(() => {
136
- session.runIdentify('interval')
137
- }, resolvedInterval)
138
- session.timeoutHandle = setTimeout(() => {
139
- node.stopHueIdentifySession(sessionKey, 'timeout')
140
- }, resolvedDuration)
141
-
142
- node.activeHueIdentifySessions.set(sessionKey, session)
143
- const initialResult = await session.runIdentify('initial')
144
- if (!initialResult || initialResult.succeeded === 0) {
145
- node.stopHueIdentifySession(sessionKey, 'initial-error')
146
- if (initialResult?.lastError) throw initialResult.lastError
147
- return false
148
- }
149
- return true
150
- }
151
-
152
- node.initHUEConnection = async () => {
153
- await node.closeConnection()
154
- try {
155
- if (node.hueManager !== undefined) await node.hueManager.close()
156
- } catch (error) { /* empty */ }
157
-
158
- const safeClientCall = (client, fn, label) => {
159
- try {
160
- if (!client || typeof fn !== 'function') return
161
- fn()
162
- } catch (error) {
163
- node.sysLogger?.warn(`Hue client ${label} error: ${error.message}`)
164
- }
165
- }
166
-
167
- (async () => {
168
- try {
169
- const { classHUE } = await import('./utils/hueEngine.mjs')
170
- node.hueManager = new classHUE(node.host, node.credentials.username, node.credentials.clientkey, config.bridgeid, node.sysLogger)
171
- } catch (error) {
172
- node.sysLogger?.error(`Errore hue-config: node.initHUEConnection: ${error.message}`)
173
- throw (error)
174
- }
175
- node.hueManager.on('event', (_event) => {
176
- node.nodeClients.forEach((_oClient) => {
177
- const oClient = _oClient
178
- try {
179
- if (oClient.handleSendHUE !== undefined) oClient.handleSendHUE(_event)
180
- } catch (error) {
181
- node.sysLogger?.error(`Errore node.hueManager.on(event): ${error.message}`)
182
- }
183
- })
184
- })
185
- // Connected
186
- node.hueManager.on('connected', () => {
187
- if (node.linkStatus === 'disconnected') {
188
- // Start the timer to do initial read.
189
- if (node.timerDoInitialRead !== null) clearTimeout(node.timerDoInitialRead)
190
- node.timerDoInitialRead = setTimeout(() => {
191
- (async () => {
192
- try {
193
- node.sysLogger?.info(`HTTP getting resource from HUE bridge : ${node.name}`)
194
- await node.loadResourcesFromHUEBridge()
195
- node.sysLogger?.info(`Total HUE resources count : ${node.hueAllResources.length}`)
196
- } catch (error) {
197
- node.nodeClients.forEach((_oClient) => {
198
- setTimeout(() => {
199
- safeClientCall(_oClient, () => _oClient.setNodeStatusHue({
200
- fill: 'red',
201
- shape: 'ring',
202
- text: 'HUE',
203
- payload: error.message
204
- }), 'setNodeStatusHue')
205
- }, 200)
206
- })
207
- }
208
- })()
209
- }, 10000) // 17/02/2020 Do initial read of all nodes requesting initial read
210
- }
211
- })
212
-
213
- node.hueManager.on('disconnected', () => {
214
- node.nodeClients.forEach((_oClient) => {
215
- safeClientCall(_oClient, () => _oClient.setNodeStatusHue({
216
- fill: 'red',
217
- shape: 'ring',
218
- text: 'HUE Disconnected',
219
- payload: ''
220
- }), 'setNodeStatusHue')
221
- })
222
- })
223
- try {
224
- await node.hueManager.Connect()
225
- } catch (error) { }
226
- })()
227
- }
228
-
229
- node.startWatchdogTimer = async () => {
230
- if (node.timerHUEConfigCheckState !== null) clearTimeout(node.timerHUEConfigCheckState)
231
- node.timerHUEConfigCheckState = setTimeout(() => {
232
- (async () => {
233
- if (node.linkStatus === 'disconnected') {
234
- // The hueEngine is already connected to the HUE Bridge
235
- try {
236
- await node.initHUEConnection()
237
- } catch (error) {
238
- node.sysLogger?.error(`Errore hue-config: node.startWatchdogTimer: ${error.message}`)
239
- }
240
- }
241
- await node.startWatchdogTimer()
242
- })()
243
- }, 60000)
244
- }
245
-
246
- setTimeout(() => {
247
- (async () => {
248
- await node.initHUEConnection()
249
- node.startWatchdogTimer()
250
- })()
251
- }, 5000)
252
-
253
- // Functions called from the nodes ----------------------------------------------------------------
254
- // Query the HUE Bridge to return the resources
255
- node.loadResourcesFromHUEBridge = async () => {
256
- if (node.linkStatus === 'disconnected') return
257
- // (async () => {
258
- // °°°°°° Load ALL resources
259
- try {
260
- node.hueAllResources = await node.hueManager.hueApiV2.get('/resource')
261
- if (node.hueAllResources !== undefined) {
262
- node.hueAllRooms = node.hueAllResources.filter((a) => a.type === 'room')
263
- // Update all KNX State of the nodes with the new hue device values
264
- node.nodeClients.forEach((_node) => {
265
- if (_node.hueDevice !== undefined && node.hueAllResources !== undefined) {
266
- const oHUEDevice = node.hueAllResources.filter((a) => a.id === _node.hueDevice)[0]
267
- if (oHUEDevice !== undefined) {
268
- // Add _Node to the clients array
269
- try {
270
- _node.setNodeStatusHue({
271
- fill: 'green',
272
- shape: 'ring',
273
- text: 'Ready'
274
- })
275
- } catch (error) {
276
- node.sysLogger?.warn(`KNXUltimateHue: loadResources setNodeStatusHue error ${error.message}`)
277
- }
278
- try {
279
- _node.currentHUEDevice = cloneDeep(oHUEDevice) // Copy by Value and not by ref
280
- } catch (error) { /* empty */ }
281
- if (_node.initializingAtStart === true) {
282
- try {
283
- _node.handleSendHUE(oHUEDevice) // Pass by value
284
- } catch (error) {
285
- node.sysLogger?.warn(`KNXUltimateHue: loadResources handleSendHUE error ${error.message}`)
286
- }
287
- }
288
- }
289
- }
290
- })
291
- } else {
292
- // The config node cannot read the resources. Signalling disconnected
293
- }
294
- } catch (error) {
295
- if (this.sysLogger !== undefined && this.sysLogger !== null) {
296
- this.sysLogger.error(`KNXUltimatehueEngine: loadResourcesFromHUEBridge: ${error.message}`)
297
- throw (error)
298
- }
299
- }
300
-
301
- // })();
302
- }
303
-
304
- node.getFirstLightInGroup = function getFirstLightInGroup (_groupID) {
305
- if (node.hueAllResources === undefined || node.hueAllResources === null) return
306
- try {
307
- const group = node.hueAllResources.filter((a) => a.id === _groupID)[0]
308
- const owner = node.hueAllResources.filter((a) => a.id === group.owner.rid)[0]
309
- if (owner.children !== undefined) {
310
- const dev = node.hueAllResources.filter((a) => a.id === owner.children[0].rid)[0]
311
- if (dev.type === 'device' && dev.services !== undefined) {
312
- const lightID = dev.services.filter((a) => a.rtype === 'light')[0].rid
313
- const oLight = node.hueAllResources.filter((a) => a.id === lightID)[0]
314
- return oLight
315
- } else if (dev.type === 'light') {
316
- return dev
317
- }
318
- }
319
- } catch (error) { }
320
- }
321
-
322
- // Return an array of light belonging to the groupID
323
- node.getAllLightsBelongingToTheGroup = async function getAllLightsBelongingToTheGroup (_groupID, refreshResourcesFromBridge = true) {
324
- if (node.hueAllResources === undefined || node.hueAllResources === null) return
325
- const retArr = []
326
- let filteredResource
327
- try {
328
- if (refreshResourcesFromBridge === true) {
329
- await node.loadResourcesFromHUEBridge()
330
- }
331
- // filteredResource = node.hueAllResources.filter((a) => a.id === _groupID);
332
- // if (filteredResource[0].type === "grouped_light") {
333
- // filteredResource = node.hueAllResources.filter((a) => a.services);
334
- // filteredResource = filteredResource.filter((a) => a.services).filter((b) => b.type === "light");
335
- // if (filteredResource.length > 0) {
336
- // console.log(filteredResource)
337
- // }
338
- // }
339
- node.hueAllResources.forEach((res) => {
340
- if (res.services !== undefined && res.services.length > 0) {
341
- res.services.forEach((serv) => {
342
- if (serv.rid === _groupID) {
343
- if (res.children !== undefined) {
344
- const children = res.children.filter((a) => a.rtype === 'light')
345
- for (let index = 0; index < children.length; index++) {
346
- const element = children[index]
347
- const oLight = node.hueAllResources.filter((a) => a.id === element.rid)
348
- // if (oLight !== null && oLight !== undefined) retArr.push({ groupID: _groupID, light: oLight[0] });
349
- if (oLight !== null && oLight !== undefined) retArr.push(oLight[0])
350
- }
351
- }
352
- }
353
- })
354
- }
355
- })
356
- return retArr
357
- } catch (error) { /* empty */ }
358
- }
359
-
360
- // Returns the cached devices (node.hueAllResources) by type.
361
- node.getResources = async function getResources (_rtype, { forceRefresh = false } = {}) {
362
- try {
363
- if (forceRefresh) {
364
- try {
365
- await node.loadResourcesFromHUEBridge()
366
- } catch (error) {
367
- node.sysLogger?.warn(`KNXUltimateHue: getResources force refresh failed ${error.message}`)
368
- }
369
- }
370
- if (_rtype === 'hue_controller') {
371
- const ready = node.linkStatus === 'connected' && Array.isArray(node.hueAllResources)
372
- if (!ready) {
373
- return {
374
- devices: [],
375
- ready: false,
376
- connectionStatus: node.linkStatus
377
- }
378
- }
379
- const resourceResults = await Promise.all(HUE_CONTROLLER_RESOURCE_TYPES.map(async (resourceType) => {
380
- const result = await node.getResources(resourceType)
381
- return [resourceType, Array.isArray(result?.devices) ? result.devices : []]
382
- }))
383
- return {
384
- devices: buildHueControllerResourceCatalog(Object.fromEntries(resourceResults)),
385
- ready: true,
386
- connectionStatus: node.linkStatus
387
- }
388
- }
389
- if (node.hueAllResources === undefined) return
390
- // Returns capitalized string
391
- function capStr (s) {
392
- if (typeof s !== 'string') return ''
393
- return s.charAt(0).toUpperCase() + s.slice(1)
394
- }
395
- const retArray = []
396
- let allResources
397
- if (_rtype === 'light' || _rtype === 'grouped_light') {
398
- allResources = node.hueAllResources.filter((a) => a.type === 'light' || a.type === 'grouped_light')
399
- } else if (_rtype === 'plug') {
400
- allResources = node.hueAllResources.filter((a) => a.type === 'plug' || a.type === 'smartplug' || a.type === 'smart_plug')
401
- } else if (_rtype === 'area_motion') {
402
- allResources = node.hueAllResources.filter((a) => a.type === 'convenience_area_motion' || a.type === 'security_area_motion')
403
- } else {
404
- allResources = node.hueAllResources.filter((a) => a.type === _rtype)
405
- }
406
- if (allResources === null) return
407
- for (let index = 0; index < allResources.length; index++) {
408
- const resource = allResources[index]
409
- // Get the owner
410
- try {
411
- let resourceName = ''
412
- let sType = ''
413
- let sArchetype = ''
414
- if (_rtype === 'light' || _rtype === 'grouped_light') {
415
- // It's a service, having a owner
416
- const owners = node.hueAllResources.filter((a) => a.id === resource.owner.rid)
417
- if (owners !== null) {
418
- for (let index = 0; index < owners.length; index++) {
419
- const owner = owners[index]
420
- if (owner.type === 'bridge_home') {
421
- resourceName += 'ALL GROUPS and '
422
- } else {
423
- resourceName += `${owner.metadata.name} and `
424
- sArchetype += `${owner.metadata.archetype === undefined ? '' : owner.metadata.archetype} and `
425
- // const room = node.hueAllRooms.find((child) => child.children.find((a) => a.rid === owner.id));
426
- // sRoom += room !== undefined ? `${room.metadata.name} + ` : " + ";
427
- sType += `${capStr(owner.type)} + `
428
- }
429
- }
430
- }
431
- sType = sType.slice(0, -' + '.length)
432
- if (sArchetype !== '') sArchetype = sArchetype.slice(0, -' and '.length)
433
- resourceName = resourceName.slice(0, -' and '.length)
434
- resourceName += sType !== '' ? ` (${sType}:${sArchetype})` : ''
435
- retArray.push({
436
- name: `${capStr(resource.type)}: ${resourceName}`,
437
- id: resource.id,
438
- deviceObject: resource
439
- })
440
- }
441
- if (_rtype === 'scene') {
442
- resourceName = resource.metadata.name || '**Name Not Found**'
443
- // Get the linked zone
444
- const zone = node.hueAllResources.find((res) => res.id === resource.group.rid)
445
- resourceName += ` - ${capStr(resource.group.rtype)}: ${zone.metadata.name}`
446
- retArray.push({
447
- name: `${capStr(_rtype)}: ${resourceName}`,
448
- id: resource.id
449
- })
450
- }
451
- if (_rtype === 'button') {
452
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
453
- const controlID = resource.metadata !== undefined ? resource.metadata.control_id || '' : ''
454
- retArray.push({
455
- name: `${capStr(_rtype)}: ${linkedDevName}, button ${controlID}`,
456
- id: resource.id
457
- })
458
- }
459
- if (_rtype === 'motion' || _rtype === 'camera_motion') {
460
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
461
- retArray.push({
462
- name: `${capStr(_rtype)}: ${linkedDevName}`,
463
- id: resource.id
464
- })
465
- }
466
- if (_rtype === 'convenience_area_motion' || _rtype === 'security_area_motion' || (_rtype === 'area_motion' && (resource.type === 'convenience_area_motion' || resource.type === 'security_area_motion'))) {
467
- let areaName = ''
468
- let areaGroupLabel = ''
469
- const isConvenience = resource.type === 'convenience_area_motion'
470
- const areaTypeLabel = isConvenience ? 'Convenience area' : 'Security area'
471
- let configuration = node.hueAllResources.find((res) => {
472
- if (res.type !== 'motion_area_configuration' || !Array.isArray(res.services)) return false
473
- return res.services.some((svc) => svc.rid === resource.id)
474
- })
475
- if (!configuration && resource.owner && resource.owner.rid) {
476
- const candidate = node.hueAllResources.find((res) => res.id === resource.owner.rid)
477
- if (candidate && candidate.type === 'motion_area_configuration') configuration = candidate
478
- }
479
- if (configuration && typeof configuration.name === 'string' && configuration.name.trim() !== '') {
480
- areaName = configuration.name.trim()
481
- } else {
482
- areaName = resource.id
483
- }
484
- if (configuration && configuration.group && configuration.group.rid) {
485
- const groupRes = node.hueAllResources.find((res) => res.id === configuration.group.rid)
486
- if (groupRes && groupRes.metadata && typeof groupRes.metadata.name === 'string') {
487
- const groupType = configuration.group.rtype ? capStr(configuration.group.rtype) : 'Group'
488
- areaGroupLabel = `, ${groupType} ${groupRes.metadata.name}`
489
- }
490
- }
491
- retArray.push({
492
- name: `${areaTypeLabel}: ${areaName}${areaGroupLabel}`,
493
- id: resource.id
494
- })
495
- }
496
- if (_rtype === 'relative_rotary') {
497
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
498
- retArray.push({
499
- name: `Rotary: ${linkedDevName}`,
500
- id: resource.id
501
- })
502
- }
503
- if (_rtype === 'light_level') {
504
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
505
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
506
- retArray.push({
507
- name: `Light Level: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
508
- id: resource.id
509
- })
510
- }
511
- if (_rtype === 'plug') {
512
- const linkedDevice = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id))
513
- const room = node.hueAllRooms?.find((roomItem) => roomItem.children?.find((child) => child.rid === linkedDevice?.id))
514
- const plugName = linkedDevice?.metadata?.name || resource.metadata?.name || 'Unnamed Plug'
515
- const stateLabel = resource?.on?.on === true ? 'on' : 'off'
516
- console.log('getResources plug direct resource', { id: resource.id, type: resource.type, name: plugName, linkedDevice: linkedDevice?.id })
517
- retArray.push({
518
- name: `Plug: ${plugName}${room !== undefined ? `, room ${room.metadata.name}` : ''} [${stateLabel}]`,
519
- id: resource.id,
520
- type: resource.type,
521
- deviceObject: resource
522
- })
523
- }
524
- if (_rtype === 'temperature') {
525
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
526
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
527
- retArray.push({
528
- name: `Temperature: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
529
- id: resource.id
530
- })
531
- }
532
- if (_rtype === 'humidity') {
533
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
534
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
535
- retArray.push({
536
- name: `Humidity: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
537
- id: resource.id
538
- })
539
- }
540
- if (_rtype === 'device_power') {
541
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
542
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
543
- retArray.push({
544
- name: `Battery: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
545
- id: resource.id
546
- })
547
- }
548
- if (_rtype === 'zigbee_connectivity') {
549
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
550
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
551
- retArray.push({
552
- name: `Zigbee Connectivity: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
553
- id: resource.id
554
- })
555
- // Get zigbee_connectivituy
556
- // const bridgeId = node.hueAllResources.filter((a) => a.bridge_id === config.bridgeid).owner.rid;
557
- // const zigbee_ConnectivityID = node.hueAllResources.filter((a) => a.id === bridgeId).services.filter((a) => a.rtype === "zigbee_connectivity").rid;
558
- // // connected, disconnected, connectivity_issue, unidirectional_incoming
559
- // const oZigbeeConnectivityStatus = node.hueAllResources.filter((a) => a.id === zigbee_ConnectivityID).status;
560
- // const zigbee = node.hueAllResources.filter((a) => a.services !== undefined).find((a) => a.services.rtype === "zigbee_connectivity");
561
- // const devs = zigbee.filter((a) => a.rtype === "zigbee_connectivity");
562
- }
563
- if (_rtype === 'contact') {
564
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
565
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
566
- retArray.push({
567
- name: `Contact: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
568
- id: resource.id
569
- })
570
- }
571
- if (_rtype === 'device_software_update') {
572
- const Room = node.hueAllRooms.find((room) => room.children.find((child) => child.rid === resource.owner.rid))
573
- const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
574
- retArray.push({
575
- name: `Software status: ${linkedDevName}${Room !== undefined ? `, room ${Room.metadata.name}` : ''}`,
576
- id: resource.id
577
- })
578
- }
579
- } catch (error) {
580
- console.log('KNXHue-config: getResources error ', error.trace)
581
- retArray.push({
582
- name: `${_rtype}: ERROR ${error.message}`,
583
- id: resource.id
584
- })
585
- }
586
- }
587
- if (_rtype === 'plug' && retArray.length === 0) {
588
- const plugDevices = node.hueAllResources.filter((dev) => {
589
- if (dev.type !== 'device' || !Array.isArray(dev.services)) return false
590
- const archetypePlug = dev.product_data?.product_archetype === 'plug' || dev.metadata?.archetype === 'plug' || /plug/i.test(dev.product_data?.product_name || '') || /plug/i.test(dev.metadata?.name || '')
591
- const hasService = dev.services.some((serv) => ['plug', 'smartplug', 'smart_plug', 'light'].includes(serv.rtype || ''))
592
- return archetypePlug && hasService
593
- })
594
- plugDevices.forEach((device) => {
595
- try {
596
- const plugService = device.services.find((serv) => ['plug', 'smartplug', 'smart_plug', 'light'].includes(serv.rtype || ''))
597
- if (!plugService) return
598
- const plugResource = node.hueAllResources.find((res) => res.id === plugService.rid) || {}
599
- const room = node.hueAllRooms?.find((roomItem) => roomItem.children?.find((child) => child.rid === device.id))
600
- const plugName = device.metadata?.name || plugResource.metadata?.name || 'Unnamed Plug'
601
- const stateLabel = plugResource?.on?.on === true ? 'on' : (plugResource?.on?.on === false ? 'off' : '')
602
- retArray.push({
603
- name: `Plug: ${plugName}${room !== undefined ? `, room ${room.metadata.name}` : ''}${stateLabel ? ` [${stateLabel}]` : ''}`,
604
- id: plugService.rid || device.id,
605
- type: plugService.rtype || plugResource.type || 'light',
606
- deviceObject: plugResource.on
607
- ? plugResource
608
- : {
609
- id: plugService.rid || device.id,
610
- type: plugService.rtype || plugResource.type || 'light',
611
- on: plugResource.on,
612
- owner: { rid: device.id, rtype: 'device' }
613
- }
614
- })
615
- } catch (err) {
616
- node.sysLogger?.warn(`KNXUltimateHue: getResources plug fallback error ${err.message}`)
617
- }
618
- })
619
- }
620
- node.sysLogger?.debug(`getResources plug returning ${retArray.length}`)
621
- return { devices: retArray }
622
- } catch (error) {
623
- node.sysLogger?.error(`KNXUltimateHue: hueEngine: classHUE: getResources: error ${error.message}`)
624
- return { devices: error.message }
625
- }
626
- }
627
-
628
- // Get current color in HEX (used in html)
629
- node.getColorFromHueLight = (_lightId) => {
630
- try {
631
- const oLight = node.hueAllResources.filter((a) => a.id === _lightId)[0]
632
- const retRGB = hueColorConverter.ColorConverter.xyBriToRgb(oLight.color.xy.x, oLight.color.xy.y, oLight.dimming.brightness)
633
- const ret = '#' + hueColorConverter.ColorConverter.rgbHex(retRGB.r, retRGB.g, retRGB.b).toString()
634
- return ret
635
- } catch (error) {
636
- node.sysLogger?.warn(`KNXUltimateHue: hueEngine: getColorFromHueLight: error ${error.message}`)
637
- return {}
638
- }
639
- }
640
- // Get current Kelvin (used in html)
641
- node.getKelvinFromHueLight = (_lightId) => {
642
- try {
643
- const oLight = node.hueAllResources.filter((a) => a.id === _lightId)[0]
644
- const ret = { kelvin: hueColorConverter.ColorConverter.mirekToKelvin(oLight.color_temperature.mirek), brightness: Math.round(oLight.dimming.brightness, 0) }
645
- return JSON.stringify(ret)
646
- } catch (error) {
647
- node.sysLogger?.error(`KNXUltimateHue: hueEngine: getKelvinFromHueLight: error ${error.message}`)
648
- return {}
649
- }
650
- }
651
-
652
- /**
653
- * Get average color XY from a light array
654
- * @param {array} _arrayLights - Light array
655
- * @returns { x,y,mirek,brightness } - Object containing all infos
656
- */
657
- node.getAverageColorsXYBrightnessAndTemperature = async function getAverageColorsXYBrightnessAndTemperature (_arrayLights) {
658
- let x; let y; let mirek; let brightness
659
- let countColor = 0; let countColor_Temperature = 0; let countDimming = 0
660
- _arrayLights.forEach((element) => {
661
- if (element.color !== undefined && element.color.xy !== undefined) {
662
- if (x === undefined) { x = 0; y = 0 }
663
- x += element.color.xy.x
664
- y += element.color.xy.y
665
- countColor += 1
666
- }
667
- if (element.color_temperature !== undefined && element.color_temperature.mirek !== undefined) {
668
- if (mirek === undefined) mirek = 0
669
- mirek += element.color_temperature.mirek
670
- countColor_Temperature += 1
671
- }
672
- if (element.dimming !== undefined && element.dimming.brightness !== undefined) {
673
- if (brightness === undefined) brightness = 0
674
- brightness += element.dimming.brightness
675
- countDimming += 1
676
- }
677
- })
678
- // Calculate and return the averages
679
- const retX = countColor === 0 ? undefined : x / countColor
680
- const retY = countColor === 0 ? undefined : y / countColor
681
- const retMirek = countColor_Temperature === 0 ? undefined : mirek / countColor_Temperature
682
- const retBrightness = countDimming === 0 ? undefined : brightness / countDimming
683
-
684
- return {
685
- x: retX, y: retY, mirek: retMirek, brightness: retBrightness
686
- }
687
- }
688
- node.refreshHueResources = async (reason = '') => {
689
- if (node.linkStatus === 'disconnected') return
690
- if (node.pendingHueResourceReload) {
691
- try {
692
- await node.pendingHueResourceReload
693
- } catch (error) {
694
- node.sysLogger?.warn(`KNXUltimateHue: refreshHueResources pending error ${error.message}`)
695
- }
696
- return
697
- }
698
- node.pendingHueResourceReload = (async () => {
699
- try {
700
- if (reason) {
701
- node.sysLogger?.debug(`KNXUltimateHue: refreshHueResources triggered (${reason})`)
702
- }
703
- await node.loadResourcesFromHUEBridge()
704
- } finally {
705
- node.pendingHueResourceReload = null
706
- }
707
- })()
708
- try {
709
- await node.pendingHueResourceReload
710
- } catch (error) {
711
- node.sysLogger?.warn(`KNXUltimateHue: refreshHueResources error ${error.message}`)
712
- }
713
- }
714
-
715
- node.getHueResourceSnapshot = async (resourceId, { forceRefresh = false } = {}) => {
716
- if (!resourceId) return undefined
717
- const lookup = () => {
718
- if (!Array.isArray(node.hueAllResources)) return undefined
719
- return node.hueAllResources.find((res) => res.id === resourceId)
720
- }
721
- let resource = lookup()
722
- if (resource && !forceRefresh) return cloneDeep(resource)
723
- if (node.linkStatus === 'disconnected') return resource ? cloneDeep(resource) : undefined
724
- await node.refreshHueResources(forceRefresh ? `force refresh for ${resourceId}` : `ensure resource ${resourceId}`)
725
- resource = lookup()
726
- return resource ? cloneDeep(resource) : undefined
727
- }
728
- // END functions called from the nodes ----------------------------------------------------------------
729
-
730
- node.addClient = (_Node) => {
731
- // Update the node hue device, as soon as a node register itself to hue-config nodeClients
732
- if (node.nodeClients.filter((x) => x.id === _Node.id).length !== 0) return
733
- node.nodeClients.push(_Node)
734
-
735
- const applyHueSnapshot = (resource) => {
736
- if (!resource) return false
737
- try {
738
- const snapshot = cloneDeep(resource)
739
- _Node.currentHUEDevice = snapshot
740
- if (_Node.initializingAtStart === true) {
741
- try {
742
- _Node.handleSendHUE(snapshot)
743
- } catch (error) {
744
- node.sysLogger?.warn(`KNXUltimateHue: addClient handleSendHUE error ${error.message}`)
745
- }
746
- }
747
- _Node.setNodeStatusHue({
748
- fill: 'green',
749
- shape: 'dot',
750
- text: "I'm new and ready."
751
- })
752
- return true
753
- } catch (error) {
754
- node.sysLogger?.warn(`KNXUltimateHue: addClient applyHueSnapshot error ${error.message}`)
755
- return false
756
- }
757
- }
758
-
759
- const existingResource = Array.isArray(node.hueAllResources)
760
- ? node.hueAllResources.find((a) => a.id === _Node.hueDevice)
761
- : undefined
762
- if (existingResource && applyHueSnapshot(existingResource)) return
763
-
764
- if (node.linkStatus !== 'connected') {
765
- _Node.setNodeStatusHue({
766
- fill: 'grey',
767
- shape: 'ring',
768
- text: 'Waiting for connection'
769
- })
770
- return
771
- }
772
-
773
- _Node.setNodeStatusHue({
774
- fill: 'yellow',
775
- shape: 'ring',
776
- text: 'Syncing with HUE bridge',
777
- payload: ''
778
- });
779
-
780
- (async () => {
781
- try {
782
- const refreshed = await node.getHueResourceSnapshot(_Node.hueDevice, { forceRefresh: true })
783
- if (!applyHueSnapshot(refreshed)) {
784
- _Node.setNodeStatusHue({
785
- fill: 'red',
786
- shape: 'ring',
787
- text: 'Hue device info unavailable',
788
- payload: ''
789
- })
790
- }
791
- } catch (error) {
792
- node.sysLogger?.warn(`KNXUltimateHue: addClient async fetch error ${error.message}`)
793
- _Node.setNodeStatusHue({
794
- fill: 'red',
795
- shape: 'ring',
796
- text: 'Hue device sync failed',
797
- payload: ''
798
- })
799
- }
800
- })()
801
- }
802
-
803
- node.removeClient = (_Node) => {
804
- // Remove the client node from the clients array
805
- try {
806
- node.nodeClients = node.nodeClients.filter((x) => x.id !== _Node.id)
807
- } catch (error) {
808
- /* empty */
809
- }
810
- }
811
-
812
- node.closeConnection = async () => {
813
- node.stopAllHueIdentifySessions('connection-close')
814
- node.hueManager?.removeAllListeners()
815
- node.linkStatus === 'disconnected'
816
- }
817
-
818
- node.on('close', (done) => {
819
- try {
820
- node.sysLogger?.destroy()
821
- node.sysLogger = null
822
- node.nodeClients = []
823
- node.closeConnection()
824
- node.stopAllHueIdentifySessions('node-close');
825
- (async () => {
826
- try {
827
- await node.hueManager.close()
828
- node.hueManager = null
829
- delete node.hueManager
830
- done()
831
- } catch (error) {
832
- done()
833
- }
834
- })()
835
- } catch (error) {
836
- done()
837
- }
838
- })
839
- }
840
- RED.nodes.registerType('hue-config', hueConfig, {
841
- credentials: {
842
- username: { type: 'password' },
843
- clientkey: { type: 'password' }
844
- }
845
- })
846
- }