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.
- package/CHANGELOG.md +20 -10
- package/MIGRATION.md +40 -0
- package/README.md +32 -6
- package/docs/README.md +34 -0
- package/docs/assets/brand/made-in-italy.svg +12 -0
- package/examples/Alerter - Device Alert Aggregation.json +5 -2
- package/examples/Auto Responder - Read Request Defaults.json +5 -2
- package/examples/Garage - Door Controller.json +5 -2
- package/examples/Global Context - Expose KNX Values.json +5 -2
- package/examples/KNX DateTime - Set Date and Time to Bus.json +111 -89
- package/examples/Load Control - Manual Shedding Mode.json +5 -2
- package/examples/Logger ETS File and Telegram Count.json +10 -2
- package/examples/Scene Controller Recall and Save.json +33 -6
- package/examples/Staircase - Timer, Override and Block.json +5 -2
- package/examples/WatchDog Connect Disconnect.json +98 -70
- package/nodes/commonFunctions.js +0 -587
- package/nodes/knxUltimate-config.html +0 -14
- package/nodes/knxUltimate-config.js +1 -18
- package/nodes/knxUltimate.html +1 -6
- package/nodes/knxUltimateIoTBridge.html +0 -14
- package/nodes/knxUltimateLegacyMigration.js +75 -0
- package/nodes/knxUltimateMultiRouting.html +1 -7
- package/nodes/knxUltimateRouterFilter.html +1 -7
- package/nodes/knxUltimateUtility.html +0 -6
- package/nodes/knxUltimateViewer.html +0 -6
- package/nodes/locales/de/knxUltimate-config.html +0 -8
- package/nodes/locales/de/knxUltimate.html +0 -8
- package/nodes/locales/de/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/de/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/de/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/de/knxUltimateUtility.html +0 -8
- package/nodes/locales/de/knxUltimateUtility.json +16 -1
- package/nodes/locales/de/knxUltimateViewer.html +0 -8
- package/nodes/locales/en/knxUltimate-config.html +0 -8
- package/nodes/locales/en/knxUltimate.html +0 -8
- package/nodes/locales/en/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/en/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/en/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/en/knxUltimateUtility.html +0 -8
- package/nodes/locales/en/knxUltimateUtility.json +16 -1
- package/nodes/locales/en/knxUltimateViewer.html +0 -8
- package/nodes/locales/es/knxUltimate-config.html +0 -8
- package/nodes/locales/es/knxUltimate.html +0 -8
- package/nodes/locales/es/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/es/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/es/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/es/knxUltimateUtility.html +0 -8
- package/nodes/locales/es/knxUltimateUtility.json +17 -2
- package/nodes/locales/es/knxUltimateViewer.html +0 -8
- package/nodes/locales/fr/knxUltimate-config.html +0 -8
- package/nodes/locales/fr/knxUltimate.html +0 -8
- package/nodes/locales/fr/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/fr/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/fr/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/fr/knxUltimateUtility.html +0 -8
- package/nodes/locales/fr/knxUltimateUtility.json +16 -1
- package/nodes/locales/fr/knxUltimateViewer.html +0 -8
- package/nodes/locales/it/knxUltimate-config.html +0 -8
- package/nodes/locales/it/knxUltimate.html +0 -8
- package/nodes/locales/it/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/it/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/it/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/it/knxUltimateUtility.html +0 -8
- package/nodes/locales/it/knxUltimateUtility.json +16 -1
- package/nodes/locales/it/knxUltimateViewer.html +0 -8
- package/nodes/locales/zh-CN/knxUltimate-config.html +0 -8
- package/nodes/locales/zh-CN/knxUltimate.html +0 -8
- package/nodes/locales/zh-CN/knxUltimateIoTBridge.html +0 -8
- package/nodes/locales/zh-CN/knxUltimateMultiRouting.html +0 -8
- package/nodes/locales/zh-CN/knxUltimateRouterFilter.html +0 -8
- package/nodes/locales/zh-CN/knxUltimateUtility.html +0 -8
- package/nodes/locales/zh-CN/knxUltimateUtility.json +16 -1
- package/nodes/locales/zh-CN/knxUltimateViewer.html +0 -8
- package/nodes/plugins/knxUltimate-v8-migration-recovery-plugin.html +140 -0
- package/package.json +22 -69
- package/resources/11f26b4500.js +2 -2
- package/resources/KNXAIChatAdapterMappings.js +2 -416
- package/resources/configNodeEditorSelection.js +2 -32
- package/resources/hueControllerEditorSelection.js +2 -32
- package/resources/hueControllerMigrationDialog.js +2 -254
- package/resources/hueControllerProfiles.js +2 -9319
- package/resources/knxUtilityProfiles.js +2041 -2082
- package/resources/legacyMigrationNotice.js +23 -111
- package/resources/matterQrScanner.js +2 -98
- package/resources/upgradeToV8.js +94 -26
- package/scripts/check-legacy-flows.js +142 -0
- package/examples/Hue Area Motion - Zone Presence.json +0 -77
- package/examples/Hue Battery - Level Status.json +0 -77
- package/examples/Hue Button - Short and Dim Commands.json +0 -83
- package/examples/Hue Camera Motion - Presence.json +0 -77
- package/examples/Hue Config - Bridge Template.json +0 -27
- package/examples/Hue Contact Sensor - Open Closed.json +0 -75
- package/examples/Hue Device Software Update - Availability.json +0 -77
- package/examples/Hue Humidity Sensor - Relative Humidity.json +0 -77
- package/examples/Hue Light - Switch and Brightness.json +0 -67
- package/examples/Hue Light Sensor - Lux to KNX.json +0 -77
- package/examples/Hue Motion - Presence Sensor.json +0 -76
- package/examples/Hue Plug - Switch and State.json +0 -63
- package/examples/Hue Scene - Recall from KNX.json +0 -63
- package/examples/Hue Tap Dial - Relative Dimming.json +0 -76
- package/examples/Hue Temperature Sensor - Celsius to KNX.json +0 -77
- package/examples/Hue Zigbee Connectivity - Online Status.json +0 -77
- package/examples/Matter Controller - Semantic Flow Input.json +0 -248
- package/nodes/hue-config.html +0 -378
- package/nodes/hue-config.js +0 -846
- package/nodes/icons/node-alerter-icon.png +0 -0
- package/nodes/icons/node-homekit-icon.png +0 -0
- package/nodes/icons/node-homekit-icon.svg +0 -10
- package/nodes/icons/node-hue-icon.svg +0 -10
- package/nodes/icons/node-knx-icon.png +0 -0
- package/nodes/icons/node-logger-icon.png +0 -0
- package/nodes/icons/node-logger2-icon.png +0 -0
- package/nodes/icons/node-logger2-icon.svg +0 -32
- package/nodes/icons/node-matter-bridge-icon.svg +0 -6
- package/nodes/icons/node-matter-controller-icon.svg +0 -6
- package/nodes/icons/node-matter-icon.svg +0 -12
- package/nodes/icons/node-scene-icon.png +0 -0
- package/nodes/icons/node-watchdog-icon.png +0 -0
- package/nodes/knxUltimateAI.html +0 -1826
- package/nodes/knxUltimateAI.js +0 -16797
- package/nodes/knxUltimateAIHomeAssistant.html +0 -54
- package/nodes/knxUltimateAIHomeAssistant.js +0 -152
- package/nodes/knxUltimateAlerter.html +0 -267
- package/nodes/knxUltimateAlerter.js +0 -300
- package/nodes/knxUltimateAutoResponder.html +0 -128
- package/nodes/knxUltimateAutoResponder.js +0 -264
- package/nodes/knxUltimateDateTime.html +0 -579
- package/nodes/knxUltimateDateTime.js +0 -282
- package/nodes/knxUltimateGarage.html +0 -337
- package/nodes/knxUltimateGarage.js +0 -504
- package/nodes/knxUltimateGlobalContext.html +0 -145
- package/nodes/knxUltimateGlobalContext.js +0 -208
- package/nodes/knxUltimateHATranslator.html +0 -85
- package/nodes/knxUltimateHATranslator.js +0 -83
- package/nodes/knxUltimateHueAreaMotion.html +0 -670
- package/nodes/knxUltimateHueAreaMotion.js +0 -218
- package/nodes/knxUltimateHueBattery.html +0 -646
- package/nodes/knxUltimateHueBattery.js +0 -182
- package/nodes/knxUltimateHueButton.html +0 -804
- package/nodes/knxUltimateHueButton.js +0 -292
- package/nodes/knxUltimateHueCameraMotion.html +0 -671
- package/nodes/knxUltimateHueCameraMotion.js +0 -218
- package/nodes/knxUltimateHueContactSensor.html +0 -609
- package/nodes/knxUltimateHueContactSensor.js +0 -188
- package/nodes/knxUltimateHueController.html +0 -1765
- package/nodes/knxUltimateHueController.js +0 -28
- package/nodes/knxUltimateHueHumiditySensor.html +0 -641
- package/nodes/knxUltimateHueHumiditySensor.js +0 -201
- package/nodes/knxUltimateHueLight.html +0 -2516
- package/nodes/knxUltimateHueLight.js +0 -1582
- package/nodes/knxUltimateHueLightSensor.html +0 -636
- package/nodes/knxUltimateHueLightSensor.js +0 -177
- package/nodes/knxUltimateHueMotion.html +0 -634
- package/nodes/knxUltimateHueMotion.js +0 -182
- package/nodes/knxUltimateHuePlug.html +0 -576
- package/nodes/knxUltimateHuePlug.js +0 -341
- package/nodes/knxUltimateHueScene.html +0 -967
- package/nodes/knxUltimateHueScene.js +0 -349
- package/nodes/knxUltimateHueTapDial.html +0 -640
- package/nodes/knxUltimateHueTapDial.js +0 -268
- package/nodes/knxUltimateHueTemperatureSensor.html +0 -639
- package/nodes/knxUltimateHueTemperatureSensor.js +0 -184
- package/nodes/knxUltimateHueZigbeeConnectivity.html +0 -648
- package/nodes/knxUltimateHueZigbeeConnectivity.js +0 -182
- package/nodes/knxUltimateHuedevice_software_update.html +0 -650
- package/nodes/knxUltimateHuedevice_software_update.js +0 -182
- package/nodes/knxUltimateLoadControl.html +0 -425
- package/nodes/knxUltimateLoadControl.js +0 -443
- package/nodes/knxUltimateLogger.html +0 -197
- package/nodes/knxUltimateLogger.js +0 -224
- package/nodes/knxUltimateMatterBridge.html +0 -689
- package/nodes/knxUltimateMatterBridge.js +0 -464
- package/nodes/knxUltimateMatterControllerDevice.html +0 -2851
- package/nodes/knxUltimateMatterControllerDevice.js +0 -1747
- package/nodes/knxUltimateSceneController.html +0 -529
- package/nodes/knxUltimateSceneController.js +0 -437
- package/nodes/knxUltimateStaircase.html +0 -346
- package/nodes/knxUltimateStaircase.js +0 -463
- package/nodes/knxUltimateWatchDog.html +0 -241
- package/nodes/knxUltimateWatchDog.js +0 -230
- package/nodes/locales/de/hue-config.html +0 -33
- package/nodes/locales/de/hue-config.json +0 -21
- package/nodes/locales/de/knxUltimateAI.html +0 -13
- package/nodes/locales/de/knxUltimateAI.json +0 -231
- package/nodes/locales/de/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/de/knxUltimateAlerter.html +0 -159
- package/nodes/locales/de/knxUltimateAlerter.json +0 -27
- package/nodes/locales/de/knxUltimateAutoResponder.html +0 -96
- package/nodes/locales/de/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/de/knxUltimateDateTime.html +0 -45
- package/nodes/locales/de/knxUltimateDateTime.json +0 -32
- package/nodes/locales/de/knxUltimateGarage.html +0 -79
- package/nodes/locales/de/knxUltimateGarage.json +0 -51
- package/nodes/locales/de/knxUltimateGlobalContext.html +0 -76
- package/nodes/locales/de/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/de/knxUltimateHATranslator.html +0 -25
- package/nodes/locales/de/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/de/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/de/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/de/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/de/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/de/knxUltimateHueButton.html +0 -52
- package/nodes/locales/de/knxUltimateHueButton.json +0 -34
- package/nodes/locales/de/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/de/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/de/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/de/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/de/knxUltimateHueController.html +0 -690
- package/nodes/locales/de/knxUltimateHueController.json +0 -64
- package/nodes/locales/de/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/de/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/de/knxUltimateHueLight.html +0 -121
- package/nodes/locales/de/knxUltimateHueLight.json +0 -94
- package/nodes/locales/de/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/de/knxUltimateHueLightSensor.json +0 -19
- package/nodes/locales/de/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/de/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/de/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/de/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/de/knxUltimateHueScene.html +0 -45
- package/nodes/locales/de/knxUltimateHueScene.json +0 -41
- package/nodes/locales/de/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/de/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/de/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/de/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/de/knxUltimateHuedevice_software_update.html +0 -36
- package/nodes/locales/de/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/de/knxUltimateLoadControl.html +0 -69
- package/nodes/locales/de/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/de/knxUltimateLogger.html +0 -126
- package/nodes/locales/de/knxUltimateLogger.json +0 -31
- package/nodes/locales/de/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/de/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/de/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/de/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/de/knxUltimateSceneController.html +0 -98
- package/nodes/locales/de/knxUltimateSceneController.json +0 -32
- package/nodes/locales/de/knxUltimateStaircase.html +0 -77
- package/nodes/locales/de/knxUltimateStaircase.json +0 -62
- package/nodes/locales/de/knxUltimateWatchDog.html +0 -178
- package/nodes/locales/de/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/de/matter-config.html +0 -47
- package/nodes/locales/de/matter-config.json +0 -47
- package/nodes/locales/de/matterbridge-config.html +0 -45
- package/nodes/locales/de/matterbridge-config.json +0 -25
- package/nodes/locales/en/hue-config.html +0 -31
- package/nodes/locales/en/hue-config.json +0 -21
- package/nodes/locales/en/knxUltimateAI.html +0 -13
- package/nodes/locales/en/knxUltimateAI.json +0 -234
- package/nodes/locales/en/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/en/knxUltimateAlerter.html +0 -164
- package/nodes/locales/en/knxUltimateAlerter.json +0 -27
- package/nodes/locales/en/knxUltimateAutoResponder.html +0 -94
- package/nodes/locales/en/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/en/knxUltimateDateTime.html +0 -67
- package/nodes/locales/en/knxUltimateDateTime.json +0 -32
- package/nodes/locales/en/knxUltimateGarage.html +0 -79
- package/nodes/locales/en/knxUltimateGarage.json +0 -51
- package/nodes/locales/en/knxUltimateGlobalContext.html +0 -124
- package/nodes/locales/en/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/en/knxUltimateHATranslator.html +0 -25
- package/nodes/locales/en/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/en/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/en/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/en/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/en/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/en/knxUltimateHueButton.html +0 -52
- package/nodes/locales/en/knxUltimateHueButton.json +0 -34
- package/nodes/locales/en/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/en/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/en/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/en/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/en/knxUltimateHueController.html +0 -691
- package/nodes/locales/en/knxUltimateHueController.json +0 -64
- package/nodes/locales/en/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/en/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/en/knxUltimateHueLight.html +0 -124
- package/nodes/locales/en/knxUltimateHueLight.json +0 -94
- package/nodes/locales/en/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/en/knxUltimateHueLightSensor.json +0 -19
- package/nodes/locales/en/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/en/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/en/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/en/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/en/knxUltimateHueScene.html +0 -45
- package/nodes/locales/en/knxUltimateHueScene.json +0 -41
- package/nodes/locales/en/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/en/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/en/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/en/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/en/knxUltimateHuedevice_software_update.html +0 -36
- package/nodes/locales/en/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/en/knxUltimateLoadControl.html +0 -76
- package/nodes/locales/en/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/en/knxUltimateLogger.html +0 -161
- package/nodes/locales/en/knxUltimateLogger.json +0 -31
- package/nodes/locales/en/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/en/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/en/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/en/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/en/knxUltimateSceneController.html +0 -117
- package/nodes/locales/en/knxUltimateSceneController.json +0 -32
- package/nodes/locales/en/knxUltimateStaircase.html +0 -77
- package/nodes/locales/en/knxUltimateStaircase.json +0 -62
- package/nodes/locales/en/knxUltimateWatchDog.html +0 -244
- package/nodes/locales/en/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/en/matter-config.html +0 -47
- package/nodes/locales/en/matter-config.json +0 -48
- package/nodes/locales/en/matterbridge-config.html +0 -45
- package/nodes/locales/en/matterbridge-config.json +0 -25
- package/nodes/locales/es/hue-config.html +0 -31
- package/nodes/locales/es/hue-config.json +0 -21
- package/nodes/locales/es/knxUltimateAI.html +0 -13
- package/nodes/locales/es/knxUltimateAI.json +0 -231
- package/nodes/locales/es/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/es/knxUltimateAlerter.html +0 -164
- package/nodes/locales/es/knxUltimateAlerter.json +0 -27
- package/nodes/locales/es/knxUltimateAutoResponder.html +0 -81
- package/nodes/locales/es/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/es/knxUltimateDateTime.html +0 -45
- package/nodes/locales/es/knxUltimateDateTime.json +0 -32
- package/nodes/locales/es/knxUltimateGarage.html +0 -79
- package/nodes/locales/es/knxUltimateGarage.json +0 -51
- package/nodes/locales/es/knxUltimateGlobalContext.html +0 -128
- package/nodes/locales/es/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/es/knxUltimateHATranslator.html +0 -25
- package/nodes/locales/es/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/es/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/es/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/es/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/es/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/es/knxUltimateHueButton.html +0 -52
- package/nodes/locales/es/knxUltimateHueButton.json +0 -34
- package/nodes/locales/es/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/es/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/es/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/es/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/es/knxUltimateHueController.html +0 -691
- package/nodes/locales/es/knxUltimateHueController.json +0 -64
- package/nodes/locales/es/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/es/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/es/knxUltimateHueLight.html +0 -124
- package/nodes/locales/es/knxUltimateHueLight.json +0 -94
- package/nodes/locales/es/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/es/knxUltimateHueLightSensor.json +0 -19
- package/nodes/locales/es/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/es/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/es/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/es/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/es/knxUltimateHueScene.html +0 -45
- package/nodes/locales/es/knxUltimateHueScene.json +0 -41
- package/nodes/locales/es/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/es/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/es/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/es/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/es/knxUltimateHuedevice_software_update.html +0 -36
- package/nodes/locales/es/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/es/knxUltimateLoadControl.html +0 -76
- package/nodes/locales/es/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/es/knxUltimateLogger.html +0 -162
- package/nodes/locales/es/knxUltimateLogger.json +0 -31
- package/nodes/locales/es/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/es/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/es/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/es/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/es/knxUltimateSceneController.html +0 -115
- package/nodes/locales/es/knxUltimateSceneController.json +0 -32
- package/nodes/locales/es/knxUltimateStaircase.html +0 -77
- package/nodes/locales/es/knxUltimateStaircase.json +0 -62
- package/nodes/locales/es/knxUltimateWatchDog.html +0 -230
- package/nodes/locales/es/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/es/matter-config.html +0 -47
- package/nodes/locales/es/matter-config.json +0 -47
- package/nodes/locales/es/matterbridge-config.html +0 -45
- package/nodes/locales/es/matterbridge-config.json +0 -25
- package/nodes/locales/fr/hue-config.html +0 -31
- package/nodes/locales/fr/hue-config.json +0 -21
- package/nodes/locales/fr/knxUltimateAI.html +0 -13
- package/nodes/locales/fr/knxUltimateAI.json +0 -231
- package/nodes/locales/fr/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/fr/knxUltimateAlerter.html +0 -164
- package/nodes/locales/fr/knxUltimateAlerter.json +0 -27
- package/nodes/locales/fr/knxUltimateAutoResponder.html +0 -92
- package/nodes/locales/fr/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/fr/knxUltimateDateTime.html +0 -45
- package/nodes/locales/fr/knxUltimateDateTime.json +0 -32
- package/nodes/locales/fr/knxUltimateGarage.html +0 -79
- package/nodes/locales/fr/knxUltimateGarage.json +0 -51
- package/nodes/locales/fr/knxUltimateGlobalContext.html +0 -122
- package/nodes/locales/fr/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/fr/knxUltimateHATranslator.html +0 -25
- package/nodes/locales/fr/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/fr/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/fr/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/fr/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/fr/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/fr/knxUltimateHueButton.html +0 -52
- package/nodes/locales/fr/knxUltimateHueButton.json +0 -34
- package/nodes/locales/fr/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/fr/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/fr/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/fr/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/fr/knxUltimateHueController.html +0 -691
- package/nodes/locales/fr/knxUltimateHueController.json +0 -64
- package/nodes/locales/fr/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/fr/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/fr/knxUltimateHueLight.html +0 -124
- package/nodes/locales/fr/knxUltimateHueLight.json +0 -86
- package/nodes/locales/fr/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/fr/knxUltimateHueLightSensor.json +0 -19
- package/nodes/locales/fr/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/fr/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/fr/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/fr/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/fr/knxUltimateHueScene.html +0 -45
- package/nodes/locales/fr/knxUltimateHueScene.json +0 -41
- package/nodes/locales/fr/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/fr/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/fr/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/fr/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/fr/knxUltimateHuedevice_software_update.html +0 -36
- package/nodes/locales/fr/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/fr/knxUltimateLoadControl.html +0 -76
- package/nodes/locales/fr/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/fr/knxUltimateLogger.html +0 -160
- package/nodes/locales/fr/knxUltimateLogger.json +0 -31
- package/nodes/locales/fr/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/fr/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/fr/knxUltimateSceneController.html +0 -117
- package/nodes/locales/fr/knxUltimateSceneController.json +0 -32
- package/nodes/locales/fr/knxUltimateStaircase.html +0 -77
- package/nodes/locales/fr/knxUltimateStaircase.json +0 -62
- package/nodes/locales/fr/knxUltimateWatchDog.html +0 -228
- package/nodes/locales/fr/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/fr/matter-config.html +0 -47
- package/nodes/locales/fr/matter-config.json +0 -47
- package/nodes/locales/fr/matterbridge-config.html +0 -45
- package/nodes/locales/fr/matterbridge-config.json +0 -25
- package/nodes/locales/it/hue-config.html +0 -33
- package/nodes/locales/it/hue-config.json +0 -21
- package/nodes/locales/it/knxUltimateAI.html +0 -13
- package/nodes/locales/it/knxUltimateAI.json +0 -234
- package/nodes/locales/it/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/it/knxUltimateAlerter.html +0 -159
- package/nodes/locales/it/knxUltimateAlerter.json +0 -27
- package/nodes/locales/it/knxUltimateAutoResponder.html +0 -96
- package/nodes/locales/it/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/it/knxUltimateDateTime.html +0 -67
- package/nodes/locales/it/knxUltimateDateTime.json +0 -32
- package/nodes/locales/it/knxUltimateGarage.html +0 -79
- package/nodes/locales/it/knxUltimateGarage.json +0 -51
- package/nodes/locales/it/knxUltimateGlobalContext.html +0 -81
- package/nodes/locales/it/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/it/knxUltimateHATranslator.html +0 -24
- package/nodes/locales/it/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/it/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/it/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/it/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/it/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/it/knxUltimateHueButton.html +0 -52
- package/nodes/locales/it/knxUltimateHueButton.json +0 -34
- package/nodes/locales/it/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/it/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/it/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/it/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/it/knxUltimateHueController.html +0 -690
- package/nodes/locales/it/knxUltimateHueController.json +0 -64
- package/nodes/locales/it/knxUltimateHueHumiditySensor 2.html +0 -11
- package/nodes/locales/it/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/it/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/it/knxUltimateHueLight.html +0 -124
- package/nodes/locales/it/knxUltimateHueLight.json +0 -94
- package/nodes/locales/it/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/it/knxUltimateHueLightSensor.json +0 -19
- package/nodes/locales/it/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/it/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/it/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/it/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/it/knxUltimateHueScene.html +0 -45
- package/nodes/locales/it/knxUltimateHueScene.json +0 -41
- package/nodes/locales/it/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/it/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/it/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/it/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/it/knxUltimateHuedevice_software_update.html +0 -35
- package/nodes/locales/it/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/it/knxUltimateLoadControl.html +0 -76
- package/nodes/locales/it/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/it/knxUltimateLogger.html +0 -132
- package/nodes/locales/it/knxUltimateLogger.json +0 -31
- package/nodes/locales/it/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/it/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/it/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/it/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/it/knxUltimateSceneController.html +0 -101
- package/nodes/locales/it/knxUltimateSceneController.json +0 -32
- package/nodes/locales/it/knxUltimateStaircase.html +0 -77
- package/nodes/locales/it/knxUltimateStaircase.json +0 -62
- package/nodes/locales/it/knxUltimateWatchDog.html +0 -194
- package/nodes/locales/it/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/it/matter-config.html +0 -47
- package/nodes/locales/it/matter-config.json +0 -48
- package/nodes/locales/it/matterbridge-config.html +0 -45
- package/nodes/locales/it/matterbridge-config.json +0 -25
- package/nodes/locales/zh-CN/hue-config.html +0 -33
- package/nodes/locales/zh-CN/hue-config.json +0 -21
- package/nodes/locales/zh-CN/knxUltimateAI.html +0 -13
- package/nodes/locales/zh-CN/knxUltimateAI.json +0 -231
- package/nodes/locales/zh-CN/knxUltimateAIHomeAssistant.html +0 -11
- package/nodes/locales/zh-CN/knxUltimateAlerter.html +0 -159
- package/nodes/locales/zh-CN/knxUltimateAlerter.json +0 -27
- package/nodes/locales/zh-CN/knxUltimateAutoResponder.html +0 -94
- package/nodes/locales/zh-CN/knxUltimateAutoResponder.json +0 -8
- package/nodes/locales/zh-CN/knxUltimateDateTime.html +0 -45
- package/nodes/locales/zh-CN/knxUltimateDateTime.json +0 -32
- package/nodes/locales/zh-CN/knxUltimateGarage.html +0 -79
- package/nodes/locales/zh-CN/knxUltimateGarage.json +0 -51
- package/nodes/locales/zh-CN/knxUltimateGlobalContext.html +0 -77
- package/nodes/locales/zh-CN/knxUltimateGlobalContext.json +0 -24
- package/nodes/locales/zh-CN/knxUltimateHATranslator.html +0 -25
- package/nodes/locales/zh-CN/knxUltimateHATranslator.json +0 -8
- package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.html +0 -44
- package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.json +0 -31
- package/nodes/locales/zh-CN/knxUltimateHueBattery.html +0 -37
- package/nodes/locales/zh-CN/knxUltimateHueBattery.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateHueButton.html +0 -52
- package/nodes/locales/zh-CN/knxUltimateHueButton.json +0 -34
- package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.html +0 -38
- package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateHueContactSensor.html +0 -35
- package/nodes/locales/zh-CN/knxUltimateHueContactSensor.json +0 -26
- package/nodes/locales/zh-CN/knxUltimateHueController.html +0 -693
- package/nodes/locales/zh-CN/knxUltimateHueController.json +0 -64
- package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.html +0 -38
- package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateHueLight.html +0 -126
- package/nodes/locales/zh-CN/knxUltimateHueLight.json +0 -86
- package/nodes/locales/zh-CN/knxUltimateHueLightSensor.html +0 -38
- package/nodes/locales/zh-CN/knxUltimateHueLightSensor.json +0 -9
- package/nodes/locales/zh-CN/knxUltimateHueMotion.html +0 -41
- package/nodes/locales/zh-CN/knxUltimateHueMotion.json +0 -27
- package/nodes/locales/zh-CN/knxUltimateHuePlug.html +0 -50
- package/nodes/locales/zh-CN/knxUltimateHuePlug.json +0 -33
- package/nodes/locales/zh-CN/knxUltimateHueScene.html +0 -45
- package/nodes/locales/zh-CN/knxUltimateHueScene.json +0 -41
- package/nodes/locales/zh-CN/knxUltimateHueTapDial.html +0 -40
- package/nodes/locales/zh-CN/knxUltimateHueTapDial.json +0 -28
- package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.html +0 -38
- package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.html +0 -39
- package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.html +0 -36
- package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.json +0 -30
- package/nodes/locales/zh-CN/knxUltimateLoadControl.html +0 -76
- package/nodes/locales/zh-CN/knxUltimateLoadControl.json +0 -28
- package/nodes/locales/zh-CN/knxUltimateLogger.html +0 -126
- package/nodes/locales/zh-CN/knxUltimateLogger.json +0 -31
- package/nodes/locales/zh-CN/knxUltimateMatterBridge.html +0 -65
- package/nodes/locales/zh-CN/knxUltimateMatterBridge.json +0 -123
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +0 -57
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.json +0 -146
- package/nodes/locales/zh-CN/knxUltimateSceneController.html +0 -98
- package/nodes/locales/zh-CN/knxUltimateSceneController.json +0 -32
- package/nodes/locales/zh-CN/knxUltimateStaircase.html +0 -77
- package/nodes/locales/zh-CN/knxUltimateStaircase.json +0 -62
- package/nodes/locales/zh-CN/knxUltimateWatchDog.html +0 -178
- package/nodes/locales/zh-CN/knxUltimateWatchDog.json +0 -27
- package/nodes/locales/zh-CN/matter-config.html +0 -47
- package/nodes/locales/zh-CN/matter-config.json +0 -47
- package/nodes/locales/zh-CN/matterbridge-config.html +0 -45
- package/nodes/locales/zh-CN/matterbridge-config.json +0 -25
- package/nodes/matter-config.html +0 -578
- package/nodes/matter-config.js +0 -387
- package/nodes/matterbridge-config.html +0 -198
- package/nodes/matterbridge-config.js +0 -261
- package/nodes/plugins/knxUltimate-cerebrum-runtime-plugin.js +0 -79
- package/nodes/plugins/knxUltimate-migration-notice-plugin.html +0 -44
- package/nodes/plugins/knxUltimateAI-vue/assets/app.css +0 -1
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +0 -13
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-html2canvas.esm.js +0 -5
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-index.es.js +0 -5
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-jspdf.es.min.js +0 -79
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-purify.es.js +0 -3
- package/nodes/plugins/knxUltimateAI-vue/index.html +0 -13
- package/nodes/utils/HueEventStream.mjs +0 -176
- package/nodes/utils/colorManipulators/XYFromRGB_Supergiovane.js +0 -113
- package/nodes/utils/colorManipulators/hueColorConverter.js +0 -521
- package/nodes/utils/http.js +0 -291
- package/nodes/utils/hueControllerProfileAdapter.js +0 -104
- package/nodes/utils/hueControllerProfiles/runtime/area_motion.js +0 -221
- package/nodes/utils/hueControllerProfiles/runtime/button.js +0 -295
- package/nodes/utils/hueControllerProfiles/runtime/camera_motion.js +0 -221
- package/nodes/utils/hueControllerProfiles/runtime/contact.js +0 -191
- package/nodes/utils/hueControllerProfiles/runtime/device_power.js +0 -185
- package/nodes/utils/hueControllerProfiles/runtime/device_software_update.js +0 -185
- package/nodes/utils/hueControllerProfiles/runtime/humidity.js +0 -204
- package/nodes/utils/hueControllerProfiles/runtime/light.js +0 -1585
- package/nodes/utils/hueControllerProfiles/runtime/light_level.js +0 -180
- package/nodes/utils/hueControllerProfiles/runtime/motion.js +0 -185
- package/nodes/utils/hueControllerProfiles/runtime/plug.js +0 -344
- package/nodes/utils/hueControllerProfiles/runtime/relative_rotary.js +0 -271
- package/nodes/utils/hueControllerProfiles/runtime/scene.js +0 -352
- package/nodes/utils/hueControllerProfiles/runtime/temperature.js +0 -187
- package/nodes/utils/hueControllerProfiles/runtime/zigbee_connectivity.js +0 -185
- package/nodes/utils/hueControllerResourceCatalog.js +0 -71
- package/nodes/utils/hueEngine.mjs +0 -469
- package/nodes/utils/knxAiCamera.js +0 -302
- package/nodes/utils/knxAiCatalogRetrieval.js +0 -349
- package/nodes/utils/knxAiCerebrum.js +0 -406
- package/nodes/utils/knxAiChatContext.js +0 -496
- package/nodes/utils/knxAiEventHistory.js +0 -521
- package/nodes/utils/knxAiHomeMemory.js +0 -1021
- package/nodes/utils/knxAiScheduler.js +0 -445
- package/nodes/utils/knxAiSemanticContext.js +0 -662
- package/nodes/utils/knxAiTelegramVoice.js +0 -545
- package/nodes/utils/knxAiWebAccess.js +0 -631
- package/nodes/utils/lightEngines/canonicalLight.js +0 -75
- package/nodes/utils/lightEngines/hueLightEngine.js +0 -51
- package/nodes/utils/lightEngines/index.js +0 -25
- package/nodes/utils/lightEngines/knxLightCommand.js +0 -79
- package/nodes/utils/lightEngines/lightEngine.js +0 -46
- package/nodes/utils/lightEngines/matterHueShim.js +0 -59
- package/nodes/utils/lightEngines/matterLightEngine.js +0 -117
- package/nodes/utils/matterBridgeDeviceFactory.mjs +0 -780
- package/nodes/utils/matterBridgeEngine.mjs +0 -297
- package/nodes/utils/matterControllerCommandGate.js +0 -47
- package/nodes/utils/matterControllerProfiles/doorLock.js +0 -258
- package/nodes/utils/matterControllerProfiles/fan.js +0 -19
- package/nodes/utils/matterControllerProfiles/index.js +0 -34
- package/nodes/utils/matterControllerProfiles/mappedEndpoint.js +0 -217
- package/nodes/utils/matterControllerProfiles/switch.js +0 -13
- package/nodes/utils/matterControllerProfiles/thermostat.js +0 -19
- package/nodes/utils/matterControllerProfiles/universal.js +0 -462
- package/nodes/utils/matterControllerProfiles/windowCovering.js +0 -19
- package/nodes/utils/matterControllerSemanticInput.js +0 -212
- package/nodes/utils/matterEngine.mjs +0 -894
- package/nodes/utils/matterEnvironmentLock.mjs +0 -32
- package/nodes/utils/matterKnxConverter.js +0 -204
- package/nodes/utils/matterStorageBackup.js +0 -100
- package/resources/HA-icon.png +0 -0
- package/resources/dim.png +0 -0
- package/resources/rgb.png +0 -0
- package/resources/tunablewhite.png +0 -0
- package/resources/zxing-browser-0.2.0.min.js +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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.
|
package/resources/upgradeToV8.js
CHANGED
|
@@ -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
|
|
45
|
-
//
|
|
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
|
-
|
|
899
|
-
|
|
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
|
-
|
|
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($,
|
|
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
|
-
|
|
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
|
-
|
|
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($,
|
|
1050
|
-
t('
|
|
1051
|
-
t('
|
|
1052
|
-
|
|
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('
|
|
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(
|
|
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($,
|
|
1099
|
-
t('
|
|
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: [{
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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()
|