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/utils/http.js
DELETED
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
const simpleget = require('simple-get')
|
|
2
|
-
|
|
3
|
-
const DEFAULT_TIMEOUT_MS = 30000
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Parameters.
|
|
7
|
-
*
|
|
8
|
-
* @param config.key the credentualskey.
|
|
9
|
-
* @param config.prefix the bridge's URL
|
|
10
|
-
* @param config.url the resource url
|
|
11
|
-
* @param config.timeoutMs optional request timeout
|
|
12
|
-
*/
|
|
13
|
-
module.exports.use = (config) => {
|
|
14
|
-
const http = {}
|
|
15
|
-
|
|
16
|
-
const logError = (message) => {
|
|
17
|
-
try {
|
|
18
|
-
const logger = config?.logger || config?.sysLogger
|
|
19
|
-
if (logger?.error) logger.error(message)
|
|
20
|
-
else console.error(message)
|
|
21
|
-
} catch (error) {
|
|
22
|
-
try { console.error(message) } catch (err) { /* empty */ }
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Make a http call.
|
|
28
|
-
*
|
|
29
|
-
* @param opt Used as options for simple get.
|
|
30
|
-
*/
|
|
31
|
-
http.call = async (opt) => {
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
const requestOptions = { ...opt }
|
|
34
|
-
requestOptions.rejectUnauthorized = false
|
|
35
|
-
requestOptions.timeout = Number.isFinite(config?.timeoutMs) && config.timeoutMs > 0
|
|
36
|
-
? config.timeoutMs
|
|
37
|
-
: DEFAULT_TIMEOUT_MS
|
|
38
|
-
if (config?.agent) requestOptions.agent = config.agent
|
|
39
|
-
requestOptions.headers = {
|
|
40
|
-
...(opt.headers || {}),
|
|
41
|
-
'hue-application-key': config.key
|
|
42
|
-
}
|
|
43
|
-
if (requestOptions.body && !requestOptions.headers['Content-Type'] && !requestOptions.headers['content-type']) {
|
|
44
|
-
requestOptions.headers['Content-Type'] = 'application/json'
|
|
45
|
-
}
|
|
46
|
-
requestOptions.url = config.prefix + requestOptions.url
|
|
47
|
-
// log.trace('http ' + opt.method + ' ' + opt.url);
|
|
48
|
-
const req = simpleget.concat(requestOptions, (err, res, data) => {
|
|
49
|
-
if (err) return reject(err)
|
|
50
|
-
|
|
51
|
-
const statusCode = res?.statusCode ?? 0
|
|
52
|
-
const statusMessage = res?.statusMessage || ''
|
|
53
|
-
const responseText = Buffer.isBuffer(data) ? data.toString('utf8') : String(data ?? '')
|
|
54
|
-
|
|
55
|
-
if (statusCode >= 100 && statusCode < 400) {
|
|
56
|
-
let result
|
|
57
|
-
try {
|
|
58
|
-
result = JSON.parse(responseText)
|
|
59
|
-
} catch (error) {
|
|
60
|
-
logError(`utils.http: Invalid JSON response from ${requestOptions.url}: ${error.message}`)
|
|
61
|
-
return reject(new Error(`Invalid JSON response for ${requestOptions.url}: ${error.message}`))
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (result?.errors && Array.isArray(result.errors) && result.errors.length > 0) {
|
|
65
|
-
return reject(new Error('The response for ' + requestOptions.url + ' returned errors ' + JSON.stringify(result.errors)))
|
|
66
|
-
}
|
|
67
|
-
if (!Object.prototype.hasOwnProperty.call(result || {}, 'data')) {
|
|
68
|
-
return reject(new Error('Unexpected result with no data. ' + JSON.stringify(result)))
|
|
69
|
-
}
|
|
70
|
-
return resolve(result.data)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
logError(`utils.http: Error response from ${requestOptions.url}: ${statusCode} ${statusMessage}`)
|
|
74
|
-
const bodySnippet = responseText ? ` ${responseText}` : ''
|
|
75
|
-
return reject(new Error(`Error response for ${requestOptions.url} with status ${statusCode} ${statusMessage}${bodySnippet}`))
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
// Ensure timeouts fire even if the underlying client ignores the option.
|
|
79
|
-
try {
|
|
80
|
-
if (requestOptions.timeout && typeof req?.setTimeout === 'function') {
|
|
81
|
-
req.setTimeout(requestOptions.timeout)
|
|
82
|
-
}
|
|
83
|
-
} catch (error) { /* empty */ }
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Make a POST call.
|
|
89
|
-
*
|
|
90
|
-
* @param url The target url.
|
|
91
|
-
* @param data The body data.
|
|
92
|
-
*/
|
|
93
|
-
http.post = async (url, data) => {
|
|
94
|
-
return await http.call({
|
|
95
|
-
method: 'POST',
|
|
96
|
-
url,
|
|
97
|
-
body: JSON.stringify(data)
|
|
98
|
-
})
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Makes a put call.
|
|
103
|
-
*
|
|
104
|
-
* @param url The target url.
|
|
105
|
-
*/
|
|
106
|
-
http.put = async (url, data) => {
|
|
107
|
-
return await http.call({
|
|
108
|
-
method: 'PUT',
|
|
109
|
-
url,
|
|
110
|
-
body: JSON.stringify(data)
|
|
111
|
-
})
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Makes a get call.
|
|
116
|
-
*
|
|
117
|
-
* @param url The target url.
|
|
118
|
-
*/
|
|
119
|
-
http.get = async (url) => {
|
|
120
|
-
return await http.call({
|
|
121
|
-
method: 'GET',
|
|
122
|
-
url
|
|
123
|
-
})
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Makes a delete call.
|
|
127
|
-
*
|
|
128
|
-
* @param url The target url.
|
|
129
|
-
*/
|
|
130
|
-
http.delete = async (url) => {
|
|
131
|
-
return await http.call({
|
|
132
|
-
method: 'DELETE',
|
|
133
|
-
url
|
|
134
|
-
})
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return http
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Get Bridgedetails
|
|
142
|
-
*
|
|
143
|
-
* @param _ip The target ip.
|
|
144
|
-
*/
|
|
145
|
-
module.exports.getBridgeDetails = async (_ip) => {
|
|
146
|
-
return new Promise((resolve, reject) => {
|
|
147
|
-
const opt = {}
|
|
148
|
-
opt.method = 'GET'
|
|
149
|
-
opt.rejectUnauthorized = false
|
|
150
|
-
opt.url = 'https://' + _ip + '/api/0/config'
|
|
151
|
-
simpleget.concat(opt, (err, res, data) => {
|
|
152
|
-
if (err) return reject(new Error(err.message || 'getBridgeDetails general error'))
|
|
153
|
-
|
|
154
|
-
const statusCode = res?.statusCode ?? 0
|
|
155
|
-
const statusMessage = res?.statusMessage || ''
|
|
156
|
-
const responseText = Buffer.isBuffer(data) ? data.toString('utf8') : String(data ?? '')
|
|
157
|
-
|
|
158
|
-
if (statusCode < 200 || statusCode >= 400) {
|
|
159
|
-
return reject(new Error('Error response for ' + opt.url + ' with status ' + statusCode + ' ' + statusMessage))
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
const result = JSON.parse(responseText)
|
|
164
|
-
if (result?.errors && Array.isArray(result.errors) && result.errors.length > 0) {
|
|
165
|
-
return reject(new Error('The response for ' + opt.url + ' returned errors ' + JSON.stringify(result.errors)))
|
|
166
|
-
}
|
|
167
|
-
if (!result) {
|
|
168
|
-
return reject(new Error('Unexpected result with no data. ' + JSON.stringify(result)))
|
|
169
|
-
}
|
|
170
|
-
return resolve(result)
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return reject(new Error(`Invalid Hue bridge configuration response: ${error.message}`))
|
|
173
|
-
}
|
|
174
|
-
})
|
|
175
|
-
})
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Register a new application user on the Hue bridge.
|
|
180
|
-
*
|
|
181
|
-
* @param {string} ip Bridge IP address.
|
|
182
|
-
* @param {string} appName Application name (used for devicetype).
|
|
183
|
-
* @param {string} deviceName Device name (used for devicetype).
|
|
184
|
-
* @returns {Promise<{bridge: object, user: {username: string, clientkey?: string}}>}
|
|
185
|
-
*/
|
|
186
|
-
module.exports.registerBridgeUser = async (ip, appName = 'KNXUltimate', deviceName = 'Node-RED') => {
|
|
187
|
-
const deviceType = `${appName}#${deviceName}`.substring(0, 40)
|
|
188
|
-
const payload = JSON.stringify({
|
|
189
|
-
devicetype: deviceType,
|
|
190
|
-
generateclientkey: true
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
const postOptions = {
|
|
194
|
-
method: 'POST',
|
|
195
|
-
url: `https://${ip}/api`,
|
|
196
|
-
rejectUnauthorized: false,
|
|
197
|
-
headers: {
|
|
198
|
-
'Content-Type': 'application/json'
|
|
199
|
-
},
|
|
200
|
-
body: payload
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const postResponse = await new Promise((resolve, reject) => {
|
|
204
|
-
simpleget.concat(postOptions, (err, res, data) => {
|
|
205
|
-
if (err) {
|
|
206
|
-
return reject(new Error(err.message || 'Hue registration request failed'))
|
|
207
|
-
}
|
|
208
|
-
if (!res || res.statusCode < 200 || res.statusCode >= 400) {
|
|
209
|
-
return reject(new Error(`Hue registration request failed with status ${res?.statusCode ?? 'unknown'}`))
|
|
210
|
-
}
|
|
211
|
-
try {
|
|
212
|
-
const parsed = JSON.parse(data)
|
|
213
|
-
resolve(parsed)
|
|
214
|
-
} catch (parseError) {
|
|
215
|
-
reject(new Error(`Invalid Hue registration response: ${parseError.message}`))
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
})
|
|
219
|
-
|
|
220
|
-
if (!Array.isArray(postResponse) || postResponse.length === 0) {
|
|
221
|
-
throw new Error('Unexpected Hue registration response')
|
|
222
|
-
}
|
|
223
|
-
const firstEntry = postResponse[0]
|
|
224
|
-
if (firstEntry.error) {
|
|
225
|
-
throw new Error(firstEntry.error.description || 'Hue Bridge rejected the registration request. Press the link button and try again.')
|
|
226
|
-
}
|
|
227
|
-
const success = firstEntry.success || {}
|
|
228
|
-
if (!success.username) {
|
|
229
|
-
throw new Error('Hue Bridge did not return a username.')
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const username = success.username
|
|
233
|
-
const clientkey = success.clientkey
|
|
234
|
-
|
|
235
|
-
const configOptions = {
|
|
236
|
-
method: 'GET',
|
|
237
|
-
url: `https://${ip}/api/${username}/config`,
|
|
238
|
-
rejectUnauthorized: false
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
const bridgeConfig = await new Promise((resolve, reject) => {
|
|
242
|
-
simpleget.concat(configOptions, (err, res, data) => {
|
|
243
|
-
if (err) return reject(new Error(err.message || 'Unable to read Hue bridge configuration'))
|
|
244
|
-
if (!res || res.statusCode < 200 || res.statusCode >= 400) {
|
|
245
|
-
return reject(new Error(`Hue bridge configuration request failed with status ${res?.statusCode ?? 'unknown'}`))
|
|
246
|
-
}
|
|
247
|
-
try {
|
|
248
|
-
const parsed = JSON.parse(data)
|
|
249
|
-
resolve(parsed)
|
|
250
|
-
} catch (parseError) {
|
|
251
|
-
reject(new Error(`Invalid Hue bridge configuration response: ${parseError.message}`))
|
|
252
|
-
}
|
|
253
|
-
})
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
return {
|
|
257
|
-
bridge: bridgeConfig,
|
|
258
|
-
user: { username, clientkey }
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Discover Hue bridges using the public discovery service.
|
|
264
|
-
* @returns {Promise<Array<{id?: string, internalipaddress?: string}>>}
|
|
265
|
-
*/
|
|
266
|
-
module.exports.discoverHueBridges = async () => {
|
|
267
|
-
return await new Promise((resolve, reject) => {
|
|
268
|
-
const opt = {
|
|
269
|
-
method: 'GET',
|
|
270
|
-
url: 'https://discovery.meethue.com',
|
|
271
|
-
rejectUnauthorized: false
|
|
272
|
-
}
|
|
273
|
-
simpleget.concat(opt, (err, res, data) => {
|
|
274
|
-
if (err) {
|
|
275
|
-
return reject(new Error(err.message || 'Unable to reach discovery.meethue.com'))
|
|
276
|
-
}
|
|
277
|
-
if (!res || res.statusCode < 200 || res.statusCode >= 400) {
|
|
278
|
-
return reject(new Error(`Discovery request failed with status ${res?.statusCode ?? 'unknown'}`))
|
|
279
|
-
}
|
|
280
|
-
try {
|
|
281
|
-
const parsed = JSON.parse(data)
|
|
282
|
-
if (!Array.isArray(parsed)) {
|
|
283
|
-
return reject(new Error('Unexpected discovery response'))
|
|
284
|
-
}
|
|
285
|
-
resolve(parsed)
|
|
286
|
-
} catch (parseError) {
|
|
287
|
-
reject(new Error(`Invalid discovery response: ${parseError.message}`))
|
|
288
|
-
}
|
|
289
|
-
})
|
|
290
|
-
})
|
|
291
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
// These are the canonical runtime implementations owned by HUE Controller.
|
|
4
|
-
// They deliberately keep the familiar "module receives RED, then calls
|
|
5
|
-
// registerType" shape: that lets us preserve the well-tested lifecycle of each
|
|
6
|
-
// dedicated Hue implementation without registering fifteen more public nodes.
|
|
7
|
-
//
|
|
8
|
-
// None of these paths is listed under `node-red.nodes` in package.json. Node-RED
|
|
9
|
-
// therefore never loads them as palette nodes, and deleting a legacy entry point
|
|
10
|
-
// cannot remove code required by HUE Controller.
|
|
11
|
-
const RUNTIME_MODULES = Object.freeze({
|
|
12
|
-
light: './hueControllerProfiles/runtime/light',
|
|
13
|
-
plug: './hueControllerProfiles/runtime/plug',
|
|
14
|
-
button: './hueControllerProfiles/runtime/button',
|
|
15
|
-
relative_rotary: './hueControllerProfiles/runtime/relative_rotary',
|
|
16
|
-
motion: './hueControllerProfiles/runtime/motion',
|
|
17
|
-
area_motion: './hueControllerProfiles/runtime/area_motion',
|
|
18
|
-
camera_motion: './hueControllerProfiles/runtime/camera_motion',
|
|
19
|
-
contact: './hueControllerProfiles/runtime/contact',
|
|
20
|
-
light_level: './hueControllerProfiles/runtime/light_level',
|
|
21
|
-
temperature: './hueControllerProfiles/runtime/temperature',
|
|
22
|
-
humidity: './hueControllerProfiles/runtime/humidity',
|
|
23
|
-
scene: './hueControllerProfiles/runtime/scene',
|
|
24
|
-
device_power: './hueControllerProfiles/runtime/device_power',
|
|
25
|
-
zigbee_connectivity: './hueControllerProfiles/runtime/zigbee_connectivity',
|
|
26
|
-
device_software_update: './hueControllerProfiles/runtime/device_software_update'
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
// A constructor closes over the RED instance used while loading its module.
|
|
30
|
-
// Cache by RED first (rather than globally) so tests, embedded runtimes and future
|
|
31
|
-
// hot-reload scenarios never accidentally share constructors across runtimes.
|
|
32
|
-
// WeakMap also means an abandoned RED instance is not kept alive by this adapter.
|
|
33
|
-
const constructors = new WeakMap()
|
|
34
|
-
|
|
35
|
-
const getConstructorCache = (RED) => {
|
|
36
|
-
let cache = constructors.get(RED)
|
|
37
|
-
if (!cache) {
|
|
38
|
-
cache = new Map()
|
|
39
|
-
constructors.set(RED, cache)
|
|
40
|
-
}
|
|
41
|
-
return cache
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const captureRuntimeConstructor = (RED, controllerType) => {
|
|
45
|
-
const modulePath = RUNTIME_MODULES[controllerType]
|
|
46
|
-
if (!modulePath) return undefined
|
|
47
|
-
|
|
48
|
-
const cache = getConstructorCache(RED)
|
|
49
|
-
if (cache.has(controllerType)) return cache.get(controllerType)
|
|
50
|
-
|
|
51
|
-
let capturedConstructor
|
|
52
|
-
|
|
53
|
-
// The private modules believe they are registering an ordinary node. The
|
|
54
|
-
// facade delegates every real RED service through the prototype chain but
|
|
55
|
-
// intercepts only registerType, turning registration into constructor capture.
|
|
56
|
-
// The real Node-RED registry is never touched here.
|
|
57
|
-
const redFacade = Object.create(RED)
|
|
58
|
-
redFacade.nodes = Object.create(RED.nodes)
|
|
59
|
-
redFacade.nodes.registerType = (_type, constructor) => {
|
|
60
|
-
capturedConstructor = constructor
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// CommonJS itself caches the module source; our per-RED cache stores the
|
|
64
|
-
// constructor produced by invoking its exported registration function.
|
|
65
|
-
require(modulePath)(redFacade)
|
|
66
|
-
if (typeof capturedConstructor !== 'function') {
|
|
67
|
-
throw new Error(`Unable to load HUE Controller runtime for ${controllerType}`)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
cache.set(controllerType, capturedConstructor)
|
|
71
|
-
return capturedConstructor
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const normalizeControllerType = (config = {}) => {
|
|
75
|
-
// `hueControllerType` is the authoritative new field. The resource suffix is
|
|
76
|
-
// a compatibility safety net for imported or partially migrated flows.
|
|
77
|
-
const configuredType = String(config.hueControllerType || '').trim()
|
|
78
|
-
if (RUNTIME_MODULES[configuredType]) return configuredType
|
|
79
|
-
|
|
80
|
-
const resourceType = String(config.hueDevice || '').split('#')[1] || ''
|
|
81
|
-
if (RUNTIME_MODULES[resourceType]) return resourceType
|
|
82
|
-
|
|
83
|
-
// grouped_light intentionally falls through to light: both resource kinds
|
|
84
|
-
// use the same mature light runtime and there is no separate grouped profile.
|
|
85
|
-
return 'light'
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const setupHueControllerRuntime = (RED, node, config) => {
|
|
89
|
-
const controllerType = normalizeControllerType(config)
|
|
90
|
-
const RuntimeConstructor = captureRuntimeConstructor(RED, controllerType)
|
|
91
|
-
|
|
92
|
-
// Execute the selected constructor *on the Controller instance*. Its own
|
|
93
|
-
// RED.nodes.createNode call installs all normal Node-RED lifecycle hooks,
|
|
94
|
-
// while the persisted public type remains knxUltimateHueController.
|
|
95
|
-
RuntimeConstructor.call(node, config)
|
|
96
|
-
node.hueControllerType = controllerType
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
module.exports = {
|
|
100
|
-
RUNTIME_MODULES,
|
|
101
|
-
captureRuntimeConstructor,
|
|
102
|
-
normalizeControllerType,
|
|
103
|
-
setupHueControllerRuntime
|
|
104
|
-
}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
// Canonical private runtime profile for HUE Controller: area_motion.
|
|
2
|
-
// This module is shipped with the Controller but is intentionally absent from
|
|
3
|
-
// package.json, so Node-RED never registers it as a separate palette node.
|
|
4
|
-
module.exports = function (RED) {
|
|
5
|
-
function knxUltimateHueAreaMotion (config) {
|
|
6
|
-
RED.nodes.createNode(this, config)
|
|
7
|
-
const node = this
|
|
8
|
-
node.serverKNX = RED.nodes.getNode(config.server) || undefined
|
|
9
|
-
node.serverHue = RED.nodes.getNode(config.serverHue) || undefined
|
|
10
|
-
node.topic = node.name
|
|
11
|
-
node.name = config.name === undefined ? 'Hue' : config.name
|
|
12
|
-
node.dpt = ''
|
|
13
|
-
node.notifyreadrequest = true
|
|
14
|
-
node.notifyreadrequestalsorespondtobus = 'false'
|
|
15
|
-
node.notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized = ''
|
|
16
|
-
node.notifyresponse = false
|
|
17
|
-
node.notifywrite = true
|
|
18
|
-
node.initialread = true
|
|
19
|
-
node.listenallga = true
|
|
20
|
-
node.outputtype = 'write'
|
|
21
|
-
node.outputRBE = 'false'
|
|
22
|
-
node.inputRBE = 'false'
|
|
23
|
-
node.currentPayload = ''
|
|
24
|
-
node.passthrough = 'no'
|
|
25
|
-
node.formatmultiplyvalue = 1
|
|
26
|
-
node.formatnegativevalue = 'leave'
|
|
27
|
-
node.formatdecimalsvalue = 2
|
|
28
|
-
node.hueDevice = config.hueDevice
|
|
29
|
-
node.dptAreaMotion = config.dptAreaMotion
|
|
30
|
-
node.motionDPT = (config.dptAreaMotion && config.dptAreaMotion !== '') ? config.dptAreaMotion : '1.001'
|
|
31
|
-
node.initializingAtStart = (config.readStatusAtStartup === undefined || config.readStatusAtStartup === 'yes')
|
|
32
|
-
node.currentDeviceValue = false
|
|
33
|
-
node.enableNodePINS = (config.enableNodePINS === undefined || config.enableNodePINS === 'yes')
|
|
34
|
-
node.outputs = node.enableNodePINS ? 1 : 0
|
|
35
|
-
|
|
36
|
-
if (!node.serverKNX && node.enableNodePINS !== 'yes') {
|
|
37
|
-
node.enableNodePINS = 'yes'
|
|
38
|
-
node.outputs = 1
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const pushStatus = (status) => {
|
|
42
|
-
if (!status) return
|
|
43
|
-
const provider = node.serverKNX
|
|
44
|
-
if (provider && typeof provider.applyStatusUpdate === 'function') {
|
|
45
|
-
provider.applyStatusUpdate(node, status)
|
|
46
|
-
} else {
|
|
47
|
-
node.status(status)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const updateStatus = (status) => {
|
|
52
|
-
if (!status) return
|
|
53
|
-
pushStatus(status)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const formatTs = (date) => {
|
|
57
|
-
const d = date instanceof Date ? date : new Date(date)
|
|
58
|
-
const provider = node.serverKNX
|
|
59
|
-
if (provider && typeof provider.formatStatusTimestamp === 'function') return provider.formatStatusTimestamp(d)
|
|
60
|
-
return `${d.getDate()}, ${d.toLocaleTimeString()}`
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const safeSendToKNX = (telegram, context = 'write') => {
|
|
64
|
-
try {
|
|
65
|
-
if (!node.serverKNX || typeof node.serverKNX.sendKNXTelegramToKNXEngine !== 'function') {
|
|
66
|
-
const now = new Date()
|
|
67
|
-
updateStatus({ fill: 'red', shape: 'dot', text: `KNX server missing (${context}) (${formatTs(now)})` })
|
|
68
|
-
return
|
|
69
|
-
}
|
|
70
|
-
node.serverKNX.sendKNXTelegramToKNXEngine({ ...telegram, nodecallerid: node.id })
|
|
71
|
-
} catch (error) {
|
|
72
|
-
updateStatus({ fill: 'red', shape: 'dot', text: `KNX send error ${error.message}` })
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
node.setNodeStatus = ({ fill, shape, text, payload }) => {
|
|
77
|
-
try {
|
|
78
|
-
if (payload === undefined) payload = ''
|
|
79
|
-
const dDate = new Date()
|
|
80
|
-
payload = typeof payload === 'object' ? JSON.stringify(payload) : payload.toString()
|
|
81
|
-
node.sKNXNodeStatusText = `|KNX: ${text} ${payload} (${formatTs(dDate)})`
|
|
82
|
-
pushStatus({ fill, shape, text: (node.sHUENodeStatusText || '') + ' ' + (node.sKNXNodeStatusText || '') })
|
|
83
|
-
} catch (error) { }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
node.setNodeStatusHue = ({ fill, shape, text, payload }) => {
|
|
87
|
-
try {
|
|
88
|
-
if (payload === undefined) payload = ''
|
|
89
|
-
const dDate = new Date()
|
|
90
|
-
payload = typeof payload === 'object' ? JSON.stringify(payload) : payload.toString()
|
|
91
|
-
node.sHUENodeStatusText = `|HUE: ${text} ${payload} (${formatTs(dDate)})`
|
|
92
|
-
pushStatus({ fill, shape, text: node.sHUENodeStatusText + ' ' + (node.sKNXNodeStatusText || '') })
|
|
93
|
-
} catch (error) { }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const mapMotionValue = (_event) => {
|
|
97
|
-
const motion = _event?.motion
|
|
98
|
-
if (!motion) return undefined
|
|
99
|
-
|
|
100
|
-
const readBoolean = (candidate) => {
|
|
101
|
-
if (typeof candidate === 'boolean') return candidate
|
|
102
|
-
if (candidate && typeof candidate.value === 'boolean') return candidate.value
|
|
103
|
-
return undefined
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
let value = readBoolean(motion.motion)
|
|
107
|
-
if (value === undefined && motion.motion_report) {
|
|
108
|
-
value = readBoolean(motion.motion_report.motion)
|
|
109
|
-
}
|
|
110
|
-
if (value === undefined && motion.motion_report && typeof motion.motion_report.motion === 'boolean') {
|
|
111
|
-
value = motion.motion_report.motion
|
|
112
|
-
}
|
|
113
|
-
if (value === undefined && typeof motion.motion_valid === 'boolean') {
|
|
114
|
-
value = motion.motion_valid
|
|
115
|
-
}
|
|
116
|
-
if (value === undefined) {
|
|
117
|
-
value = readBoolean(motion.motion_valid)
|
|
118
|
-
}
|
|
119
|
-
return value
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
node.handleSend = (msg) => {
|
|
123
|
-
if (!msg || !msg.knx) return
|
|
124
|
-
if (msg.knx.event === 'GroupValue_Read') {
|
|
125
|
-
switch (msg.knx.destination) {
|
|
126
|
-
case config.GAareaMotion:
|
|
127
|
-
node.sendResponseToKNX(node.currentDeviceValue)
|
|
128
|
-
break
|
|
129
|
-
default:
|
|
130
|
-
break
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
node.handleSendHUE = (_event) => {
|
|
136
|
-
try {
|
|
137
|
-
if (_event.id !== config.hueDevice) return
|
|
138
|
-
const motionValue = mapMotionValue(_event)
|
|
139
|
-
if (motionValue === undefined) return
|
|
140
|
-
|
|
141
|
-
const knxMsgPayload = {
|
|
142
|
-
topic: config.GAareaMotion,
|
|
143
|
-
dpt: node.motionDPT,
|
|
144
|
-
payload: motionValue === true || motionValue === 1 || motionValue === '1' ? true : Boolean(motionValue),
|
|
145
|
-
name: node.name,
|
|
146
|
-
event: 'motion',
|
|
147
|
-
rawEvent: _event
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (knxMsgPayload.topic) {
|
|
151
|
-
safeSendToKNX({
|
|
152
|
-
grpaddr: knxMsgPayload.topic,
|
|
153
|
-
payload: knxMsgPayload.payload,
|
|
154
|
-
dpt: knxMsgPayload.dpt,
|
|
155
|
-
outputtype: 'write'
|
|
156
|
-
}, 'write')
|
|
157
|
-
}
|
|
158
|
-
node.currentDeviceValue = knxMsgPayload.payload
|
|
159
|
-
|
|
160
|
-
updateStatus({
|
|
161
|
-
fill: 'green',
|
|
162
|
-
shape: 'dot',
|
|
163
|
-
text: `HUE->KNX ${knxMsgPayload.payload} (${formatTs(new Date())})`
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
if (node.enableNodePINS) {
|
|
167
|
-
node.send(knxMsgPayload)
|
|
168
|
-
}
|
|
169
|
-
node.setNodeStatusHue({
|
|
170
|
-
fill: 'blue',
|
|
171
|
-
shape: 'ring',
|
|
172
|
-
text: 'HUE->KNX',
|
|
173
|
-
payload: knxMsgPayload.payload
|
|
174
|
-
})
|
|
175
|
-
} catch (error) {
|
|
176
|
-
updateStatus({
|
|
177
|
-
fill: 'red',
|
|
178
|
-
shape: 'dot',
|
|
179
|
-
text: `HUE->KNX error ${error.message} (${formatTs(new Date())})`
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
node.sendResponseToKNX = (_level) => {
|
|
185
|
-
if (!node.serverKNX) return
|
|
186
|
-
const knxMsgPayload = {
|
|
187
|
-
topic: config.GAareaMotion,
|
|
188
|
-
dpt: node.motionDPT,
|
|
189
|
-
payload: !!(_level === true || _level === 1 || _level === '1')
|
|
190
|
-
}
|
|
191
|
-
if (knxMsgPayload.topic) {
|
|
192
|
-
safeSendToKNX({
|
|
193
|
-
grpaddr: knxMsgPayload.topic,
|
|
194
|
-
payload: knxMsgPayload.payload,
|
|
195
|
-
dpt: knxMsgPayload.dpt,
|
|
196
|
-
outputtype: 'response'
|
|
197
|
-
}, 'response')
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (node.serverKNX) {
|
|
202
|
-
node.serverKNX.removeClient(node)
|
|
203
|
-
node.serverKNX.addClient(node)
|
|
204
|
-
}
|
|
205
|
-
if (node.serverHue) {
|
|
206
|
-
node.serverHue.removeClient(node)
|
|
207
|
-
node.serverHue.addClient(node)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
node.on('close', (done) => {
|
|
211
|
-
if (node.serverKNX) {
|
|
212
|
-
node.serverKNX.removeClient(node)
|
|
213
|
-
}
|
|
214
|
-
if (node.serverHue) {
|
|
215
|
-
node.serverHue.removeClient(node)
|
|
216
|
-
}
|
|
217
|
-
done()
|
|
218
|
-
})
|
|
219
|
-
}
|
|
220
|
-
RED.nodes.registerType('knxUltimateHueAreaMotion', knxUltimateHueAreaMotion)
|
|
221
|
-
}
|