@switchbot/homebridge-switchbot 5.0.0-beta.11 → 5.0.0-beta.111
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/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/CHANGELOG.md +35 -0
- package/E2E-VERIFICATION.md +121 -0
- package/MIGRATION.md +44 -0
- package/README.md +56 -3
- package/config.schema.json +170 -14787
- package/dist/device-types.d.ts +31 -0
- package/dist/device-types.d.ts.map +1 -0
- package/dist/device-types.js +216 -0
- package/dist/device-types.js.map +1 -0
- package/dist/deviceFactory.d.ts +13 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +120 -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 +298 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1067 -0
- package/dist/devices/genericDevice.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 +104 -0
- package/dist/homebridge-ui/endpoints/config.js.map +1 -0
- package/dist/homebridge-ui/endpoints/credentials.d.ts +6 -0
- package/dist/homebridge-ui/endpoints/credentials.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/credentials.js +65 -0
- package/dist/homebridge-ui/endpoints/credentials.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 +351 -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 +171 -0
- package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/css/styles.css +254 -0
- package/dist/homebridge-ui/public/index.html +112 -247
- package/dist/homebridge-ui/public/js/api.d.ts +23 -0
- package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/api.js +188 -0
- package/dist/homebridge-ui/public/js/api.js.map +1 -0
- package/dist/homebridge-ui/public/js/api.ts +215 -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 +1815 -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 +96 -0
- package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
- package/dist/homebridge-ui/public/js/credentials.ts +100 -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 +206 -0
- package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices-delete.ts +236 -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 +90 -0
- package/dist/homebridge-ui/public/js/devices.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices.ts +98 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts +3 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.js +244 -0
- package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.ts +290 -0
- package/dist/homebridge-ui/public/js/logger.d.ts +6 -0
- package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/logger.js +12 -0
- package/dist/homebridge-ui/public/js/logger.js.map +1 -0
- package/dist/homebridge-ui/public/js/logger.ts +11 -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 +7 -0
- package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/modals.js +323 -0
- package/dist/homebridge-ui/public/js/modals.js.map +1 -0
- package/dist/homebridge-ui/public/js/modals.ts +367 -0
- package/dist/homebridge-ui/public/js/render.d.ts +65 -0
- package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/render.js +499 -0
- package/dist/homebridge-ui/public/js/render.js.map +1 -0
- package/dist/homebridge-ui/public/js/render.ts +579 -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 +11 -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.map +1 -1
- package/dist/index.js +4 -65
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +35 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +1527 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +10 -249
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +5 -30
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +32 -0
- package/dist/switchbotClient.d.ts.map +1 -0
- package/dist/switchbotClient.js +207 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +39 -50
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +40 -688
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +14 -0
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/main.js +2 -2
- package/docs/assets/style.css +3 -3
- package/docs/index.html +77 -13
- package/docs/variables/default.html +1 -1
- package/eslint.config.js +7 -8
- package/nodemon.json +2 -2
- package/package.json +35 -32
- package/scripts/build-ui.js +36 -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 +60 -0
- package/scripts/run-e2e-local.sh +14 -0
- package/scripts/sync-device-types.mjs +28 -0
- package/src/device-types.ts +230 -0
- package/src/deviceFactory.ts +163 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +998 -0
- package/src/homebridge-ui/endpoints/config.ts +123 -0
- package/src/homebridge-ui/endpoints/credentials.ts +74 -0
- package/src/homebridge-ui/endpoints/devices.ts +383 -0
- package/src/homebridge-ui/endpoints/discovery.ts +191 -0
- package/src/homebridge-ui/public/css/styles.css +254 -0
- package/src/homebridge-ui/public/index.html +112 -247
- package/src/homebridge-ui/public/js/api.ts +215 -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 +100 -0
- package/src/homebridge-ui/public/js/devices-delete.ts +236 -0
- package/src/homebridge-ui/public/js/devices.ts +98 -0
- package/src/homebridge-ui/public/js/discovery.ts +290 -0
- package/src/homebridge-ui/public/js/logger.ts +11 -0
- package/src/homebridge-ui/public/js/modal.ts +28 -0
- package/src/homebridge-ui/public/js/modals.ts +367 -0
- package/src/homebridge-ui/public/js/render.ts +579 -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 +11 -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 +4 -66
- package/src/platform.ts +1539 -0
- package/src/settings.ts +12 -277
- package/src/switchbotClient.ts +216 -0
- package/src/utils.ts +46 -713
- package/switchbot-homebridge-switchbot-5.0.0.tgz +0 -0
- 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 +59 -0
- package/test/matter-descriptors.spec.ts +97 -0
- package/test/matter-device-state.spec.ts +101 -0
- package/test/matter-integration.spec.ts +111 -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 +36 -0
- package/todo/COMPLETED.md +229 -0
- package/todo/README.md +59 -0
- package/todo/TODO.md +176 -0
- package/todo/mockups/filtering-sorting.svg +112 -0
- package/todo/mockups/modal-switchbot-theme.svg +66 -0
- package/todo/mockups/signal-strength-visualization.svg +94 -0
- package/vitest.config.ts +7 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -15847
- package/coverage/coverage-final.json +0 -42
- package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
- package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
- package/coverage/docs/assets/dmt/index.html +0 -131
- package/coverage/docs/assets/hierarchy.js.html +0 -85
- package/coverage/docs/assets/icons.js.html +0 -136
- package/coverage/docs/assets/index.html +0 -146
- package/coverage/docs/assets/main.js.html +0 -265
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -191
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/src/device/blindtilt.ts.html +0 -3238
- package/coverage/src/device/bot.ts.html +0 -2803
- package/coverage/src/device/ceilinglight.ts.html +0 -2338
- package/coverage/src/device/colorbulb.ts.html +0 -2824
- package/coverage/src/device/contact.ts.html +0 -1465
- package/coverage/src/device/curtain.ts.html +0 -2869
- package/coverage/src/device/device.ts.html +0 -2500
- package/coverage/src/device/fan.ts.html +0 -2242
- package/coverage/src/device/hub.ts.html +0 -1408
- package/coverage/src/device/humidifier.ts.html +0 -2116
- package/coverage/src/device/index.html +0 -416
- package/coverage/src/device/iosensor.ts.html +0 -1375
- package/coverage/src/device/lightstrip.ts.html +0 -2617
- package/coverage/src/device/lock.ts.html +0 -1963
- package/coverage/src/device/meter.ts.html +0 -1372
- package/coverage/src/device/meterplus.ts.html +0 -1384
- package/coverage/src/device/meterpro.ts.html +0 -1618
- package/coverage/src/device/motion.ts.html +0 -1264
- package/coverage/src/device/plug.ts.html +0 -1372
- package/coverage/src/device/relayswitch.ts.html +0 -2284
- package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
- package/coverage/src/device/waterdetector.ts.html +0 -1294
- package/coverage/src/homebridge-ui/index.html +0 -116
- package/coverage/src/homebridge-ui/server.ts.html +0 -229
- package/coverage/src/index.html +0 -161
- package/coverage/src/index.ts.html +0 -124
- package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
- package/coverage/src/irdevice/airpurifier.ts.html +0 -844
- package/coverage/src/irdevice/camera.ts.html +0 -475
- package/coverage/src/irdevice/fan.ts.html +0 -766
- package/coverage/src/irdevice/index.html +0 -251
- package/coverage/src/irdevice/irdevice.ts.html +0 -1117
- package/coverage/src/irdevice/light.ts.html +0 -826
- package/coverage/src/irdevice/other.ts.html +0 -2458
- package/coverage/src/irdevice/tv.ts.html +0 -1222
- package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
- package/coverage/src/irdevice/waterheater.ts.html +0 -469
- package/coverage/src/platform.ts.html +0 -8776
- package/coverage/src/settings.ts.html +0 -934
- package/coverage/src/utils.ts.html +0 -2092
- package/dist/devices-hap/airpurifier.d.ts +0 -54
- package/dist/devices-hap/airpurifier.d.ts.map +0 -1
- package/dist/devices-hap/airpurifier.js +0 -527
- package/dist/devices-hap/airpurifier.js.map +0 -1
- package/dist/devices-hap/blindtilt.d.ts +0 -90
- package/dist/devices-hap/blindtilt.d.ts.map +0 -1
- package/dist/devices-hap/blindtilt.js +0 -974
- package/dist/devices-hap/blindtilt.js.map +0 -1
- package/dist/devices-hap/bot.d.ts +0 -102
- package/dist/devices-hap/bot.d.ts.map +0 -1
- package/dist/devices-hap/bot.js +0 -811
- package/dist/devices-hap/bot.js.map +0 -1
- package/dist/devices-hap/ceilinglight.d.ts +0 -85
- package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
- package/dist/devices-hap/ceilinglight.js +0 -701
- package/dist/devices-hap/ceilinglight.js.map +0 -1
- package/dist/devices-hap/colorbulb.d.ts +0 -88
- package/dist/devices-hap/colorbulb.d.ts.map +0 -1
- package/dist/devices-hap/colorbulb.js +0 -881
- package/dist/devices-hap/colorbulb.js.map +0 -1
- package/dist/devices-hap/contact.d.ts +0 -44
- package/dist/devices-hap/contact.d.ts.map +0 -1
- package/dist/devices-hap/contact.js +0 -409
- package/dist/devices-hap/contact.js.map +0 -1
- package/dist/devices-hap/curtain.d.ts +0 -73
- package/dist/devices-hap/curtain.d.ts.map +0 -1
- package/dist/devices-hap/curtain.js +0 -869
- package/dist/devices-hap/curtain.js.map +0 -1
- package/dist/devices-hap/device.d.ts +0 -98
- package/dist/devices-hap/device.d.ts.map +0 -1
- package/dist/devices-hap/device.js +0 -749
- package/dist/devices-hap/device.js.map +0 -1
- package/dist/devices-hap/fan.d.ts +0 -69
- package/dist/devices-hap/fan.d.ts.map +0 -1
- package/dist/devices-hap/fan.js +0 -649
- package/dist/devices-hap/fan.js.map +0 -1
- package/dist/devices-hap/hub.d.ts +0 -37
- package/dist/devices-hap/hub.d.ts.map +0 -1
- package/dist/devices-hap/hub.js +0 -392
- package/dist/devices-hap/hub.js.map +0 -1
- package/dist/devices-hap/humidifier.d.ts +0 -68
- package/dist/devices-hap/humidifier.d.ts.map +0 -1
- package/dist/devices-hap/humidifier.js +0 -628
- package/dist/devices-hap/humidifier.js.map +0 -1
- package/dist/devices-hap/iosensor.d.ts +0 -42
- package/dist/devices-hap/iosensor.d.ts.map +0 -1
- package/dist/devices-hap/iosensor.js +0 -382
- package/dist/devices-hap/iosensor.js.map +0 -1
- package/dist/devices-hap/lightstrip.d.ts +0 -79
- package/dist/devices-hap/lightstrip.d.ts.map +0 -1
- package/dist/devices-hap/lightstrip.js +0 -797
- package/dist/devices-hap/lightstrip.js.map +0 -1
- package/dist/devices-hap/lock.d.ts +0 -53
- package/dist/devices-hap/lock.d.ts.map +0 -1
- package/dist/devices-hap/lock.js +0 -561
- package/dist/devices-hap/lock.js.map +0 -1
- package/dist/devices-hap/meter.d.ts +0 -37
- package/dist/devices-hap/meter.d.ts.map +0 -1
- package/dist/devices-hap/meter.js +0 -379
- package/dist/devices-hap/meter.js.map +0 -1
- package/dist/devices-hap/meterplus.d.ts +0 -42
- package/dist/devices-hap/meterplus.d.ts.map +0 -1
- package/dist/devices-hap/meterplus.js +0 -384
- package/dist/devices-hap/meterplus.js.map +0 -1
- package/dist/devices-hap/meterpro.d.ts +0 -43
- package/dist/devices-hap/meterpro.d.ts.map +0 -1
- package/dist/devices-hap/meterpro.js +0 -468
- package/dist/devices-hap/meterpro.js.map +0 -1
- package/dist/devices-hap/motion.d.ts +0 -42
- package/dist/devices-hap/motion.d.ts.map +0 -1
- package/dist/devices-hap/motion.js +0 -345
- package/dist/devices-hap/motion.js.map +0 -1
- package/dist/devices-hap/plug.d.ts +0 -49
- package/dist/devices-hap/plug.d.ts.map +0 -1
- package/dist/devices-hap/plug.js +0 -395
- package/dist/devices-hap/plug.js.map +0 -1
- package/dist/devices-hap/relayswitch.d.ts +0 -96
- package/dist/devices-hap/relayswitch.d.ts.map +0 -1
- package/dist/devices-hap/relayswitch.js +0 -642
- package/dist/devices-hap/relayswitch.js.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
- package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
- package/dist/devices-hap/robotvacuumcleaner.js +0 -523
- package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
- package/dist/devices-hap/waterdetector.d.ts +0 -41
- package/dist/devices-hap/waterdetector.d.ts.map +0 -1
- package/dist/devices-hap/waterdetector.js +0 -356
- package/dist/devices-hap/waterdetector.js.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -63
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -100
- package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorLightAccessory.js +0 -95
- package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -78
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ContactSensorAccessory.js +0 -34
- package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
- package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DimmableLightAccessory.js +0 -167
- package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
- package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
- package/dist/devices-matter/DoorLockAccessory.js +0 -50
- package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -107
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
- package/dist/devices-matter/FanAccessory.d.ts +0 -16
- package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
- package/dist/devices-matter/FanAccessory.js +0 -81
- package/dist/devices-matter/FanAccessory.js.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
- package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LeakSensorAccessory.js +0 -33
- package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/LightSensorAccessory.js +0 -34
- package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
- package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
- package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffLightAccessory.js +0 -118
- package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
- package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
- package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
- package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
- package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
- package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
- package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
- package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
- package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
- package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
- package/dist/devices-matter/ThermostatAccessory.js +0 -95
- package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
- package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
- package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
- package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
- package/dist/devices-matter/WindowBlindAccessory.js +0 -80
- package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
- package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
- package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
- package/dist/devices-matter/custom/index.d.ts +0 -8
- package/dist/devices-matter/custom/index.d.ts.map +0 -1
- package/dist/devices-matter/custom/index.js +0 -8
- package/dist/devices-matter/custom/index.js.map +0 -1
- package/dist/devices-matter/index.d.ts +0 -29
- package/dist/devices-matter/index.d.ts.map +0 -1
- package/dist/devices-matter/index.js +0 -28
- package/dist/devices-matter/index.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -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 -298
- package/dist/irdevice/irdevice.js.map +0 -1
- package/dist/irdevice/light.d.ts +0 -36
- package/dist/irdevice/light.d.ts.map +0 -1
- package/dist/irdevice/light.js +0 -206
- package/dist/irdevice/light.js.map +0 -1
- package/dist/irdevice/other.d.ts +0 -57
- package/dist/irdevice/other.d.ts.map +0 -1
- package/dist/irdevice/other.js +0 -778
- package/dist/irdevice/other.js.map +0 -1
- package/dist/irdevice/tv.d.ts +0 -45
- package/dist/irdevice/tv.d.ts.map +0 -1
- package/dist/irdevice/tv.js +0 -327
- package/dist/irdevice/tv.js.map +0 -1
- package/dist/irdevice/vacuumcleaner.d.ts +0 -28
- package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
- package/dist/irdevice/vacuumcleaner.js +0 -104
- package/dist/irdevice/vacuumcleaner.js.map +0 -1
- package/dist/irdevice/waterheater.d.ts +0 -30
- package/dist/irdevice/waterheater.d.ts.map +0 -1
- package/dist/irdevice/waterheater.js +0 -105
- package/dist/irdevice/waterheater.js.map +0 -1
- package/dist/platform-hap.d.ts +0 -149
- package/dist/platform-hap.d.ts.map +0 -1
- package/dist/platform-hap.js +0 -2861
- package/dist/platform-hap.js.map +0 -1
- package/dist/platform-matter.d.ts +0 -120
- package/dist/platform-matter.d.ts.map +0 -1
- package/dist/platform-matter.js +0 -984
- package/dist/platform-matter.js.map +0 -1
- package/dist/verifyconfig.test.d.ts +0 -2
- package/dist/verifyconfig.test.d.ts.map +0 -1
- package/dist/verifyconfig.test.js +0 -167
- package/dist/verifyconfig.test.js.map +0 -1
- package/src/custom.d.ts +0 -7
- package/src/devices-hap/airpurifier.ts +0 -563
- package/src/devices-hap/blindtilt.ts +0 -1049
- package/src/devices-hap/bot.ts +0 -900
- package/src/devices-hap/ceilinglight.ts +0 -742
- package/src/devices-hap/colorbulb.ts +0 -904
- package/src/devices-hap/contact.ts +0 -457
- package/src/devices-hap/curtain.ts +0 -944
- package/src/devices-hap/device.ts +0 -811
- package/src/devices-hap/fan.ts +0 -711
- package/src/devices-hap/hub.ts +0 -439
- package/src/devices-hap/humidifier.ts +0 -669
- package/src/devices-hap/iosensor.ts +0 -427
- package/src/devices-hap/lightstrip.ts +0 -836
- package/src/devices-hap/lock.ts +0 -620
- package/src/devices-hap/meter.ts +0 -426
- package/src/devices-hap/meterplus.ts +0 -430
- package/src/devices-hap/meterpro.ts +0 -522
- package/src/devices-hap/motion.ts +0 -390
- package/src/devices-hap/plug.ts +0 -423
- package/src/devices-hap/relayswitch.ts +0 -727
- package/src/devices-hap/robotvacuumcleaner.ts +0 -568
- package/src/devices-hap/waterdetector.ts +0 -400
- package/src/devices-matter/BaseMatterAccessory.ts +0 -131
- package/src/devices-matter/ColorLightAccessory.ts +0 -110
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
- package/src/devices-matter/ContactSensorAccessory.ts +0 -41
- package/src/devices-matter/DimmableLightAccessory.ts +0 -192
- package/src/devices-matter/DoorLockAccessory.ts +0 -60
- package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -123
- package/src/devices-matter/FanAccessory.ts +0 -95
- package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
- package/src/devices-matter/LeakSensorAccessory.ts +0 -40
- package/src/devices-matter/LightSensorAccessory.ts +0 -41
- package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
- package/src/devices-matter/OnOffLightAccessory.ts +0 -133
- package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
- package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
- package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
- package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
- package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
- package/src/devices-matter/ThermostatAccessory.ts +0 -110
- package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
- package/src/devices-matter/WindowBlindAccessory.ts +0 -92
- package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
- package/src/devices-matter/custom/index.ts +0 -8
- package/src/devices-matter/index.ts +0 -29
- package/src/index.test.ts +0 -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 -344
- package/src/irdevice/light.ts +0 -246
- package/src/irdevice/other.ts +0 -790
- package/src/irdevice/tv.ts +0 -378
- package/src/irdevice/vacuumcleaner.ts +0 -126
- package/src/irdevice/waterheater.ts +0 -127
- package/src/platform-hap.ts +0 -2997
- package/src/platform-matter.ts +0 -1110
- package/src/verifyconfig.test.ts +0 -197
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const DEVICE_TYPES: {
|
|
2
|
+
readonly 'Window Coverings': readonly ["Blind Tilt", "Curtain", "Curtain3", "Roller Shade"];
|
|
3
|
+
readonly 'Locks & Access': readonly ["Keypad", "Keypad Touch", "Keypad Vision", "Keypad Vision Pro", "Lock Vision Pro", "Lock Lite", "Smart Lock", "Smart Lock Pro", "Smart Lock Ultra", "Video Doorbell"];
|
|
4
|
+
readonly Sensors: readonly ["Contact Sensor", "Motion Sensor", "Presence Sensor", "Water Detector"];
|
|
5
|
+
readonly Lighting: readonly ["Candle Warmer Lamp", "Ceiling Light", "Ceiling Light Pro", "Color Bulb", "Floor Lamp", "RGBIC Neon Rope Light", "RGBIC Neon Wire Rope Light", "RGBICWW Floor Lamp", "RGBICWW Strip Light", "Strip Light", "Strip Light 3"];
|
|
6
|
+
readonly 'Climate Control': readonly ["Air Purifier PM2.5", "Air Purifier Table PM2.5", "Air Purifier VOC", "Air Purifier Table VOC", "Battery Circulator Fan", "Circulator Fan", "Humidifier", "Humidifier2", "Meter", "MeterPlus", "Meter Plus", "MeterPro", "Meter Pro", "MeterPro(CO2)", "Meter Pro (CO2)", "Smart Radiator Thermostat", "Standing Circulator Fan", "WoIOSensor"];
|
|
7
|
+
readonly 'Plugs & Switches': readonly ["Garage Door Opener", "Plug", "Plug Mini (EU)", "Plug Mini (JP)", "Plug Mini (US)", "Relay Switch 1", "Relay Switch 1PM", "Relay Switch 2PM"];
|
|
8
|
+
readonly 'Robot Vacuums': readonly ["K10+", "K10+ Pro", "Robot Vacuum Cleaner K10+ Pro Combo", "Robot Vacuum Cleaner K11+", "Robot Vacuum Cleaner K20 Plus Pro", "Robot Vacuum Cleaner S1", "Robot Vacuum Cleaner S1 Plus", "Robot Vacuum Cleaner S10", "Robot Vacuum Cleaner S20"];
|
|
9
|
+
readonly Hubs: readonly ["AI Hub", "Hub", "Hub 2", "Hub 3", "Hub Mini", "Hub Plus"];
|
|
10
|
+
readonly Cameras: readonly ["Indoor Cam", "Pan/Tilt Cam", "Pan/Tilt Cam 2K", "Pan/Tilt Cam Plus 2K", "Pan/Tilt Cam Plus 3K"];
|
|
11
|
+
readonly 'IR Devices': readonly ["Air Conditioner", "Air Purifier", "Camera", "DVD", "Fan", "Light", "Others", "Projector", "Set Top Box", "Speaker", "Streamer", "TV", "Vacuum Cleaner", "Water Heater"];
|
|
12
|
+
readonly 'Other Devices': readonly ["AI Art Frame", "Bot", "Home Climate Panel", "Remote", "remote with screen"];
|
|
13
|
+
};
|
|
14
|
+
export declare const DEVICE_TYPE_NORMALIZATION_MAP: Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Get all valid device types as a flat set for validation
|
|
17
|
+
*/
|
|
18
|
+
export declare function getValidDeviceTypes(): Set<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Normalize and validate a device type, returning a valid type or null
|
|
21
|
+
* @param deviceType The device type to validate/normalize
|
|
22
|
+
* @returns Valid device type string or null if no valid mapping found
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeDeviceType(deviceType: string | undefined | null): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a device type is valid
|
|
27
|
+
* @param deviceType The device type to check
|
|
28
|
+
* @returns true if device type is in DEVICE_TYPES
|
|
29
|
+
*/
|
|
30
|
+
export declare function isValidDeviceType(deviceType: string | undefined | null): boolean;
|
|
31
|
+
//# sourceMappingURL=device-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-types.d.ts","sourceRoot":"","sources":["../src/device-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;;CA8Ff,CAAA;AAEV,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA8EhE,CAAA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,CAAC,CAQjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAsBxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAMhF"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
export const DEVICE_TYPES = {
|
|
2
|
+
'Window Coverings': ['Blind Tilt', 'Curtain', 'Curtain3', 'Roller Shade'],
|
|
3
|
+
'Locks & Access': [
|
|
4
|
+
'Keypad',
|
|
5
|
+
'Keypad Touch',
|
|
6
|
+
'Keypad Vision',
|
|
7
|
+
'Keypad Vision Pro',
|
|
8
|
+
'Lock Vision Pro',
|
|
9
|
+
'Lock Lite',
|
|
10
|
+
'Smart Lock',
|
|
11
|
+
'Smart Lock Pro',
|
|
12
|
+
'Smart Lock Ultra',
|
|
13
|
+
'Video Doorbell',
|
|
14
|
+
],
|
|
15
|
+
'Sensors': ['Contact Sensor', 'Motion Sensor', 'Presence Sensor', 'Water Detector'],
|
|
16
|
+
'Lighting': [
|
|
17
|
+
'Candle Warmer Lamp',
|
|
18
|
+
'Ceiling Light',
|
|
19
|
+
'Ceiling Light Pro',
|
|
20
|
+
'Color Bulb',
|
|
21
|
+
'Floor Lamp',
|
|
22
|
+
'RGBIC Neon Rope Light',
|
|
23
|
+
'RGBIC Neon Wire Rope Light',
|
|
24
|
+
'RGBICWW Floor Lamp',
|
|
25
|
+
'RGBICWW Strip Light',
|
|
26
|
+
'Strip Light',
|
|
27
|
+
'Strip Light 3',
|
|
28
|
+
],
|
|
29
|
+
'Climate Control': [
|
|
30
|
+
'Air Purifier PM2.5',
|
|
31
|
+
'Air Purifier Table PM2.5',
|
|
32
|
+
'Air Purifier VOC',
|
|
33
|
+
'Air Purifier Table VOC',
|
|
34
|
+
'Battery Circulator Fan',
|
|
35
|
+
'Circulator Fan',
|
|
36
|
+
'Humidifier',
|
|
37
|
+
'Humidifier2',
|
|
38
|
+
'Meter',
|
|
39
|
+
'MeterPlus',
|
|
40
|
+
'Meter Plus',
|
|
41
|
+
'MeterPro',
|
|
42
|
+
'Meter Pro',
|
|
43
|
+
'MeterPro(CO2)',
|
|
44
|
+
'Meter Pro (CO2)',
|
|
45
|
+
'Smart Radiator Thermostat',
|
|
46
|
+
'Standing Circulator Fan',
|
|
47
|
+
'WoIOSensor',
|
|
48
|
+
],
|
|
49
|
+
'Plugs & Switches': [
|
|
50
|
+
'Garage Door Opener',
|
|
51
|
+
'Plug',
|
|
52
|
+
'Plug Mini (EU)',
|
|
53
|
+
'Plug Mini (JP)',
|
|
54
|
+
'Plug Mini (US)',
|
|
55
|
+
'Relay Switch 1',
|
|
56
|
+
'Relay Switch 1PM',
|
|
57
|
+
'Relay Switch 2PM',
|
|
58
|
+
],
|
|
59
|
+
'Robot Vacuums': [
|
|
60
|
+
'K10+',
|
|
61
|
+
'K10+ Pro',
|
|
62
|
+
'Robot Vacuum Cleaner K10+ Pro Combo',
|
|
63
|
+
'Robot Vacuum Cleaner K11+',
|
|
64
|
+
'Robot Vacuum Cleaner K20 Plus Pro',
|
|
65
|
+
'Robot Vacuum Cleaner S1',
|
|
66
|
+
'Robot Vacuum Cleaner S1 Plus',
|
|
67
|
+
'Robot Vacuum Cleaner S10',
|
|
68
|
+
'Robot Vacuum Cleaner S20',
|
|
69
|
+
],
|
|
70
|
+
'Hubs': ['AI Hub', 'Hub', 'Hub 2', 'Hub 3', 'Hub Mini', 'Hub Plus'],
|
|
71
|
+
'Cameras': [
|
|
72
|
+
'Indoor Cam',
|
|
73
|
+
'Pan/Tilt Cam',
|
|
74
|
+
'Pan/Tilt Cam 2K',
|
|
75
|
+
'Pan/Tilt Cam Plus 2K',
|
|
76
|
+
'Pan/Tilt Cam Plus 3K',
|
|
77
|
+
],
|
|
78
|
+
'IR Devices': [
|
|
79
|
+
'Air Conditioner',
|
|
80
|
+
'Air Purifier',
|
|
81
|
+
'Camera',
|
|
82
|
+
'DVD',
|
|
83
|
+
'Fan',
|
|
84
|
+
'Light',
|
|
85
|
+
'Others',
|
|
86
|
+
'Projector',
|
|
87
|
+
'Set Top Box',
|
|
88
|
+
'Speaker',
|
|
89
|
+
'Streamer',
|
|
90
|
+
'TV',
|
|
91
|
+
'Vacuum Cleaner',
|
|
92
|
+
'Water Heater',
|
|
93
|
+
],
|
|
94
|
+
'Other Devices': ['AI Art Frame', 'Bot', 'Home Climate Panel', 'Remote', 'remote with screen'],
|
|
95
|
+
};
|
|
96
|
+
export const DEVICE_TYPE_NORMALIZATION_MAP = {
|
|
97
|
+
// Sensor type conversions
|
|
98
|
+
'motion sensor': 'motion',
|
|
99
|
+
'contact sensor': 'contact',
|
|
100
|
+
'presence sensor': 'contact',
|
|
101
|
+
'water detector': 'water detector',
|
|
102
|
+
// Climate control conversions
|
|
103
|
+
'humidifier2': 'humidifier',
|
|
104
|
+
'circulator fan': 'fan',
|
|
105
|
+
'battery circulator fan': 'fan',
|
|
106
|
+
'standing circulator fan': 'fan',
|
|
107
|
+
// Lock/keypad conversions
|
|
108
|
+
'smart lock': 'lock',
|
|
109
|
+
'smart lock pro': 'lock',
|
|
110
|
+
'smart lock ultra': 'lock',
|
|
111
|
+
'lock lite': 'lock',
|
|
112
|
+
'keypad': 'lock',
|
|
113
|
+
'keypad touch': 'lock',
|
|
114
|
+
'keypad vision': 'lock',
|
|
115
|
+
'keypad vision pro': 'lock',
|
|
116
|
+
// Light conversions
|
|
117
|
+
'color bulb': 'light',
|
|
118
|
+
'ceiling light': 'light',
|
|
119
|
+
'ceiling light pro': 'light',
|
|
120
|
+
'candle warmer lamp': 'light',
|
|
121
|
+
'floor lamp': 'light',
|
|
122
|
+
'rgbic neon rope light': 'lightstrip',
|
|
123
|
+
'rgbic neon wire rope light': 'lightstrip',
|
|
124
|
+
'rgbicww floor lamp': 'lightstrip',
|
|
125
|
+
'rgbicww strip light': 'lightstrip',
|
|
126
|
+
'strip light': 'strip light',
|
|
127
|
+
'strip light 3': 'strip light',
|
|
128
|
+
// Vacuum conversions
|
|
129
|
+
'robot vacuum cleaner s1': 'vacuum',
|
|
130
|
+
'robot vacuum cleaner s1 plus': 'vacuum',
|
|
131
|
+
'robot vacuum cleaner s10': 'vacuum',
|
|
132
|
+
'robot vacuum cleaner s20': 'vacuum',
|
|
133
|
+
'robot vacuum cleaner k10+ pro combo': 'wosweeper',
|
|
134
|
+
'robot vacuum cleaner k11+': 'wosweeper',
|
|
135
|
+
'robot vacuum cleaner k20 plus pro': 'wosweeper',
|
|
136
|
+
// Exact device type mappings (API format → canonical format)
|
|
137
|
+
'plug mini (eu)': 'plug mini (eu)',
|
|
138
|
+
'plug mini (jp)': 'plug mini (jp)',
|
|
139
|
+
'plug mini (us)': 'plug mini (us)',
|
|
140
|
+
'relay switch 1': 'relay switch 1',
|
|
141
|
+
'relay switch 1pm': 'relay switch 1pm',
|
|
142
|
+
'relay switch 2pm': 'relay switch 2pm',
|
|
143
|
+
'blind tilt': 'blind tilt',
|
|
144
|
+
'roller shade': 'roller shade',
|
|
145
|
+
'curtain3': 'curtain3',
|
|
146
|
+
'hub 2': 'hub 2',
|
|
147
|
+
'meterplus': 'meterplus',
|
|
148
|
+
'meterpro': 'meterpro',
|
|
149
|
+
'meterpro(co2)': 'meterpro(co2)',
|
|
150
|
+
'walletfinder': 'walletfinder',
|
|
151
|
+
'k10+': 'k10+',
|
|
152
|
+
'k10+ pro': 'k10+ pro',
|
|
153
|
+
'k10+ pro (wosweeperminipro)': 'k10+ pro (wosweeperminipro)',
|
|
154
|
+
// Handle spaced variants from config files (normalize back to API format)
|
|
155
|
+
'meter pro': 'meterpro',
|
|
156
|
+
'meter pro (co2)': 'meterpro(co2)',
|
|
157
|
+
'meter plus': 'meterplus',
|
|
158
|
+
'relay switch 1 pm': 'relay switch 1pm',
|
|
159
|
+
'relay switch 2 pm': 'relay switch 2pm',
|
|
160
|
+
'plug mini eu': 'plug mini (eu)',
|
|
161
|
+
'plug mini jp': 'plug mini (jp)',
|
|
162
|
+
'plug mini us': 'plug mini (us)',
|
|
163
|
+
// Migration mappings for invalid/legacy device types
|
|
164
|
+
'lock vision pro': 'lock', // Valid alias; map to lock behavior
|
|
165
|
+
'lock vision': 'Keypad Vision', // Invalid type
|
|
166
|
+
'lock touch': 'Keypad Touch', // Invalid type
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Get all valid device types as a flat set for validation
|
|
170
|
+
*/
|
|
171
|
+
export function getValidDeviceTypes() {
|
|
172
|
+
const validTypes = new Set();
|
|
173
|
+
for (const category of Object.values(DEVICE_TYPES)) {
|
|
174
|
+
for (const type of category) {
|
|
175
|
+
validTypes.add(type);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return validTypes;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Normalize and validate a device type, returning a valid type or null
|
|
182
|
+
* @param deviceType The device type to validate/normalize
|
|
183
|
+
* @returns Valid device type string or null if no valid mapping found
|
|
184
|
+
*/
|
|
185
|
+
export function normalizeDeviceType(deviceType) {
|
|
186
|
+
if (!deviceType || typeof deviceType !== 'string') {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const trimmed = deviceType.trim();
|
|
190
|
+
const lowercase = trimmed.toLowerCase();
|
|
191
|
+
// Check if already valid
|
|
192
|
+
const validTypes = getValidDeviceTypes();
|
|
193
|
+
if (validTypes.has(trimmed)) {
|
|
194
|
+
return trimmed;
|
|
195
|
+
}
|
|
196
|
+
// Check normalization map
|
|
197
|
+
const normalized = DEVICE_TYPE_NORMALIZATION_MAP[lowercase];
|
|
198
|
+
if (normalized && validTypes.has(normalized)) {
|
|
199
|
+
return normalized;
|
|
200
|
+
}
|
|
201
|
+
// No valid mapping found
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if a device type is valid
|
|
206
|
+
* @param deviceType The device type to check
|
|
207
|
+
* @returns true if device type is in DEVICE_TYPES
|
|
208
|
+
*/
|
|
209
|
+
export function isValidDeviceType(deviceType) {
|
|
210
|
+
if (!deviceType || typeof deviceType !== 'string') {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
const validTypes = getValidDeviceTypes();
|
|
214
|
+
return validTypes.has(deviceType.trim());
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=device-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-types.js","sourceRoot":"","sources":["../src/device-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DeviceType, SwitchBotPluginConfig } from './settings.js';
|
|
2
|
+
export interface DeviceOptions {
|
|
3
|
+
id: string;
|
|
4
|
+
type: DeviceType;
|
|
5
|
+
name?: string;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export declare function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConfig, useMatter: boolean): Promise<{
|
|
9
|
+
instance: any;
|
|
10
|
+
createAccessory: (api: any) => any;
|
|
11
|
+
protocol: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=deviceFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceFactory.d.ts","sourceRoot":"","sources":["../src/deviceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAmCtE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAqFD,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,qBAAqB,EAAE,SAAS,EAAE,OAAO;;2BAkC3E,GAAG;;GAG7B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { DEVICE_TYPE_NORMALIZATION_MAP } from './device-types.js';
|
|
2
|
+
import { BlindTiltDevice, BotDevice, ContactSensorDevice, Curtain3Device, CurtainDevice, FanDevice, GenericDevice, Hub2Device, HumidifierDevice, LightDevice, LightStripDevice, LockDevice, MeterDevice, MotionSensorDevice, PlugDevice, PlugMiniDevice, RelaySwitch1PMDevice, RelaySwitchDevice, RollerShadeDevice, SmartFanDevice, StripLightDevice, TemperatureSensorDevice, VacuumDevice, WalletFinderDevice, WaterDetectorDevice, WoSweeperDevice, WoSweeperMiniDevice, WoSweeperMiniProDevice, } from './devices/genericDevice.js';
|
|
3
|
+
import { SwitchBotClient } from './switchbotClient.js';
|
|
4
|
+
const DEVICE_CLASS_MAP = {
|
|
5
|
+
// Primary device type keys (lowercase, simplified)
|
|
6
|
+
'bot': BotDevice,
|
|
7
|
+
'curtain': CurtainDevice,
|
|
8
|
+
'fan': FanDevice,
|
|
9
|
+
'light': LightDevice,
|
|
10
|
+
'lightstrip': LightStripDevice,
|
|
11
|
+
'motion': MotionSensorDevice,
|
|
12
|
+
'contact': ContactSensorDevice,
|
|
13
|
+
'vacuum': VacuumDevice,
|
|
14
|
+
'lock': LockDevice,
|
|
15
|
+
'humidifier': HumidifierDevice,
|
|
16
|
+
'temperature': TemperatureSensorDevice,
|
|
17
|
+
'relay switch 1': RelaySwitchDevice,
|
|
18
|
+
'relay switch 1pm': RelaySwitch1PMDevice,
|
|
19
|
+
'relay switch 2pm': RelaySwitch1PMDevice,
|
|
20
|
+
'plug': PlugDevice,
|
|
21
|
+
'plug mini (jp)': PlugMiniDevice,
|
|
22
|
+
'plug mini (us)': PlugMiniDevice,
|
|
23
|
+
'plug mini (eu)': PlugMiniDevice,
|
|
24
|
+
'blind tilt': BlindTiltDevice,
|
|
25
|
+
'curtain3': Curtain3Device,
|
|
26
|
+
'worollershade': RollerShadeDevice,
|
|
27
|
+
'wo rollershade': RollerShadeDevice,
|
|
28
|
+
'roller shade': RollerShadeDevice,
|
|
29
|
+
'rollershade': RollerShadeDevice,
|
|
30
|
+
'hub 2': Hub2Device,
|
|
31
|
+
'meter': MeterDevice,
|
|
32
|
+
'meterplus': MeterDevice,
|
|
33
|
+
'meter plus (jp)': MeterDevice,
|
|
34
|
+
'meterpro': MeterDevice,
|
|
35
|
+
'meterpro(co2)': MeterDevice,
|
|
36
|
+
'water detector': WaterDetectorDevice,
|
|
37
|
+
'smart fan': SmartFanDevice,
|
|
38
|
+
'strip light': StripLightDevice,
|
|
39
|
+
'strip light 3': StripLightDevice,
|
|
40
|
+
'walletfinder': WalletFinderDevice,
|
|
41
|
+
'wosweeper': WoSweeperDevice,
|
|
42
|
+
'wosweepermini': WoSweeperMiniDevice,
|
|
43
|
+
'wosweeperminipro': WoSweeperMiniProDevice,
|
|
44
|
+
'k10+': WoSweeperDevice,
|
|
45
|
+
'k10+ pro': WoSweeperDevice,
|
|
46
|
+
'k10+ pro (wosweeperminipro)': WoSweeperMiniProDevice,
|
|
47
|
+
// API display name aliases (for UI compatibility)
|
|
48
|
+
'motion sensor': MotionSensorDevice,
|
|
49
|
+
'contact sensor': ContactSensorDevice,
|
|
50
|
+
'humidifier2': HumidifierDevice,
|
|
51
|
+
'circulator fan': FanDevice,
|
|
52
|
+
'battery circulator fan': FanDevice,
|
|
53
|
+
'standing circulator fan': FanDevice,
|
|
54
|
+
'smart lock': LockDevice,
|
|
55
|
+
'smart lock pro': LockDevice,
|
|
56
|
+
'smart lock ultra': LockDevice,
|
|
57
|
+
'lock lite': LockDevice,
|
|
58
|
+
'keypad': LockDevice,
|
|
59
|
+
'keypad touch': LockDevice,
|
|
60
|
+
'keypad vision': LockDevice,
|
|
61
|
+
'keypad vision pro': LockDevice,
|
|
62
|
+
'lock vision pro': LockDevice,
|
|
63
|
+
'color bulb': LightDevice,
|
|
64
|
+
'ceiling light': LightDevice,
|
|
65
|
+
'ceiling light pro': LightDevice,
|
|
66
|
+
'candle warmer lamp': LightDevice,
|
|
67
|
+
'floor lamp': LightDevice,
|
|
68
|
+
'rgbic neon rope light': LightStripDevice,
|
|
69
|
+
'rgbic neon wire rope light': LightStripDevice,
|
|
70
|
+
'rgbicww floor lamp': LightStripDevice,
|
|
71
|
+
'rgbicww strip light': LightStripDevice,
|
|
72
|
+
'robot vacuum cleaner s1': VacuumDevice,
|
|
73
|
+
'robot vacuum cleaner s1 plus': VacuumDevice,
|
|
74
|
+
'robot vacuum cleaner s10': VacuumDevice,
|
|
75
|
+
'robot vacuum cleaner s20': VacuumDevice,
|
|
76
|
+
'robot vacuum cleaner k10+ pro combo': WoSweeperDevice,
|
|
77
|
+
'robot vacuum cleaner k11+': WoSweeperDevice,
|
|
78
|
+
'robot vacuum cleaner k20 plus pro': WoSweeperDevice,
|
|
79
|
+
};
|
|
80
|
+
function classForType(type) {
|
|
81
|
+
const rawKey = (type || '').toLowerCase();
|
|
82
|
+
const key = DEVICE_TYPE_NORMALIZATION_MAP[rawKey] ?? rawKey;
|
|
83
|
+
return DEVICE_CLASS_MAP[key] ?? GenericDevice;
|
|
84
|
+
}
|
|
85
|
+
export async function createDevice(opts, cfg, useMatter) {
|
|
86
|
+
// Reuse existing client when provided via config to avoid creating
|
|
87
|
+
// a new SwitchBotClient per device (which can be expensive).
|
|
88
|
+
let client = cfg?._client ?? null;
|
|
89
|
+
if (!client) {
|
|
90
|
+
client = new SwitchBotClient(cfg);
|
|
91
|
+
await client.init();
|
|
92
|
+
}
|
|
93
|
+
// Pass client via config so devices can access it
|
|
94
|
+
const mergedCfg = { ...cfg, _client: client };
|
|
95
|
+
const DeviceCtor = classForType(opts.type);
|
|
96
|
+
const device = new DeviceCtor(opts, mergedCfg);
|
|
97
|
+
await device.init();
|
|
98
|
+
// Attach a simple getState delegator to the client where appropriate
|
|
99
|
+
const originalGetState = device.getState.bind(device);
|
|
100
|
+
device.getState = async () => {
|
|
101
|
+
try {
|
|
102
|
+
// Prefer client-backed getDevice when available
|
|
103
|
+
const dev = await client.getDevice(opts.id);
|
|
104
|
+
if (dev) {
|
|
105
|
+
return dev;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
// ignore and fallback to device implementation
|
|
110
|
+
}
|
|
111
|
+
return originalGetState();
|
|
112
|
+
};
|
|
113
|
+
// Provide accessory factory based on platform selection
|
|
114
|
+
return {
|
|
115
|
+
instance: device,
|
|
116
|
+
createAccessory: (api) => (useMatter ? device.createMatterAccessory(api) : device.createHAPAccessory(api)),
|
|
117
|
+
protocol: useMatter ? 'matter' : 'hap',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=deviceFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceFactory.js","sourceRoot":"","sources":["../src/deviceFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { SwitchBotPluginConfig } from '../settings.js';
|
|
2
|
+
export interface DeviceOptions {
|
|
3
|
+
id: string;
|
|
4
|
+
type: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export declare abstract class DeviceBase {
|
|
9
|
+
protected opts: DeviceOptions;
|
|
10
|
+
protected cfg: SwitchBotPluginConfig;
|
|
11
|
+
protected client: any | null;
|
|
12
|
+
constructor(opts: DeviceOptions, cfg: SwitchBotPluginConfig);
|
|
13
|
+
init(): Promise<void>;
|
|
14
|
+
abstract getState(): Promise<any>;
|
|
15
|
+
abstract setState(change: any): Promise<any>;
|
|
16
|
+
/**
|
|
17
|
+
* Create and return a HAP accessory descriptor.
|
|
18
|
+
*
|
|
19
|
+
* This method returns a descriptor object (not a platformAccessory instance).
|
|
20
|
+
* The platform will use this descriptor to construct a real HAP accessory.
|
|
21
|
+
*
|
|
22
|
+
* Default descriptor provides a simple Switch service with an `On` characteristic
|
|
23
|
+
* backed by `getState()` / `setState()` so most simple devices work out of the box.
|
|
24
|
+
*
|
|
25
|
+
* If the Homebridge `api` is passed, `Service` and `Characteristic` constructors
|
|
26
|
+
* are included under `_resolved` for callers that need them.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* {
|
|
30
|
+
* id: 'd1',
|
|
31
|
+
* name: 'My Device',
|
|
32
|
+
* protocol: 'hap',
|
|
33
|
+
* services: [ { type: 'Switch', characteristics: { On: { get: async ()=>true, set: async v=>{} } } } ]
|
|
34
|
+
* }
|
|
35
|
+
*/
|
|
36
|
+
createHAPAccessory(api: any): any;
|
|
37
|
+
/**
|
|
38
|
+
* Create and return a Matter accessory descriptor.
|
|
39
|
+
*
|
|
40
|
+
* Returns a descriptor containing `clusters` and attribute read/write handlers
|
|
41
|
+
* which the platform will serialize when registering Matter accessories. The
|
|
42
|
+
* default provides an `OnOff` cluster wired to `getState()` / `setState()`.
|
|
43
|
+
*
|
|
44
|
+
* If the Homebridge `api` provides a `matter` namespace it is attached under
|
|
45
|
+
* `_resolved.matter` for callers that need direct access to the Matter API.
|
|
46
|
+
*/
|
|
47
|
+
createMatterAccessory(api: any): any;
|
|
48
|
+
destroy(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=deviceBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceBase.d.ts","sourceRoot":"","sources":["../../src/devices/deviceBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAI3D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,8BAAsB,UAAU;IAC9B,SAAS,CAAC,IAAI,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,GAAG,EAAE,qBAAqB,CAAA;IACpC,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAA;gBAEhB,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,qBAAqB;IAOrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3B,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAGjC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAE5C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAmCjC;;;;;;;;;OASG;IACH,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IA2C9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAC/B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { MATTER_ATTRIBUTE_IDS, MATTER_CLUSTER_IDS } from '../utils.js';
|
|
2
|
+
export class DeviceBase {
|
|
3
|
+
opts;
|
|
4
|
+
cfg;
|
|
5
|
+
client;
|
|
6
|
+
constructor(opts, cfg) {
|
|
7
|
+
this.opts = opts;
|
|
8
|
+
this.cfg = cfg;
|
|
9
|
+
this.client = cfg?._client ?? null;
|
|
10
|
+
}
|
|
11
|
+
// Initialize any connections/resources
|
|
12
|
+
async init() { }
|
|
13
|
+
/**
|
|
14
|
+
* Create and return a HAP accessory descriptor.
|
|
15
|
+
*
|
|
16
|
+
* This method returns a descriptor object (not a platformAccessory instance).
|
|
17
|
+
* The platform will use this descriptor to construct a real HAP accessory.
|
|
18
|
+
*
|
|
19
|
+
* Default descriptor provides a simple Switch service with an `On` characteristic
|
|
20
|
+
* backed by `getState()` / `setState()` so most simple devices work out of the box.
|
|
21
|
+
*
|
|
22
|
+
* If the Homebridge `api` is passed, `Service` and `Characteristic` constructors
|
|
23
|
+
* are included under `_resolved` for callers that need them.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* {
|
|
27
|
+
* id: 'd1',
|
|
28
|
+
* name: 'My Device',
|
|
29
|
+
* protocol: 'hap',
|
|
30
|
+
* services: [ { type: 'Switch', characteristics: { On: { get: async ()=>true, set: async v=>{} } } } ]
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
createHAPAccessory(api) {
|
|
34
|
+
const base = {
|
|
35
|
+
id: this.opts.id,
|
|
36
|
+
name: this.opts.name ?? this.opts.type,
|
|
37
|
+
protocol: 'hap',
|
|
38
|
+
services: [
|
|
39
|
+
{
|
|
40
|
+
type: 'Switch',
|
|
41
|
+
characteristics: {
|
|
42
|
+
On: {
|
|
43
|
+
get: async () => {
|
|
44
|
+
const s = await this.getState();
|
|
45
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'));
|
|
46
|
+
},
|
|
47
|
+
set: async (v) => {
|
|
48
|
+
await this.setState({ on: !!v });
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
const hap = api?.hap;
|
|
57
|
+
if (hap && hap.Service && hap.Characteristic) {
|
|
58
|
+
base._resolved = { Service: hap.Service, Characteristic: hap.Characteristic };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
// ignore
|
|
63
|
+
}
|
|
64
|
+
return base;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create and return a Matter accessory descriptor.
|
|
68
|
+
*
|
|
69
|
+
* Returns a descriptor containing `clusters` and attribute read/write handlers
|
|
70
|
+
* which the platform will serialize when registering Matter accessories. The
|
|
71
|
+
* default provides an `OnOff` cluster wired to `getState()` / `setState()`.
|
|
72
|
+
*
|
|
73
|
+
* If the Homebridge `api` provides a `matter` namespace it is attached under
|
|
74
|
+
* `_resolved.matter` for callers that need direct access to the Matter API.
|
|
75
|
+
*/
|
|
76
|
+
createMatterAccessory(api) {
|
|
77
|
+
const base = {
|
|
78
|
+
id: this.opts.id,
|
|
79
|
+
name: this.opts.name ?? this.opts.type,
|
|
80
|
+
protocol: 'matter',
|
|
81
|
+
clusters: [
|
|
82
|
+
{
|
|
83
|
+
type: 'OnOff',
|
|
84
|
+
clusterId: MATTER_CLUSTER_IDS.OnOff,
|
|
85
|
+
attributes: {
|
|
86
|
+
onOff: {
|
|
87
|
+
read: async () => {
|
|
88
|
+
const s = await this.getState();
|
|
89
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'));
|
|
90
|
+
},
|
|
91
|
+
write: async (v) => this.setState({ on: !!v }),
|
|
92
|
+
},
|
|
93
|
+
[MATTER_ATTRIBUTE_IDS.OnOff.OnOff]: {
|
|
94
|
+
read: async () => {
|
|
95
|
+
const s = await this.getState();
|
|
96
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'));
|
|
97
|
+
},
|
|
98
|
+
write: async (v) => this.setState({ on: !!v }),
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
const matter = api?.matter;
|
|
106
|
+
if (matter) {
|
|
107
|
+
base._resolved = {
|
|
108
|
+
matter,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
// ignore
|
|
114
|
+
}
|
|
115
|
+
return base;
|
|
116
|
+
}
|
|
117
|
+
async destroy() { }
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=deviceBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceBase.js","sourceRoot":"","sources":["../../src/devices/deviceBase.ts"],"names":[],"mappings":"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"}
|