@switchbot/homebridge-switchbot 5.0.0-beta.7 → 5.0.0-beta.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
- package/.github/workflows/ci.yml +61 -0
- package/.github/workflows/manual-e2e.yml +103 -0
- package/CHANGELOG.md +35 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +44 -0
- package/README.md +56 -3
- package/config.schema.json +99 -14823
- package/dist/deviceFactory.d.ts +13 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +81 -0
- package/dist/deviceFactory.js.map +1 -0
- package/dist/devices/deviceBase.d.ts +50 -0
- package/dist/devices/deviceBase.d.ts.map +1 -0
- package/dist/devices/deviceBase.js +119 -0
- package/dist/devices/deviceBase.js.map +1 -0
- package/dist/devices/genericDevice.d.ts +283 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1035 -0
- package/dist/devices/genericDevice.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +77 -245
- package/dist/homebridge-ui/server.d.ts +3 -1
- package/dist/homebridge-ui/server.d.ts.map +1 -1
- package/dist/homebridge-ui/server.js +42 -36
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +27 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +404 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +10 -249
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +5 -30
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +32 -0
- package/dist/switchbotClient.d.ts.map +1 -0
- package/dist/switchbotClient.js +259 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +39 -50
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +39 -688
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +14 -0
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/main.js +2 -2
- package/docs/assets/style.css +3 -3
- package/docs/index.html +77 -13
- package/docs/variables/default.html +1 -1
- package/package.json +22 -21
- package/scripts/e2e/README.md +25 -0
- package/scripts/e2e/curtain-e2e.sh +70 -0
- package/scripts/e2e/fan-e2e.sh +75 -0
- package/scripts/e2e/light-advanced-e2e.sh +97 -0
- package/scripts/e2e/light-e2e.sh +75 -0
- package/scripts/e2e/list-accessories.sh +19 -0
- package/scripts/e2e/lock-e2e.sh +65 -0
- package/scripts/generate-matter-maps.js +60 -0
- package/scripts/run-e2e-local.sh +14 -0
- package/src/deviceFactory.ts +122 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +965 -0
- package/src/homebridge-ui/public/index.html +77 -245
- package/src/homebridge-ui/server.ts +49 -41
- package/src/index.ts +5 -13
- package/src/platform.ts +395 -0
- package/src/settings.ts +12 -277
- package/src/switchbotClient.ts +266 -0
- package/src/utils.ts +45 -713
- package/test/accessory-restore.spec.ts +73 -0
- package/test/device-mapping.spec.ts +37 -0
- package/test/deviceFactory.spec.ts +18 -0
- package/test/e2e/run-e2e.spec.ts +50 -0
- package/test/fan-swing.spec.ts +29 -0
- package/test/helpers/matter-harness.ts +53 -0
- package/test/lock-users.spec.ts +44 -0
- package/test/matter-childbridge.spec.ts +55 -0
- package/test/matter-descriptors.spec.ts +97 -0
- package/test/matter-device-state.spec.ts +101 -0
- package/test/matter-integration.spec.ts +70 -0
- package/test/platform.integration.spec.ts +55 -0
- package/test/switchbot-client-debounce.spec.ts +131 -0
- package/test/switchbot-client-openapi.spec.ts +56 -0
- package/test/switchbotClient.spec.ts +10 -0
- package/test/utils.spec.ts +20 -0
- package/vitest.config.ts +7 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -15847
- package/coverage/coverage-final.json +0 -42
- package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
- package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
- package/coverage/docs/assets/dmt/index.html +0 -131
- package/coverage/docs/assets/hierarchy.js.html +0 -85
- package/coverage/docs/assets/icons.js.html +0 -136
- package/coverage/docs/assets/index.html +0 -146
- package/coverage/docs/assets/main.js.html +0 -265
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -191
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/src/device/blindtilt.ts.html +0 -3238
- package/coverage/src/device/bot.ts.html +0 -2803
- package/coverage/src/device/ceilinglight.ts.html +0 -2338
- package/coverage/src/device/colorbulb.ts.html +0 -2824
- package/coverage/src/device/contact.ts.html +0 -1465
- package/coverage/src/device/curtain.ts.html +0 -2869
- package/coverage/src/device/device.ts.html +0 -2500
- package/coverage/src/device/fan.ts.html +0 -2242
- package/coverage/src/device/hub.ts.html +0 -1408
- package/coverage/src/device/humidifier.ts.html +0 -2116
- package/coverage/src/device/index.html +0 -416
- package/coverage/src/device/iosensor.ts.html +0 -1375
- package/coverage/src/device/lightstrip.ts.html +0 -2617
- package/coverage/src/device/lock.ts.html +0 -1963
- package/coverage/src/device/meter.ts.html +0 -1372
- package/coverage/src/device/meterplus.ts.html +0 -1384
- package/coverage/src/device/meterpro.ts.html +0 -1618
- package/coverage/src/device/motion.ts.html +0 -1264
- package/coverage/src/device/plug.ts.html +0 -1372
- package/coverage/src/device/relayswitch.ts.html +0 -2284
- package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
- package/coverage/src/device/waterdetector.ts.html +0 -1294
- package/coverage/src/homebridge-ui/index.html +0 -116
- package/coverage/src/homebridge-ui/server.ts.html +0 -229
- package/coverage/src/index.html +0 -161
- package/coverage/src/index.ts.html +0 -124
- package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
- package/coverage/src/irdevice/airpurifier.ts.html +0 -844
- package/coverage/src/irdevice/camera.ts.html +0 -475
- package/coverage/src/irdevice/fan.ts.html +0 -766
- package/coverage/src/irdevice/index.html +0 -251
- package/coverage/src/irdevice/irdevice.ts.html +0 -1117
- package/coverage/src/irdevice/light.ts.html +0 -826
- package/coverage/src/irdevice/other.ts.html +0 -2458
- package/coverage/src/irdevice/tv.ts.html +0 -1222
- package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
- package/coverage/src/irdevice/waterheater.ts.html +0 -469
- package/coverage/src/platform.ts.html +0 -8776
- package/coverage/src/settings.ts.html +0 -934
- package/coverage/src/utils.ts.html +0 -2092
- package/dist/devices-hap/airpurifier.d.ts +0 -54
- package/dist/devices-hap/airpurifier.d.ts.map +0 -1
- package/dist/devices-hap/airpurifier.js +0 -527
- package/dist/devices-hap/airpurifier.js.map +0 -1
- package/dist/devices-hap/blindtilt.d.ts +0 -90
- package/dist/devices-hap/blindtilt.d.ts.map +0 -1
- package/dist/devices-hap/blindtilt.js +0 -974
- package/dist/devices-hap/blindtilt.js.map +0 -1
- package/dist/devices-hap/bot.d.ts +0 -102
- package/dist/devices-hap/bot.d.ts.map +0 -1
- package/dist/devices-hap/bot.js +0 -811
- package/dist/devices-hap/bot.js.map +0 -1
- package/dist/devices-hap/ceilinglight.d.ts +0 -85
- package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
- package/dist/devices-hap/ceilinglight.js +0 -701
- package/dist/devices-hap/ceilinglight.js.map +0 -1
- package/dist/devices-hap/colorbulb.d.ts +0 -88
- package/dist/devices-hap/colorbulb.d.ts.map +0 -1
- package/dist/devices-hap/colorbulb.js +0 -881
- package/dist/devices-hap/colorbulb.js.map +0 -1
- package/dist/devices-hap/contact.d.ts +0 -44
- package/dist/devices-hap/contact.d.ts.map +0 -1
- package/dist/devices-hap/contact.js +0 -409
- package/dist/devices-hap/contact.js.map +0 -1
- package/dist/devices-hap/curtain.d.ts +0 -73
- package/dist/devices-hap/curtain.d.ts.map +0 -1
- package/dist/devices-hap/curtain.js +0 -869
- package/dist/devices-hap/curtain.js.map +0 -1
- package/dist/devices-hap/device.d.ts +0 -98
- package/dist/devices-hap/device.d.ts.map +0 -1
- package/dist/devices-hap/device.js +0 -749
- package/dist/devices-hap/device.js.map +0 -1
- package/dist/devices-hap/fan.d.ts +0 -69
- package/dist/devices-hap/fan.d.ts.map +0 -1
- package/dist/devices-hap/fan.js +0 -649
- package/dist/devices-hap/fan.js.map +0 -1
- package/dist/devices-hap/hub.d.ts +0 -37
- package/dist/devices-hap/hub.d.ts.map +0 -1
- package/dist/devices-hap/hub.js +0 -392
- package/dist/devices-hap/hub.js.map +0 -1
- package/dist/devices-hap/humidifier.d.ts +0 -68
- package/dist/devices-hap/humidifier.d.ts.map +0 -1
- package/dist/devices-hap/humidifier.js +0 -628
- package/dist/devices-hap/humidifier.js.map +0 -1
- package/dist/devices-hap/iosensor.d.ts +0 -42
- package/dist/devices-hap/iosensor.d.ts.map +0 -1
- package/dist/devices-hap/iosensor.js +0 -382
- package/dist/devices-hap/iosensor.js.map +0 -1
- package/dist/devices-hap/lightstrip.d.ts +0 -79
- package/dist/devices-hap/lightstrip.d.ts.map +0 -1
- package/dist/devices-hap/lightstrip.js +0 -797
- package/dist/devices-hap/lightstrip.js.map +0 -1
- package/dist/devices-hap/lock.d.ts +0 -53
- package/dist/devices-hap/lock.d.ts.map +0 -1
- package/dist/devices-hap/lock.js +0 -561
- package/dist/devices-hap/lock.js.map +0 -1
- package/dist/devices-hap/meter.d.ts +0 -37
- package/dist/devices-hap/meter.d.ts.map +0 -1
- package/dist/devices-hap/meter.js +0 -379
- package/dist/devices-hap/meter.js.map +0 -1
- package/dist/devices-hap/meterplus.d.ts +0 -42
- package/dist/devices-hap/meterplus.d.ts.map +0 -1
- package/dist/devices-hap/meterplus.js +0 -384
- package/dist/devices-hap/meterplus.js.map +0 -1
- package/dist/devices-hap/meterpro.d.ts +0 -43
- package/dist/devices-hap/meterpro.d.ts.map +0 -1
- package/dist/devices-hap/meterpro.js +0 -468
- package/dist/devices-hap/meterpro.js.map +0 -1
- package/dist/devices-hap/motion.d.ts +0 -42
- package/dist/devices-hap/motion.d.ts.map +0 -1
- package/dist/devices-hap/motion.js +0 -345
- package/dist/devices-hap/motion.js.map +0 -1
- package/dist/devices-hap/plug.d.ts +0 -49
- package/dist/devices-hap/plug.d.ts.map +0 -1
- package/dist/devices-hap/plug.js +0 -395
- package/dist/devices-hap/plug.js.map +0 -1
- package/dist/devices-hap/relayswitch.d.ts +0 -96
- package/dist/devices-hap/relayswitch.d.ts.map +0 -1
- package/dist/devices-hap/relayswitch.js +0 -642
- package/dist/devices-hap/relayswitch.js.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
- package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.js +0 -523
- package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
- package/dist/devices-hap/waterdetector.d.ts +0 -41
- package/dist/devices-hap/waterdetector.d.ts.map +0 -1
- package/dist/devices-hap/waterdetector.js +0 -356
- package/dist/devices-hap/waterdetector.js.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -63
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -100
- package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.js +0 -95
- package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -78
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.js +0 -34
- package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
- package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.js +0 -167
- package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
- package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.js +0 -50
- package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -107
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/FanAccessory.d.ts +0 -16
- package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
- package/dist/devices-matter/FanAccessory.js +0 -81
- package/dist/devices-matter/FanAccessory.js.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
- package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.js +0 -33
- package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.js +0 -34
- package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
- package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.js +0 -118
- package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
- package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
- package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
- package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
- package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
- package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.js +0 -95
- package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
- package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
- package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
- package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.js +0 -80
- package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
- package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
- package/dist/devices-matter/custom/index.d.ts +0 -8
- package/dist/devices-matter/custom/index.d.ts.map +0 -1
- package/dist/devices-matter/custom/index.js +0 -8
- package/dist/devices-matter/custom/index.js.map +0 -1
- package/dist/devices-matter/index.d.ts +0 -29
- package/dist/devices-matter/index.d.ts.map +0 -1
- package/dist/devices-matter/index.js +0 -28
- package/dist/devices-matter/index.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -14
- package/dist/index.test.js.map +0 -1
- package/dist/irdevice/airconditioner.d.ts +0 -61
- package/dist/irdevice/airconditioner.d.ts.map +0 -1
- package/dist/irdevice/airconditioner.js +0 -472
- package/dist/irdevice/airconditioner.js.map +0 -1
- package/dist/irdevice/airpurifier.d.ts +0 -50
- package/dist/irdevice/airpurifier.d.ts.map +0 -1
- package/dist/irdevice/airpurifier.js +0 -213
- package/dist/irdevice/airpurifier.js.map +0 -1
- package/dist/irdevice/camera.d.ts +0 -32
- package/dist/irdevice/camera.d.ts.map +0 -1
- package/dist/irdevice/camera.js +0 -107
- package/dist/irdevice/camera.js.map +0 -1
- package/dist/irdevice/fan.d.ts +0 -36
- package/dist/irdevice/fan.d.ts.map +0 -1
- package/dist/irdevice/fan.js +0 -200
- package/dist/irdevice/fan.js.map +0 -1
- package/dist/irdevice/irdevice.d.ts +0 -68
- package/dist/irdevice/irdevice.d.ts.map +0 -1
- package/dist/irdevice/irdevice.js +0 -298
- package/dist/irdevice/irdevice.js.map +0 -1
- package/dist/irdevice/light.d.ts +0 -36
- package/dist/irdevice/light.d.ts.map +0 -1
- package/dist/irdevice/light.js +0 -206
- package/dist/irdevice/light.js.map +0 -1
- package/dist/irdevice/other.d.ts +0 -57
- package/dist/irdevice/other.d.ts.map +0 -1
- package/dist/irdevice/other.js +0 -778
- package/dist/irdevice/other.js.map +0 -1
- package/dist/irdevice/tv.d.ts +0 -45
- package/dist/irdevice/tv.d.ts.map +0 -1
- package/dist/irdevice/tv.js +0 -327
- package/dist/irdevice/tv.js.map +0 -1
- package/dist/irdevice/vacuumcleaner.d.ts +0 -28
- package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
- package/dist/irdevice/vacuumcleaner.js +0 -104
- package/dist/irdevice/vacuumcleaner.js.map +0 -1
- package/dist/irdevice/waterheater.d.ts +0 -30
- package/dist/irdevice/waterheater.d.ts.map +0 -1
- package/dist/irdevice/waterheater.js +0 -105
- package/dist/irdevice/waterheater.js.map +0 -1
- package/dist/platform-hap.d.ts +0 -149
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -2861
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -101
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -896
- package/dist/platform-matter.js.map +0 -1
- package/dist/verifyconfig.test.d.ts +0 -2
- package/dist/verifyconfig.test.d.ts.map +0 -1
- package/dist/verifyconfig.test.js +0 -167
- package/dist/verifyconfig.test.js.map +0 -1
- package/src/custom.d.ts +0 -7
- package/src/devices-hap/airpurifier.ts +0 -563
- package/src/devices-hap/blindtilt.ts +0 -1049
- package/src/devices-hap/bot.ts +0 -900
- package/src/devices-hap/ceilinglight.ts +0 -742
- package/src/devices-hap/colorbulb.ts +0 -904
- package/src/devices-hap/contact.ts +0 -457
- package/src/devices-hap/curtain.ts +0 -944
- package/src/devices-hap/device.ts +0 -811
- package/src/devices-hap/fan.ts +0 -711
- package/src/devices-hap/hub.ts +0 -439
- package/src/devices-hap/humidifier.ts +0 -669
- package/src/devices-hap/iosensor.ts +0 -427
- package/src/devices-hap/lightstrip.ts +0 -836
- package/src/devices-hap/lock.ts +0 -620
- package/src/devices-hap/meter.ts +0 -426
- package/src/devices-hap/meterplus.ts +0 -430
- package/src/devices-hap/meterpro.ts +0 -522
- package/src/devices-hap/motion.ts +0 -390
- package/src/devices-hap/plug.ts +0 -423
- package/src/devices-hap/relayswitch.ts +0 -727
- package/src/devices-hap/robotvacuumcleaner.ts +0 -568
- package/src/devices-hap/waterdetector.ts +0 -400
- package/src/devices-matter/BaseMatterAccessory.ts +0 -131
- package/src/devices-matter/ColorLightAccessory.ts +0 -110
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
- package/src/devices-matter/ContactSensorAccessory.ts +0 -41
- package/src/devices-matter/DimmableLightAccessory.ts +0 -192
- package/src/devices-matter/DoorLockAccessory.ts +0 -60
- package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -123
- package/src/devices-matter/FanAccessory.ts +0 -95
- package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
- package/src/devices-matter/LeakSensorAccessory.ts +0 -40
- package/src/devices-matter/LightSensorAccessory.ts +0 -41
- package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
- package/src/devices-matter/OnOffLightAccessory.ts +0 -133
- package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
- package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
- package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
- package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
- package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
- package/src/devices-matter/ThermostatAccessory.ts +0 -110
- package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
- package/src/devices-matter/WindowBlindAccessory.ts +0 -92
- package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
- package/src/devices-matter/custom/index.ts +0 -8
- package/src/devices-matter/index.ts +0 -29
- package/src/index.test.ts +0 -19
- package/src/irdevice/airconditioner.ts +0 -533
- package/src/irdevice/airpurifier.ts +0 -252
- package/src/irdevice/camera.ts +0 -129
- package/src/irdevice/fan.ts +0 -226
- package/src/irdevice/irdevice.ts +0 -344
- package/src/irdevice/light.ts +0 -246
- package/src/irdevice/other.ts +0 -790
- package/src/irdevice/tv.ts +0 -378
- package/src/irdevice/vacuumcleaner.ts +0 -126
- package/src/irdevice/waterheater.ts +0 -127
- package/src/platform-hap.ts +0 -2997
- package/src/platform-matter.ts +0 -1010
- package/src/verifyconfig.test.ts +0 -197
package/dist/settings.d.ts
CHANGED
|
@@ -1,251 +1,12 @@
|
|
|
1
|
-
import type { IClientOptions } from 'async-mqtt';
|
|
2
|
-
import type { PlatformConfig } from 'homebridge';
|
|
3
|
-
import type { device, irdevice, SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName, SwitchBotModel } from 'node-switchbot';
|
|
4
|
-
/**
|
|
5
|
-
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
|
6
|
-
*/
|
|
7
|
-
export declare const PLATFORM_NAME = "SwitchBot";
|
|
8
|
-
/**
|
|
9
|
-
* This must match the name of your plugin as defined the package.json
|
|
10
|
-
*/
|
|
11
1
|
export declare const PLUGIN_NAME = "@switchbot/homebridge-switchbot";
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export
|
|
22
|
-
devices?: devicesConfig[];
|
|
23
|
-
deviceConfig?: {
|
|
24
|
-
[deviceType: string]: devicesConfig;
|
|
25
|
-
};
|
|
26
|
-
irdevices?: irDevicesConfig[];
|
|
27
|
-
irdeviceConfig?: {
|
|
28
|
-
[remoteType: string]: irDevicesConfig;
|
|
29
|
-
};
|
|
30
|
-
allowInvalidCharacters?: boolean;
|
|
31
|
-
mqttURL?: string;
|
|
32
|
-
mqttOptions?: IClientOptions;
|
|
33
|
-
mqttPubOptions?: IClientOptions;
|
|
34
|
-
BLE?: boolean;
|
|
35
|
-
discoverBLE?: boolean;
|
|
36
|
-
disableLogsforBLE?: boolean;
|
|
37
|
-
disableLogsforOpenAPI?: boolean;
|
|
38
|
-
hostname?: string;
|
|
39
|
-
webhookURL?: string;
|
|
40
|
-
maxRetries?: number;
|
|
41
|
-
delayBetweenRetries?: number;
|
|
42
|
-
refreshRate?: number;
|
|
43
|
-
updateRate?: number;
|
|
44
|
-
pushRate?: number;
|
|
45
|
-
logging?: string;
|
|
46
|
-
}
|
|
47
|
-
export type devicesConfig = botConfig | relaySwitch1Config | relaySwitch1PMConfig | meterConfig | meterProConfig | indoorOutdoorSensorConfig | humidifierConfig | curtainConfig | blindTiltConfig | contactConfig | motionConfig | waterDetectorConfig | plugConfig | colorBulbConfig | stripLightConfig | ceilingLightConfig | lockConfig | hubConfig;
|
|
48
|
-
export interface BaseDeviceConfig extends device {
|
|
49
|
-
bleMac?: string;
|
|
50
|
-
model: SwitchBotModel;
|
|
51
|
-
bleModel: SwitchBotBLEModel;
|
|
52
|
-
bleModelName: SwitchBotBLEModelName;
|
|
53
|
-
bleModelFriednlyName: SwitchBotBLEModelFriendlyName;
|
|
54
|
-
configDeviceType: string;
|
|
55
|
-
configDeviceName?: string;
|
|
56
|
-
deviceId: string;
|
|
57
|
-
external?: boolean;
|
|
58
|
-
refreshRate?: number;
|
|
59
|
-
updateRate?: number;
|
|
60
|
-
pushRate?: number;
|
|
61
|
-
firmware?: string;
|
|
62
|
-
logging?: string;
|
|
63
|
-
connectionType?: string;
|
|
64
|
-
customBLEaddress?: string;
|
|
65
|
-
scanDuration?: number;
|
|
66
|
-
hide_device?: boolean;
|
|
67
|
-
offline?: boolean;
|
|
68
|
-
maxRetry?: number;
|
|
69
|
-
maxRetries?: number;
|
|
70
|
-
delayBetweenRetries?: number;
|
|
71
|
-
disableCaching?: boolean;
|
|
72
|
-
disablePlatformBLE?: boolean;
|
|
73
|
-
mqttURL?: string;
|
|
74
|
-
mqttOptions?: IClientOptions;
|
|
75
|
-
mqttPubOptions?: IClientOptions;
|
|
76
|
-
history?: boolean;
|
|
77
|
-
webhook?: boolean;
|
|
78
|
-
}
|
|
79
|
-
export interface botConfig extends BaseDeviceConfig {
|
|
80
|
-
configDeviceType: 'Bot';
|
|
81
|
-
mode?: string;
|
|
82
|
-
type: string;
|
|
83
|
-
doublePress?: number;
|
|
84
|
-
pushRatePress?: number;
|
|
85
|
-
allowPush?: boolean;
|
|
86
|
-
multiPress?: boolean;
|
|
87
|
-
}
|
|
88
|
-
export interface relaySwitch1Config extends BaseDeviceConfig {
|
|
89
|
-
configDeviceType: 'Relay Switch 1';
|
|
90
|
-
type: string;
|
|
91
|
-
allowPush?: boolean;
|
|
92
|
-
}
|
|
93
|
-
export interface relaySwitch1PMConfig extends BaseDeviceConfig {
|
|
94
|
-
configDeviceType: 'Relay Switch 1PM';
|
|
95
|
-
type: string;
|
|
96
|
-
allowPush?: boolean;
|
|
97
|
-
}
|
|
98
|
-
export interface meterConfig extends BaseDeviceConfig {
|
|
99
|
-
configDeviceType: 'Meter' | 'MeterPlus';
|
|
100
|
-
hide_temperature?: boolean;
|
|
101
|
-
convertUnitTo?: string;
|
|
102
|
-
hide_humidity?: boolean;
|
|
103
|
-
}
|
|
104
|
-
export interface meterProConfig extends BaseDeviceConfig {
|
|
105
|
-
configDeviceType: 'Meter Pro' | 'MeterPro(CO2)';
|
|
106
|
-
hide_temperature?: boolean;
|
|
107
|
-
convertUnitTo?: string;
|
|
108
|
-
hide_humidity?: boolean;
|
|
109
|
-
hide_co2?: boolean;
|
|
110
|
-
}
|
|
111
|
-
export interface indoorOutdoorSensorConfig extends BaseDeviceConfig {
|
|
112
|
-
configDeviceType: 'WoIOSensor';
|
|
113
|
-
hide_temperature?: boolean;
|
|
114
|
-
convertUnitTo?: string;
|
|
115
|
-
hide_humidity?: boolean;
|
|
116
|
-
}
|
|
117
|
-
export interface humidifierConfig extends BaseDeviceConfig {
|
|
118
|
-
configDeviceType: 'Humidifier' | 'Humidifier2';
|
|
119
|
-
hide_temperature?: boolean;
|
|
120
|
-
convertUnitTo?: string;
|
|
121
|
-
set_minStep?: number;
|
|
122
|
-
}
|
|
123
|
-
export interface curtainConfig extends BaseDeviceConfig {
|
|
124
|
-
configDeviceType: 'Curtain' | 'Curtain3' | 'WoRollerShade' | 'Roller Shade';
|
|
125
|
-
disable_group?: boolean;
|
|
126
|
-
hide_lightsensor?: boolean;
|
|
127
|
-
set_minLux?: number;
|
|
128
|
-
set_maxLux?: number;
|
|
129
|
-
set_max?: number;
|
|
130
|
-
set_min?: number;
|
|
131
|
-
set_minStep?: number;
|
|
132
|
-
setCloseMode?: string;
|
|
133
|
-
setOpenMode?: string;
|
|
134
|
-
silentModeSwitch?: boolean;
|
|
135
|
-
}
|
|
136
|
-
export interface blindTiltConfig extends BaseDeviceConfig {
|
|
137
|
-
configDeviceType: 'Blind Tilt';
|
|
138
|
-
disable_group?: boolean;
|
|
139
|
-
mapping?: string;
|
|
140
|
-
hide_lightsensor?: boolean;
|
|
141
|
-
set_minLux?: number;
|
|
142
|
-
set_maxLux?: number;
|
|
143
|
-
set_max?: number;
|
|
144
|
-
set_min?: number;
|
|
145
|
-
set_minStep?: number;
|
|
146
|
-
setCloseMode?: string;
|
|
147
|
-
setOpenMode?: string;
|
|
148
|
-
silentModeSwitch?: boolean;
|
|
149
|
-
}
|
|
150
|
-
export interface contactConfig extends BaseDeviceConfig {
|
|
151
|
-
configDeviceType: 'Contact Sensor';
|
|
152
|
-
hide_lightsensor?: boolean;
|
|
153
|
-
set_minLux?: number;
|
|
154
|
-
set_maxLux?: number;
|
|
155
|
-
hide_motionsensor?: boolean;
|
|
156
|
-
}
|
|
157
|
-
export interface motionConfig extends BaseDeviceConfig {
|
|
158
|
-
configDeviceType: 'Motion Sensor';
|
|
159
|
-
hide_lightsensor?: boolean;
|
|
160
|
-
set_minLux?: number;
|
|
161
|
-
set_maxLux?: number;
|
|
162
|
-
}
|
|
163
|
-
export interface waterDetectorConfig extends BaseDeviceConfig {
|
|
164
|
-
configDeviceType: 'Water Detector';
|
|
165
|
-
hide_leak?: boolean;
|
|
166
|
-
dry?: boolean;
|
|
167
|
-
}
|
|
168
|
-
export interface plugConfig extends BaseDeviceConfig {
|
|
169
|
-
configDeviceType: 'Plug' | 'Plug Mini (US)' | 'Plug Mini (JP)';
|
|
170
|
-
}
|
|
171
|
-
export interface colorBulbConfig extends BaseDeviceConfig {
|
|
172
|
-
configDeviceType: 'Color Bulb';
|
|
173
|
-
set_minStep?: number;
|
|
174
|
-
adaptiveLightingShift?: number;
|
|
175
|
-
}
|
|
176
|
-
export interface stripLightConfig extends BaseDeviceConfig {
|
|
177
|
-
configDeviceType: 'Strip Light';
|
|
178
|
-
set_minStep?: number;
|
|
179
|
-
adaptiveLightingShift?: number;
|
|
180
|
-
}
|
|
181
|
-
export interface ceilingLightConfig extends BaseDeviceConfig {
|
|
182
|
-
configDeviceType: 'Ceiling Light' | 'Ceiling Light Pro';
|
|
183
|
-
set_minStep?: number;
|
|
184
|
-
adaptiveLightingShift?: number;
|
|
185
|
-
}
|
|
186
|
-
export interface lockConfig extends BaseDeviceConfig {
|
|
187
|
-
configDeviceType: 'Smart Lock' | 'Smart Lock Pro';
|
|
188
|
-
hide_contactsensor?: boolean;
|
|
189
|
-
activate_latchbutton?: boolean;
|
|
190
|
-
}
|
|
191
|
-
export interface hubConfig extends BaseDeviceConfig {
|
|
192
|
-
configDeviceType: 'Hub 2';
|
|
193
|
-
hide_temperature?: boolean;
|
|
194
|
-
convertUnitTo?: string;
|
|
195
|
-
hide_humidity?: boolean;
|
|
196
|
-
hide_lightsensor?: boolean;
|
|
197
|
-
set_minLux?: number;
|
|
198
|
-
set_maxLux?: number;
|
|
199
|
-
}
|
|
200
|
-
export type irDevicesConfig = irFanConfig | irLightConfig | irAirConfig | irOtherConfig;
|
|
201
|
-
export interface irBaseDeviceConfig extends irdevice {
|
|
202
|
-
configDeviceName?: string;
|
|
203
|
-
configRemoteType?: string;
|
|
204
|
-
connectionType?: string;
|
|
205
|
-
hide_device?: boolean;
|
|
206
|
-
external?: boolean;
|
|
207
|
-
refreshRate?: number;
|
|
208
|
-
updateRate?: number;
|
|
209
|
-
pushRate?: number;
|
|
210
|
-
maxRetries?: number;
|
|
211
|
-
delayBetweenRetries?: number;
|
|
212
|
-
firmware?: string;
|
|
213
|
-
deviceId: string;
|
|
214
|
-
logging?: string;
|
|
215
|
-
customOn?: string;
|
|
216
|
-
customOff?: string;
|
|
217
|
-
customize?: boolean;
|
|
218
|
-
commandType?: string;
|
|
219
|
-
disablePushOn?: boolean;
|
|
220
|
-
disablePushOff?: boolean;
|
|
221
|
-
disablePushDetail?: boolean;
|
|
222
|
-
}
|
|
223
|
-
export interface irFanConfig extends irBaseDeviceConfig {
|
|
224
|
-
configRemoteType?: 'Fan' | 'DIY Fan';
|
|
225
|
-
swing_mode?: boolean;
|
|
226
|
-
rotation_speed?: boolean;
|
|
227
|
-
set_minStep?: number;
|
|
228
|
-
set_max?: number;
|
|
229
|
-
set_min?: number;
|
|
230
|
-
}
|
|
231
|
-
export interface irLightConfig extends irBaseDeviceConfig {
|
|
232
|
-
configRemoteType?: 'Light' | 'DIY Light';
|
|
233
|
-
stateless?: boolean;
|
|
234
|
-
}
|
|
235
|
-
export interface irAirConfig extends irBaseDeviceConfig {
|
|
236
|
-
configRemoteType?: 'Air Conditioner' | 'DIY Air Conditioner';
|
|
237
|
-
hide_automode?: boolean;
|
|
238
|
-
set_max_heat?: number;
|
|
239
|
-
set_min_heat?: number;
|
|
240
|
-
set_max_cool?: number;
|
|
241
|
-
set_min_cool?: number;
|
|
242
|
-
meterType?: string;
|
|
243
|
-
meterId?: string;
|
|
244
|
-
meterUuid?: string;
|
|
245
|
-
}
|
|
246
|
-
export interface irOtherConfig extends irBaseDeviceConfig {
|
|
247
|
-
configRemoteType?: 'Others';
|
|
248
|
-
type?: string;
|
|
249
|
-
}
|
|
250
|
-
export {};
|
|
2
|
+
export declare const PLATFORM_NAME = "SwitchBot";
|
|
3
|
+
export interface SwitchBotPluginConfig {
|
|
4
|
+
openApiToken?: string;
|
|
5
|
+
openApiSecret?: string;
|
|
6
|
+
preferMatter?: boolean;
|
|
7
|
+
enableMatter?: boolean;
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}
|
|
10
|
+
export declare const DEFAULT_CONFIG: Partial<SwitchBotPluginConfig>;
|
|
11
|
+
export type DeviceType = string;
|
|
251
12
|
//# sourceMappingURL=settings.d.ts.map
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,oCAAoC,CAAA;AAC5D,eAAO,MAAM,aAAa,cAAc,CAAA;AAExC,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,qBAAqB,CAGzD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA"}
|
package/dist/settings.js
CHANGED
|
@@ -1,32 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
|
3
|
-
*/
|
|
4
|
-
export const PLATFORM_NAME = 'SwitchBot';
|
|
5
|
-
/**
|
|
6
|
-
* This must match the name of your plugin as defined the package.json
|
|
7
|
-
*/
|
|
8
1
|
export const PLUGIN_NAME = '@switchbot/homebridge-switchbot';
|
|
9
|
-
;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
;
|
|
14
|
-
;
|
|
15
|
-
;
|
|
16
|
-
;
|
|
17
|
-
;
|
|
18
|
-
;
|
|
19
|
-
;
|
|
20
|
-
;
|
|
21
|
-
;
|
|
22
|
-
;
|
|
23
|
-
;
|
|
24
|
-
;
|
|
25
|
-
;
|
|
26
|
-
;
|
|
27
|
-
;
|
|
28
|
-
;
|
|
29
|
-
;
|
|
30
|
-
;
|
|
31
|
-
;
|
|
2
|
+
export const PLATFORM_NAME = 'SwitchBot';
|
|
3
|
+
export const DEFAULT_CONFIG = {
|
|
4
|
+
preferMatter: true,
|
|
5
|
+
enableMatter: true,
|
|
6
|
+
};
|
|
32
7
|
//# sourceMappingURL=settings.js.map
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAA;AAWxC,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;CACnB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SwitchBotPluginConfig } from './settings';
|
|
2
|
+
export interface ISwitchBotClient {
|
|
3
|
+
init(): Promise<void>;
|
|
4
|
+
getDevice(id: string): Promise<any>;
|
|
5
|
+
destroy(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare class SwitchBotClient implements ISwitchBotClient {
|
|
8
|
+
private cfg;
|
|
9
|
+
private client;
|
|
10
|
+
private baseUrl;
|
|
11
|
+
private requestTimeout;
|
|
12
|
+
private maxRetries;
|
|
13
|
+
private baseBackoffMs;
|
|
14
|
+
private maxBackoffMs;
|
|
15
|
+
private backoffFactor;
|
|
16
|
+
private jitter;
|
|
17
|
+
private writeDebounceMs;
|
|
18
|
+
private logger;
|
|
19
|
+
private perDeviceRetries;
|
|
20
|
+
private perDeviceMaxRetries;
|
|
21
|
+
private perDeviceCooldownMs;
|
|
22
|
+
private perDeviceCooldownUntil;
|
|
23
|
+
constructor(cfg: SwitchBotPluginConfig);
|
|
24
|
+
private pendingWrites;
|
|
25
|
+
init(): Promise<void>;
|
|
26
|
+
private fetchWithTimeoutAndRetry;
|
|
27
|
+
getDevice(id: string): Promise<any>;
|
|
28
|
+
setDeviceState(id: string, body: any): Promise<any>;
|
|
29
|
+
private _doSetDeviceState;
|
|
30
|
+
destroy(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=switchbotClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switchbotClient.d.ts","sourceRoot":"","sources":["../src/switchbotClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAGD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAoC;IAEnD,OAAO,CAAC,cAAc,CAAO;IAC7B,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,MAAM,CAAO;IAGrB,OAAO,CAAC,eAAe,CAAM;IAE7B,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,sBAAsB,CAAiC;gBAEnD,GAAG,EAAE,qBAAqB;IAetC,OAAO,CAAC,aAAa,CAA0H;IAEzI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAoBb,wBAAwB;IAkHhC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAcnC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YAiC3C,iBAAiB;IA6BzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// Adapter that tries to use the node-switchbot v4 hybrid API when available.
|
|
2
|
+
export class SwitchBotClient {
|
|
3
|
+
cfg;
|
|
4
|
+
client = null;
|
|
5
|
+
baseUrl = 'https://api.switch-bot.com/v1.0';
|
|
6
|
+
// configurable network options
|
|
7
|
+
requestTimeout = 5000;
|
|
8
|
+
maxRetries = 2;
|
|
9
|
+
baseBackoffMs = 100;
|
|
10
|
+
maxBackoffMs = 2000;
|
|
11
|
+
backoffFactor = 2;
|
|
12
|
+
jitter = true;
|
|
13
|
+
// per-device write debounce (ms). 0 = disabled. Configurable via plugin options.
|
|
14
|
+
// Default enabled to coalesce rapid writes and prevent command floods.
|
|
15
|
+
writeDebounceMs = 100;
|
|
16
|
+
// structured logger (expects info/warn/error/debug); defaults to console
|
|
17
|
+
logger;
|
|
18
|
+
// per-device retry tracking
|
|
19
|
+
perDeviceRetries = new Map();
|
|
20
|
+
perDeviceMaxRetries = 3;
|
|
21
|
+
// per-device cooldown after exceeding retries (ms)
|
|
22
|
+
perDeviceCooldownMs = 60_000;
|
|
23
|
+
perDeviceCooldownUntil = new Map();
|
|
24
|
+
constructor(cfg) {
|
|
25
|
+
this.cfg = cfg;
|
|
26
|
+
this.logger = cfg?.logger ?? console;
|
|
27
|
+
if (typeof cfg?.requestTimeout === 'number')
|
|
28
|
+
this.requestTimeout = cfg.requestTimeout;
|
|
29
|
+
if (typeof cfg?.maxRetries === 'number')
|
|
30
|
+
this.maxRetries = cfg.maxRetries;
|
|
31
|
+
if (typeof cfg?.perDeviceMaxRetries === 'number')
|
|
32
|
+
this.perDeviceMaxRetries = cfg.perDeviceMaxRetries;
|
|
33
|
+
if (typeof cfg?.baseBackoffMs === 'number')
|
|
34
|
+
this.baseBackoffMs = cfg.baseBackoffMs;
|
|
35
|
+
if (typeof cfg?.maxBackoffMs === 'number')
|
|
36
|
+
this.maxBackoffMs = cfg.maxBackoffMs;
|
|
37
|
+
if (typeof cfg?.backoffFactor === 'number')
|
|
38
|
+
this.backoffFactor = cfg.backoffFactor;
|
|
39
|
+
if (typeof cfg?.jitter === 'boolean')
|
|
40
|
+
this.jitter = cfg.jitter;
|
|
41
|
+
if (typeof cfg?.perDeviceCooldownMs === 'number')
|
|
42
|
+
this.perDeviceCooldownMs = cfg.perDeviceCooldownMs;
|
|
43
|
+
if (typeof cfg?.writeDebounceMs === 'number')
|
|
44
|
+
this.writeDebounceMs = cfg.writeDebounceMs;
|
|
45
|
+
}
|
|
46
|
+
// pending writes coalescing: deviceId -> { timer, body, resolvers }
|
|
47
|
+
pendingWrites = new Map();
|
|
48
|
+
async init() {
|
|
49
|
+
// Try to dynamically import the new node-switchbot package. If it exposes
|
|
50
|
+
// a hybrid client we will use it. Otherwise the consumer can implement
|
|
51
|
+
// OpenAPI fallback logic here.
|
|
52
|
+
try {
|
|
53
|
+
const mod = await import('node-switchbot');
|
|
54
|
+
// The new library may export a default or named client. Try common names.
|
|
55
|
+
const m = mod;
|
|
56
|
+
this.client = m?.default ?? m?.SwitchBot ?? m;
|
|
57
|
+
if (typeof this.client === 'function') {
|
|
58
|
+
// some builds export a constructor
|
|
59
|
+
this.client = new this.client({ token: this.cfg.openApiToken });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
// If import fails, leave client null and rely on OpenAPI code paths later.
|
|
64
|
+
this.logger?.warn?.('node-switchbot import failed; falling back to OpenAPI when token available');
|
|
65
|
+
this.client = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async fetchWithTimeoutAndRetry(url, opts = {}, timeoutMs, retries, deviceId) {
|
|
69
|
+
const to = typeof timeoutMs === 'number' ? timeoutMs : this.requestTimeout;
|
|
70
|
+
const max = typeof retries === 'number' ? retries : this.maxRetries;
|
|
71
|
+
// Check per-device cooldown
|
|
72
|
+
if (deviceId) {
|
|
73
|
+
const until = this.perDeviceCooldownUntil.get(deviceId) ?? 0;
|
|
74
|
+
if (Date.now() < until) {
|
|
75
|
+
const ms = until - Date.now();
|
|
76
|
+
this.logger?.warn?.('device in cooldown, aborting fetch', { deviceId, cooldownMs: ms });
|
|
77
|
+
throw new Error(`device ${deviceId} in cooldown for ${ms}ms`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
let attempt = 0;
|
|
81
|
+
while (true) {
|
|
82
|
+
attempt += 1;
|
|
83
|
+
// AbortController-based timeout
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const timer = setTimeout(() => controller.abort(), to);
|
|
86
|
+
try {
|
|
87
|
+
this.logger?.debug?.('fetch', { url, attempt, deviceId });
|
|
88
|
+
const fetchOpts = Object.assign({}, opts);
|
|
89
|
+
try {
|
|
90
|
+
Object.defineProperty(fetchOpts, 'signal', { value: controller.signal, enumerable: false, configurable: true });
|
|
91
|
+
}
|
|
92
|
+
catch (_e) {
|
|
93
|
+
// ignore environments where defineProperty may fail
|
|
94
|
+
}
|
|
95
|
+
const resp = await fetch(url, fetchOpts);
|
|
96
|
+
clearTimeout(timer);
|
|
97
|
+
// helper to safely read response body when available
|
|
98
|
+
const safeReadBody = async (r) => {
|
|
99
|
+
try {
|
|
100
|
+
if (!r)
|
|
101
|
+
return '';
|
|
102
|
+
if (typeof r.text === 'function')
|
|
103
|
+
return await r.text();
|
|
104
|
+
if (typeof r.json === 'function') {
|
|
105
|
+
const j = await r.json().catch(() => null);
|
|
106
|
+
return j ? JSON.stringify(j) : '';
|
|
107
|
+
}
|
|
108
|
+
return String(r);
|
|
109
|
+
}
|
|
110
|
+
catch (_e) {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
// Some tests/mocks provide response-like objects without numeric `status`.
|
|
115
|
+
// In those cases attempt to parse the body and return a Response-like
|
|
116
|
+
// object so callers (resp.json()) continue to work instead of forcing
|
|
117
|
+
// a retry path.
|
|
118
|
+
if (typeof resp.status !== 'number') {
|
|
119
|
+
const bodyStr = await safeReadBody(resp);
|
|
120
|
+
try {
|
|
121
|
+
const parsed = bodyStr ? JSON.parse(bodyStr) : {};
|
|
122
|
+
if (deviceId)
|
|
123
|
+
this.perDeviceRetries.set(deviceId, 0);
|
|
124
|
+
return { ok: true, status: 200, json: async () => parsed };
|
|
125
|
+
}
|
|
126
|
+
catch (_e) {
|
|
127
|
+
if (deviceId)
|
|
128
|
+
this.perDeviceRetries.set(deviceId, 0);
|
|
129
|
+
return { ok: true, status: 200, json: async () => ({ body: bodyStr }) };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// classify response
|
|
133
|
+
if (resp.ok) {
|
|
134
|
+
if (deviceId)
|
|
135
|
+
this.perDeviceRetries.set(deviceId, 0);
|
|
136
|
+
return resp;
|
|
137
|
+
}
|
|
138
|
+
// Do not retry on client errors (4xx), except 429 (rate limit)
|
|
139
|
+
if (resp.status >= 400 && resp.status < 500 && resp.status !== 429) {
|
|
140
|
+
const body = await safeReadBody(resp);
|
|
141
|
+
this.logger?.error?.('fetch non-retriable response', { url, status: resp.status, body });
|
|
142
|
+
const err = new Error(`HTTP ${resp.status}`);
|
|
143
|
+
err.status = resp.status;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
// server error / rate limit: treat as retriable
|
|
147
|
+
const body = await safeReadBody(resp);
|
|
148
|
+
this.logger?.warn?.('fetch retriable response', { url, status: resp.status, body });
|
|
149
|
+
// throw to enter retry/catch logic below and apply backoff
|
|
150
|
+
throw new Error(`retriable response: ${resp.status || 'unknown'}`);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
const isAbort = err?.name === 'AbortError' || err?.message === 'The user aborted a request.' || err?.message === 'timeout';
|
|
155
|
+
const reason = isAbort ? 'timeout' : err?.message ?? String(err);
|
|
156
|
+
this.logger?.warn?.('fetch failed', { url, attempt, deviceId, reason });
|
|
157
|
+
// per-device retry guard
|
|
158
|
+
if (deviceId) {
|
|
159
|
+
const prev = this.perDeviceRetries.get(deviceId) ?? 0;
|
|
160
|
+
const next = prev + 1;
|
|
161
|
+
this.perDeviceRetries.set(deviceId, next);
|
|
162
|
+
if (next > this.perDeviceMaxRetries) {
|
|
163
|
+
this.logger?.error?.('per-device retry limit exceeded, entering cooldown', { deviceId, attempts: next });
|
|
164
|
+
this.perDeviceCooldownUntil.set(deviceId, Date.now() + this.perDeviceCooldownMs);
|
|
165
|
+
throw new Error(`per-device retry limit exceeded for ${deviceId}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (attempt > max)
|
|
169
|
+
throw err;
|
|
170
|
+
// exponential backoff with optional jitter
|
|
171
|
+
let backoff = Math.min(this.baseBackoffMs * Math.pow(this.backoffFactor, attempt - 1), this.maxBackoffMs);
|
|
172
|
+
if (this.jitter) {
|
|
173
|
+
const jitterVal = Math.floor(Math.random() * backoff);
|
|
174
|
+
backoff = Math.floor(backoff / 2) + jitterVal;
|
|
175
|
+
}
|
|
176
|
+
this.logger?.debug?.('backoff before retry', { url, attempt, backoff });
|
|
177
|
+
await new Promise((r) => setTimeout(r, backoff));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async getDevice(id) {
|
|
182
|
+
if (this.client && typeof this.client.getDevice === 'function') {
|
|
183
|
+
return this.client.getDevice(id);
|
|
184
|
+
}
|
|
185
|
+
// Fallback: call OpenAPI via HTTP using token if available.
|
|
186
|
+
if (this.cfg.openApiToken) {
|
|
187
|
+
const url = `${this.baseUrl}/devices/${id}`;
|
|
188
|
+
const opts = { headers: { Authorization: this.cfg.openApiToken } };
|
|
189
|
+
const resp = await this.fetchWithTimeoutAndRetry(url, opts, undefined, undefined, id);
|
|
190
|
+
return resp.json();
|
|
191
|
+
}
|
|
192
|
+
throw new Error('No SwitchBot client available');
|
|
193
|
+
}
|
|
194
|
+
async setDeviceState(id, body) {
|
|
195
|
+
// If debounce is disabled do a direct write path
|
|
196
|
+
if (!this.writeDebounceMs || this.writeDebounceMs <= 0) {
|
|
197
|
+
return this._doSetDeviceState(id, body);
|
|
198
|
+
}
|
|
199
|
+
// Coalesce writes per-device within debounce window. Last write wins.
|
|
200
|
+
return new Promise((resolve, reject) => {
|
|
201
|
+
const existing = this.pendingWrites.get(id);
|
|
202
|
+
if (existing) {
|
|
203
|
+
existing.body = body;
|
|
204
|
+
existing.resolvers.push({ resolve, reject });
|
|
205
|
+
// timer already scheduled
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const resolvers = [{ resolve, reject }];
|
|
209
|
+
const timer = setTimeout(async () => {
|
|
210
|
+
const entry = this.pendingWrites.get(id);
|
|
211
|
+
if (!entry)
|
|
212
|
+
return;
|
|
213
|
+
this.pendingWrites.delete(id);
|
|
214
|
+
try {
|
|
215
|
+
const out = await this._doSetDeviceState(id, entry.body);
|
|
216
|
+
for (const r of entry.resolvers)
|
|
217
|
+
r.resolve(out);
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
for (const r of entry.resolvers)
|
|
221
|
+
r.reject(e);
|
|
222
|
+
}
|
|
223
|
+
}, this.writeDebounceMs);
|
|
224
|
+
this.pendingWrites.set(id, { timer, body, resolvers });
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
async _doSetDeviceState(id, body) {
|
|
228
|
+
// Prefer client API
|
|
229
|
+
if (this.client && typeof this.client.setDeviceState === 'function') {
|
|
230
|
+
return this.client.setDeviceState(id, body);
|
|
231
|
+
}
|
|
232
|
+
// Try generic command methods
|
|
233
|
+
if (this.client && typeof this.client.sendCommand === 'function') {
|
|
234
|
+
return this.client.sendCommand(id, body);
|
|
235
|
+
}
|
|
236
|
+
// OpenAPI fallback
|
|
237
|
+
if (this.cfg.openApiToken) {
|
|
238
|
+
const url = `${this.baseUrl}/devices/${id}/commands`;
|
|
239
|
+
const opts = {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
headers: {
|
|
242
|
+
Authorization: this.cfg.openApiToken,
|
|
243
|
+
'Content-Type': 'application/json',
|
|
244
|
+
},
|
|
245
|
+
body: JSON.stringify(body),
|
|
246
|
+
};
|
|
247
|
+
const resp = await this.fetchWithTimeoutAndRetry(url, opts, undefined, undefined, id);
|
|
248
|
+
return resp.json();
|
|
249
|
+
}
|
|
250
|
+
throw new Error('No SwitchBot client available for setDeviceState');
|
|
251
|
+
}
|
|
252
|
+
async destroy() {
|
|
253
|
+
if (this.client && typeof this.client.destroy === 'function') {
|
|
254
|
+
await this.client.destroy();
|
|
255
|
+
}
|
|
256
|
+
this.client = null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=switchbotClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switchbotClient.js","sourceRoot":"","sources":["../src/switchbotClient.ts"],"names":[],"mappings":"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"}
|