homebridge-plugin-klares4 2.1.0-rc.8 → 2.1.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/CHANGELOG.md +41 -0
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +7 -1
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/matter-accessory-registry.d.ts +13 -15
- package/dist/platform/matter-accessory-registry.d.ts.map +1 -1
- package/dist/platform/matter-accessory-registry.js +75 -119
- package/dist/platform/matter-accessory-registry.js.map +1 -1
- package/dist/platform/matter-device-mapper.d.ts +2 -0
- package/dist/platform/matter-device-mapper.d.ts.map +1 -1
- package/dist/platform/matter-device-mapper.js +22 -6
- package/dist/platform/matter-device-mapper.js.map +1 -1
- package/dist/platform/matter-fallback-store.d.ts +21 -0
- package/dist/platform/matter-fallback-store.d.ts.map +1 -0
- package/dist/platform/matter-fallback-store.js +105 -0
- package/dist/platform/matter-fallback-store.js.map +1 -0
- package/dist/platform/matter-register-probe.d.ts +10 -0
- package/dist/platform/matter-register-probe.d.ts.map +1 -0
- package/dist/platform/matter-register-probe.js +49 -0
- package/dist/platform/matter-register-probe.js.map +1 -0
- package/dist/platform/matter-registration-recovery.d.ts +4 -2
- package/dist/platform/matter-registration-recovery.d.ts.map +1 -1
- package/dist/platform/matter-registration-recovery.js +3 -1
- package/dist/platform/matter-registration-recovery.js.map +1 -1
- package/dist/platform/matter-state-update-queue.d.ts +19 -0
- package/dist/platform/matter-state-update-queue.d.ts.map +1 -0
- package/dist/platform/matter-state-update-queue.js +76 -0
- package/dist/platform/matter-state-update-queue.js.map +1 -0
- package/dist/platform/matter-state-updates.d.ts.map +1 -1
- package/dist/platform/matter-state-updates.js +5 -2
- package/dist/platform/matter-state-updates.js.map +1 -1
- package/dist/platform/matter-thermostat-mapper.d.ts +5 -12
- package/dist/platform/matter-thermostat-mapper.d.ts.map +1 -1
- package/dist/platform/matter-thermostat-mapper.js +6 -13
- package/dist/platform/matter-thermostat-mapper.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.1.0] - 2026-05-19
|
|
11
|
+
|
|
12
|
+
Stable release of the Homebridge 2.0 + Matter compatibility track. Aggregates
|
|
13
|
+
the work shipped over the `2.1.0-rc.0` … `2.1.0-rc.12` cycle, verified on a
|
|
14
|
+
production Matter-only child bridge (`hap=false`) with 81 Lares4 accessories
|
|
15
|
+
in Apple Home.
|
|
16
|
+
|
|
17
|
+
Highlights vs `2.0.1`:
|
|
18
|
+
|
|
19
|
+
- Homebridge 2.0 support with native Matter accessory registration via
|
|
20
|
+
`api.matter.registerPlatformAccessories` (Thermostat, OnOffLight,
|
|
21
|
+
DimmableLight, WindowCovering, TemperatureSensor, HumiditySensor,
|
|
22
|
+
LightSensor, MotionSensor, ContactSensor, OnOffSwitch).
|
|
23
|
+
- Probe-based register settle: state updates are only pushed once
|
|
24
|
+
`getAccessoryState` confirms the Matter endpoint is queryable.
|
|
25
|
+
- Cache-resume path: accessories already in the Homebridge cache are
|
|
26
|
+
resumed without re-registering, so controllers (Apple Home, Google
|
|
27
|
+
Home) no longer see `parts list change` notifications at every
|
|
28
|
+
restart.
|
|
29
|
+
- Persistent thermostat fallback set (`klares4-matter-fallback.json`):
|
|
30
|
+
thermostats that fall back to `TemperatureSensor` stay in sync with
|
|
31
|
+
the Matter storage across restarts.
|
|
32
|
+
- Scenarios and gates are momentary `OnOffSwitch` devices with
|
|
33
|
+
configurable auto-off (`scenarioAutoOffDelay`, default 500ms).
|
|
34
|
+
- Thermostat presetTypes workaround: `presetTypeFeatures` is now passed
|
|
35
|
+
as a bitmap object, so matter.js 0.17 accepts the `Thermostat`
|
|
36
|
+
cluster and thermostats register as full Thermostat devices in
|
|
37
|
+
Apple Home (setpoint + mode control restored).
|
|
38
|
+
|
|
39
|
+
## [2.1.0-rc.12] - 2026-05-19
|
|
40
|
+
|
|
41
|
+
### Fixed (Matter)
|
|
42
|
+
|
|
43
|
+
- Thermostat registration: `presetTypeFeatures` now passed as a bitmap object `{ automatic: false, supportsNames: false }` instead of the number `0`, which matter.js 0.17 rejected with `Cannot manage number because it is not a bitmap object`. Thermostats now register as proper Matter `Thermostat` devices (not as `TemperatureSensor` fallback), restoring setpoint and mode control from Apple Home.
|
|
44
|
+
- Register/update race condition: replaced the fixed 2-second settle timer with a probe-based loop (`getAccessoryState` with exponential backoff, configurable via `KLARES4_MATTER_REGISTER_TIMEOUT_MS` / `KLARES4_MATTER_REGISTER_POLL_MS` / `KLARES4_MATTER_REGISTER_POLL_MAX_MS`). State updates are no longer pushed before the Matter endpoint is actually ready, eliminating `MatterDeviceError: Accessory ... not registered or missing endpoint` at startup.
|
|
45
|
+
- Scenarios stuck in `ON` state: scenarios now expose `OnOffSwitch` and auto-reset to off after a configurable delay (`scenarioAutoOffDelay`, default 500ms) so subsequent triggers work as expected.
|
|
46
|
+
- Gate handler asymmetry: gates now use `OnOffSwitch` with momentary semantics (single impulse + auto-off) instead of `OnOffOutlet` with dual toggle.
|
|
47
|
+
- Full re-registration on every restart: accessories already present in the Homebridge cache are now resumed via probe instead of re-registered, preventing controllers (Apple Home, Google Home) from seeing 81 spurious `parts list change` notifications.
|
|
48
|
+
- Fallback persistence: thermostats that fall back to `TemperatureSensor` are persisted to `klares4-matter-fallback.json` so the plugin and the Matter storage stay in sync across restarts (no more cluster mismatch between an endpoint stored as `TemperatureSensor` and the plugin still pushing to the `thermostat` cluster).
|
|
49
|
+
- 30-second state-update bootstrap delay reduced to 0 by default (env override still available); combined with probe-based settle, system temperature sensors now appear in Apple Home within seconds of startup.
|
|
50
|
+
|
|
10
51
|
## [2.0.1] - 2026-03-13
|
|
11
52
|
|
|
12
53
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,eAAe,EACf,iBAAiB,EACjB,OAAO,EACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAU5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3F,qBAAa,cAAe,YAAW,qBAAqB;aAqBpC,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,YAAY;aACpB,GAAG,EAAE,GAAG;IAtB5B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtD,SAAgB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;IACxE,SAAgB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAa;IAEtE,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAC5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAGhC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,eAAe,EACf,iBAAiB,EACjB,OAAO,EACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAU5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3F,qBAAa,cAAe,YAAW,qBAAqB;aAqBpC,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,YAAY;aACpB,GAAG,EAAE,GAAG;IAtB5B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtD,SAAgB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;IACxE,SAAgB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAa;IAEtE,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAC5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAGhC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,GAAG;IAkErB,wBAAwB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;YAInD,gBAAgB;IAwE9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,wBAAwB;IASzB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAItD,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIxC,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAI3C,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;CAG7D"}
|
package/dist/platform/index.js
CHANGED
|
@@ -48,7 +48,13 @@ class Lares4Platform {
|
|
|
48
48
|
createAccessoryHandler: (accessory, device) => this.handlerService.createAccessoryHandler(accessory, device),
|
|
49
49
|
updateAccessoryHandler: (handler, device) => this.handlerService.updateAccessoryHandler(handler, device),
|
|
50
50
|
});
|
|
51
|
-
this.matterRegistry = new matter_accessory_registry_1.MatterAccessoryRegistry(
|
|
51
|
+
this.matterRegistry = new matter_accessory_registry_1.MatterAccessoryRegistry({
|
|
52
|
+
api: this.api,
|
|
53
|
+
log: this.log,
|
|
54
|
+
getWsClient: () => this.wsClient,
|
|
55
|
+
storagePath: this.api.user.storagePath(),
|
|
56
|
+
momentaryAutoOffMs: this.config?.scenarioAutoOffDelay,
|
|
57
|
+
});
|
|
52
58
|
if (!config) {
|
|
53
59
|
this.log.error('No configuration found');
|
|
54
60
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":";;;AAUA,8CAAqD;AACrD,gDAA4C;AAC5C,0CAAyD;AAEzD,0DAA4D;AAC5D,oDAAuD;AACvD,6DAAyD;AACzD,2EAAsE;AACtE,2EAAsE;AACtE,+DAAkE;AAClE,+DAA0D;AAC1D,2DAAuD;AACvD,6DAAwD;AACxD,6EAAwE;AAKxE,MAAa,cAAc;IAoBvB,YACoB,GAAW,EACX,MAAoB,EACpB,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAc;QACpB,QAAG,GAAH,GAAG,CAAK;QApBZ,gBAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;QACxD,sBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;QAK5D,sBAAiB,GAA8B,IAAI,GAAG,EAAE,CAAC;QACzD,0BAAqB,GAAgB,IAAI,GAAG,EAAE,CAAC;QAe5D,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,oCAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,qDAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,IAAI,uCAAiB,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;YACxC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,mDAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,iBAAiB,GAAG,IAAI,+CAAyB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,gBAAgB,GAAG,IAAI,qCAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5G,IAAI,CAAC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,sBAAW;YACvB,YAAY,EAAE,wBAAa;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAgC,EAAE,CACxE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC;YACjE,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAQ,EAAE,CAC9C,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,mDAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":";;;AAUA,8CAAqD;AACrD,gDAA4C;AAC5C,0CAAyD;AAEzD,0DAA4D;AAC5D,oDAAuD;AACvD,6DAAyD;AACzD,2EAAsE;AACtE,2EAAsE;AACtE,+DAAkE;AAClE,+DAA0D;AAC1D,2DAAuD;AACvD,6DAAwD;AACxD,6EAAwE;AAKxE,MAAa,cAAc;IAoBvB,YACoB,GAAW,EACX,MAAoB,EACpB,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAc;QACpB,QAAG,GAAH,GAAG,CAAK;QApBZ,gBAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;QACxD,sBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;QAK5D,sBAAiB,GAA8B,IAAI,GAAG,EAAE,CAAC;QACzD,0BAAqB,GAAgB,IAAI,GAAG,EAAE,CAAC;QAe5D,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,oCAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,qDAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,IAAI,uCAAiB,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;YACxC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,mDAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,iBAAiB,GAAG,IAAI,+CAAyB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,gBAAgB,GAAG,IAAI,qCAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5G,IAAI,CAAC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,sBAAW;YACvB,YAAY,EAAE,wBAAa;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAgC,EAAE,CACxE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC;YACjE,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAQ,EAAE,CAC9C,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,mDAAuB,CAAC;YAC9C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ;YAChC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;YACxC,kBAAkB,EAAE,IAAI,CAAC,MAAM,EAAE,oBAAoB;SACxD,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACtD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC/C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAS,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAQ,EAAE;gBACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CACV,8BAA8B,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAS,EAAE;YAC/B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,wBAAwB,CAAC,SAA0B;QACtD,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC1B,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC1D,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACrE,OAAO;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAa,CAAC,CAAC;YAEjF,IAAI,CAAC,QAAQ,GAAG,IAAI,wCAAqB,CACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EACd,IAAI,EACJ,QAAQ,EACR,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,EAClC,IAAI,CAAC,MAAM,CAAC,GAAG,EACf,IAAI,CAAC,GAAG,EACR;gBACI,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;gBACjC,QAAQ,EAAE,IAAA,iCAAoB,EAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBACvE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI;gBACxD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,KAAK;gBACzD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI;gBACtD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,KAAK;gBACvD,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;gBAC5C,QAAQ;aACX,CACJ,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CACT,uGAAuG,CAC1G,CAAC;YACN,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,kBAAkB,GAAG,CAAC,MAAoB,EAAQ,EAAE;gBAC9D,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,CAAC,MAAoB,EAAQ,EAAE;gBAChE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,qBAAqB,GAAG,GAAS,EAAE;gBAC7C,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrC,CAAC,CAAC;YACF,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,wBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACnE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;gBACjF,MAAM,YAAY,GAAG,IAAI,mCAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpF,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,wBAAa,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CACV,8BAA8B,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACN,CAAC;IACL,CAAC;IAEO,yBAAyB;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,GAAS,EAAE;YAChD,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,sBAAsB,CAAC,MAAoB;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAExE,IAAI,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAClE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvH,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,wBAAwB,CAAC,MAAoB;QACjD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACpE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxH,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,kBAAkB,CAAC,SAA4B;QAClD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAEM,YAAY,CAAC,MAAoB;QACpC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAEM,eAAe,CAAC,MAAoB;QACvC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAEM,eAAe,CAAC,SAA4B;QAC/C,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACJ;AA7ND,wCA6NC"}
|
|
@@ -3,44 +3,42 @@ import type { MatterAccessory } from 'homebridge';
|
|
|
3
3
|
import type { KseniaDevice } from '../types';
|
|
4
4
|
import type { KseniaWebSocketClient } from '../websocket-client';
|
|
5
5
|
export type MatterRegistrationStatus = 'pending' | 'registered' | 'failed' | 'skipped';
|
|
6
|
+
export interface MatterRegistryDeps {
|
|
7
|
+
api: API;
|
|
8
|
+
log: Logger;
|
|
9
|
+
getWsClient: () => KseniaWebSocketClient | undefined;
|
|
10
|
+
storagePath: string;
|
|
11
|
+
momentaryAutoOffMs?: number;
|
|
12
|
+
}
|
|
6
13
|
export declare class MatterAccessoryRegistry {
|
|
7
14
|
private readonly api;
|
|
8
15
|
private readonly log;
|
|
9
16
|
private readonly getWsClient;
|
|
10
|
-
|
|
17
|
+
private readonly momentaryAutoOffMs?;
|
|
11
18
|
private readonly cachedUUIDs;
|
|
12
|
-
/** Full registration state, keyed by Lares device id (also the Matter UUID). */
|
|
13
19
|
private readonly registrations;
|
|
14
|
-
|
|
20
|
+
private readonly stateUpdateQueue;
|
|
15
21
|
private activeDiscoveredUUIDs;
|
|
16
|
-
/** UUIDs that fell back to TemperatureSensor — drive the alternate state-push path. */
|
|
17
22
|
private readonly thermostatFallbackUUIDs;
|
|
18
|
-
|
|
23
|
+
private readonly fallbackStore;
|
|
24
|
+
constructor(deps: MatterRegistryDeps);
|
|
19
25
|
get isEnabled(): boolean;
|
|
20
26
|
configureCachedAccessory(accessory: MatterAccessory): void;
|
|
21
27
|
startDiscoveryCycle(): void;
|
|
22
28
|
addOrUpdateAccessory(device: KseniaDevice): Promise<void>;
|
|
23
29
|
updateAccessoryState(device: KseniaDevice): Promise<void>;
|
|
24
30
|
pruneStaleAccessories(): Promise<void>;
|
|
25
|
-
/** Test-only introspection: registration status for a given device id. */
|
|
26
31
|
getStatus(uuid: string): MatterRegistrationStatus | undefined;
|
|
27
|
-
/** Test-only introspection: queued updates count for a device id. */
|
|
28
32
|
getPendingCount(uuid: string): number;
|
|
33
|
+
private mapperDeps;
|
|
29
34
|
private registerAccessory;
|
|
30
35
|
private completeRegistration;
|
|
31
|
-
|
|
32
|
-
* Centralised handler for failed initial registration. Currently only used for thermostats —
|
|
33
|
-
* other device types are simply marked failed and skipped for the session.
|
|
34
|
-
*/
|
|
36
|
+
private isFallbackAccessory;
|
|
35
37
|
private handleRegisterFailure;
|
|
36
|
-
private pushStateUpdate;
|
|
37
38
|
private enqueueStateFor;
|
|
38
39
|
private refreshAccessoryMetadata;
|
|
39
40
|
private hasMetadataChanged;
|
|
40
|
-
private updateCachedAccessoryMetadata;
|
|
41
|
-
private buildUpdatesFor;
|
|
42
41
|
private fmtErr;
|
|
43
|
-
private scheduleComplete;
|
|
44
42
|
private recoveryDeps;
|
|
45
43
|
}
|
|
46
44
|
//# sourceMappingURL=matter-accessory-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matter-accessory-registry.d.ts","sourceRoot":"","sources":["../../src/platform/matter-accessory-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,UAAU,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"matter-accessory-registry.d.ts","sourceRoot":"","sources":["../../src/platform/matter-accessory-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,UAAU,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAkBjE,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,qBAAqB,GAAG,SAAS,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IACtE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8C;IAC5E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAExC,IAAI,EAAE,kBAAkB;IAgBpC,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEM,wBAAwB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAK1D,mBAAmB,IAAI,IAAI;IAIrB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzD,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAI7D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI5C,OAAO,CAAC,UAAU;YASJ,iBAAiB;YAoCjB,oBAAoB;IAgClC,OAAO,CAAC,mBAAmB;YAKb,qBAAqB;IAuBnC,OAAO,CAAC,eAAe;YAcT,wBAAwB;IAWtC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,YAAY;CAavB"}
|
|
@@ -5,45 +5,32 @@ const settings_1 = require("../settings");
|
|
|
5
5
|
const matter_device_mapper_1 = require("./matter-device-mapper");
|
|
6
6
|
const matter_state_updates_1 = require("./matter-state-updates");
|
|
7
7
|
const matter_registration_recovery_1 = require("./matter-registration-recovery");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Time to wait between calling `api.matter.registerPlatformAccessories(...)` and
|
|
13
|
-
* trusting that the accessory is queryable via `api.matter.updateAccessoryState(...)`.
|
|
14
|
-
* HB2's register API is fire-and-forget (it just emits an internal event); state
|
|
15
|
-
* updates received in this window are buffered.
|
|
16
|
-
*/
|
|
17
|
-
const MATTER_REGISTER_SETTLE_MS = 2000;
|
|
8
|
+
const matter_state_update_queue_1 = require("./matter-state-update-queue");
|
|
9
|
+
const matter_fallback_store_1 = require("./matter-fallback-store");
|
|
10
|
+
const matter_register_probe_1 = require("./matter-register-probe");
|
|
18
11
|
/**
|
|
19
12
|
* Whether to fall back to a Matter TemperatureSensor when registering a real
|
|
20
13
|
* Thermostat fails (typically due to matter.js 0.17 `presetTypes` validation).
|
|
21
|
-
* HAP continues to expose the full Thermostat regardless.
|
|
22
14
|
*/
|
|
23
15
|
const MATTER_THERMOSTAT_FALLBACK_TO_TEMPERATURE_SENSOR = true;
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Registry
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
16
|
class MatterAccessoryRegistry {
|
|
28
|
-
constructor(
|
|
29
|
-
this.api = api;
|
|
30
|
-
this.log = log;
|
|
31
|
-
this.getWsClient = getWsClient;
|
|
32
|
-
/** UUIDs that HB2 reported to us via `configureMatterAccessory` (cache restore). */
|
|
17
|
+
constructor(deps) {
|
|
33
18
|
this.cachedUUIDs = new Set();
|
|
34
|
-
/** Full registration state, keyed by Lares device id (also the Matter UUID). */
|
|
35
19
|
this.registrations = new Map();
|
|
36
|
-
/** UUIDs we've seen in the current discovery cycle — used to prune stale ones. */
|
|
37
20
|
this.activeDiscoveredUUIDs = new Set();
|
|
38
|
-
/** UUIDs that fell back to TemperatureSensor — drive the alternate state-push path. */
|
|
39
21
|
this.thermostatFallbackUUIDs = new Set();
|
|
22
|
+
this.api = deps.api;
|
|
23
|
+
this.log = deps.log;
|
|
24
|
+
this.getWsClient = deps.getWsClient;
|
|
25
|
+
this.momentaryAutoOffMs = deps.momentaryAutoOffMs;
|
|
26
|
+
this.fallbackStore = new matter_fallback_store_1.MatterFallbackStore(deps.storagePath, deps.log);
|
|
27
|
+
for (const uuid of this.fallbackStore.load())
|
|
28
|
+
this.thermostatFallbackUUIDs.add(uuid);
|
|
29
|
+
this.stateUpdateQueue = new matter_state_update_queue_1.MatterStateUpdateQueue(this.api, this.log, this.registrations, (err) => this.fmtErr(err));
|
|
40
30
|
}
|
|
41
31
|
get isEnabled() {
|
|
42
32
|
return !!this.api.matter;
|
|
43
33
|
}
|
|
44
|
-
// -----------------------------------------------------------------------
|
|
45
|
-
// Lifecycle hooks called by Platform
|
|
46
|
-
// -----------------------------------------------------------------------
|
|
47
34
|
configureCachedAccessory(accessory) {
|
|
48
35
|
this.cachedUUIDs.add(accessory.UUID);
|
|
49
36
|
this.log.debug(`[Matter] Cached accessory: ${accessory.displayName} (${accessory.UUID})`);
|
|
@@ -57,19 +44,18 @@ class MatterAccessoryRegistry {
|
|
|
57
44
|
this.activeDiscoveredUUIDs.add(device.id);
|
|
58
45
|
const existing = this.registrations.get(device.id);
|
|
59
46
|
if (existing) {
|
|
60
|
-
// Already known — either still pending the settle window, registered, failed or skipped.
|
|
61
47
|
switch (existing.status) {
|
|
62
48
|
case 'pending':
|
|
63
|
-
// Queue the latest state; the settle handler will flush it.
|
|
64
49
|
this.enqueueStateFor(device);
|
|
65
50
|
return;
|
|
66
51
|
case 'registered':
|
|
67
52
|
await this.refreshAccessoryMetadata(device, existing);
|
|
68
|
-
|
|
53
|
+
this.enqueueStateFor(device);
|
|
54
|
+
this.stateUpdateQueue.scheduleFlush(device.id);
|
|
69
55
|
return;
|
|
70
56
|
case 'failed':
|
|
71
57
|
case 'skipped':
|
|
72
|
-
return;
|
|
58
|
+
return;
|
|
73
59
|
}
|
|
74
60
|
}
|
|
75
61
|
await this.registerAccessory(device);
|
|
@@ -79,22 +65,13 @@ class MatterAccessoryRegistry {
|
|
|
79
65
|
return;
|
|
80
66
|
const existing = this.registrations.get(device.id);
|
|
81
67
|
if (!existing) {
|
|
82
|
-
// First time we see this device — register it (lazy path for HAP-cached devices
|
|
83
|
-
// whose WS "discovered" callback hasn't fired yet).
|
|
84
68
|
await this.registerAccessory(device);
|
|
85
69
|
return;
|
|
86
70
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
case 'registered':
|
|
92
|
-
await this.pushStateUpdate(device);
|
|
93
|
-
return;
|
|
94
|
-
case 'failed':
|
|
95
|
-
case 'skipped':
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
71
|
+
if (existing.status === 'failed' || existing.status === 'skipped')
|
|
72
|
+
return;
|
|
73
|
+
this.enqueueStateFor(device);
|
|
74
|
+
this.stateUpdateQueue.scheduleFlush(device.id);
|
|
98
75
|
}
|
|
99
76
|
async pruneStaleAccessories() {
|
|
100
77
|
if (!this.api.matter)
|
|
@@ -112,29 +89,32 @@ class MatterAccessoryRegistry {
|
|
|
112
89
|
this.registrations.delete(uuid);
|
|
113
90
|
this.cachedUUIDs.delete(uuid);
|
|
114
91
|
this.thermostatFallbackUUIDs.delete(uuid);
|
|
92
|
+
this.fallbackStore.remove(uuid);
|
|
115
93
|
}
|
|
116
94
|
catch (err) {
|
|
117
95
|
this.log.warn(`[Matter] Failed to unregister ${uuid}: ${this.fmtErr(err)}`);
|
|
118
96
|
}
|
|
119
97
|
}
|
|
120
98
|
}
|
|
121
|
-
/** Test-only introspection: registration status for a given device id. */
|
|
122
99
|
getStatus(uuid) {
|
|
123
100
|
return this.registrations.get(uuid)?.status;
|
|
124
101
|
}
|
|
125
|
-
/** Test-only introspection: queued updates count for a device id. */
|
|
126
102
|
getPendingCount(uuid) {
|
|
127
103
|
return this.registrations.get(uuid)?.pendingStateUpdates.length ?? 0;
|
|
128
104
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
// -----------------------------------------------------------------------
|
|
132
|
-
async registerAccessory(device) {
|
|
133
|
-
const matterAccessory = (0, matter_device_mapper_1.deviceToMatterAccessory)(device, {
|
|
105
|
+
mapperDeps() {
|
|
106
|
+
return {
|
|
134
107
|
api: this.api,
|
|
135
108
|
log: this.log,
|
|
136
109
|
getWsClient: this.getWsClient,
|
|
137
|
-
|
|
110
|
+
momentaryAutoOffMs: this.momentaryAutoOffMs,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async registerAccessory(device) {
|
|
114
|
+
const persistedFallback = device.type === 'thermostat' && this.thermostatFallbackUUIDs.has(device.id);
|
|
115
|
+
const matterAccessory = persistedFallback
|
|
116
|
+
? (0, matter_device_mapper_1.mapThermostatAsTemperatureSensor)(device, this.mapperDeps())
|
|
117
|
+
: (0, matter_device_mapper_1.deviceToMatterAccessory)(device, this.mapperDeps());
|
|
138
118
|
if (!matterAccessory)
|
|
139
119
|
return;
|
|
140
120
|
const reg = {
|
|
@@ -144,11 +124,17 @@ class MatterAccessoryRegistry {
|
|
|
144
124
|
matterAccessory,
|
|
145
125
|
status: 'pending',
|
|
146
126
|
recoveryAttempts: 0,
|
|
147
|
-
pendingStateUpdates:
|
|
127
|
+
pendingStateUpdates: (0, matter_state_updates_1.buildStateUpdates)(device, persistedFallback),
|
|
148
128
|
};
|
|
149
129
|
this.registrations.set(device.id, reg);
|
|
150
130
|
const fromCache = this.cachedUUIDs.has(device.id);
|
|
151
|
-
|
|
131
|
+
if (fromCache) {
|
|
132
|
+
this.log.info(`[Matter] resumed from cache: ${device.name} (${device.type})${persistedFallback ? ' [fallback]' : ''}`);
|
|
133
|
+
// The Matter storage already holds the endpoint — skip register, just probe.
|
|
134
|
+
void this.completeRegistration(device.id, /*skipRegister=*/ true);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.log.info(`[Matter] register requested: ${device.name} (${device.type})${persistedFallback ? ' [fallback]' : ''}`);
|
|
152
138
|
try {
|
|
153
139
|
await this.api.matter.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [matterAccessory]);
|
|
154
140
|
}
|
|
@@ -156,46 +142,49 @@ class MatterAccessoryRegistry {
|
|
|
156
142
|
await this.handleRegisterFailure(device, err);
|
|
157
143
|
return;
|
|
158
144
|
}
|
|
159
|
-
this.
|
|
160
|
-
// Don't `await` the settle timer — let the WS event loop continue. Queued updates
|
|
161
|
-
// are stored on the registration; we flush them when the timer fires.
|
|
162
|
-
this.scheduleComplete(device.id);
|
|
145
|
+
void this.completeRegistration(device.id);
|
|
163
146
|
}
|
|
164
|
-
async completeRegistration(uuid) {
|
|
147
|
+
async completeRegistration(uuid, skipRegister = false) {
|
|
165
148
|
const reg = this.registrations.get(uuid);
|
|
166
149
|
if (!reg || reg.status !== 'pending')
|
|
167
150
|
return;
|
|
168
|
-
|
|
151
|
+
const queryable = await (0, matter_register_probe_1.probeUntilQueryable)(this.api, this.log, (e) => this.fmtErr(e), reg);
|
|
152
|
+
if (!queryable) {
|
|
153
|
+
if (skipRegister) {
|
|
154
|
+
// Cache resume failed — endpoint was lost from storage. Fall back to full register.
|
|
155
|
+
this.log.warn(`[Matter] cache resume probe timed out for ${reg.displayName}; re-registering.`);
|
|
156
|
+
try {
|
|
157
|
+
await this.api.matter.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [reg.matterAccessory]);
|
|
158
|
+
void this.completeRegistration(uuid);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
await this.handleRegisterFailure(reg.matterAccessory.context.device, err);
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
169
165
|
await (0, matter_registration_recovery_1.handleMissingRegisteredAccessory)(reg, this.recoveryDeps());
|
|
170
166
|
return;
|
|
171
167
|
}
|
|
172
168
|
reg.status = 'registered';
|
|
173
169
|
reg.registeredAt = Date.now();
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const flushed = reg.pendingStateUpdates.splice(0);
|
|
179
|
-
this.log.debug(`[Matter] pending updates flushed: ${reg.displayName} (${flushed.length})`);
|
|
180
|
-
for (const update of flushed) {
|
|
181
|
-
try {
|
|
182
|
-
await this.api.matter.updateAccessoryState(uuid, update.clusterName, update.attributes, update.partId);
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
this.log.debug(`[Matter] post-settle update error for ${reg.displayName}: ${this.fmtErr(err)}`);
|
|
186
|
-
}
|
|
170
|
+
// After successful register as real Thermostat, drop any stale fallback marker.
|
|
171
|
+
if (reg.deviceType === 'thermostat' && !this.isFallbackAccessory(reg)) {
|
|
172
|
+
if (this.thermostatFallbackUUIDs.delete(uuid))
|
|
173
|
+
this.fallbackStore.remove(uuid);
|
|
187
174
|
}
|
|
175
|
+
this.stateUpdateQueue.markReadyAfterBootstrap(reg);
|
|
176
|
+
this.log.info(`[Matter] registered: ${reg.displayName}`);
|
|
177
|
+
this.stateUpdateQueue.scheduleFlush(uuid);
|
|
178
|
+
}
|
|
179
|
+
isFallbackAccessory(reg) {
|
|
180
|
+
const clusters = reg.matterAccessory.clusters ?? {};
|
|
181
|
+
return 'temperatureMeasurement' in clusters && !('thermostat' in clusters);
|
|
188
182
|
}
|
|
189
|
-
/**
|
|
190
|
-
* Centralised handler for failed initial registration. Currently only used for thermostats —
|
|
191
|
-
* other device types are simply marked failed and skipped for the session.
|
|
192
|
-
*/
|
|
193
183
|
async handleRegisterFailure(device, err) {
|
|
194
184
|
const reg = this.registrations.get(device.id);
|
|
195
185
|
const msg = this.fmtErr(err);
|
|
196
186
|
if (device.type === 'thermostat' && MATTER_THERMOSTAT_FALLBACK_TO_TEMPERATURE_SENSOR) {
|
|
197
|
-
this.log.warn(`Matter Thermostat registration failed for ${device.name}; falling back to TemperatureSensor `
|
|
198
|
-
+ `due to matter.js thermostat presetTypes validation issue. Error: ${msg}`);
|
|
187
|
+
this.log.warn(`Matter Thermostat registration failed for ${device.name}; falling back to TemperatureSensor. Error: ${msg}`);
|
|
199
188
|
try {
|
|
200
189
|
await (0, matter_registration_recovery_1.registerFallbackAccessory)(device, reg, this.recoveryDeps());
|
|
201
190
|
return;
|
|
@@ -210,49 +199,31 @@ class MatterAccessoryRegistry {
|
|
|
210
199
|
reg.pendingStateUpdates = [];
|
|
211
200
|
this.log.warn(`[Matter] accessory failed: ${device.name} — ${msg}`);
|
|
212
201
|
}
|
|
213
|
-
// -----------------------------------------------------------------------
|
|
214
|
-
// State propagation
|
|
215
|
-
// -----------------------------------------------------------------------
|
|
216
|
-
async pushStateUpdate(device) {
|
|
217
|
-
const updates = this.buildUpdatesFor(device);
|
|
218
|
-
const matter = this.api.matter;
|
|
219
|
-
for (const u of updates) {
|
|
220
|
-
try {
|
|
221
|
-
await matter.updateAccessoryState(device.id, u.clusterName, u.attributes, u.partId);
|
|
222
|
-
}
|
|
223
|
-
catch (err) {
|
|
224
|
-
this.log.debug(`[Matter] update failed for ${device.name} (${u.clusterName}): ${this.fmtErr(err)}`);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
202
|
enqueueStateFor(device) {
|
|
229
203
|
const reg = this.registrations.get(device.id);
|
|
230
204
|
if (!reg)
|
|
231
205
|
return;
|
|
232
206
|
reg.matterAccessory.context.device = device;
|
|
233
|
-
|
|
234
|
-
|
|
207
|
+
const fallback = device.type === 'thermostat' && this.thermostatFallbackUUIDs.has(device.id);
|
|
208
|
+
for (const u of (0, matter_state_updates_1.buildStateUpdates)(device, fallback)) {
|
|
235
209
|
const idx = reg.pendingStateUpdates.findIndex((p) => p.clusterName === u.clusterName && p.partId === u.partId);
|
|
236
210
|
if (idx >= 0)
|
|
237
211
|
reg.pendingStateUpdates[idx] = u;
|
|
238
212
|
else
|
|
239
213
|
reg.pendingStateUpdates.push(u);
|
|
240
214
|
}
|
|
241
|
-
this.log.debug(`[Matter] update queued: ${device.name} (pending=${reg.pendingStateUpdates.length})`);
|
|
242
215
|
}
|
|
243
216
|
async refreshAccessoryMetadata(device, reg) {
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
});
|
|
217
|
+
const fallback = device.type === 'thermostat' && this.thermostatFallbackUUIDs.has(device.id);
|
|
218
|
+
const matterAccessory = fallback
|
|
219
|
+
? (0, matter_device_mapper_1.mapThermostatAsTemperatureSensor)(device, this.mapperDeps())
|
|
220
|
+
: (0, matter_device_mapper_1.deviceToMatterAccessory)(device, this.mapperDeps());
|
|
249
221
|
if (!matterAccessory)
|
|
250
222
|
return;
|
|
251
223
|
if (!this.hasMetadataChanged(reg.matterAccessory, matterAccessory))
|
|
252
224
|
return;
|
|
253
225
|
reg.matterAccessory = matterAccessory;
|
|
254
226
|
reg.displayName = matterAccessory.displayName;
|
|
255
|
-
await this.updateCachedAccessoryMetadata(reg);
|
|
256
227
|
}
|
|
257
228
|
hasMetadataChanged(previous, next) {
|
|
258
229
|
return previous.displayName !== next.displayName
|
|
@@ -261,35 +232,20 @@ class MatterAccessoryRegistry {
|
|
|
261
232
|
|| previous.serialNumber !== next.serialNumber
|
|
262
233
|
|| previous.firmwareRevision !== next.firmwareRevision;
|
|
263
234
|
}
|
|
264
|
-
async updateCachedAccessoryMetadata(reg) {
|
|
265
|
-
try {
|
|
266
|
-
await this.api.matter.updatePlatformAccessories([reg.matterAccessory]);
|
|
267
|
-
this.log.debug(`[Matter] metadata cache refreshed: ${reg.displayName}`);
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
this.log.debug(`[Matter] metadata cache refresh failed for ${reg.displayName}: ${this.fmtErr(err)}`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
buildUpdatesFor(device) {
|
|
274
|
-
const isFallback = device.type === 'thermostat' && this.thermostatFallbackUUIDs.has(device.id);
|
|
275
|
-
return (0, matter_state_updates_1.buildStateUpdates)(device, isFallback);
|
|
276
|
-
}
|
|
277
235
|
fmtErr(err) {
|
|
278
236
|
return err instanceof Error ? err.message : String(err);
|
|
279
237
|
}
|
|
280
|
-
scheduleComplete(uuid) {
|
|
281
|
-
setTimeout(() => { void this.completeRegistration(uuid); }, MATTER_REGISTER_SETTLE_MS);
|
|
282
|
-
}
|
|
283
238
|
recoveryDeps() {
|
|
284
239
|
return {
|
|
285
240
|
api: this.api,
|
|
286
241
|
log: this.log,
|
|
287
242
|
thermostatFallbackUUIDs: this.thermostatFallbackUUIDs,
|
|
288
243
|
getWsClient: this.getWsClient,
|
|
289
|
-
scheduleComplete: (uuid) => this.
|
|
244
|
+
scheduleComplete: (uuid) => { void this.completeRegistration(uuid); },
|
|
290
245
|
fmtErr: (err) => this.fmtErr(err),
|
|
291
|
-
settleMs: MATTER_REGISTER_SETTLE_MS,
|
|
292
246
|
thermostatFallbackEnabled: MATTER_THERMOSTAT_FALLBACK_TO_TEMPERATURE_SENSOR,
|
|
247
|
+
momentaryAutoOffMs: this.momentaryAutoOffMs,
|
|
248
|
+
onFallbackPersist: (uuid) => this.fallbackStore.add(uuid),
|
|
293
249
|
};
|
|
294
250
|
}
|
|
295
251
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matter-accessory-registry.js","sourceRoot":"","sources":["../../src/platform/matter-accessory-registry.ts"],"names":[],"mappings":";;;AAGA,0CAAyD;AAEzD,
|
|
1
|
+
{"version":3,"file":"matter-accessory-registry.js","sourceRoot":"","sources":["../../src/platform/matter-accessory-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@ interface MapperDeps {
|
|
|
12
12
|
api: API;
|
|
13
13
|
log: import('homebridge').Logger;
|
|
14
14
|
getWsClient: () => KseniaWebSocketClient | undefined;
|
|
15
|
+
/** Auto-off delay (ms) for momentary OnOff devices (scenarios, gates). Default 500ms. */
|
|
16
|
+
momentaryAutoOffMs?: number;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Fallback mapping: register a thermostat as a Matter TemperatureSensor.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matter-device-mapper.d.ts","sourceRoot":"","sources":["../../src/platform/matter-device-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAER,YAAY,EAKZ,gBAAgB,EAEnB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAkE,MAAM,4BAA4B,CAAC;AAGpK,OAAO,EAAE,0BAA0B,IAAI,cAAc,EAAE,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACtC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAOrF;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,UAAU,UAAU;IAChB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,OAAO,YAAY,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,qBAAqB,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"matter-device-mapper.d.ts","sourceRoot":"","sources":["../../src/platform/matter-device-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAER,YAAY,EAKZ,gBAAgB,EAEnB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAkE,MAAM,4BAA4B,CAAC;AAGpK,OAAO,EAAE,0BAA0B,IAAI,cAAc,EAAE,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACtC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAOrF;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,UAAU,UAAU;IAChB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,OAAO,YAAY,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,qBAAqB,GAAG,SAAS,CAAC;IACrD,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAwHD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,GAAG,eAAe,CAY5G;AA2GD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,eAAe,GAAG,SAAS,CAmB3G"}
|