@switchbot/homebridge-switchbot 5.0.0-beta.13 → 5.0.0-beta.131
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 +165 -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 +1396 -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 +1587 -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 +208 -0
- package/src/devices/deviceBase.ts +141 -0
- package/src/devices/genericDevice.ts +1345 -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 +1601 -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 +110 -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,225 @@
|
|
|
1
|
+
import { isValidDeviceType, normalizeDeviceType } from '../../../device-types.js';
|
|
2
|
+
import './types.js';
|
|
3
|
+
import { uiLog } from './logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validate and auto-correct device types in the config array before saving.
|
|
6
|
+
* Returns an array of errors for devices that cannot be fixed.
|
|
7
|
+
*/
|
|
8
|
+
export function validateAndFixDeviceTypes(devices) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
for (const d of devices) {
|
|
11
|
+
if (!isValidDeviceType(d.configDeviceType)) {
|
|
12
|
+
const fixed = normalizeDeviceType(d.configDeviceType);
|
|
13
|
+
if (fixed) {
|
|
14
|
+
d.configDeviceType = fixed;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
errors.push({
|
|
18
|
+
deviceId: d.deviceId,
|
|
19
|
+
name: d.configDeviceName,
|
|
20
|
+
type: d.configDeviceType,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return errors;
|
|
26
|
+
}
|
|
27
|
+
// API wrapper functions for communicating with the Homebridge UI server
|
|
28
|
+
function isSwitchBotPlatformConfig(block) {
|
|
29
|
+
const platformName = String(block?.platform || block?.name || '').toLowerCase();
|
|
30
|
+
return (platformName === 'switchbot'
|
|
31
|
+
|| platformName === '@switchbot/homebridge-switchbot'
|
|
32
|
+
|| platformName.includes('switchbot'));
|
|
33
|
+
}
|
|
34
|
+
export async function syncParentPluginConfigFromDisk(autoSave = false) {
|
|
35
|
+
try {
|
|
36
|
+
if (typeof homebridge.getPluginConfig !== 'function'
|
|
37
|
+
|| typeof homebridge.updatePluginConfig !== 'function') {
|
|
38
|
+
uiLog.warn('Parent config sync API not available');
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const diskResp = await homebridge.request('/platform-config', {});
|
|
42
|
+
if (!diskResp || diskResp.success === false || !diskResp.data) {
|
|
43
|
+
uiLog.warn('Failed to fetch fresh platform config from disk');
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const pluginConfigBlocks = await homebridge.getPluginConfig();
|
|
47
|
+
if (!Array.isArray(pluginConfigBlocks) || !pluginConfigBlocks.length) {
|
|
48
|
+
uiLog.warn('No plugin config blocks returned from Homebridge');
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const index = pluginConfigBlocks.findIndex(block => isSwitchBotPlatformConfig(block));
|
|
52
|
+
if (index < 0) {
|
|
53
|
+
uiLog.warn('SwitchBot platform block not found in Homebridge plugin config');
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Validate and fix device types before saving
|
|
57
|
+
const errors = validateAndFixDeviceTypes(diskResp.data.devices || []);
|
|
58
|
+
if (errors.length > 0) {
|
|
59
|
+
homebridge.toast?.error?.(`Invalid device types found: ${errors.map(e => `${e.name} (${e.type})`).join(', ')}`);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
pluginConfigBlocks[index] = diskResp.data;
|
|
63
|
+
await homebridge.updatePluginConfig(pluginConfigBlocks);
|
|
64
|
+
// Auto-save to disk if requested - prevents parent UI from overwriting with stale cache
|
|
65
|
+
if (autoSave && typeof homebridge.savePluginConfig === 'function') {
|
|
66
|
+
uiLog.info('Auto-saving config to disk...');
|
|
67
|
+
await homebridge.savePluginConfig();
|
|
68
|
+
uiLog.info('Config saved successfully');
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
uiLog.warn('Failed to sync parent plugin config cache:', e);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function fetchCredentialStatus() {
|
|
78
|
+
try {
|
|
79
|
+
const resp = await homebridge.request('/credentials', {});
|
|
80
|
+
uiLog.info('Load credentials response:', resp);
|
|
81
|
+
if (!resp || resp.success === false) {
|
|
82
|
+
uiLog.error('Failed to load credentials:', resp);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return resp.data || {};
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
uiLog.error('Error loading credentials:', e);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function saveCredentials(token, secret) {
|
|
93
|
+
uiLog.info('Saving credentials...');
|
|
94
|
+
const resp = await homebridge.request('/credentials', { token, secret });
|
|
95
|
+
uiLog.info('Save response:', resp);
|
|
96
|
+
if (!resp || resp.success === false) {
|
|
97
|
+
throw new Error(resp?.message || 'Save failed');
|
|
98
|
+
}
|
|
99
|
+
return resp.data || resp;
|
|
100
|
+
}
|
|
101
|
+
export async function fetchDevices() {
|
|
102
|
+
try {
|
|
103
|
+
const resp = await homebridge.request('/devices', {});
|
|
104
|
+
if (!resp || resp.success === false) {
|
|
105
|
+
// Prefer backend error message if available
|
|
106
|
+
const backendMsg = resp?.data?.message || resp?.message;
|
|
107
|
+
throw new Error(backendMsg || 'request failed');
|
|
108
|
+
}
|
|
109
|
+
return resp.data || [];
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
// Show the real error to the user
|
|
113
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
114
|
+
uiLog.error('Error fetching devices:', msg);
|
|
115
|
+
// Optionally, show a toast or UI error here if needed
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function discoverDevices(mode = 'all', options) {
|
|
120
|
+
const resp = await homebridge.request('/discover', { mode, ...options });
|
|
121
|
+
uiLog.info('Discover response:', resp);
|
|
122
|
+
if (!resp || resp.success === false) {
|
|
123
|
+
throw new Error(resp?.data?.message || 'Discovery failed');
|
|
124
|
+
}
|
|
125
|
+
return resp.data || [];
|
|
126
|
+
}
|
|
127
|
+
export async function fetchBluetoothStatus() {
|
|
128
|
+
try {
|
|
129
|
+
const resp = await homebridge.request('/ble-status', {});
|
|
130
|
+
if (!resp || resp.success === false) {
|
|
131
|
+
return { available: false, message: 'Bluetooth status unavailable' };
|
|
132
|
+
}
|
|
133
|
+
return resp.data || { available: false, message: 'Bluetooth status unavailable' };
|
|
134
|
+
}
|
|
135
|
+
catch (_e) {
|
|
136
|
+
return { available: false, message: 'Bluetooth status unavailable' };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export async function testDeviceConnection(payload) {
|
|
140
|
+
const resp = await homebridge.request('/test-connection', payload);
|
|
141
|
+
if (!resp || resp.success === false) {
|
|
142
|
+
throw new Error(resp?.data?.message || 'Connection test failed');
|
|
143
|
+
}
|
|
144
|
+
return resp.data || {
|
|
145
|
+
success: false,
|
|
146
|
+
deviceId: payload.deviceId,
|
|
147
|
+
method: 'Auto',
|
|
148
|
+
latencyMs: 0,
|
|
149
|
+
message: 'Connection test failed',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export async function addDevice(deviceId, name, type, options) {
|
|
153
|
+
const payload = { deviceId, name, type };
|
|
154
|
+
if (options?.address) {
|
|
155
|
+
payload.address = options.address;
|
|
156
|
+
}
|
|
157
|
+
if (options?.model) {
|
|
158
|
+
payload.model = options.model;
|
|
159
|
+
}
|
|
160
|
+
if (options?.rssi !== undefined && options?.rssi !== null && options?.rssi !== 0) {
|
|
161
|
+
payload.rssi = options.rssi;
|
|
162
|
+
}
|
|
163
|
+
if (options?.encryptionKey) {
|
|
164
|
+
payload.encryptionKey = options.encryptionKey;
|
|
165
|
+
}
|
|
166
|
+
if (options?.keyId) {
|
|
167
|
+
payload.keyId = options.keyId;
|
|
168
|
+
}
|
|
169
|
+
if (options?.matterType !== undefined) {
|
|
170
|
+
payload.matterType = options.matterType;
|
|
171
|
+
}
|
|
172
|
+
uiLog.info('Adding device to config:', payload);
|
|
173
|
+
const resp = await homebridge.request('/add-device', payload);
|
|
174
|
+
uiLog.info('Add device response:', resp);
|
|
175
|
+
if (!resp || resp.success === false) {
|
|
176
|
+
throw new Error(resp?.data?.message || 'Failed to add device');
|
|
177
|
+
}
|
|
178
|
+
return resp.data || resp;
|
|
179
|
+
}
|
|
180
|
+
export async function addDevicesInBulk(devices) {
|
|
181
|
+
const resp = await homebridge.request('/add-devices', { devices });
|
|
182
|
+
uiLog.info('Bulk add response:', resp);
|
|
183
|
+
if (!resp || resp.success === false) {
|
|
184
|
+
throw new Error(resp?.data?.message || 'Bulk add failed');
|
|
185
|
+
}
|
|
186
|
+
return resp.data || resp;
|
|
187
|
+
}
|
|
188
|
+
export async function updateDevice(deviceId, configDeviceName, configDeviceType, options) {
|
|
189
|
+
const params = { deviceId };
|
|
190
|
+
if (configDeviceName) {
|
|
191
|
+
params.configDeviceName = configDeviceName;
|
|
192
|
+
}
|
|
193
|
+
if (configDeviceType) {
|
|
194
|
+
params.configDeviceType = configDeviceType;
|
|
195
|
+
}
|
|
196
|
+
if (options?.matterType !== undefined) {
|
|
197
|
+
params.matterType = options.matterType;
|
|
198
|
+
}
|
|
199
|
+
uiLog.info('[Update Device] Sending update request with params:', params);
|
|
200
|
+
const resp = await homebridge.request('/update-device', params);
|
|
201
|
+
uiLog.info('[Update Device] Update response:', resp);
|
|
202
|
+
if (!resp || resp.success === false) {
|
|
203
|
+
throw new Error(resp?.data?.message || 'Failed to update device');
|
|
204
|
+
}
|
|
205
|
+
return resp.data || resp;
|
|
206
|
+
}
|
|
207
|
+
export async function deleteDevice(deviceId) {
|
|
208
|
+
uiLog.info('Sending delete request for deviceId:', deviceId);
|
|
209
|
+
const resp = await homebridge.request('/delete-device', { deviceId });
|
|
210
|
+
uiLog.info('Delete response:', resp);
|
|
211
|
+
if (!resp || resp.success === false) {
|
|
212
|
+
throw new Error(resp?.data?.message || 'Failed to delete device');
|
|
213
|
+
}
|
|
214
|
+
return resp.data || resp;
|
|
215
|
+
}
|
|
216
|
+
export async function deleteAllDevices() {
|
|
217
|
+
uiLog.info('Sending delete all devices request');
|
|
218
|
+
const resp = await homebridge.request('/delete-all-devices', {});
|
|
219
|
+
uiLog.info('Delete all response:', resp);
|
|
220
|
+
if (!resp || resp.success === false) {
|
|
221
|
+
throw new Error(resp?.data?.message || 'Failed to delete all devices');
|
|
222
|
+
}
|
|
223
|
+
return resp.data || resp;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { isValidDeviceType, normalizeDeviceType } from '../../../device-types.js'
|
|
2
|
+
import './types.js'
|
|
3
|
+
import { uiLog } from './logger.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validate and auto-correct device types in the config array before saving.
|
|
7
|
+
* Returns an array of errors for devices that cannot be fixed.
|
|
8
|
+
*/
|
|
9
|
+
export function validateAndFixDeviceTypes(devices: Array<{ deviceId: string, configDeviceName: string, configDeviceType: string }>) {
|
|
10
|
+
const errors: Array<{ deviceId: string, name: string, type: string }> = []
|
|
11
|
+
for (const d of devices) {
|
|
12
|
+
if (!isValidDeviceType(d.configDeviceType)) {
|
|
13
|
+
const fixed = normalizeDeviceType(d.configDeviceType)
|
|
14
|
+
if (fixed) {
|
|
15
|
+
d.configDeviceType = fixed
|
|
16
|
+
} else {
|
|
17
|
+
errors.push({
|
|
18
|
+
deviceId: d.deviceId,
|
|
19
|
+
name: d.configDeviceName,
|
|
20
|
+
type: d.configDeviceType,
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return errors
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// API wrapper functions for communicating with the Homebridge UI server
|
|
29
|
+
|
|
30
|
+
function isSwitchBotPlatformConfig(block: any): boolean {
|
|
31
|
+
const platformName = String(block?.platform || block?.name || '').toLowerCase()
|
|
32
|
+
return (
|
|
33
|
+
platformName === 'switchbot'
|
|
34
|
+
|| platformName === '@switchbot/homebridge-switchbot'
|
|
35
|
+
|| platformName.includes('switchbot')
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function syncParentPluginConfigFromDisk(autoSave = false): Promise<boolean> {
|
|
40
|
+
try {
|
|
41
|
+
if (
|
|
42
|
+
typeof homebridge.getPluginConfig !== 'function'
|
|
43
|
+
|| typeof homebridge.updatePluginConfig !== 'function'
|
|
44
|
+
) {
|
|
45
|
+
uiLog.warn('Parent config sync API not available')
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const diskResp = await homebridge.request('/platform-config', {})
|
|
50
|
+
if (!diskResp || diskResp.success === false || !diskResp.data) {
|
|
51
|
+
uiLog.warn('Failed to fetch fresh platform config from disk')
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const pluginConfigBlocks = await homebridge.getPluginConfig()
|
|
56
|
+
if (!Array.isArray(pluginConfigBlocks) || !pluginConfigBlocks.length) {
|
|
57
|
+
uiLog.warn('No plugin config blocks returned from Homebridge')
|
|
58
|
+
return false
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const index = pluginConfigBlocks.findIndex(block => isSwitchBotPlatformConfig(block))
|
|
62
|
+
if (index < 0) {
|
|
63
|
+
uiLog.warn('SwitchBot platform block not found in Homebridge plugin config')
|
|
64
|
+
return false
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Validate and fix device types before saving
|
|
68
|
+
const errors = validateAndFixDeviceTypes(diskResp.data.devices || [])
|
|
69
|
+
if (errors.length > 0) {
|
|
70
|
+
homebridge.toast?.error?.(`Invalid device types found: ${errors.map(e => `${e.name} (${e.type})`).join(', ')}`)
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
pluginConfigBlocks[index] = diskResp.data
|
|
74
|
+
await homebridge.updatePluginConfig(pluginConfigBlocks)
|
|
75
|
+
|
|
76
|
+
// Auto-save to disk if requested - prevents parent UI from overwriting with stale cache
|
|
77
|
+
if (autoSave && typeof homebridge.savePluginConfig === 'function') {
|
|
78
|
+
uiLog.info('Auto-saving config to disk...')
|
|
79
|
+
await homebridge.savePluginConfig()
|
|
80
|
+
uiLog.info('Config saved successfully')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return true
|
|
84
|
+
} catch (e) {
|
|
85
|
+
uiLog.warn('Failed to sync parent plugin config cache:', e)
|
|
86
|
+
return false
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function fetchCredentialStatus(): Promise<any> {
|
|
91
|
+
try {
|
|
92
|
+
const resp = await homebridge.request('/credentials', {})
|
|
93
|
+
uiLog.info('Load credentials response:', resp)
|
|
94
|
+
|
|
95
|
+
if (!resp || resp.success === false) {
|
|
96
|
+
uiLog.error('Failed to load credentials:', resp)
|
|
97
|
+
return null
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return resp.data || {}
|
|
101
|
+
} catch (e) {
|
|
102
|
+
uiLog.error('Error loading credentials:', e)
|
|
103
|
+
return null
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function saveCredentials(token: string, secret: string): Promise<any> {
|
|
108
|
+
uiLog.info('Saving credentials...')
|
|
109
|
+
const resp = await homebridge.request('/credentials', { token, secret })
|
|
110
|
+
uiLog.info('Save response:', resp)
|
|
111
|
+
if (!resp || resp.success === false) {
|
|
112
|
+
throw new Error(resp?.message || 'Save failed')
|
|
113
|
+
}
|
|
114
|
+
return resp.data || resp
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export async function fetchDevices(): Promise<any[]> {
|
|
118
|
+
try {
|
|
119
|
+
const resp = await homebridge.request('/devices', {})
|
|
120
|
+
if (!resp || resp.success === false) {
|
|
121
|
+
// Prefer backend error message if available
|
|
122
|
+
const backendMsg = resp?.data?.message || resp?.message
|
|
123
|
+
throw new Error(backendMsg || 'request failed')
|
|
124
|
+
}
|
|
125
|
+
return resp.data || []
|
|
126
|
+
} catch (e) {
|
|
127
|
+
// Show the real error to the user
|
|
128
|
+
const msg = e instanceof Error ? e.message : String(e)
|
|
129
|
+
uiLog.error('Error fetching devices:', msg)
|
|
130
|
+
// Optionally, show a toast or UI error here if needed
|
|
131
|
+
return []
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface DiscoverRequestOptions {
|
|
136
|
+
bleEnabled?: boolean
|
|
137
|
+
bleScanDurationSeconds?: number
|
|
138
|
+
bleTimeoutSeconds?: number
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export async function discoverDevices(
|
|
142
|
+
mode: 'all' | 'ble' | 'openapi' = 'all',
|
|
143
|
+
options?: DiscoverRequestOptions,
|
|
144
|
+
): Promise<any[]> {
|
|
145
|
+
const resp = await homebridge.request('/discover', { mode, ...options })
|
|
146
|
+
uiLog.info('Discover response:', resp)
|
|
147
|
+
if (!resp || resp.success === false) {
|
|
148
|
+
throw new Error(resp?.data?.message || 'Discovery failed')
|
|
149
|
+
}
|
|
150
|
+
return resp.data || []
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export async function fetchBluetoothStatus(): Promise<{ available: boolean, message: string }> {
|
|
154
|
+
try {
|
|
155
|
+
const resp = await homebridge.request('/ble-status', {})
|
|
156
|
+
if (!resp || resp.success === false) {
|
|
157
|
+
return { available: false, message: 'Bluetooth status unavailable' }
|
|
158
|
+
}
|
|
159
|
+
return resp.data || { available: false, message: 'Bluetooth status unavailable' }
|
|
160
|
+
} catch (_e) {
|
|
161
|
+
return { available: false, message: 'Bluetooth status unavailable' }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function testDeviceConnection(payload: {
|
|
166
|
+
deviceId: string
|
|
167
|
+
connectionType?: string
|
|
168
|
+
address?: string
|
|
169
|
+
}): Promise<{
|
|
170
|
+
success: boolean
|
|
171
|
+
deviceId: string
|
|
172
|
+
method: string
|
|
173
|
+
latencyMs: number
|
|
174
|
+
message: string
|
|
175
|
+
state?: Record<string, any>
|
|
176
|
+
}> {
|
|
177
|
+
const resp = await homebridge.request('/test-connection', payload)
|
|
178
|
+
if (!resp || resp.success === false) {
|
|
179
|
+
throw new Error(resp?.data?.message || 'Connection test failed')
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return resp.data || {
|
|
183
|
+
success: false,
|
|
184
|
+
deviceId: payload.deviceId,
|
|
185
|
+
method: 'Auto',
|
|
186
|
+
latencyMs: 0,
|
|
187
|
+
message: 'Connection test failed',
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export async function addDevice(
|
|
192
|
+
deviceId: string,
|
|
193
|
+
name: string,
|
|
194
|
+
type: string,
|
|
195
|
+
options?: { address?: string, model?: string, rssi?: number, encryptionKey?: string, keyId?: string, matterType?: number },
|
|
196
|
+
): Promise<any> {
|
|
197
|
+
const payload: any = { deviceId, name, type }
|
|
198
|
+
if (options?.address) {
|
|
199
|
+
payload.address = options.address
|
|
200
|
+
}
|
|
201
|
+
if (options?.model) {
|
|
202
|
+
payload.model = options.model
|
|
203
|
+
}
|
|
204
|
+
if (options?.rssi !== undefined && options?.rssi !== null && options?.rssi !== 0) {
|
|
205
|
+
payload.rssi = options.rssi
|
|
206
|
+
}
|
|
207
|
+
if (options?.encryptionKey) {
|
|
208
|
+
payload.encryptionKey = options.encryptionKey
|
|
209
|
+
}
|
|
210
|
+
if (options?.keyId) {
|
|
211
|
+
payload.keyId = options.keyId
|
|
212
|
+
}
|
|
213
|
+
if (options?.matterType !== undefined) {
|
|
214
|
+
payload.matterType = options.matterType
|
|
215
|
+
}
|
|
216
|
+
uiLog.info('Adding device to config:', payload)
|
|
217
|
+
const resp = await homebridge.request('/add-device', payload)
|
|
218
|
+
uiLog.info('Add device response:', resp)
|
|
219
|
+
if (!resp || resp.success === false) {
|
|
220
|
+
throw new Error(resp?.data?.message || 'Failed to add device')
|
|
221
|
+
}
|
|
222
|
+
return resp.data || resp
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export async function addDevicesInBulk(
|
|
226
|
+
devices: Array<{ deviceId: string, name: string, type: string, rssi?: number, address?: string, model?: string }>,
|
|
227
|
+
): Promise<any> {
|
|
228
|
+
const resp = await homebridge.request('/add-devices', { devices })
|
|
229
|
+
uiLog.info('Bulk add response:', resp)
|
|
230
|
+
if (!resp || resp.success === false) {
|
|
231
|
+
throw new Error(resp?.data?.message || 'Bulk add failed')
|
|
232
|
+
}
|
|
233
|
+
return resp.data || resp
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export async function updateDevice(
|
|
237
|
+
deviceId: string,
|
|
238
|
+
configDeviceName?: string,
|
|
239
|
+
configDeviceType?: string,
|
|
240
|
+
options?: { matterType?: number },
|
|
241
|
+
): Promise<any> {
|
|
242
|
+
const params: any = { deviceId }
|
|
243
|
+
if (configDeviceName) {
|
|
244
|
+
params.configDeviceName = configDeviceName
|
|
245
|
+
}
|
|
246
|
+
if (configDeviceType) {
|
|
247
|
+
params.configDeviceType = configDeviceType
|
|
248
|
+
}
|
|
249
|
+
if (options?.matterType !== undefined) {
|
|
250
|
+
params.matterType = options.matterType
|
|
251
|
+
}
|
|
252
|
+
uiLog.info('[Update Device] Sending update request with params:', params)
|
|
253
|
+
const resp = await homebridge.request('/update-device', params)
|
|
254
|
+
uiLog.info('[Update Device] Update response:', resp)
|
|
255
|
+
if (!resp || resp.success === false) {
|
|
256
|
+
throw new Error(resp?.data?.message || 'Failed to update device')
|
|
257
|
+
}
|
|
258
|
+
return resp.data || resp
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export async function deleteDevice(deviceId: string): Promise<any> {
|
|
262
|
+
uiLog.info('Sending delete request for deviceId:', deviceId)
|
|
263
|
+
const resp = await homebridge.request('/delete-device', { deviceId })
|
|
264
|
+
uiLog.info('Delete response:', resp)
|
|
265
|
+
if (!resp || resp.success === false) {
|
|
266
|
+
throw new Error(resp?.data?.message || 'Failed to delete device')
|
|
267
|
+
}
|
|
268
|
+
return resp.data || resp
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export async function deleteAllDevices(): Promise<any> {
|
|
272
|
+
uiLog.info('Sending delete all devices request')
|
|
273
|
+
const resp = await homebridge.request('/delete-all-devices', {})
|
|
274
|
+
uiLog.info('Delete all response:', resp)
|
|
275
|
+
if (!resp || resp.success === false) {
|
|
276
|
+
throw new Error(resp?.data?.message || 'Failed to delete all devices')
|
|
277
|
+
}
|
|
278
|
+
return resp.data || resp
|
|
279
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/app.ts"],"names":[],"mappings":""}
|