@switchbot/homebridge-switchbot 5.0.0-beta.70 → 5.0.0-beta.71
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/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
- package/.github/workflows/ci.yml +61 -0
- package/.github/workflows/manual-e2e.yml +103 -0
- package/CHANGELOG.md +20 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +44 -0
- package/README.md +11 -0
- package/config.schema.json +99 -1940
- package/dist/deviceFactory.d.ts +13 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +81 -0
- package/dist/deviceFactory.js.map +1 -0
- package/dist/devices/deviceBase.d.ts +50 -0
- package/dist/devices/deviceBase.d.ts.map +1 -0
- package/dist/devices/deviceBase.js +119 -0
- package/dist/devices/deviceBase.js.map +1 -0
- package/dist/devices/genericDevice.d.ts +283 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1035 -0
- package/dist/devices/genericDevice.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +72 -440
- package/dist/homebridge-ui/server.d.ts +3 -1
- package/dist/homebridge-ui/server.d.ts.map +1 -1
- package/dist/homebridge-ui/server.js +47 -10
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +27 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +404 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +10 -317
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +5 -30
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +32 -0
- package/dist/switchbotClient.d.ts.map +1 -0
- package/dist/switchbotClient.js +259 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +36 -248
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +38 -1367
- package/dist/utils.js.map +1 -1
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/style.css +3 -3
- package/docs/index.html +50 -15
- package/docs/variables/default.html +1 -1
- package/package.json +19 -18
- package/scripts/e2e/README.md +25 -0
- package/scripts/e2e/curtain-e2e.sh +70 -0
- package/scripts/e2e/fan-e2e.sh +75 -0
- package/scripts/e2e/light-advanced-e2e.sh +97 -0
- package/scripts/e2e/light-e2e.sh +75 -0
- package/scripts/e2e/list-accessories.sh +19 -0
- package/scripts/e2e/lock-e2e.sh +65 -0
- package/scripts/generate-matter-maps.js +60 -0
- package/scripts/run-e2e-local.sh +14 -0
- package/src/deviceFactory.ts +122 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +965 -0
- package/src/homebridge-ui/public/index.html +72 -440
- package/src/homebridge-ui/server.ts +52 -10
- package/src/index.ts +3 -5
- package/src/platform.ts +395 -0
- package/src/settings.ts +12 -352
- package/src/switchbotClient.ts +266 -0
- package/src/utils.ts +47 -1456
- package/test/accessory-restore.spec.ts +73 -0
- package/test/device-mapping.spec.ts +37 -0
- package/test/deviceFactory.spec.ts +18 -0
- package/test/e2e/run-e2e.spec.ts +50 -0
- package/test/fan-swing.spec.ts +29 -0
- package/test/helpers/matter-harness.ts +53 -0
- package/test/lock-users.spec.ts +44 -0
- package/test/matter-childbridge.spec.ts +55 -0
- package/test/matter-descriptors.spec.ts +97 -0
- package/test/matter-device-state.spec.ts +101 -0
- package/test/matter-integration.spec.ts +70 -0
- package/test/platform.integration.spec.ts +55 -0
- package/test/switchbot-client-debounce.spec.ts +131 -0
- package/test/switchbot-client-openapi.spec.ts +56 -0
- package/test/switchbotClient.spec.ts +10 -0
- package/test/utils.spec.ts +20 -0
- package/vitest.config.ts +7 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -15847
- package/coverage/coverage-final.json +0 -42
- package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
- package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
- package/coverage/docs/assets/dmt/index.html +0 -131
- package/coverage/docs/assets/hierarchy.js.html +0 -85
- package/coverage/docs/assets/icons.js.html +0 -136
- package/coverage/docs/assets/index.html +0 -146
- package/coverage/docs/assets/main.js.html +0 -265
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -191
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/src/device/blindtilt.ts.html +0 -3238
- package/coverage/src/device/bot.ts.html +0 -2803
- package/coverage/src/device/ceilinglight.ts.html +0 -2338
- package/coverage/src/device/colorbulb.ts.html +0 -2824
- package/coverage/src/device/contact.ts.html +0 -1465
- package/coverage/src/device/curtain.ts.html +0 -2869
- package/coverage/src/device/device.ts.html +0 -2500
- package/coverage/src/device/fan.ts.html +0 -2242
- package/coverage/src/device/hub.ts.html +0 -1408
- package/coverage/src/device/humidifier.ts.html +0 -2116
- package/coverage/src/device/index.html +0 -416
- package/coverage/src/device/iosensor.ts.html +0 -1375
- package/coverage/src/device/lightstrip.ts.html +0 -2617
- package/coverage/src/device/lock.ts.html +0 -1963
- package/coverage/src/device/meter.ts.html +0 -1372
- package/coverage/src/device/meterplus.ts.html +0 -1384
- package/coverage/src/device/meterpro.ts.html +0 -1618
- package/coverage/src/device/motion.ts.html +0 -1264
- package/coverage/src/device/plug.ts.html +0 -1372
- package/coverage/src/device/relayswitch.ts.html +0 -2284
- package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
- package/coverage/src/device/waterdetector.ts.html +0 -1294
- package/coverage/src/homebridge-ui/index.html +0 -116
- package/coverage/src/homebridge-ui/server.ts.html +0 -229
- package/coverage/src/index.html +0 -161
- package/coverage/src/index.ts.html +0 -124
- package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
- package/coverage/src/irdevice/airpurifier.ts.html +0 -844
- package/coverage/src/irdevice/camera.ts.html +0 -475
- package/coverage/src/irdevice/fan.ts.html +0 -766
- package/coverage/src/irdevice/index.html +0 -251
- package/coverage/src/irdevice/irdevice.ts.html +0 -1117
- package/coverage/src/irdevice/light.ts.html +0 -826
- package/coverage/src/irdevice/other.ts.html +0 -2458
- package/coverage/src/irdevice/tv.ts.html +0 -1222
- package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
- package/coverage/src/irdevice/waterheater.ts.html +0 -469
- package/coverage/src/platform.ts.html +0 -8776
- package/coverage/src/settings.ts.html +0 -934
- package/coverage/src/utils.ts.html +0 -2092
- package/dist/devices-hap/airpurifier.d.ts +0 -54
- package/dist/devices-hap/airpurifier.d.ts.map +0 -1
- package/dist/devices-hap/airpurifier.js +0 -533
- package/dist/devices-hap/airpurifier.js.map +0 -1
- package/dist/devices-hap/blindtilt.d.ts +0 -90
- package/dist/devices-hap/blindtilt.d.ts.map +0 -1
- package/dist/devices-hap/blindtilt.js +0 -974
- package/dist/devices-hap/blindtilt.js.map +0 -1
- package/dist/devices-hap/bot.d.ts +0 -102
- package/dist/devices-hap/bot.d.ts.map +0 -1
- package/dist/devices-hap/bot.js +0 -822
- package/dist/devices-hap/bot.js.map +0 -1
- package/dist/devices-hap/ceilinglight.d.ts +0 -85
- package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
- package/dist/devices-hap/ceilinglight.js +0 -707
- package/dist/devices-hap/ceilinglight.js.map +0 -1
- package/dist/devices-hap/colorbulb.d.ts +0 -88
- package/dist/devices-hap/colorbulb.d.ts.map +0 -1
- package/dist/devices-hap/colorbulb.js +0 -921
- package/dist/devices-hap/colorbulb.js.map +0 -1
- package/dist/devices-hap/contact.d.ts +0 -44
- package/dist/devices-hap/contact.d.ts.map +0 -1
- package/dist/devices-hap/contact.js +0 -409
- package/dist/devices-hap/contact.js.map +0 -1
- package/dist/devices-hap/curtain.d.ts +0 -73
- package/dist/devices-hap/curtain.d.ts.map +0 -1
- package/dist/devices-hap/curtain.js +0 -869
- package/dist/devices-hap/curtain.js.map +0 -1
- package/dist/devices-hap/device.d.ts +0 -108
- package/dist/devices-hap/device.d.ts.map +0 -1
- package/dist/devices-hap/device.js +0 -821
- package/dist/devices-hap/device.js.map +0 -1
- package/dist/devices-hap/fan.d.ts +0 -69
- package/dist/devices-hap/fan.d.ts.map +0 -1
- package/dist/devices-hap/fan.js +0 -655
- package/dist/devices-hap/fan.js.map +0 -1
- package/dist/devices-hap/hub.d.ts +0 -37
- package/dist/devices-hap/hub.d.ts.map +0 -1
- package/dist/devices-hap/hub.js +0 -393
- package/dist/devices-hap/hub.js.map +0 -1
- package/dist/devices-hap/humidifier.d.ts +0 -73
- package/dist/devices-hap/humidifier.d.ts.map +0 -1
- package/dist/devices-hap/humidifier.js +0 -716
- package/dist/devices-hap/humidifier.js.map +0 -1
- package/dist/devices-hap/iosensor.d.ts +0 -42
- package/dist/devices-hap/iosensor.d.ts.map +0 -1
- package/dist/devices-hap/iosensor.js +0 -397
- package/dist/devices-hap/iosensor.js.map +0 -1
- package/dist/devices-hap/lightstrip.d.ts +0 -79
- package/dist/devices-hap/lightstrip.d.ts.map +0 -1
- package/dist/devices-hap/lightstrip.js +0 -827
- package/dist/devices-hap/lightstrip.js.map +0 -1
- package/dist/devices-hap/lock.d.ts +0 -53
- package/dist/devices-hap/lock.d.ts.map +0 -1
- package/dist/devices-hap/lock.js +0 -569
- package/dist/devices-hap/lock.js.map +0 -1
- package/dist/devices-hap/meter.d.ts +0 -37
- package/dist/devices-hap/meter.d.ts.map +0 -1
- package/dist/devices-hap/meter.js +0 -380
- package/dist/devices-hap/meter.js.map +0 -1
- package/dist/devices-hap/meterplus.d.ts +0 -42
- package/dist/devices-hap/meterplus.d.ts.map +0 -1
- package/dist/devices-hap/meterplus.js +0 -385
- package/dist/devices-hap/meterplus.js.map +0 -1
- package/dist/devices-hap/meterpro.d.ts +0 -43
- package/dist/devices-hap/meterpro.d.ts.map +0 -1
- package/dist/devices-hap/meterpro.js +0 -469
- package/dist/devices-hap/meterpro.js.map +0 -1
- package/dist/devices-hap/motion.d.ts +0 -42
- package/dist/devices-hap/motion.d.ts.map +0 -1
- package/dist/devices-hap/motion.js +0 -345
- package/dist/devices-hap/motion.js.map +0 -1
- package/dist/devices-hap/plug.d.ts +0 -49
- package/dist/devices-hap/plug.d.ts.map +0 -1
- package/dist/devices-hap/plug.js +0 -400
- package/dist/devices-hap/plug.js.map +0 -1
- package/dist/devices-hap/relayswitch.d.ts +0 -96
- package/dist/devices-hap/relayswitch.d.ts.map +0 -1
- package/dist/devices-hap/relayswitch.js +0 -642
- package/dist/devices-hap/relayswitch.js.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
- package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.js +0 -530
- package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
- package/dist/devices-hap/waterdetector.d.ts +0 -41
- package/dist/devices-hap/waterdetector.d.ts.map +0 -1
- package/dist/devices-hap/waterdetector.js +0 -356
- package/dist/devices-hap/waterdetector.js.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -90
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -264
- package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.js +0 -95
- package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -76
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.js +0 -34
- package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
- package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.js +0 -167
- package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
- package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.js +0 -50
- package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -106
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/FanAccessory.d.ts +0 -16
- package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
- package/dist/devices-matter/FanAccessory.js +0 -81
- package/dist/devices-matter/FanAccessory.js.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
- package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.js +0 -33
- package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.js +0 -34
- package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
- package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.js +0 -110
- package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +0 -43
- package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -61
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.js +0 -544
- package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
- package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
- package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
- package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.js +0 -95
- package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
- package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
- package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
- package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.js +0 -131
- package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
- package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
- package/dist/devices-matter/custom/index.d.ts +0 -8
- package/dist/devices-matter/custom/index.d.ts.map +0 -1
- package/dist/devices-matter/custom/index.js +0 -8
- package/dist/devices-matter/custom/index.js.map +0 -1
- package/dist/devices-matter/index.d.ts +0 -29
- package/dist/devices-matter/index.d.ts.map +0 -1
- package/dist/devices-matter/index.js +0 -28
- package/dist/devices-matter/index.js.map +0 -1
- package/dist/irdevice/airconditioner.d.ts +0 -61
- package/dist/irdevice/airconditioner.d.ts.map +0 -1
- package/dist/irdevice/airconditioner.js +0 -472
- package/dist/irdevice/airconditioner.js.map +0 -1
- package/dist/irdevice/airpurifier.d.ts +0 -50
- package/dist/irdevice/airpurifier.d.ts.map +0 -1
- package/dist/irdevice/airpurifier.js +0 -213
- package/dist/irdevice/airpurifier.js.map +0 -1
- package/dist/irdevice/camera.d.ts +0 -32
- package/dist/irdevice/camera.d.ts.map +0 -1
- package/dist/irdevice/camera.js +0 -107
- package/dist/irdevice/camera.js.map +0 -1
- package/dist/irdevice/fan.d.ts +0 -36
- package/dist/irdevice/fan.d.ts.map +0 -1
- package/dist/irdevice/fan.js +0 -200
- package/dist/irdevice/fan.js.map +0 -1
- package/dist/irdevice/irdevice.d.ts +0 -69
- package/dist/irdevice/irdevice.d.ts.map +0 -1
- package/dist/irdevice/irdevice.js +0 -339
- package/dist/irdevice/irdevice.js.map +0 -1
- package/dist/irdevice/light.d.ts +0 -36
- package/dist/irdevice/light.d.ts.map +0 -1
- package/dist/irdevice/light.js +0 -206
- package/dist/irdevice/light.js.map +0 -1
- package/dist/irdevice/other.d.ts +0 -57
- package/dist/irdevice/other.d.ts.map +0 -1
- package/dist/irdevice/other.js +0 -778
- package/dist/irdevice/other.js.map +0 -1
- package/dist/irdevice/tv.d.ts +0 -45
- package/dist/irdevice/tv.d.ts.map +0 -1
- package/dist/irdevice/tv.js +0 -327
- package/dist/irdevice/tv.js.map +0 -1
- package/dist/irdevice/vacuumcleaner.d.ts +0 -28
- package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
- package/dist/irdevice/vacuumcleaner.js +0 -104
- package/dist/irdevice/vacuumcleaner.js.map +0 -1
- package/dist/irdevice/waterheater.d.ts +0 -30
- package/dist/irdevice/waterheater.d.ts.map +0 -1
- package/dist/irdevice/waterheater.js +0 -105
- package/dist/irdevice/waterheater.js.map +0 -1
- package/dist/platform-hap.d.ts +0 -160
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -3041
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -188
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -2545
- package/dist/platform-matter.js.map +0 -1
- package/dist/test/apiRequestTracker.test.d.ts +0 -2
- package/dist/test/apiRequestTracker.test.d.ts.map +0 -1
- package/dist/test/apiRequestTracker.test.js +0 -392
- package/dist/test/apiRequestTracker.test.js.map +0 -1
- package/dist/test/hap/device-webhook-context.test.d.ts +0 -2
- package/dist/test/hap/device-webhook-context.test.d.ts.map +0 -1
- package/dist/test/hap/device-webhook-context.test.js +0 -128
- package/dist/test/hap/device-webhook-context.test.js.map +0 -1
- package/dist/test/hap/platform-hap.logging.test.d.ts +0 -2
- package/dist/test/hap/platform-hap.logging.test.d.ts.map +0 -1
- package/dist/test/hap/platform-hap.logging.test.js +0 -33
- package/dist/test/hap/platform-hap.logging.test.js.map +0 -1
- package/dist/test/hap/platform-hap.test.d.ts +0 -2
- package/dist/test/hap/platform-hap.test.d.ts.map +0 -1
- package/dist/test/hap/platform-hap.test.js +0 -62
- package/dist/test/hap/platform-hap.test.js.map +0 -1
- package/dist/test/helpers/platform-fixtures.d.ts +0 -9
- package/dist/test/helpers/platform-fixtures.d.ts.map +0 -1
- package/dist/test/helpers/platform-fixtures.js +0 -30
- package/dist/test/helpers/platform-fixtures.js.map +0 -1
- package/dist/test/homebridge-ui/server.test.d.ts +0 -2
- package/dist/test/homebridge-ui/server.test.d.ts.map +0 -1
- package/dist/test/homebridge-ui/server.test.js +0 -445
- package/dist/test/homebridge-ui/server.test.js.map +0 -1
- package/dist/test/index.test.d.ts +0 -2
- package/dist/test/index.test.d.ts.map +0 -1
- package/dist/test/index.test.js +0 -19
- package/dist/test/index.test.js.map +0 -1
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +0 -2
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +0 -1
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +0 -71
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +0 -1
- package/dist/test/matter/platform-matter.additional.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.additional.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.additional.test.js +0 -35
- package/dist/test/matter/platform-matter.additional.test.js.map +0 -1
- package/dist/test/matter/platform-matter.bleparse.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.bleparse.test.js +0 -43
- package/dist/test/matter/platform-matter.bleparse.test.js.map +0 -1
- package/dist/test/matter/platform-matter.cleanup.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.cleanup.test.js +0 -70
- package/dist/test/matter/platform-matter.cleanup.test.js.map +0 -1
- package/dist/test/matter/platform-matter.keepstale.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.keepstale.test.js +0 -27
- package/dist/test/matter/platform-matter.keepstale.test.js.map +0 -1
- package/dist/test/matter/platform-matter.logging.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.logging.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.logging.test.js +0 -29
- package/dist/test/matter/platform-matter.logging.test.js.map +0 -1
- package/dist/test/matter/platform-matter.mapping.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.mapping.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.mapping.test.js +0 -43
- package/dist/test/matter/platform-matter.mapping.test.js.map +0 -1
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.openapi-mapping.test.js +0 -84
- package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +0 -1
- package/dist/test/matter/platform-matter.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.test.js +0 -117
- package/dist/test/matter/platform-matter.test.js.map +0 -1
- package/dist/test/matter/platform-matter.unregister.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.unregister.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.unregister.test.js +0 -30
- package/dist/test/matter/platform-matter.unregister.test.js.map +0 -1
- package/dist/test/matter/platform-matter.webhook.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.webhook.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.webhook.test.js +0 -46
- package/dist/test/matter/platform-matter.webhook.test.js.map +0 -1
- package/dist/test/utils.test.d.ts +0 -2
- package/dist/test/utils.test.d.ts.map +0 -1
- package/dist/test/utils.test.js +0 -95
- package/dist/test/utils.test.js.map +0 -1
- package/dist/test/verifyconfig.test.d.ts +0 -2
- package/dist/test/verifyconfig.test.d.ts.map +0 -1
- package/dist/test/verifyconfig.test.js +0 -167
- package/dist/test/verifyconfig.test.js.map +0 -1
- package/src/custom.d.ts +0 -7
- package/src/devices-hap/airpurifier.ts +0 -568
- package/src/devices-hap/blindtilt.ts +0 -1049
- package/src/devices-hap/bot.ts +0 -910
- package/src/devices-hap/ceilinglight.ts +0 -747
- package/src/devices-hap/colorbulb.ts +0 -940
- package/src/devices-hap/contact.ts +0 -457
- package/src/devices-hap/curtain.ts +0 -944
- package/src/devices-hap/device.ts +0 -890
- package/src/devices-hap/fan.ts +0 -716
- package/src/devices-hap/hub.ts +0 -440
- package/src/devices-hap/humidifier.ts +0 -762
- package/src/devices-hap/iosensor.ts +0 -442
- package/src/devices-hap/lightstrip.ts +0 -863
- package/src/devices-hap/lock.ts +0 -627
- package/src/devices-hap/meter.ts +0 -427
- package/src/devices-hap/meterplus.ts +0 -431
- package/src/devices-hap/meterpro.ts +0 -523
- package/src/devices-hap/motion.ts +0 -390
- package/src/devices-hap/plug.ts +0 -427
- package/src/devices-hap/relayswitch.ts +0 -727
- package/src/devices-hap/robotvacuumcleaner.ts +0 -574
- package/src/devices-hap/waterdetector.ts +0 -400
- package/src/devices-matter/BaseMatterAccessory.ts +0 -302
- package/src/devices-matter/ColorLightAccessory.ts +0 -110
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -90
- package/src/devices-matter/ContactSensorAccessory.ts +0 -41
- package/src/devices-matter/DimmableLightAccessory.ts +0 -192
- package/src/devices-matter/DoorLockAccessory.ts +0 -60
- package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -122
- package/src/devices-matter/FanAccessory.ts +0 -95
- package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
- package/src/devices-matter/LeakSensorAccessory.ts +0 -40
- package/src/devices-matter/LightSensorAccessory.ts +0 -41
- package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
- package/src/devices-matter/OnOffLightAccessory.ts +0 -125
- package/src/devices-matter/OnOffOutletAccessory.ts +0 -51
- package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
- package/src/devices-matter/RoboticVacuumAccessory.ts +0 -621
- package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
- package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
- package/src/devices-matter/ThermostatAccessory.ts +0 -110
- package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
- package/src/devices-matter/WindowBlindAccessory.ts +0 -135
- package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
- package/src/devices-matter/custom/index.ts +0 -8
- package/src/devices-matter/index.ts +0 -29
- package/src/irdevice/airconditioner.ts +0 -533
- package/src/irdevice/airpurifier.ts +0 -252
- package/src/irdevice/camera.ts +0 -129
- package/src/irdevice/fan.ts +0 -226
- package/src/irdevice/irdevice.ts +0 -383
- package/src/irdevice/light.ts +0 -246
- package/src/irdevice/other.ts +0 -790
- package/src/irdevice/tv.ts +0 -378
- package/src/irdevice/vacuumcleaner.ts +0 -126
- package/src/irdevice/waterheater.ts +0 -127
- package/src/platform-hap.ts +0 -3193
- package/src/platform-matter.ts +0 -2703
- package/src/test/apiRequestTracker.test.ts +0 -417
- package/src/test/hap/device-webhook-context.test.ts +0 -136
- package/src/test/hap/platform-hap.logging.test.ts +0 -36
- package/src/test/hap/platform-hap.test.ts +0 -70
- package/src/test/helpers/platform-fixtures.ts +0 -33
- package/src/test/homebridge-ui/server.test.ts +0 -486
- package/src/test/index.test.ts +0 -24
- package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +0 -88
- package/src/test/matter/platform-matter.additional.test.ts +0 -44
- package/src/test/matter/platform-matter.bleparse.test.ts +0 -47
- package/src/test/matter/platform-matter.cleanup.test.ts +0 -86
- package/src/test/matter/platform-matter.keepstale.test.ts +0 -37
- package/src/test/matter/platform-matter.logging.test.ts +0 -33
- package/src/test/matter/platform-matter.mapping.test.ts +0 -57
- package/src/test/matter/platform-matter.openapi-mapping.test.ts +0 -109
- package/src/test/matter/platform-matter.test.ts +0 -144
- package/src/test/matter/platform-matter.unregister.test.ts +0 -39
- package/src/test/matter/platform-matter.webhook.test.ts +0 -54
- package/src/test/utils.test.ts +0 -96
- package/src/test/verifyconfig.test.ts +0 -198
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Matter Accessory Class
|
|
3
|
-
*
|
|
4
|
-
* This base class implements the MatterAccessory interface and provides
|
|
5
|
-
* common functionality that all Matter devices can use.
|
|
6
|
-
*
|
|
7
|
-
* Individual device types should extend this class and call super() with
|
|
8
|
-
* the required configuration.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { API, EndpointType, Logger, MatterAccessory } from 'homebridge'
|
|
12
|
-
|
|
13
|
-
import { deviceLoggingEnabled, deviceLoggingIsDebug, logDeviceStatusCode, rgb2hs } from '../utils.js'
|
|
14
|
-
|
|
15
|
-
export interface BaseMatterAccessoryConfig {
|
|
16
|
-
uuid: string
|
|
17
|
-
displayName: string
|
|
18
|
-
deviceType: EndpointType
|
|
19
|
-
serialNumber: string
|
|
20
|
-
manufacturer: string
|
|
21
|
-
model: string
|
|
22
|
-
firmwareRevision: string
|
|
23
|
-
hardwareRevision: string
|
|
24
|
-
context?: Record<string, unknown>
|
|
25
|
-
clusters?: MatterAccessory['clusters']
|
|
26
|
-
handlers?: MatterAccessory['handlers']
|
|
27
|
-
parts?: MatterAccessory['parts']
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Base class for all Matter accessories
|
|
32
|
-
* Implements the MatterAccessory interface and provides common methods
|
|
33
|
-
*/
|
|
34
|
-
export abstract class BaseMatterAccessory implements MatterAccessory {
|
|
35
|
-
// Required MatterAccessory properties
|
|
36
|
-
public readonly uuid: string
|
|
37
|
-
public readonly displayName: string
|
|
38
|
-
public readonly deviceType: EndpointType
|
|
39
|
-
public readonly serialNumber: string
|
|
40
|
-
public readonly manufacturer: string
|
|
41
|
-
public readonly model: string
|
|
42
|
-
public readonly firmwareRevision: string
|
|
43
|
-
public readonly hardwareRevision: string
|
|
44
|
-
public readonly context: Record<string, unknown>
|
|
45
|
-
public readonly clusters?: MatterAccessory['clusters']
|
|
46
|
-
public readonly handlers?: MatterAccessory['handlers']
|
|
47
|
-
public readonly parts?: MatterAccessory['parts']
|
|
48
|
-
|
|
49
|
-
// Protected properties available to child classes
|
|
50
|
-
protected readonly api: API
|
|
51
|
-
protected readonly log: Logger
|
|
52
|
-
|
|
53
|
-
constructor(
|
|
54
|
-
api: API,
|
|
55
|
-
log: Logger,
|
|
56
|
-
config: BaseMatterAccessoryConfig,
|
|
57
|
-
) {
|
|
58
|
-
this.api = api
|
|
59
|
-
this.log = log
|
|
60
|
-
|
|
61
|
-
// Set all required properties
|
|
62
|
-
this.uuid = config.uuid
|
|
63
|
-
this.displayName = config.displayName
|
|
64
|
-
this.deviceType = config.deviceType
|
|
65
|
-
this.serialNumber = config.serialNumber
|
|
66
|
-
this.manufacturer = config.manufacturer
|
|
67
|
-
this.model = config.model
|
|
68
|
-
this.firmwareRevision = config.firmwareRevision
|
|
69
|
-
this.hardwareRevision = config.hardwareRevision
|
|
70
|
-
this.clusters = config.clusters
|
|
71
|
-
this.handlers = config.handlers
|
|
72
|
-
this.parts = config.parts
|
|
73
|
-
|
|
74
|
-
// Set context with all metadata
|
|
75
|
-
this.context = {
|
|
76
|
-
serialNumber: this.serialNumber,
|
|
77
|
-
manufacturer: this.manufacturer,
|
|
78
|
-
model: this.model,
|
|
79
|
-
firmwareRevision: this.firmwareRevision,
|
|
80
|
-
hardwareRevision: this.hardwareRevision,
|
|
81
|
-
...config.context,
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Update the accessory state
|
|
87
|
-
* Helper method to update cluster attributes
|
|
88
|
-
*/
|
|
89
|
-
protected async updateState(cluster: string, attributes: Record<string, unknown>): Promise<void> {
|
|
90
|
-
await this.api.matter.updateAccessoryState(this.uuid, cluster, attributes)
|
|
91
|
-
this.logDebug(`Updated ${cluster} state:`, attributes)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Log helper methods
|
|
96
|
-
*/
|
|
97
|
-
// Generic logging delegation: prefer platform-provided log helpers in
|
|
98
|
-
// `this.context` (infoLog/debugLog/warnLog/errorLog) and fall back to the
|
|
99
|
-
// local `this.log` methods when not available.
|
|
100
|
-
protected logWith(level: 'info' | 'error' | 'debug' | 'warn', message: string, ...args: unknown[]): void {
|
|
101
|
-
const ctx: any = this.context as any
|
|
102
|
-
const map: Record<string, string> = {
|
|
103
|
-
info: 'infoLog',
|
|
104
|
-
error: 'errorLog',
|
|
105
|
-
debug: 'debugLog',
|
|
106
|
-
warn: 'warnLog',
|
|
107
|
-
}
|
|
108
|
-
const fn = ctx?.[map[level]]
|
|
109
|
-
if (typeof fn === 'function') {
|
|
110
|
-
fn(`[${this.displayName}] ${message}`, ...args)
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
const local = (this.log as any)[level]
|
|
114
|
-
if (typeof local === 'function') {
|
|
115
|
-
local.call(this.log, `[${this.displayName}] ${message}`, ...args)
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
protected logInfo(message: string, ...args: unknown[]): void {
|
|
120
|
-
this.logWith('info', message, ...args)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
protected logError(message: string, ...args: unknown[]): void {
|
|
124
|
-
this.logWith('error', message, ...args)
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
protected logDebug(message: string, ...args: unknown[]): void {
|
|
128
|
-
this.logWith('debug', message, ...args)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
protected logWarn(message: string, ...args: unknown[]): void {
|
|
132
|
-
this.logWith('warn', message, ...args)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Logging helpers parity: allow Matter accessories to ask whether device-level
|
|
137
|
-
* logging is enabled or in debug mode. These mirror the helpers used by the
|
|
138
|
-
* HAP/IR device bases so behavior is consistent across platforms.
|
|
139
|
-
*/
|
|
140
|
-
public async loggingIsDebug(): Promise<boolean> {
|
|
141
|
-
const ctx: any = this.context as any
|
|
142
|
-
return deviceLoggingIsDebug(ctx?.deviceLogging)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public async enablingDeviceLogging(): Promise<boolean> {
|
|
146
|
-
const ctx: any = this.context as any
|
|
147
|
-
return deviceLoggingEnabled(ctx?.deviceLogging, ctx?.platformLogging)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Status code logging using shared helper
|
|
152
|
-
*/
|
|
153
|
-
public async statusCode(statusCode: number, deviceId?: string, hubDeviceId?: string): Promise<void> {
|
|
154
|
-
await logDeviceStatusCode(
|
|
155
|
-
statusCode,
|
|
156
|
-
{
|
|
157
|
-
debugLog: this.logDebug.bind(this),
|
|
158
|
-
errorLog: this.logError.bind(this),
|
|
159
|
-
infoLog: this.logInfo.bind(this),
|
|
160
|
-
},
|
|
161
|
-
deviceId ?? (this.context as any)?.deviceId,
|
|
162
|
-
hubDeviceId ?? (this.context as any)?.hubDeviceId,
|
|
163
|
-
)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Convenience helpers that delegate OpenAPI/BLE commands to platform-provided
|
|
168
|
-
* functions that are injected into the accessory `context` by
|
|
169
|
-
* `platform-matter` when the accessory is created from a discovered device.
|
|
170
|
-
*
|
|
171
|
-
* These methods are intentionally thin wrappers — the platform controls
|
|
172
|
-
* retries, discovery and client lifecycle via the helper functions.
|
|
173
|
-
*/
|
|
174
|
-
protected async sendOpenAPICommand(command: string, parameter = 'default'): Promise<any> {
|
|
175
|
-
const ctx: any = this.context as any
|
|
176
|
-
const fn = ctx?.sendOpenAPI
|
|
177
|
-
if (typeof fn === 'function') {
|
|
178
|
-
return fn(command, parameter)
|
|
179
|
-
}
|
|
180
|
-
throw new Error('OpenAPI helper not available')
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
protected async sendBLECommand(methodName: string, ...args: any[]): Promise<any> {
|
|
184
|
-
const ctx: any = this.context as any
|
|
185
|
-
const fn = ctx?.sendBLE
|
|
186
|
-
if (typeof fn === 'function') {
|
|
187
|
-
return fn(methodName, ...args)
|
|
188
|
-
}
|
|
189
|
-
throw new Error('BLE helper not available')
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
public async sendOnCommand(deviceId?: string): Promise<void> {
|
|
193
|
-
const ctx: any = this.context as any
|
|
194
|
-
const id = deviceId ?? ctx?.deviceId
|
|
195
|
-
try {
|
|
196
|
-
if (ctx?.connectionType === 'BLE') {
|
|
197
|
-
await this.sendBLECommand('turnOn')
|
|
198
|
-
} else {
|
|
199
|
-
await this.sendOpenAPICommand('turnOn')
|
|
200
|
-
}
|
|
201
|
-
// update our matter state
|
|
202
|
-
await this.updateState(this.api.matter.clusterNames.OnOff, { onOff: true })
|
|
203
|
-
this.logInfo(`sendOnCommand successful for ${id}`)
|
|
204
|
-
} catch (e: any) {
|
|
205
|
-
this.logError(`sendOnCommand failed for ${id}: ${String(e?.message ?? e)}`)
|
|
206
|
-
throw e
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
public async sendOffCommand(deviceId?: string): Promise<void> {
|
|
211
|
-
const ctx: any = this.context as any
|
|
212
|
-
const id = deviceId ?? ctx?.deviceId
|
|
213
|
-
try {
|
|
214
|
-
if (ctx?.connectionType === 'BLE') {
|
|
215
|
-
await this.sendBLECommand('turnOff')
|
|
216
|
-
} else {
|
|
217
|
-
await this.sendOpenAPICommand('turnOff')
|
|
218
|
-
}
|
|
219
|
-
await this.updateState(this.api.matter.clusterNames.OnOff, { onOff: false })
|
|
220
|
-
this.logInfo(`sendOffCommand successful for ${id}`)
|
|
221
|
-
} catch (e: any) {
|
|
222
|
-
this.logError(`sendOffCommand failed for ${id}: ${String(e?.message ?? e)}`)
|
|
223
|
-
throw e
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
public async sendSetBrightness(percent: number, deviceId?: string): Promise<void> {
|
|
228
|
-
const ctx: any = this.context as any
|
|
229
|
-
const id = deviceId ?? ctx?.deviceId
|
|
230
|
-
try {
|
|
231
|
-
if (ctx?.connectionType === 'BLE') {
|
|
232
|
-
await this.sendBLECommand('setBrightness', percent)
|
|
233
|
-
} else {
|
|
234
|
-
await this.sendOpenAPICommand('setBrightness', String(percent))
|
|
235
|
-
}
|
|
236
|
-
const level = Math.round((percent / 100) * 254)
|
|
237
|
-
await this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: level })
|
|
238
|
-
this.logInfo(`sendSetBrightness successful for ${id}: ${percent}%`)
|
|
239
|
-
} catch (e: any) {
|
|
240
|
-
this.logError(`sendSetBrightness failed for ${id}: ${String(e?.message ?? e)}`)
|
|
241
|
-
throw e
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
public async sendSetColor(r: number, g: number, b: number, deviceId?: string): Promise<void> {
|
|
246
|
-
const ctx: any = this.context as any
|
|
247
|
-
const id = deviceId ?? ctx?.deviceId
|
|
248
|
-
try {
|
|
249
|
-
if (ctx?.connectionType === 'BLE') {
|
|
250
|
-
await this.sendBLECommand('setRGB', r, g, b)
|
|
251
|
-
} else {
|
|
252
|
-
await this.sendOpenAPICommand('setColor', `${r}:${g}:${b}`)
|
|
253
|
-
}
|
|
254
|
-
// Convert to hue/sat for matter state update
|
|
255
|
-
const [h, s] = rgb2hs(r, g, b)
|
|
256
|
-
await this.updateState(this.api.matter.clusterNames.ColorControl, { currentHue: Math.round((h / 360) * 254), currentSaturation: Math.round((s / 100) * 254) })
|
|
257
|
-
this.logInfo(`sendSetColor successful for ${id}: ${r},${g},${b}`)
|
|
258
|
-
} catch (e: any) {
|
|
259
|
-
this.logError(`sendSetColor failed for ${id}: ${String(e?.message ?? e)}`)
|
|
260
|
-
throw e
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
public async sendSetColorTemperature(kelvin: number, deviceId?: string): Promise<void> {
|
|
265
|
-
const ctx: any = this.context as any
|
|
266
|
-
const id = deviceId ?? ctx?.deviceId
|
|
267
|
-
try {
|
|
268
|
-
if (ctx?.connectionType === 'BLE') {
|
|
269
|
-
await this.sendBLECommand('setColorTemperature', kelvin)
|
|
270
|
-
} else {
|
|
271
|
-
await this.sendOpenAPICommand('setColorTemperature', `${kelvin}`)
|
|
272
|
-
}
|
|
273
|
-
const mireds = Math.round(1000000 / kelvin)
|
|
274
|
-
await this.updateState(this.api.matter.clusterNames.ColorControl, { colorTemperatureMireds: mireds })
|
|
275
|
-
this.logInfo(`sendSetColorTemperature successful for ${id}: ${kelvin}K`)
|
|
276
|
-
} catch (e: any) {
|
|
277
|
-
this.logError(`sendSetColorTemperature failed for ${id}: ${String(e?.message ?? e)}`)
|
|
278
|
-
throw e
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Convert this class instance to a plain MatterAccessory object
|
|
284
|
-
* This is what gets registered with Homebridge
|
|
285
|
-
*/
|
|
286
|
-
public toAccessory(): MatterAccessory {
|
|
287
|
-
return {
|
|
288
|
-
uuid: this.uuid,
|
|
289
|
-
displayName: this.displayName,
|
|
290
|
-
deviceType: this.deviceType,
|
|
291
|
-
serialNumber: this.serialNumber,
|
|
292
|
-
manufacturer: this.manufacturer,
|
|
293
|
-
model: this.model,
|
|
294
|
-
firmwareRevision: this.firmwareRevision,
|
|
295
|
-
hardwareRevision: this.hardwareRevision,
|
|
296
|
-
context: this.context,
|
|
297
|
-
clusters: this.clusters,
|
|
298
|
-
handlers: this.handlers,
|
|
299
|
-
parts: this.parts,
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Color Light Accessory Class (HS only)
|
|
3
|
-
* Hue and Saturation color control
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
7
|
-
|
|
8
|
-
import { hs2rgb } from '../utils.js'
|
|
9
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
10
|
-
|
|
11
|
-
export class ColorLightAccessory extends BaseMatterAccessory {
|
|
12
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
13
|
-
const serialNumber = opts?.serialNumber ?? 'LIGHT-004'
|
|
14
|
-
const displayName = opts?.displayName ?? 'Colour Light (HS)'
|
|
15
|
-
const manufacturer = opts?.manufacturer ?? 'Homebridge Matter'
|
|
16
|
-
const model = opts?.model ?? 'HB-MATTER-LIGHT-COLOUR-HS'
|
|
17
|
-
const firmwareRevision = opts?.firmwareRevision ?? '2.0.0'
|
|
18
|
-
const hardwareRevision = opts?.hardwareRevision ?? '1.0.0'
|
|
19
|
-
|
|
20
|
-
const clusters = opts?.clusters ?? {
|
|
21
|
-
onOff: { onOff: false },
|
|
22
|
-
levelControl: { currentLevel: 127, minLevel: 1, maxLevel: 254 },
|
|
23
|
-
colorControl: {
|
|
24
|
-
colorMode: api.matter.types.ColorControl.ColorMode.CurrentHueAndCurrentSaturation,
|
|
25
|
-
currentHue: 0,
|
|
26
|
-
currentSaturation: 254,
|
|
27
|
-
currentX: 41942,
|
|
28
|
-
currentY: 21626,
|
|
29
|
-
},
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const handlers = opts?.handlers ?? {
|
|
33
|
-
onOff: { on: async () => this.handleOn(), off: async () => this.handleOff() },
|
|
34
|
-
levelControl: { moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) => this.handleSetLevel(request) },
|
|
35
|
-
colorControl: {
|
|
36
|
-
moveToColorLogic: async (request: MatterRequests.MoveToColor) => this.handleSetColor(request),
|
|
37
|
-
moveToHueAndSaturationLogic: async (request: MatterRequests.MoveToHueAndSaturation) => this.handleSetHueSaturation(request),
|
|
38
|
-
},
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
super(api, log, {
|
|
42
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
43
|
-
displayName,
|
|
44
|
-
deviceType: api.matter.deviceTypes.ExtendedColorLight,
|
|
45
|
-
serialNumber,
|
|
46
|
-
manufacturer,
|
|
47
|
-
model,
|
|
48
|
-
firmwareRevision,
|
|
49
|
-
hardwareRevision,
|
|
50
|
-
clusters,
|
|
51
|
-
handlers,
|
|
52
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}) },
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
this.logInfo('initialized.')
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private async handleOn(): Promise<void> {
|
|
59
|
-
this.logInfo('turning on.')
|
|
60
|
-
await this.sendOnCommand()
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private async handleOff(): Promise<void> {
|
|
64
|
-
this.logInfo('turning off.')
|
|
65
|
-
await this.sendOffCommand()
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
|
|
69
|
-
this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
|
|
70
|
-
const { level } = request
|
|
71
|
-
const brightnessPercent = Math.round((level / 254) * 100)
|
|
72
|
-
await this.sendSetBrightness(brightnessPercent)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private async handleSetColor(request: MatterRequests.MoveToColor): Promise<void> {
|
|
76
|
-
this.logInfo(`MoveToColor request: ${JSON.stringify(request)}`)
|
|
77
|
-
const { colorX, colorY } = request
|
|
78
|
-
const hueApprox = Math.round((colorX / 65535) * 360)
|
|
79
|
-
const satApprox = Math.round((colorY / 65535) * 100)
|
|
80
|
-
const [r, g, b] = hs2rgb(hueApprox, satApprox)
|
|
81
|
-
await this.sendSetColor(r, g, b)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
private async handleSetHueSaturation(request: MatterRequests.MoveToHueAndSaturation): Promise<void> {
|
|
85
|
-
this.logInfo(`MoveToHueAndSaturation request: ${JSON.stringify(request)}`)
|
|
86
|
-
const { hue, saturation } = request
|
|
87
|
-
const hueDegrees = Math.round((hue / 254) * 360)
|
|
88
|
-
const saturationPercent = Math.round((saturation / 254) * 100)
|
|
89
|
-
const [r, g, b] = hs2rgb(hueDegrees, saturationPercent)
|
|
90
|
-
await this.sendSetColor(r, g, b)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public updateOnOffState(isOn: boolean): void {
|
|
94
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
public updateBrightness(percent: number): void {
|
|
98
|
-
const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
|
|
99
|
-
this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
public updateHueSaturation(hue: number, saturation: number): void {
|
|
103
|
-
const matterHue = Math.round((hue / 360) * 254)
|
|
104
|
-
const matterSat = Math.round((saturation / 100) * 254)
|
|
105
|
-
this.updateState(this.api.matter.clusterNames.ColorControl, {
|
|
106
|
-
currentHue: matterHue,
|
|
107
|
-
currentSaturation: matterSat,
|
|
108
|
-
})
|
|
109
|
-
}
|
|
110
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Color Temperature Light Accessory Class
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
6
|
-
|
|
7
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
-
|
|
9
|
-
export class ColorTemperatureLightAccessory extends BaseMatterAccessory {
|
|
10
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
11
|
-
const serialNumber = opts?.serialNumber ?? 'LIGHT-003'
|
|
12
|
-
const displayName = opts?.displayName ?? 'Colour Temperature Light'
|
|
13
|
-
const manufacturer = opts?.manufacturer ?? 'Homebridge Matter'
|
|
14
|
-
const model = opts?.model ?? 'HB-MATTER-LIGHT-COLOUR-TEMP'
|
|
15
|
-
const firmwareRevision = opts?.firmwareRevision ?? '2.0.0'
|
|
16
|
-
const hardwareRevision = opts?.hardwareRevision ?? '1.0.0'
|
|
17
|
-
|
|
18
|
-
const clusters = opts?.clusters ?? {
|
|
19
|
-
onOff: { onOff: false },
|
|
20
|
-
levelControl: { currentLevel: 127, minLevel: 1, maxLevel: 254 },
|
|
21
|
-
colorControl: {
|
|
22
|
-
colorMode: api.matter.types.ColorControl.ColorMode.ColorTemperatureMireds,
|
|
23
|
-
colorTemperatureMireds: 250,
|
|
24
|
-
colorTempPhysicalMinMireds: 147,
|
|
25
|
-
colorTempPhysicalMaxMireds: 454,
|
|
26
|
-
coupleColorTempToLevelMinMireds: 147,
|
|
27
|
-
},
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const handlers = opts?.handlers ?? {
|
|
31
|
-
onOff: { on: async () => this.handleOn(), off: async () => this.handleOff() },
|
|
32
|
-
levelControl: { moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) => this.handleSetLevel(request) },
|
|
33
|
-
colorControl: { moveToColorTemperatureLogic: async (request: MatterRequests.MoveToColorTemperature) => this.handleSetColorTemperature(request) },
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
super(api, log, {
|
|
37
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
38
|
-
displayName,
|
|
39
|
-
deviceType: api.matter.deviceTypes.ColorTemperatureLight,
|
|
40
|
-
serialNumber,
|
|
41
|
-
manufacturer,
|
|
42
|
-
model,
|
|
43
|
-
firmwareRevision,
|
|
44
|
-
hardwareRevision,
|
|
45
|
-
clusters,
|
|
46
|
-
handlers,
|
|
47
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}) },
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
this.logInfo('initialized.')
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private async handleOn(): Promise<void> {
|
|
54
|
-
this.logInfo('turning on.')
|
|
55
|
-
await this.sendOnCommand()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private async handleOff(): Promise<void> {
|
|
59
|
-
this.logInfo('turning off.')
|
|
60
|
-
await this.sendOffCommand()
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
|
|
64
|
-
this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
|
|
65
|
-
const { level } = request
|
|
66
|
-
const brightnessPercent = Math.round((level / 254) * 100)
|
|
67
|
-
await this.sendSetBrightness(brightnessPercent)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private async handleSetColorTemperature(request: MatterRequests.MoveToColorTemperature): Promise<void> {
|
|
71
|
-
this.logInfo(`MoveToColorTemperature request: ${JSON.stringify(request)}`)
|
|
72
|
-
const { colorTemperatureMireds } = request
|
|
73
|
-
const kelvin = Math.round(1000000 / colorTemperatureMireds)
|
|
74
|
-
await this.sendSetColorTemperature(kelvin)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
public updateOnOffState(isOn: boolean): void {
|
|
78
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
public updateBrightness(percent: number): void {
|
|
82
|
-
const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
|
|
83
|
-
this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public updateColorTemperature(kelvin: number): void {
|
|
87
|
-
const mireds = Math.round(1000000 / kelvin)
|
|
88
|
-
this.updateState(this.api.matter.clusterNames.ColorControl, { colorTemperatureMireds: mireds })
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Contact Sensor Accessory Class
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { API, Logger } from 'homebridge'
|
|
6
|
-
|
|
7
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
-
|
|
9
|
-
export class ContactSensorAccessory extends BaseMatterAccessory {
|
|
10
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
11
|
-
const serialNumber = opts?.serialNumber ?? 'SENSOR-001'
|
|
12
|
-
const displayName = opts?.displayName ?? 'Contact Sensor'
|
|
13
|
-
const manufacturer = opts?.manufacturer ?? 'Homebridge Matter'
|
|
14
|
-
const model = opts?.model ?? 'HB-MATTER-SENSOR-CONTACT'
|
|
15
|
-
const firmwareRevision = opts?.firmwareRevision ?? '2.0.0'
|
|
16
|
-
const hardwareRevision = opts?.hardwareRevision ?? '1.0.0'
|
|
17
|
-
|
|
18
|
-
const clusters = opts?.clusters ?? { booleanState: { stateValue: true } }
|
|
19
|
-
|
|
20
|
-
super(api, log, {
|
|
21
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
22
|
-
displayName,
|
|
23
|
-
deviceType: api.matter.deviceTypes.ContactSensor,
|
|
24
|
-
serialNumber,
|
|
25
|
-
manufacturer,
|
|
26
|
-
model,
|
|
27
|
-
firmwareRevision,
|
|
28
|
-
hardwareRevision,
|
|
29
|
-
clusters,
|
|
30
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}) },
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
this.logInfo('initialized.')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public updateContactState(isOpen: boolean): void {
|
|
37
|
-
// Matter BooleanState: false = open/triggered, true = closed/normal (inverted!)
|
|
38
|
-
this.updateState(this.api.matter.clusterNames.BooleanState, { stateValue: !isOpen })
|
|
39
|
-
this.logInfo(`contact state: ${isOpen ? 'OPEN' : 'CLOSED'}.`)
|
|
40
|
-
}
|
|
41
|
-
}
|