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,297 +0,0 @@
1
- /* eslint-disable max-len */
2
- import { EventEmitter } from 'events'
3
-
4
- // Wrapper around a matter.js ServerNode acting as a Matter BRIDGE (Aggregator):
5
- // external Matter controllers (Alexa, Google Home, Apple Home...) commission it once
6
- // and see every configured KNX virtual device as a bridged Matter device.
7
- // Mirrors the contract of matterEngine.mjs: an EventEmitter with
8
- // 'online', 'offline', 'commissioned', 'decommissioned', 'fabricsChanged' and
9
- // 'command' ({ deviceId, fn, value }) events.
10
- class classMatterBridge extends EventEmitter {
11
- constructor (_storagePath, _instanceId, _sysLogger, _options = {}) {
12
- super()
13
- this.storagePath = _storagePath
14
- this.instanceId = _instanceId
15
- this.sysLogger = _sysLogger
16
- this.options = {
17
- port: Number(_options.port) || 5540,
18
- deviceName: (_options.deviceName || 'KNX-Ultimate Bridge').toString().slice(0, 32)
19
- }
20
- this.server = null
21
- this.aggregator = null
22
- this.endpoints = new Map() // deviceId -> Endpoint
23
- this.deviceDefs = new Map() // deviceId -> definition
24
- this.bridgeStatus = 'stopped' // stopped | running
25
- this._api = null
26
- this._factory = null
27
- this._logThrottle = new Map()
28
- }
29
-
30
- _log = (level, message) => {
31
- try {
32
- const logger = this.sysLogger
33
- if (logger && typeof logger[level] === 'function') return logger[level](message)
34
- if (logger && typeof logger.log === 'function') return logger.log(message)
35
- } catch (error) { /* empty */ }
36
- if (level === 'error') console.error(message)
37
- else if (level === 'warn') console.warn(message)
38
- else console.log(message)
39
- }
40
-
41
- _logThrottled = (level, throttleKey, message, intervalMs = 30000) => {
42
- const now = Date.now()
43
- const entry = this._logThrottle.get(throttleKey) || { last: 0, suppressed: 0 }
44
- if (this._logThrottle.size > 1000) this._logThrottle.clear()
45
- if (entry.last === 0 || (now - entry.last) >= intervalMs) {
46
- const suffix = entry.suppressed > 0 ? ` (suppressed ${entry.suppressed} similar)` : ''
47
- entry.last = now
48
- entry.suppressed = 0
49
- this._logThrottle.set(throttleKey, entry)
50
- this._log(level, `${message}${suffix}`)
51
- return
52
- }
53
- entry.suppressed += 1
54
- this._logThrottle.set(throttleKey, entry)
55
- }
56
-
57
- _loadApi = async () => {
58
- if (this._api !== null) return this._api
59
- const { Environment, ServerNode, Endpoint, Logger, LogLevel, VendorId } = await import('@matter/main')
60
- const { AggregatorEndpoint } = await import('@matter/main/endpoints/aggregator')
61
- const { QrCode } = await import('@matter/main/types')
62
- this._factory = await import('./matterBridgeDeviceFactory.mjs')
63
- this._api = { Environment, ServerNode, Endpoint, Logger, LogLevel, VendorId, AggregatorEndpoint, QrCode }
64
- return this._api
65
- }
66
-
67
- // Starts the bridge and exposes the given virtual devices.
68
- // _deviceDefs: [{ id, type, name }]
69
- start = async (_deviceDefs = []) => {
70
- const api = await this._loadApi()
71
- try {
72
- api.Logger.level = api.LogLevel.ERROR
73
- } catch (error) { /* empty */ }
74
- const { withEnvironmentLock } = await import('./matterEnvironmentLock.mjs')
75
- // Environment.default (and its 'storage.path' var) is a process-wide singleton shared
76
- // with the Matter Controller engine: serialize the set+create critical section so a
77
- // concurrent startup can never observe another engine's storage path mid-flight.
78
- this.server = await withEnvironmentLock(async () => {
79
- const environment = api.Environment.default
80
- environment.vars.set('storage.path', this.storagePath)
81
- return api.ServerNode.create({
82
- id: this.instanceId,
83
- network: { port: this.options.port },
84
- productDescription: {
85
- name: this.options.deviceName,
86
- deviceType: api.AggregatorEndpoint.deviceType
87
- },
88
- basicInformation: {
89
- vendorName: 'KNX-Ultimate',
90
- vendorId: api.VendorId(0xFFF1), // Test vendor ID
91
- nodeLabel: this.options.deviceName,
92
- productName: this.options.deviceName,
93
- productLabel: this.options.deviceName,
94
- productId: 0x8000,
95
- serialNumber: `knxu-${this.instanceId}`.slice(0, 32),
96
- uniqueId: this.instanceId.slice(-32)
97
- }
98
- })
99
- })
100
-
101
- this.aggregator = new api.Endpoint(api.AggregatorEndpoint, { id: 'aggregator' })
102
- await this.server.add(this.aggregator)
103
-
104
- for (let index = 0; index < _deviceDefs.length; index++) {
105
- const def = _deviceDefs[index]
106
- try {
107
- await this._addDeviceEndpoint(def)
108
- } catch (error) {
109
- this._log('error', `classMatterBridge: cannot add device "${def?.name}" (${def?.type}): ${error.message}`)
110
- }
111
- }
112
-
113
- // Commissioning lifecycle events
114
- try {
115
- this.server.events.commissioning.commissioned.on(() => {
116
- try { this.emit('commissioned') } catch (error) { /* empty */ }
117
- })
118
- this.server.events.commissioning.decommissioned.on(() => {
119
- try { this.emit('decommissioned') } catch (error) { /* empty */ }
120
- })
121
- this.server.events.commissioning.fabricsChanged.on((fabricIndex, action) => {
122
- try { this.emit('fabricsChanged', Number(fabricIndex), action) } catch (error) { /* empty */ }
123
- })
124
- } catch (error) {
125
- this._log('warn', `classMatterBridge: cannot hook commissioning events: ${error.message}`)
126
- }
127
-
128
- await this.server.start()
129
- this.bridgeStatus = 'running'
130
- this.emit('online')
131
- this._log('info', `classMatterBridge: bridge "${this.options.deviceName}" started on port ${this.options.port} with ${this.endpoints.size} device(s)`)
132
- }
133
-
134
- _addDeviceEndpoint = async (def) => {
135
- if (!def || !def.id || !def.type) throw new Error('Invalid device definition')
136
- const endpoint = this._factory.createBridgedEndpoint(def, `knxu-${this.instanceId.slice(-8)}`, (command) => {
137
- try {
138
- this.emit('command', command)
139
- } catch (error) {
140
- this._logThrottled('error', 'bridge:command', `classMatterBridge: command handler error: ${error.message}`)
141
- }
142
- })
143
- await this.aggregator.add(endpoint)
144
- this.endpoints.set(def.id, endpoint)
145
- this.deviceDefs.set(def.id, def)
146
- return endpoint
147
- }
148
-
149
- // Removes a bridged device endpoint from the running server.
150
- removeDeviceEndpoint = async (_deviceId) => {
151
- const endpoint = this.endpoints.get(_deviceId)
152
- if (endpoint === undefined) return false
153
- try {
154
- await endpoint.close()
155
- } catch (error) {
156
- this._log('warn', `classMatterBridge: removeDeviceEndpoint ${_deviceId}: ${error.message}`)
157
- }
158
- this.endpoints.delete(_deviceId)
159
- this.deviceDefs.delete(_deviceId)
160
- return true
161
- }
162
-
163
- // Reconciles the exposed devices with a new definition list WITHOUT restarting the server:
164
- // paired controllers receive the endpoint changes live (PartsList subscription reports),
165
- // while a full restart would resume the session without re-reading the structure.
166
- reconcileDevices = async (_deviceDefs = []) => {
167
- if (this.server === null) throw new Error('Matter bridge not started')
168
- const newById = new Map(_deviceDefs.filter((d) => d && d.id).map((d) => [d.id, d]))
169
- // Remove deleted devices; recreate the ones whose type/behavior changed
170
- const currentIds = Array.from(this.endpoints.keys())
171
- for (let index = 0; index < currentIds.length; index++) {
172
- const id = currentIds[index]
173
- const newDef = newById.get(id)
174
- const oldDef = this.deviceDefs.get(id)
175
- const needsRecreate = newDef !== undefined && oldDef !== undefined &&
176
- (newDef.type !== oldDef.type ||
177
- (newDef.invertPosition === true) !== (oldDef.invertPosition === true) ||
178
- (newDef.hasHeatingSetpoint !== false) !== (oldDef.hasHeatingSetpoint !== false) ||
179
- (newDef.hasCoolingSetpoint === true) !== (oldDef.hasCoolingSetpoint === true))
180
- if (newDef === undefined || needsRecreate) {
181
- await this.removeDeviceEndpoint(id)
182
- }
183
- }
184
- // Add new devices and apply renames on the existing ones
185
- for (const def of newById.values()) {
186
- if (!this.endpoints.has(def.id)) {
187
- try {
188
- await this._addDeviceEndpoint(def)
189
- } catch (error) {
190
- this._log('error', `classMatterBridge: reconcile cannot add "${def.name}" (${def.type}): ${error.message}`)
191
- }
192
- } else {
193
- const oldDef = this.deviceDefs.get(def.id)
194
- if ((oldDef.name || '') !== (def.name || '')) {
195
- const name = (def.name || def.type).toString().slice(0, 32)
196
- try {
197
- await this.endpoints.get(def.id).set({
198
- bridgedDeviceBasicInformation: { nodeLabel: name, productName: name, productLabel: name }
199
- })
200
- } catch (error) {
201
- this._log('warn', `classMatterBridge: reconcile rename ${def.id}: ${error.message}`)
202
- }
203
- }
204
- this.deviceDefs.set(def.id, def)
205
- }
206
- }
207
- this._log('info', `classMatterBridge: devices reconciled, now exposing ${this.endpoints.size} device(s)`)
208
- }
209
-
210
- // KNX -> Matter: applies a KNX status value to the Matter attribute of a virtual device.
211
- setDeviceState = async (_deviceId, _fn, _knxValue) => {
212
- try {
213
- const endpoint = this.endpoints.get(_deviceId)
214
- const def = this.deviceDefs.get(_deviceId)
215
- if (endpoint === undefined || def === undefined) return false
216
- const patch = this._factory.knxValueToMatterPatch(def, _fn, _knxValue)
217
- if (patch === undefined) return false
218
- await endpoint.set(patch)
219
- return true
220
- } catch (error) {
221
- this._logThrottled('warn', `bridge:set:${_deviceId}:${_fn}`, `classMatterBridge: setDeviceState ${_deviceId}/${_fn}: ${error.message}`)
222
- return false
223
- }
224
- }
225
-
226
- // Marks a device as reachable/unreachable on the Matter side
227
- setDeviceReachable = async (_deviceId, _reachable) => {
228
- try {
229
- const endpoint = this.endpoints.get(_deviceId)
230
- if (endpoint === undefined) return false
231
- await endpoint.set({ bridgedDeviceBasicInformation: { reachable: _reachable === true } })
232
- return true
233
- } catch (error) {
234
- return false
235
- }
236
- }
237
-
238
- // Pairing info for the editor: QR code (text + ASCII art), manual code, commissioned fabrics.
239
- getPairingInfo = () => {
240
- if (this.server === null) return { running: false }
241
- try {
242
- const commissioningState = this.server.state.commissioning
243
- const fabrics = []
244
- try {
245
- Object.values(commissioningState.fabrics || {}).forEach((fabric) => {
246
- fabrics.push({
247
- label: fabric.label || '',
248
- vendorId: Number(fabric.rootVendorId !== undefined ? fabric.rootVendorId : (fabric.vendorId || 0)),
249
- fabricIndex: Number(fabric.fabricIndex || 0)
250
- })
251
- })
252
- } catch (error) { /* empty */ }
253
- const info = {
254
- running: this.bridgeStatus === 'running',
255
- commissioned: commissioningState.commissioned === true,
256
- fabrics,
257
- deviceCount: this.endpoints.size,
258
- port: this.options.port
259
- }
260
- if (commissioningState.commissioned !== true && commissioningState.pairingCodes !== undefined) {
261
- info.manualPairingCode = commissioningState.pairingCodes.manualPairingCode
262
- info.qrPairingCode = commissioningState.pairingCodes.qrPairingCode
263
- try {
264
- info.qrAscii = this._api.QrCode.get(commissioningState.pairingCodes.qrPairingCode)
265
- } catch (error) { /* empty */ }
266
- }
267
- return info
268
- } catch (error) {
269
- this._log('warn', `classMatterBridge: getPairingInfo: ${error.message}`)
270
- return { running: this.bridgeStatus === 'running', error: error.message }
271
- }
272
- }
273
-
274
- // Factory reset: removes all fabrics and commissioning data. The bridge restarts advertising for pairing.
275
- factoryReset = async () => {
276
- if (this.server === null) throw new Error('Matter bridge not started')
277
- await this.server.erase()
278
- this.emit('decommissioned')
279
- }
280
-
281
- close = async () => {
282
- this.bridgeStatus = 'stopped'
283
- this._logThrottle.clear()
284
- try {
285
- if (this.server !== null) await this.server.close()
286
- } catch (error) {
287
- this._log('warn', `classMatterBridge: close: ${error.message}`)
288
- }
289
- this.server = null
290
- this.aggregator = null
291
- this.endpoints.clear()
292
- this.deviceDefs.clear()
293
- this.emit('offline')
294
- }
295
- }
296
-
297
- export { classMatterBridge }
@@ -1,47 +0,0 @@
1
- 'use strict'
2
-
3
- const COMMAND_TIMER_KEYS = [
4
- 'timerBlink',
5
- 'timerColorCycle',
6
- 'timerStepDim',
7
- 'timerStepDimHSV_H',
8
- 'timerStepDimHSV_S',
9
- 'timerStepDimTunableWhite'
10
- ]
11
-
12
- const setupMatterControllerCommandGate = (node) => {
13
- node.matterCommandBlocked = false
14
- node.matterCommandBlockReason = ''
15
-
16
- node.isMatterCommandBlocked = () => node.matterCommandBlocked === true
17
-
18
- node.blockMatterCommands = (reason = 'Matter device unavailable') => {
19
- node.matterCommandBlocked = true
20
- node.matterCommandBlockReason = String(reason || 'Matter device unavailable')
21
- COMMAND_TIMER_KEYS.forEach((key) => {
22
- if (node[key] !== undefined && node[key] !== null) clearInterval(node[key])
23
- node[key] = undefined
24
- })
25
- node.status({
26
- fill: 'red',
27
- shape: 'ring',
28
- text: node.matterCommandBlockReason
29
- })
30
- }
31
-
32
- node.clearMatterCommandBlock = (source = 'editor') => {
33
- if (node.matterCommandBlocked !== true) return false
34
- node.matterCommandBlocked = false
35
- node.matterCommandBlockReason = ''
36
- node.status({
37
- fill: source === 'connected' ? 'green' : 'yellow',
38
- shape: 'ring',
39
- text: source === 'connected' ? 'Matter device reconnected' : 'Matter retry enabled'
40
- })
41
- return true
42
- }
43
-
44
- return node
45
- }
46
-
47
- module.exports = { setupMatterControllerCommandGate }
@@ -1,258 +0,0 @@
1
- 'use strict'
2
-
3
- const dptlib = require('knxultimate').dptlib
4
- const { semanticPayload } = require('../matterControllerSemanticInput')
5
-
6
- const DOOR_LOCK_CLUSTER_ID = 0x0101
7
- const LOCK_STATE = {
8
- NOT_FULLY_LOCKED: 0,
9
- LOCKED: 1,
10
- UNLOCKED: 2,
11
- UNLATCHED: 3
12
- }
13
-
14
- const decodeKnxBoolean = (msg, dpt) => {
15
- if (msg && msg.knx && Buffer.isBuffer(msg.knx.rawValue)) {
16
- return !!dptlib.fromBuffer(msg.knx.rawValue, dptlib.resolve(dpt || '1.001'))
17
- }
18
- return !!(msg && msg.payload)
19
- }
20
-
21
- const lockStateName = (value) => {
22
- switch (Number(value)) {
23
- case LOCK_STATE.LOCKED: return 'locked'
24
- case LOCK_STATE.UNLOCKED: return 'unlocked'
25
- case LOCK_STATE.NOT_FULLY_LOCKED: return 'notFullyLocked'
26
- case LOCK_STATE.UNLATCHED: return 'unlatched'
27
- default: return 'unknown'
28
- }
29
- }
30
-
31
- const lockStateToBoolean = (value) => {
32
- // KNX DPT 1 can represent only two states. Do not collapse transitional or
33
- // ambiguous Matter lock states into a potentially unsafe locked/unlocked value.
34
- if (Number(value) === LOCK_STATE.LOCKED) return true
35
- if (Number(value) === LOCK_STATE.UNLOCKED) return false
36
- return undefined
37
- }
38
-
39
- const setupDoorLockProfile = (RED, node, config) => {
40
- // Profiles initialize the same flags consumed by knxUltimate-config as ordinary
41
- // KNX nodes. In particular, listenallga must remain enabled for handleSend calls.
42
- node.name = config.name || node.matterDeviceName || 'Control Matter door lock from KNX'
43
- node.topic = node.name
44
- node.notifyreadrequest = true
45
- node.notifyreadrequestalsorespondtobus = 'false'
46
- node.notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized = ''
47
- node.notifyresponse = false
48
- node.notifywrite = true
49
- node.initialread = true
50
- node.listenallga = true
51
- node.outputtype = 'write'
52
- node.outputRBE = 'false'
53
- node.inputRBE = 'false'
54
- node.passthrough = 'no'
55
- node.currentLockState = undefined
56
- node.matterConnectionStatus = ''
57
- node.knxUltimateAcceptedGAs = [config.GALightSwitch, config.GALightState]
58
- .map((ga) => String(ga || '').trim())
59
- .filter((ga) => ga !== '')
60
-
61
- const setStatus = (fill, shape, text) => {
62
- if (node.matterCommandBlocked === true) return
63
- node.status({ fill, shape, text })
64
- }
65
- // knxUltimate-config invokes this synchronously from addClient(). Profiles return
66
- // early from the main light constructor, so they must expose the callback before
67
- // registering with the shared KNX configuration node.
68
- node.setNodeStatus = ({ fill = 'grey', shape = 'ring', text = '' } = {}) => {
69
- if (node.currentLockState !== undefined) {
70
- const state = lockStateToBoolean(node.currentLockState)
71
- const knxText = text ? ` | KNX: ${text}` : ''
72
- setStatus(state === undefined ? 'yellow' : 'blue', state === undefined ? 'ring' : 'dot', `Matter: ${lockStateName(node.currentLockState)}${knxText}`)
73
- return
74
- }
75
- setStatus(fill, shape, text)
76
- }
77
-
78
- const commandArgs = () => {
79
- // Matter represents the remote credential as bytes. Keep the PIN in Node-RED's
80
- // credential store and materialize the Buffer only for the outgoing command.
81
- const pin = String(node.credentials?.doorLockPin || '')
82
- return pin === '' ? {} : { pinCode: Buffer.from(pin, 'utf8') }
83
- }
84
-
85
- const sendFlow = (source, state, rawState) => {
86
- if (config.enableNodePINS !== 'yes') return
87
- node.send({
88
- topic: node.topic,
89
- payload: state,
90
- matter: {
91
- source,
92
- nodeId: node.matterNodeId,
93
- endpointId: node.matterEndpointId,
94
- clusterId: DOOR_LOCK_CLUSTER_ID,
95
- lockState: rawState,
96
- lockStateName: rawState === undefined ? (state ? 'locked' : 'unlocked') : lockStateName(rawState)
97
- }
98
- })
99
- }
100
-
101
- const writeKnxState = (state, outputtype = 'write') => {
102
- const ga = String(config.GALightState || '').trim()
103
- if (ga === '' || !node.serverKNX) return
104
- node.serverKNX.sendKNXTelegramToKNXEngine({
105
- grpaddr: ga,
106
- payload: state,
107
- dpt: config.dptLightState || '1.001',
108
- outputtype,
109
- nodecallerid: node.id
110
- })
111
- }
112
-
113
- const publishMatterState = (rawState, source = 'matter') => {
114
- node.currentLockState = Number(rawState)
115
- const state = lockStateToBoolean(rawState)
116
- const name = lockStateName(rawState)
117
- // Attribute reports update KNX state only; they never enqueue a Matter command.
118
- // This one-way path is the primary feedback-loop guard for Door Lock endpoints.
119
- if (state !== undefined) writeKnxState(state)
120
- sendFlow(source, state, rawState)
121
- setStatus(state === undefined ? 'yellow' : 'blue', state === undefined ? 'ring' : 'dot', `Matter: ${name}`)
122
- }
123
-
124
- const queueCommand = (locked, source = 'knx') => {
125
- if (node.matterCommandBlocked === true) return false
126
- const manager = node.serverMatter?.matterManager
127
- if (!manager) throw new Error('Matter controller not ready')
128
- const capabilities = (() => {
129
- try { return JSON.parse(config.matterDeviceCapabilities || '{}') } catch (error) { return {} }
130
- })()
131
- // Never invent optional operations: the editor persists the commands actually
132
- // advertised by this endpoint and runtime validation enforces that snapshot.
133
- if (locked && capabilities.lockDoor === false) throw new Error('The Matter endpoint does not expose lockDoor')
134
- if (!locked && capabilities.unlockDoor === false) throw new Error('The Matter endpoint does not expose unlockDoor')
135
- const queued = manager.writeMatterQueueAdd({
136
- nodeId: node.matterNodeId,
137
- endpointId: node.matterEndpointId,
138
- clusterId: DOOR_LOCK_CLUSTER_ID,
139
- kind: 'command',
140
- name: locked ? 'lockDoor' : 'unlockDoor',
141
- args: commandArgs()
142
- })
143
- if (queued && typeof queued.catch === 'function') {
144
- queued.catch((error) => {
145
- RED.log.error(`knxUltimateMatterControllerDevice DoorLock command: ${error.message}`)
146
- setStatus('red', 'ring', error.message)
147
- })
148
- }
149
- sendFlow(source, locked)
150
- setStatus('green', 'dot', `KNX→Matter: ${locked ? 'lock' : 'unlock'}`)
151
- return true
152
- }
153
-
154
- node.handleSend = (msg) => {
155
- try {
156
- if (!msg?.knx || !node.knxUltimateAcceptedGAs.includes(String(msg.knx.destination || '').trim())) return
157
- if (node.matterCommandBlocked === true) return
158
- if (msg.knx.event === 'GroupValue_Read') {
159
- if (String(msg.knx.destination) === String(config.GALightState)) {
160
- const state = lockStateToBoolean(node.currentLockState)
161
- if (state !== undefined) writeKnxState(state, 'response')
162
- }
163
- return
164
- }
165
- if (String(msg.knx.destination) !== String(config.GALightSwitch)) return
166
- queueCommand(decodeKnxBoolean(msg, config.dptLightSwitch), 'knx')
167
- } catch (error) {
168
- RED.log.error(`knxUltimateMatterControllerDevice DoorLock KNX: ${error.message}`)
169
- setStatus('red', 'ring', error.message)
170
- }
171
- }
172
-
173
- node.handleSendMatter = (event) => {
174
- try {
175
- if (String(event?.nodeId) !== String(node.matterNodeId)) return
176
- if (Number(event?.endpointId) !== Number(node.matterEndpointId)) return
177
- if (Number(event?.clusterId) !== DOOR_LOCK_CLUSTER_ID || event.attributeName !== 'lockState') return
178
- publishMatterState(event.value)
179
- } catch (error) {
180
- RED.log.error(`knxUltimateMatterControllerDevice DoorLock Matter: ${error.message}`)
181
- }
182
- }
183
- node.handleMatterClusterEvent = () => {}
184
- node.handleMatterNodeInitialized = () => {
185
- try {
186
- // The controller engine already caches the initial attribute read. Reusing that
187
- // value avoids an extra request and publishes startup state through the same path.
188
- const value = node.serverMatter?.matterManager?.getCachedAttribute(
189
- node.matterNodeId,
190
- node.matterEndpointId,
191
- DOOR_LOCK_CLUSTER_ID,
192
- 'lockState'
193
- )
194
- if (value !== undefined && value !== null) publishMatterState(value, 'initial')
195
- } catch (error) {
196
- RED.log.error(`knxUltimateMatterControllerDevice DoorLock initial state: ${error.message}`)
197
- }
198
- }
199
- node.setNodeStatusMatter = (status) => {
200
- if (!status || !status.text) return
201
- node.matterConnectionStatus = status.text
202
- const isAvailable = /^(connected|ready|controller ready)$/i.test(status.text)
203
- if (isAvailable && node.currentLockState !== undefined) {
204
- const state = lockStateToBoolean(node.currentLockState)
205
- setStatus(state === undefined ? 'yellow' : 'blue', state === undefined ? 'ring' : 'dot', `Matter: ${lockStateName(node.currentLockState)}`)
206
- return
207
- }
208
- setStatus(status.fill || 'grey', status.shape || 'ring', status.text)
209
- }
210
-
211
- if (node.serverKNX) {
212
- node.serverKNX.removeClient(node)
213
- node.serverKNX.addClient(node)
214
- } else {
215
- setStatus('yellow', 'ring', 'No KNX gateway selected')
216
- }
217
- if (node.serverMatter) {
218
- node.serverMatter.removeClient(node)
219
- node.serverMatter.addClient(node)
220
- }
221
-
222
- node.on('input', (msg, send, done) => {
223
- try {
224
- if (node.matterCommandBlocked === true) throw new Error(node.matterCommandBlockReason || 'Matter device unavailable')
225
- const semantic = semanticPayload(msg)
226
- let value
227
- if (semantic) {
228
- if (!['lock', 'locked'].includes(semantic.functionName)) throw new Error(`Unsupported Matter function "${semantic.functionName}". Supported: lock`)
229
- value = semantic.value
230
- } else {
231
- value = typeof msg.payload === 'object' && msg.payload !== null && msg.payload.locked !== undefined
232
- ? msg.payload.locked
233
- : msg.payload
234
- }
235
- if (typeof value !== 'boolean') throw new Error('Door Lock input requires msg.payload boolean or { locked: boolean }')
236
- queueCommand(value, 'flow')
237
- if (done) done()
238
- } catch (error) {
239
- setStatus('red', 'ring', error.message)
240
- if (done) done(error)
241
- else node.error(error, msg)
242
- }
243
- })
244
-
245
- node.on('close', (done) => {
246
- try { if (node.serverKNX) node.serverKNX.removeClient(node) } catch (error) { /* empty */ }
247
- try { if (node.serverMatter) node.serverMatter.removeClient(node) } catch (error) { /* empty */ }
248
- done()
249
- })
250
- }
251
-
252
- module.exports = {
253
- DOOR_LOCK_CLUSTER_ID,
254
- LOCK_STATE,
255
- lockStateName,
256
- lockStateToBoolean,
257
- setupDoorLockProfile
258
- }
@@ -1,19 +0,0 @@
1
- 'use strict'
2
-
3
- const { setupMappedEndpointProfile } = require('./mappedEndpoint')
4
-
5
- const FAN_CONTROL_CLUSTER_ID = 0x0202
6
-
7
- const setupFanProfile = (RED, node, config) => setupMappedEndpointProfile(RED, node, config, {
8
- profileName: 'fan',
9
- eventClusterId: FAN_CONTROL_CLUSTER_ID,
10
- formatAttributeStatus: (event) => {
11
- if (['percentCurrent', 'percentSetting'].includes(event.attributeName) && event.value !== null && event.value !== undefined) {
12
- return `Matter fan: ${Math.round(Number(event.value))}%`
13
- }
14
- if (event.attributeName === 'fanMode') return `Matter fan mode: ${event.value}`
15
- return ''
16
- }
17
- })
18
-
19
- module.exports = { FAN_CONTROL_CLUSTER_ID, setupFanProfile }
@@ -1,34 +0,0 @@
1
- 'use strict'
2
-
3
- const { setupDoorLockProfile } = require('./doorLock')
4
- const { setupMappedEndpointProfile } = require('./mappedEndpoint')
5
- const { setupWindowCoveringProfile } = require('./windowCovering')
6
- const { setupThermostatProfile } = require('./thermostat')
7
- const { setupFanProfile } = require('./fan')
8
- const { setupSwitchProfile } = require('./switch')
9
- const { setupUniversalProfile } = require('./universal')
10
-
11
- // Controller-side Matter device profiles live behind this registry. Keep profile
12
- // selection capability-driven: the editor records the profile only after inspecting
13
- // the endpoint's actual device types, clusters, attributes and supported commands.
14
- const PROFILE_SETUPS = Object.freeze({
15
- doorLock: setupDoorLockProfile,
16
- windowCovering: setupWindowCoveringProfile,
17
- thermostat: setupThermostatProfile,
18
- fan: setupFanProfile,
19
- switch: setupSwitchProfile,
20
- mapped: setupMappedEndpointProfile,
21
- universal: setupUniversalProfile
22
- })
23
-
24
- const setupMatterControllerProfile = (profile, RED, node, config) => {
25
- const setup = PROFILE_SETUPS[profile]
26
- // Returning false is significant: the caller must continue through the unchanged
27
- // Matter-light implementation when no specialized profile claims the endpoint.
28
- if (typeof setup !== 'function') return false
29
- // A profile that returns successfully owns input, close, KNX and Matter handlers.
30
- setup(RED, node, config)
31
- return true
32
- }
33
-
34
- module.exports = { PROFILE_SETUPS, setupMatterControllerProfile }