@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,621 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Robotic Vacuum Cleaner Accessory (SwitchBot-aligned)
|
|
5
|
-
*
|
|
6
|
-
* This implementation is intentionally limited to SwitchBot OpenAPI-supported
|
|
7
|
-
* behaviors for Robot Vacuum families. We expose only commands and modes that
|
|
8
|
-
* exist in the public API docs:
|
|
9
|
-
* https://github.com/OpenWonderLabs/SwitchBotAPI
|
|
10
|
-
*
|
|
11
|
-
* Capability matrix (derived from OpenAPI v1.1):
|
|
12
|
-
* - S1 / S1 Plus / K10+ / K10+ Pro
|
|
13
|
-
* • Commands: start, stop, dock, PowLevel {0-3}
|
|
14
|
-
* • No pause/resume, no mop, no area selection
|
|
15
|
-
* - K10+ Pro Combo
|
|
16
|
-
* • Commands: startClean {action: sweep|mop, param: {fanLevel 1-4}}, pause, dock
|
|
17
|
-
* • changeParam {fanLevel}, setVolume
|
|
18
|
-
* - S10 / S20 / K11+ / K20+ Pro
|
|
19
|
-
* • Commands: startClean {action: sweep|sweep_mop|mop (model-dependent), param: {fanLevel 1-4, waterLevel 1-2?}},
|
|
20
|
-
* pause, dock, changeParam, setVolume, (S10/S20) selfClean/addWaterForHumi
|
|
21
|
-
* • Some models support waterLevel, some do not (e.g. K10+ Pro Combo)
|
|
22
|
-
*
|
|
23
|
-
* Matter clusters exposed:
|
|
24
|
-
* - rvcRunMode: Idle/Cleaning only (no Mapping mode via OpenAPI)
|
|
25
|
-
* - rvcCleanMode: Interpreted per model:
|
|
26
|
-
* • Basic vac (S1/K10 family): suction levels → Quiet/Standard/Strong/MAX
|
|
27
|
-
* • Mop-capable (K10+ Pro Combo/K11+/K20+ Pro): action → Vacuum or Mop
|
|
28
|
-
* • Mop+Vac-capable (S10/S20): action → Vacuum or Vacuum & Mop
|
|
29
|
-
* - rvcOperationalState: start/stop/pause/goHome handlers are attached only when supported
|
|
30
|
-
* - serviceArea: NOT exposed (area/room selection isn’t in public OpenAPI)
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
34
|
-
|
|
35
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
36
|
-
|
|
37
|
-
type SwitchBotVacuumModel
|
|
38
|
-
= 'S1'
|
|
39
|
-
| 'S1 Plus'
|
|
40
|
-
| 'S1 Pro'
|
|
41
|
-
| 'S1 Mini'
|
|
42
|
-
| 'WoSweeper'
|
|
43
|
-
| 'WoSweeperMini'
|
|
44
|
-
| 'K10+'
|
|
45
|
-
| 'K10+ Pro'
|
|
46
|
-
| 'K10+ Pro Combo'
|
|
47
|
-
| 'S10'
|
|
48
|
-
| 'S20'
|
|
49
|
-
| 'K11+'
|
|
50
|
-
| 'K20+ Pro'
|
|
51
|
-
|
|
52
|
-
interface VacuumCapabilities {
|
|
53
|
-
// Whether pause/resume is available
|
|
54
|
-
pause: boolean
|
|
55
|
-
resume: boolean
|
|
56
|
-
// Clean action type exposed via rvcCleanMode
|
|
57
|
-
cleanAction: 'vacuum-only' | 'vacuum-or-mop' | 'vacuum-or-vacmop'
|
|
58
|
-
// Suction mapping: basic uses PowLevel 0-3; advanced uses fanLevel 1-4
|
|
59
|
-
suctionKind: 'powLevel-0-3' | 'fanLevel-1-4' | 'none'
|
|
60
|
-
// Whether waterLevel parameter is supported on start/changeParam
|
|
61
|
-
waterLevel: boolean
|
|
62
|
-
// Advanced commands available (S10/S20 only)
|
|
63
|
-
advancedCommands?: {
|
|
64
|
-
setVolume?: boolean
|
|
65
|
-
selfClean?: boolean
|
|
66
|
-
addWaterForHumi?: boolean
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function detectModelFromContext(ctx?: Record<string, unknown>): SwitchBotVacuumModel | undefined {
|
|
71
|
-
const t = (ctx?.deviceType as string | undefined)?.trim()
|
|
72
|
-
switch (t) {
|
|
73
|
-
case 'Robot Vacuum Cleaner S1':
|
|
74
|
-
return 'S1'
|
|
75
|
-
case 'Robot Vacuum Cleaner S1 Plus':
|
|
76
|
-
return 'S1 Plus'
|
|
77
|
-
case 'Robot Vacuum Cleaner S1 Pro':
|
|
78
|
-
return 'S1 Pro'
|
|
79
|
-
case 'Robot Vacuum Cleaner S1 Mini':
|
|
80
|
-
return 'S1 Mini'
|
|
81
|
-
case 'WoSweeper':
|
|
82
|
-
return 'WoSweeper'
|
|
83
|
-
case 'WoSweeperMini':
|
|
84
|
-
return 'WoSweeperMini'
|
|
85
|
-
case 'K10+':
|
|
86
|
-
return 'K10+'
|
|
87
|
-
case 'K10+ Pro':
|
|
88
|
-
return 'K10+ Pro'
|
|
89
|
-
case 'Robot Vacuum Cleaner K10+ Pro Combo':
|
|
90
|
-
case 'K10+ Pro Combo':
|
|
91
|
-
return 'K10+ Pro Combo'
|
|
92
|
-
case 'Robot Vacuum Cleaner S10':
|
|
93
|
-
return 'S10'
|
|
94
|
-
case 'Robot Vacuum Cleaner S20':
|
|
95
|
-
case 'S20':
|
|
96
|
-
return 'S20'
|
|
97
|
-
case 'Robot Vacuum Cleaner K11+':
|
|
98
|
-
case 'K11+':
|
|
99
|
-
return 'K11+'
|
|
100
|
-
case 'Robot Vacuum Cleaner K20 Plus Pro':
|
|
101
|
-
case 'K20+ Pro':
|
|
102
|
-
return 'K20+ Pro'
|
|
103
|
-
default:
|
|
104
|
-
return undefined
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function capabilitiesFor(model?: SwitchBotVacuumModel): VacuumCapabilities {
|
|
109
|
-
// Defaults: conservative basic vac
|
|
110
|
-
if (!model) {
|
|
111
|
-
return { pause: false, resume: false, cleanAction: 'vacuum-only', suctionKind: 'powLevel-0-3', waterLevel: false }
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Basic vacuum models (S1 family, WoSweeper family, K10 family without Combo)
|
|
115
|
-
if (model === 'S1' || model === 'S1 Plus' || model === 'S1 Pro' || model === 'S1 Mini'
|
|
116
|
-
|| model === 'WoSweeper' || model === 'WoSweeperMini'
|
|
117
|
-
|| model === 'K10+' || model === 'K10+ Pro') {
|
|
118
|
-
return { pause: false, resume: false, cleanAction: 'vacuum-only', suctionKind: 'powLevel-0-3', waterLevel: false }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// K10+ Pro Combo: vacuum or mop, fanLevel, no waterLevel
|
|
122
|
-
if (model === 'K10+ Pro Combo') {
|
|
123
|
-
return { pause: true, resume: false, cleanAction: 'vacuum-or-mop', suctionKind: 'fanLevel-1-4', waterLevel: false }
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// S10/S20: vacuum or vacuum+mop combo, fanLevel, waterLevel, plus advanced commands
|
|
127
|
-
if (model === 'S10' || model === 'S20') {
|
|
128
|
-
return {
|
|
129
|
-
pause: true,
|
|
130
|
-
resume: false,
|
|
131
|
-
cleanAction: 'vacuum-or-vacmop',
|
|
132
|
-
suctionKind: 'fanLevel-1-4',
|
|
133
|
-
waterLevel: true,
|
|
134
|
-
advancedCommands: {
|
|
135
|
-
setVolume: true,
|
|
136
|
-
selfClean: true,
|
|
137
|
-
addWaterForHumi: true,
|
|
138
|
-
},
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// K11+/K20+ Pro: vacuum or mop, fanLevel, waterLevel, volume control
|
|
143
|
-
return {
|
|
144
|
-
pause: true,
|
|
145
|
-
resume: false,
|
|
146
|
-
cleanAction: 'vacuum-or-mop',
|
|
147
|
-
suctionKind: 'fanLevel-1-4',
|
|
148
|
-
waterLevel: true,
|
|
149
|
-
advancedCommands: {
|
|
150
|
-
setVolume: true,
|
|
151
|
-
},
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export class RoboticVacuumAccessory extends BaseMatterAccessory {
|
|
156
|
-
// Track current high-level preferences that affect OpenAPI payloads
|
|
157
|
-
private currentCleanAction: 'vacuum' | 'mop' | 'vacuum_mop' = 'vacuum'
|
|
158
|
-
private currentFanLevel: 1 | 2 | 3 | 4 = 2
|
|
159
|
-
private capabilities: VacuumCapabilities
|
|
160
|
-
|
|
161
|
-
constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
|
|
162
|
-
const serialNumber = opts?.serialNumber ?? 'VACUUM-001'
|
|
163
|
-
const model = detectModelFromContext(opts?.context)
|
|
164
|
-
const capabilities = capabilitiesFor(model)
|
|
165
|
-
super(api, log, {
|
|
166
|
-
uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
|
|
167
|
-
displayName: opts?.displayName ?? 'Robot Vacuum',
|
|
168
|
-
deviceType: api.matter.deviceTypes.RoboticVacuumCleaner,
|
|
169
|
-
serialNumber,
|
|
170
|
-
manufacturer: opts?.manufacturer ?? 'Homebridge Matter',
|
|
171
|
-
model: opts?.model ?? 'HB-MATTER-VACUUM-ROBOTIC',
|
|
172
|
-
firmwareRevision: opts?.firmwareRevision ?? '2.0.0',
|
|
173
|
-
hardwareRevision: opts?.hardwareRevision ?? '1.0.0',
|
|
174
|
-
clusters: {
|
|
175
|
-
rvcRunMode: {
|
|
176
|
-
supportedModes: [
|
|
177
|
-
{ label: 'Idle', mode: 0, modeTags: [{ value: 16384 }] },
|
|
178
|
-
{ label: 'Cleaning', mode: 1, modeTags: [{ value: 16385 }] },
|
|
179
|
-
],
|
|
180
|
-
currentMode: 0,
|
|
181
|
-
},
|
|
182
|
-
rvcCleanMode: (() => {
|
|
183
|
-
switch (model as string) {
|
|
184
|
-
case 'K10':
|
|
185
|
-
return {
|
|
186
|
-
supportedModes: [
|
|
187
|
-
{ label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
|
|
188
|
-
],
|
|
189
|
-
currentMode: 0,
|
|
190
|
-
}
|
|
191
|
-
case 'Robot Vacuum Cleaner S1':
|
|
192
|
-
case 'Robot Vacuum Cleaner S1 Plus':
|
|
193
|
-
return {
|
|
194
|
-
supportedModes: [
|
|
195
|
-
{ label: 'Quiet', mode: 0, modeTags: [{ value: 2 }] },
|
|
196
|
-
{ label: 'Standard', mode: 1, modeTags: [{ value: 16384 }] },
|
|
197
|
-
{ label: 'Strong', mode: 2, modeTags: [{ value: 7 }] },
|
|
198
|
-
{ label: 'MAX', mode: 3, modeTags: [{ value: 8 }] },
|
|
199
|
-
],
|
|
200
|
-
currentMode: 1,
|
|
201
|
-
}
|
|
202
|
-
case 'Mini Robot Vacuum K10+':
|
|
203
|
-
case 'Mini Robot Vacuum K10+ Pro':
|
|
204
|
-
case 'K10+ Pro Combo':
|
|
205
|
-
return {
|
|
206
|
-
supportedModes: [
|
|
207
|
-
{ label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
|
|
208
|
-
{ label: 'Mop', mode: 1, modeTags: [{ value: 16386 }] },
|
|
209
|
-
{ label: 'Sweep & Mop', mode: 2, modeTags: [{ value: 16385 }, { value: 16386 }] },
|
|
210
|
-
],
|
|
211
|
-
currentMode: 0,
|
|
212
|
-
}
|
|
213
|
-
case 'Multitasking Household Robot K20+ Pro':
|
|
214
|
-
return {
|
|
215
|
-
supportedModes: [
|
|
216
|
-
{ label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
|
|
217
|
-
{ label: 'Vacuum & Mop', mode: 1, modeTags: [{ value: 16385 }, { value: 16386 }] },
|
|
218
|
-
{ label: 'Deep Clean', mode: 2, modeTags: [{ value: 16384 }] },
|
|
219
|
-
],
|
|
220
|
-
currentMode: 0,
|
|
221
|
-
}
|
|
222
|
-
case 'Floor Cleaning Robot S10':
|
|
223
|
-
case 'Floor Cleaning Robot S20':
|
|
224
|
-
return {
|
|
225
|
-
supportedModes: [
|
|
226
|
-
{ label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
|
|
227
|
-
{ label: 'Mop', mode: 1, modeTags: [{ value: 16386 }] },
|
|
228
|
-
],
|
|
229
|
-
currentMode: 0,
|
|
230
|
-
}
|
|
231
|
-
case 'Robot Vacuum K11+':
|
|
232
|
-
return {
|
|
233
|
-
supportedModes: [
|
|
234
|
-
{ label: 'Quiet', mode: 0, modeTags: [{ value: 2 }] },
|
|
235
|
-
{ label: 'Standard', mode: 1, modeTags: [{ value: 16384 }] },
|
|
236
|
-
{ label: 'Strong', mode: 2, modeTags: [{ value: 7 }] },
|
|
237
|
-
{ label: 'MAX', mode: 3, modeTags: [{ value: 8 }] },
|
|
238
|
-
{ label: 'Deep Clean', mode: 4, modeTags: [{ value: 16384 }, { value: 16385 }] },
|
|
239
|
-
],
|
|
240
|
-
currentMode: 1,
|
|
241
|
-
}
|
|
242
|
-
default:
|
|
243
|
-
return {
|
|
244
|
-
supportedModes: [
|
|
245
|
-
{ label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
|
|
246
|
-
{ label: 'Vacuum & Mop', mode: 1, modeTags: [{ value: 16385 }, { value: 16386 }] },
|
|
247
|
-
{ label: 'Deep Clean', mode: 2, modeTags: [{ value: 16384 }] },
|
|
248
|
-
],
|
|
249
|
-
currentMode: 0,
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
})(),
|
|
253
|
-
rvcOperationalState: {
|
|
254
|
-
operationalStateList: [
|
|
255
|
-
{ operationalStateId: 0 }, // Stopped
|
|
256
|
-
{ operationalStateId: 1 }, // Running
|
|
257
|
-
{ operationalStateId: 2 }, // Paused
|
|
258
|
-
{ operationalStateId: 3 }, // Error
|
|
259
|
-
{ operationalStateId: 64 }, // Seeking Charger
|
|
260
|
-
{ operationalStateId: 65 }, // Charging
|
|
261
|
-
{ operationalStateId: 66 }, // Docked
|
|
262
|
-
{ operationalStateId: 67 }, // In Remote Control
|
|
263
|
-
{ operationalStateId: 68 }, // In Dust Collecting
|
|
264
|
-
],
|
|
265
|
-
operationalState: 66,
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
handlers: (() => {
|
|
269
|
-
const opHandlers: Record<string, any> = {
|
|
270
|
-
stop: async () => this.handleStop(),
|
|
271
|
-
start: async () => this.handleStart(),
|
|
272
|
-
goHome: async () => this.handleGoHome(),
|
|
273
|
-
// Always register resume handler, log warning if not supported
|
|
274
|
-
resume: async () => {
|
|
275
|
-
if (capabilities.resume) {
|
|
276
|
-
await this.handleResume()
|
|
277
|
-
} else {
|
|
278
|
-
this.logWarn(`Resume operation is not supported for model: ${this.model}`)
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
}
|
|
282
|
-
if (capabilities.pause) {
|
|
283
|
-
opHandlers.pause = async () => this.handlePause()
|
|
284
|
-
}
|
|
285
|
-
return {
|
|
286
|
-
rvcRunMode: { changeToMode: async (request: MatterRequests.ChangeToMode) => this.handleChangeRunMode(request) },
|
|
287
|
-
rvcCleanMode: { changeToMode: async (request: MatterRequests.ChangeToMode) => this.handleChangeCleanMode(request) },
|
|
288
|
-
rvcOperationalState: opHandlers as any,
|
|
289
|
-
}
|
|
290
|
-
})(),
|
|
291
|
-
context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}), deviceType: (opts?.context as any)?.deviceType },
|
|
292
|
-
})
|
|
293
|
-
|
|
294
|
-
this.capabilities = capabilities
|
|
295
|
-
this.logInfo('initialized and ready.')
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
private async handleChangeRunMode(request: MatterRequests.ChangeToMode): Promise<void> {
|
|
299
|
-
this.logInfo(`ChangeToMode (run) request received: ${JSON.stringify(request)}`)
|
|
300
|
-
const { newMode } = request
|
|
301
|
-
const modeStr = ['Idle', 'Cleaning', 'Returning to Dock'][newMode] || `Unknown (mode=${newMode})`
|
|
302
|
-
this.logInfo(`Changing run mode to: ${modeStr}`)
|
|
303
|
-
|
|
304
|
-
switch (this.model) {
|
|
305
|
-
case 'Robot Vacuum Cleaner S1':
|
|
306
|
-
case 'Robot Vacuum Cleaner S1 Plus': {
|
|
307
|
-
if (newMode === 1) {
|
|
308
|
-
await this.handleStart()
|
|
309
|
-
} else if (newMode === 0) {
|
|
310
|
-
await this.handleGoHome()
|
|
311
|
-
}
|
|
312
|
-
break
|
|
313
|
-
}
|
|
314
|
-
case 'Mini Robot Vacuum K10+':
|
|
315
|
-
case 'Mini Robot Vacuum K10+ Pro':
|
|
316
|
-
case 'K10+ Pro Combo': {
|
|
317
|
-
if (newMode === 1) {
|
|
318
|
-
await this.handleStart()
|
|
319
|
-
} else if (newMode === 2) {
|
|
320
|
-
await this.handleDock()
|
|
321
|
-
}
|
|
322
|
-
break
|
|
323
|
-
}
|
|
324
|
-
case 'Multitasking Household Robot K20+ Pro': {
|
|
325
|
-
if (newMode === 1) {
|
|
326
|
-
await this.handleStart()
|
|
327
|
-
} else if (newMode === 0) {
|
|
328
|
-
await this.handleGoHome()
|
|
329
|
-
} else if (newMode === 2) {
|
|
330
|
-
await this.handlePause()
|
|
331
|
-
}
|
|
332
|
-
break
|
|
333
|
-
}
|
|
334
|
-
case 'Floor Cleaning Robot S10':
|
|
335
|
-
case 'Floor Cleaning Robot S20': {
|
|
336
|
-
if (newMode === 1) {
|
|
337
|
-
await this.handleStart()
|
|
338
|
-
} else if (newMode === 0) {
|
|
339
|
-
await this.handleGoHome()
|
|
340
|
-
}
|
|
341
|
-
break
|
|
342
|
-
}
|
|
343
|
-
case 'Robot Vacuum K11+': {
|
|
344
|
-
if (newMode === 1) {
|
|
345
|
-
await this.handleStart()
|
|
346
|
-
} else if (newMode === 0) {
|
|
347
|
-
await this.handleGoHome()
|
|
348
|
-
} else if (newMode === 2) {
|
|
349
|
-
await this.handleDock()
|
|
350
|
-
}
|
|
351
|
-
break
|
|
352
|
-
}
|
|
353
|
-
default:
|
|
354
|
-
this.logWarn(`Run mode change not supported for model: ${this.model}`)
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
private async handleChangeCleanMode(request: MatterRequests.ChangeToMode): Promise<void> {
|
|
359
|
-
this.logInfo(`ChangeToMode (clean) request received: ${JSON.stringify(request)}`)
|
|
360
|
-
const { newMode } = request
|
|
361
|
-
|
|
362
|
-
switch (this.model) {
|
|
363
|
-
case 'Robot Vacuum Cleaner S1':
|
|
364
|
-
case 'Robot Vacuum Cleaner S1 Plus': {
|
|
365
|
-
const mapPowS1 = ['Quiet', 'Standard', 'Strong', 'MAX'] as const
|
|
366
|
-
const labelS1 = mapPowS1[newMode] ?? `Unknown (${newMode})`
|
|
367
|
-
this.logInfo(`Changing suction level to: ${labelS1}`)
|
|
368
|
-
await this.sendOpenAPICommand('PowLevel', String(newMode))
|
|
369
|
-
break
|
|
370
|
-
}
|
|
371
|
-
case 'Mini Robot Vacuum K10+':
|
|
372
|
-
case 'Mini Robot Vacuum K10+ Pro':
|
|
373
|
-
case 'K10+ Pro Combo': {
|
|
374
|
-
const mapPowK10 = ['Vacuum', 'Mop', 'Sweep & Mop'] as const
|
|
375
|
-
const labelK10 = mapPowK10[newMode] ?? `Unknown (${newMode})`
|
|
376
|
-
this.logInfo(`Changing cleaning mode to: ${labelK10}`)
|
|
377
|
-
await this.sendOpenAPICommand('CleanMode', String(newMode))
|
|
378
|
-
break
|
|
379
|
-
}
|
|
380
|
-
case 'Multitasking Household Robot K20+ Pro': {
|
|
381
|
-
const mapPowK20 = ['Vacuum', 'Vacuum & Mop', 'Deep Clean'] as const
|
|
382
|
-
const labelK20 = mapPowK20[newMode] ?? `Unknown (${newMode})`
|
|
383
|
-
this.logInfo(`Changing cleaning mode to: ${labelK20}`)
|
|
384
|
-
await this.sendOpenAPICommand('CleanMode', String(newMode))
|
|
385
|
-
break
|
|
386
|
-
}
|
|
387
|
-
case 'Floor Cleaning Robot S10':
|
|
388
|
-
case 'Floor Cleaning Robot S20': {
|
|
389
|
-
const mapPowS10 = ['Vacuum', 'Mop'] as const
|
|
390
|
-
const labelS10 = mapPowS10[newMode] ?? `Unknown (${newMode})`
|
|
391
|
-
this.logInfo(`Changing cleaning mode to: ${labelS10}`)
|
|
392
|
-
await this.sendOpenAPICommand('CleanMode', String(newMode))
|
|
393
|
-
break
|
|
394
|
-
}
|
|
395
|
-
case 'Robot Vacuum K11+': {
|
|
396
|
-
const mapPowK11 = ['Quiet', 'Standard', 'Strong', 'MAX', 'Deep Clean'] as const
|
|
397
|
-
const labelK11 = mapPowK11[newMode] ?? `Unknown (${newMode})`
|
|
398
|
-
this.logInfo(`Changing suction level to: ${labelK11}`)
|
|
399
|
-
await this.sendOpenAPICommand('PowLevel', String(newMode))
|
|
400
|
-
break
|
|
401
|
-
}
|
|
402
|
-
default:
|
|
403
|
-
this.logWarn(`Clean mode change not supported for model: ${this.model}`)
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
private async handlePause(): Promise<void> {
|
|
408
|
-
this.logInfo('pausing.')
|
|
409
|
-
try {
|
|
410
|
-
this.logInfo(`[OpenAPI] Sending pause command`)
|
|
411
|
-
await this.sendOpenAPICommand('pause')
|
|
412
|
-
this.logInfo(`[OpenAPI] pause command sent`)
|
|
413
|
-
} catch (e: any) {
|
|
414
|
-
this.logWarn(`OpenAPI pause failed: ${String(e?.message ?? e)}`)
|
|
415
|
-
}
|
|
416
|
-
this.updateOperationalState(2)
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
private async handleStop(): Promise<void> {
|
|
420
|
-
this.logInfo('stopping.')
|
|
421
|
-
try {
|
|
422
|
-
if (this.capabilities.cleanAction === 'vacuum-only' && this.capabilities.suctionKind === 'powLevel-0-3') {
|
|
423
|
-
this.logInfo(`[OpenAPI] Sending stop command`)
|
|
424
|
-
await this.sendOpenAPICommand('stop')
|
|
425
|
-
this.logInfo(`[OpenAPI] stop command sent`)
|
|
426
|
-
} else {
|
|
427
|
-
this.logInfo(`[OpenAPI] Sending pause command (for stop)`)
|
|
428
|
-
await this.sendOpenAPICommand('pause')
|
|
429
|
-
this.logInfo(`[OpenAPI] pause command sent (for stop)`)
|
|
430
|
-
}
|
|
431
|
-
} catch (e: any) {
|
|
432
|
-
this.logWarn(`OpenAPI stop/pause failed: ${String(e?.message ?? e)}`)
|
|
433
|
-
}
|
|
434
|
-
this.updateRunMode(0)
|
|
435
|
-
this.updateOperationalState(0)
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
private async handleStart(): Promise<void> {
|
|
439
|
-
this.logInfo('starting clean.')
|
|
440
|
-
try {
|
|
441
|
-
if (this.capabilities.cleanAction === 'vacuum-only' && this.capabilities.suctionKind === 'powLevel-0-3') {
|
|
442
|
-
this.logInfo(`[OpenAPI] Sending start command`)
|
|
443
|
-
await this.sendOpenAPICommand('start')
|
|
444
|
-
this.logInfo(`[OpenAPI] start command sent`)
|
|
445
|
-
} else {
|
|
446
|
-
const action = this.currentCleanAction === 'vacuum_mop' ? 'sweep_mop' : this.currentCleanAction
|
|
447
|
-
const param: any = { action, param: { fanLevel: this.currentFanLevel } }
|
|
448
|
-
if (this.capabilities.waterLevel) {
|
|
449
|
-
param.param.waterLevel = 1
|
|
450
|
-
}
|
|
451
|
-
this.logInfo(`[OpenAPI] Sending startClean: ${JSON.stringify(param)}`)
|
|
452
|
-
await this.sendOpenAPICommand('startClean', JSON.stringify(param))
|
|
453
|
-
this.logInfo(`[OpenAPI] startClean command sent: ${JSON.stringify(param)}`)
|
|
454
|
-
}
|
|
455
|
-
} catch (e: any) {
|
|
456
|
-
this.logWarn(`OpenAPI start/startClean failed: ${String(e?.message ?? e)}`)
|
|
457
|
-
}
|
|
458
|
-
this.updateRunMode(1)
|
|
459
|
-
this.updateOperationalState(1)
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
private async handleResume(): Promise<void> {
|
|
463
|
-
this.logInfo('resume requested.')
|
|
464
|
-
try {
|
|
465
|
-
this.logInfo(`[OpenAPI] Sending resume command`)
|
|
466
|
-
await this.sendOpenAPICommand('resume')
|
|
467
|
-
this.logInfo(`[OpenAPI] resume command sent`)
|
|
468
|
-
} catch (e: any) {
|
|
469
|
-
this.logWarn(`OpenAPI resume failed: ${String(e?.message ?? e)}`)
|
|
470
|
-
}
|
|
471
|
-
this.updateRunMode(1)
|
|
472
|
-
this.updateOperationalState(1)
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
private async handleGoHome(): Promise<void> {
|
|
476
|
-
this.logInfo('returning to dock.')
|
|
477
|
-
try {
|
|
478
|
-
this.logInfo(`[OpenAPI] Sending dock command`)
|
|
479
|
-
await this.sendOpenAPICommand('dock')
|
|
480
|
-
this.logInfo(`[OpenAPI] dock command sent`)
|
|
481
|
-
} catch (e: any) {
|
|
482
|
-
this.logWarn(`OpenAPI dock failed: ${String(e?.message ?? e)}`)
|
|
483
|
-
}
|
|
484
|
-
this.updateRunMode(0)
|
|
485
|
-
this.updateOperationalState(64)
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
public updateOperationalState(state: number): void {
|
|
489
|
-
this.updateState('rvcOperationalState', { operationalState: state })
|
|
490
|
-
const states = [
|
|
491
|
-
'Stopped',
|
|
492
|
-
'Running',
|
|
493
|
-
'Paused',
|
|
494
|
-
...Array.from({ length: 61 }).fill(null),
|
|
495
|
-
'Seeking Charger',
|
|
496
|
-
'Charging',
|
|
497
|
-
'Docked',
|
|
498
|
-
]
|
|
499
|
-
this.logInfo(`operational state updated to: ${states[state] || `Unknown (${state})`}`)
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
public updateRunMode(mode: number): void {
|
|
503
|
-
this.updateState('rvcRunMode', { currentMode: mode })
|
|
504
|
-
const modes = ['Idle', 'Cleaning']
|
|
505
|
-
this.logInfo(`run mode updated to: ${modes[mode] || `Unknown (${mode})`}`)
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
public updateCleanMode(mode: number): void {
|
|
509
|
-
this.updateState('rvcCleanMode', { currentMode: mode })
|
|
510
|
-
const label = mode === 0 ? 'Vacuum' : mode === 1 ? 'Mop' : mode === 2 ? 'Vacuum & Mop' : 'Unknown'
|
|
511
|
-
this.logInfo(`clean mode updated to: ${label}`)
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* Update battery percentage (no PowerSource cluster for this device type)
|
|
516
|
-
*/
|
|
517
|
-
public async updateBatteryPercentage(percentageOrBatPercentRemaining: number): Promise<void> {
|
|
518
|
-
const isBatPercent = Number(percentageOrBatPercentRemaining) > 100
|
|
519
|
-
const percentage = isBatPercent
|
|
520
|
-
? Math.max(0, Math.min(100, Math.round(Number(percentageOrBatPercentRemaining) / 2)))
|
|
521
|
-
: Math.max(0, Math.min(100, Math.round(Number(percentageOrBatPercentRemaining))))
|
|
522
|
-
|
|
523
|
-
let chargeLevel = 0 // Ok
|
|
524
|
-
if (percentage < 20) {
|
|
525
|
-
chargeLevel = 2 // Critical
|
|
526
|
-
} else if (percentage < 40) {
|
|
527
|
-
chargeLevel = 1 // Warning
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
this.logInfo(`battery status: ${percentage}% (${chargeLevel === 0 ? 'Ok' : chargeLevel === 1 ? 'Warning' : 'Critical'})`)
|
|
531
|
-
|
|
532
|
-
if (this.context) {
|
|
533
|
-
(this.context as any).batteryPercentage = percentage
|
|
534
|
-
;(this.context as any).batteryChargeLevel = chargeLevel
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
private async handleDock(): Promise<void> {
|
|
539
|
-
this.logInfo('Docking the vacuum.')
|
|
540
|
-
try {
|
|
541
|
-
this.logInfo('[OpenAPI] Sending dock command')
|
|
542
|
-
await this.sendOpenAPICommand('dock')
|
|
543
|
-
this.logInfo('[OpenAPI] Dock command sent successfully')
|
|
544
|
-
this.updateRunMode(0) // Set to Idle after docking
|
|
545
|
-
this.updateOperationalState(64) // Seeking Charger state
|
|
546
|
-
} catch (error: any) {
|
|
547
|
-
this.logWarn(`Docking failed: ${String(error?.message ?? error)}`)
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
private async handleServiceArea(): Promise<void> {
|
|
552
|
-
this.logWarn(`Service area functionality is not supported for model: ${this.model}`)
|
|
553
|
-
// Placeholder for potential future support.
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
private async simulateCleaningSequence(): Promise<void> {
|
|
557
|
-
this.logInfo('Starting cleaning sequence simulation.')
|
|
558
|
-
this.updateOperationalState(1) // Set to Running
|
|
559
|
-
|
|
560
|
-
setTimeout(async () => {
|
|
561
|
-
this.logInfo('Cleaning sequence timer expired. Requesting device status update.')
|
|
562
|
-
try {
|
|
563
|
-
const status = await this.requestDeviceStatus()
|
|
564
|
-
if (status && status.operationalState) {
|
|
565
|
-
this.logInfo(`Device status found: ${status.operationalState}`)
|
|
566
|
-
this.updateOperationalState(status.operationalState)
|
|
567
|
-
} else {
|
|
568
|
-
this.logWarn('Device status not found. Setting operational state to Stopped.')
|
|
569
|
-
this.updateOperationalState(0) // Default to Stopped
|
|
570
|
-
}
|
|
571
|
-
} catch (error: any) {
|
|
572
|
-
this.logWarn(`Failed to fetch device status: ${String(error?.message ?? error)}`)
|
|
573
|
-
this.updateOperationalState(0) // Default to Stopped
|
|
574
|
-
}
|
|
575
|
-
}, 5000) // Simulate a 5-second cleaning sequence
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
private async simulateDockingSequence(): Promise<void> {
|
|
579
|
-
this.logInfo('Starting docking sequence simulation.')
|
|
580
|
-
this.updateOperationalState(64) // Set to Seeking Charger
|
|
581
|
-
|
|
582
|
-
setTimeout(async () => {
|
|
583
|
-
this.logInfo('Docking sequence timer expired. Requesting device status update.')
|
|
584
|
-
try {
|
|
585
|
-
const status = await this.requestDeviceStatus()
|
|
586
|
-
if (status && status.operationalState) {
|
|
587
|
-
this.logInfo(`Device status found: ${status.operationalState}`)
|
|
588
|
-
this.updateOperationalState(status.operationalState)
|
|
589
|
-
} else {
|
|
590
|
-
this.logWarn('Device status not found. Setting operational state to Docked.')
|
|
591
|
-
this.updateOperationalState(66) // Default to Docked
|
|
592
|
-
}
|
|
593
|
-
} catch (error: any) {
|
|
594
|
-
this.logWarn(`Failed to fetch device status: ${String(error?.message ?? error)}`)
|
|
595
|
-
this.updateOperationalState(66) // Default to Docked
|
|
596
|
-
}
|
|
597
|
-
}, 5000) // Simulate a 5-second docking sequence
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
private async requestDeviceStatus(): Promise<{ operationalState?: number } | null> {
|
|
601
|
-
this.logInfo('Requesting device status from OpenAPI.')
|
|
602
|
-
try {
|
|
603
|
-
const response = await this.sendOpenAPICommand('getDeviceStatus')
|
|
604
|
-
this.logInfo(`Device status response: ${JSON.stringify(response)}`)
|
|
605
|
-
return response
|
|
606
|
-
} catch (error: any) {
|
|
607
|
-
this.logWarn(`Failed to request device status: ${String(error?.message ?? error)}`)
|
|
608
|
-
return null
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
public async startCleaningSimulation(): Promise<void> {
|
|
613
|
-
this.logInfo('Initiating cleaning simulation.')
|
|
614
|
-
await this.simulateCleaningSequence()
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
public async startDockingSimulation(): Promise<void> {
|
|
618
|
-
this.logInfo('Initiating docking simulation.')
|
|
619
|
-
await this.simulateDockingSequence()
|
|
620
|
-
}
|
|
621
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Smoke/CO Alarm Accessory Class
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { API, Logger } from 'homebridge'
|
|
6
|
-
|
|
7
|
-
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
-
|
|
9
|
-
export class SmokeCOAlarmAccessory extends BaseMatterAccessory {
|
|
10
|
-
constructor(api: API, log: Logger) {
|
|
11
|
-
const serialNumber = 'SENSOR-006'
|
|
12
|
-
const SmokeCoAlarmServer = api.matter.deviceTypes.SmokeSensor.requirements.SmokeCoAlarmServer
|
|
13
|
-
const SmokeSensorWithBoth = api.matter.deviceTypes.SmokeSensor.with(
|
|
14
|
-
SmokeCoAlarmServer.with('SmokeAlarm', 'CoAlarm'),
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
super(api, log, {
|
|
18
|
-
uuid: api.matter.uuid.generate(serialNumber),
|
|
19
|
-
displayName: 'Smoke Sensor',
|
|
20
|
-
deviceType: SmokeSensorWithBoth,
|
|
21
|
-
serialNumber,
|
|
22
|
-
manufacturer: 'Homebridge Matter',
|
|
23
|
-
model: 'HB-MATTER-SENSOR-SMOKE-CO',
|
|
24
|
-
firmwareRevision: '2.0.0',
|
|
25
|
-
hardwareRevision: '1.0.0',
|
|
26
|
-
|
|
27
|
-
clusters: {
|
|
28
|
-
smokeCoAlarm: {
|
|
29
|
-
smokeState: 0, // 0 = normal, 1 = warning, 2 = critical
|
|
30
|
-
coState: 0,
|
|
31
|
-
batteryAlert: 0,
|
|
32
|
-
deviceMuted: 0,
|
|
33
|
-
testInProgress: false,
|
|
34
|
-
hardwareFaultAlert: false,
|
|
35
|
-
endOfServiceAlert: 0,
|
|
36
|
-
interconnectSmokeAlarm: 0,
|
|
37
|
-
interconnectCoAlarm: 0,
|
|
38
|
-
contaminationState: 0,
|
|
39
|
-
smokeSensitivityLevel: 1,
|
|
40
|
-
expressedState: 0,
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
this.logInfo('initialized.')
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public updateSmokeState(state: 0 | 1 | 2): void {
|
|
49
|
-
this.updateState('smokeCoAlarm', { smokeState: state })
|
|
50
|
-
const stateStr = ['Normal', 'Warning', 'Critical'][state]
|
|
51
|
-
this.logInfo(`smoke state: ${stateStr}.`)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
public updateCOState(state: 0 | 1 | 2): void {
|
|
55
|
-
this.updateState('smokeCoAlarm', { coState: state })
|
|
56
|
-
const stateStr = ['Normal', 'Warning', 'Critical'][state]
|
|
57
|
-
this.logInfo(`co state: ${stateStr}.`)
|
|
58
|
-
}
|
|
59
|
-
}
|