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,3 +1,5 @@
1
+ // Compatibility with the version 7 plugin cached by a running Node-RED process.
2
+ // Version 8 does not register that plugin. Keep this URL until the process restarts.
1
3
  (function (root, factory) {
2
4
  const api = factory()
3
5
  if (typeof module === 'object' && module.exports) module.exports = api
@@ -5,133 +7,43 @@
5
7
  }(typeof globalThis !== 'undefined' ? globalThis : this, function () {
6
8
  'use strict'
7
9
 
8
- const I18N_PREFIX = 'node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.startup_migration.'
9
10
  const installations = new WeakMap()
11
+ const messages = {
12
+ en: 'KNX Ultimate 8 has been installed. Restart the Node-RED service, then reload this page to finish the upgrade. Do this before editing or deploying flows; reloading the browser alone is not enough.',
13
+ it: 'KNX Ultimate 8 è stato installato. Riavvia il servizio Node-RED, poi ricarica questa pagina per completare l’aggiornamento. Fallo prima di modificare i flow o fare Deploy: ricaricare soltanto il browser non basta.',
14
+ de: 'KNX Ultimate 8 wurde installiert. Starten Sie den Node-RED-Dienst neu und laden Sie danach diese Seite neu, um das Update abzuschließen. Tun Sie dies vor dem Bearbeiten oder Deployen von Flows; das Neuladen des Browsers allein reicht nicht aus.',
15
+ fr: 'KNX Ultimate 8 a été installé. Redémarrez le service Node-RED, puis rechargez cette page pour terminer la mise à jour. Faites-le avant de modifier ou de déployer des flows ; recharger uniquement le navigateur ne suffit pas.',
16
+ es: 'KNX Ultimate 8 se ha instalado. Reinicia el servicio Node-RED y después recarga esta página para completar la actualización. Hazlo antes de editar o desplegar flows; recargar solo el navegador no es suficiente.',
17
+ zh: 'KNX Ultimate 8 已安装。请重启 Node-RED 服务,然后重新加载此页面以完成升级。请先完成这些操作,再编辑或部署流程;仅刷新浏览器是不够的。'
18
+ }
10
19
 
11
20
  function install (RED, options = {}) {
12
21
  if (installations.has(RED)) return installations.get(RED)
13
22
  const environment = options.environment || globalThis
14
- const $ = options.$ || environment.jQuery
15
- const documentObject = environment.document
16
23
  let notification
17
24
  let timer
18
- let dismissed = false
19
25
  let disposed = false
20
- let migrating = false
21
- let closeMigration
22
- let lastCounts = ''
23
-
24
- function translate (key, fallback, values = {}) {
25
- const qualifiedKey = I18N_PREFIX + key
26
- let result
27
- try { result = RED._(qualifiedKey, values) } catch (error) { /* use fallback */ }
28
- result = result && result !== qualifiedKey ? result : fallback
29
- return result.replace(/{{\s*(\w+)\s*}}/g, (match, name) => values[name] === undefined ? match : String(values[name]))
30
- }
31
-
32
- function closeNotice () {
33
- if (notification) notification.close()
34
- notification = undefined
35
- lastCounts = ''
36
- }
37
26
 
38
- // Defer scans until the current import, undo or conversion batch finishes.
39
- // Node events also cover initial loading in Node-RED's safe mode.
40
- function schedule () {
27
+ function dispose () {
41
28
  if (disposed) return
42
- if (timer !== undefined) environment.clearTimeout(timer)
43
- timer = environment.setTimeout(refresh, 150)
44
- }
45
-
46
- function migrationClosed () {
47
- migrating = false
48
- closeMigration = undefined
49
- schedule()
50
- }
51
-
52
- function openMigration (kind) {
53
- if (disposed || migrating) return
54
- closeNotice()
55
- migrating = true
56
- try {
57
- if (kind === 'hue') {
58
- closeMigration = environment.KNXUltimateHueControllerMigrationDialog.open({
59
- RED, $, windowObject: environment, documentObject, onClose: migrationClosed
60
- })
61
- } else {
62
- closeMigration = environment.KNXUltimateUtilityMigration.migrate(RED, {
63
- environment, $, onClose: migrationClosed
64
- })
65
- }
66
- } catch (error) {
67
- migrationClosed()
68
- RED.notify(translate('unavailable', 'The migration tool is unavailable. Reload the editor after restarting Node-RED.'), 'error')
69
- }
70
- }
71
-
72
- function refresh () {
73
- timer = undefined
74
- if (disposed || dismissed || migrating) return
75
- const hueApi = environment.KNXUltimateHueControllerMigration
76
- const knxApi = environment.KNXUltimateUtilityMigration
77
- if (!hueApi || !knxApi) return
78
- const hue = hueApi.collectLegacyHueNodes(RED).length
79
- const knx = knxApi.collectLegacyUtilityNodes(RED).length
80
- if (!hue && !knx) {
81
- closeNotice()
82
- return
83
- }
84
- const counts = `${hue}:${knx}`
85
- if (notification && counts === lastCounts) return
86
- lastCounts = counts
87
-
88
- const message = $('<div></div>')
89
- $('<p></p>').append($('<strong></strong>').text(translate('title', 'Legacy KNX Ultimate nodes'))).appendTo(message)
90
- $('<p></p>').text(translate('message', 'Legacy nodes found in your flows and subflows: HUE: {{hue}}; KNX utility: {{knx}}. These nodes still work, but are hidden from the palette. Migrate them to HUE Controller and KNX Utility. Each migration downloads a flow backup; review the result before deploying.', { hue, knx })).appendTo(message)
91
- const buttons = []
92
- if (hue) buttons.push({
93
- text: translate('hue_button', 'Migrate HUE ({{count}})', { count: hue }),
94
- click: () => openMigration('hue')
95
- })
96
- if (knx) buttons.push({
97
- text: translate('knx_button', 'Migrate KNX ({{count}})', { count: knx }),
98
- click: () => openMigration('knx')
99
- })
100
- buttons.push({
101
- text: translate('later', 'Later'),
102
- click () {
103
- dismissed = true
104
- closeNotice()
105
- }
106
- })
107
- const settings = { type: 'warning', fixed: true, modal: false, buttons, silent: true }
108
- if (notification) notification.update(message, settings)
109
- else notification = RED.notify(message, settings)
110
- }
111
-
112
- function reset () {
113
- dismissed = false
114
- closeNotice()
115
- if (closeMigration) closeMigration()
116
- migrating = false
117
- schedule()
118
- }
119
-
120
- const events = ['nodes:add', 'nodes:remove', 'nodes:change', 'workspace:dirty', 'deploy']
121
- events.forEach(event => RED.events.on(event, schedule))
122
- RED.events.on('workspace:clear', reset)
123
- const dispose = () => {
124
29
  disposed = true
125
30
  if (timer !== undefined) environment.clearTimeout(timer)
126
- events.forEach(event => RED.events.off(event, schedule))
127
- RED.events.off('workspace:clear', reset)
128
- if (closeMigration) closeMigration()
129
- closeNotice()
31
+ if (notification && typeof notification.close === 'function') notification.close()
130
32
  installations.delete(RED)
131
33
  }
34
+
132
35
  const installation = { dispose }
133
36
  installations.set(RED, installation)
134
- schedule()
37
+ // Let plugin registration finish before showing the non-modal notification.
38
+ timer = environment.setTimeout(function () {
39
+ timer = undefined
40
+ if (disposed || typeof RED.notify !== 'function') return
41
+ const language = typeof RED.i18n?.lang === 'function'
42
+ ? RED.i18n.lang()
43
+ : environment.navigator?.language
44
+ const message = messages[String(language || 'en').toLowerCase().split(/[-_]/)[0]] || messages.en
45
+ notification = RED.notify(message, { type: 'warning', fixed: true, modal: false })
46
+ }, 0)
135
47
  return installation
136
48
  }
137
49
 
@@ -1,98 +1,2 @@
1
- (function (root, factory) {
2
- const api = factory()
3
- if (typeof module === 'object' && module.exports) module.exports = api
4
- if (root) root.KNXUltimateMatterQrScanner = api
5
- }(typeof globalThis !== 'undefined' ? globalThis : this, function () {
6
- 'use strict'
7
-
8
- function normalizeMatterQrPayload (rawValue) {
9
- const value = typeof rawValue === 'string' ? rawValue.trim() : ''
10
- if (!/^MT:[0-9A-Z.-]+$/.test(value)) return null
11
- return value
12
- }
13
-
14
- function getResultText (result) {
15
- if (result && typeof result.getText === 'function') return result.getText()
16
- if (result && typeof result.text === 'string') return result.text
17
- return ''
18
- }
19
-
20
- function getCameraStatus (browserWindow, browserNavigator) {
21
- if (!browserWindow || browserWindow.isSecureContext !== true) {
22
- return { available: false, reason: 'insecure' }
23
- }
24
- if (!browserNavigator || !browserNavigator.mediaDevices || typeof browserNavigator.mediaDevices.getUserMedia !== 'function') {
25
- return { available: false, reason: 'unsupported' }
26
- }
27
- return { available: true, reason: null }
28
- }
29
-
30
- function stopVideo (videoElement) {
31
- if (!videoElement) return
32
- const stream = videoElement.srcObject
33
- if (stream && typeof stream.getTracks === 'function') {
34
- stream.getTracks().forEach(function (track) {
35
- try {
36
- track.stop()
37
- } catch (error) { /* empty */ }
38
- })
39
- }
40
- try {
41
- videoElement.pause()
42
- } catch (error) { /* empty */ }
43
- try {
44
- videoElement.srcObject = null
45
- } catch (error) { /* empty */ }
46
- }
47
-
48
- function isCameraPermissionError (error) {
49
- return Boolean(error && (error.name === 'NotAllowedError' || error.name === 'SecurityError'))
50
- }
51
-
52
- function invertCanvasPixels (canvas) {
53
- if (!canvas || typeof canvas.getContext !== 'function') throw new Error('Canvas is not available')
54
- let context
55
- try {
56
- context = canvas.getContext('2d', { willReadFrequently: true })
57
- } catch (error) {
58
- context = canvas.getContext('2d')
59
- }
60
- if (!context) throw new Error('Canvas 2D context is not available')
61
- const imageData = context.getImageData(0, 0, canvas.width, canvas.height)
62
- for (let index = 0; index < imageData.data.length; index += 4) {
63
- imageData.data[index] = 255 - imageData.data[index]
64
- imageData.data[index + 1] = 255 - imageData.data[index + 1]
65
- imageData.data[index + 2] = 255 - imageData.data[index + 2]
66
- }
67
- context.putImageData(imageData, 0, 0)
68
- return canvas
69
- }
70
-
71
- function enableInvertedQrFallback (reader) {
72
- if (!reader || typeof reader.decodeFromCanvas !== 'function') throw new Error('QR reader is not available')
73
- const decodeFromCanvas = reader.decodeFromCanvas.bind(reader)
74
- reader.decodeFromCanvas = function (canvas) {
75
- try {
76
- return decodeFromCanvas(canvas)
77
- } catch (normalError) {
78
- try {
79
- invertCanvasPixels(canvas)
80
- return decodeFromCanvas(canvas)
81
- } catch (invertedError) {
82
- throw normalError
83
- }
84
- }
85
- }
86
- return reader
87
- }
88
-
89
- return {
90
- enableInvertedQrFallback,
91
- getCameraStatus,
92
- getResultText,
93
- invertCanvasPixels,
94
- isCameraPermissionError,
95
- normalizeMatterQrPayload,
96
- stopVideo
97
- }
98
- }))
1
+ // Inert compatibility resource for the version 7 Matter editor cached before restart.
2
+ // Matter pairing and QR scanning now belong to node-red-contrib-matter-ultimate.
@@ -41,8 +41,8 @@
41
41
  'matterbridge-config': 'matter-ultimate-bridge-config',
42
42
  knxUltimateMatterControllerDevice: 'matterUltimateController',
43
43
  knxUltimateMatterBridge: 'matterUltimateBridge',
44
- // This short-lived beta type is still blocked by the version 8 install
45
- // guard. Its saved contract is compatible with the standalone Controller.
44
+ // This short-lived beta type has a saved contract compatible with the
45
+ // standalone Controller.
46
46
  knxUltimateMatterLight: 'matterUltimateController'
47
47
  })
48
48
  const AI_TYPES = Object.freeze(new Set(['knxUltimateAI', 'knxUltimateAIHomeAssistant']))
@@ -51,6 +51,7 @@
51
51
  const I18N_PREFIX = 'node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.v8_upgrade.'
52
52
  const EVENT_NAMESPACE = '.knxUltimateV8Upgrade'
53
53
  const installations = new WeakMap()
54
+ const inertInstallations = new WeakMap()
54
55
  const blockedUpgrades = new WeakSet()
55
56
 
56
57
  function translate (RED, key, fallback, values = {}) {
@@ -895,8 +896,10 @@
895
896
  try {
896
897
  progress('verify')
897
898
  await verifySavedFlows({ ...options, environment }, plan)
898
- progress('install_v8')
899
- await installKnxV8({ ...options, environment })
899
+ if (!options.recoveryMode) {
900
+ progress('install_v8')
901
+ await installKnxV8({ ...options, environment })
902
+ }
900
903
  } catch (error) {
901
904
  error.flowsPersisted = true
902
905
  throw error
@@ -1013,44 +1016,60 @@
1013
1016
  function open (RED, options = {}) {
1014
1017
  const environment = options.environment || root || {}
1015
1018
  const $ = options.$ || environment.jQuery
1019
+ const recoveryMode = options.recoveryMode === true
1020
+ const offerRecoveryRetry = function () {
1021
+ if (recoveryMode && typeof options.onRecoveryRetry === 'function') options.onRecoveryRetry()
1022
+ }
1016
1023
  if (!$ || typeof RED.notify !== 'function') throw new Error('The Node-RED editor notification API is unavailable')
1017
1024
  const t = (key, fallback, values) => translate(RED, key, fallback, values)
1018
1025
  if (blockedUpgrades.has(RED)) {
1019
- return RED.notify(t('upgrade_locked', 'An upgrade is already running or Node-RED must be restarted/reloaded before it can be tried again.'), { type: 'warning', fixed: true })
1026
+ RED.notify(t('upgrade_locked', 'An upgrade is already running or Node-RED must be restarted/reloaded before it can be tried again.'), { type: 'warning', fixed: true })
1027
+ return false
1020
1028
  }
1021
1029
  let plan
1022
1030
  try {
1023
1031
  plan = createMigrationPlan(RED, { ...options, environment })
1024
1032
  } catch (error) {
1025
1033
  RED.notify(t('preflight_failed', 'Upgrade preflight failed:') + ' ' + error.message, { type: 'error', fixed: true })
1026
- return
1034
+ return false
1027
1035
  }
1028
1036
 
1029
1037
  if (plan.ai.length) {
1030
- const message = makeMessage($, t('title', 'Upgrade to KNX Ultimate 8'), [
1038
+ const message = makeMessage($, recoveryMode
1039
+ ? t('recovery_title', 'Complete KNX Ultimate 8 migration')
1040
+ : t('title', 'Upgrade to KNX Ultimate 8'), [
1031
1041
  t('ai_blocked', 'Found {{count}} legacy KNX AI nodes. The automatic upgrade stopped before making changes. Replace or remove those nodes first; their configuration cannot be converted safely to Cerebrum Ultimate.', { count: plan.ai.length })
1032
1042
  ])
1033
- return RED.notify(message, { type: 'error', fixed: true, modal: true })
1043
+ RED.notify(message, { type: 'error', fixed: true, modal: true })
1044
+ return false
1034
1045
  }
1035
1046
  try {
1036
1047
  validatePreflight(RED, plan)
1037
1048
  } catch (error) {
1038
1049
  RED.notify(t('preflight_failed', 'Upgrade preflight failed:') + ' ' + error.message, { type: 'error', fixed: true })
1039
- return
1050
+ return false
1040
1051
  }
1041
1052
  const needsModuleInspection = plan.needsHue || plan.needsMatter
1042
1053
  if (RED.user && typeof RED.user.hasPermission === 'function' &&
1043
1054
  (!RED.user.hasPermission('flows.read') || !RED.user.hasPermission('flows.write') ||
1044
1055
  (needsModuleInspection && !RED.user.hasPermission('nodes.read')))) {
1045
- return RED.notify(t('permission_denied', 'Your Node-RED account cannot install nodes or deploy flows.'), { type: 'error', fixed: true })
1056
+ RED.notify(t('permission_denied', 'Your Node-RED account cannot install nodes or deploy flows.'), { type: 'error', fixed: true })
1057
+ return false
1046
1058
  }
1047
1059
 
1048
1060
  const values = plan.counts
1049
- const message = makeMessage($, t('title', 'Upgrade to KNX Ultimate 8'), [
1050
- t('summary', 'Ready to upgrade. Nodes/configurations to convert: KNX Utility {{utility}}, HUE {{hue}}, Matter {{matter}}.', values),
1051
- t('confirm', 'A JSON backup of all flows will download first. The required HUE/Matter packages will then be installed, all current editor changes deployed, and KNX Ultimate 8 installed. IDs, wiring, configuration references, credentials and Matter storage are preserved. The current node editor will close and discard edits not yet saved in this form.', values),
1052
- t('restart_note', 'When the process finishes, you must restart the Node-RED service and reload the editor.', values)
1053
- ])
1061
+ const message = makeMessage($, recoveryMode
1062
+ ? t('recovery_title', 'Complete KNX Ultimate 8 migration')
1063
+ : t('title', 'Upgrade to KNX Ultimate 8'), recoveryMode
1064
+ ? [
1065
+ t('recovery_summary', 'Legacy nodes were found after KNX Ultimate 8 was installed. Nodes/configurations to convert: KNX Utility {{utility}}, HUE {{hue}}, Matter {{matter}}.', values),
1066
+ t('recovery_confirm', 'A JSON backup of all flows will download first. The required HUE/Matter packages will then be installed and all current editor changes deployed. KNX Ultimate itself will not be reinstalled. IDs, wiring, configuration references, credentials and Matter storage are preserved. The current node editor will close and discard edits not yet saved in this form.', values)
1067
+ ]
1068
+ : [
1069
+ t('summary', 'Ready to upgrade. Nodes/configurations to convert: KNX Utility {{utility}}, HUE {{hue}}, Matter {{matter}}.', values),
1070
+ t('confirm', 'A JSON backup of all flows will download first. The required HUE/Matter packages will then be installed, all current editor changes deployed, and KNX Ultimate 8 installed. IDs, wiring, configuration references, credentials and Matter storage are preserved. The current node editor will close and discard edits not yet saved in this form.', values),
1071
+ t('restart_note', 'When the process finishes, you must restart the Node-RED service and reload the editor.', values)
1072
+ ])
1054
1073
  let notification
1055
1074
  let running = false
1056
1075
  notification = RED.notify(message, {
@@ -1058,9 +1077,17 @@
1058
1077
  fixed: true,
1059
1078
  modal: true,
1060
1079
  buttons: [
1061
- { text: t('cancel', 'Cancel'), click: () => notification.close() },
1062
1080
  {
1063
- text: t('start', 'Back up and upgrade'),
1081
+ text: t('cancel', 'Cancel'),
1082
+ click: () => {
1083
+ notification.close()
1084
+ offerRecoveryRetry()
1085
+ }
1086
+ },
1087
+ {
1088
+ text: recoveryMode
1089
+ ? t('recovery_start', 'Back up and complete migration')
1090
+ : t('start', 'Back up and upgrade'),
1064
1091
  class: 'primary',
1065
1092
  click: function () {
1066
1093
  if (running) return
@@ -1086,24 +1113,40 @@
1086
1113
  progressNotice = RED.notify(progressMessage, { type: 'info', fixed: true, modal: true })
1087
1114
  } catch (error) {
1088
1115
  if (unlockEditor) unlockEditor()
1089
- RED.notify(t('failed', 'Automatic upgrade stopped safely. KNX Ultimate 8 was not activated:') + ' ' + error.message, { type: 'error', fixed: true })
1116
+ RED.notify(recoveryMode
1117
+ ? t('recovery_failed', 'Automatic migration stopped safely:') + ' ' + error.message
1118
+ : t('failed', 'Automatic upgrade stopped safely. KNX Ultimate 8 was not activated:') + ' ' + error.message, { type: 'error', fixed: true })
1119
+ offerRecoveryRetry()
1090
1120
  return
1091
1121
  }
1092
1122
  const onProgress = stage => progressText.text(t('progress_' + stage, stage))
1093
1123
  let keepDeployBlocked = false
1094
1124
  Promise.resolve().then(() => runUpgrade(RED, plan, { ...options, environment, $, onProgress }))
1095
1125
  .then(counts => {
1126
+ // Unknown config nodes are converted in place. The full Deploy
1127
+ // is correct, but a browser reload is required to rebuild their
1128
+ // editor indexes and user references from the converted flow.
1096
1129
  keepDeployBlocked = true
1097
1130
  if (progressNotice && typeof progressNotice.close === 'function') progressNotice.close()
1098
- const done = makeMessage($, t('complete_title', 'KNX Ultimate 8 installed'), [
1099
- t('complete', 'Converted {{total}} nodes/configurations and installed KNX Ultimate 8. Restart the Node-RED service now, then reload this page. Do not edit or deploy flows before restarting.', counts)
1131
+ const done = makeMessage($, recoveryMode
1132
+ ? t('recovery_complete_title', 'KNX Ultimate 8 migration completed')
1133
+ : t('complete_title', 'KNX Ultimate 8 installed'), [
1134
+ recoveryMode
1135
+ ? t('recovery_complete', 'Converted {{total}} legacy nodes/configurations. The saved flows are now compatible with KNX Ultimate 8. Reload the editor before making further changes.', counts)
1136
+ : t('complete', 'Converted {{total}} nodes/configurations and installed KNX Ultimate 8. Restart the Node-RED service now, then reload this page. Do not edit or deploy flows before restarting.', counts)
1100
1137
  ])
1101
1138
  let doneNotice
1102
1139
  doneNotice = RED.notify(done, {
1103
1140
  type: 'success',
1104
1141
  fixed: true,
1105
1142
  modal: true,
1106
- buttons: [{ text: t('close', 'Close'), click: () => doneNotice.close() }]
1143
+ buttons: [{
1144
+ text: recoveryMode ? t('recovery_reload', 'Reload editor') : t('close', 'Close'),
1145
+ click: () => {
1146
+ doneNotice.close()
1147
+ if (recoveryMode && environment.location && typeof environment.location.reload === 'function') environment.location.reload()
1148
+ }
1149
+ }]
1107
1150
  })
1108
1151
  })
1109
1152
  .catch(error => {
@@ -1111,13 +1154,19 @@
1111
1154
  let failureMessage
1112
1155
  if (error.code === 'standalone_restart_required') {
1113
1156
  keepDeployBlocked = true
1114
- failureMessage = t('standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then press the upgrade button again. No flows were changed.')
1157
+ failureMessage = recoveryMode
1158
+ ? t('recovery_standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then start the migration recovery again. No flows were changed.')
1159
+ : t('standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then press the upgrade button again. No flows were changed.')
1115
1160
  } else if (error.moduleInstallUncertain) {
1116
1161
  keepDeployBlocked = true
1117
- failureMessage = t('module_install_uncertain', 'A package operation may still be running. Restart the Node-RED service, reload the editor and press the upgrade button again. Do not deploy flows before restarting.')
1162
+ failureMessage = recoveryMode
1163
+ ? t('recovery_module_install_uncertain', 'A package operation may still be running. Restart the Node-RED service, reload the editor and start the migration recovery again. Do not deploy flows before restarting.')
1164
+ : t('module_install_uncertain', 'A package operation may still be running. Restart the Node-RED service, reload the editor and press the upgrade button again. Do not deploy flows before restarting.')
1118
1165
  } else if (error.restartRequired) {
1119
1166
  keepDeployBlocked = true
1120
- failureMessage = t('standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then press the upgrade button again. No flows were changed.') + ' ' + error.message
1167
+ failureMessage = (recoveryMode
1168
+ ? t('recovery_standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then start the migration recovery again. No flows were changed.')
1169
+ : t('standalone_restart_required', 'A HUE/Matter package update is ready. Restart the Node-RED service, reload the editor, then press the upgrade button again. No flows were changed.')) + ' ' + error.message
1121
1170
  } else if (error.flowConflict) {
1122
1171
  keepDeployBlocked = true
1123
1172
  failureMessage = t('flow_conflict', 'Another editor changed the flow revision. The automatic conversion was rolled back locally. Review or export any pre-existing local changes, then reload the editor before trying again.')
@@ -1126,11 +1175,16 @@
1126
1175
  failureMessage = t('persistence_uncertain', 'Node-RED did not confirm the flow save. No automatic rollback was applied. Reload the editor and review the saved flows before trying again.')
1127
1176
  } else if (error.flowsPersisted) {
1128
1177
  keepDeployBlocked = true
1129
- failureMessage = t('flows_persisted', 'The converted flows were saved, but KNX Ultimate 8 was not installed. Do not deploy more changes. Resolve the reported error, reload the editor and press the upgrade button again:') + ' ' + error.message
1178
+ failureMessage = recoveryMode
1179
+ ? t('recovery_flows_persisted', 'The converted flows were saved, but verification did not complete. Do not deploy more changes. Reload the editor and review the saved flows before starting migration recovery again:') + ' ' + error.message
1180
+ : t('flows_persisted', 'The converted flows were saved, but KNX Ultimate 8 was not installed. Do not deploy more changes. Resolve the reported error, reload the editor and press the upgrade button again:') + ' ' + error.message
1130
1181
  } else {
1131
- failureMessage = t('failed', 'Automatic upgrade stopped safely. KNX Ultimate 8 was not activated:') + ' ' + error.message
1182
+ failureMessage = recoveryMode
1183
+ ? t('recovery_failed', 'Automatic migration stopped safely:') + ' ' + error.message
1184
+ : t('failed', 'Automatic upgrade stopped safely. KNX Ultimate 8 was not activated:') + ' ' + error.message
1132
1185
  }
1133
1186
  RED.notify(failureMessage, { type: 'error', fixed: true })
1187
+ if (!keepDeployBlocked) offerRecoveryRetry()
1134
1188
  })
1135
1189
  .finally(() => unlockEditor({ keepDeployBlocked }))
1136
1190
  }
@@ -1141,6 +1195,20 @@
1141
1195
  }
1142
1196
 
1143
1197
  function install (RED, options = {}) {
1198
+ // A running Node-RED 7 process can keep the old plugin HTML in memory while
1199
+ // npm has already replaced the package files with version 8. In that state
1200
+ // the cached plugin still requests this resource. Do not let it start a
1201
+ // second upgrade path: only the plugin shipped and registered by version 8
1202
+ // is allowed to opt in to recovery mode.
1203
+ if (options.recoveryMode !== true) {
1204
+ if (inertInstallations.has(RED)) return inertInstallations.get(RED)
1205
+ const inertInstallation = {
1206
+ open: function () {},
1207
+ dispose: function () { inertInstallations.delete(RED) }
1208
+ }
1209
+ inertInstallations.set(RED, inertInstallation)
1210
+ return inertInstallation
1211
+ }
1144
1212
  if (installations.has(RED)) return installations.get(RED)
1145
1213
  const environment = options.environment || root || {}
1146
1214
  const $ = options.$ || environment.jQuery
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env node
2
+ 'use strict'
3
+
4
+ // Best-effort npm lifecycle diagnostic only. Dependency lifecycle scripts may
5
+ // be skipped by the installer, and this hook has no access to Node-RED's live
6
+ // storage API or editor state. Never mutate flows or install other packages.
7
+ const fs = require('fs')
8
+ const path = require('path')
9
+ const os = require('os')
10
+ const LEGACY_TYPES = new Set([
11
+ 'knxUltimateAlerter', 'knxUltimateAutoResponder', 'knxUltimateDateTime',
12
+ 'knxUltimateWatchDog', 'knxUltimateGlobalContext', 'knxUltimateLogger',
13
+ 'knxUltimateStaircase', 'knxUltimateGarage', 'knxUltimateSceneController',
14
+ 'knxUltimateLoadControl', 'knxUltimateHATranslator',
15
+ 'hue-config', 'matter-config', 'matterbridge-config',
16
+ 'knxUltimateHueController', 'knxUltimateHueLight', 'knxUltimateHuePlug',
17
+ 'knxUltimateHueButton', 'knxUltimateHueTapDial', 'knxUltimateHueMotion',
18
+ 'knxUltimateHueAreaMotion', 'knxUltimateHueCameraMotion', 'knxUltimateHueContactSensor',
19
+ 'knxUltimateHueLightSensor', 'knxUltimateHueTemperatureSensor', 'knxUltimateHueHumiditySensor',
20
+ 'knxUltimateHueScene', 'knxUltimateHueBattery', 'knxUltimateHueZigbeeConnectivity',
21
+ 'knxUltimateHuedevice_software_update', 'knxUltimateMatterControllerDevice',
22
+ 'knxUltimateMatterBridge', 'knxUltimateMatterLight',
23
+ 'knxUltimateAI', 'knxUltimateAIHomeAssistant'
24
+ ])
25
+
26
+ function check (options = {}) {
27
+ const env = options.env || process.env
28
+ const cwd = options.cwd || process.cwd()
29
+ const home = options.home || os.homedir()
30
+ const packageDir = options.packageDir || path.resolve(__dirname, '..')
31
+ const version = options.version || require('../package.json').version
32
+ const result = { files: [], legacy: [], errors: [], warnings: [] }
33
+ if (!/^8\./.test(version)) return result
34
+ const candidates = new Map()
35
+ const visited = new Set()
36
+ const add = (file, required = false) => {
37
+ file = path.resolve(file)
38
+ candidates.set(file, required || /^flows(?:[_.-]|\.json$)/.test(path.basename(file)) || candidates.get(file) || false)
39
+ }
40
+ const json = file => JSON.parse(fs.readFileSync(file, 'utf8').replace(/^\uFEFF/, ''))
41
+ const scanDirectory = dir => {
42
+ if (!fs.existsSync(dir)) return
43
+ try {
44
+ const realDir = fs.realpathSync(dir)
45
+ if (visited.has(realDir)) return
46
+ visited.add(realDir)
47
+ // Restrict discovery to this directory. Never traverse backups, libraries,
48
+ // node_modules, examples or persistent device storage.
49
+ for (const file of fs.readdirSync(dir)) {
50
+ if (/\.json$/i.test(file) && !file.startsWith('.') && !/(?:_cred|credentials|backup|\.bak)(?:[._-]|$)/i.test(file) && !['package.json', 'package-lock.json'].includes(file)) add(path.join(dir, file))
51
+ }
52
+ const settings = path.join(dir, 'settings.js')
53
+ if (fs.existsSync(settings)) {
54
+ // Strip comments while retaining string literals; do not run user code.
55
+ const text = fs.readFileSync(settings, 'utf8').replace(/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\/\*[\s\S]*?\*\/|\/\/[^\r\n]*/g, token => token.startsWith('/') ? '' : token)
56
+ const match = /\bflowFile\s*:\s*(['"])([^\r\n]*?)\1\s*[,}]/.exec(text)
57
+ if (match && !match[2].includes('\\')) add(path.resolve(dir, match[2]), true)
58
+ else if (/\bflowFile\s*:/.test(text)) result.warnings.push('Dynamic flowFile setting: use KNXULTIMATE_FLOW_FILE to check its resolved path.')
59
+ }
60
+ const projectConfig = path.join(dir, '.config.projects.json')
61
+ if (fs.existsSync(projectConfig)) {
62
+ const config = json(projectConfig)
63
+ const active = config.activeProject || (config.projects && config.projects.activeProject)
64
+ if (typeof active === 'string' && active && path.basename(active) === active) {
65
+ const projectDir = path.join(dir, 'projects', active)
66
+ scanDirectory(projectDir)
67
+ const manifest = json(path.join(projectDir, 'package.json'))
68
+ const flowFile = manifest['node-red']?.settings?.flowFile
69
+ if (typeof flowFile === 'string') add(path.resolve(projectDir, flowFile), true)
70
+ }
71
+ }
72
+ } catch (error) { result.errors.push(`${dir}: unable to inspect flow files (${error.code || 'invalid JSON'}).`) }
73
+ }
74
+ if (env.KNXULTIMATE_FLOW_FILE) {
75
+ add(path.resolve(env.INIT_CWD || cwd, env.KNXULTIMATE_FLOW_FILE), true)
76
+ } else if (env.KNXULTIMATE_NODE_RED_USER_DIR) {
77
+ const dir = path.resolve(env.INIT_CWD || cwd, env.KNXULTIMATE_NODE_RED_USER_DIR)
78
+ if (!fs.existsSync(dir)) result.errors.push(`${dir}: Node-RED user directory does not exist.`)
79
+ else scanDirectory(dir)
80
+ } else {
81
+ const dirs = new Set([env.INIT_CWD, env.npm_config_local_prefix, cwd].filter(Boolean).map(p => path.resolve(p)))
82
+ // npm lifecycle cwd is the installed package, not the Node-RED userDir.
83
+ for (let dir = packageDir; path.dirname(dir) !== dir; dir = path.dirname(dir)) {
84
+ if (path.basename(dir) === 'node_modules') dirs.add(path.dirname(dir))
85
+ }
86
+ for (const dir of dirs) if (dir !== packageDir) scanDirectory(dir)
87
+ }
88
+ const inspected = new Set()
89
+ const inspectCandidates = () => {
90
+ for (const [file, required] of candidates) {
91
+ if (inspected.has(file)) continue
92
+ inspected.add(file)
93
+ try {
94
+ const data = json(file)
95
+ const flow = Array.isArray(data) ? data : (data && Array.isArray(data.flows) ? data.flows : null)
96
+ if (!flow) {
97
+ if (required) result.errors.push(`${file}: expected a Node-RED flow array.`)
98
+ continue
99
+ }
100
+ if (flow.some(node => !node || typeof node.id !== 'string' || typeof node.type !== 'string')) {
101
+ if (required || flow.some(node => node && LEGACY_TYPES.has(node.type))) result.errors.push(`${file}: invalid Node-RED flow entries.`)
102
+ else continue
103
+ }
104
+ result.files.push(file)
105
+ const counts = new Map()
106
+ for (const node of flow) if (node && LEGACY_TYPES.has(node.type)) counts.set(node.type, (counts.get(node.type) || 0) + 1)
107
+ for (const [type, count] of counts) result.legacy.push({ file, type, count })
108
+ } catch (error) {
109
+ // Report broken conventional/explicit flow files when this diagnostic
110
+ // is allowed to run; the version 8 editor bridge remains authoritative.
111
+ if (required || /^flows(?:[_.-]|\.json$)/.test(path.basename(file)) || error.code === 'EACCES') result.errors.push(`${file}: unable to read flow (${error.code || 'invalid JSON'}).`)
112
+ }
113
+ }
114
+ }
115
+ inspectCandidates()
116
+ // A random JSON file beside npm's launch directory is not evidence that the
117
+ // actual Node-RED flow has been checked. Fall back after inspecting candidates.
118
+ if (!env.KNXULTIMATE_FLOW_FILE && !env.KNXULTIMATE_NODE_RED_USER_DIR && !result.files.length && !result.errors.length) {
119
+ scanDirectory(path.join(home, '.node-red'))
120
+ inspectCandidates()
121
+ }
122
+ if (!result.files.length) result.warnings.push('No saved flow could be checked. For custom storage/paths, verify migration manually or set KNXULTIMATE_FLOW_FILE.')
123
+ return result
124
+ }
125
+
126
+ function run (options) {
127
+ const result = check(options)
128
+ if (result.legacy.length > 0) {
129
+ console.error('\nKNX Ultimate 8 migration required / Migrazione necessaria.')
130
+ for (const item of result.legacy) console.error(` ${item.file}: ${item.type} (${item.count})`)
131
+ console.error('Installation will continue. Restart the Node-RED service, open the editor and follow the KNX Ultimate migration prompt before editing or deploying flows. The editor will back up and convert supported nodes and install HUE/Matter packages when required. Legacy KNX AI nodes still require manual replacement or removal. Do not delete Matter storage.')
132
+ }
133
+ if (result.errors.length > 0) {
134
+ console.error('\nKNX Ultimate could not inspect every saved flow. Installation will continue, but you must open the Node-RED editor after restart and complete any offered migration before deploying.')
135
+ for (const error of result.errors) console.error(` ${error}`)
136
+ }
137
+ for (const warning of result.warnings) console.error(`[KNX Ultimate migration check] ${warning}`)
138
+ return 0
139
+ }
140
+
141
+ module.exports = { check, run, LEGACY_TYPES }
142
+ if (require.main === module) process.exitCode = run()