@switchbot/homebridge-switchbot 5.0.0-beta.7 → 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 +35 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +44 -0
- package/README.md +56 -3
- package/config.schema.json +99 -14823
- 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 +77 -245
- 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 +42 -36
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -12
- 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 -249
- 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 +39 -50
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +39 -688
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +14 -0
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/main.js +2 -2
- package/docs/assets/style.css +3 -3
- package/docs/index.html +77 -13
- package/docs/variables/default.html +1 -1
- package/package.json +22 -21
- 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 +77 -245
- package/src/homebridge-ui/server.ts +49 -41
- package/src/index.ts +5 -13
- package/src/platform.ts +395 -0
- package/src/settings.ts +12 -277
- package/src/switchbotClient.ts +266 -0
- package/src/utils.ts +45 -713
- 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 -527
- 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 -811
- 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 -701
- 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 -881
- 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 -98
- package/dist/devices-hap/device.d.ts.map +0 -1
- package/dist/devices-hap/device.js +0 -749
- 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 -649
- 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 -392
- package/dist/devices-hap/hub.js.map +0 -1
- package/dist/devices-hap/humidifier.d.ts +0 -68
- package/dist/devices-hap/humidifier.d.ts.map +0 -1
- package/dist/devices-hap/humidifier.js +0 -628
- 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 -382
- 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 -797
- 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 -561
- 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 -379
- 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 -384
- 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 -468
- 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 -395
- 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 -523
- 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 -63
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -100
- 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 -78
- 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 -107
- 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 -118
- package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
- 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 -68
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
- 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 -80
- 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/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -14
- package/dist/index.test.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 -68
- package/dist/irdevice/irdevice.d.ts.map +0 -1
- package/dist/irdevice/irdevice.js +0 -298
- 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 -149
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -2861
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -101
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -896
- package/dist/platform-matter.js.map +0 -1
- package/dist/verifyconfig.test.d.ts +0 -2
- package/dist/verifyconfig.test.d.ts.map +0 -1
- package/dist/verifyconfig.test.js +0 -167
- package/dist/verifyconfig.test.js.map +0 -1
- package/src/custom.d.ts +0 -7
- package/src/devices-hap/airpurifier.ts +0 -563
- package/src/devices-hap/blindtilt.ts +0 -1049
- package/src/devices-hap/bot.ts +0 -900
- package/src/devices-hap/ceilinglight.ts +0 -742
- package/src/devices-hap/colorbulb.ts +0 -904
- package/src/devices-hap/contact.ts +0 -457
- package/src/devices-hap/curtain.ts +0 -944
- package/src/devices-hap/device.ts +0 -811
- package/src/devices-hap/fan.ts +0 -711
- package/src/devices-hap/hub.ts +0 -439
- package/src/devices-hap/humidifier.ts +0 -669
- package/src/devices-hap/iosensor.ts +0 -427
- package/src/devices-hap/lightstrip.ts +0 -836
- package/src/devices-hap/lock.ts +0 -620
- package/src/devices-hap/meter.ts +0 -426
- package/src/devices-hap/meterplus.ts +0 -430
- package/src/devices-hap/meterpro.ts +0 -522
- package/src/devices-hap/motion.ts +0 -390
- package/src/devices-hap/plug.ts +0 -423
- package/src/devices-hap/relayswitch.ts +0 -727
- package/src/devices-hap/robotvacuumcleaner.ts +0 -568
- package/src/devices-hap/waterdetector.ts +0 -400
- package/src/devices-matter/BaseMatterAccessory.ts +0 -131
- package/src/devices-matter/ColorLightAccessory.ts +0 -110
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
- 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 -123
- 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 -133
- package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
- package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
- package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
- 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 -92
- 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/index.test.ts +0 -19
- 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 -344
- 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 -2997
- package/src/platform-matter.ts +0 -1010
- package/src/verifyconfig.test.ts +0 -197
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Venetian Blind Accessory Class
|
|
3
|
-
* Lift and tilt control
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
7
|
-
|
|
8
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
9
|
-
|
|
10
|
-
export class VenetianBlindAccessory extends BaseMatterAccessory {
|
|
11
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
12
|
-
const serialNumber = opts?.serialNumber ?? 'BLIND-002'
|
|
13
|
-
|
|
14
|
-
const clusters = opts?.clusters ?? {
|
|
15
|
-
windowCovering: {
|
|
16
|
-
targetPositionLiftPercent100ths: 5000,
|
|
17
|
-
currentPositionLiftPercent100ths: 5000,
|
|
18
|
-
targetPositionTiltPercent100ths: 5000,
|
|
19
|
-
currentPositionTiltPercent100ths: 5000,
|
|
20
|
-
operationalStatus: { global: 0, lift: 0, tilt: 0 },
|
|
21
|
-
endProductType: 8,
|
|
22
|
-
configStatus: {
|
|
23
|
-
operational: true,
|
|
24
|
-
onlineReserved: true,
|
|
25
|
-
liftMovementReversed: false,
|
|
26
|
-
liftPositionAware: true,
|
|
27
|
-
tiltPositionAware: true,
|
|
28
|
-
liftEncoderControlled: true,
|
|
29
|
-
tiltEncoderControlled: true,
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const handlers = opts?.handlers ?? {
|
|
35
|
-
windowCovering: {
|
|
36
|
-
goToLiftPercentage: async (request: MatterRequests.GoToLiftPercentage) => this.handleGoToLift(request),
|
|
37
|
-
goToTiltPercentage: async (request: MatterRequests.GoToTiltPercentage) => this.handleGoToTilt(request),
|
|
38
|
-
upOrOpen: async () => this.handleUpOrOpen(),
|
|
39
|
-
downOrClose: async () => this.handleDownOrClose(),
|
|
40
|
-
stopMotion: async () => this.handleStop(),
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
super(api, log, {
|
|
45
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
46
|
-
displayName: opts?.displayName ?? 'Venetian Blind (Tilt)',
|
|
47
|
-
deviceType: api.matter.deviceTypes.WindowCovering,
|
|
48
|
-
serialNumber,
|
|
49
|
-
manufacturer: opts?.manufacturer ?? 'Homebridge Matter',
|
|
50
|
-
model: opts?.model ?? 'HB-MATTER-BLIND-VENETIAN',
|
|
51
|
-
firmwareRevision: opts?.firmwareRevision ?? '2.0.0',
|
|
52
|
-
hardwareRevision: opts?.hardwareRevision ?? '1.0.0',
|
|
53
|
-
clusters,
|
|
54
|
-
handlers,
|
|
55
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}) },
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
this.logInfo('initialized.')
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private async handleGoToLift(request: MatterRequests.GoToLiftPercentage): Promise<void> {
|
|
62
|
-
this.logInfo(`GoToLiftPercentage request: ${JSON.stringify(request)}`)
|
|
63
|
-
|
|
64
|
-
// Matter uses 0=open, 10000=closed, so invert to get open percentage
|
|
65
|
-
const closedPercent = request.liftPercent100thsValue / 100
|
|
66
|
-
const openPercent = (100 - closedPercent).toFixed(0)
|
|
67
|
-
this.logInfo(`moved to ${openPercent}% open.`)
|
|
68
|
-
// TODO: await myBlindAPI.setPosition(openPercent)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private async handleGoToTilt(request: MatterRequests.GoToTiltPercentage): Promise<void> {
|
|
72
|
-
this.logInfo(`GoToTiltPercentage request: ${JSON.stringify(request)}`)
|
|
73
|
-
|
|
74
|
-
// Matter tilt: 0=horizontal/open (0deg), 10000=vertical/closed (90deg)
|
|
75
|
-
const degrees = Math.round((request.tiltPercent100thsValue / 10000) * 90)
|
|
76
|
-
this.logInfo(`tilted to ${degrees}°.`)
|
|
77
|
-
// TODO: await myBlindAPI.setTiltAngle(degrees)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private async handleUpOrOpen(): Promise<void> {
|
|
81
|
-
this.logInfo('opened blind.')
|
|
82
|
-
// TODO: await myBlindAPI.open()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private async handleDownOrClose(): Promise<void> {
|
|
86
|
-
this.logInfo('closed blind.')
|
|
87
|
-
// TODO: await myBlindAPI.close()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private async handleStop(): Promise<void> {
|
|
91
|
-
this.logInfo('stopped blind.')
|
|
92
|
-
// TODO: await myBlindAPI.stop()
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public updateLiftPosition(openPercent: number): void {
|
|
96
|
-
// Convert open percentage to Matter's closed percentage (0=open, 10000=closed)
|
|
97
|
-
const closedPercent = 100 - openPercent
|
|
98
|
-
const value = Math.round(closedPercent * 100)
|
|
99
|
-
this.updateState(this.api.matter.clusterNames.WindowCovering, {
|
|
100
|
-
currentPositionLiftPercent100ths: value,
|
|
101
|
-
targetPositionLiftPercent100ths: value,
|
|
102
|
-
})
|
|
103
|
-
this.logInfo(`lift position: ${openPercent}% open.`)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public updateTiltPosition(degrees: number): void {
|
|
107
|
-
// Convert degrees (0-90) to Matter's tilt percentage (0=horizontal, 10000=vertical)
|
|
108
|
-
const value = Math.round((degrees / 90) * 10000)
|
|
109
|
-
this.updateState(this.api.matter.clusterNames.WindowCovering, {
|
|
110
|
-
currentPositionTiltPercent100ths: value,
|
|
111
|
-
targetPositionTiltPercent100ths: value,
|
|
112
|
-
})
|
|
113
|
-
this.logInfo(`tilt position: ${degrees}°.`)
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Window Blind Accessory Class
|
|
3
|
-
* Lift control only (up/down)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
7
|
-
|
|
8
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
9
|
-
|
|
10
|
-
export class WindowBlindAccessory extends BaseMatterAccessory {
|
|
11
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
12
|
-
const serialNumber = opts?.serialNumber ?? 'BLIND-001'
|
|
13
|
-
|
|
14
|
-
const clusters = opts?.clusters ?? {
|
|
15
|
-
windowCovering: {
|
|
16
|
-
targetPositionLiftPercent100ths: 5000,
|
|
17
|
-
currentPositionLiftPercent100ths: 5000,
|
|
18
|
-
operationalStatus: { global: 0, lift: 0, tilt: 0 },
|
|
19
|
-
endProductType: 0,
|
|
20
|
-
configStatus: {
|
|
21
|
-
operational: true,
|
|
22
|
-
onlineReserved: true,
|
|
23
|
-
liftMovementReversed: false,
|
|
24
|
-
liftPositionAware: true,
|
|
25
|
-
tiltPositionAware: false,
|
|
26
|
-
liftEncoderControlled: true,
|
|
27
|
-
tiltEncoderControlled: false,
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const handlers = opts?.handlers ?? {
|
|
33
|
-
windowCovering: {
|
|
34
|
-
goToLiftPercentage: async (request: MatterRequests.GoToLiftPercentage) => this.handleGoToLift(request),
|
|
35
|
-
upOrOpen: async () => this.handleUpOrOpen(),
|
|
36
|
-
downOrClose: async () => this.handleDownOrClose(),
|
|
37
|
-
stopMotion: async () => this.handleStop(),
|
|
38
|
-
},
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
super(api, log, {
|
|
42
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
43
|
-
displayName: opts?.displayName ?? 'Window Blind',
|
|
44
|
-
deviceType: api.matter.deviceTypes.WindowCovering,
|
|
45
|
-
serialNumber,
|
|
46
|
-
manufacturer: opts?.manufacturer ?? 'Homebridge Matter',
|
|
47
|
-
model: opts?.model ?? 'HB-MATTER-BLIND-WINDOW',
|
|
48
|
-
firmwareRevision: opts?.firmwareRevision ?? '2.0.0',
|
|
49
|
-
hardwareRevision: opts?.hardwareRevision ?? '1.0.0',
|
|
50
|
-
clusters,
|
|
51
|
-
handlers,
|
|
52
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}) },
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
this.logInfo('initialized.')
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private async handleGoToLift(request: MatterRequests.GoToLiftPercentage): Promise<void> {
|
|
59
|
-
this.logInfo(`GoToLiftPercentage request: ${JSON.stringify(request)}`)
|
|
60
|
-
// Matter uses 0=open, 10000=closed, so invert to get open percentage
|
|
61
|
-
const closedPercent = request.liftPercent100thsValue / 100
|
|
62
|
-
const openPercent = (100 - closedPercent).toFixed(0)
|
|
63
|
-
this.logInfo(`moved to ${openPercent}% open.`)
|
|
64
|
-
// TODO: await myBlindAPI.setPosition(openPercent)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private async handleUpOrOpen(): Promise<void> {
|
|
68
|
-
this.logInfo('opened blind.')
|
|
69
|
-
// TODO: await myBlindAPI.open()
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
private async handleDownOrClose(): Promise<void> {
|
|
73
|
-
this.logInfo('closed blind.')
|
|
74
|
-
// TODO: await myBlindAPI.close()
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
private async handleStop(): Promise<void> {
|
|
78
|
-
this.logInfo('stopped blind.')
|
|
79
|
-
// TODO: await myBlindAPI.stop()
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
public updateLiftPosition(openPercent: number): void {
|
|
83
|
-
// Convert open percentage to Matter's closed percentage (0=open, 10000=closed)
|
|
84
|
-
const closedPercent = 100 - openPercent
|
|
85
|
-
const value = Math.round(closedPercent * 100)
|
|
86
|
-
this.updateState(this.api.matter.clusterNames.WindowCovering, {
|
|
87
|
-
currentPositionLiftPercent100ths: value,
|
|
88
|
-
targetPositionLiftPercent100ths: value,
|
|
89
|
-
})
|
|
90
|
-
this.logInfo(`lift position: ${openPercent}% open.`)
|
|
91
|
-
}
|
|
92
|
-
}
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Power Strip Accessory Class
|
|
3
|
-
*
|
|
4
|
-
* This demonstrates a composed device with multiple independent endpoints (parts).
|
|
5
|
-
* Each outlet appears as a separate device in the Home app and can be controlled independently.
|
|
6
|
-
*
|
|
7
|
-
* This uses the Homebridge Matter API's `parts` feature to create true multi-endpoint
|
|
8
|
-
* composed devices, where each part has its own Matter endpoint.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { API, Logger } from 'homebridge'
|
|
12
|
-
|
|
13
|
-
import { BaseMatterAccessory } from '../BaseMatterAccessory.js'
|
|
14
|
-
|
|
15
|
-
export class PowerStripAccessory extends BaseMatterAccessory {
|
|
16
|
-
constructor(api: API, log: Logger) {
|
|
17
|
-
const serialNumber = 'POWER-STRIP-001'
|
|
18
|
-
|
|
19
|
-
super(api, log, {
|
|
20
|
-
uuid: api.matter.uuid.generate(serialNumber),
|
|
21
|
-
displayName: 'Power Strip',
|
|
22
|
-
deviceType: api.matter.deviceTypes.OnOffOutlet,
|
|
23
|
-
serialNumber,
|
|
24
|
-
manufacturer: 'Homebridge Matter',
|
|
25
|
-
model: 'HB-MATTER-POWER-STRIP-4X',
|
|
26
|
-
firmwareRevision: '2.0.0',
|
|
27
|
-
hardwareRevision: '1.0.0',
|
|
28
|
-
|
|
29
|
-
// Main accessory can optionally have its own clusters/handlers
|
|
30
|
-
// Here we'll just use it as a container for the 4 outlet parts
|
|
31
|
-
clusters: {
|
|
32
|
-
onOff: {
|
|
33
|
-
onOff: false, // Master control
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
handlers: {
|
|
38
|
-
onOff: {
|
|
39
|
-
on: async () => this.handleMasterOn(),
|
|
40
|
-
off: async () => this.handleMasterOff(),
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
// Define 4 independent outlet parts
|
|
45
|
-
// Each part appears as a separate device in the Home app
|
|
46
|
-
parts: [
|
|
47
|
-
{
|
|
48
|
-
id: 'outlet-1',
|
|
49
|
-
displayName: 'Outlet 1',
|
|
50
|
-
deviceType: api.matter.deviceTypes.OnOffOutlet,
|
|
51
|
-
clusters: {
|
|
52
|
-
onOff: { onOff: false },
|
|
53
|
-
},
|
|
54
|
-
handlers: {
|
|
55
|
-
onOff: {
|
|
56
|
-
on: async (_args, context) => this.handleOutletOn(context?.partId || 'outlet-1'),
|
|
57
|
-
off: async (_args, context) => this.handleOutletOff(context?.partId || 'outlet-1'),
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
id: 'outlet-2',
|
|
63
|
-
displayName: 'Outlet 2',
|
|
64
|
-
deviceType: api.matter.deviceTypes.OnOffOutlet,
|
|
65
|
-
clusters: {
|
|
66
|
-
onOff: { onOff: false },
|
|
67
|
-
},
|
|
68
|
-
handlers: {
|
|
69
|
-
onOff: {
|
|
70
|
-
on: async (_args, context) => this.handleOutletOn(context?.partId || 'outlet-2'),
|
|
71
|
-
off: async (_args, context) => this.handleOutletOff(context?.partId || 'outlet-2'),
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
id: 'outlet-3',
|
|
77
|
-
displayName: 'Outlet 3',
|
|
78
|
-
deviceType: api.matter.deviceTypes.OnOffOutlet,
|
|
79
|
-
clusters: {
|
|
80
|
-
onOff: { onOff: false },
|
|
81
|
-
},
|
|
82
|
-
handlers: {
|
|
83
|
-
onOff: {
|
|
84
|
-
on: async (_args, context) => this.handleOutletOn(context?.partId || 'outlet-3'),
|
|
85
|
-
off: async (_args, context) => this.handleOutletOff(context?.partId || 'outlet-3'),
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: 'outlet-4',
|
|
91
|
-
displayName: 'Outlet 4',
|
|
92
|
-
deviceType: api.matter.deviceTypes.OnOffOutlet,
|
|
93
|
-
clusters: {
|
|
94
|
-
onOff: { onOff: false },
|
|
95
|
-
},
|
|
96
|
-
handlers: {
|
|
97
|
-
onOff: {
|
|
98
|
-
on: async (_args, context) => this.handleOutletOn(context?.partId || 'outlet-4'),
|
|
99
|
-
off: async (_args, context) => this.handleOutletOff(context?.partId || 'outlet-4'),
|
|
100
|
-
},
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
this.logInfo('initialized with 4 independent outlet endpoints.')
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Handler for individual outlet ON command
|
|
111
|
-
* Called when a specific outlet is turned on from the Home app
|
|
112
|
-
*/
|
|
113
|
-
private async handleOutletOn(partId: string): Promise<void> {
|
|
114
|
-
const outletNumber = this.getOutletNumber(partId)
|
|
115
|
-
this.logInfo(`Outlet ${outletNumber} turned ON`)
|
|
116
|
-
|
|
117
|
-
// TODO: Send command to actual power strip hardware
|
|
118
|
-
// await myPowerStripAPI.turnOnOutlet(outletNumber)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Handler for individual outlet OFF command
|
|
123
|
-
* Called when a specific outlet is turned off from the Home app
|
|
124
|
-
*/
|
|
125
|
-
private async handleOutletOff(partId: string): Promise<void> {
|
|
126
|
-
const outletNumber = this.getOutletNumber(partId)
|
|
127
|
-
this.logInfo(`Outlet ${outletNumber} turned OFF`)
|
|
128
|
-
|
|
129
|
-
// TODO: Send command to actual power strip hardware
|
|
130
|
-
// await myPowerStripAPI.turnOffOutlet(outletNumber)
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Master ON - Turns on all outlets
|
|
135
|
-
*/
|
|
136
|
-
private async handleMasterOn(): Promise<void> {
|
|
137
|
-
this.logInfo('Master ON - turning on all outlets.')
|
|
138
|
-
|
|
139
|
-
// Update each outlet's state
|
|
140
|
-
for (let i = 1; i <= 4; i++) {
|
|
141
|
-
const partId = `outlet-${i}`
|
|
142
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: true }, partId)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// TODO: Send command to actual power strip hardware
|
|
146
|
-
// await myPowerStripAPI.turnOnAllOutlets()
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Master OFF - Turns off all outlets
|
|
151
|
-
*/
|
|
152
|
-
private async handleMasterOff(): Promise<void> {
|
|
153
|
-
this.logInfo('Master OFF - turning off all outlets.')
|
|
154
|
-
|
|
155
|
-
// Update each outlet's state
|
|
156
|
-
for (let i = 1; i <= 4; i++) {
|
|
157
|
-
const partId = `outlet-${i}`
|
|
158
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: false }, partId)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// TODO: Send command to actual power strip hardware
|
|
162
|
-
// await myPowerStripAPI.turnOffAllOutlets()
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Extract outlet number from part ID
|
|
167
|
-
*/
|
|
168
|
-
private getOutletNumber(partId: string): number {
|
|
169
|
-
const match = partId.match(/outlet-(\d+)/)
|
|
170
|
-
return match ? Number.parseInt(match[1], 10) : 0
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Turn on a specific outlet programmatically
|
|
175
|
-
* Use this to update outlet state from external sources (API, webhooks, etc.)
|
|
176
|
-
*
|
|
177
|
-
* @param outletNumber - Outlet number (1-4)
|
|
178
|
-
*/
|
|
179
|
-
public async turnOnOutlet(outletNumber: 1 | 2 | 3 | 4): Promise<void> {
|
|
180
|
-
const partId = `outlet-${outletNumber}`
|
|
181
|
-
this.logInfo(`Programmatically turning ON outlet ${outletNumber}`)
|
|
182
|
-
|
|
183
|
-
// Update the specific outlet's state
|
|
184
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: true }, partId)
|
|
185
|
-
|
|
186
|
-
// TODO: Send command to actual power strip hardware
|
|
187
|
-
// await myPowerStripAPI.turnOnOutlet(outletNumber)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Turn off a specific outlet programmatically
|
|
192
|
-
* Use this to update outlet state from external sources (API, webhooks, etc.)
|
|
193
|
-
*
|
|
194
|
-
* @param outletNumber - Outlet number (1-4)
|
|
195
|
-
*/
|
|
196
|
-
public async turnOffOutlet(outletNumber: 1 | 2 | 3 | 4): Promise<void> {
|
|
197
|
-
const partId = `outlet-${outletNumber}`
|
|
198
|
-
this.logInfo(`Programmatically turning OFF outlet ${outletNumber}`)
|
|
199
|
-
|
|
200
|
-
// Update the specific outlet's state
|
|
201
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: false }, partId)
|
|
202
|
-
|
|
203
|
-
// TODO: Send command to actual power strip hardware
|
|
204
|
-
// await myPowerStripAPI.turnOffOutlet(outletNumber)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Toggle a specific outlet
|
|
209
|
-
*
|
|
210
|
-
* @param outletNumber - Outlet number (1-4)
|
|
211
|
-
*/
|
|
212
|
-
public async toggleOutlet(outletNumber: 1 | 2 | 3 | 4): Promise<void> {
|
|
213
|
-
const currentState = await this.getOutletState(outletNumber)
|
|
214
|
-
|
|
215
|
-
if (currentState) {
|
|
216
|
-
await this.turnOffOutlet(outletNumber)
|
|
217
|
-
} else {
|
|
218
|
-
await this.turnOnOutlet(outletNumber)
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Get the current state of a specific outlet
|
|
224
|
-
*
|
|
225
|
-
* @param outletNumber - Outlet number (1-4)
|
|
226
|
-
* @returns Current on/off state of the outlet
|
|
227
|
-
*/
|
|
228
|
-
public async getOutletState(outletNumber: 1 | 2 | 3 | 4): Promise<boolean> {
|
|
229
|
-
const partId = `outlet-${outletNumber}`
|
|
230
|
-
|
|
231
|
-
// Get the state from the Matter server
|
|
232
|
-
const state = await this.api.matter.getAccessoryState(
|
|
233
|
-
this.uuid,
|
|
234
|
-
this.api.matter.clusterNames.OnOff,
|
|
235
|
-
partId,
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
return state?.onOff === true
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Get the state of all outlets
|
|
243
|
-
*
|
|
244
|
-
* @returns Object containing state of all outlets
|
|
245
|
-
*/
|
|
246
|
-
public async getAllOutletStates(): Promise<Record<string, boolean>> {
|
|
247
|
-
return {
|
|
248
|
-
outlet1: await this.getOutletState(1),
|
|
249
|
-
outlet2: await this.getOutletState(2),
|
|
250
|
-
outlet3: await this.getOutletState(3),
|
|
251
|
-
outlet4: await this.getOutletState(4),
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Update the state of a specific outlet from external source
|
|
257
|
-
* (e.g., when outlet state changes via physical button or other controller)
|
|
258
|
-
*
|
|
259
|
-
* @param outletNumber - Outlet number (1-4)
|
|
260
|
-
* @param isOn - New state of the outlet
|
|
261
|
-
*/
|
|
262
|
-
public updateOutletStateFromExternal(outletNumber: 1 | 2 | 3 | 4, isOn: boolean): void {
|
|
263
|
-
const partId = `outlet-${outletNumber}`
|
|
264
|
-
this.logInfo(`Outlet ${outletNumber} state updated from external source: ${isOn ? 'ON' : 'OFF'}`)
|
|
265
|
-
|
|
266
|
-
// Update the specific outlet's state
|
|
267
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn }, partId)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Update all outlet states from external source
|
|
272
|
-
*
|
|
273
|
-
* @param states - Object containing new states for all outlets
|
|
274
|
-
* @param states.outlet1 - State for outlet 1
|
|
275
|
-
* @param states.outlet2 - State for outlet 2
|
|
276
|
-
* @param states.outlet3 - State for outlet 3
|
|
277
|
-
* @param states.outlet4 - State for outlet 4
|
|
278
|
-
*/
|
|
279
|
-
public updateAllOutletStatesFromExternal(states: {
|
|
280
|
-
outlet1: boolean
|
|
281
|
-
outlet2: boolean
|
|
282
|
-
outlet3: boolean
|
|
283
|
-
outlet4: boolean
|
|
284
|
-
}): void {
|
|
285
|
-
this.logInfo('All outlet states updated from external source.')
|
|
286
|
-
|
|
287
|
-
for (let i = 1; i <= 4; i++) {
|
|
288
|
-
const key = `outlet${i}` as keyof typeof states
|
|
289
|
-
const partId = `outlet-${i}`
|
|
290
|
-
|
|
291
|
-
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: states[key] }, partId)
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Override updateState to support partId parameter
|
|
297
|
-
*/
|
|
298
|
-
protected async updateState(cluster: string, attributes: Record<string, unknown>, partId?: string): Promise<void> {
|
|
299
|
-
if (partId) {
|
|
300
|
-
// Update a specific part
|
|
301
|
-
await this.api.matter.updateAccessoryState(this.uuid, cluster, attributes, partId)
|
|
302
|
-
this.logDebug(`Updated ${cluster} state for part ${partId}:`, attributes)
|
|
303
|
-
} else {
|
|
304
|
-
// Update main accessory
|
|
305
|
-
await this.api.matter.updateAccessoryState(this.uuid, cluster, attributes)
|
|
306
|
-
this.logDebug(`Updated ${cluster} state:`, attributes)
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Device Classes
|
|
3
|
-
*
|
|
4
|
-
* Export all base classes and device implementations
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
-
export type { BaseMatterAccessoryConfig } from './BaseMatterAccessory.js'
|
|
9
|
-
export { ColorLightAccessory } from './ColorLightAccessory.js'
|
|
10
|
-
export { ColorTemperatureLightAccessory } from './ColorTemperatureLightAccessory.js'
|
|
11
|
-
export { ContactSensorAccessory } from './ContactSensorAccessory.js'
|
|
12
|
-
export { PowerStripAccessory } from './custom/index.js'
|
|
13
|
-
export { DimmableLightAccessory } from './DimmableLightAccessory.js'
|
|
14
|
-
export { DoorLockAccessory } from './DoorLockAccessory.js'
|
|
15
|
-
export { ExtendedColorLightAccessory } from './ExtendedColorLightAccessory.js'
|
|
16
|
-
export { FanAccessory } from './FanAccessory.js'
|
|
17
|
-
export { HumiditySensorAccessory } from './HumiditySensorAccessory.js'
|
|
18
|
-
export { LeakSensorAccessory } from './LeakSensorAccessory.js'
|
|
19
|
-
export { LightSensorAccessory } from './LightSensorAccessory.js'
|
|
20
|
-
export { OccupancySensorAccessory } from './OccupancySensorAccessory.js'
|
|
21
|
-
export { OnOffLightAccessory } from './OnOffLightAccessory.js'
|
|
22
|
-
export { OnOffOutletAccessory } from './OnOffOutletAccessory.js'
|
|
23
|
-
export { OnOffSwitchAccessory } from './OnOffSwitchAccessory.js'
|
|
24
|
-
export { RoboticVacuumAccessory } from './RoboticVacuumAccessory.js'
|
|
25
|
-
export { SmokeCOAlarmAccessory } from './SmokeCOAlarmAccessory.js'
|
|
26
|
-
export { TemperatureSensorAccessory } from './TemperatureSensorAccessory.js'
|
|
27
|
-
export { ThermostatAccessory } from './ThermostatAccessory.js'
|
|
28
|
-
export { VenetianBlindAccessory } from './VenetianBlindAccessory.js'
|
|
29
|
-
export { WindowBlindAccessory } from './WindowBlindAccessory.js'
|
package/src/index.test.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { API } from 'homebridge'
|
|
2
|
-
|
|
3
|
-
import { describe, expect, it, vi } from 'vitest'
|
|
4
|
-
|
|
5
|
-
import registerPlatform from './index.js'
|
|
6
|
-
import { SwitchBotHAPPlatform } from './platform-hap.js'
|
|
7
|
-
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
|
|
8
|
-
|
|
9
|
-
describe('index.ts', () => {
|
|
10
|
-
it('should register the platform with homebridge', () => {
|
|
11
|
-
const api = {
|
|
12
|
-
registerPlatform: vi.fn(),
|
|
13
|
-
} as unknown as API
|
|
14
|
-
|
|
15
|
-
registerPlatform(api)
|
|
16
|
-
|
|
17
|
-
expect(api.registerPlatform).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, SwitchBotHAPPlatform)
|
|
18
|
-
})
|
|
19
|
-
})
|