@switchbot/homebridge-switchbot 5.0.0-beta.70 → 5.0.0-beta.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
- package/.github/workflows/ci.yml +61 -0
- package/.github/workflows/manual-e2e.yml +103 -0
- package/CHANGELOG.md +20 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +44 -0
- package/README.md +11 -0
- package/config.schema.json +99 -1940
- package/dist/deviceFactory.d.ts +13 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +81 -0
- package/dist/deviceFactory.js.map +1 -0
- package/dist/devices/deviceBase.d.ts +50 -0
- package/dist/devices/deviceBase.d.ts.map +1 -0
- package/dist/devices/deviceBase.js +119 -0
- package/dist/devices/deviceBase.js.map +1 -0
- package/dist/devices/genericDevice.d.ts +283 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1035 -0
- package/dist/devices/genericDevice.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +72 -440
- package/dist/homebridge-ui/server.d.ts +3 -1
- package/dist/homebridge-ui/server.d.ts.map +1 -1
- package/dist/homebridge-ui/server.js +47 -10
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +27 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +404 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +10 -317
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +5 -30
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +32 -0
- package/dist/switchbotClient.d.ts.map +1 -0
- package/dist/switchbotClient.js +259 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +36 -248
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +38 -1367
- package/dist/utils.js.map +1 -1
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/style.css +3 -3
- package/docs/index.html +50 -15
- package/docs/variables/default.html +1 -1
- package/package.json +19 -18
- package/scripts/e2e/README.md +25 -0
- package/scripts/e2e/curtain-e2e.sh +70 -0
- package/scripts/e2e/fan-e2e.sh +75 -0
- package/scripts/e2e/light-advanced-e2e.sh +97 -0
- package/scripts/e2e/light-e2e.sh +75 -0
- package/scripts/e2e/list-accessories.sh +19 -0
- package/scripts/e2e/lock-e2e.sh +65 -0
- package/scripts/generate-matter-maps.js +60 -0
- package/scripts/run-e2e-local.sh +14 -0
- package/src/deviceFactory.ts +122 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +965 -0
- package/src/homebridge-ui/public/index.html +72 -440
- package/src/homebridge-ui/server.ts +52 -10
- package/src/index.ts +3 -5
- package/src/platform.ts +395 -0
- package/src/settings.ts +12 -352
- package/src/switchbotClient.ts +266 -0
- package/src/utils.ts +47 -1456
- package/test/accessory-restore.spec.ts +73 -0
- package/test/device-mapping.spec.ts +37 -0
- package/test/deviceFactory.spec.ts +18 -0
- package/test/e2e/run-e2e.spec.ts +50 -0
- package/test/fan-swing.spec.ts +29 -0
- package/test/helpers/matter-harness.ts +53 -0
- package/test/lock-users.spec.ts +44 -0
- package/test/matter-childbridge.spec.ts +55 -0
- package/test/matter-descriptors.spec.ts +97 -0
- package/test/matter-device-state.spec.ts +101 -0
- package/test/matter-integration.spec.ts +70 -0
- package/test/platform.integration.spec.ts +55 -0
- package/test/switchbot-client-debounce.spec.ts +131 -0
- package/test/switchbot-client-openapi.spec.ts +56 -0
- package/test/switchbotClient.spec.ts +10 -0
- package/test/utils.spec.ts +20 -0
- package/vitest.config.ts +7 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -15847
- package/coverage/coverage-final.json +0 -42
- package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
- package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
- package/coverage/docs/assets/dmt/index.html +0 -131
- package/coverage/docs/assets/hierarchy.js.html +0 -85
- package/coverage/docs/assets/icons.js.html +0 -136
- package/coverage/docs/assets/index.html +0 -146
- package/coverage/docs/assets/main.js.html +0 -265
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -191
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/src/device/blindtilt.ts.html +0 -3238
- package/coverage/src/device/bot.ts.html +0 -2803
- package/coverage/src/device/ceilinglight.ts.html +0 -2338
- package/coverage/src/device/colorbulb.ts.html +0 -2824
- package/coverage/src/device/contact.ts.html +0 -1465
- package/coverage/src/device/curtain.ts.html +0 -2869
- package/coverage/src/device/device.ts.html +0 -2500
- package/coverage/src/device/fan.ts.html +0 -2242
- package/coverage/src/device/hub.ts.html +0 -1408
- package/coverage/src/device/humidifier.ts.html +0 -2116
- package/coverage/src/device/index.html +0 -416
- package/coverage/src/device/iosensor.ts.html +0 -1375
- package/coverage/src/device/lightstrip.ts.html +0 -2617
- package/coverage/src/device/lock.ts.html +0 -1963
- package/coverage/src/device/meter.ts.html +0 -1372
- package/coverage/src/device/meterplus.ts.html +0 -1384
- package/coverage/src/device/meterpro.ts.html +0 -1618
- package/coverage/src/device/motion.ts.html +0 -1264
- package/coverage/src/device/plug.ts.html +0 -1372
- package/coverage/src/device/relayswitch.ts.html +0 -2284
- package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
- package/coverage/src/device/waterdetector.ts.html +0 -1294
- package/coverage/src/homebridge-ui/index.html +0 -116
- package/coverage/src/homebridge-ui/server.ts.html +0 -229
- package/coverage/src/index.html +0 -161
- package/coverage/src/index.ts.html +0 -124
- package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
- package/coverage/src/irdevice/airpurifier.ts.html +0 -844
- package/coverage/src/irdevice/camera.ts.html +0 -475
- package/coverage/src/irdevice/fan.ts.html +0 -766
- package/coverage/src/irdevice/index.html +0 -251
- package/coverage/src/irdevice/irdevice.ts.html +0 -1117
- package/coverage/src/irdevice/light.ts.html +0 -826
- package/coverage/src/irdevice/other.ts.html +0 -2458
- package/coverage/src/irdevice/tv.ts.html +0 -1222
- package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
- package/coverage/src/irdevice/waterheater.ts.html +0 -469
- package/coverage/src/platform.ts.html +0 -8776
- package/coverage/src/settings.ts.html +0 -934
- package/coverage/src/utils.ts.html +0 -2092
- package/dist/devices-hap/airpurifier.d.ts +0 -54
- package/dist/devices-hap/airpurifier.d.ts.map +0 -1
- package/dist/devices-hap/airpurifier.js +0 -533
- package/dist/devices-hap/airpurifier.js.map +0 -1
- package/dist/devices-hap/blindtilt.d.ts +0 -90
- package/dist/devices-hap/blindtilt.d.ts.map +0 -1
- package/dist/devices-hap/blindtilt.js +0 -974
- package/dist/devices-hap/blindtilt.js.map +0 -1
- package/dist/devices-hap/bot.d.ts +0 -102
- package/dist/devices-hap/bot.d.ts.map +0 -1
- package/dist/devices-hap/bot.js +0 -822
- package/dist/devices-hap/bot.js.map +0 -1
- package/dist/devices-hap/ceilinglight.d.ts +0 -85
- package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
- package/dist/devices-hap/ceilinglight.js +0 -707
- package/dist/devices-hap/ceilinglight.js.map +0 -1
- package/dist/devices-hap/colorbulb.d.ts +0 -88
- package/dist/devices-hap/colorbulb.d.ts.map +0 -1
- package/dist/devices-hap/colorbulb.js +0 -921
- package/dist/devices-hap/colorbulb.js.map +0 -1
- package/dist/devices-hap/contact.d.ts +0 -44
- package/dist/devices-hap/contact.d.ts.map +0 -1
- package/dist/devices-hap/contact.js +0 -409
- package/dist/devices-hap/contact.js.map +0 -1
- package/dist/devices-hap/curtain.d.ts +0 -73
- package/dist/devices-hap/curtain.d.ts.map +0 -1
- package/dist/devices-hap/curtain.js +0 -869
- package/dist/devices-hap/curtain.js.map +0 -1
- package/dist/devices-hap/device.d.ts +0 -108
- package/dist/devices-hap/device.d.ts.map +0 -1
- package/dist/devices-hap/device.js +0 -821
- package/dist/devices-hap/device.js.map +0 -1
- package/dist/devices-hap/fan.d.ts +0 -69
- package/dist/devices-hap/fan.d.ts.map +0 -1
- package/dist/devices-hap/fan.js +0 -655
- package/dist/devices-hap/fan.js.map +0 -1
- package/dist/devices-hap/hub.d.ts +0 -37
- package/dist/devices-hap/hub.d.ts.map +0 -1
- package/dist/devices-hap/hub.js +0 -393
- package/dist/devices-hap/hub.js.map +0 -1
- package/dist/devices-hap/humidifier.d.ts +0 -73
- package/dist/devices-hap/humidifier.d.ts.map +0 -1
- package/dist/devices-hap/humidifier.js +0 -716
- package/dist/devices-hap/humidifier.js.map +0 -1
- package/dist/devices-hap/iosensor.d.ts +0 -42
- package/dist/devices-hap/iosensor.d.ts.map +0 -1
- package/dist/devices-hap/iosensor.js +0 -397
- package/dist/devices-hap/iosensor.js.map +0 -1
- package/dist/devices-hap/lightstrip.d.ts +0 -79
- package/dist/devices-hap/lightstrip.d.ts.map +0 -1
- package/dist/devices-hap/lightstrip.js +0 -827
- package/dist/devices-hap/lightstrip.js.map +0 -1
- package/dist/devices-hap/lock.d.ts +0 -53
- package/dist/devices-hap/lock.d.ts.map +0 -1
- package/dist/devices-hap/lock.js +0 -569
- package/dist/devices-hap/lock.js.map +0 -1
- package/dist/devices-hap/meter.d.ts +0 -37
- package/dist/devices-hap/meter.d.ts.map +0 -1
- package/dist/devices-hap/meter.js +0 -380
- package/dist/devices-hap/meter.js.map +0 -1
- package/dist/devices-hap/meterplus.d.ts +0 -42
- package/dist/devices-hap/meterplus.d.ts.map +0 -1
- package/dist/devices-hap/meterplus.js +0 -385
- package/dist/devices-hap/meterplus.js.map +0 -1
- package/dist/devices-hap/meterpro.d.ts +0 -43
- package/dist/devices-hap/meterpro.d.ts.map +0 -1
- package/dist/devices-hap/meterpro.js +0 -469
- package/dist/devices-hap/meterpro.js.map +0 -1
- package/dist/devices-hap/motion.d.ts +0 -42
- package/dist/devices-hap/motion.d.ts.map +0 -1
- package/dist/devices-hap/motion.js +0 -345
- package/dist/devices-hap/motion.js.map +0 -1
- package/dist/devices-hap/plug.d.ts +0 -49
- package/dist/devices-hap/plug.d.ts.map +0 -1
- package/dist/devices-hap/plug.js +0 -400
- package/dist/devices-hap/plug.js.map +0 -1
- package/dist/devices-hap/relayswitch.d.ts +0 -96
- package/dist/devices-hap/relayswitch.d.ts.map +0 -1
- package/dist/devices-hap/relayswitch.js +0 -642
- package/dist/devices-hap/relayswitch.js.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
- package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.js +0 -530
- package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
- package/dist/devices-hap/waterdetector.d.ts +0 -41
- package/dist/devices-hap/waterdetector.d.ts.map +0 -1
- package/dist/devices-hap/waterdetector.js +0 -356
- package/dist/devices-hap/waterdetector.js.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -90
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -264
- package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.js +0 -95
- package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -76
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.js +0 -34
- package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
- package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.js +0 -167
- package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
- package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.js +0 -50
- package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -106
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/FanAccessory.d.ts +0 -16
- package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
- package/dist/devices-matter/FanAccessory.js +0 -81
- package/dist/devices-matter/FanAccessory.js.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
- package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.js +0 -33
- package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.js +0 -34
- package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
- package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.js +0 -110
- package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +0 -43
- package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -61
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.js +0 -544
- package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
- package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
- package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
- package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.js +0 -95
- package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
- package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
- package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
- package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.js +0 -131
- package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
- package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
- package/dist/devices-matter/custom/index.d.ts +0 -8
- package/dist/devices-matter/custom/index.d.ts.map +0 -1
- package/dist/devices-matter/custom/index.js +0 -8
- package/dist/devices-matter/custom/index.js.map +0 -1
- package/dist/devices-matter/index.d.ts +0 -29
- package/dist/devices-matter/index.d.ts.map +0 -1
- package/dist/devices-matter/index.js +0 -28
- package/dist/devices-matter/index.js.map +0 -1
- package/dist/irdevice/airconditioner.d.ts +0 -61
- package/dist/irdevice/airconditioner.d.ts.map +0 -1
- package/dist/irdevice/airconditioner.js +0 -472
- package/dist/irdevice/airconditioner.js.map +0 -1
- package/dist/irdevice/airpurifier.d.ts +0 -50
- package/dist/irdevice/airpurifier.d.ts.map +0 -1
- package/dist/irdevice/airpurifier.js +0 -213
- package/dist/irdevice/airpurifier.js.map +0 -1
- package/dist/irdevice/camera.d.ts +0 -32
- package/dist/irdevice/camera.d.ts.map +0 -1
- package/dist/irdevice/camera.js +0 -107
- package/dist/irdevice/camera.js.map +0 -1
- package/dist/irdevice/fan.d.ts +0 -36
- package/dist/irdevice/fan.d.ts.map +0 -1
- package/dist/irdevice/fan.js +0 -200
- package/dist/irdevice/fan.js.map +0 -1
- package/dist/irdevice/irdevice.d.ts +0 -69
- package/dist/irdevice/irdevice.d.ts.map +0 -1
- package/dist/irdevice/irdevice.js +0 -339
- package/dist/irdevice/irdevice.js.map +0 -1
- package/dist/irdevice/light.d.ts +0 -36
- package/dist/irdevice/light.d.ts.map +0 -1
- package/dist/irdevice/light.js +0 -206
- package/dist/irdevice/light.js.map +0 -1
- package/dist/irdevice/other.d.ts +0 -57
- package/dist/irdevice/other.d.ts.map +0 -1
- package/dist/irdevice/other.js +0 -778
- package/dist/irdevice/other.js.map +0 -1
- package/dist/irdevice/tv.d.ts +0 -45
- package/dist/irdevice/tv.d.ts.map +0 -1
- package/dist/irdevice/tv.js +0 -327
- package/dist/irdevice/tv.js.map +0 -1
- package/dist/irdevice/vacuumcleaner.d.ts +0 -28
- package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
- package/dist/irdevice/vacuumcleaner.js +0 -104
- package/dist/irdevice/vacuumcleaner.js.map +0 -1
- package/dist/irdevice/waterheater.d.ts +0 -30
- package/dist/irdevice/waterheater.d.ts.map +0 -1
- package/dist/irdevice/waterheater.js +0 -105
- package/dist/irdevice/waterheater.js.map +0 -1
- package/dist/platform-hap.d.ts +0 -160
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -3041
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -188
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -2545
- package/dist/platform-matter.js.map +0 -1
- package/dist/test/apiRequestTracker.test.d.ts +0 -2
- package/dist/test/apiRequestTracker.test.d.ts.map +0 -1
- package/dist/test/apiRequestTracker.test.js +0 -392
- package/dist/test/apiRequestTracker.test.js.map +0 -1
- package/dist/test/hap/device-webhook-context.test.d.ts +0 -2
- package/dist/test/hap/device-webhook-context.test.d.ts.map +0 -1
- package/dist/test/hap/device-webhook-context.test.js +0 -128
- package/dist/test/hap/device-webhook-context.test.js.map +0 -1
- package/dist/test/hap/platform-hap.logging.test.d.ts +0 -2
- package/dist/test/hap/platform-hap.logging.test.d.ts.map +0 -1
- package/dist/test/hap/platform-hap.logging.test.js +0 -33
- package/dist/test/hap/platform-hap.logging.test.js.map +0 -1
- package/dist/test/hap/platform-hap.test.d.ts +0 -2
- package/dist/test/hap/platform-hap.test.d.ts.map +0 -1
- package/dist/test/hap/platform-hap.test.js +0 -62
- package/dist/test/hap/platform-hap.test.js.map +0 -1
- package/dist/test/helpers/platform-fixtures.d.ts +0 -9
- package/dist/test/helpers/platform-fixtures.d.ts.map +0 -1
- package/dist/test/helpers/platform-fixtures.js +0 -30
- package/dist/test/helpers/platform-fixtures.js.map +0 -1
- package/dist/test/homebridge-ui/server.test.d.ts +0 -2
- package/dist/test/homebridge-ui/server.test.d.ts.map +0 -1
- package/dist/test/homebridge-ui/server.test.js +0 -445
- package/dist/test/homebridge-ui/server.test.js.map +0 -1
- package/dist/test/index.test.d.ts +0 -2
- package/dist/test/index.test.d.ts.map +0 -1
- package/dist/test/index.test.js +0 -19
- package/dist/test/index.test.js.map +0 -1
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +0 -2
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +0 -1
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +0 -71
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +0 -1
- package/dist/test/matter/platform-matter.additional.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.additional.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.additional.test.js +0 -35
- package/dist/test/matter/platform-matter.additional.test.js.map +0 -1
- package/dist/test/matter/platform-matter.bleparse.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.bleparse.test.js +0 -43
- package/dist/test/matter/platform-matter.bleparse.test.js.map +0 -1
- package/dist/test/matter/platform-matter.cleanup.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.cleanup.test.js +0 -70
- package/dist/test/matter/platform-matter.cleanup.test.js.map +0 -1
- package/dist/test/matter/platform-matter.keepstale.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.keepstale.test.js +0 -27
- package/dist/test/matter/platform-matter.keepstale.test.js.map +0 -1
- package/dist/test/matter/platform-matter.logging.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.logging.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.logging.test.js +0 -29
- package/dist/test/matter/platform-matter.logging.test.js.map +0 -1
- package/dist/test/matter/platform-matter.mapping.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.mapping.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.mapping.test.js +0 -43
- package/dist/test/matter/platform-matter.mapping.test.js.map +0 -1
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.openapi-mapping.test.js +0 -84
- package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +0 -1
- package/dist/test/matter/platform-matter.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.test.js +0 -117
- package/dist/test/matter/platform-matter.test.js.map +0 -1
- package/dist/test/matter/platform-matter.unregister.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.unregister.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.unregister.test.js +0 -30
- package/dist/test/matter/platform-matter.unregister.test.js.map +0 -1
- package/dist/test/matter/platform-matter.webhook.test.d.ts +0 -2
- package/dist/test/matter/platform-matter.webhook.test.d.ts.map +0 -1
- package/dist/test/matter/platform-matter.webhook.test.js +0 -46
- package/dist/test/matter/platform-matter.webhook.test.js.map +0 -1
- package/dist/test/utils.test.d.ts +0 -2
- package/dist/test/utils.test.d.ts.map +0 -1
- package/dist/test/utils.test.js +0 -95
- package/dist/test/utils.test.js.map +0 -1
- package/dist/test/verifyconfig.test.d.ts +0 -2
- package/dist/test/verifyconfig.test.d.ts.map +0 -1
- package/dist/test/verifyconfig.test.js +0 -167
- package/dist/test/verifyconfig.test.js.map +0 -1
- package/src/custom.d.ts +0 -7
- package/src/devices-hap/airpurifier.ts +0 -568
- package/src/devices-hap/blindtilt.ts +0 -1049
- package/src/devices-hap/bot.ts +0 -910
- package/src/devices-hap/ceilinglight.ts +0 -747
- package/src/devices-hap/colorbulb.ts +0 -940
- package/src/devices-hap/contact.ts +0 -457
- package/src/devices-hap/curtain.ts +0 -944
- package/src/devices-hap/device.ts +0 -890
- package/src/devices-hap/fan.ts +0 -716
- package/src/devices-hap/hub.ts +0 -440
- package/src/devices-hap/humidifier.ts +0 -762
- package/src/devices-hap/iosensor.ts +0 -442
- package/src/devices-hap/lightstrip.ts +0 -863
- package/src/devices-hap/lock.ts +0 -627
- package/src/devices-hap/meter.ts +0 -427
- package/src/devices-hap/meterplus.ts +0 -431
- package/src/devices-hap/meterpro.ts +0 -523
- package/src/devices-hap/motion.ts +0 -390
- package/src/devices-hap/plug.ts +0 -427
- package/src/devices-hap/relayswitch.ts +0 -727
- package/src/devices-hap/robotvacuumcleaner.ts +0 -574
- package/src/devices-hap/waterdetector.ts +0 -400
- package/src/devices-matter/BaseMatterAccessory.ts +0 -302
- package/src/devices-matter/ColorLightAccessory.ts +0 -110
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -90
- package/src/devices-matter/ContactSensorAccessory.ts +0 -41
- package/src/devices-matter/DimmableLightAccessory.ts +0 -192
- package/src/devices-matter/DoorLockAccessory.ts +0 -60
- package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -122
- package/src/devices-matter/FanAccessory.ts +0 -95
- package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
- package/src/devices-matter/LeakSensorAccessory.ts +0 -40
- package/src/devices-matter/LightSensorAccessory.ts +0 -41
- package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
- package/src/devices-matter/OnOffLightAccessory.ts +0 -125
- package/src/devices-matter/OnOffOutletAccessory.ts +0 -51
- package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
- package/src/devices-matter/RoboticVacuumAccessory.ts +0 -621
- package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
- package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
- package/src/devices-matter/ThermostatAccessory.ts +0 -110
- package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
- package/src/devices-matter/WindowBlindAccessory.ts +0 -135
- package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
- package/src/devices-matter/custom/index.ts +0 -8
- package/src/devices-matter/index.ts +0 -29
- package/src/irdevice/airconditioner.ts +0 -533
- package/src/irdevice/airpurifier.ts +0 -252
- package/src/irdevice/camera.ts +0 -129
- package/src/irdevice/fan.ts +0 -226
- package/src/irdevice/irdevice.ts +0 -383
- package/src/irdevice/light.ts +0 -246
- package/src/irdevice/other.ts +0 -790
- package/src/irdevice/tv.ts +0 -378
- package/src/irdevice/vacuumcleaner.ts +0 -126
- package/src/irdevice/waterheater.ts +0 -127
- package/src/platform-hap.ts +0 -3193
- package/src/platform-matter.ts +0 -2703
- package/src/test/apiRequestTracker.test.ts +0 -417
- package/src/test/hap/device-webhook-context.test.ts +0 -136
- package/src/test/hap/platform-hap.logging.test.ts +0 -36
- package/src/test/hap/platform-hap.test.ts +0 -70
- package/src/test/helpers/platform-fixtures.ts +0 -33
- package/src/test/homebridge-ui/server.test.ts +0 -486
- package/src/test/index.test.ts +0 -24
- package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +0 -88
- package/src/test/matter/platform-matter.additional.test.ts +0 -44
- package/src/test/matter/platform-matter.bleparse.test.ts +0 -47
- package/src/test/matter/platform-matter.cleanup.test.ts +0 -86
- package/src/test/matter/platform-matter.keepstale.test.ts +0 -37
- package/src/test/matter/platform-matter.logging.test.ts +0 -33
- package/src/test/matter/platform-matter.mapping.test.ts +0 -57
- package/src/test/matter/platform-matter.openapi-mapping.test.ts +0 -109
- package/src/test/matter/platform-matter.test.ts +0 -144
- package/src/test/matter/platform-matter.unregister.test.ts +0 -39
- package/src/test/matter/platform-matter.webhook.test.ts +0 -54
- package/src/test/utils.test.ts +0 -96
- package/src/test/verifyconfig.test.ts +0 -198
|
@@ -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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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,252 +1,40 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export declare function isCurtainDevice(device: device & devicesConfig): device is (curtain | curtain3) & devicesConfig;
|
|
12
|
-
export declare function isBlindTiltDevice(device: device & devicesConfig): device is blindTilt & devicesConfig;
|
|
13
|
-
export declare function sleep(ms: number): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Check if the humidity is within the min and max range
|
|
16
|
-
* @param humidity - The humidity value
|
|
17
|
-
* @param min - The minimum humidity value
|
|
18
|
-
* @param max - The maximum humidity value
|
|
19
|
-
* @returns The humidity value
|
|
20
|
-
*/
|
|
21
|
-
export declare function validHumidity(humidity: number, min?: number, max?: number): number;
|
|
22
|
-
/**
|
|
23
|
-
* Converts the value to celsius if the temperature units are in Fahrenheit
|
|
24
|
-
*/
|
|
25
|
-
export declare function convertUnits(value: number, unit: string, convert?: string): number;
|
|
26
|
-
/**
|
|
27
|
-
* Safely serializes an object to a JSON string, handling circular references.
|
|
28
|
-
*
|
|
29
|
-
* @param obj - The object to be serialized.
|
|
30
|
-
* @returns The JSON string representation of the object.
|
|
31
|
-
*/
|
|
32
|
-
export declare function safeStringify(obj: any): string;
|
|
33
|
-
/**
|
|
34
|
-
* Formats a device ID as a MAC address.
|
|
35
|
-
* Ensures the device ID does not already contain colons.
|
|
36
|
-
*
|
|
37
|
-
* @param deviceId - The device ID to format.
|
|
38
|
-
* @param cassSensative - If the MAC address should be case sensitive. Default is false, which will return the MAC address in lowercase.
|
|
39
|
-
* @returns The formatted MAC address.
|
|
40
|
-
* @throws Will throw an error if the device ID is not a valid MAC address or a 12-character hexadecimal string.
|
|
41
|
-
*/
|
|
42
|
-
export declare function formatDeviceIdAsMac(deviceId: string, cassSensative?: boolean): string;
|
|
43
|
-
export declare function rgb2hs(r: any, g: any, b: any): number[];
|
|
44
|
-
export declare function hs2rgb(h: any, s: any): number[];
|
|
45
|
-
export declare function k2rgb(k: number): any;
|
|
46
|
-
export declare function m2hs(m: any): number[];
|
|
47
|
-
/**
|
|
48
|
-
* Factory that returns a function to send OpenAPI commands using a retry wrapper.
|
|
49
|
-
*
|
|
50
|
-
* @param retryCommandFunc - bound function that calls platform.retryCommand(device, bodyChange, maxRetries, delay)
|
|
51
|
-
* @param deviceObj - the device object to operate on
|
|
52
|
-
* @param opts - optional overrides for maxRetries and delayBetweenRetries
|
|
53
|
-
* @param opts.maxRetries - override for maxRetries
|
|
54
|
-
* @param opts.delayBetweenRetries - override for delayBetweenRetries
|
|
55
|
-
*/
|
|
56
|
-
export declare function makeOpenAPISender(retryCommandFunc: any, deviceObj: any, opts?: {
|
|
57
|
-
maxRetries?: number;
|
|
58
|
-
delayBetweenRetries?: number;
|
|
59
|
-
}): (command: string, parameter?: string) => Promise<any>;
|
|
60
|
-
/**
|
|
61
|
-
* Factory that returns a function to perform BLE actions using a SwitchBotBLE client.
|
|
62
|
-
* Handles discovery retries and method invocation on the discovered device instance.
|
|
63
|
-
*
|
|
64
|
-
* @param switchBotBLE - instance of SwitchBotBLE (may be undefined)
|
|
65
|
-
* @param deviceObj - the device object (used to obtain bleModel/deviceId)
|
|
66
|
-
* @param opts - optional retry settings
|
|
67
|
-
* @param opts.bleRetries - number of BLE discovery retries
|
|
68
|
-
* @param opts.bleRetryDelay - delay between BLE retries in ms
|
|
69
|
-
*/
|
|
70
|
-
export declare function makeBLESender(switchBotBLE: any, deviceObj: any, opts?: {
|
|
71
|
-
bleRetries?: number;
|
|
72
|
-
bleRetryDelay?: number;
|
|
73
|
-
}): (methodName: string, ...args: any[]) => Promise<any>;
|
|
74
|
-
/**
|
|
75
|
-
* Decide effective connection type for a device given platform options.
|
|
76
|
-
* Mirrors the logic previously in platform-matter.
|
|
77
|
-
*/
|
|
78
|
-
export declare function chooseConnectionType(platformOptions: any, deviceObj: any): 'BLE' | 'OpenAPI';
|
|
79
|
-
/**
|
|
80
|
-
* Detect whether Matter is enabled/available on the provided Homebridge API object.
|
|
81
|
-
* This encapsulates the multi-fallback detection used across the project.
|
|
82
|
-
*/
|
|
83
|
-
/**
|
|
84
|
-
* Detect whether Matter is enabled on the provided Homebridge API object.
|
|
85
|
-
* Returns an object with an `enabled` boolean and an optional `reason` string
|
|
86
|
-
* describing which check matched (useful for diagnostics).
|
|
87
|
-
*/
|
|
88
|
-
export declare function detectMatter(apiObj: API): {
|
|
89
|
-
enabled: boolean;
|
|
90
|
-
reason?: string;
|
|
1
|
+
import type { PlatformConfig } from 'homebridge';
|
|
2
|
+
import type { SwitchBotPluginConfig } from './settings';
|
|
3
|
+
export declare const MATTER_CLUSTER_IDS: {
|
|
4
|
+
readonly OnOff: 6;
|
|
5
|
+
readonly LevelControl: 8;
|
|
6
|
+
readonly ColorControl: 768;
|
|
7
|
+
readonly WindowCovering: 258;
|
|
8
|
+
readonly DoorLock: 257;
|
|
9
|
+
readonly FanControl: 514;
|
|
10
|
+
readonly RelativeHumidityMeasurement: 1029;
|
|
91
11
|
};
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Create a Platform proxy class that selects between two platform constructors
|
|
118
|
-
* (HAP vs Matter) at runtime using `detectMatter`. Returns a class suitable
|
|
119
|
-
* for passing to `api.registerPlatform`.
|
|
120
|
-
*/
|
|
121
|
-
export declare function createPlatformProxy(HAPCtor: any, MatterCtor: any): {
|
|
122
|
-
new (log: any, config: any, api: API): {
|
|
123
|
-
delegate: any;
|
|
124
|
-
readonly log: any;
|
|
125
|
-
readonly config: any;
|
|
126
|
-
readonly api: API;
|
|
127
|
-
configureAccessory(accessory: any): void;
|
|
128
|
-
configureMatterAccessory?(accessory: any): void;
|
|
129
|
-
get accessories(): any;
|
|
130
|
-
get matterAccessories(): any;
|
|
12
|
+
export declare const MATTER_ATTRIBUTE_IDS: {
|
|
13
|
+
readonly OnOff: {
|
|
14
|
+
readonly OnOff: 0;
|
|
15
|
+
};
|
|
16
|
+
readonly LevelControl: {
|
|
17
|
+
readonly CurrentLevel: 0;
|
|
18
|
+
};
|
|
19
|
+
readonly ColorControl: {
|
|
20
|
+
readonly CurrentHue: 0;
|
|
21
|
+
readonly CurrentSaturation: 1;
|
|
22
|
+
readonly ColorTemperatureMireds: 2;
|
|
23
|
+
};
|
|
24
|
+
readonly WindowCovering: {
|
|
25
|
+
readonly CurrentPosition: 0;
|
|
26
|
+
readonly TargetPosition: 1;
|
|
27
|
+
};
|
|
28
|
+
readonly FanControl: {
|
|
29
|
+
readonly SpeedCurrent: 0;
|
|
30
|
+
};
|
|
31
|
+
readonly DoorLock: {
|
|
32
|
+
readonly LockState: 0;
|
|
33
|
+
};
|
|
34
|
+
readonly RelativeHumidityMeasurement: {
|
|
35
|
+
readonly MeasuredValue: 0;
|
|
131
36
|
};
|
|
132
37
|
};
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* Tracks requests per day with automatic midnight rollover
|
|
136
|
-
*/
|
|
137
|
-
export declare class ApiRequestTracker {
|
|
138
|
-
private count;
|
|
139
|
-
private date;
|
|
140
|
-
private statsFile;
|
|
141
|
-
private hourlyTimer?;
|
|
142
|
-
private midnightTimer?;
|
|
143
|
-
private log;
|
|
144
|
-
private dailyLimit;
|
|
145
|
-
private reserveForCommands;
|
|
146
|
-
private lastWarn;
|
|
147
|
-
private pausePollingAtReserve;
|
|
148
|
-
private resetAtLocalMidnight;
|
|
149
|
-
constructor(api: API, log: Logging, pluginName?: string, limits?: {
|
|
150
|
-
dailyLimit?: number;
|
|
151
|
-
reserveForCommands?: number;
|
|
152
|
-
pausePollingAtReserve?: boolean;
|
|
153
|
-
resetAtLocalMidnight?: boolean;
|
|
154
|
-
});
|
|
155
|
-
/**
|
|
156
|
-
* Return date key string (YYYY-MM-DD) based on reset mode
|
|
157
|
-
* - UTC (default): uses UTC date
|
|
158
|
-
* - Local: uses local timezone date
|
|
159
|
-
*/
|
|
160
|
-
private dateKey;
|
|
161
|
-
/**
|
|
162
|
-
* Load API request statistics from persistent storage
|
|
163
|
-
*/
|
|
164
|
-
private load;
|
|
165
|
-
/**
|
|
166
|
-
* Save API request statistics to persistent storage
|
|
167
|
-
*/
|
|
168
|
-
private save;
|
|
169
|
-
/**
|
|
170
|
-
* Increment API request counter and save
|
|
171
|
-
*/
|
|
172
|
-
track(): void;
|
|
173
|
-
/**
|
|
174
|
-
* Attempt to spend from the daily budget for a request of a given kind.
|
|
175
|
-
* Kinds: 'command' (user actions), 'poll' (status refresh), 'discovery'.
|
|
176
|
-
* Returns true if allowed (and increments the counter), false if blocked.
|
|
177
|
-
*/
|
|
178
|
-
trySpend(kind: 'command' | 'poll' | 'discovery', n?: number): boolean;
|
|
179
|
-
/**
|
|
180
|
-
* Start hourly logging of API request count
|
|
181
|
-
*/
|
|
182
|
-
startHourlyLogging(): void;
|
|
183
|
-
/**
|
|
184
|
-
* Stop hourly logging
|
|
185
|
-
*/
|
|
186
|
-
stopHourlyLogging(): void;
|
|
187
|
-
/**
|
|
188
|
-
* Get current count
|
|
189
|
-
*/
|
|
190
|
-
getCount(): number;
|
|
191
|
-
/**
|
|
192
|
-
* Get current date
|
|
193
|
-
*/
|
|
194
|
-
getDate(): string;
|
|
195
|
-
/** Schedule a precise log/reset at the next UTC midnight */
|
|
196
|
-
private scheduleMidnightRollover;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Normalize a deviceId for matching (uppercase alphanumerics only)
|
|
200
|
-
*/
|
|
201
|
-
export declare function normalizeDeviceId(deviceId: string): string;
|
|
202
|
-
/**
|
|
203
|
-
* Merge two arrays by deviceId. For each item in a1 (user-provided devices list),
|
|
204
|
-
* find matching item in a2 (discovered devices) and merge them with user overrides last.
|
|
205
|
-
*/
|
|
206
|
-
export declare function mergeByDeviceId(a1: {
|
|
207
|
-
deviceId: string;
|
|
208
|
-
}[], a2: any[], allowConfigOnly?: boolean): any[];
|
|
209
|
-
/**
|
|
210
|
-
* Apply device-type or remote-type templates to an array of devices.
|
|
211
|
-
* Templates are config entries with applyToAllDevicesOfType=true.
|
|
212
|
-
*
|
|
213
|
-
* @param devices - Array of devices to apply templates to
|
|
214
|
-
* @param configDevices - User config array that may contain template entries
|
|
215
|
-
* @param typeKey - Property name to match device types ('deviceType' for devices, 'remoteType' for IR devices)
|
|
216
|
-
* @param debugLog - Optional debug logging function
|
|
217
|
-
* @returns Array of devices with templates applied
|
|
218
|
-
*/
|
|
219
|
-
export declare function applyDeviceTypeTemplates(devices: any[], configDevices: any[], typeKey: string, debugLog?: (message: string) => void): any[];
|
|
220
|
-
/**
|
|
221
|
-
* Check if an API status code indicates success
|
|
222
|
-
*/
|
|
223
|
-
export declare function isSuccessfulStatusCode(statusCode: number): boolean;
|
|
224
|
-
/**
|
|
225
|
-
* Log status code messages with appropriate log level
|
|
226
|
-
*/
|
|
227
|
-
export declare function logStatusCode(statusCode: number, log: {
|
|
228
|
-
debugLog: (...args: any[]) => void | Promise<void>;
|
|
229
|
-
errorLog: (...args: any[]) => void | Promise<void>;
|
|
230
|
-
}): Promise<void>;
|
|
231
|
-
/**
|
|
232
|
-
* Shared device logging helpers
|
|
233
|
-
*/
|
|
234
|
-
/**
|
|
235
|
-
* Check if device logging is in debug mode
|
|
236
|
-
*/
|
|
237
|
-
export declare function deviceLoggingIsDebug(deviceLogging?: string): boolean;
|
|
238
|
-
/**
|
|
239
|
-
* Check if device logging is enabled
|
|
240
|
-
*/
|
|
241
|
-
export declare function deviceLoggingEnabled(deviceLogging?: string, platformLogging?: string): boolean;
|
|
242
|
-
/**
|
|
243
|
-
* Device status code handler with comprehensive messages
|
|
244
|
-
*/
|
|
245
|
-
export interface DeviceStatusCodeLogger {
|
|
246
|
-
debugLog: (...args: any[]) => void | Promise<void>;
|
|
247
|
-
debugErrorLog?: (...args: any[]) => void | Promise<void>;
|
|
248
|
-
errorLog: (...args: any[]) => void | Promise<void>;
|
|
249
|
-
infoLog?: (...args: any[]) => void | Promise<void>;
|
|
250
|
-
}
|
|
251
|
-
export declare function logDeviceStatusCode(statusCode: number, log: DeviceStatusCodeLogger, deviceId?: string, hubDeviceId?: string): Promise<void>;
|
|
38
|
+
export declare function normalizeConfig(raw?: PlatformConfig): SwitchBotPluginConfig;
|
|
39
|
+
export declare function createPlatformProxy(HAPPlatform: any, MatterPlatform: any): any;
|
|
252
40
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGvD,eAAO,MAAM,kBAAkB;;;;;;;;CAQrB,CAAA;AAGV,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;CAQvB,CAAA;AAEV,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,cAAc,GAAG,qBAAqB,CAG3E;AAGD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,GAAG,GAAG,CAkB9E"}
|