@matter-server/custom-clusters 0.6.7 → 0.7.0-alpha.0-20260512-b404bea

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.
@@ -23,6 +23,7 @@ export declare class EveCluster {
23
23
  altitude?: number;
24
24
  pressure?: number;
25
25
  weatherTrend?: number;
26
+ windowOpenMode?: boolean;
26
27
  valvePosition?: number;
27
28
  motionSensitivity?: number;
28
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"eve.d.ts","sourceRoot":"","sources":["../../../src/clusters/eve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,qBACa,UAAU;IAEnB,SAAS,CAAC,EAAE,KAAK,CAAC;IAGlB,SAAS,CAAC,EAAE,KAAK,CAAC;IAGlB,eAAe,CAAC,EAAE,KAAK,CAAC;IAGxB,WAAW,CAAC,EAAE,KAAK,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
1
+ {"version":3,"file":"eve.d.ts","sourceRoot":"","sources":["../../../src/clusters/eve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,qBACa,UAAU;IAEnB,SAAS,CAAC,EAAE,KAAK,CAAC;IAGlB,SAAS,CAAC,EAAE,KAAK,CAAC;IAGlB,eAAe,CAAC,EAAE,KAAK,CAAC;IAGxB,WAAW,CAAC,EAAE,KAAK,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
@@ -51,9 +51,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
51
51
  * Copyright 2025-2026 Open Home Foundation
52
52
  * SPDX-License-Identifier: Apache-2.0
53
53
  */
54
- var _motionSensitivity_dec, _valvePosition_dec, _weatherTrend_dec, _pressure_dec, _altitude_dec, _rloc16_dec, _childLock_dec, _obstructionDetected_dec, _current_dec, _voltage_dec, _wattAccumulatedControlPoint_dec, _statusFault_dec, _wattAccumulated_dec, _watt_dec, _lastEventTime_dec, _timesOpened_dec, _loggingData_dec, _loggingMetadata_dec, _setConfig_dec, _getConfig_dec, _EveCluster_decorators, _init;
54
+ var _motionSensitivity_dec, _valvePosition_dec, _windowOpenMode_dec, _weatherTrend_dec, _pressure_dec, _altitude_dec, _rloc16_dec, _childLock_dec, _obstructionDetected_dec, _current_dec, _voltage_dec, _wattAccumulatedControlPoint_dec, _statusFault_dec, _wattAccumulated_dec, _watt_dec, _lastEventTime_dec, _timesOpened_dec, _loggingData_dec, _loggingMetadata_dec, _setConfig_dec, _getConfig_dec, _EveCluster_decorators, _init;
55
55
  import { attribute, bool, cluster, octstr, single, uint8, uint16, uint32, writable } from "@matter/main/model";
56
- _EveCluster_decorators = [cluster(319486977)], _getConfig_dec = [attribute(319422464, octstr)], _setConfig_dec = [attribute(319422465, octstr, writable)], _loggingMetadata_dec = [attribute(319422466, octstr)], _loggingData_dec = [attribute(319422467, octstr)], _timesOpened_dec = [attribute(319422470, uint32)], _lastEventTime_dec = [attribute(319422471, uint32)], _watt_dec = [attribute(319422474, single)], _wattAccumulated_dec = [attribute(319422475, single)], _statusFault_dec = [attribute(319422476, uint8)], _wattAccumulatedControlPoint_dec = [attribute(319422478, uint32)], _voltage_dec = [attribute(319422472, single)], _current_dec = [attribute(319422473, single)], _obstructionDetected_dec = [attribute(319422480, bool)], _childLock_dec = [attribute(319422481, bool, writable)], _rloc16_dec = [attribute(319422482, uint16)], _altitude_dec = [attribute(319422483, single)], _pressure_dec = [attribute(319422484, single)], _weatherTrend_dec = [attribute(319422485, uint32)], _valvePosition_dec = [attribute(319422488, uint32)], _motionSensitivity_dec = [attribute(319422477, uint32)];
56
+ _EveCluster_decorators = [cluster(319486977)], _getConfig_dec = [attribute(319422464, octstr)], _setConfig_dec = [attribute(319422465, octstr, writable)], _loggingMetadata_dec = [attribute(319422466, octstr)], _loggingData_dec = [attribute(319422467, octstr)], _timesOpened_dec = [attribute(319422470, uint32)], _lastEventTime_dec = [attribute(319422471, uint32)], _watt_dec = [attribute(319422474, single)], _wattAccumulated_dec = [attribute(319422475, single)], _statusFault_dec = [attribute(319422476, uint8)], _wattAccumulatedControlPoint_dec = [attribute(319422478, uint32)], _voltage_dec = [attribute(319422472, single)], _current_dec = [attribute(319422473, single)], _obstructionDetected_dec = [attribute(319422480, bool)], _childLock_dec = [attribute(319422481, bool, writable)], _rloc16_dec = [attribute(319422482, uint16)], _altitude_dec = [attribute(319422483, single)], _pressure_dec = [attribute(319422484, single)], _weatherTrend_dec = [attribute(319422485, uint32)], _windowOpenMode_dec = [attribute(319422487, bool)], _valvePosition_dec = [attribute(319422488, uint32)], _motionSensitivity_dec = [attribute(319422477, uint32)];
57
57
  class EveCluster {
58
58
  constructor() {
59
59
  __publicField(this, "getConfig", __runInitializers(_init, 8, this)), __runInitializers(_init, 11, this);
@@ -74,8 +74,9 @@ class EveCluster {
74
74
  __publicField(this, "altitude", __runInitializers(_init, 68, this)), __runInitializers(_init, 71, this);
75
75
  __publicField(this, "pressure", __runInitializers(_init, 72, this)), __runInitializers(_init, 75, this);
76
76
  __publicField(this, "weatherTrend", __runInitializers(_init, 76, this)), __runInitializers(_init, 79, this);
77
- __publicField(this, "valvePosition", __runInitializers(_init, 80, this)), __runInitializers(_init, 83, this);
78
- __publicField(this, "motionSensitivity", __runInitializers(_init, 84, this)), __runInitializers(_init, 87, this);
77
+ __publicField(this, "windowOpenMode", __runInitializers(_init, 80, this)), __runInitializers(_init, 83, this);
78
+ __publicField(this, "valvePosition", __runInitializers(_init, 84, this)), __runInitializers(_init, 87, this);
79
+ __publicField(this, "motionSensitivity", __runInitializers(_init, 88, this)), __runInitializers(_init, 91, this);
79
80
  }
80
81
  }
81
82
  _init = __decoratorStart(null);
@@ -97,6 +98,7 @@ __decorateElement(_init, 5, "rloc16", _rloc16_dec, EveCluster);
97
98
  __decorateElement(_init, 5, "altitude", _altitude_dec, EveCluster);
98
99
  __decorateElement(_init, 5, "pressure", _pressure_dec, EveCluster);
99
100
  __decorateElement(_init, 5, "weatherTrend", _weatherTrend_dec, EveCluster);
101
+ __decorateElement(_init, 5, "windowOpenMode", _windowOpenMode_dec, EveCluster);
100
102
  __decorateElement(_init, 5, "valvePosition", _valvePosition_dec, EveCluster);
101
103
  __decorateElement(_init, 5, "motionSensitivity", _motionSensitivity_dec, EveCluster);
102
104
  EveCluster = __decorateElement(_init, 0, "EveCluster", _EveCluster_decorators, EveCluster);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/clusters/eve.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,WAAW,MAAM,SAAS,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,gBAAgB;AAE1F,0BAAC,QAAQ,SAAU,IAEf,kBAAC,UAAU,WAAY,MAAM,IAG7B,kBAAC,UAAU,WAAY,QAAQ,QAAQ,IAGvC,wBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,MAAM,IAG7B,sBAAC,UAAU,WAAY,MAAM,IAG7B,aAAC,UAAU,WAAY,MAAM,IAG7B,wBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,KAAK,IAG5B,oCAAC,UAAU,WAAY,MAAM,IAE7B,gBAAC,UAAU,WAAY,MAAM,IAG7B,gBAAC,UAAU,WAAY,MAAM,IAG7B,4BAAC,UAAU,WAAY,IAAI,IAG3B,kBAAC,UAAU,WAAY,MAAM,QAAQ,IAGrC,eAAC,UAAU,WAAY,MAAM,IAG7B,iBAAC,UAAU,WAAY,MAAM,IAG7B,iBAAC,UAAU,WAAY,MAAM,IAG7B,qBAAC,UAAU,WAAY,MAAM,IAG7B,sBAAC,UAAU,WAAY,MAAM,IAG7B,0BAAC,UAAU,WAAY,MAAM;AAzD1B,MAAM,WAAW;AAAA,EAAjB;AAEH;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAEA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAAA;AACJ;AA3DO;AAEH,yCADA,gBADS;AAKT,yCADA,gBAJS;AAQT,+CADA,sBAPS;AAWT,2CADA,kBAVS;AAcT,2CADA,kBAbS;AAiBT,6CADA,oBAhBS;AAoBT,oCADA,WAnBS;AAuBT,+CADA,sBAtBS;AA0BT,2CADA,kBAzBS;AA6BT,2DADA,kCA5BS;AA+BT,uCADA,cA9BS;AAkCT,uCADA,cAjCS;AAqCT,mDADA,0BApCS;AAwCT,yCADA,gBAvCS;AA2CT,sCADA,aA1CS;AA8CT,wCADA,eA7CS;AAiDT,wCADA,eAhDS;AAoDT,4CADA,mBAnDS;AAuDT,6CADA,oBAtDS;AA0DT,iDADA,wBAzDS;AAAA,aAAN,0CADP,wBACa;AAAN,4BAAM;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,WAAW,MAAM,SAAS,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,gBAAgB;AAE1F,0BAAC,QAAQ,SAAU,IAEf,kBAAC,UAAU,WAAY,MAAM,IAG7B,kBAAC,UAAU,WAAY,QAAQ,QAAQ,IAGvC,wBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,MAAM,IAG7B,sBAAC,UAAU,WAAY,MAAM,IAG7B,aAAC,UAAU,WAAY,MAAM,IAG7B,wBAAC,UAAU,WAAY,MAAM,IAG7B,oBAAC,UAAU,WAAY,KAAK,IAG5B,oCAAC,UAAU,WAAY,MAAM,IAE7B,gBAAC,UAAU,WAAY,MAAM,IAG7B,gBAAC,UAAU,WAAY,MAAM,IAG7B,4BAAC,UAAU,WAAY,IAAI,IAG3B,kBAAC,UAAU,WAAY,MAAM,QAAQ,IAGrC,eAAC,UAAU,WAAY,MAAM,IAG7B,iBAAC,UAAU,WAAY,MAAM,IAG7B,iBAAC,UAAU,WAAY,MAAM,IAG7B,qBAAC,UAAU,WAAY,MAAM,IAG7B,uBAAC,UAAU,WAAY,IAAI,IAG3B,sBAAC,UAAU,WAAY,MAAM,IAG7B,0BAAC,UAAU,WAAY,MAAM;AA5D1B,MAAM,WAAW;AAAA,EAAjB;AAEH;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAEA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAAA;AACJ;AA9DO;AAEH,yCADA,gBADS;AAKT,yCADA,gBAJS;AAQT,+CADA,sBAPS;AAWT,2CADA,kBAVS;AAcT,2CADA,kBAbS;AAiBT,6CADA,oBAhBS;AAoBT,oCADA,WAnBS;AAuBT,+CADA,sBAtBS;AA0BT,2CADA,kBAzBS;AA6BT,2DADA,kCA5BS;AA+BT,uCADA,cA9BS;AAkCT,uCADA,cAjCS;AAqCT,mDADA,0BApCS;AAwCT,yCADA,gBAvCS;AA2CT,sCADA,aA1CS;AA8CT,wCADA,eA7CS;AAiDT,wCADA,eAhDS;AAoDT,4CADA,mBAnDS;AAuDT,8CADA,qBAtDS;AA0DT,6CADA,oBAzDS;AA6DT,iDADA,wBA5DS;AAAA,aAAN,0CADP,wBACa;AAAN,4BAAM;",
5
5
  "names": []
6
6
  }
@@ -8,5 +8,6 @@ export * from "./eve.js";
8
8
  export * from "./heiman.js";
9
9
  export * from "./inovelli.js";
10
10
  export * from "./neo.js";
11
+ export * from "./tcl.js";
11
12
  export * from "./thirdreality.js";
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clusters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mCAAmC,CAAC;AAClD,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clusters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mCAAmC,CAAC;AAClD,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
@@ -8,5 +8,6 @@ export * from "./eve.js";
8
8
  export * from "./heiman.js";
9
9
  export * from "./inovelli.js";
10
10
  export * from "./neo.js";
11
+ export * from "./tcl.js";
11
12
  export * from "./thirdreality.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/clusters/index.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
5
5
  "names": []
6
6
  }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Operating modes for {@link TclDehumidifierCluster.mode}. Integer values
8
+ * 0..4 are observed on H50D44W firmware 1.0; the symbolic names follow the
9
+ * order shown in the TCL Home mobile app.
10
+ *
11
+ * Declared as a `const enum` so the wire encoding stays a plain 8-bit value
12
+ * and the symbolic mapping is captured alongside the cluster.
13
+ */
14
+ declare const enum TclMode {
15
+ Set = 0,
16
+ Continue = 1,
17
+ Comfort = 2,
18
+ Smart = 3,
19
+ Dry = 4
20
+ }
21
+ /**
22
+ * TCL primary control/state cluster — Vendor ID 0x1334 (TCL).
23
+ *
24
+ * Found on TCL Matter dehumidifiers (e.g. H50D44W, H50D66KW). The CSA-registered
25
+ * device type is Fan (0x002B), so the dehumidifier-specific controls are
26
+ * exposed through this vendor cluster.
27
+ *
28
+ * Attribute IDs are local (0x00–0x06); the cluster decorator carries the vendor
29
+ * prefix. Datatypes verified empirically against an H50D44W on firmware 1.0.
30
+ */
31
+ export declare class TclDehumidifierCluster {
32
+ /** Operating mode — see {@link TclMode} for the value mapping. */
33
+ mode?: TclMode;
34
+ /** Target humidity setpoint in percent (typically 35..85). */
35
+ targetHumidity?: number;
36
+ /** Currently measured ambient humidity in percent. */
37
+ currentHumidity?: number;
38
+ /** True when the water bucket needs to be emptied. */
39
+ waterBucketFull?: boolean;
40
+ /** Filter-replacement / child-lock alert (semantics device-specific). */
41
+ filterAlert?: boolean;
42
+ /**
43
+ * Active error codes. The device emits a literal JSON-encoded string here
44
+ * (e.g. `"[]"` or `"[5]"`), not a Matter list TLV — confirmed by reads on
45
+ * H50D44W firmware 1.0. Treating the attribute as a string preserves what
46
+ * the device actually puts on the wire; consumers JSON-parse it if they
47
+ * want a numeric list.
48
+ *
49
+ * Empirically verified code semantics on H50D44W firmware 1.0:
50
+ *
51
+ * - `5` — water bucket full. Verified 2026-05-11 by cycling the bucket
52
+ * and watching this attribute toggle `"[]"` ↔ `"[5]"`. The dedicated
53
+ * {@link waterBucketFull} bool (attr 3) does **not** flip on this
54
+ * device, so code 5 is the only reliable bucket-full signal.
55
+ *
56
+ * Other codes will likely surface over time (filter alert, defrost,
57
+ * sensor fault, …); document them here as they're identified.
58
+ */
59
+ errorCodes?: string;
60
+ /**
61
+ * Device feature set. Same wire format as {@link errorCodes} — a JSON-
62
+ * encoded string, e.g. `"[3]"` (verified on H50D44W). Static across the
63
+ * device's lifetime in observed captures.
64
+ */
65
+ featureSet?: string;
66
+ }
67
+ export {};
68
+ //# sourceMappingURL=tcl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcl.d.ts","sourceRoot":"","sources":["../../../src/clusters/tcl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;GAOG;AACH,mBAAW,OAAO;IACd,GAAG,IAAI;IACP,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,KAAK,IAAI;IACT,GAAG,IAAI;CACV;AAED;;;;;;;;;GASG;AACH,qBACa,sBAAsB;IAC/B,kEAAkE;IAElE,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,8DAA8D;IAE9D,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,sDAAsD;IAEtD,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,sDAAsD;IAEtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,yEAAyE;IAEzE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;;;;;;;;;;;OAgBG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,89 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
11
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
12
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
13
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
14
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
15
+ var __runInitializers = (array, flags, self, value) => {
16
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
17
+ return value;
18
+ };
19
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
20
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
21
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
22
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
23
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
24
+ return __privateGet(this, extra);
25
+ }, set [name](x) {
26
+ return __privateSet(this, extra, x);
27
+ } }, name));
28
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
29
+ for (var i = decorators.length - 1; i >= 0; i--) {
30
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
31
+ if (k) {
32
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
33
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
34
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
35
+ }
36
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
37
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
38
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
39
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
40
+ }
41
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
42
+ };
43
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
44
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
45
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
46
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
47
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
48
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
49
+ /**
50
+ * @license
51
+ * Copyright 2025-2026 Open Home Foundation
52
+ * SPDX-License-Identifier: Apache-2.0
53
+ */
54
+ var _featureSet_dec, _errorCodes_dec, _filterAlert_dec, _waterBucketFull_dec, _currentHumidity_dec, _targetHumidity_dec, _mode_dec, _TclDehumidifierCluster_decorators, _init;
55
+ import { attribute, bool, cluster, enum8, string, uint8, writable } from "@matter/main/model";
56
+ var TclMode = /* @__PURE__ */ ((TclMode2) => {
57
+ TclMode2[TclMode2["Set"] = 0] = "Set";
58
+ TclMode2[TclMode2["Continue"] = 1] = "Continue";
59
+ TclMode2[TclMode2["Comfort"] = 2] = "Comfort";
60
+ TclMode2[TclMode2["Smart"] = 3] = "Smart";
61
+ TclMode2[TclMode2["Dry"] = 4] = "Dry";
62
+ return TclMode2;
63
+ })(TclMode || {});
64
+ _TclDehumidifierCluster_decorators = [cluster(322239491)], _mode_dec = [attribute(0, enum8, writable)], _targetHumidity_dec = [attribute(1, uint8, writable)], _currentHumidity_dec = [attribute(2, uint8)], _waterBucketFull_dec = [attribute(3, bool)], _filterAlert_dec = [attribute(4, bool)], _errorCodes_dec = [attribute(5, string)], _featureSet_dec = [attribute(6, string)];
65
+ class TclDehumidifierCluster {
66
+ constructor() {
67
+ __publicField(this, "mode", __runInitializers(_init, 8, this)), __runInitializers(_init, 11, this);
68
+ __publicField(this, "targetHumidity", __runInitializers(_init, 12, this)), __runInitializers(_init, 15, this);
69
+ __publicField(this, "currentHumidity", __runInitializers(_init, 16, this)), __runInitializers(_init, 19, this);
70
+ __publicField(this, "waterBucketFull", __runInitializers(_init, 20, this)), __runInitializers(_init, 23, this);
71
+ __publicField(this, "filterAlert", __runInitializers(_init, 24, this)), __runInitializers(_init, 27, this);
72
+ __publicField(this, "errorCodes", __runInitializers(_init, 28, this)), __runInitializers(_init, 31, this);
73
+ __publicField(this, "featureSet", __runInitializers(_init, 32, this)), __runInitializers(_init, 35, this);
74
+ }
75
+ }
76
+ _init = __decoratorStart(null);
77
+ __decorateElement(_init, 5, "mode", _mode_dec, TclDehumidifierCluster);
78
+ __decorateElement(_init, 5, "targetHumidity", _targetHumidity_dec, TclDehumidifierCluster);
79
+ __decorateElement(_init, 5, "currentHumidity", _currentHumidity_dec, TclDehumidifierCluster);
80
+ __decorateElement(_init, 5, "waterBucketFull", _waterBucketFull_dec, TclDehumidifierCluster);
81
+ __decorateElement(_init, 5, "filterAlert", _filterAlert_dec, TclDehumidifierCluster);
82
+ __decorateElement(_init, 5, "errorCodes", _errorCodes_dec, TclDehumidifierCluster);
83
+ __decorateElement(_init, 5, "featureSet", _featureSet_dec, TclDehumidifierCluster);
84
+ TclDehumidifierCluster = __decorateElement(_init, 0, "TclDehumidifierCluster", _TclDehumidifierCluster_decorators, TclDehumidifierCluster);
85
+ __runInitializers(_init, 1, TclDehumidifierCluster);
86
+ export {
87
+ TclDehumidifierCluster
88
+ };
89
+ //# sourceMappingURL=tcl.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/clusters/tcl.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,WAAW,MAAM,SAAS,OAAO,QAAQ,OAAO,gBAAgB;AAUzE,IAAW,UAAX,kBAAWA,aAAX;AACI,EAAAA,kBAAA,SAAM,KAAN;AACA,EAAAA,kBAAA,cAAW,KAAX;AACA,EAAAA,kBAAA,aAAU,KAAV;AACA,EAAAA,kBAAA,WAAQ,KAAR;AACA,EAAAA,kBAAA,SAAM,KAAN;AALO,SAAAA;AAAA,GAAA;AAkBX,sCAAC,QAAQ,SAAU,IAGf,aAAC,UAAU,GAAQ,OAAO,QAAQ,IAIlC,uBAAC,UAAU,GAAQ,OAAO,QAAQ,IAIlC,wBAAC,UAAU,GAAQ,KAAK,IAIxB,wBAAC,UAAU,GAAQ,IAAI,IAIvB,oBAAC,UAAU,GAAQ,IAAI,IAoBvB,mBAAC,UAAU,GAAQ,MAAM,IAQzB,mBAAC,UAAU,GAAQ,MAAM;AA9CtB,MAAM,uBAAuB;AAAA,EAA7B;AAGH;AAIA;AAIA;AAIA;AAIA;AAoBA;AAQA;AAAA;AACJ;AAhDO;AAGH,oCADA,WAFS;AAOT,8CADA,qBANS;AAWT,+CADA,sBAVS;AAeT,+CADA,sBAdS;AAmBT,2CADA,kBAlBS;AAuCT,0CADA,iBAtCS;AA+CT,0CADA,iBA9CS;AAAA,yBAAN,sDADP,oCACa;AAAN,4BAAM;",
5
+ "names": ["TclMode"]
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter-server/custom-clusters",
3
- "version": "0.6.7",
3
+ "version": "0.7.0-alpha.0-20260512-b404bea",
4
4
  "type": "module",
5
5
  "description": "Custom cluster definitions for matter.js based projects",
6
6
  "bugs": {
@@ -15,9 +15,6 @@
15
15
  "main": "dist/esm/register.js",
16
16
  "exports": {
17
17
  ".": {
18
- "dev-types": {
19
- "types": "./src/register.ts"
20
- },
21
18
  "import": {
22
19
  "types": "./dist/esm/register.d.ts",
23
20
  "default": "./dist/esm/register.js"
@@ -33,7 +30,7 @@
33
30
  "node": ">=20.19.0 <22.0.0 || >=22.13.0"
34
31
  },
35
32
  "dependencies": {
36
- "@matter/main": "0.17.0-alpha.0-20260504-e005cc190"
33
+ "@matter/main": "0.17.0-alpha.0-20260512-576f5796c"
37
34
  },
38
35
  "files": [
39
36
  "dist/**/*",
@@ -62,6 +62,9 @@ export class EveCluster {
62
62
  @attribute(0x130a0015, uint32)
63
63
  weatherTrend?: number;
64
64
 
65
+ @attribute(0x130a0017, bool)
66
+ windowOpenMode?: boolean;
67
+
65
68
  @attribute(0x130a0018, uint32)
66
69
  valvePosition?: number;
67
70
 
@@ -9,4 +9,5 @@ export * from "./eve.js";
9
9
  export * from "./heiman.js";
10
10
  export * from "./inovelli.js";
11
11
  export * from "./neo.js";
12
+ export * from "./tcl.js";
12
13
  export * from "./thirdreality.js";
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { attribute, bool, cluster, enum8, string, uint8, writable } from "@matter/main/model";
8
+
9
+ /**
10
+ * Operating modes for {@link TclDehumidifierCluster.mode}. Integer values
11
+ * 0..4 are observed on H50D44W firmware 1.0; the symbolic names follow the
12
+ * order shown in the TCL Home mobile app.
13
+ *
14
+ * Declared as a `const enum` so the wire encoding stays a plain 8-bit value
15
+ * and the symbolic mapping is captured alongside the cluster.
16
+ */
17
+ const enum TclMode {
18
+ Set = 0,
19
+ Continue = 1,
20
+ Comfort = 2,
21
+ Smart = 3,
22
+ Dry = 4,
23
+ }
24
+
25
+ /**
26
+ * TCL primary control/state cluster — Vendor ID 0x1334 (TCL).
27
+ *
28
+ * Found on TCL Matter dehumidifiers (e.g. H50D44W, H50D66KW). The CSA-registered
29
+ * device type is Fan (0x002B), so the dehumidifier-specific controls are
30
+ * exposed through this vendor cluster.
31
+ *
32
+ * Attribute IDs are local (0x00–0x06); the cluster decorator carries the vendor
33
+ * prefix. Datatypes verified empirically against an H50D44W on firmware 1.0.
34
+ */
35
+ @cluster(0x1334fc03)
36
+ export class TclDehumidifierCluster {
37
+ /** Operating mode — see {@link TclMode} for the value mapping. */
38
+ @attribute(0x0000, enum8, writable)
39
+ mode?: TclMode;
40
+
41
+ /** Target humidity setpoint in percent (typically 35..85). */
42
+ @attribute(0x0001, uint8, writable)
43
+ targetHumidity?: number;
44
+
45
+ /** Currently measured ambient humidity in percent. */
46
+ @attribute(0x0002, uint8)
47
+ currentHumidity?: number;
48
+
49
+ /** True when the water bucket needs to be emptied. */
50
+ @attribute(0x0003, bool)
51
+ waterBucketFull?: boolean;
52
+
53
+ /** Filter-replacement / child-lock alert (semantics device-specific). */
54
+ @attribute(0x0004, bool)
55
+ filterAlert?: boolean;
56
+
57
+ /**
58
+ * Active error codes. The device emits a literal JSON-encoded string here
59
+ * (e.g. `"[]"` or `"[5]"`), not a Matter list TLV — confirmed by reads on
60
+ * H50D44W firmware 1.0. Treating the attribute as a string preserves what
61
+ * the device actually puts on the wire; consumers JSON-parse it if they
62
+ * want a numeric list.
63
+ *
64
+ * Empirically verified code semantics on H50D44W firmware 1.0:
65
+ *
66
+ * - `5` — water bucket full. Verified 2026-05-11 by cycling the bucket
67
+ * and watching this attribute toggle `"[]"` ↔ `"[5]"`. The dedicated
68
+ * {@link waterBucketFull} bool (attr 3) does **not** flip on this
69
+ * device, so code 5 is the only reliable bucket-full signal.
70
+ *
71
+ * Other codes will likely surface over time (filter alert, defrost,
72
+ * sensor fault, …); document them here as they're identified.
73
+ */
74
+ @attribute(0x0005, string)
75
+ errorCodes?: string;
76
+
77
+ /**
78
+ * Device feature set. Same wire format as {@link errorCodes} — a JSON-
79
+ * encoded string, e.g. `"[3]"` (verified on H50D44W). Static across the
80
+ * device's lifetime in observed captures.
81
+ */
82
+ @attribute(0x0006, string)
83
+ featureSet?: string;
84
+ }