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
package/nodes/commonFunctions.js
CHANGED
|
@@ -4,7 +4,6 @@ const oOS = require('os')
|
|
|
4
4
|
const fs = require('fs')
|
|
5
5
|
const path = require('path')
|
|
6
6
|
const dptlib = require('knxultimate').dptlib
|
|
7
|
-
const customHTTP = require('./utils/http')
|
|
8
7
|
const KNXClient = require('knxultimate').KNXClient
|
|
9
8
|
const { normalizeAuthFromAccessTokenQuery } = require('./utils/httpAdminAccessToken')
|
|
10
9
|
|
|
@@ -67,34 +66,6 @@ module.exports = (RED) => {
|
|
|
67
66
|
|
|
68
67
|
// }
|
|
69
68
|
|
|
70
|
-
// 11/03/2020 Delete scene saved file, from html
|
|
71
|
-
RED.httpAdmin.get('/knxultimateCheckHueConnected', (req, res) => {
|
|
72
|
-
try {
|
|
73
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
74
|
-
if (!serverId) {
|
|
75
|
-
res.json({ ready: false })
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
if (serverId.hueAllResources === null || serverId.hueAllResources === undefined) {
|
|
79
|
-
(async function main () {
|
|
80
|
-
try {
|
|
81
|
-
if (typeof serverId.loadResourcesFromHUEBridge === 'function') {
|
|
82
|
-
await serverId.loadResourcesFromHUEBridge()
|
|
83
|
-
}
|
|
84
|
-
} catch (error) {
|
|
85
|
-
RED.log.error(`Errore RED.httpAdmin.get('/knxultimateCheckHueConnected' ${error.stack}`)
|
|
86
|
-
}
|
|
87
|
-
res.json({ ready: false })
|
|
88
|
-
}()).catch()
|
|
89
|
-
} else {
|
|
90
|
-
res.json({ ready: true })
|
|
91
|
-
}
|
|
92
|
-
} catch (error) {
|
|
93
|
-
RED.log.error(`Errore RED.httpAdmin.get('/knxultimateCheckHueConnected' ${error.stack}`)
|
|
94
|
-
res.json({ ready: false })
|
|
95
|
-
}
|
|
96
|
-
})
|
|
97
|
-
|
|
98
69
|
// 11/03/2020 Delete scene saved file, from html
|
|
99
70
|
RED.httpAdmin.get('/knxultimatescenecontrollerdelete'), (req, res) => {
|
|
100
71
|
// Delete the file
|
|
@@ -106,93 +77,6 @@ module.exports = (RED) => {
|
|
|
106
77
|
res.json({ status: 220 })
|
|
107
78
|
}
|
|
108
79
|
|
|
109
|
-
// // Find all HUE Bridges in the network
|
|
110
|
-
// RED.httpAdmin.get('/KNXUltimateDiscoverHueBridges'), (req, res) => {
|
|
111
|
-
// const url = 'https://discovery.meethue.com'; // Use HUE broker server discover process by visiting
|
|
112
|
-
// async function fetchData() {
|
|
113
|
-
// try {
|
|
114
|
-
// const response = await fetch(url); // Effettua la richiesta
|
|
115
|
-
// const dataArray = await response.json(); // Parsing dei dati JSON
|
|
116
|
-
// // Mostra l'array risultante
|
|
117
|
-
// res.json(dataArray);
|
|
118
|
-
// } catch (error) {
|
|
119
|
-
// if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(`Error fetching discovery.meethue.com ${error.stack}`);
|
|
120
|
-
// res.json("");
|
|
121
|
-
// }
|
|
122
|
-
// }
|
|
123
|
-
// fetchData();
|
|
124
|
-
// };
|
|
125
|
-
|
|
126
|
-
// Find all HUE Bridges in the network
|
|
127
|
-
RED.httpAdmin.get('/KNXUltimateGetHueBridgeInfo', RED.auth.needsPermission('hue-config.read'), (req, res) => {
|
|
128
|
-
async function fetchData () {
|
|
129
|
-
try {
|
|
130
|
-
const response = await customHTTP.getBridgeDetails(req.query.IP)
|
|
131
|
-
// Mostra l'array risultante
|
|
132
|
-
res.json(response)
|
|
133
|
-
} catch (error) {
|
|
134
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(`Error fetching discovery.meethue.com ${error.stack}`)
|
|
135
|
-
res.json({ error: error.message })
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
fetchData()
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
// Find all HUE Bridges in the network
|
|
142
|
-
RED.httpAdmin.get('/KNXUltimateGetPlainHueBridgeCredentials', RED.auth.needsPermission('hue-config.read'), (req, res) => {
|
|
143
|
-
try {
|
|
144
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
145
|
-
const username = serverId.credentials.username
|
|
146
|
-
const clientkey = serverId.credentials.clientkey
|
|
147
|
-
res.json({ username, clientkey })
|
|
148
|
-
} catch (error) {
|
|
149
|
-
res.json({ error: error.message })
|
|
150
|
-
}
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
// Endpoint for registering with the HUE Bridge
|
|
154
|
-
RED.httpAdmin.get('/KNXUltimateRegisterToHueBridge', (req, res) => {
|
|
155
|
-
(async () => {
|
|
156
|
-
try {
|
|
157
|
-
const configNode = RED.nodes.getNode(req.query.serverId)
|
|
158
|
-
const ipAddress = req.query.IP
|
|
159
|
-
if (!ipAddress) throw new Error('Bridge IP address is required.')
|
|
160
|
-
const registration = await customHTTP.registerBridgeUser(ipAddress, 'KNXUltimate', 'Node-RED')
|
|
161
|
-
const bridgeInfo = {
|
|
162
|
-
data: registration.bridge,
|
|
163
|
-
name: registration.bridge?.name || configNode?.name || 'Hue Bridge',
|
|
164
|
-
ipaddress: registration.bridge?.ipaddress || ipAddress,
|
|
165
|
-
bridgeid: registration.bridge?.bridgeid || configNode?.bridgeid || ''
|
|
166
|
-
}
|
|
167
|
-
if (configNode) {
|
|
168
|
-
try {
|
|
169
|
-
configNode.credentials = configNode.credentials || {}
|
|
170
|
-
configNode.credentials.username = registration.user.username
|
|
171
|
-
configNode.credentials.clientkey = registration.user.clientkey
|
|
172
|
-
if (typeof bridgeInfo.bridgeid === 'string' && bridgeInfo.bridgeid) {
|
|
173
|
-
try { configNode.bridgeid = bridgeInfo.bridgeid } catch (e) { /* noop */ }
|
|
174
|
-
}
|
|
175
|
-
} catch (credError) {
|
|
176
|
-
if (node.sysLogger) node.sysLogger.warn(`Hue registration: unable to persist credentials for node ${configNode.id}: ${credError.message}`)
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
res.json({ bridge: bridgeInfo, user: registration.user })
|
|
180
|
-
} catch (error) {
|
|
181
|
-
if (node.sysLogger) node.sysLogger.error(`Hue bridge registration failed: ${error.message}`)
|
|
182
|
-
res.json({ error: error.message })
|
|
183
|
-
}
|
|
184
|
-
})()
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
RED.httpAdmin.get('/KNXUltimateDiscoverHueBridges', RED.auth.needsPermission('hue-config.read'), (req, res) => {
|
|
188
|
-
customHTTP.discoverHueBridges().then((list) => {
|
|
189
|
-
res.json(Array.isArray(list) ? list : [])
|
|
190
|
-
}).catch((error) => {
|
|
191
|
-
if (node.sysLogger) node.sysLogger.error(`Hue bridge discovery failed: ${error.message}`)
|
|
192
|
-
res.json({ error: error.message })
|
|
193
|
-
})
|
|
194
|
-
})
|
|
195
|
-
|
|
196
80
|
// Endpoint for reading csv/esf by the other nodes
|
|
197
81
|
RED.httpAdmin.get('/knxUltimatecsv', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
|
|
198
82
|
try {
|
|
@@ -477,26 +361,6 @@ module.exports = (RED) => {
|
|
|
477
361
|
}
|
|
478
362
|
})
|
|
479
363
|
|
|
480
|
-
RED.httpAdmin.get('/knxUltimateGetHueColor', (req, res) => {
|
|
481
|
-
try {
|
|
482
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
483
|
-
// find wether the light is a light or is grouped_light
|
|
484
|
-
let hexColor
|
|
485
|
-
const _oDevice = serverId.hueAllResources.filter((a) => a.id === req.query.id)[0]
|
|
486
|
-
if (_oDevice.type === 'light') {
|
|
487
|
-
hexColor = serverId.getColorFromHueLight(req.query.id)
|
|
488
|
-
} else {
|
|
489
|
-
// grouped_light, get the first light in the group
|
|
490
|
-
const oLight = serverId.getFirstLightInGroup(_oDevice.id)
|
|
491
|
-
hexColor = serverId.getColorFromHueLight(oLight.id)
|
|
492
|
-
}
|
|
493
|
-
res.json(hexColor !== undefined ? hexColor : 'Select the device first!')
|
|
494
|
-
} catch (error) {
|
|
495
|
-
res.json('Select the device first!')
|
|
496
|
-
}
|
|
497
|
-
})
|
|
498
|
-
|
|
499
|
-
// 2025-09 Secure: return list of Data Secure Group Addresses from keyring
|
|
500
364
|
RED.httpAdmin.get('/knxUltimateKeyringDataSecureGAs', RED.auth.needsPermission('knxUltimate-config.read'), async (req, res) => {
|
|
501
365
|
try {
|
|
502
366
|
let keyringContent = (req.query.keyring || '').toString()
|
|
@@ -527,457 +391,6 @@ module.exports = (RED) => {
|
|
|
527
391
|
}
|
|
528
392
|
})
|
|
529
393
|
|
|
530
|
-
RED.httpAdmin.get('/knxUltimateGetKelvinColor', (req, res) => {
|
|
531
|
-
try {
|
|
532
|
-
// find wether the light is a light or is grouped_light
|
|
533
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
534
|
-
let kelvinValue
|
|
535
|
-
const _oDevice = serverId.hueAllResources.filter((a) => a.id === req.query.id)[0]
|
|
536
|
-
if (_oDevice.type === 'light') {
|
|
537
|
-
kelvinValue = serverId.getKelvinFromHueLight(req.query.id)
|
|
538
|
-
} else {
|
|
539
|
-
// grouped_light, get the first light in the group
|
|
540
|
-
const oLight = serverId.getFirstLightInGroup(_oDevice.id)
|
|
541
|
-
kelvinValue = serverId.getKelvinFromHueLight(oLight.id)
|
|
542
|
-
}
|
|
543
|
-
res.json(kelvinValue !== undefined ? kelvinValue : 'Select the device first!')
|
|
544
|
-
} catch (error) {
|
|
545
|
-
res.json('Select the device first!')
|
|
546
|
-
}
|
|
547
|
-
})
|
|
548
|
-
|
|
549
|
-
RED.httpAdmin.get('/knxUltimateGetLightObject', (req, res) => {
|
|
550
|
-
try {
|
|
551
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
552
|
-
if (serverId.hueAllResources === null || serverId.hueAllResources === undefined) {
|
|
553
|
-
throw (new Error('Resource not yet loaded'))
|
|
554
|
-
}
|
|
555
|
-
const _lightId = req.query.id
|
|
556
|
-
const oLight = serverId.hueAllResources.filter((a) => a.id === _lightId)[0]
|
|
557
|
-
// Infer some useful info, so the HTML part can avoid to query the server
|
|
558
|
-
// Kelvin
|
|
559
|
-
try {
|
|
560
|
-
if (oLight.color_temperature !== undefined && oLight.color_temperature.mirek !== undefined) {
|
|
561
|
-
oLight.calculatedKelvin = hueColorConverter.ColorConverter.mirekToKelvin(oLight.color_temperature.mirek)
|
|
562
|
-
}
|
|
563
|
-
} catch (error) {
|
|
564
|
-
oLight.calculatedKelvin = undefined
|
|
565
|
-
}
|
|
566
|
-
// HEX value from XYBri
|
|
567
|
-
try {
|
|
568
|
-
const retRGB = hueColorConverter.ColorConverter.xyBriToRgb(oLight.color.xy.x, oLight.color.xy.y, oLight.dimming.brightness)
|
|
569
|
-
const ret = `#${hueColorConverter.ColorConverter.rgbHex(retRGB.r, retRGB.g, retRGB.b).toString()}`
|
|
570
|
-
oLight.calculatedHEXColor = ret
|
|
571
|
-
} catch (error) {
|
|
572
|
-
oLight.calculatedHEXColor = undefined
|
|
573
|
-
}
|
|
574
|
-
res.json(oLight)
|
|
575
|
-
} catch (error) {
|
|
576
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(`KNXUltimateHue: hueEngine: knxUltimateGetLightObject: error ${error.message}.`)
|
|
577
|
-
res.json({})
|
|
578
|
-
}
|
|
579
|
-
})
|
|
580
|
-
|
|
581
|
-
RED.httpAdmin.post('/KNXUltimateLocateHueDevice', async (req, res) => {
|
|
582
|
-
const respondError = (status, message) => {
|
|
583
|
-
res.status(status).json({ error: message })
|
|
584
|
-
}
|
|
585
|
-
try {
|
|
586
|
-
const rawServerId = req.body?.serverId
|
|
587
|
-
const serverId = typeof rawServerId === 'string' ? rawServerId.trim() : (rawServerId ? String(rawServerId).trim() : '')
|
|
588
|
-
if (!serverId) {
|
|
589
|
-
respondError(400, 'Hue bridge not specified')
|
|
590
|
-
return
|
|
591
|
-
}
|
|
592
|
-
const hueServer = RED.nodes.getNode(serverId)
|
|
593
|
-
if (!hueServer) {
|
|
594
|
-
respondError(404, 'Hue bridge not found')
|
|
595
|
-
return
|
|
596
|
-
}
|
|
597
|
-
if (!hueServer.hueManager || !hueServer.hueManager.hueApiV2 || typeof hueServer.hueManager.hueApiV2.put !== 'function') {
|
|
598
|
-
respondError(503, 'Hue bridge not ready')
|
|
599
|
-
return
|
|
600
|
-
}
|
|
601
|
-
if (hueServer.linkStatus !== 'connected') {
|
|
602
|
-
respondError(503, 'Hue bridge is not connected')
|
|
603
|
-
return
|
|
604
|
-
}
|
|
605
|
-
const rawDeviceId = req.body?.deviceId
|
|
606
|
-
const deviceId = typeof rawDeviceId === 'string' ? rawDeviceId.trim() : (rawDeviceId ? String(rawDeviceId).trim() : '')
|
|
607
|
-
if (!deviceId) {
|
|
608
|
-
respondError(400, 'Hue device not specified')
|
|
609
|
-
return
|
|
610
|
-
}
|
|
611
|
-
const rawDeviceType = req.body?.deviceType
|
|
612
|
-
const deviceType = typeof rawDeviceType === 'string' ? rawDeviceType.trim().toLowerCase() : (rawDeviceType ? String(rawDeviceType).trim().toLowerCase() : '')
|
|
613
|
-
let resourceSnapshot = null
|
|
614
|
-
if (typeof hueServer.getHueResourceSnapshot === 'function') {
|
|
615
|
-
try {
|
|
616
|
-
resourceSnapshot = await hueServer.getHueResourceSnapshot(deviceId, { forceRefresh: false })
|
|
617
|
-
} catch (error) {
|
|
618
|
-
resourceSnapshot = null
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
const resolvedType = (resourceSnapshot?.type || deviceType || 'light').toLowerCase()
|
|
622
|
-
const targets = []
|
|
623
|
-
const addTarget = (id, type) => {
|
|
624
|
-
if (!id || !type) return
|
|
625
|
-
const trimmedId = typeof id === 'string' ? id.trim() : String(id).trim()
|
|
626
|
-
const trimmedType = typeof type === 'string' ? type.trim().toLowerCase() : String(type).trim().toLowerCase()
|
|
627
|
-
if (trimmedId === '' || trimmedType === '') return
|
|
628
|
-
targets.push({ id: trimmedId, type: trimmedType })
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
if (resolvedType === 'grouped_light') {
|
|
632
|
-
let lights = []
|
|
633
|
-
if (typeof hueServer.getAllLightsBelongingToTheGroup === 'function') {
|
|
634
|
-
try {
|
|
635
|
-
lights = await hueServer.getAllLightsBelongingToTheGroup(deviceId)
|
|
636
|
-
} catch (error) {
|
|
637
|
-
lights = []
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
if (Array.isArray(lights) && lights.length > 0) {
|
|
641
|
-
lights.forEach((lightResource) => {
|
|
642
|
-
const ownerId = lightResource?.owner?.rid
|
|
643
|
-
if (ownerId) {
|
|
644
|
-
addTarget(ownerId, 'device')
|
|
645
|
-
} else if (lightResource?.id) {
|
|
646
|
-
addTarget(lightResource.id, 'light')
|
|
647
|
-
}
|
|
648
|
-
})
|
|
649
|
-
}
|
|
650
|
-
if (targets.length === 0 && typeof hueServer.getFirstLightInGroup === 'function') {
|
|
651
|
-
const firstLight = hueServer.getFirstLightInGroup(deviceId)
|
|
652
|
-
const ownerId = firstLight?.owner?.rid
|
|
653
|
-
if (ownerId) {
|
|
654
|
-
addTarget(ownerId, 'device')
|
|
655
|
-
} else if (firstLight?.id) {
|
|
656
|
-
addTarget(firstLight.id, 'light')
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
} else if (resolvedType === 'device') {
|
|
660
|
-
addTarget(deviceId, 'device')
|
|
661
|
-
} else {
|
|
662
|
-
const ownerId = resourceSnapshot?.owner?.rid
|
|
663
|
-
if (ownerId) {
|
|
664
|
-
addTarget(ownerId, 'device')
|
|
665
|
-
} else {
|
|
666
|
-
addTarget(deviceId, resolvedType || 'light')
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
const uniqueTargets = []
|
|
671
|
-
const seenTargets = new Set()
|
|
672
|
-
targets.forEach((target) => {
|
|
673
|
-
const key = `${target.type}:${target.id}`
|
|
674
|
-
if (!seenTargets.has(key)) {
|
|
675
|
-
seenTargets.add(key)
|
|
676
|
-
uniqueTargets.push(target)
|
|
677
|
-
}
|
|
678
|
-
})
|
|
679
|
-
|
|
680
|
-
if (uniqueTargets.length === 0) {
|
|
681
|
-
respondError(404, 'Hue device resource unavailable')
|
|
682
|
-
return
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
const sessionKey = `identify:${deviceId}`
|
|
686
|
-
const maxDurationMs = 600000
|
|
687
|
-
const intervalMs = 1000
|
|
688
|
-
const rawAction = (req.body?.action || '').toString().trim().toLowerCase()
|
|
689
|
-
const explicitAction = rawAction === 'start' || rawAction === 'stop' ? rawAction : 'toggle'
|
|
690
|
-
|
|
691
|
-
const stopIdentifySession = () => {
|
|
692
|
-
if (typeof hueServer.isHueIdentifySessionActive === 'function' && hueServer.isHueIdentifySessionActive(sessionKey)) {
|
|
693
|
-
if (typeof hueServer.stopHueIdentifySession === 'function') {
|
|
694
|
-
hueServer.stopHueIdentifySession(sessionKey, 'manual')
|
|
695
|
-
}
|
|
696
|
-
return true
|
|
697
|
-
}
|
|
698
|
-
return false
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
if (explicitAction === 'stop') {
|
|
702
|
-
const wasActive = stopIdentifySession()
|
|
703
|
-
res.json({ status: 'stopped', wasActive })
|
|
704
|
-
return
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
if (explicitAction !== 'start') {
|
|
708
|
-
if (stopIdentifySession()) {
|
|
709
|
-
res.json({ status: 'stopped', wasActive: true })
|
|
710
|
-
return
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
if (explicitAction === 'start' && typeof hueServer.isHueIdentifySessionActive === 'function' && hueServer.isHueIdentifySessionActive(sessionKey)) {
|
|
715
|
-
res.json({ status: 'started', alreadyActive: true, expiresInMs: maxDurationMs })
|
|
716
|
-
return
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
if (typeof hueServer.startHueIdentifySession === 'function') {
|
|
720
|
-
const started = await hueServer.startHueIdentifySession({
|
|
721
|
-
sessionKey,
|
|
722
|
-
targets: uniqueTargets,
|
|
723
|
-
intervalMs,
|
|
724
|
-
maxDurationMs
|
|
725
|
-
})
|
|
726
|
-
if (!started) {
|
|
727
|
-
respondError(500, 'Unable to start locate session')
|
|
728
|
-
return
|
|
729
|
-
}
|
|
730
|
-
res.json({ status: 'started', expiresInMs: maxDurationMs })
|
|
731
|
-
return
|
|
732
|
-
}
|
|
733
|
-
const identifyPayload = { identify: { action: 'identify' } }
|
|
734
|
-
for (const target of uniqueTargets) {
|
|
735
|
-
await hueServer.hueManager.hueApiV2.put(`/resource/${target.type}/${target.id}`, identifyPayload)
|
|
736
|
-
}
|
|
737
|
-
res.json({ status: 'started', expiresInMs: 0 })
|
|
738
|
-
} catch (error) {
|
|
739
|
-
try { RED.log.error(`KNXUltimate LocateHueDevice error: ${error.message}`) } catch (err) { }
|
|
740
|
-
res.status(500).json({ error: error.message })
|
|
741
|
-
}
|
|
742
|
-
})
|
|
743
|
-
|
|
744
|
-
RED.httpAdmin.get('/KNXUltimateGetResourcesHUE', async (req, res) => {
|
|
745
|
-
try {
|
|
746
|
-
// °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
|
|
747
|
-
const serverId = RED.nodes.getNode(req.query.serverId) // Retrieve node.id of the config node.
|
|
748
|
-
if (serverId === null) {
|
|
749
|
-
RED.log.warn('Warn KNXUltimateGetResourcesHUE serverId is null')
|
|
750
|
-
const jRet = []
|
|
751
|
-
jRet.push({ name: 'PLEASE DEPLOY FIRST: then try again.', id: 'error' })
|
|
752
|
-
res.json({ devices: jRet })
|
|
753
|
-
return
|
|
754
|
-
}
|
|
755
|
-
const refreshFlag = (req.query.forceRefresh || '').toString().toLowerCase()
|
|
756
|
-
const forceRefresh = refreshFlag === '1' || refreshFlag === 'true' || refreshFlag === 'yes'
|
|
757
|
-
const jRet = await serverId.getResources(req.query.rtype, { forceRefresh })
|
|
758
|
-
if (jRet !== undefined) {
|
|
759
|
-
res.json(jRet)
|
|
760
|
-
} else {
|
|
761
|
-
res.json({ devices: [{ name: "I'm still connecting...Try in some seconds" }] })
|
|
762
|
-
}
|
|
763
|
-
// °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
|
|
764
|
-
} catch (error) {
|
|
765
|
-
// RED.log.error(`Errore KNXUltimateGetResourcesHUE non gestito ${error.message}`);
|
|
766
|
-
res.json({ devices: error.message })
|
|
767
|
-
RED.log.error(`Err KNXUltimateGetResourcesHUE: ${error.message}`)
|
|
768
|
-
// (async () => {
|
|
769
|
-
// await node.initHUEConnection();
|
|
770
|
-
// })();
|
|
771
|
-
}
|
|
772
|
-
})
|
|
773
|
-
|
|
774
|
-
// MATTER: returns the list of commissioned Matter devices of a matter-config node
|
|
775
|
-
RED.httpAdmin.get('/KNXUltimateMatterGetNodes', RED.auth.needsPermission('matter-config.read'), (req, res) => {
|
|
776
|
-
try {
|
|
777
|
-
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
778
|
-
if (matterServer === null || matterServer === undefined) {
|
|
779
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
780
|
-
return
|
|
781
|
-
}
|
|
782
|
-
res.json({ devices: matterServer.getCommissionedNodesDetails() })
|
|
783
|
-
} catch (error) {
|
|
784
|
-
RED.log.error(`Err KNXUltimateMatterGetNodes: ${error.message}`)
|
|
785
|
-
res.json({ error: error.message })
|
|
786
|
-
}
|
|
787
|
-
})
|
|
788
|
-
|
|
789
|
-
// MATTER: returns endpoints/clusters/attributes/commands of a commissioned Matter device
|
|
790
|
-
RED.httpAdmin.get('/KNXUltimateMatterGetStructure', RED.auth.needsPermission('matter-config.read'), (req, res) => {
|
|
791
|
-
try {
|
|
792
|
-
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
793
|
-
if (matterServer === null || matterServer === undefined) {
|
|
794
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
795
|
-
return
|
|
796
|
-
}
|
|
797
|
-
res.json(matterServer.getNodeStructure(req.query.nodeId))
|
|
798
|
-
} catch (error) {
|
|
799
|
-
RED.log.error(`Err KNXUltimateMatterGetStructure: ${error.message}`)
|
|
800
|
-
res.json({ error: error.message })
|
|
801
|
-
}
|
|
802
|
-
})
|
|
803
|
-
|
|
804
|
-
// MATTER: current commissioning milestone for the blocking editor overlay.
|
|
805
|
-
// The operation id keeps simultaneous editor tabs from displaying each other's progress.
|
|
806
|
-
RED.httpAdmin.get('/KNXUltimateMatterPairProgress', RED.auth.needsPermission('matter-config.read'), (req, res) => {
|
|
807
|
-
try {
|
|
808
|
-
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
809
|
-
if (matterServer === null || matterServer === undefined) {
|
|
810
|
-
res.json({ active: false, percent: 0, error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
811
|
-
return
|
|
812
|
-
}
|
|
813
|
-
res.json(matterServer.getCommissioningProgress(req.query.operationId))
|
|
814
|
-
} catch (error) {
|
|
815
|
-
RED.log.error(`Err KNXUltimateMatterPairProgress: ${error.message}`)
|
|
816
|
-
res.json({ active: false, percent: 0, error: error.message })
|
|
817
|
-
}
|
|
818
|
-
})
|
|
819
|
-
|
|
820
|
-
// MATTER: commissions (pairs) a new Matter device using a pairing code or QR code string
|
|
821
|
-
RED.httpAdmin.get('/KNXUltimateMatterPair', RED.auth.needsPermission('matter-config.write'), async (req, res) => {
|
|
822
|
-
let matterServer
|
|
823
|
-
const requestedOperationId = String(req.query.operationId || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 80)
|
|
824
|
-
// Keep direct callers of the pre-progress endpoint backward compatible. The editor
|
|
825
|
-
// supplies its own id so it can poll; legacy callers receive a server-only id.
|
|
826
|
-
const operationId = requestedOperationId || `server-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`
|
|
827
|
-
try {
|
|
828
|
-
matterServer = RED.nodes.getNode(req.query.serverId)
|
|
829
|
-
if (matterServer === null || matterServer === undefined) {
|
|
830
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
831
|
-
return
|
|
832
|
-
}
|
|
833
|
-
if (!matterServer.beginCommissioningProgress(operationId)) {
|
|
834
|
-
res.json({ error: 'Another Matter commissioning operation is already in progress.' })
|
|
835
|
-
return
|
|
836
|
-
}
|
|
837
|
-
const nodeId = await matterServer.commission(req.query.code, {
|
|
838
|
-
targetHost: req.query.targetHost,
|
|
839
|
-
onProgress: (progress) => matterServer.reportCommissioningProgress(operationId, progress)
|
|
840
|
-
})
|
|
841
|
-
const requestedName = String(req.query.name || '').trim()
|
|
842
|
-
let renameError = null
|
|
843
|
-
if (requestedName !== '') {
|
|
844
|
-
matterServer.reportCommissioningProgress(operationId, {
|
|
845
|
-
phase: 'naming',
|
|
846
|
-
percent: 99,
|
|
847
|
-
message: 'Applying the requested device name…'
|
|
848
|
-
})
|
|
849
|
-
try {
|
|
850
|
-
await matterServer.renameCommissionedNode(nodeId, requestedName)
|
|
851
|
-
} catch (error) {
|
|
852
|
-
renameError = error.message
|
|
853
|
-
RED.log.warn(`Warn KNXUltimateMatterPair rename node ${nodeId}: ${error.message}`)
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
let device = null
|
|
857
|
-
try {
|
|
858
|
-
device = matterServer.getCommissionedNodesDetails().find((item) => String(item.nodeId) === String(nodeId)) || null
|
|
859
|
-
} catch (error) { /* empty */ }
|
|
860
|
-
matterServer.endCommissioningProgress(operationId, {
|
|
861
|
-
phase: 'complete',
|
|
862
|
-
percent: 100,
|
|
863
|
-
message: 'Matter commissioning completed successfully.'
|
|
864
|
-
})
|
|
865
|
-
res.json({ nodeId, name: device?.name, productName: device?.productName, vendorName: device?.vendorName, renameError })
|
|
866
|
-
} catch (error) {
|
|
867
|
-
try {
|
|
868
|
-
matterServer?.endCommissioningProgress(operationId, {
|
|
869
|
-
phase: 'error',
|
|
870
|
-
message: `Commissioning failed: ${error.message}`
|
|
871
|
-
})
|
|
872
|
-
} catch (progressError) { /* empty */ }
|
|
873
|
-
const targetHost = req.query.targetHost ? ` targetHost=${req.query.targetHost}` : ''
|
|
874
|
-
RED.log.error(`Err KNXUltimateMatterPair:${targetHost} ${error.stack || error.message}`)
|
|
875
|
-
res.json({ error: error.message })
|
|
876
|
-
}
|
|
877
|
-
})
|
|
878
|
-
|
|
879
|
-
// MATTER: renames a commissioned Matter device by writing BasicInformation.nodeLabel
|
|
880
|
-
RED.httpAdmin.get('/KNXUltimateMatterRename', RED.auth.needsPermission('matter-config.write'), async (req, res) => {
|
|
881
|
-
try {
|
|
882
|
-
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
883
|
-
if (matterServer === null || matterServer === undefined) {
|
|
884
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
885
|
-
return
|
|
886
|
-
}
|
|
887
|
-
const nodeId = String(req.query.nodeId || '').trim()
|
|
888
|
-
const name = String(req.query.name || '').trim()
|
|
889
|
-
if (nodeId === '' || name === '') {
|
|
890
|
-
res.json({ error: 'Missing nodeId or name.' })
|
|
891
|
-
return
|
|
892
|
-
}
|
|
893
|
-
await matterServer.renameCommissionedNode(nodeId, name)
|
|
894
|
-
res.json({ status: 'ok', nodeId, name })
|
|
895
|
-
} catch (error) {
|
|
896
|
-
RED.log.error(`Err KNXUltimateMatterRename: ${error.stack || error.message}`)
|
|
897
|
-
res.json({ error: error.message })
|
|
898
|
-
}
|
|
899
|
-
})
|
|
900
|
-
|
|
901
|
-
// MATTER: decommissions (unpairs) a Matter device
|
|
902
|
-
RED.httpAdmin.get('/KNXUltimateMatterUnpair', RED.auth.needsPermission('matter-config.write'), async (req, res) => {
|
|
903
|
-
try {
|
|
904
|
-
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
905
|
-
if (matterServer === null || matterServer === undefined) {
|
|
906
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
907
|
-
return
|
|
908
|
-
}
|
|
909
|
-
await matterServer.removeCommissionedNode(req.query.nodeId)
|
|
910
|
-
res.json({ status: 'ok' })
|
|
911
|
-
} catch (error) {
|
|
912
|
-
RED.log.error(`Err KNXUltimateMatterUnpair: ${error.message}`)
|
|
913
|
-
res.json({ error: error.message })
|
|
914
|
-
}
|
|
915
|
-
})
|
|
916
|
-
|
|
917
|
-
const exportMatterStorage = async (req, res, idKey) => {
|
|
918
|
-
try {
|
|
919
|
-
const configNode = RED.nodes.getNode(req.query[idKey])
|
|
920
|
-
if (!configNode || typeof configNode.exportMatterStorage !== 'function') throw new Error('PLEASE DEPLOY FIRST: then try again.')
|
|
921
|
-
const backup = await configNode.exportMatterStorage()
|
|
922
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, '-')
|
|
923
|
-
res.setHeader('Content-Type', 'application/json; charset=utf-8')
|
|
924
|
-
res.setHeader('Content-Disposition', `attachment; filename="knx-ultimate-matter-${backup.kind}-${stamp}.json"`)
|
|
925
|
-
res.send(JSON.stringify(backup, null, 2))
|
|
926
|
-
} catch (error) {
|
|
927
|
-
RED.log.error(`Err Matter storage export: ${error.message}`)
|
|
928
|
-
if (!res.headersSent) res.status(500).json({ error: error.message })
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
const importMatterStorage = async (req, res, idKey) => {
|
|
933
|
-
try {
|
|
934
|
-
const configNode = RED.nodes.getNode(req.query[idKey])
|
|
935
|
-
if (!configNode || typeof configNode.importMatterStorage !== 'function') throw new Error('PLEASE DEPLOY FIRST: then try again.')
|
|
936
|
-
await configNode.importMatterStorage(req.body)
|
|
937
|
-
res.json({ status: 'ok' })
|
|
938
|
-
} catch (error) {
|
|
939
|
-
RED.log.error(`Err Matter storage import: ${error.message}`)
|
|
940
|
-
res.status(400).json({ error: error.message })
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
RED.httpAdmin.get('/KNXUltimateMatterStorageExport', normalizeAuthFromAccessTokenQuery, RED.auth.needsPermission('matter-config.read'), (req, res) => exportMatterStorage(req, res, 'serverId'))
|
|
945
|
-
RED.httpAdmin.post('/KNXUltimateMatterStorageImport', RED.auth.needsPermission('matter-config.write'), (req, res) => importMatterStorage(req, res, 'serverId'))
|
|
946
|
-
|
|
947
|
-
// MATTER BRIDGE: returns the pairing info (QR code, manual code, commissioned fabrics) of a matterbridge-config node
|
|
948
|
-
RED.httpAdmin.get('/KNXUltimateMatterBridgeInfo', RED.auth.needsPermission('matterbridge-config.read'), (req, res) => {
|
|
949
|
-
try {
|
|
950
|
-
const bridgeConfig = RED.nodes.getNode(req.query.configId)
|
|
951
|
-
if (bridgeConfig === null || bridgeConfig === undefined || typeof bridgeConfig.getPairingInfo !== 'function') {
|
|
952
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
953
|
-
return
|
|
954
|
-
}
|
|
955
|
-
res.json(bridgeConfig.getPairingInfo())
|
|
956
|
-
} catch (error) {
|
|
957
|
-
RED.log.error(`Err KNXUltimateMatterBridgeInfo: ${error.message}`)
|
|
958
|
-
res.json({ error: error.message })
|
|
959
|
-
}
|
|
960
|
-
})
|
|
961
|
-
|
|
962
|
-
// MATTER BRIDGE: factory reset (removes all paired controllers, restarts pairing advertising)
|
|
963
|
-
RED.httpAdmin.get('/KNXUltimateMatterBridgeReset', RED.auth.needsPermission('matterbridge-config.write'), async (req, res) => {
|
|
964
|
-
try {
|
|
965
|
-
const bridgeConfig = RED.nodes.getNode(req.query.configId)
|
|
966
|
-
if (bridgeConfig === null || bridgeConfig === undefined || typeof bridgeConfig.factoryResetBridge !== 'function') {
|
|
967
|
-
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
968
|
-
return
|
|
969
|
-
}
|
|
970
|
-
await bridgeConfig.factoryResetBridge()
|
|
971
|
-
res.json({ status: 'ok' })
|
|
972
|
-
} catch (error) {
|
|
973
|
-
RED.log.error(`Err KNXUltimateMatterBridgeReset: ${error.message}`)
|
|
974
|
-
res.json({ error: error.message })
|
|
975
|
-
}
|
|
976
|
-
})
|
|
977
|
-
|
|
978
|
-
RED.httpAdmin.get('/KNXUltimateMatterBridgeStorageExport', normalizeAuthFromAccessTokenQuery, RED.auth.needsPermission('matterbridge-config.read'), (req, res) => exportMatterStorage(req, res, 'configId'))
|
|
979
|
-
RED.httpAdmin.post('/KNXUltimateMatterBridgeStorageImport', RED.auth.needsPermission('matterbridge-config.write'), (req, res) => importMatterStorage(req, res, 'configId'))
|
|
980
|
-
|
|
981
394
|
RED.httpAdmin.get('/knxUltimateDpts', (req, res) => {
|
|
982
395
|
try {
|
|
983
396
|
const dpts = Object.entries(dptlib.dpts).filter(onlyDptKeys).map(extractBaseNo).sort(sortBy('base'))
|
|
@@ -1255,12 +1255,6 @@
|
|
|
1255
1255
|
|
|
1256
1256
|
|
|
1257
1257
|
<script type="text/html" data-template-name="knxUltimate-config">
|
|
1258
|
-
<div class="form-row knx-ultimate-v8-upgrade-row">
|
|
1259
|
-
<button type="button" class="red-ui-button knx-ultimate-v8-upgrade-button" data-i18n="[title]node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.v8_upgrade.button_title">
|
|
1260
|
-
<i class="fa fa-arrow-circle-up" aria-hidden="true"></i>
|
|
1261
|
-
<span data-i18n="node-red-contrib-knx-ultimate/knxUltimateUtility:knxUltimateUtility.v8_upgrade.button"></span>
|
|
1262
|
-
</button>
|
|
1263
|
-
</div>
|
|
1264
1258
|
<div class="form-row" style="margin-bottom:10px;">
|
|
1265
1259
|
<span style="color:#ff0000"><i class="fa fa-youtube"></i></span> <a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
|
|
1266
1260
|
</div>
|
|
@@ -1645,14 +1639,6 @@
|
|
|
1645
1639
|
</script>
|
|
1646
1640
|
|
|
1647
1641
|
<script type="text/html" data-help-name="knxUltimate-config">
|
|
1648
|
-
### Upgrade to KNX Ultimate 8
|
|
1649
|
-
|
|
1650
|
-
Version 7 shows a compact **Upgrade to v8** button at the top of this editor. It downloads a flow backup, installs the required HUE/Matter packages, converts compatible nodes, performs a full Deploy, verifies the saved flows and installs version 8. Restart the Node-RED service when prompted; reloading only the browser is not enough. Legacy KNX AI nodes stop the automatic operation.
|
|
1651
|
-
|
|
1652
|
-
[Full upgrade guide](https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/Upgrade-to-v8)
|
|
1653
|
-
|
|
1654
|
-
<br/>
|
|
1655
|
-
|
|
1656
1642
|
<div data-i18n="knxUltimate-config.help.intro"></div>
|
|
1657
1643
|
<h3 data-i18n="knxUltimate-config.help.flow_bubbles_title"></h3>
|
|
1658
1644
|
<ul>
|