@switchbot/homebridge-switchbot 5.0.0-beta.99 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/config.json +14 -0
- package/.github/copilot-instructions.md +39 -0
- package/.github/workflows/ci.yml +4 -1
- package/.github/workflows/manual-e2e.yml +6 -3
- package/.github/workflows/release.yml +64 -15
- package/.github/workflows/stale.yml +2 -4
- package/.husky/pre-push +15 -0
- package/CHANGELOG.md +126 -134
- package/MIGRATION.md +16 -6
- package/README.md +84 -3
- package/TODO.md +263 -0
- package/config.schema.json +229 -36
- package/dist/SwitchBotHAPPlatform.d.ts +133 -0
- package/dist/SwitchBotHAPPlatform.d.ts.map +1 -0
- package/dist/SwitchBotHAPPlatform.js +555 -0
- package/dist/SwitchBotHAPPlatform.js.map +1 -0
- package/dist/SwitchBotMatterPlatform.d.ts +141 -0
- package/dist/SwitchBotMatterPlatform.d.ts.map +1 -0
- package/dist/SwitchBotMatterPlatform.js +536 -0
- package/dist/SwitchBotMatterPlatform.js.map +1 -0
- package/dist/device-types.d.ts +31 -0
- package/dist/device-types.d.ts.map +1 -0
- package/dist/device-types.js +246 -0
- package/dist/device-types.js.map +1 -0
- package/dist/deviceCommandMapper.d.ts +10 -0
- package/dist/deviceCommandMapper.d.ts.map +1 -0
- package/dist/deviceCommandMapper.js +319 -0
- package/dist/deviceCommandMapper.js.map +1 -0
- package/dist/deviceFactory.d.ts +3 -2
- package/dist/deviceFactory.d.ts.map +1 -1
- package/dist/deviceFactory.js +107 -29
- package/dist/deviceFactory.js.map +1 -1
- package/dist/devices/genericDevice.d.ts +59 -37
- package/dist/devices/genericDevice.d.ts.map +1 -1
- package/dist/devices/genericDevice.js +376 -78
- package/dist/devices/genericDevice.js.map +1 -1
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/homebridge-ui/device-types.js +246 -0
- package/dist/homebridge-ui/device-types.js.map +1 -0
- package/dist/homebridge-ui/deviceCommandMapper.js +319 -0
- package/dist/homebridge-ui/deviceCommandMapper.js.map +1 -0
- package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
- package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/config.js +90 -0
- package/dist/homebridge-ui/endpoints/config.js.map +1 -0
- package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
- package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
- package/dist/homebridge-ui/endpoints/devices.js +144 -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 +219 -0
- package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
- package/dist/homebridge-ui/errors.js +32 -0
- package/dist/homebridge-ui/errors.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/config.js +90 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/config.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js +144 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js +219 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/server.js +11 -0
- package/dist/homebridge-ui/homebridge-ui/server.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js +108 -0
- package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js +111 -0
- package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/logger.js +17 -0
- package/dist/homebridge-ui/homebridge-ui/utils/logger.js.map +1 -0
- package/dist/homebridge-ui/public/css/styles.css +483 -0
- package/dist/homebridge-ui/public/index.html +197 -621
- package/dist/homebridge-ui/public/js/advanced-settings.d.ts +3 -0
- package/dist/homebridge-ui/public/js/advanced-settings.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/advanced-settings.js +95 -0
- package/dist/homebridge-ui/public/js/advanced-settings.js.map +1 -0
- package/dist/homebridge-ui/public/js/advanced-settings.ts +94 -0
- package/dist/homebridge-ui/public/js/api.d.ts +66 -0
- package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/api.js +295 -0
- package/dist/homebridge-ui/public/js/api.js.map +1 -0
- package/dist/homebridge-ui/public/js/api.ts +355 -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 +3722 -0
- package/dist/homebridge-ui/public/js/app.js.map +7 -0
- package/dist/homebridge-ui/public/js/app.ts +22 -0
- package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
- package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/constants.js +2 -0
- package/dist/homebridge-ui/public/js/constants.js.map +1 -0
- package/dist/homebridge-ui/public/js/constants.ts +1 -0
- package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
- package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/credentials.js +99 -0
- package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
- package/dist/homebridge-ui/public/js/credentials.ts +105 -0
- package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
- package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/devices-delete.js +199 -0
- package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices-delete.ts +227 -0
- package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
- package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/devices.js +98 -0
- package/dist/homebridge-ui/public/js/devices.js.map +1 -0
- package/dist/homebridge-ui/public/js/devices.ts +106 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts +9 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.js +1201 -0
- package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
- package/dist/homebridge-ui/public/js/discovery.ts +1335 -0
- package/dist/homebridge-ui/public/js/logger.d.ts +7 -0
- package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/logger.js +17 -0
- package/dist/homebridge-ui/public/js/logger.js.map +1 -0
- package/dist/homebridge-ui/public/js/logger.ts +17 -0
- package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
- package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/modal.js +35 -0
- package/dist/homebridge-ui/public/js/modal.js.map +1 -0
- package/dist/homebridge-ui/public/js/modal.ts +35 -0
- package/dist/homebridge-ui/public/js/modals.d.ts +15 -0
- package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/modals.js +675 -0
- package/dist/homebridge-ui/public/js/modals.js.map +1 -0
- package/dist/homebridge-ui/public/js/modals.ts +765 -0
- package/dist/homebridge-ui/public/js/render.d.ts +71 -0
- package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
- package/dist/homebridge-ui/public/js/render.js +960 -0
- package/dist/homebridge-ui/public/js/render.js.map +1 -0
- package/dist/homebridge-ui/public/js/render.ts +1084 -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 +38 -0
- package/dist/homebridge-ui/public/js/toast.js.map +1 -0
- package/dist/homebridge-ui/public/js/toast.ts +44 -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.d.ts +1 -3
- package/dist/homebridge-ui/server.d.ts.map +1 -1
- package/dist/homebridge-ui/server.js +8 -471
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/homebridge-ui/settings.js +8 -0
- package/dist/homebridge-ui/settings.js.map +1 -0
- package/dist/homebridge-ui/switchbotClient.js +247 -0
- package/dist/homebridge-ui/switchbotClient.js.map +1 -0
- package/dist/homebridge-ui/utils/config-parser.d.ts +39 -0
- package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/config-parser.js +108 -0
- package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
- package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
- package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/device-migration.js +111 -0
- package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
- package/dist/homebridge-ui/utils/logger.d.ts +7 -0
- package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
- package/dist/homebridge-ui/utils/logger.js +17 -0
- package/dist/homebridge-ui/utils/logger.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +1 -0
- package/dist/settings.js.map +1 -1
- package/dist/switchbotClient.d.ts +12 -10
- package/dist/switchbotClient.d.ts.map +1 -1
- package/dist/switchbotClient.js +156 -103
- package/dist/switchbotClient.js.map +1 -1
- package/dist/utils.d.ts +76 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1121 -4
- package/dist/utils.js.map +1 -1
- package/docs/assets/highlight.css +16 -2
- package/docs/assets/main.js +1 -1
- package/docs/index.html +82 -5
- package/docs/variables/default.html +3 -1
- package/eslint.config.js +9 -5
- package/nodemon.json +2 -2
- package/package.json +34 -21
- package/scripts/build-ui.js +37 -0
- package/scripts/free-dev-ports.mjs +105 -0
- package/scripts/generate-matter-maps.js +34 -17
- package/scripts/sync-device-types.mjs +31 -0
- package/src/SwitchBotHAPPlatform.ts +558 -0
- package/src/SwitchBotMatterPlatform.ts +538 -0
- package/src/device-types.js +246 -0
- package/src/device-types.js.map +1 -0
- package/src/device-types.ts +261 -0
- package/src/deviceCommandMapper.js +319 -0
- package/src/deviceCommandMapper.js.map +1 -0
- package/src/deviceCommandMapper.ts +333 -0
- package/src/deviceFactory.ts +125 -45
- package/src/devices/genericDevice.ts +411 -69
- package/src/errors.js +32 -0
- package/src/errors.js.map +1 -0
- package/src/errors.ts +35 -0
- package/src/homebridge-ui/endpoints/config.ts +110 -0
- package/src/homebridge-ui/endpoints/devices.ts +153 -0
- package/src/homebridge-ui/endpoints/discovery.ts +240 -0
- package/src/homebridge-ui/public/css/styles.css +483 -0
- package/src/homebridge-ui/public/index.html +197 -621
- package/src/homebridge-ui/public/js/advanced-settings.ts +94 -0
- package/src/homebridge-ui/public/js/api.ts +355 -0
- package/src/homebridge-ui/public/js/app.ts +22 -0
- package/src/homebridge-ui/public/js/constants.ts +1 -0
- package/src/homebridge-ui/public/js/credentials.ts +105 -0
- package/src/homebridge-ui/public/js/devices-delete.ts +227 -0
- package/src/homebridge-ui/public/js/devices.ts +106 -0
- package/src/homebridge-ui/public/js/discovery.ts +1335 -0
- package/src/homebridge-ui/public/js/logger.ts +17 -0
- package/src/homebridge-ui/public/js/modal.ts +35 -0
- package/src/homebridge-ui/public/js/modals.ts +765 -0
- package/src/homebridge-ui/public/js/render.ts +1084 -0
- package/src/homebridge-ui/public/js/toast.ts +44 -0
- package/src/homebridge-ui/public/js/types.ts +26 -0
- package/src/homebridge-ui/server.ts +9 -554
- package/src/homebridge-ui/utils/config-parser.ts +125 -0
- package/src/homebridge-ui/utils/device-migration.ts +144 -0
- package/src/homebridge-ui/utils/logger.ts +17 -0
- package/src/index.ts +12 -2
- package/src/settings.js +8 -0
- package/src/settings.js.map +1 -0
- package/src/settings.ts +2 -0
- package/src/switchbotClient.js +247 -0
- package/src/switchbotClient.js.map +1 -0
- package/src/switchbotClient.ts +177 -114
- package/src/utils.ts +1133 -5
- package/test/client/switchbot-client-debounce.spec.ts +35 -0
- package/test/client/switchbot-client-openapi.spec.ts +19 -0
- package/test/client/switchbotClient.spec.ts +64 -0
- package/test/device/device-mapping.spec.ts +23 -0
- package/test/device/deviceBase.spec.ts +26 -0
- package/test/device/deviceFactory-edge.spec.ts +15 -0
- package/test/device/deviceFactory.spec.ts +33 -0
- package/test/device/fan-swing.spec.ts +34 -0
- package/test/device/genericDevice-blepoll.spec.ts +47 -0
- package/test/device/irdevice.spec.ts +9 -0
- package/test/device/lock-users.spec.ts +35 -0
- package/test/device/matter-descriptors.spec.ts +22 -0
- package/test/device/matter-device-state.spec.ts +37 -0
- package/test/e2e/run-e2e.spec.ts +18 -19
- package/test/errors/errors.spec.ts +10 -0
- package/test/helpers/matter-harness.ts +20 -9
- package/test/homebridge-ui/server.spec.ts +9 -0
- package/test/platform/accessory-restore.spec.ts +37 -0
- package/test/platform/matter-childbridge.spec.ts +34 -0
- package/test/platform/matter-integration.spec.ts +33 -0
- package/test/platform/platform-edge.spec.ts +73 -0
- package/test/platform/platform.integration.spec.ts +34 -0
- package/test/utils/utils-extra.spec.ts +10 -0
- package/test/utils/utils.spec.ts +53 -0
- package/todo/TODO.md +80 -0
- package/tsconfig.ui.json +11 -0
- package/.github/npm-version-script-esm.js +0 -97
- package/.github/workflows/beta-release.yml +0 -52
- package/dist/platform.d.ts +0 -35
- package/dist/platform.d.ts.map +0 -1
- package/dist/platform.js +0 -945
- package/dist/platform.js.map +0 -1
- package/src/platform.ts +0 -963
- package/test/accessory-restore.spec.ts +0 -73
- package/test/device-mapping.spec.ts +0 -37
- package/test/deviceFactory.spec.ts +0 -18
- package/test/fan-swing.spec.ts +0 -29
- package/test/lock-users.spec.ts +0 -44
- package/test/matter-childbridge.spec.ts +0 -55
- package/test/matter-descriptors.spec.ts +0 -97
- package/test/matter-device-state.spec.ts +0 -101
- package/test/matter-integration.spec.ts +0 -70
- package/test/platform.integration.spec.ts +0 -55
- package/test/switchbot-client-debounce.spec.ts +0 -131
- package/test/switchbot-client-openapi.spec.ts +0 -56
- package/test/switchbotClient.spec.ts +0 -10
- package/test/utils.spec.ts +0 -20
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { createDevice } from './deviceFactory.js';
|
|
2
|
+
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
3
|
+
import { SwitchBotClient } from './switchbotClient.js';
|
|
4
|
+
import { normalizeTypeForMatter } from './utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Homebridge platform class for SwitchBot HAP (HomeKit Accessory Protocol) integration.
|
|
7
|
+
* Handles device discovery, registration, polling, and accessory lifecycle for HAP-enabled SwitchBot devices.
|
|
8
|
+
*
|
|
9
|
+
* @class SwitchBotHAPPlatform
|
|
10
|
+
* @param {Logger} log - Homebridge logger instance
|
|
11
|
+
* @param {PlatformConfig} config - Platform configuration object
|
|
12
|
+
* @param {API} [api] - Optional Homebridge API instance
|
|
13
|
+
* @property {API | undefined} api - Homebridge API instance
|
|
14
|
+
* @property {Logger} log - Homebridge logger instance
|
|
15
|
+
* @property {SwitchBotPluginConfig} config - Parsed plugin config
|
|
16
|
+
* @property {any[]} devices - All created device instances
|
|
17
|
+
* @property {Map<string, any>} accessories - Map of accessory UUID to accessory object
|
|
18
|
+
* @property {string} lastConfigHash - Hash of last loaded config for change detection
|
|
19
|
+
* @property {NodeJS.Timeout | null} configReloadInterval - Interval for periodic config reload
|
|
20
|
+
* @property {Map<string, NodeJS.Timeout>} openApiPollTimers - Timers for per-device OpenAPI polling
|
|
21
|
+
* @property {NodeJS.Timeout | null} openApiBatchTimer - Timer for batched OpenAPI polling
|
|
22
|
+
* @property {number} openApiRequestsToday - Count of OpenAPI requests made today
|
|
23
|
+
* @property {number} openApiLastReset - Timestamp (ms) of last OpenAPI daily counter reset
|
|
24
|
+
*/
|
|
25
|
+
export class SwitchBotHAPPlatform {
|
|
26
|
+
/** Homebridge API instance */
|
|
27
|
+
api;
|
|
28
|
+
/** Homebridge logger instance */
|
|
29
|
+
log;
|
|
30
|
+
/** Parsed plugin config */
|
|
31
|
+
config;
|
|
32
|
+
/** All created device instances */
|
|
33
|
+
devices = [];
|
|
34
|
+
/** Map of accessory UUID to accessory object */
|
|
35
|
+
accessories;
|
|
36
|
+
/** Hash of last loaded config for change detection */
|
|
37
|
+
lastConfigHash = '';
|
|
38
|
+
/** Interval for periodic config reload */
|
|
39
|
+
configReloadInterval = null;
|
|
40
|
+
/** Timers for per-device OpenAPI polling */
|
|
41
|
+
openApiPollTimers = new Map();
|
|
42
|
+
/** Timer for batched OpenAPI polling */
|
|
43
|
+
openApiBatchTimer = null;
|
|
44
|
+
/** Count of OpenAPI requests made today */
|
|
45
|
+
openApiRequestsToday = 0;
|
|
46
|
+
/** Timestamp (ms) of last OpenAPI daily counter reset */
|
|
47
|
+
openApiLastReset = 0;
|
|
48
|
+
/**
|
|
49
|
+
* Construct the SwitchBot HAP platform.
|
|
50
|
+
* @param log Homebridge logger
|
|
51
|
+
* @param config Platform config
|
|
52
|
+
* @param api Homebridge API instance
|
|
53
|
+
*/
|
|
54
|
+
constructor(log, config, api) {
|
|
55
|
+
this.log = log;
|
|
56
|
+
// Ensure both log and logger are set for downstream device constructors
|
|
57
|
+
this.config = { ...config, log, logger: log };
|
|
58
|
+
this.api = api;
|
|
59
|
+
this.accessories = new Map();
|
|
60
|
+
this.log.info('SwitchBot HAP platform initialized');
|
|
61
|
+
// Create/shared SwitchBot client and attach to config so child devices reuse it.
|
|
62
|
+
try {
|
|
63
|
+
const client = new SwitchBotClient(this.config);
|
|
64
|
+
void client.init();
|
|
65
|
+
this.config._client = client;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
this.log.debug('Failed to create shared SwitchBot client', e);
|
|
69
|
+
}
|
|
70
|
+
// Wait for Homebridge to finish launching to create/register accessories
|
|
71
|
+
if (this.api && typeof this.api.on === 'function') {
|
|
72
|
+
this.api.on('didFinishLaunching', async () => {
|
|
73
|
+
await this.loadDevices();
|
|
74
|
+
this._setupOpenApiPolling();
|
|
75
|
+
// Start periodic config reload to pick up UI changes
|
|
76
|
+
this.configReloadInterval = setInterval(() => {
|
|
77
|
+
void this.checkAndReloadDevices();
|
|
78
|
+
}, 10000); // Check every 10 seconds
|
|
79
|
+
// Listen for Homebridge shutdown to clear interval
|
|
80
|
+
if (typeof this.api.on === 'function') {
|
|
81
|
+
this.api.on('shutdown', () => {
|
|
82
|
+
this.shutdown();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
void this.loadDevices();
|
|
89
|
+
this._setupOpenApiPolling();
|
|
90
|
+
// Start periodic config reload to pick up UI changes
|
|
91
|
+
this.configReloadInterval = setInterval(() => {
|
|
92
|
+
void this.checkAndReloadDevices();
|
|
93
|
+
}, 10000); // Check every 10 seconds
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Discover and create all device instances from config.
|
|
98
|
+
* Populates this.devices and registers HAP accessories for each device.
|
|
99
|
+
* Ensures Matter API is loaded before loading devices if available.
|
|
100
|
+
*
|
|
101
|
+
* @returns {Promise<void>} Resolves when all devices are loaded and registered
|
|
102
|
+
*/
|
|
103
|
+
async loadDevices() {
|
|
104
|
+
// Matter API readiness logic (hybrid only)
|
|
105
|
+
const maxAttempts = 20;
|
|
106
|
+
let attempt = 0;
|
|
107
|
+
let matterLoaded = false;
|
|
108
|
+
if (this.api && typeof this.api.isMatterAvailable === 'function' && typeof this.api.isMatterEnabled === 'function' && typeof this.api.loadMatterAPI === 'function') {
|
|
109
|
+
if (this.api.isMatterAvailable() && this.api.isMatterEnabled()) {
|
|
110
|
+
try {
|
|
111
|
+
await this.api.loadMatterAPI();
|
|
112
|
+
this.log.info('Homebridge Matter API loaded successfully');
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
this.log.warn('Failed to load Homebridge Matter API', e);
|
|
116
|
+
}
|
|
117
|
+
while (attempt < maxAttempts) {
|
|
118
|
+
if (this.api.matter) {
|
|
119
|
+
matterLoaded = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
await new Promise(res => setTimeout(res, 500));
|
|
123
|
+
attempt++;
|
|
124
|
+
}
|
|
125
|
+
if (!matterLoaded) {
|
|
126
|
+
this.log.warn('Matter API did not become available after loadMatterAPI()');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const newHash = this.getConfigHash();
|
|
131
|
+
if (newHash === this.lastConfigHash) {
|
|
132
|
+
this.log.debug('Config unchanged, skipping device reload');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const devices = this.config?.devices ?? [];
|
|
136
|
+
const createdDevices = [];
|
|
137
|
+
for (const raw of devices) {
|
|
138
|
+
// Normalize config keys from UI schema to internal shape (for cross-platform consistency)
|
|
139
|
+
const d = {
|
|
140
|
+
id: raw.deviceId ?? raw.id,
|
|
141
|
+
name: raw.configDeviceName ?? raw.name,
|
|
142
|
+
type: raw.configDeviceType ?? raw.type ?? raw.deviceType ?? 'unknown',
|
|
143
|
+
encryptionKey: raw.encryptionKey,
|
|
144
|
+
keyId: raw.keyId,
|
|
145
|
+
_raw: raw,
|
|
146
|
+
};
|
|
147
|
+
const type = normalizeTypeForMatter(d.type);
|
|
148
|
+
const deviceOpts = { id: d.id, type, name: d.name, encryptionKey: d.encryptionKey, keyId: d.keyId, log: this.log };
|
|
149
|
+
this.log.debug(`[HAP/Debug] Device options for ${d.name ?? d.id}:`, JSON.stringify(deviceOpts, null, 2));
|
|
150
|
+
try {
|
|
151
|
+
const created = await createDevice(deviceOpts, this.config, false);
|
|
152
|
+
this.devices.push(created);
|
|
153
|
+
createdDevices.push({ created, d, type });
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
this.log.error(`Failed to create HAP device ${d.id}:`, e instanceof Error ? e.stack || e.message : e);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Register HAP accessories after all devices are created for symmetry with Matter platform
|
|
160
|
+
await this.registerHAPAccessories(createdDevices);
|
|
161
|
+
this.lastConfigHash = newHash;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Registers all HAP accessories with the Homebridge HAP API.
|
|
165
|
+
*
|
|
166
|
+
* This method is called after all device instances have been created. It handles both new and restored
|
|
167
|
+
* accessories, updating their context and adding or updating HAP services and characteristics as needed.
|
|
168
|
+
* Accessories are registered with Homebridge using the HAP API, and the internal accessory map is updated accordingly.
|
|
169
|
+
*
|
|
170
|
+
* @param {Array<{created: any, d: any, type: string}>} createdDevices - Array of device descriptors:
|
|
171
|
+
* - created: The created device instance
|
|
172
|
+
* - d: The normalized device config object
|
|
173
|
+
* - type: The normalized device type string
|
|
174
|
+
* @returns {Promise<void>} Resolves when registration is complete
|
|
175
|
+
*
|
|
176
|
+
* Differences from Matter registration:
|
|
177
|
+
* - Uses the HAP API (not Matter API) for accessory registration.
|
|
178
|
+
* - Adds HAP services and characteristics to each accessory based on the device descriptor.
|
|
179
|
+
* - Does not require or check for Matter support or availability.
|
|
180
|
+
* - Accessory context and service wiring are HAP-specific.
|
|
181
|
+
*
|
|
182
|
+
* If the Homebridge HAP API is not available, registration is skipped and a log message is emitted.
|
|
183
|
+
*/
|
|
184
|
+
async registerHAPAccessories(createdDevices) {
|
|
185
|
+
if (!this.api || !this.api.hap || typeof this.api.hap.registerPlatformAccessories !== 'function') {
|
|
186
|
+
this.log.info('HAP API not available to register accessories');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const hap = this.api.hap;
|
|
190
|
+
const accessoriesToRegister = [];
|
|
191
|
+
for (const { created, d, type } of createdDevices) {
|
|
192
|
+
try {
|
|
193
|
+
const uuid = hap.uuid.generate(`${d.id}`);
|
|
194
|
+
let accessory = this.accessories.get(uuid);
|
|
195
|
+
if (!accessory) {
|
|
196
|
+
for (const [, a] of this.accessories.entries()) {
|
|
197
|
+
try {
|
|
198
|
+
if (a && a.context && a.context.deviceId === d.id) {
|
|
199
|
+
accessory = a;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
// ignore
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!accessory) {
|
|
209
|
+
accessory = new this.api.platformAccessory(d.name || type, uuid);
|
|
210
|
+
try {
|
|
211
|
+
accessory.context = accessory.context || {};
|
|
212
|
+
accessory.context.deviceId = d.id;
|
|
213
|
+
accessory.context.type = type;
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
// ignore context failures
|
|
217
|
+
}
|
|
218
|
+
accessoriesToRegister.push(accessory);
|
|
219
|
+
this.accessories.set(uuid, accessory);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
try {
|
|
223
|
+
accessory.context = accessory.context || {};
|
|
224
|
+
accessory.context.deviceId = accessory.context.deviceId || d.id;
|
|
225
|
+
accessory.context.type = accessory.context.type || type;
|
|
226
|
+
accessory.deviceType = type;
|
|
227
|
+
const accDesc = await created.createAccessory?.(this.api);
|
|
228
|
+
accessory.displayName = (accDesc && accDesc.name) || d.name || type;
|
|
229
|
+
accessory.manufacturer = (accDesc && accDesc.manufacturer) || accessory.manufacturer || 'SwitchBot';
|
|
230
|
+
accessory.model = (accDesc && accDesc.model) || accessory.model || type;
|
|
231
|
+
accessory.serialNumber = (accDesc && accDesc.serialNumber) || accessory.serialNumber || d.id;
|
|
232
|
+
accessory.firmwareRevision = (accDesc && accDesc.firmwareRevision) || accessory.firmwareRevision || '1.0.0';
|
|
233
|
+
accessory.hardwareRevision = (accDesc && accDesc.hardwareRevision) || accessory.hardwareRevision || '';
|
|
234
|
+
accessory.UUID = accessory.UUID || accessory.uuid || uuid;
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
// ignore
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Add basic service descriptor from device (symmetrical to Matter: remove stale services/chars)
|
|
241
|
+
const accDesc = await created.createAccessory?.(this.api);
|
|
242
|
+
if (accDesc && accDesc.services) {
|
|
243
|
+
const serviceTypes = accDesc.services.map((s) => s.type);
|
|
244
|
+
for (const existingService of accessory.services.slice()) {
|
|
245
|
+
if (existingService.constructor && existingService.constructor.name && !serviceTypes.includes(existingService.constructor.name)) {
|
|
246
|
+
accessory.removeService(existingService);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
for (const s of accDesc.services) {
|
|
250
|
+
const Service = hap.Service[s.type] || hap.Service[s.type];
|
|
251
|
+
if (!Service) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const service = accessory.getService(Service) || accessory.addService(Service);
|
|
255
|
+
const charNames = Object.keys(s.characteristics || {});
|
|
256
|
+
for (const existingChar of service.characteristics.slice()) {
|
|
257
|
+
if (!charNames.includes(existingChar.displayName)) {
|
|
258
|
+
service.removeCharacteristic(existingChar);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
for (const [charName, getterSetterRaw] of Object.entries(s.characteristics || {})) {
|
|
262
|
+
const getterSetter = getterSetterRaw;
|
|
263
|
+
const Characteristic = hap.Characteristic[charName];
|
|
264
|
+
if (!Characteristic) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (getterSetter && getterSetter.props) {
|
|
268
|
+
try {
|
|
269
|
+
service.getCharacteristic(Characteristic).setProps(getterSetter.props);
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
// ignore setProps failures on older HAP implementations
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (getterSetter && typeof getterSetter.get === 'function') {
|
|
276
|
+
service.getCharacteristic(Characteristic).onGet(getterSetter.get);
|
|
277
|
+
}
|
|
278
|
+
if (getterSetter && typeof getterSetter.set === 'function') {
|
|
279
|
+
service.getCharacteristic(Characteristic).onSet(getterSetter.set);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
this.log.info(`Created/updated HAP accessory ${d.id} (${type})`);
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
this.log.warn('HAP accessory creation failed', e);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (accessoriesToRegister.length > 0) {
|
|
291
|
+
try {
|
|
292
|
+
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessoriesToRegister);
|
|
293
|
+
this.log.info(`Registered ${accessoriesToRegister.length} HAP accessory(ies) with Homebridge`);
|
|
294
|
+
}
|
|
295
|
+
catch (e) {
|
|
296
|
+
this.log.warn('Failed to register HAP accessories', e);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.log.info('No HAP accessories to register');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Returns the timestamp (ms) of the last OpenAPI daily counter reset.
|
|
305
|
+
* @returns {number} Timestamp in ms
|
|
306
|
+
*/
|
|
307
|
+
getOpenApiLastReset() {
|
|
308
|
+
return this.openApiLastReset;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Logs the last OpenAPI reset time in a human-readable format.
|
|
312
|
+
* @returns {void}
|
|
313
|
+
*/
|
|
314
|
+
logOpenApiLastReset() {
|
|
315
|
+
if (this.openApiLastReset) {
|
|
316
|
+
const date = new Date(this.openApiLastReset);
|
|
317
|
+
this.log.info(`[OpenAPI] Last daily counter reset: ${date.toLocaleString()}`);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.log.info('[OpenAPI] Daily counter has not been reset yet.');
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Compute a hash of the current device config for change detection.
|
|
325
|
+
* @returns {string} JSON string hash of device config
|
|
326
|
+
*/
|
|
327
|
+
getConfigHash() {
|
|
328
|
+
// Create a simple hash of current device config to detect changes
|
|
329
|
+
const devices = this.config?.devices ?? [];
|
|
330
|
+
return JSON.stringify(devices.map((d) => ({
|
|
331
|
+
id: d.deviceId ?? d.id,
|
|
332
|
+
type: d.configDeviceType ?? d.type,
|
|
333
|
+
name: d.configDeviceName ?? d.name,
|
|
334
|
+
})));
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Reload devices if config has changed since last load.
|
|
338
|
+
* Unregisters accessories and removes devices no longer in config.
|
|
339
|
+
* Calls loadDevices to repopulate devices and accessories.
|
|
340
|
+
*
|
|
341
|
+
* @returns {Promise<void>} Resolves when reload is complete
|
|
342
|
+
*/
|
|
343
|
+
async checkAndReloadDevices() {
|
|
344
|
+
const currentHash = this.getConfigHash();
|
|
345
|
+
if (currentHash !== this.lastConfigHash) {
|
|
346
|
+
this.log.info('[SwitchBot] Detected config changes, reloading devices...');
|
|
347
|
+
// Identify device IDs in new config
|
|
348
|
+
const devicesInConfig = new Set((this.config?.devices ?? []).map((d) => d.deviceId ?? d.id));
|
|
349
|
+
// Find accessories to remove (not in config)
|
|
350
|
+
const accessoriesToRemove = [];
|
|
351
|
+
for (const [uuid, accessory] of this.accessories.entries()) {
|
|
352
|
+
const deviceId = accessory?.context?.deviceId;
|
|
353
|
+
if (deviceId && !devicesInConfig.has(deviceId)) {
|
|
354
|
+
accessoriesToRemove.push({ accessory, uuid });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Unregister removed accessories from Homebridge
|
|
358
|
+
if (accessoriesToRemove.length > 0 && this.api && this.api.unregisterPlatformAccessories) {
|
|
359
|
+
try {
|
|
360
|
+
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessoriesToRemove.map(a => a.accessory));
|
|
361
|
+
this.log.info(`Unregistered ${accessoriesToRemove.length} accessory(ies) removed from config`);
|
|
362
|
+
for (const { uuid } of accessoriesToRemove) {
|
|
363
|
+
this.accessories.delete(uuid);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
this.log.warn('Failed to unregister removed accessories', e);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Remove devices from this.devices that are no longer in config
|
|
371
|
+
this.devices = this.devices.filter((dev) => devicesInConfig.has(dev?.id));
|
|
372
|
+
await this.loadDevices();
|
|
373
|
+
this.lastConfigHash = currentHash;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Cleanup method to clear config reload interval on shutdown.
|
|
378
|
+
* Called by Homebridge on shutdown event.
|
|
379
|
+
* @returns {void}
|
|
380
|
+
*/
|
|
381
|
+
shutdown() {
|
|
382
|
+
if (this.configReloadInterval) {
|
|
383
|
+
clearInterval(this.configReloadInterval);
|
|
384
|
+
this.configReloadInterval = null;
|
|
385
|
+
this.log.info('Cleared config reload interval on shutdown');
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Setup OpenAPI polling for all devices according to config (global, per-device, batch, rate limit).
|
|
390
|
+
* Handles daily request limits, per-device and batch polling, and resets.
|
|
391
|
+
*
|
|
392
|
+
* @returns {void}
|
|
393
|
+
*/
|
|
394
|
+
_setupOpenApiPolling() {
|
|
395
|
+
// Clear any existing timers
|
|
396
|
+
for (const t of this.openApiPollTimers.values())
|
|
397
|
+
clearInterval(t);
|
|
398
|
+
this.openApiPollTimers.clear();
|
|
399
|
+
if (this.openApiBatchTimer) {
|
|
400
|
+
clearInterval(this.openApiBatchTimer);
|
|
401
|
+
}
|
|
402
|
+
this.openApiBatchTimer = null;
|
|
403
|
+
const cfg = this.config;
|
|
404
|
+
const devices = cfg.devices ?? [];
|
|
405
|
+
const globalRate = Math.max(Number(cfg.openApiRefreshRate) || 300, 30);
|
|
406
|
+
const batchEnabled = cfg.matterBatchEnabled !== false;
|
|
407
|
+
const batchRate = Math.max(Number(cfg.matterBatchRefreshRate) || globalRate, 30);
|
|
408
|
+
const batchConcurrency = Math.max(Number(cfg.matterBatchConcurrency) || 5, 1);
|
|
409
|
+
const batchJitter = Math.max(Number(cfg.matterBatchJitter) || 0, 0);
|
|
410
|
+
const dailyLimit = Math.max(Number(cfg.dailyApiLimit) || 10000, 1000);
|
|
411
|
+
const dailyReserve = Math.max(Number(cfg.dailyApiReserveForCommands) || 1000, 0);
|
|
412
|
+
const resetAtLocalMidnight = !!cfg.dailyApiResetLocalMidnight;
|
|
413
|
+
const webhookOnlyOnReserve = !!cfg.webhookOnlyOnReserve;
|
|
414
|
+
// Helper to reset daily counter
|
|
415
|
+
const resetCounter = () => {
|
|
416
|
+
this.openApiRequestsToday = 0;
|
|
417
|
+
this.openApiLastReset = Date.now();
|
|
418
|
+
this.log.info('[OpenAPI] Daily request counter reset');
|
|
419
|
+
};
|
|
420
|
+
// Schedule reset at midnight
|
|
421
|
+
const scheduleMidnightReset = () => {
|
|
422
|
+
const now = new Date();
|
|
423
|
+
let nextReset;
|
|
424
|
+
if (resetAtLocalMidnight) {
|
|
425
|
+
nextReset = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 1);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
nextReset = new Date(now);
|
|
429
|
+
nextReset.setUTCHours(24, 0, 1, 0);
|
|
430
|
+
}
|
|
431
|
+
const ms = nextReset.getTime() - now.getTime();
|
|
432
|
+
setTimeout(() => {
|
|
433
|
+
resetCounter();
|
|
434
|
+
scheduleMidnightReset();
|
|
435
|
+
}, ms);
|
|
436
|
+
};
|
|
437
|
+
scheduleMidnightReset();
|
|
438
|
+
// Helper to check if polling is allowed
|
|
439
|
+
const canPoll = () => {
|
|
440
|
+
if (this.openApiRequestsToday + dailyReserve >= dailyLimit) {
|
|
441
|
+
if (!webhookOnlyOnReserve) {
|
|
442
|
+
this.log.warn('[OpenAPI] Daily request limit reached, pausing background polling');
|
|
443
|
+
}
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
return true;
|
|
447
|
+
};
|
|
448
|
+
// Per-device polling (devices with per-device refreshRate)
|
|
449
|
+
for (const dev of devices) {
|
|
450
|
+
const id = dev.deviceId ?? dev.id;
|
|
451
|
+
const enabled = dev.enabled !== false;
|
|
452
|
+
if (!id || !enabled) {
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
const perDeviceRate = dev.refreshRate ? Math.max(Number(dev.refreshRate), 30) : null;
|
|
456
|
+
if (perDeviceRate) {
|
|
457
|
+
// Individual polling interval for this device
|
|
458
|
+
const timer = setInterval(async () => {
|
|
459
|
+
if (!canPoll()) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
try {
|
|
463
|
+
const client = this.config._client;
|
|
464
|
+
if (client && typeof client.getDevice === 'function') {
|
|
465
|
+
await client.getDevice(id);
|
|
466
|
+
this.openApiRequestsToday++;
|
|
467
|
+
this.log.debug(`[OpenAPI] Polled device ${id} (per-device interval ${perDeviceRate}s) [${this.openApiRequestsToday}/${dailyLimit}]`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch (e) {
|
|
471
|
+
this.log.debug(`[OpenAPI] Polling failed for device ${id}:`, e?.message);
|
|
472
|
+
}
|
|
473
|
+
}, perDeviceRate * 1000);
|
|
474
|
+
this.openApiPollTimers.set(id, timer);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// Batched polling for all other devices
|
|
478
|
+
if (batchEnabled) {
|
|
479
|
+
// Devices not already polled individually
|
|
480
|
+
const batchDevices = devices.filter((dev) => {
|
|
481
|
+
const id = dev.deviceId ?? dev.id;
|
|
482
|
+
const enabled = dev.enabled !== false;
|
|
483
|
+
const perDeviceRate = dev.refreshRate ? Math.max(Number(dev.refreshRate), 30) : null;
|
|
484
|
+
return id && enabled && !perDeviceRate;
|
|
485
|
+
});
|
|
486
|
+
// Optional jitter before first batch
|
|
487
|
+
const startBatch = () => {
|
|
488
|
+
this.openApiBatchTimer = setInterval(async () => {
|
|
489
|
+
if (!canPoll()) {
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
const client = this.config._client;
|
|
493
|
+
if (!client || typeof client.getDevice !== 'function') {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
// Limit concurrency
|
|
497
|
+
const chunks = [];
|
|
498
|
+
for (let i = 0; i < batchDevices.length; i += batchConcurrency) {
|
|
499
|
+
chunks.push(batchDevices.slice(i, i + batchConcurrency));
|
|
500
|
+
}
|
|
501
|
+
for (const chunk of chunks) {
|
|
502
|
+
await Promise.all(chunk.map(async (dev) => {
|
|
503
|
+
try {
|
|
504
|
+
await client.getDevice(dev.deviceId ?? dev.id);
|
|
505
|
+
this.openApiRequestsToday++;
|
|
506
|
+
this.log.debug(`[OpenAPI] Batched poll device ${dev.deviceId ?? dev.id} [${this.openApiRequestsToday}/${dailyLimit}]`);
|
|
507
|
+
}
|
|
508
|
+
catch (e) {
|
|
509
|
+
this.log.debug(`[OpenAPI] Batched polling failed for device ${dev.deviceId ?? dev.id}:`, e?.message);
|
|
510
|
+
}
|
|
511
|
+
}));
|
|
512
|
+
}
|
|
513
|
+
}, batchRate * 1000);
|
|
514
|
+
};
|
|
515
|
+
if (batchJitter > 0) {
|
|
516
|
+
setTimeout(startBatch, Math.floor(Math.random() * batchJitter * 1000));
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
startBatch();
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Called by Homebridge to restore cached HAP accessories on startup.
|
|
525
|
+
* @param {any} accessory - The cached accessory object
|
|
526
|
+
* @returns {Promise<void>} Resolves when accessory is restored
|
|
527
|
+
*/
|
|
528
|
+
async configureAccessory(accessory) {
|
|
529
|
+
try {
|
|
530
|
+
const uuid = accessory.UUID || accessory.UUID;
|
|
531
|
+
this.accessories.set(uuid, accessory);
|
|
532
|
+
this.log.info(`Restored cached accessory ${accessory.displayName || uuid}`);
|
|
533
|
+
}
|
|
534
|
+
catch (e) {
|
|
535
|
+
this.log.warn('configureAccessory failed to restore accessory', e);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Called by Homebridge when a cached Matter accessory is restored (optional signature).
|
|
540
|
+
* @param {any} accessory - The cached accessory object
|
|
541
|
+
* @returns {void}
|
|
542
|
+
*/
|
|
543
|
+
configureMatterAccessory(accessory) {
|
|
544
|
+
try {
|
|
545
|
+
const uuid = accessory.uuid || accessory.UUID || accessory.uuid;
|
|
546
|
+
this.accessories.set(uuid, accessory);
|
|
547
|
+
this.log.info(`Restored cached Matter accessory ${accessory.displayName || uuid}`);
|
|
548
|
+
}
|
|
549
|
+
catch (e) {
|
|
550
|
+
this.log.warn('configureMatterAccessory failed to restore accessory', e);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
export default SwitchBotHAPPlatform;
|
|
555
|
+
//# sourceMappingURL=SwitchBotHAPPlatform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwitchBotHAPPlatform.js","sourceRoot":"","sources":["../src/SwitchBotHAPPlatform.ts"],"names":[],"mappings":"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"}
|