@switchbot/homebridge-switchbot 5.0.0-beta.9 → 5.0.0-beta.91
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 +32 -0
- package/.github/workflows/manual-e2e.yml +115 -0
- package/.github/workflows/release.yml +0 -4
- 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 +91 -14787
- 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 +630 -246
- 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 +367 -36
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -32
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +35 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +514 -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 +194 -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/eslint.config.js +2 -8
- package/package.json +21 -28
- 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 +630 -246
- package/src/homebridge-ui/server.ts +434 -41
- package/src/index.ts +4 -33
- package/src/platform.ts +515 -0
- package/src/settings.ts +12 -277
- package/src/switchbotClient.ts +203 -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 -120
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -966
- 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 -1092
- package/src/verifyconfig.test.ts +0 -197
package/src/irdevice/irdevice.ts
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
-
*
|
|
3
|
-
* irdevice.ts: @switchbot/homebridge-switchbot.
|
|
4
|
-
*/
|
|
5
|
-
import type { API, CharacteristicValue, HAP, Logging, PlatformAccessory, Service } from 'homebridge'
|
|
6
|
-
import type { bodyChange, irdevice } from 'node-switchbot'
|
|
7
|
-
|
|
8
|
-
import type { SwitchBotHAPPlatform } from '../platform-hap.js'
|
|
9
|
-
import type { irAirConfig, irDevicesConfig, irFanConfig, irLightConfig, irOtherConfig, SwitchBotPlatformConfig } from '../settings.js'
|
|
10
|
-
|
|
11
|
-
export abstract class irdeviceBase {
|
|
12
|
-
public readonly api: API
|
|
13
|
-
public readonly log: Logging
|
|
14
|
-
public readonly config!: SwitchBotPlatformConfig
|
|
15
|
-
protected readonly hap: HAP
|
|
16
|
-
|
|
17
|
-
// Config
|
|
18
|
-
protected deviceLogging!: string
|
|
19
|
-
protected deviceRefreshRate!: number
|
|
20
|
-
protected deviceUpdateRate!: number
|
|
21
|
-
protected devicePushRate!: number
|
|
22
|
-
protected deviceMaxRetries!: number
|
|
23
|
-
protected deviceDelayBetweenRetries!: number
|
|
24
|
-
protected deviceDisablePushOn!: boolean
|
|
25
|
-
protected deviceDisablePushOff!: boolean
|
|
26
|
-
protected deviceDisablePushDetail?: boolean
|
|
27
|
-
|
|
28
|
-
constructor(
|
|
29
|
-
protected readonly platform: SwitchBotHAPPlatform,
|
|
30
|
-
protected accessory: PlatformAccessory,
|
|
31
|
-
protected device: irdevice & irDevicesConfig,
|
|
32
|
-
) {
|
|
33
|
-
this.api = this.platform.api
|
|
34
|
-
this.log = this.platform.log
|
|
35
|
-
this.config = this.platform.config
|
|
36
|
-
this.hap = this.api.hap
|
|
37
|
-
|
|
38
|
-
this.getDeviceLogSettings(accessory, device)
|
|
39
|
-
this.getDeviceRateSettings(device)
|
|
40
|
-
this.getDeviceConfigSettings(device)
|
|
41
|
-
this.getDeviceContext(accessory, device)
|
|
42
|
-
|
|
43
|
-
// Set accessory information
|
|
44
|
-
accessory
|
|
45
|
-
.getService(this.hap.Service.AccessoryInformation)!
|
|
46
|
-
.setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
|
|
47
|
-
.setCharacteristic(this.hap.Characteristic.AppMatchingIdentifier, 'id1087374760')
|
|
48
|
-
.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName)
|
|
49
|
-
.setCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName)
|
|
50
|
-
.setCharacteristic(this.hap.Characteristic.Model, accessory.context.model ?? 'Unknown')
|
|
51
|
-
.setCharacteristic(this.hap.Characteristic.ProductData, device.deviceId)
|
|
52
|
-
.setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async getDeviceLogSettings(accessory: PlatformAccessory, device: irdevice & irDevicesConfig): Promise<void> {
|
|
56
|
-
this.deviceLogging = this.platform.debugMode ? 'debugMode' : device.logging ?? this.platform.platformLogging ?? 'standard'
|
|
57
|
-
const logging = this.platform.debugMode ? 'Debug Mode' : device.logging ? 'Device Config' : this.platform.platformLogging ? 'Platform Config' : 'Default'
|
|
58
|
-
accessory.context.deviceLogging = this.deviceLogging
|
|
59
|
-
this.debugLog(`Using ${logging} Logging: ${this.deviceLogging}`)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async getDeviceRateSettings(device: irdevice & irDevicesConfig): Promise<void> {
|
|
63
|
-
// refreshRate
|
|
64
|
-
this.deviceRefreshRate = device.refreshRate ?? this.platform.platformRefreshRate ?? 300
|
|
65
|
-
const refreshRate = device.refreshRate ? 'Device Config' : this.platform.platformRefreshRate ? 'Platform Config' : 'Default'
|
|
66
|
-
this.accessory.context.refreshRate = this.deviceRefreshRate
|
|
67
|
-
// updateRate
|
|
68
|
-
this.deviceUpdateRate = device.updateRate ?? this.platform.platformUpdateRate ?? 5
|
|
69
|
-
const updateRate = device.updateRate ? 'Device Config' : this.platform.platformUpdateRate ? 'Platform Config' : 'Default'
|
|
70
|
-
this.accessory.context.updateRate = this.deviceUpdateRate
|
|
71
|
-
// pushRate
|
|
72
|
-
this.devicePushRate = device.pushRate ?? this.platform.platformPushRate ?? 0.1
|
|
73
|
-
const pushRate = device.pushRate ? 'Device Config' : this.platform.platformPushRate ? 'Platform Config' : 'Default'
|
|
74
|
-
this.accessory.context.pushRate = this.devicePushRate
|
|
75
|
-
this.debugLog(`Using ${refreshRate} refreshRate: ${this.deviceRefreshRate}, ${updateRate} updateRate: ${this.deviceUpdateRate}, ${pushRate} pushRate: ${this.devicePushRate}`)
|
|
76
|
-
// maxRetries
|
|
77
|
-
this.deviceMaxRetries = device.maxRetries ?? this.platform.platformMaxRetries ?? 2
|
|
78
|
-
const maxRetries = device.maxRetries ? 'Device' : this.platform.platformMaxRetries ? 'Platform' : 'Default'
|
|
79
|
-
this.debugLog(`Using ${maxRetries} Max Retries: ${this.deviceMaxRetries}`)
|
|
80
|
-
// delayBetweenRetries
|
|
81
|
-
this.deviceDelayBetweenRetries = device.delayBetweenRetries ? (device.delayBetweenRetries * 1000) : this.platform.platformDelayBetweenRetries ?? 3000
|
|
82
|
-
const delayBetweenRetries = device.delayBetweenRetries ? 'Device' : this.platform.platformDelayBetweenRetries ? 'Platform' : 'Default'
|
|
83
|
-
this.debugLog(`Using ${delayBetweenRetries} Delay Between Retries: ${this.deviceDelayBetweenRetries}`)
|
|
84
|
-
|
|
85
|
-
// disablePushOn
|
|
86
|
-
this.deviceDisablePushOn = device.disablePushOn ?? false
|
|
87
|
-
const disablePushOn = device.disablePushOn ? 'Device Config' : 'Default'
|
|
88
|
-
// disablePushOff
|
|
89
|
-
this.deviceDisablePushOff = device.disablePushOff ?? false
|
|
90
|
-
const disablePushOff = device.disablePushOff ? 'Device Config' : 'Default'
|
|
91
|
-
// disablePushDetail
|
|
92
|
-
this.deviceDisablePushDetail = device.disablePushDetail ?? false
|
|
93
|
-
const disablePushDetail = device.disablePushDetail ? 'Device Config' : 'Default'
|
|
94
|
-
this.debugLog(`Using ${disablePushOn} Disable Push On: ${this.deviceDisablePushOn}, ${disablePushOff} Disable Push Off: ${this.deviceDisablePushOff}, ${disablePushDetail} Disable Push Detail: ${this.deviceDisablePushDetail}`)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async getDeviceConfigSettings(device: irdevice & irDevicesConfig): Promise<void> {
|
|
98
|
-
const deviceConfig = Object.assign(
|
|
99
|
-
{},
|
|
100
|
-
device.logging !== 'standard' && { logging: device.logging },
|
|
101
|
-
device.connectionType !== '' && { connectionType: device.connectionType },
|
|
102
|
-
device.external === true && { external: device.external },
|
|
103
|
-
device.customize === true && { customize: device.customize },
|
|
104
|
-
device.commandType !== '' && { commandType: device.commandType },
|
|
105
|
-
device.customOn !== '' && { customOn: device.customOn },
|
|
106
|
-
device.customOff !== '' && { customOff: device.customOff },
|
|
107
|
-
device.disablePushOn === true && { disablePushOn: device.disablePushOn },
|
|
108
|
-
device.disablePushOff === true && { disablePushOff: device.disablePushOff },
|
|
109
|
-
device.disablePushDetail === true && { disablePushDetail: device.disablePushDetail },
|
|
110
|
-
)
|
|
111
|
-
let deviceSpecificConfig = {}
|
|
112
|
-
switch (device.configRemoteType) {
|
|
113
|
-
case 'Fan':
|
|
114
|
-
case 'DIY Fan':
|
|
115
|
-
deviceSpecificConfig = device as irFanConfig
|
|
116
|
-
break
|
|
117
|
-
case 'Light':
|
|
118
|
-
case 'DIY Light':
|
|
119
|
-
deviceSpecificConfig = device as irLightConfig
|
|
120
|
-
break
|
|
121
|
-
case 'Air Conditioner':
|
|
122
|
-
case 'DIY Air Conditioner':
|
|
123
|
-
deviceSpecificConfig = device as irAirConfig
|
|
124
|
-
break
|
|
125
|
-
case 'Others':
|
|
126
|
-
deviceSpecificConfig = device as irOtherConfig
|
|
127
|
-
break
|
|
128
|
-
default:
|
|
129
|
-
break
|
|
130
|
-
}
|
|
131
|
-
const config = Object.assign(
|
|
132
|
-
{},
|
|
133
|
-
deviceConfig,
|
|
134
|
-
deviceSpecificConfig,
|
|
135
|
-
)
|
|
136
|
-
if (Object.keys(config).length !== 0) {
|
|
137
|
-
this.debugSuccessLog(`Config: ${JSON.stringify(config)}`)
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
async getDeviceContext(accessory: PlatformAccessory, device: irdevice & irDevicesConfig): Promise<void> {
|
|
142
|
-
accessory.context.name = device.deviceName
|
|
143
|
-
accessory.context.model = device.remoteType
|
|
144
|
-
accessory.context.deviceId = device.deviceId
|
|
145
|
-
accessory.context.remoteType = device.remoteType
|
|
146
|
-
|
|
147
|
-
const deviceFirmwareVersion = device.firmware ?? accessory.context.version ?? this.platform.version ?? '0.0.0'
|
|
148
|
-
const version = deviceFirmwareVersion.toString()
|
|
149
|
-
this.debugLog(`version: ${version?.replace(/^V|-.*$/g, '')}`)
|
|
150
|
-
let deviceVersion: string
|
|
151
|
-
if (version?.includes('.') === false) {
|
|
152
|
-
const replace = version?.replace(/^V|-.*$/g, '')
|
|
153
|
-
const match = replace?.match(/./g)
|
|
154
|
-
const validVersion = match?.join('.')
|
|
155
|
-
deviceVersion = validVersion ?? '0.0.0'
|
|
156
|
-
} else {
|
|
157
|
-
deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0'
|
|
158
|
-
}
|
|
159
|
-
accessory
|
|
160
|
-
.getService(this.hap.Service.AccessoryInformation)!
|
|
161
|
-
.setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
|
|
162
|
-
.setCharacteristic(this.hap.Characteristic.SoftwareRevision, deviceVersion)
|
|
163
|
-
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
164
|
-
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
165
|
-
.updateValue(deviceVersion)
|
|
166
|
-
accessory.context.version = deviceVersion
|
|
167
|
-
this.debugSuccessLog(`version: ${accessory.context.version}`)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
async pushChangeRequest(bodyChange: bodyChange): Promise<{ body: any, statusCode: number }> {
|
|
171
|
-
const { response, statusCode } = await this.platform.retryCommand(this.device, bodyChange, this.deviceMaxRetries, this.deviceDelayBetweenRetries)
|
|
172
|
-
return { body: response, statusCode }
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async successfulStatusCodes(deviceStatus: any) {
|
|
176
|
-
return (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Update the characteristic value and log the change.
|
|
181
|
-
*
|
|
182
|
-
* @param Service Service
|
|
183
|
-
* @param Characteristic Characteristic
|
|
184
|
-
* @param CharacteristicValue CharacteristicValue | undefined
|
|
185
|
-
* @param CharacteristicName string
|
|
186
|
-
* @return: void
|
|
187
|
-
*
|
|
188
|
-
*/
|
|
189
|
-
async updateCharacteristic(Service: Service, Characteristic: any, CharacteristicValue: CharacteristicValue | undefined, CharacteristicName: string): Promise<void> {
|
|
190
|
-
if (CharacteristicValue === undefined) {
|
|
191
|
-
this.debugLog(`${CharacteristicName}: ${CharacteristicValue}`)
|
|
192
|
-
} else {
|
|
193
|
-
Service.updateCharacteristic(Characteristic, CharacteristicValue)
|
|
194
|
-
this.debugLog(`updateCharacteristic ${CharacteristicName}: ${CharacteristicValue}`)
|
|
195
|
-
this.debugWarnLog(`${CharacteristicName} context before: ${this.accessory.context[CharacteristicName]}`)
|
|
196
|
-
this.accessory.context[CharacteristicName] = CharacteristicValue
|
|
197
|
-
this.debugWarnLog(`${CharacteristicName} context after: ${this.accessory.context[CharacteristicName]}`)
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
async pushStatusCodes<T extends { statusCode: number }>(deviceStatus: T) {
|
|
202
|
-
this.debugWarnLog(`deviceStatus: ${JSON.stringify(deviceStatus)}`)
|
|
203
|
-
this.debugWarnLog(`deviceStatus statusCode: ${deviceStatus.statusCode}`)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async successfulPushChange<T extends { statusCode: number }>(deviceStatus: T, bodyChange: any) {
|
|
207
|
-
this.debugSuccessLog(`deviceStatus StatusCode: ${deviceStatus.statusCode}`)
|
|
208
|
-
this.successLog(`request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
async pushChangeError(e: Error) {
|
|
212
|
-
this.errorLog(`failed pushChanges with ${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
async commandType(): Promise<string> {
|
|
216
|
-
let commandType: string
|
|
217
|
-
if (this.device.commandType && this.device.customize) {
|
|
218
|
-
commandType = this.device.commandType
|
|
219
|
-
} else if (this.device.customize) {
|
|
220
|
-
commandType = 'customize'
|
|
221
|
-
} else {
|
|
222
|
-
commandType = 'command'
|
|
223
|
-
}
|
|
224
|
-
return commandType
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
async commandOn(): Promise<string> {
|
|
228
|
-
let command: string
|
|
229
|
-
if (this.device.customize && this.device.customOn) {
|
|
230
|
-
command = this.device.customOn
|
|
231
|
-
} else {
|
|
232
|
-
command = 'turnOn'
|
|
233
|
-
}
|
|
234
|
-
return command
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
async commandOff(): Promise<string> {
|
|
238
|
-
let command: string
|
|
239
|
-
if (this.device.customize && this.device.customOff) {
|
|
240
|
-
command = this.device.customOff
|
|
241
|
-
} else {
|
|
242
|
-
command = 'turnOff'
|
|
243
|
-
}
|
|
244
|
-
return command
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
async statusCode(statusCode: number): Promise<void> {
|
|
248
|
-
const statusMessages = {
|
|
249
|
-
151: 'Command not supported by this deviceType',
|
|
250
|
-
152: 'Device not found',
|
|
251
|
-
160: 'Command is not supported',
|
|
252
|
-
161: 'Device is offline',
|
|
253
|
-
171: `Hub Device is offline. Hub: ${this.device.hubDeviceId}`,
|
|
254
|
-
190: 'Device internal error due to device states not synchronized with server, or command format is invalid',
|
|
255
|
-
100: 'Command successfully sent',
|
|
256
|
-
200: 'Request successful',
|
|
257
|
-
400: 'Bad Request, an invalid payload request',
|
|
258
|
-
401: 'Unauthorized, Authorization for the API is required, but the request has not been authenticated',
|
|
259
|
-
403: 'Forbidden, The request has been authenticated but does not have appropriate permissions, or a requested resource is not found',
|
|
260
|
-
404: 'Not Found, Specifies the requested path does not exist',
|
|
261
|
-
406: 'Not Acceptable, a MIME type has been requested via the Accept header for a value not supported by the server',
|
|
262
|
-
415: 'Unsupported Media Type, a contentType header has been defined that is not supported by the server',
|
|
263
|
-
422: 'Unprocessable Entity: The server cannot process the request, often due to exceeded API limits.',
|
|
264
|
-
429: 'Too Many Requests, exceeded the number of requests allowed for a given time window',
|
|
265
|
-
500: 'Internal Server Error, An unexpected error occurred. These errors should be rare',
|
|
266
|
-
}
|
|
267
|
-
if (statusCode === 171 && (this.device.hubDeviceId === this.device.deviceId || this.device.hubDeviceId === '000000000000')) {
|
|
268
|
-
this.debugErrorLog(`statusCode 171 changed to 161: hubDeviceId ${this.device.hubDeviceId} matches deviceId ${this.device.deviceId}, device is its own hub.`)
|
|
269
|
-
statusCode = 161
|
|
270
|
-
}
|
|
271
|
-
const logMessage = statusMessages[statusCode] || `Unknown statusCode: ${statusCode}, Submit Bugs Here: https://tinyurl.com/SwitchBotBug`
|
|
272
|
-
const logMethod = [100, 200].includes(statusCode) ? 'debugLog' : statusMessages[statusCode] ? 'errorLog' : 'infoLog'
|
|
273
|
-
this[logMethod](`${logMessage}, statusCode: ${statusCode}`)
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Logging for Device
|
|
278
|
-
*/
|
|
279
|
-
async infoLog(...log: any[]): Promise<void> {
|
|
280
|
-
if (await this.enablingDeviceLogging()) {
|
|
281
|
-
this.log.info(`${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
async successLog(...log: any[]): Promise<void> {
|
|
286
|
-
if (await this.enablingDeviceLogging()) {
|
|
287
|
-
this.log.success(`${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
async debugSuccessLog(...log: any[]): Promise<void> {
|
|
292
|
-
if (await this.enablingDeviceLogging()) {
|
|
293
|
-
if (await this.loggingIsDebug()) {
|
|
294
|
-
this.log.success(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
async warnLog(...log: any[]): Promise<void> {
|
|
300
|
-
if (await this.enablingDeviceLogging()) {
|
|
301
|
-
this.log.warn(`${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
async debugWarnLog(...log: any[]): Promise<void> {
|
|
306
|
-
if (await this.enablingDeviceLogging()) {
|
|
307
|
-
if (await this.loggingIsDebug()) {
|
|
308
|
-
this.log.warn(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
async errorLog(...log: any[]): Promise<void> {
|
|
314
|
-
if (await this.enablingDeviceLogging()) {
|
|
315
|
-
this.log.error(`${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
async debugErrorLog(...log: any[]): Promise<void> {
|
|
320
|
-
if (await this.enablingDeviceLogging()) {
|
|
321
|
-
if (await this.loggingIsDebug()) {
|
|
322
|
-
this.log.error(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
async debugLog(...log: any[]): Promise<void> {
|
|
328
|
-
if (await this.enablingDeviceLogging()) {
|
|
329
|
-
if (this.deviceLogging === 'debug') {
|
|
330
|
-
this.log.info(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
331
|
-
} else if (this.deviceLogging === 'debugMode') {
|
|
332
|
-
this.log.debug(`${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async loggingIsDebug(): Promise<boolean> {
|
|
338
|
-
return this.deviceLogging === 'debugMode' || this.deviceLogging === 'debug'
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async enablingDeviceLogging(): Promise<boolean> {
|
|
342
|
-
return this.deviceLogging === 'debugMode' || this.deviceLogging === 'debug' || this.deviceLogging === 'standard'
|
|
343
|
-
}
|
|
344
|
-
}
|
package/src/irdevice/light.ts
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
-
*
|
|
3
|
-
* light.ts: @switchbot/homebridge-switchbot.
|
|
4
|
-
*/
|
|
5
|
-
import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
|
|
6
|
-
import type { bodyChange, irdevice } from 'node-switchbot'
|
|
7
|
-
|
|
8
|
-
import type { SwitchBotHAPPlatform } from '../platform-hap.js'
|
|
9
|
-
import type { irDevicesConfig, irLightConfig } from '../settings.js'
|
|
10
|
-
|
|
11
|
-
import { irdeviceBase } from './irdevice.js'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Platform Accessory
|
|
15
|
-
* An instance of this class is created for each accessory your platform registers
|
|
16
|
-
* Each accessory may expose multiple services of different service types.
|
|
17
|
-
*/
|
|
18
|
-
export class Light extends irdeviceBase {
|
|
19
|
-
// Services
|
|
20
|
-
private LightBulb?: {
|
|
21
|
-
Name: CharacteristicValue
|
|
22
|
-
Service: Service
|
|
23
|
-
On: CharacteristicValue
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
private ProgrammableSwitchOn?: {
|
|
27
|
-
Name: CharacteristicValue
|
|
28
|
-
Service: Service
|
|
29
|
-
ProgrammableSwitchEvent: CharacteristicValue
|
|
30
|
-
ProgrammableSwitchOutputState: CharacteristicValue
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
private ProgrammableSwitchOff?: {
|
|
34
|
-
Name: CharacteristicValue
|
|
35
|
-
Service: Service
|
|
36
|
-
ProgrammableSwitchEvent: CharacteristicValue
|
|
37
|
-
ProgrammableSwitchOutputState: CharacteristicValue
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
constructor(
|
|
41
|
-
readonly platform: SwitchBotHAPPlatform,
|
|
42
|
-
accessory: PlatformAccessory,
|
|
43
|
-
device: irdevice & irDevicesConfig,
|
|
44
|
-
) {
|
|
45
|
-
super(platform, accessory, device)
|
|
46
|
-
// Set category
|
|
47
|
-
accessory.category = this.hap.Categories.LIGHTBULB
|
|
48
|
-
|
|
49
|
-
if (!(device as irLightConfig).stateless) {
|
|
50
|
-
// Initialize LightBulb Service
|
|
51
|
-
accessory.context.LightBulb = accessory.context.LightBulb ?? {}
|
|
52
|
-
this.LightBulb = {
|
|
53
|
-
Name: accessory.displayName,
|
|
54
|
-
Service: accessory.getService(this.hap.Service.Lightbulb) ?? accessory.addService(this.hap.Service.Lightbulb) as Service,
|
|
55
|
-
On: accessory.context.On || false,
|
|
56
|
-
}
|
|
57
|
-
accessory.context.LightBulb = this.LightBulb as object
|
|
58
|
-
|
|
59
|
-
this.LightBulb.Service.setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name).getCharacteristic(this.hap.Characteristic.On).onGet(() => {
|
|
60
|
-
return this.LightBulb!.On
|
|
61
|
-
}).onSet(this.OnSet.bind(this))
|
|
62
|
-
} else {
|
|
63
|
-
// Initialize ProgrammableSwitchOn Service
|
|
64
|
-
accessory.context.ProgrammableSwitchOn = accessory.context.ProgrammableSwitchOn ?? {}
|
|
65
|
-
this.ProgrammableSwitchOn = {
|
|
66
|
-
Name: `${accessory.displayName} On`,
|
|
67
|
-
Service: accessory.getService(this.hap.Service.StatefulProgrammableSwitch) ?? accessory.addService(this.hap.Service.StatefulProgrammableSwitch) as Service,
|
|
68
|
-
ProgrammableSwitchEvent: accessory.context.ProgrammableSwitchEvent ?? this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS,
|
|
69
|
-
ProgrammableSwitchOutputState: accessory.context.ProgrammableSwitchOutputState ?? 0,
|
|
70
|
-
}
|
|
71
|
-
accessory.context.ProgrammableSwitchOn = this.ProgrammableSwitchOn as object
|
|
72
|
-
|
|
73
|
-
// Initialize ProgrammableSwitchOn Characteristics
|
|
74
|
-
this.ProgrammableSwitchOn?.Service.setCharacteristic(this.hap.Characteristic.Name, this.ProgrammableSwitchOn.Name).getCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent).setProps({
|
|
75
|
-
validValueRanges: [0, 0],
|
|
76
|
-
minValue: 0,
|
|
77
|
-
maxValue: 0,
|
|
78
|
-
validValues: [0],
|
|
79
|
-
}).onGet(() => {
|
|
80
|
-
return this.ProgrammableSwitchOn!.ProgrammableSwitchEvent
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
this.ProgrammableSwitchOn?.Service.getCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState).onGet(() => {
|
|
84
|
-
return this.ProgrammableSwitchOn!.ProgrammableSwitchOutputState
|
|
85
|
-
}).onSet(this.ProgrammableSwitchOutputStateSetOn.bind(this))
|
|
86
|
-
|
|
87
|
-
// Initialize ProgrammableSwitchOff Service
|
|
88
|
-
accessory.context.ProgrammableSwitchOff = accessory.context.ProgrammableSwitchOff ?? {}
|
|
89
|
-
this.ProgrammableSwitchOff = {
|
|
90
|
-
Name: `${accessory.displayName} Off`,
|
|
91
|
-
Service: accessory.getService(this.hap.Service.StatefulProgrammableSwitch) ?? accessory.addService(this.hap.Service.StatefulProgrammableSwitch) as Service,
|
|
92
|
-
ProgrammableSwitchEvent: accessory.context.ProgrammableSwitchEvent ?? this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS,
|
|
93
|
-
ProgrammableSwitchOutputState: accessory.context.ProgrammableSwitchOutputState ?? 0,
|
|
94
|
-
}
|
|
95
|
-
accessory.context.ProgrammableSwitchOff = this.ProgrammableSwitchOff as object
|
|
96
|
-
|
|
97
|
-
// Initialize ProgrammableSwitchOff Characteristics
|
|
98
|
-
this.ProgrammableSwitchOff?.Service.setCharacteristic(this.hap.Characteristic.Name, this.ProgrammableSwitchOff.Name).getCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent).setProps({
|
|
99
|
-
validValueRanges: [0, 0],
|
|
100
|
-
minValue: 0,
|
|
101
|
-
maxValue: 0,
|
|
102
|
-
validValues: [0],
|
|
103
|
-
}).onGet(() => {
|
|
104
|
-
return this.ProgrammableSwitchOff!.ProgrammableSwitchEvent
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
this.ProgrammableSwitchOff?.Service.getCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState).onGet(() => {
|
|
108
|
-
return this.ProgrammableSwitchOff!.ProgrammableSwitchOutputState
|
|
109
|
-
}).onSet(this.ProgrammableSwitchOutputStateSetOff.bind(this))
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async OnSet(value: CharacteristicValue): Promise<void> {
|
|
114
|
-
this.debugLog(`On: ${value}`)
|
|
115
|
-
|
|
116
|
-
this.LightBulb!.On = value
|
|
117
|
-
if (this.LightBulb?.On) {
|
|
118
|
-
const On = true
|
|
119
|
-
await this.pushLightOnChanges(On)
|
|
120
|
-
} else {
|
|
121
|
-
const On = false
|
|
122
|
-
await this.pushLightOffChanges(On)
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* pushLightOnChanges and pushLightOffChanges above assume they are measuring the state of the accessory BEFORE
|
|
126
|
-
* they are updated, so we are only updating the accessory state after calling the above.
|
|
127
|
-
*/
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async ProgrammableSwitchOutputStateSetOn(value: CharacteristicValue): Promise<void> {
|
|
131
|
-
this.debugLog(`On: ${value}`)
|
|
132
|
-
|
|
133
|
-
this.ProgrammableSwitchOn!.ProgrammableSwitchOutputState = value
|
|
134
|
-
if (this.ProgrammableSwitchOn?.ProgrammableSwitchOutputState === 1) {
|
|
135
|
-
const On = true
|
|
136
|
-
await this.pushLightOnChanges(On)
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* pushLightOnChanges and pushLightOffChanges above assume they are measuring the state of the accessory BEFORE
|
|
140
|
-
* they are updated, so we are only updating the accessory state after calling the above.
|
|
141
|
-
*/
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async ProgrammableSwitchOutputStateSetOff(value: CharacteristicValue): Promise<void> {
|
|
145
|
-
this.debugLog(`On: ${value}`)
|
|
146
|
-
|
|
147
|
-
this.ProgrammableSwitchOff!.ProgrammableSwitchOutputState = value
|
|
148
|
-
if (this.ProgrammableSwitchOff?.ProgrammableSwitchOutputState === 1) {
|
|
149
|
-
const On = false
|
|
150
|
-
await this.pushLightOffChanges(On)
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* pushLightOnChanges and pushLightOffChanges above assume they are measuring the state of the accessory BEFORE
|
|
154
|
-
* they are updated, so we are only updating the accessory state after calling the above.
|
|
155
|
-
*/
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Pushes the requested changes to the SwitchBot API
|
|
160
|
-
* deviceType commandType Command command parameter Description
|
|
161
|
-
* Light - "command" "turnOff" "default" = set to OFF state
|
|
162
|
-
* Light - "command" "turnOn" "default" = set to ON state
|
|
163
|
-
* Light - "command" "volumeAdd" "default" = volume up
|
|
164
|
-
* Light - "command" "volumeSub" "default" = volume down
|
|
165
|
-
* Light - "command" "channelAdd" "default" = next channel
|
|
166
|
-
* Light - "command" "channelSub" "default" = previous channel
|
|
167
|
-
*/
|
|
168
|
-
async pushLightOnChanges(On: boolean): Promise<void> {
|
|
169
|
-
this.debugLog(`pushLightOnChanges On: ${On}, disablePushOn: ${this.deviceDisablePushOn}`)
|
|
170
|
-
if (On === true && this.deviceDisablePushOn === false) {
|
|
171
|
-
const commandType: string = await this.commandType()
|
|
172
|
-
const command: string = await this.commandOn()
|
|
173
|
-
const bodyChange: bodyChange = {
|
|
174
|
-
command,
|
|
175
|
-
parameter: 'default',
|
|
176
|
-
commandType,
|
|
177
|
-
}
|
|
178
|
-
await this.pushChanges(bodyChange, On)
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async pushLightOffChanges(On: boolean): Promise<void> {
|
|
183
|
-
this.debugLog(`pushLightOffChanges On: ${On}, disablePushOff: ${this.deviceDisablePushOff}`)
|
|
184
|
-
if (On === false && this.deviceDisablePushOff === false) {
|
|
185
|
-
const commandType: string = await this.commandType()
|
|
186
|
-
const command: string = await this.commandOff()
|
|
187
|
-
const bodyChange: bodyChange = {
|
|
188
|
-
command,
|
|
189
|
-
parameter: 'default',
|
|
190
|
-
commandType,
|
|
191
|
-
}
|
|
192
|
-
await this.pushChanges(bodyChange, On)
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
async pushChanges(bodyChange: any, On: boolean): Promise<void> {
|
|
197
|
-
this.debugLog('pushChanges')
|
|
198
|
-
if (this.device.connectionType === 'OpenAPI') {
|
|
199
|
-
this.infoLog(`Sending request to SwitchBot API, body: ${JSON.stringify(bodyChange)}`)
|
|
200
|
-
try {
|
|
201
|
-
const deviceStatus = await this.pushChangeRequest(bodyChange)
|
|
202
|
-
await this.pushStatusCodes(deviceStatus)
|
|
203
|
-
if (await this.successfulStatusCodes(deviceStatus)) {
|
|
204
|
-
await this.successfulPushChange(deviceStatus, bodyChange)
|
|
205
|
-
this.accessory.context.On = On
|
|
206
|
-
await this.updateHomeKitCharacteristics()
|
|
207
|
-
} else {
|
|
208
|
-
await this.statusCode(deviceStatus.statusCode)
|
|
209
|
-
}
|
|
210
|
-
} catch (e: any) {
|
|
211
|
-
await this.apiError(e)
|
|
212
|
-
await this.pushChangeError(e)
|
|
213
|
-
}
|
|
214
|
-
} else {
|
|
215
|
-
this.warnLog(`Connection Type: ${this.device.connectionType}, commands will not be sent to OpenAPI`)
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
async updateHomeKitCharacteristics(): Promise<void> {
|
|
220
|
-
this.debugLog('updateHomeKitCharacteristics')
|
|
221
|
-
if (!(this.device as irLightConfig).stateless && this.LightBulb?.Service) {
|
|
222
|
-
// On
|
|
223
|
-
await this.updateCharacteristic(this.LightBulb.Service, this.hap.Characteristic.On, this.LightBulb.On, 'On')
|
|
224
|
-
} else {
|
|
225
|
-
if (this.ProgrammableSwitchOn?.Service) {
|
|
226
|
-
// On Stateful Programmable Switch
|
|
227
|
-
await this.updateCharacteristic(this.ProgrammableSwitchOn.Service, this.hap.Characteristic.ProgrammableSwitchOutputState, this.ProgrammableSwitchOn.ProgrammableSwitchOutputState, 'ProgrammableSwitchOutputState')
|
|
228
|
-
}
|
|
229
|
-
if (this.ProgrammableSwitchOff?.Service) {
|
|
230
|
-
// Off Stateful Programmable Switch
|
|
231
|
-
await this.updateCharacteristic(this.ProgrammableSwitchOff.Service, this.hap.Characteristic.ProgrammableSwitchOutputState, this.ProgrammableSwitchOff.ProgrammableSwitchOutputState, 'ProgrammableSwitchOutputState')
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
async apiError(e: any): Promise<void> {
|
|
237
|
-
if (!(this.device as irLightConfig).stateless) {
|
|
238
|
-
this.LightBulb?.Service.updateCharacteristic(this.hap.Characteristic.On, e)
|
|
239
|
-
} else {
|
|
240
|
-
this.ProgrammableSwitchOn?.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, e)
|
|
241
|
-
this.ProgrammableSwitchOn?.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e)
|
|
242
|
-
this.ProgrammableSwitchOff?.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, e)
|
|
243
|
-
this.ProgrammableSwitchOff?.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e)
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|