@switchbot/homebridge-switchbot 5.0.0-beta.15 → 5.0.0-beta.150
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/.changeset/config.json +14 -0
- package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
- package/.github/copilot-instructions.md +39 -0
- package/.github/workflows/ci.yml +32 -0
- package/.github/workflows/manual-e2e.yml +115 -0
- package/.github/workflows/release.yml +0 -4
- package/.husky/pre-push +15 -0
- package/CHANGELOG.md +35 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +54 -0
- package/README.md +136 -4
- package/TODO.md +263 -0
- package/config.schema.json +284 -14787
- package/dist/SwitchBotHAPPlatform.d.ts +133 -0
- package/dist/SwitchBotHAPPlatform.d.ts.map +1 -0
- package/dist/SwitchBotHAPPlatform.js +555 -0
- package/dist/SwitchBotHAPPlatform.js.map +1 -0
- package/dist/SwitchBotMatterPlatform.d.ts +141 -0
- package/dist/SwitchBotMatterPlatform.d.ts.map +1 -0
- package/dist/SwitchBotMatterPlatform.js +536 -0
- package/dist/SwitchBotMatterPlatform.js.map +1 -0
- package/dist/device-types.d.ts +31 -0
- package/dist/device-types.d.ts.map +1 -0
- package/dist/device-types.js +246 -0
- package/dist/device-types.js.map +1 -0
- package/dist/deviceCommandMapper.d.ts +10 -0
- package/dist/deviceCommandMapper.d.ts.map +1 -0
- package/dist/deviceCommandMapper.js +319 -0
- package/dist/deviceCommandMapper.js.map +1 -0
- package/dist/deviceFactory.d.ts +14 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +159 -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 +320 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1363 -0
- package/dist/devices/genericDevice.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
- package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/config.js +90 -0
- package/dist/homebridge-ui/endpoints/config.js.map +1 -0
- package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
- package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/devices.js +81 -0
- package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
- package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
- package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/discovery.js +212 -0
- package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/css/styles.css +472 -0
- package/dist/homebridge-ui/public/index.html +210 -244
- package/dist/homebridge-ui/public/js/advanced-settings.d.ts +3 -0
- package/dist/homebridge-ui/public/js/advanced-settings.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/advanced-settings.js +95 -0
- package/dist/homebridge-ui/public/js/advanced-settings.js.map +1 -0
- package/dist/homebridge-ui/public/js/advanced-settings.ts +94 -0
- package/dist/homebridge-ui/public/js/api.d.ts +66 -0
- package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/api.js +281 -0
- package/dist/homebridge-ui/public/js/api.js.map +1 -0
- package/dist/homebridge-ui/public/js/api.ts +342 -0
- package/dist/homebridge-ui/public/js/app.d.ts +2 -0
- package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/app.js +3863 -0
- package/dist/homebridge-ui/public/js/app.js.map +7 -0
- package/dist/homebridge-ui/public/js/app.ts +22 -0
- package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
- package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/constants.js +2 -0
- package/dist/homebridge-ui/public/js/constants.js.map +1 -0
- package/dist/homebridge-ui/public/js/constants.ts +1 -0
- package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
- package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/credentials.js +99 -0
- package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
- package/dist/homebridge-ui/public/js/credentials.ts +105 -0
- package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
- package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/devices-delete.js +199 -0
- package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices-delete.ts +227 -0
- package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
- package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/devices.js +96 -0
- package/dist/homebridge-ui/public/js/devices.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices.ts +105 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts +4 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.js +1374 -0
- package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.ts +1498 -0
- package/dist/homebridge-ui/public/js/logger.d.ts +7 -0
- package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/logger.js +17 -0
- package/dist/homebridge-ui/public/js/logger.js.map +1 -0
- package/dist/homebridge-ui/public/js/logger.ts +17 -0
- package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
- package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/modal.js +26 -0
- package/dist/homebridge-ui/public/js/modal.js.map +1 -0
- package/dist/homebridge-ui/public/js/modal.ts +28 -0
- package/dist/homebridge-ui/public/js/modals.d.ts +15 -0
- package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/modals.js +673 -0
- package/dist/homebridge-ui/public/js/modals.js.map +1 -0
- package/dist/homebridge-ui/public/js/modals.ts +761 -0
- package/dist/homebridge-ui/public/js/render.d.ts +71 -0
- package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/render.js +953 -0
- package/dist/homebridge-ui/public/js/render.js.map +1 -0
- package/dist/homebridge-ui/public/js/render.ts +1077 -0
- package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
- package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/toast.js +29 -0
- package/dist/homebridge-ui/public/js/toast.js.map +1 -0
- package/dist/homebridge-ui/public/js/toast.ts +37 -0
- package/dist/homebridge-ui/public/js/types.d.ts +23 -0
- package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/types.js +2 -0
- package/dist/homebridge-ui/public/js/types.js.map +1 -0
- package/dist/homebridge-ui/public/js/types.ts +26 -0
- package/dist/homebridge-ui/server.js +9 -41
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/homebridge-ui/utils/config-parser.d.ts +35 -0
- package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/config-parser.js +87 -0
- package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
- package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
- package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/device-migration.js +111 -0
- package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
- package/dist/homebridge-ui/utils/logger.d.ts +7 -0
- package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/logger.js +17 -0
- package/dist/homebridge-ui/utils/logger.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +11 -249
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +6 -30
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +28 -0
- package/dist/switchbotClient.d.ts.map +1 -0
- package/dist/switchbotClient.js +175 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +92 -115
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1117 -902
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +28 -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 +148 -13
- package/docs/variables/default.html +3 -1
- package/eslint.config.js +7 -8
- package/nodemon.json +2 -2
- package/package.json +36 -32
- package/scripts/build-ui.js +37 -0
- 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/free-dev-ports.mjs +105 -0
- package/scripts/generate-matter-maps.js +77 -0
- package/scripts/run-e2e-local.sh +14 -0
- package/scripts/sync-device-types.mjs +31 -0
- package/src/SwitchBotHAPPlatform.ts +558 -0
- package/src/SwitchBotMatterPlatform.ts +538 -0
- package/src/device-types.ts +261 -0
- package/src/deviceCommandMapper.ts +333 -0
- package/src/deviceFactory.ts +201 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +1337 -0
- package/src/errors.ts +35 -0
- package/src/homebridge-ui/endpoints/config.ts +110 -0
- package/src/homebridge-ui/endpoints/devices.ts +88 -0
- package/src/homebridge-ui/endpoints/discovery.ts +233 -0
- package/src/homebridge-ui/public/css/styles.css +472 -0
- package/src/homebridge-ui/public/index.html +210 -244
- package/src/homebridge-ui/public/js/advanced-settings.ts +94 -0
- package/src/homebridge-ui/public/js/api.ts +342 -0
- package/src/homebridge-ui/public/js/app.ts +22 -0
- package/src/homebridge-ui/public/js/constants.ts +1 -0
- package/src/homebridge-ui/public/js/credentials.ts +105 -0
- package/src/homebridge-ui/public/js/devices-delete.ts +227 -0
- package/src/homebridge-ui/public/js/devices.ts +105 -0
- package/src/homebridge-ui/public/js/discovery.ts +1498 -0
- package/src/homebridge-ui/public/js/logger.ts +17 -0
- package/src/homebridge-ui/public/js/modal.ts +28 -0
- package/src/homebridge-ui/public/js/modals.ts +761 -0
- package/src/homebridge-ui/public/js/render.ts +1077 -0
- package/src/homebridge-ui/public/js/toast.ts +37 -0
- package/src/homebridge-ui/public/js/types.ts +26 -0
- package/src/homebridge-ui/server.ts +9 -43
- package/src/homebridge-ui/utils/config-parser.ts +108 -0
- package/src/homebridge-ui/utils/device-migration.ts +144 -0
- package/src/homebridge-ui/utils/logger.ts +17 -0
- package/src/index.ts +12 -4
- package/src/settings.ts +14 -277
- package/src/switchbotClient.ts +181 -0
- package/src/utils.ts +1106 -900
- package/test/client/switchbot-client-debounce.spec.ts +35 -0
- package/test/client/switchbot-client-openapi.spec.ts +19 -0
- package/test/client/switchbotClient.spec.ts +23 -0
- package/test/device/device-mapping.spec.ts +23 -0
- package/test/device/deviceBase.spec.ts +26 -0
- package/test/device/deviceFactory-edge.spec.ts +15 -0
- package/test/device/deviceFactory.spec.ts +33 -0
- package/test/device/fan-swing.spec.ts +34 -0
- package/test/device/genericDevice-blepoll.spec.ts +47 -0
- package/test/device/irdevice.spec.ts +9 -0
- package/test/device/lock-users.spec.ts +35 -0
- package/test/device/matter-descriptors.spec.ts +22 -0
- package/test/device/matter-device-state.spec.ts +37 -0
- package/test/e2e/run-e2e.spec.ts +48 -0
- package/test/errors/errors.spec.ts +10 -0
- package/test/helpers/matter-harness.ts +64 -0
- package/test/homebridge-ui/server.spec.ts +9 -0
- package/test/platform/accessory-restore.spec.ts +37 -0
- package/test/platform/matter-childbridge.spec.ts +34 -0
- package/test/platform/matter-integration.spec.ts +33 -0
- package/test/platform/platform-edge.spec.ts +73 -0
- package/test/platform/platform.integration.spec.ts +34 -0
- package/test/utils/utils-extra.spec.ts +10 -0
- package/test/utils/utils.spec.ts +53 -0
- package/todo/TODO.md +80 -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/baseMatterAccessory.test.d.ts +0 -2
- package/dist/baseMatterAccessory.test.d.ts.map +0 -1
- package/dist/baseMatterAccessory.test.js +0 -71
- package/dist/baseMatterAccessory.test.js.map +0 -1
- 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 -831
- 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 -78
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -244
- 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 -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 -19
- 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 -398
- 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 -145
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -2823
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -131
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -1002
- package/dist/platform-matter.js.map +0 -1
- package/dist/utils.test.d.ts +0 -2
- package/dist/utils.test.d.ts.map +0 -1
- package/dist/utils.test.js +0 -95
- package/dist/utils.test.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/baseMatterAccessory.test.ts +0 -88
- 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 -884
- 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 -273
- 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 -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 -24
- 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 -435
- 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 -2952
- package/src/platform-matter.ts +0 -1129
- package/src/utils.test.ts +0 -96
- package/src/verifyconfig.test.ts +0 -198
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
|
|
3
|
+
"changelog": [
|
|
4
|
+
"@changesets/cli/changelog",
|
|
5
|
+
{ "repo": "OpenWonderLabs/homebridge-switchbot" }
|
|
6
|
+
],
|
|
7
|
+
"commit": false,
|
|
8
|
+
"fixed": [],
|
|
9
|
+
"linked": [],
|
|
10
|
+
"access": "public",
|
|
11
|
+
"baseBranch": "latest",
|
|
12
|
+
"updateInternalDependencies": "patch",
|
|
13
|
+
"ignore": []
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: E2E Verification Results
|
|
3
|
+
about: Submit manual E2E test results for homebridge-switchbot changes (Matter + node-switchbot v4)
|
|
4
|
+
title: "[E2E] <device-type> verification"
|
|
5
|
+
labels: e2e, testing
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
### Environment
|
|
10
|
+
- Homebridge version:
|
|
11
|
+
- Plugin commit / branch:
|
|
12
|
+
- macOS version:
|
|
13
|
+
- Bluetooth available: (yes/no)
|
|
14
|
+
- openApiToken used: (yes/no)
|
|
15
|
+
|
|
16
|
+
### Device under test
|
|
17
|
+
- Device type: (Light / Fan / Curtain / Lock)
|
|
18
|
+
- Device model:
|
|
19
|
+
- Connection used: (BLE / OpenAPI)
|
|
20
|
+
|
|
21
|
+
### Steps performed
|
|
22
|
+
- Start Homebridge with plugin linked/built
|
|
23
|
+
- Verified Matter registration: (yes/no)
|
|
24
|
+
- Verified HAP fallback when Matter unavailable: (yes/no)
|
|
25
|
+
- Operations tested: (list)
|
|
26
|
+
|
|
27
|
+
### Results
|
|
28
|
+
- Observed behavior (brief):
|
|
29
|
+
- Any errors in plugin logs (paste relevant snippets):
|
|
30
|
+
|
|
31
|
+
### Verdict
|
|
32
|
+
- Pass/Fail:
|
|
33
|
+
- Notes and follow-ups:
|
|
34
|
+
|
|
35
|
+
### Attachments
|
|
36
|
+
- Logs, screenshots, videos
|
|
@@ -2,6 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
|
|
4
4
|
|
|
5
|
+
## Topic-Based Reference Priority
|
|
6
|
+
|
|
7
|
+
When a prompt includes the topics below, consult these upstream references first before implementation decisions.
|
|
8
|
+
|
|
9
|
+
### Matter (keyword examples: "Matter", "child bridge", "cluster", "conformance")
|
|
10
|
+
|
|
11
|
+
Primary references:
|
|
12
|
+
- https://github.com/homebridge-plugins/homebridge-matter
|
|
13
|
+
- https://github.com/homebridge/homebridge/ - only if latest is 2.0.0 or later and contains Matter-related code or reference:
|
|
14
|
+
- https://github.com/homebridge/homebridge/tree/beta-2.0.0/
|
|
15
|
+
- https://github.com/matter-js/matter.js
|
|
16
|
+
|
|
17
|
+
Usage rule:
|
|
18
|
+
- For Matter behavior, conformance, clustering, or registration logic, align implementation with these references before applying local changes.
|
|
19
|
+
|
|
20
|
+
### SwitchBot BLE (keyword examples: "BLE", "Bluetooth", "RSSI", "advertisement", "scan")
|
|
21
|
+
|
|
22
|
+
Primary references:
|
|
23
|
+
- https://github.com/OpenWonderLabs/SwitchBotAPI-BLE
|
|
24
|
+
- https://github.com/sblibs/pySwitchbot
|
|
25
|
+
|
|
26
|
+
Usage rule:
|
|
27
|
+
- For BLE command/state/scan behavior, prefer these references for protocol expectations and payload shape.
|
|
28
|
+
|
|
29
|
+
### SwitchBot OpenAPI (keyword examples: "OpenAPI", "cloud API", "device list", "command")
|
|
30
|
+
|
|
31
|
+
Primary reference:
|
|
32
|
+
- https://github.com/OpenWonderLabs/SwitchBotAPI
|
|
33
|
+
|
|
34
|
+
Usage rule:
|
|
35
|
+
- For OpenAPI device models, commands, and response fields, prioritize this reference for compatibility.
|
|
36
|
+
|
|
37
|
+
### Conflict Resolution
|
|
38
|
+
|
|
39
|
+
If references conflict:
|
|
40
|
+
1. Prefer official upstream docs/API specs.
|
|
41
|
+
2. Keep existing plugin behavior unless a clear bug is identified.
|
|
42
|
+
3. Document any intentional deviation in PR notes.
|
|
43
|
+
|
|
5
44
|
## Branch Targeting Strategy
|
|
6
45
|
|
|
7
46
|
When creating pull requests, ALWAYS follow this branch targeting strategy:
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main", "latest", "beta-*"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main", "latest"]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build-and-test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
node-version: [22, 24]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Setup Node.js
|
|
20
|
+
uses: actions/setup-node@v4
|
|
21
|
+
with:
|
|
22
|
+
node-version: ${{ matrix.node-version }}
|
|
23
|
+
cache: 'npm'
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: npm ci --legacy-peer-deps
|
|
27
|
+
|
|
28
|
+
- name: Build
|
|
29
|
+
run: npm run build
|
|
30
|
+
|
|
31
|
+
- name: Run tests
|
|
32
|
+
run: npm run test
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
name: Manual E2E (build + optional E2E)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
run_e2e:
|
|
7
|
+
description: 'Set to true to run the E2E scripts (requires network-accessible Homebridge and valid tokens)'
|
|
8
|
+
required: false
|
|
9
|
+
default: 'false'
|
|
10
|
+
hb_url:
|
|
11
|
+
description: 'Homebridge UI URL (e.g. http://host:8581)'
|
|
12
|
+
required: false
|
|
13
|
+
hb_token:
|
|
14
|
+
description: 'Homebridge UI token (store as secret or pass here)'
|
|
15
|
+
required: false
|
|
16
|
+
light_accessory_id:
|
|
17
|
+
description: 'Accessory ID for light (when running E2E)'
|
|
18
|
+
required: false
|
|
19
|
+
fan_accessory_id:
|
|
20
|
+
description: 'Accessory ID for fan (when running E2E)'
|
|
21
|
+
required: false
|
|
22
|
+
curtain_accessory_id:
|
|
23
|
+
description: 'Accessory ID for curtain (when running E2E)'
|
|
24
|
+
required: false
|
|
25
|
+
lock_accessory_id:
|
|
26
|
+
description: 'Accessory ID for lock (when running E2E)'
|
|
27
|
+
required: false
|
|
28
|
+
light_accessory_name:
|
|
29
|
+
description: 'Accessory display name for light (optional, used to resolve ID)'
|
|
30
|
+
required: false
|
|
31
|
+
fan_accessory_name:
|
|
32
|
+
description: 'Accessory display name for fan (optional, used to resolve ID)'
|
|
33
|
+
required: false
|
|
34
|
+
curtain_accessory_name:
|
|
35
|
+
description: 'Accessory display name for curtain (optional, used to resolve ID)'
|
|
36
|
+
required: false
|
|
37
|
+
lock_accessory_name:
|
|
38
|
+
description: 'Accessory display name for lock (optional, used to resolve ID)'
|
|
39
|
+
required: false
|
|
40
|
+
|
|
41
|
+
jobs:
|
|
42
|
+
build-and-test:
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
steps:
|
|
45
|
+
- name: Checkout
|
|
46
|
+
uses: actions/checkout@v6
|
|
47
|
+
|
|
48
|
+
- name: Setup Node
|
|
49
|
+
uses: actions/setup-node@v6
|
|
50
|
+
with:
|
|
51
|
+
node-version: '22'
|
|
52
|
+
|
|
53
|
+
- name: Install dependencies
|
|
54
|
+
run: npm ci --prefer-offline --no-audit --progress=false
|
|
55
|
+
|
|
56
|
+
- name: Build
|
|
57
|
+
run: npm run build
|
|
58
|
+
|
|
59
|
+
- name: Run unit tests
|
|
60
|
+
run: npm run test
|
|
61
|
+
|
|
62
|
+
- name: "Optional: Run E2E scripts"
|
|
63
|
+
if: ${{ github.event.inputs.run_e2e == 'true' }}
|
|
64
|
+
env:
|
|
65
|
+
HB_URL: ${{ github.event.inputs.hb_url }}
|
|
66
|
+
HB_TOKEN: ${{ github.event.inputs.hb_token }}
|
|
67
|
+
LIGHT_ACCESSORY_ID: ${{ github.event.inputs.light_accessory_id }}
|
|
68
|
+
FAN_ACCESSORY_ID: ${{ github.event.inputs.fan_accessory_id }}
|
|
69
|
+
CURTAIN_ACCESSORY_ID: ${{ github.event.inputs.curtain_accessory_id }}
|
|
70
|
+
LOCK_ACCESSORY_ID: ${{ github.event.inputs.lock_accessory_id }}
|
|
71
|
+
LIGHT_ACCESSORY_NAME: ${{ github.event.inputs.light_accessory_name }}
|
|
72
|
+
FAN_ACCESSORY_NAME: ${{ github.event.inputs.fan_accessory_name }}
|
|
73
|
+
CURTAIN_ACCESSORY_NAME: ${{ github.event.inputs.curtain_accessory_name }}
|
|
74
|
+
LOCK_ACCESSORY_NAME: ${{ github.event.inputs.lock_accessory_name }}
|
|
75
|
+
run: |
|
|
76
|
+
echo "Running E2E scripts on runner ($HB_URL) - ensure the runner can access Homebridge and devices"
|
|
77
|
+
# resolve accessory IDs from names when IDs not provided
|
|
78
|
+
echo "Resolving accessory IDs from names (if provided)..."
|
|
79
|
+
rm -f resolved_ids.env || true
|
|
80
|
+
touch resolved_ids.env
|
|
81
|
+
|
|
82
|
+
resolve() {
|
|
83
|
+
idvar="$1"
|
|
84
|
+
namevar="$2"
|
|
85
|
+
nameval="$(eval echo \"\$$namevar\")"
|
|
86
|
+
idval="$(eval echo \"\$$idvar\")"
|
|
87
|
+
if [[ -z "$idval" && -n "$nameval" ]]; then
|
|
88
|
+
resp=$(curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}/api/accessories" || true)
|
|
89
|
+
found=$(printf '%s' "$resp" | node -e "const fs=require('fs');const name=process.argv[1];try{const j=JSON.parse(fs.readFileSync(0,'utf8'));const arr=Array.isArray(j)?j:(j.accessories||j)||[];for(const a of arr){if(a.displayName===name||a.name===name||(a.context&&a.context.deviceId===name)){if(a.aid){console.log(a.aid);process.exit(0);}else if(a.UUID){console.log(a.UUID);process.exit(0);}}} }catch(e){}" "$nameval" )
|
|
90
|
+
if [[ -n "$found" ]]; then
|
|
91
|
+
echo "Resolved $idvar=$found"
|
|
92
|
+
echo "$idvar=$found" >> resolved_ids.env
|
|
93
|
+
export "$idvar"="$found"
|
|
94
|
+
else
|
|
95
|
+
echo "Could not resolve $namevar='$nameval' to an id"
|
|
96
|
+
fi
|
|
97
|
+
fi
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
resolve LIGHT_ACCESSORY_ID LIGHT_ACCESSORY_NAME
|
|
101
|
+
resolve FAN_ACCESSORY_ID FAN_ACCESSORY_NAME
|
|
102
|
+
resolve CURTAIN_ACCESSORY_ID CURTAIN_ACCESSORY_NAME
|
|
103
|
+
resolve LOCK_ACCESSORY_ID LOCK_ACCESSORY_NAME
|
|
104
|
+
|
|
105
|
+
# set RUN_E2E so the conditional Vitest harness executes
|
|
106
|
+
export RUN_E2E=true
|
|
107
|
+
npm run test
|
|
108
|
+
|
|
109
|
+
- name: Upload logs (if any)
|
|
110
|
+
if: always()
|
|
111
|
+
uses: actions/upload-artifact@v4
|
|
112
|
+
with:
|
|
113
|
+
name: test-logs
|
|
114
|
+
path: |
|
|
115
|
+
test-output.log
|
|
@@ -22,8 +22,6 @@ jobs:
|
|
|
22
22
|
with:
|
|
23
23
|
release_type: ${{ needs.determine-release-type.outputs.release_type }}
|
|
24
24
|
is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
|
|
25
|
-
secrets:
|
|
26
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
27
25
|
|
|
28
26
|
# 3️⃣ Publish to NPM and create GitHub release
|
|
29
27
|
publish-release:
|
|
@@ -48,8 +46,6 @@ jobs:
|
|
|
48
46
|
branch_name: ${{ needs.determine-release-type.outputs.branch_name }}
|
|
49
47
|
release_type: ${{ needs.determine-release-type.outputs.release_type }}
|
|
50
48
|
is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
|
|
51
|
-
secrets:
|
|
52
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
53
49
|
|
|
54
50
|
# 5️⃣ Notify if any previous job fails
|
|
55
51
|
workflow-failure:
|
package/.husky/pre-push
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
. "$(dirname "$0")/_/husky.sh"
|
|
3
|
+
|
|
4
|
+
echo "Running changeset version before push..."
|
|
5
|
+
if npx @changesets/cli version --yes; then
|
|
6
|
+
git add package.json package-lock.json CHANGELOG.md || true
|
|
7
|
+
if ! git diff --staged --quiet; then
|
|
8
|
+
echo "Committing version and changelog updates"
|
|
9
|
+
git commit -m "chore(release): version packages [skip ci]" || true
|
|
10
|
+
else
|
|
11
|
+
echo "No version changes to commit"
|
|
12
|
+
fi
|
|
13
|
+
else
|
|
14
|
+
echo "changeset version failed or no changesets present"
|
|
15
|
+
fi
|
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased — beta-4.3.3
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Matter support (child-bridge) with Matter-first registration and HAP fallback.
|
|
7
|
+
- Hybrid `node-switchbot@4` client adapter (BLE + OpenAPI) with OpenAPI fallback.
|
|
8
|
+
- Manual and automated E2E scripts for lights, fans, curtains, and locks (`scripts/e2e/*`).
|
|
9
|
+
- Conditional Vitest E2E harness (`RUN_E2E=true`) and a manual GitHub Actions workflow to run E2E.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- Centralized Matter cluster/attribute numeric ID maps in `src/utils.ts`.
|
|
13
|
+
- Device descriptors refactored to use canonical Matter IDs.
|
|
14
|
+
- OpenAPI fallback hardened with timeouts, retries, backoff, and per-device retry limits.
|
|
15
|
+
|
|
16
|
+
### Tests
|
|
17
|
+
- Added integration tests and a Matter test harness under `test/`.
|
|
18
|
+
|
|
19
|
+
### Notes
|
|
20
|
+
- This is a beta release; follow migration notes in MIGRATION.md before upgrading.
|
|
21
|
+
# Changelog
|
|
22
|
+
|
|
3
23
|
All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/)
|
|
4
24
|
|
|
25
|
+
## [Unreleased]
|
|
26
|
+
|
|
27
|
+
### What's Changed
|
|
28
|
+
- Matter platform: register only devices discovered via the SwitchBot OpenAPI by default. Per-device config overrides (by deviceId) are correctly merged into discovered devices.
|
|
29
|
+
- Add `options.allowConfigOnlyDevices` (boolean) to opt-in to registering devices that exist only in config (not discovered).
|
|
30
|
+
- Add unit tests for per-device merging and config-only behavior.
|
|
31
|
+
- Matter (Matter platform): default to discovery-first registration and automatically remove previously-registered "stale" accessories that are no longer discovered or configured.
|
|
32
|
+
- Add `options.keepStaleAccessories` (Advanced Settings) — opt-in to preserve previously-registered accessories when set to true. Default: false (stale accessories are removed automatically).
|
|
33
|
+
- Implement per-device OpenAPI polling with tracked timers and proper lifecycle cleanup (timers and BLE handlers cleared on unregister/shutdown).
|
|
34
|
+
- Centralize OpenAPI/BLE -> Matter mapping and expand BLE/OpenAPI parsing to include PM2.5/PM10/VOC/CO2, temperature/humidity, improved color parsing, and additional sensor/robot-vacuum fields.
|
|
35
|
+
- Prefer accessory-specific update helpers where available; fall back to generic Matter updates otherwise.
|
|
36
|
+
- Add unit tests covering BLE parsing, stale-accessory behavior, mapping helpers, and lifecycle cleanup.
|
|
37
|
+
- Add `options.dailyApiResetLocalMidnight` (boolean) to control whether the daily API budget resets at local midnight (true) or UTC midnight (false, default).
|
|
38
|
+
- Fix configuration schema placement for the "Reset Daily Counter at Local Midnight" option: remove erroneous insertion inside IR remote type list and expose it correctly under platform `options`.
|
|
39
|
+
|
|
5
40
|
## [4.3.1](https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v4.3.1) (2025-03-04)
|
|
6
41
|
|
|
7
42
|
# *No New Releases During Lent*
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Manual End-to-End Verification
|
|
2
|
+
|
|
3
|
+
This guide walks through manual end-to-end verification for representative devices (light, fan, curtain, lock) across BLE and OpenAPI paths, and verifies Matter-first behavior with HAP fallback.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- macOS with Bluetooth (for BLE verification)
|
|
8
|
+
- Local development environment set up (Node.js, npm)
|
|
9
|
+
- Homebridge installed locally or available (for running a test instance)
|
|
10
|
+
- SwitchBot devices available (at least one light, one fan, one curtain, one lock) OR corresponding cloud-hub access
|
|
11
|
+
- `openApiToken` when testing OpenAPI path
|
|
12
|
+
|
|
13
|
+
## Quick setup
|
|
14
|
+
|
|
15
|
+
1. Install dependencies:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install --legacy-peer-deps
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
2. Build the plugin:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run build
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
3. Recommended: run the watch task which links the plugin and restarts on changes (requires a local Homebridge installation):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run watch
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Alternative (manual linking):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run build && npm link
|
|
37
|
+
# then run your Homebridge instance (system/homebridge UI) so it picks up the linked plugin
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Example platform config snippets
|
|
41
|
+
|
|
42
|
+
OpenAPI (cloud) path — enable Matter preference:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"platform": "SwitchBot",
|
|
47
|
+
"openApiToken": "<YOUR_OPENAPI_TOKEN>",
|
|
48
|
+
"enableMatter": true,
|
|
49
|
+
"preferMatter": true
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
BLE (direct) path — specify device by MAC address and prefer Matter:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"platform": "SwitchBot",
|
|
58
|
+
"devices": [
|
|
59
|
+
{ "deviceId": "AA:BB:CC:DD:EE:FF", "type": "Light" }
|
|
60
|
+
],
|
|
61
|
+
"enableMatter": true,
|
|
62
|
+
"preferMatter": true
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Verification checklist
|
|
67
|
+
|
|
68
|
+
Run the steps below for each device type; repeat once using BLE and once using OpenAPI (where applicable).
|
|
69
|
+
|
|
70
|
+
- Start Homebridge (with the plugin linked) and verify the plugin logs indicate Matter registration attempt.
|
|
71
|
+
- Look for log lines: `Attempting Matter registration for ...` or `Homebridge Matter API not available; will fallback to HAP`.
|
|
72
|
+
- Confirm accessories are registered in Matter (if Homebridge Matter child-bridge present) or appear as HAP accessories otherwise.
|
|
73
|
+
|
|
74
|
+
Device-specific tests
|
|
75
|
+
|
|
76
|
+
- Light
|
|
77
|
+
- Toggle On/Off from Home app (or Homebridge UI) and confirm device responds.
|
|
78
|
+
- Set brightness to 25%, 50%, 100% and confirm device reports matching levels.
|
|
79
|
+
- If supported, change color temperature and/or color; confirm device applies new values.
|
|
80
|
+
|
|
81
|
+
- Fan
|
|
82
|
+
- Toggle On/Off and verify.
|
|
83
|
+
- Change rotation speed in steps (e.g., 25%, 50%, 100%).
|
|
84
|
+
- Toggle oscillation / swing and verify position changes.
|
|
85
|
+
|
|
86
|
+
- Curtain
|
|
87
|
+
- Open and Close via Home app / controller and verify movement.
|
|
88
|
+
- Set specific position (e.g., 50%) and verify accurate reporting.
|
|
89
|
+
|
|
90
|
+
- Lock
|
|
91
|
+
- Lock and Unlock from controller and verify state.
|
|
92
|
+
- If lock user management supported, add/remove a test user per plugin UI and verify expected behavior.
|
|
93
|
+
|
|
94
|
+
## Logs & debugging
|
|
95
|
+
|
|
96
|
+
- Enable verbose logs from Homebridge or the plugin. Example: start Homebridge with a higher log level, or watch console output from `npm run watch`.
|
|
97
|
+
- Capture logs while you perform each operation; note the request path used by the plugin:
|
|
98
|
+
- For OpenAPI: logs will show `https://api.switch-bot.com/v1.0/...` calls.
|
|
99
|
+
- For BLE: logs will show local device discovery / BLE connect attempts.
|
|
100
|
+
|
|
101
|
+
## Run validation script (optional)
|
|
102
|
+
|
|
103
|
+
You can run the TypeScript build and unit tests to confirm the codebase is healthy before manual tests:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm run build && npm run test
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Expected outcomes
|
|
110
|
+
|
|
111
|
+
- Matter-first registration: when Homebridge Matter API is available and `enableMatter` is true, accessories should be registered as Matter child-bridge accessories and re-used if restored from cache.
|
|
112
|
+
- HAP fallback: when Matter API is not available, the plugin must continue to register HAP accessories and reuse restored accessories by `accessory.context.deviceId`.
|
|
113
|
+
- Hybrid client paths: when `openApiToken` present the plugin should prefer OpenAPI for devices reachable via cloud; when BLE is available and configured the plugin should connect directly via BLE.
|
|
114
|
+
- Logs should show robust retry attempts for transient network errors and per-device retry throttling if configured.
|
|
115
|
+
|
|
116
|
+
## Next steps I can take
|
|
117
|
+
|
|
118
|
+
- Create small automated verification scripts that use the Homebridge API test harness to toggle characteristic values (requires more test harness code).
|
|
119
|
+
- Generate a printable checklist or a GitHub issue template for manual verification results.
|
|
120
|
+
|
|
121
|
+
If you want, I can add the automated verification scripts now — would you prefer a simple script that exercises On/Off and Brightness for lights, or a broader script covering all device types?
|
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Migration notes — v4.3.x → beta
|
|
2
|
+
|
|
3
|
+
This document highlights important changes and recommended actions before upgrading to the beta containing Matter and `node-switchbot@4` support.
|
|
4
|
+
|
|
5
|
+
1. Matter-first behavior
|
|
6
|
+
- The plugin will prefer registering accessories with Homebridge's Matter child-bridge when `enableMatter: true` and the Homebridge Matter API is available.
|
|
7
|
+
- If Matter is not available, the plugin falls back to HAP and will reuse restored accessories by `accessory.context.deviceId`.
|
|
8
|
+
|
|
9
|
+
2. Configuration keys
|
|
10
|
+
- `enableMatter` (boolean) — enable Matter child-bridge registration.
|
|
11
|
+
- `preferMatter` (boolean) — prefer Matter for devices that support Matter descriptors; HAP fallback still available.
|
|
12
|
+
- `openApiToken` (string) — when present the plugin may prefer OpenAPI calls for cloud-reachable devices.
|
|
13
|
+
- `perDeviceMaxRetries`, `requestTimeout`, `maxRetries` — network retry/timing options for OpenAPI fallback.
|
|
14
|
+
|
|
15
|
+
- `writeDebounceMs` (number, milliseconds, default 100) — global write coalescing debounce window. Commands sent to the same device within this window are coalesced (last-write-wins) to reduce duplicate network/API commands. Set to `0` to disable coalescing if you require immediate, per-command delivery.
|
|
16
|
+
|
|
17
|
+
3. Hybrid client
|
|
18
|
+
- The plugin dynamically imports `node-switchbot` when available and falls back to OpenAPI when an `openApiToken` is configured.
|
|
19
|
+
- If you rely on BLE-only operation, ensure devices and the host have BLE available.
|
|
20
|
+
|
|
21
|
+
4. UI changes
|
|
22
|
+
- A small plugin UI was added; it's only enabled/copied into `dist/homebridge-ui` when `npm run build` is run and the UI files exist in `src/homebridge-ui/public`.
|
|
23
|
+
|
|
24
|
+
- The UI is always served when Homebridge UI support is present; there is no opt-out flag in the platform config. The server-side guard that previously allowed disabling the UI has been removed—if you need to restrict access, manage it via Homebridge UI / host network access controls.
|
|
25
|
+
|
|
26
|
+
5. Tests and verification
|
|
27
|
+
- Manual E2E scripts are provided in `scripts/e2e/` and a GitHub `workflow_dispatch` job can optionally run them against a reachable Homebridge.
|
|
28
|
+
- Run the local test suite before upgrading to confirm TypeScript and unit tests pass: `npm run build && npm run test`.
|
|
29
|
+
|
|
30
|
+
6. Rollback plan
|
|
31
|
+
- If the beta causes issues, revert to the previous stable plugin version by reinstalling the prior package or checking out the stable branch.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
8. BLE encryption key and keyId fields
|
|
35
|
+
|
|
36
|
+
- The plugin now supports BLE encryption for devices that require it (e.g., SwitchBot Lock, Curtain 3, and some sensors).
|
|
37
|
+
- New config fields: `encryptionKey` and `keyId` can be set per-device in the Homebridge UI or config.json.
|
|
38
|
+
- To upgrade, obtain your device's BLE encryption key and keyId from the SwitchBot app (see README for instructions) and add them to your device config if required.
|
|
39
|
+
- Devices that do not require encryption can leave these fields blank.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
7. Regenerating Matter ID maps
|
|
44
|
+
|
|
45
|
+
- A helper script `scripts/generate-matter-maps.js` is included to generate `src/matter-maps.generated.ts` from official zap/matter JSON metadata. The script expects a JSON input with a `clusters` array and will write mapped `MATTER_CLUSTER_IDS` and `MATTER_ATTRIBUTE_IDS` constants.
|
|
46
|
+
- Usage example:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node scripts/generate-matter-maps.js ./zap-matter.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Place the official metadata JSON as `zap-matter.json` at the repo root (or pass a path) and commit the generated `src/matter-maps.generated.ts` to keep maps up to date.
|
|
53
|
+
|
|
54
|
+
If you want, I can open a PR with these notes and the changelog stub targeting a beta branch I create next.
|