@switchbot/homebridge-switchbot 5.0.0-beta.13 → 5.0.0-beta.130
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 +54 -0
- package/README.md +99 -3
- package/TODO.md +263 -0
- package/config.schema.json +198 -14787
- 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/deviceFactory.d.ts +13 -0
- package/dist/deviceFactory.d.ts.map +1 -0
- package/dist/deviceFactory.js +146 -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 +277 -0
- package/dist/devices/genericDevice.d.ts.map +1 -0
- package/dist/devices/genericDevice.js +1383 -0
- package/dist/devices/genericDevice.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -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 +107 -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 +430 -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 +447 -0
- package/dist/homebridge-ui/public/index.html +144 -248
- package/dist/homebridge-ui/public/js/api.d.ts +62 -0
- package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/api.js +225 -0
- package/dist/homebridge-ui/public/js/api.js.map +1 -0
- package/dist/homebridge-ui/public/js/api.ts +279 -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 +3600 -0
- package/dist/homebridge-ui/public/js/app.js.map +7 -0
- package/dist/homebridge-ui/public/js/app.ts +23 -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 +94 -0
- package/dist/homebridge-ui/public/js/devices.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices.ts +114 -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 +1364 -0
- package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.ts +1492 -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 +494 -0
- package/dist/homebridge-ui/public/js/modals.js.map +1 -0
- package/dist/homebridge-ui/public/js/modals.ts +546 -0
- package/dist/homebridge-ui/public/js/render.d.ts +68 -0
- package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/render.js +914 -0
- package/dist/homebridge-ui/public/js/render.js.map +1 -0
- package/dist/homebridge-ui/public/js/render.ts +1026 -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 +1 -3
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +39 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +1570 -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 +253 -0
- package/dist/switchbotClient.js.map +1 -0
- package/dist/utils.d.ts +36 -82
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +40 -786
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +21 -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 +103 -13
- package/docs/variables/default.html +1 -1
- package/eslint.config.js +7 -8
- package/nodemon.json +2 -2
- package/package.json +36 -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 +261 -0
- package/src/deviceFactory.ts +190 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +1333 -0
- package/src/errors.ts +43 -0
- package/src/homebridge-ui/endpoints/config.ts +126 -0
- package/src/homebridge-ui/endpoints/credentials.ts +74 -0
- package/src/homebridge-ui/endpoints/devices.ts +464 -0
- package/src/homebridge-ui/endpoints/discovery.ts +233 -0
- package/src/homebridge-ui/public/css/styles.css +447 -0
- package/src/homebridge-ui/public/index.html +144 -248
- package/src/homebridge-ui/public/js/api.ts +279 -0
- package/src/homebridge-ui/public/js/app.ts +23 -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 +114 -0
- package/src/homebridge-ui/public/js/discovery.ts +1492 -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 +546 -0
- package/src/homebridge-ui/public/js/render.ts +1026 -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 +1 -3
- package/src/platform.ts +1585 -0
- package/src/settings.ts +12 -277
- package/src/switchbotClient.ts +251 -0
- package/src/utils.ts +48 -812
- 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 +52 -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 +136 -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 +542 -0
- package/todo/README.md +59 -0
- package/todo/TODO.md +190 -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/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 -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 -78
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
- package/dist/devices-matter/BaseMatterAccessory.js +0 -220
- 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 -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 -999
- 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 -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 -249
- 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 -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 -1124
- package/src/utils.test.ts +0 -96
- package/src/verifyconfig.test.ts +0 -197
|
@@ -0,0 +1,261 @@
|
|
|
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
|
+
} as const
|
|
96
|
+
|
|
97
|
+
export const DEVICE_TYPE_NORMALIZATION_MAP: Record<string, string> = {
|
|
98
|
+
// --- node-switchbot beta new types normalization additions ---
|
|
99
|
+
'hub mini': 'Hub Mini',
|
|
100
|
+
'hub 3': 'Hub 3',
|
|
101
|
+
'keypad': 'Keypad', // node-switchbot beta
|
|
102
|
+
'plug mini': 'Plug Mini (US)', // fallback to US if region not specified
|
|
103
|
+
'art frame': 'AI Art Frame',
|
|
104
|
+
'rgbicww': 'RGBICWW Strip Light',
|
|
105
|
+
'lock vision': 'Lock Vision Pro', // alias for new lock vision
|
|
106
|
+
'lock pro': 'Smart Lock Pro',
|
|
107
|
+
'lock lite': 'Lock Lite', // node-switchbot beta
|
|
108
|
+
'circulator fan': 'Circulator Fan', // node-switchbot beta
|
|
109
|
+
'smart thermostat radiator': 'Smart Radiator Thermostat',
|
|
110
|
+
'climate panel': 'Home Climate Panel',
|
|
111
|
+
'evaporative humidifier': 'Humidifier',
|
|
112
|
+
// --- end node-switchbot beta additions ---
|
|
113
|
+
// Only keep the last occurrence for each key, all values canonical
|
|
114
|
+
'air purifier pm2.5': 'Air Purifier PM2.5',
|
|
115
|
+
'pan/tilt cam plus 3k': 'Pan/Tilt Cam Plus 3K',
|
|
116
|
+
'remote with screen': 'Remote with Screen',
|
|
117
|
+
'ai hub': 'AI Hub',
|
|
118
|
+
'water detector': 'Water Detector',
|
|
119
|
+
'video doorbell': 'Video Doorbell',
|
|
120
|
+
'smart radiator thermostat': 'Smart Radiator Thermostat',
|
|
121
|
+
'woiosensor': 'WoIOSensor',
|
|
122
|
+
'garage door opener': 'Garage Door Opener',
|
|
123
|
+
'air purifier table pm2.5': 'Air Purifier Table PM2.5',
|
|
124
|
+
'air purifier voc': 'Air Purifier VOC',
|
|
125
|
+
'air purifier table voc': 'Air Purifier Table VOC',
|
|
126
|
+
'plug mini (eu)': 'Plug Mini (EU)',
|
|
127
|
+
// Only last occurrence for each key is kept above. Removed duplicates here.
|
|
128
|
+
|
|
129
|
+
// Climate control conversions
|
|
130
|
+
'humidifier2': 'Humidifier2',
|
|
131
|
+
'battery circulator fan': 'Battery Circulator Fan',
|
|
132
|
+
'standing circulator fan': 'Standing Circulator Fan',
|
|
133
|
+
|
|
134
|
+
// Lock/keypad conversions
|
|
135
|
+
'smart lock': 'Smart Lock',
|
|
136
|
+
'smart lock pro': 'Smart Lock Pro',
|
|
137
|
+
'smart lock ultra': 'Smart Lock Ultra',
|
|
138
|
+
'keypad touch': 'Keypad Touch',
|
|
139
|
+
'keypad vision': 'Keypad Vision',
|
|
140
|
+
'keypad vision pro': 'Keypad Vision Pro',
|
|
141
|
+
|
|
142
|
+
// Light conversions
|
|
143
|
+
'color bulb': 'Color Bulb',
|
|
144
|
+
'ceiling light': 'Ceiling Light',
|
|
145
|
+
'ceiling light pro': 'Ceiling Light Pro',
|
|
146
|
+
'candle warmer lamp': 'Candle Warmer Lamp',
|
|
147
|
+
'floor lamp': 'Floor Lamp',
|
|
148
|
+
'rgbic neon rope light': 'RGBIC Neon Rope Light',
|
|
149
|
+
'rgbic neon wire rope light': 'RGBIC Neon Wire Rope Light',
|
|
150
|
+
'rgbicww floor lamp': 'RGBICWW Floor Lamp',
|
|
151
|
+
'rgbicww strip light': 'RGBICWW Strip Light',
|
|
152
|
+
'strip light': 'Strip Light',
|
|
153
|
+
'strip light 3': 'Strip Light 3', // node-switchbot beta
|
|
154
|
+
|
|
155
|
+
// Vacuum conversions
|
|
156
|
+
'robot vacuum cleaner s1': 'Robot Vacuum Cleaner S1',
|
|
157
|
+
'robot vacuum cleaner s1 plus': 'Robot Vacuum Cleaner S1 Plus',
|
|
158
|
+
'robot vacuum cleaner s10': 'Robot Vacuum Cleaner S10',
|
|
159
|
+
'robot vacuum cleaner s20': 'Robot Vacuum Cleaner S20',
|
|
160
|
+
'robot vacuum cleaner k10+ pro combo': 'Robot Vacuum Cleaner K10+ Pro Combo',
|
|
161
|
+
'robot vacuum cleaner k11+': 'Robot Vacuum Cleaner K11+',
|
|
162
|
+
'robot vacuum cleaner k20 plus pro': 'Robot Vacuum Cleaner K20 Plus Pro',
|
|
163
|
+
|
|
164
|
+
// Exact device type mappings (API format → canonical format)
|
|
165
|
+
'relay switch 1': 'Relay Switch 1',
|
|
166
|
+
'blind tilt': 'Blind Tilt',
|
|
167
|
+
'roller shade': 'Roller Shade',
|
|
168
|
+
'curtain3': 'Curtain3',
|
|
169
|
+
'hub 2': 'Hub 2',
|
|
170
|
+
'meterplus': 'MeterPlus',
|
|
171
|
+
'meterpro': 'MeterPro',
|
|
172
|
+
'meterpro(co2)': 'MeterPro(CO2)',
|
|
173
|
+
'walletfinder': 'WalletFinder',
|
|
174
|
+
'k10+': 'K10+',
|
|
175
|
+
'k10+ pro (wosweeperminipro)': 'K10+ Pro (wosweeperminipro)',
|
|
176
|
+
|
|
177
|
+
// Handle spaced variants from config files (normalize back to canonical type)
|
|
178
|
+
'meter pro': 'Meter Pro',
|
|
179
|
+
'meter pro (co2)': 'Meter Pro (CO2)',
|
|
180
|
+
'meter plus': 'Meter Plus',
|
|
181
|
+
'relay switch 1 pm': 'Relay Switch 1PM',
|
|
182
|
+
'relay switch 2 pm': 'Relay Switch 2PM',
|
|
183
|
+
'plug mini eu': 'Plug Mini (EU)',
|
|
184
|
+
'plug mini jp': 'Plug Mini (JP)',
|
|
185
|
+
'plug mini us': 'Plug Mini (US)',
|
|
186
|
+
|
|
187
|
+
// Migration mappings for invalid/legacy device types
|
|
188
|
+
'lock vision pro': 'Lock Vision Pro', // Valid alias; map to canonical
|
|
189
|
+
// 'lock vision': 'Keypad Vision', // Invalid type (removed, now node-switchbot beta alias above)
|
|
190
|
+
'lock touch': 'Keypad Touch', // Invalid type
|
|
191
|
+
|
|
192
|
+
// Additional normalization for new/unknown types from logs
|
|
193
|
+
'woplugus': 'Plug Mini (US)',
|
|
194
|
+
// Removed duplicate keys below, only last occurrence kept
|
|
195
|
+
// 'plug mini us': 'plug mini (us)', // duplicate, removed
|
|
196
|
+
// 'plug us': 'plug mini (us)', // duplicate, removed
|
|
197
|
+
// 'plug': 'plug', // duplicate, removed
|
|
198
|
+
// 'air purifier pm2.5': 'air purifier pm2.5', // duplicate, removed
|
|
199
|
+
// 'rgbic neon wire rope light': 'rgbic neon wire rope light', // duplicate, removed
|
|
200
|
+
// 'candle warmer lamp': 'candle warmer lamp', // duplicate, removed
|
|
201
|
+
// 'pan/tilt cam plus 3k': 'pan/tilt cam plus 3k', // duplicate, removed
|
|
202
|
+
// 'remote with screen': 'remote with screen', // duplicate, removed
|
|
203
|
+
// 'ai hub': 'ai hub', // duplicate, removed
|
|
204
|
+
// 'lock vision pro': 'lock vision pro', // duplicate, remove this line
|
|
205
|
+
// Add any other device types from logs as needed
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Get all valid device types as a flat set for validation
|
|
210
|
+
*/
|
|
211
|
+
export function getValidDeviceTypes(): Set<string> {
|
|
212
|
+
const validTypes = new Set<string>()
|
|
213
|
+
for (const category of Object.values(DEVICE_TYPES)) {
|
|
214
|
+
for (const type of category) {
|
|
215
|
+
validTypes.add(type)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return validTypes
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Normalize and validate a device type, returning a valid type or null
|
|
223
|
+
* @param deviceType The device type to validate/normalize
|
|
224
|
+
* @returns Valid device type string or null if no valid mapping found
|
|
225
|
+
*/
|
|
226
|
+
export function normalizeDeviceType(deviceType: string | undefined | null): string | null {
|
|
227
|
+
if (!deviceType || typeof deviceType !== 'string') {
|
|
228
|
+
return null
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const trimmed = deviceType.trim()
|
|
232
|
+
const lowercase = trimmed.toLowerCase()
|
|
233
|
+
|
|
234
|
+
// Check if already valid
|
|
235
|
+
const validTypes = getValidDeviceTypes()
|
|
236
|
+
if (validTypes.has(trimmed)) {
|
|
237
|
+
return trimmed
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Check normalization map
|
|
241
|
+
const normalized = DEVICE_TYPE_NORMALIZATION_MAP[lowercase]
|
|
242
|
+
if (normalized && validTypes.has(normalized)) {
|
|
243
|
+
return normalized
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// No valid mapping found
|
|
247
|
+
return null
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Check if a device type is valid
|
|
252
|
+
* @param deviceType The device type to check
|
|
253
|
+
* @returns true if device type is in DEVICE_TYPES
|
|
254
|
+
*/
|
|
255
|
+
export function isValidDeviceType(deviceType: string | undefined | null): boolean {
|
|
256
|
+
if (!deviceType || typeof deviceType !== 'string') {
|
|
257
|
+
return false
|
|
258
|
+
}
|
|
259
|
+
const validTypes = getValidDeviceTypes()
|
|
260
|
+
return validTypes.has(deviceType.trim())
|
|
261
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { DeviceType, SwitchBotPluginConfig } from './settings.js'
|
|
2
|
+
|
|
3
|
+
import { DEVICE_TYPE_NORMALIZATION_MAP } from './device-types.js'
|
|
4
|
+
import {
|
|
5
|
+
BlindTiltDevice,
|
|
6
|
+
BotDevice,
|
|
7
|
+
ContactSensorDevice,
|
|
8
|
+
Curtain3Device,
|
|
9
|
+
CurtainDevice,
|
|
10
|
+
FanDevice,
|
|
11
|
+
GenericDevice,
|
|
12
|
+
Hub2Device,
|
|
13
|
+
HumidifierDevice,
|
|
14
|
+
LightDevice,
|
|
15
|
+
LightStripDevice,
|
|
16
|
+
LockDevice,
|
|
17
|
+
MeterDevice,
|
|
18
|
+
MotionSensorDevice,
|
|
19
|
+
PlugDevice,
|
|
20
|
+
PlugMiniDevice,
|
|
21
|
+
RelaySwitch1PMDevice,
|
|
22
|
+
RelaySwitchDevice,
|
|
23
|
+
RollerShadeDevice,
|
|
24
|
+
SmartFanDevice,
|
|
25
|
+
StripLightDevice,
|
|
26
|
+
TemperatureSensorDevice,
|
|
27
|
+
VacuumDevice,
|
|
28
|
+
WalletFinderDevice,
|
|
29
|
+
WaterDetectorDevice,
|
|
30
|
+
WoSweeperDevice,
|
|
31
|
+
WoSweeperMiniDevice,
|
|
32
|
+
WoSweeperMiniProDevice,
|
|
33
|
+
} from './devices/genericDevice.js'
|
|
34
|
+
import { SwitchBotClient } from './switchbotClient.js'
|
|
35
|
+
|
|
36
|
+
export interface DeviceOptions {
|
|
37
|
+
id: string
|
|
38
|
+
type: DeviceType
|
|
39
|
+
name?: string
|
|
40
|
+
[key: string]: any
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DEVICE_CLASS_MAP: Record<string, any> = {
|
|
44
|
+
// Primary device type keys (lowercase, simplified)
|
|
45
|
+
'bot': BotDevice,
|
|
46
|
+
'curtain': CurtainDevice,
|
|
47
|
+
'curtain3': Curtain3Device,
|
|
48
|
+
'fan': FanDevice,
|
|
49
|
+
'light': LightDevice,
|
|
50
|
+
'lightstrip': LightStripDevice,
|
|
51
|
+
'motion': MotionSensorDevice,
|
|
52
|
+
'contact': ContactSensorDevice,
|
|
53
|
+
'vacuum': VacuumDevice, // node-switchbot beta
|
|
54
|
+
// Canonical, normalized device type keys (lowercase, mapped to device classes)
|
|
55
|
+
'video doorbell': GenericDevice,
|
|
56
|
+
'smart radiator thermostat': GenericDevice, // node-switchbot beta
|
|
57
|
+
'woiosensor': GenericDevice,
|
|
58
|
+
'garage door opener': GenericDevice, // node-switchbot beta
|
|
59
|
+
'air purifier table pm2.5': GenericDevice,
|
|
60
|
+
'air purifier voc': GenericDevice,
|
|
61
|
+
'air purifier table voc': GenericDevice,
|
|
62
|
+
'meterplus': MeterDevice,
|
|
63
|
+
'meterpro': MeterDevice,
|
|
64
|
+
'meterpro(co2)': MeterDevice,
|
|
65
|
+
'walletfinder': WalletFinderDevice,
|
|
66
|
+
'plug': PlugDevice,
|
|
67
|
+
'plug mini (eu)': PlugMiniDevice, // node-switchbot beta
|
|
68
|
+
'plug mini (jp)': PlugMiniDevice, // node-switchbot beta
|
|
69
|
+
'plug mini (us)': PlugMiniDevice, // node-switchbot beta
|
|
70
|
+
'relay switch 1pm': RelaySwitch1PMDevice,
|
|
71
|
+
'relay switch 2pm': RelaySwitch1PMDevice,
|
|
72
|
+
'k10+ pro': WoSweeperDevice,
|
|
73
|
+
'robot vacuum cleaner k10+ pro combo': WoSweeperDevice,
|
|
74
|
+
'robot vacuum cleaner k11+': WoSweeperDevice,
|
|
75
|
+
'robot vacuum cleaner k20 plus pro': WoSweeperDevice,
|
|
76
|
+
'ai hub': GenericDevice,
|
|
77
|
+
'hub': GenericDevice,
|
|
78
|
+
'hub 2': Hub2Device,
|
|
79
|
+
'hub 3': GenericDevice, // node-switchbot beta
|
|
80
|
+
'hub mini': GenericDevice, // node-switchbot beta
|
|
81
|
+
'hub plus': GenericDevice,
|
|
82
|
+
'indoor cam': GenericDevice,
|
|
83
|
+
'pan/tilt cam': GenericDevice,
|
|
84
|
+
'pan/tilt cam 2k': GenericDevice,
|
|
85
|
+
'pan/tilt cam plus 2k': GenericDevice,
|
|
86
|
+
'pan/tilt cam plus 3k': GenericDevice,
|
|
87
|
+
'humidifier': HumidifierDevice, // node-switchbot beta (Evaporative Humidifier)
|
|
88
|
+
'roller shade': RollerShadeDevice, // node-switchbot beta
|
|
89
|
+
'strip light 3': StripLightDevice, // node-switchbot beta
|
|
90
|
+
'circulator fan': FanDevice, // node-switchbot beta
|
|
91
|
+
'smart lock pro': LockDevice, // node-switchbot beta
|
|
92
|
+
'lock lite': LockDevice, // node-switchbot beta
|
|
93
|
+
'keypad': LockDevice, // node-switchbot beta
|
|
94
|
+
'lock vision pro': LockDevice, // node-switchbot beta
|
|
95
|
+
'floor lamp': LightDevice, // node-switchbot beta
|
|
96
|
+
'rgbicww floor lamp': LightStripDevice, // node-switchbot beta
|
|
97
|
+
'rgbicww strip light': LightStripDevice, // node-switchbot beta
|
|
98
|
+
'home climate panel': GenericDevice, // node-switchbot beta (Climate Panel)
|
|
99
|
+
'lock': LockDevice,
|
|
100
|
+
'humidifier2': HumidifierDevice,
|
|
101
|
+
'temperature': TemperatureSensorDevice,
|
|
102
|
+
'relay switch 1': RelaySwitchDevice,
|
|
103
|
+
'blind tilt': BlindTiltDevice,
|
|
104
|
+
'worollershade': RollerShadeDevice,
|
|
105
|
+
'wo rollershade': RollerShadeDevice,
|
|
106
|
+
'rollershade': RollerShadeDevice,
|
|
107
|
+
'meter': MeterDevice,
|
|
108
|
+
'meter plus (jp)': MeterDevice,
|
|
109
|
+
'water detector': WaterDetectorDevice,
|
|
110
|
+
'smart fan': SmartFanDevice,
|
|
111
|
+
'strip light': StripLightDevice,
|
|
112
|
+
'wosweeper': WoSweeperDevice,
|
|
113
|
+
'wosweepermini': WoSweeperMiniDevice,
|
|
114
|
+
'wosweeperminipro': WoSweeperMiniProDevice,
|
|
115
|
+
'k10+': WoSweeperDevice,
|
|
116
|
+
'k10+ pro (wosweeperminipro)': WoSweeperMiniProDevice,
|
|
117
|
+
'battery circulator fan': FanDevice,
|
|
118
|
+
'standing circulator fan': FanDevice,
|
|
119
|
+
'smart lock': LockDevice,
|
|
120
|
+
'smart lock ultra': LockDevice,
|
|
121
|
+
'keypad touch': LockDevice,
|
|
122
|
+
'keypad vision': LockDevice,
|
|
123
|
+
'keypad vision pro': LockDevice,
|
|
124
|
+
'color bulb': LightDevice,
|
|
125
|
+
'ceiling light': LightDevice,
|
|
126
|
+
'ceiling light pro': LightDevice,
|
|
127
|
+
'candle warmer lamp': LightDevice,
|
|
128
|
+
'rgbic neon rope light': LightStripDevice,
|
|
129
|
+
'rgbic neon wire rope light': LightStripDevice,
|
|
130
|
+
'robot vacuum cleaner s1': VacuumDevice,
|
|
131
|
+
'robot vacuum cleaner s1 plus': VacuumDevice,
|
|
132
|
+
'robot vacuum cleaner s10': VacuumDevice,
|
|
133
|
+
'robot vacuum cleaner s20': VacuumDevice,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function classForType(type: string) {
|
|
137
|
+
const rawKey = (type || '').toLowerCase()
|
|
138
|
+
const key = DEVICE_TYPE_NORMALIZATION_MAP[rawKey] ?? rawKey
|
|
139
|
+
return DEVICE_CLASS_MAP[key] ?? GenericDevice
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConfig, useMatter: boolean) {
|
|
143
|
+
// Reuse existing client when provided via config to avoid creating
|
|
144
|
+
// a new SwitchBotClient per device (which can be expensive).
|
|
145
|
+
let client: any = (cfg as any)?._client ?? null
|
|
146
|
+
if (!client) {
|
|
147
|
+
client = new SwitchBotClient(cfg)
|
|
148
|
+
await client.init()
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Pass client via config so devices can access it
|
|
152
|
+
const mergedCfg = { ...(cfg as any), _client: client }
|
|
153
|
+
|
|
154
|
+
// Pass encryptionKey and keyId to device opts if present
|
|
155
|
+
const deviceOpts = { ...opts }
|
|
156
|
+
if (opts.encryptionKey) {
|
|
157
|
+
deviceOpts.encryptionKey = opts.encryptionKey
|
|
158
|
+
}
|
|
159
|
+
if (opts.keyId) {
|
|
160
|
+
deviceOpts.keyId = opts.keyId
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const DeviceCtor = classForType(opts.type)
|
|
164
|
+
const device = new DeviceCtor(deviceOpts, mergedCfg)
|
|
165
|
+
await device.init()
|
|
166
|
+
|
|
167
|
+
// Attach a simple getState delegator to the client where appropriate
|
|
168
|
+
const originalGetState = device.getState.bind(device)
|
|
169
|
+
device.getState = async () => {
|
|
170
|
+
try {
|
|
171
|
+
// Prefer client-backed getDevice when available
|
|
172
|
+
const dev = await client.getDevice(opts.id)
|
|
173
|
+
if (dev) {
|
|
174
|
+
return dev
|
|
175
|
+
}
|
|
176
|
+
} catch (e) {
|
|
177
|
+
// ignore and fallback to device implementation
|
|
178
|
+
}
|
|
179
|
+
return originalGetState()
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Provide accessory factory based on platform selection
|
|
183
|
+
return {
|
|
184
|
+
instance: device,
|
|
185
|
+
createAccessory: useMatter
|
|
186
|
+
? async (api: any) => await device.createMatterAccessory(api)
|
|
187
|
+
: (api: any) => device.createHAPAccessory(api),
|
|
188
|
+
protocol: useMatter ? 'matter' : 'hap',
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { SwitchBotPluginConfig } from '../settings.js'
|
|
2
|
+
|
|
3
|
+
import { MATTER_ATTRIBUTE_IDS, MATTER_CLUSTER_IDS } from '../utils.js'
|
|
4
|
+
|
|
5
|
+
export interface DeviceOptions {
|
|
6
|
+
id: string
|
|
7
|
+
type: string
|
|
8
|
+
name?: string
|
|
9
|
+
[key: string]: any
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export abstract class DeviceBase {
|
|
13
|
+
protected opts: DeviceOptions
|
|
14
|
+
protected cfg: SwitchBotPluginConfig
|
|
15
|
+
protected client: any | null
|
|
16
|
+
|
|
17
|
+
constructor(opts: DeviceOptions, cfg: SwitchBotPluginConfig) {
|
|
18
|
+
this.opts = opts
|
|
19
|
+
this.cfg = cfg
|
|
20
|
+
this.client = (cfg as any)?._client ?? null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Initialize any connections/resources
|
|
24
|
+
async init(): Promise<void> {}
|
|
25
|
+
|
|
26
|
+
// Return current device state from SwitchBot or cache
|
|
27
|
+
abstract getState(): Promise<any>
|
|
28
|
+
|
|
29
|
+
// Apply a state change to the device
|
|
30
|
+
abstract setState(change: any): Promise<any>
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Create and return a HAP accessory descriptor.
|
|
34
|
+
*
|
|
35
|
+
* This method returns a descriptor object (not a platformAccessory instance).
|
|
36
|
+
* The platform will use this descriptor to construct a real HAP accessory.
|
|
37
|
+
*
|
|
38
|
+
* Default descriptor provides a simple Switch service with an `On` characteristic
|
|
39
|
+
* backed by `getState()` / `setState()` so most simple devices work out of the box.
|
|
40
|
+
*
|
|
41
|
+
* If the Homebridge `api` is passed, `Service` and `Characteristic` constructors
|
|
42
|
+
* are included under `_resolved` for callers that need them.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* {
|
|
46
|
+
* id: 'd1',
|
|
47
|
+
* name: 'My Device',
|
|
48
|
+
* protocol: 'hap',
|
|
49
|
+
* services: [ { type: 'Switch', characteristics: { On: { get: async ()=>true, set: async v=>{} } } } ]
|
|
50
|
+
* }
|
|
51
|
+
*/
|
|
52
|
+
createHAPAccessory(api: any): any {
|
|
53
|
+
const base: any = {
|
|
54
|
+
id: this.opts.id,
|
|
55
|
+
name: this.opts.name ?? this.opts.type,
|
|
56
|
+
protocol: 'hap',
|
|
57
|
+
services: [
|
|
58
|
+
{
|
|
59
|
+
type: 'Switch',
|
|
60
|
+
characteristics: {
|
|
61
|
+
On: {
|
|
62
|
+
get: async () => {
|
|
63
|
+
const s = await this.getState()
|
|
64
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
|
|
65
|
+
},
|
|
66
|
+
set: async (v: any) => {
|
|
67
|
+
await this.setState({ on: !!v })
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const hap = api?.hap
|
|
77
|
+
if (hap && hap.Service && hap.Characteristic) {
|
|
78
|
+
base._resolved = { Service: hap.Service, Characteristic: hap.Characteristic }
|
|
79
|
+
}
|
|
80
|
+
} catch (e) {
|
|
81
|
+
// ignore
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return base
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Create and return a Matter accessory descriptor.
|
|
89
|
+
*
|
|
90
|
+
* Returns a descriptor containing `clusters` and attribute read/write handlers
|
|
91
|
+
* which the platform will serialize when registering Matter accessories. The
|
|
92
|
+
* default provides an `OnOff` cluster wired to `getState()` / `setState()`.
|
|
93
|
+
*
|
|
94
|
+
* If the Homebridge `api` provides a `matter` namespace it is attached under
|
|
95
|
+
* `_resolved.matter` for callers that need direct access to the Matter API.
|
|
96
|
+
*/
|
|
97
|
+
createMatterAccessory(api: any): any {
|
|
98
|
+
const base: any = {
|
|
99
|
+
id: this.opts.id,
|
|
100
|
+
name: this.opts.name ?? this.opts.type,
|
|
101
|
+
protocol: 'matter',
|
|
102
|
+
clusters: [
|
|
103
|
+
{
|
|
104
|
+
type: 'OnOff',
|
|
105
|
+
clusterId: MATTER_CLUSTER_IDS.OnOff,
|
|
106
|
+
attributes: {
|
|
107
|
+
onOff: {
|
|
108
|
+
read: async () => {
|
|
109
|
+
const s = await this.getState()
|
|
110
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
|
|
111
|
+
},
|
|
112
|
+
write: async (v: any) => this.setState({ on: !!v }),
|
|
113
|
+
},
|
|
114
|
+
[MATTER_ATTRIBUTE_IDS.OnOff.OnOff]: {
|
|
115
|
+
read: async () => {
|
|
116
|
+
const s = await this.getState()
|
|
117
|
+
return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
|
|
118
|
+
},
|
|
119
|
+
write: async (v: any) => this.setState({ on: !!v }),
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
const matter = api?.matter
|
|
128
|
+
if (matter) {
|
|
129
|
+
base._resolved = {
|
|
130
|
+
matter,
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} catch (e) {
|
|
134
|
+
// ignore
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return base
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async destroy(): Promise<void> {}
|
|
141
|
+
}
|