@matter-server/dashboard 0.2.2 → 0.2.4-alpha.0-20260116-d0b21f3

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.
Files changed (42) hide show
  1. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +25 -0
  2. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -0
  3. package/dist/esm/pages/cluster-commands/base-cluster-commands.js +129 -0
  4. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +6 -0
  5. package/dist/esm/pages/cluster-commands/clusters/level-control-commands.d.ts +29 -0
  6. package/dist/esm/pages/cluster-commands/clusters/level-control-commands.d.ts.map +1 -0
  7. package/dist/esm/pages/cluster-commands/clusters/level-control-commands.js +125 -0
  8. package/dist/esm/pages/cluster-commands/clusters/level-control-commands.js.map +6 -0
  9. package/dist/esm/pages/cluster-commands/clusters/on-off-commands.d.ts +25 -0
  10. package/dist/esm/pages/cluster-commands/clusters/on-off-commands.d.ts.map +1 -0
  11. package/dist/esm/pages/cluster-commands/clusters/on-off-commands.js +52 -0
  12. package/dist/esm/pages/cluster-commands/clusters/on-off-commands.js.map +6 -0
  13. package/dist/esm/pages/cluster-commands/index.d.ts +14 -0
  14. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -0
  15. package/dist/esm/pages/cluster-commands/index.js +16 -0
  16. package/dist/esm/pages/cluster-commands/index.js.map +6 -0
  17. package/dist/esm/pages/cluster-commands/registry.d.ts +24 -0
  18. package/dist/esm/pages/cluster-commands/registry.d.ts.map +1 -0
  19. package/dist/esm/pages/cluster-commands/registry.js +21 -0
  20. package/dist/esm/pages/cluster-commands/registry.js.map +6 -0
  21. package/dist/esm/pages/matter-cluster-view.d.ts +2 -0
  22. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  23. package/dist/esm/pages/matter-cluster-view.js +32 -1
  24. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  25. package/dist/web/js/{commission-node-dialog-BJsfA4IV.js → commission-node-dialog-B6EYNztD.js} +5 -5
  26. package/dist/web/js/{commission-node-existing-CzRtUgBm.js → commission-node-existing-CKKStTjd.js} +4 -4
  27. package/dist/web/js/{commission-node-thread-FcLFz84I.js → commission-node-thread-D_Hgo4-b.js} +4 -4
  28. package/dist/web/js/{commission-node-wifi-C8iGfy7c.js → commission-node-wifi-DQrWnfn9.js} +4 -4
  29. package/dist/web/js/{dialog-box-DN32sjfR.js → dialog-box-9i64nfcC.js} +2 -2
  30. package/dist/web/js/{fire_event-BlsbXpOL.js → fire_event-CGgNDbLy.js} +1 -1
  31. package/dist/web/js/main.js +1 -1
  32. package/dist/web/js/{matter-dashboard-app-5UjO1Ik8.js → matter-dashboard-app-DD29PeTW.js} +415 -80
  33. package/dist/web/js/{node-binding-dialog-2yitVn0R.js → node-binding-dialog-DnO2DL_u.js} +3 -3
  34. package/dist/web/js/{outlined-text-field-BMLYwwlc.js → outlined-text-field-tv3ZtxuK.js} +2 -2
  35. package/dist/web/js/{prevent_default-BsT53c0u.js → prevent_default-C72e35wq.js} +1 -1
  36. package/package.json +3 -3
  37. package/src/pages/cluster-commands/base-cluster-commands.ts +122 -0
  38. package/src/pages/cluster-commands/clusters/level-control-commands.ts +130 -0
  39. package/src/pages/cluster-commands/clusters/on-off-commands.ts +57 -0
  40. package/src/pages/cluster-commands/index.ts +20 -0
  41. package/src/pages/cluster-commands/registry.ts +40 -0
  42. package/src/pages/matter-cluster-view.ts +41 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MatterClient, MatterNode } from "@matter-server/ws-client";
7
+ import { LitElement } from "lit";
8
+ /**
9
+ * Base class for cluster-specific command panels.
10
+ * Provides shared properties, styling, and helper methods for sending commands.
11
+ */
12
+ export declare abstract class BaseClusterCommands extends LitElement {
13
+ client: MatterClient;
14
+ node: MatterNode;
15
+ endpoint: number;
16
+ cluster: number;
17
+ /**
18
+ * Send a command to the device.
19
+ * @param command - The command name (PascalCase, e.g., "On", "Off", "MoveToLevel")
20
+ * @param payload - Optional command payload
21
+ */
22
+ protected sendCommand(command: string, payload?: Record<string, unknown>): Promise<void>;
23
+ static styles: import("lit").CSSResult;
24
+ }
25
+ //# sourceMappingURL=base-cluster-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-cluster-commands.d.ts","sourceRoot":"","sources":["../../../../src/pages/cluster-commands/base-cluster-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAO,MAAM,KAAK,CAAC;AAGtC;;;GAGG;AACH,8BAAsB,mBAAoB,SAAQ,UAAU;IAEjD,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,EAAG,UAAU,CAAC;IAGlB,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,EAAG,MAAM,CAAC;IAExB;;;;OAIG;cACa,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9F,OAAgB,MAAM,0BA+EpB;CACL"}
@@ -0,0 +1,129 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ /**
12
+ * @license
13
+ * Copyright 2025-2026 Open Home Foundation
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+ import { LitElement, css } from "lit";
17
+ import { property } from "lit/decorators.js";
18
+ class BaseClusterCommands extends LitElement {
19
+ /**
20
+ * Send a command to the device.
21
+ * @param command - The command name (PascalCase, e.g., "On", "Off", "MoveToLevel")
22
+ * @param payload - Optional command payload
23
+ */
24
+ async sendCommand(command, payload) {
25
+ try {
26
+ await this.client.deviceCommand(this.node.node_id, this.endpoint, this.cluster, command, payload ?? {});
27
+ } catch (error) {
28
+ console.error(`Failed to send command ${command}:`, error);
29
+ }
30
+ }
31
+ static {
32
+ this.styles = css`
33
+ :host {
34
+ display: block;
35
+ }
36
+
37
+ details.command-panel {
38
+ background-color: var(--md-sys-color-surface-container);
39
+ border-radius: 12px;
40
+ overflow: hidden;
41
+ }
42
+
43
+ details.command-panel summary {
44
+ padding: 16px;
45
+ font-weight: 500;
46
+ color: var(--md-sys-color-on-surface);
47
+ cursor: pointer;
48
+ user-select: none;
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 8px;
52
+ }
53
+
54
+ details.command-panel summary:hover {
55
+ background-color: var(--md-sys-color-surface-container-high);
56
+ }
57
+
58
+ details.command-panel summary::before {
59
+ content: "▶";
60
+ font-size: 12px;
61
+ transition: transform 0.2s ease;
62
+ }
63
+
64
+ details.command-panel[open] summary::before {
65
+ transform: rotate(90deg);
66
+ }
67
+
68
+ details.command-panel summary::-webkit-details-marker {
69
+ display: none;
70
+ }
71
+
72
+ .command-content {
73
+ padding: 0 16px 16px 16px;
74
+ }
75
+
76
+ .command-row {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 12px;
80
+ flex-wrap: wrap;
81
+ }
82
+
83
+ .command-row label {
84
+ font-size: 14px;
85
+ color: var(--md-sys-color-on-surface-variant);
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 4px;
89
+ }
90
+
91
+ .command-row input[type="number"] {
92
+ width: 70px;
93
+ padding: 8px;
94
+ border: 1px solid var(--md-sys-color-outline);
95
+ border-radius: 4px;
96
+ background: var(--md-sys-color-surface);
97
+ color: var(--md-sys-color-on-surface);
98
+ }
99
+
100
+ .command-row input[type="checkbox"] {
101
+ width: 16px;
102
+ height: 16px;
103
+ margin: 0;
104
+ }
105
+
106
+ md-filled-button,
107
+ md-outlined-button {
108
+ --md-filled-button-container-height: 36px;
109
+ --md-outlined-button-container-height: 36px;
110
+ }
111
+ `;
112
+ }
113
+ }
114
+ __decorateClass([
115
+ property({ attribute: false })
116
+ ], BaseClusterCommands.prototype, "client", 2);
117
+ __decorateClass([
118
+ property({ attribute: false })
119
+ ], BaseClusterCommands.prototype, "node", 2);
120
+ __decorateClass([
121
+ property({ type: Number })
122
+ ], BaseClusterCommands.prototype, "endpoint", 2);
123
+ __decorateClass([
124
+ property({ type: Number })
125
+ ], BaseClusterCommands.prototype, "cluster", 2);
126
+ export {
127
+ BaseClusterCommands
128
+ };
129
+ //# sourceMappingURL=base-cluster-commands.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/cluster-commands/base-cluster-commands.ts"],
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,YAAY,WAAW;AAChC,SAAS,gBAAgB;AAMlB,MAAe,4BAA4B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBzD,MAAgB,YAAY,SAAiB,SAAkD;AAC3F,QAAI;AACA,YAAM,KAAK,OAAO,cAAc,KAAK,KAAK,SAAS,KAAK,UAAU,KAAK,SAAS,SAAS,WAAW,CAAC,CAAC;AAAA,IAC1G,SAAS,OAAO;AACZ,cAAQ,MAAM,0BAA0B,OAAO,KAAK,KAAK;AAAA,IAE7D;AAAA,EACJ;AAAA,EAEA;AAAA,SAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgF7B;AAzGW;AAAA,EADN,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GADZ,oBAEX;AAGA;AAAA,EADN,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAJZ,oBAKX;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAPR,oBAQX;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVR,oBAWX;",
5
+ "names": []
6
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import "@material/web/button/filled-button";
7
+ import { BaseClusterCommands } from "../base-cluster-commands.js";
8
+ /**
9
+ * Command panel for LevelControl cluster (ID: 8).
10
+ * Provides MoveToLevel command with configurable parameters.
11
+ */
12
+ declare class LevelControlClusterCommands extends BaseClusterCommands {
13
+ private _targetLevel;
14
+ private _transitionTime;
15
+ private _executeIfOff;
16
+ render(): import("lit-html").TemplateResult<1>;
17
+ private _handleTargetLevelChange;
18
+ private _handleTransitionTimeChange;
19
+ private _handleExecuteIfOffChange;
20
+ private _handleMoveToLevel;
21
+ private _handleMoveToLevelWithOnOff;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ "level-control-cluster-commands": LevelControlClusterCommands;
26
+ }
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=level-control-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-control-commands.d.ts","sourceRoot":"","sources":["../../../../../src/pages/cluster-commands/clusters/level-control-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAKlE;;;GAGG;AACH,cACM,2BAA4B,SAAQ,mBAAmB;IAEzD,OAAO,CAAC,YAAY,CAAO;IAG3B,OAAO,CAAC,eAAe,CAAK;IAG5B,OAAO,CAAC,aAAa,CAAS;IAErB,MAAM;IA2Cf,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,yBAAyB;YAKnB,kBAAkB;YAalB,2BAA2B;CAY5C;AAKD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,gCAAgC,EAAE,2BAA2B,CAAC;KACjE;CACJ"}
@@ -0,0 +1,125 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ /**
12
+ * @license
13
+ * Copyright 2025-2026 Open Home Foundation
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+ import "@material/web/button/filled-button";
17
+ import { html } from "lit";
18
+ import { customElement, state } from "lit/decorators.js";
19
+ import { BaseClusterCommands } from "../base-cluster-commands.js";
20
+ import { registerClusterCommands } from "../registry.js";
21
+ const CLUSTER_ID = 8;
22
+ let LevelControlClusterCommands = class extends BaseClusterCommands {
23
+ constructor() {
24
+ super(...arguments);
25
+ this._targetLevel = 128;
26
+ this._transitionTime = 0;
27
+ this._executeIfOff = false;
28
+ }
29
+ render() {
30
+ return html`
31
+ <details class="command-panel">
32
+ <summary>Level Control Commands</summary>
33
+ <div class="command-content">
34
+ <div class="command-row">
35
+ <label for="targetLevel">Level:</label>
36
+ <input
37
+ id="targetLevel"
38
+ type="number"
39
+ min="1"
40
+ max="254"
41
+ .value=${String(this._targetLevel)}
42
+ @input=${this._handleTargetLevelChange}
43
+ />
44
+ <label for="transitionTime">Transition (0.1s):</label>
45
+ <input
46
+ id="transitionTime"
47
+ type="number"
48
+ min="0"
49
+ max="65535"
50
+ .value=${String(this._transitionTime)}
51
+ @input=${this._handleTransitionTimeChange}
52
+ />
53
+ <label for="executeIfOff">
54
+ <input
55
+ id="executeIfOff"
56
+ type="checkbox"
57
+ .checked=${this._executeIfOff}
58
+ @change=${this._handleExecuteIfOffChange}
59
+ />
60
+ Execute if Off
61
+ </label>
62
+ <md-outlined-button @click=${this._handleMoveToLevel}>MoveToLevel</md-outlined-button>
63
+ <md-outlined-button @click=${this._handleMoveToLevelWithOnOff}
64
+ >MoveToLevelWithOnOff</md-outlined-button
65
+ >
66
+ </div>
67
+ </div>
68
+ </details>
69
+ `;
70
+ }
71
+ _handleTargetLevelChange(e) {
72
+ const input = e.target;
73
+ let value = parseInt(input.value, 10);
74
+ if (isNaN(value)) value = 1;
75
+ if (value < 1) value = 1;
76
+ if (value > 254) value = 254;
77
+ this._targetLevel = value;
78
+ }
79
+ _handleTransitionTimeChange(e) {
80
+ const input = e.target;
81
+ let value = parseInt(input.value, 10);
82
+ if (isNaN(value)) value = 0;
83
+ if (value < 0) value = 0;
84
+ if (value > 65535) value = 65535;
85
+ this._transitionTime = value;
86
+ }
87
+ _handleExecuteIfOffChange(e) {
88
+ const input = e.target;
89
+ this._executeIfOff = input.checked;
90
+ }
91
+ async _handleMoveToLevel() {
92
+ const optionsMask = this._executeIfOff ? { executeIfOff: true } : {};
93
+ const optionsOverride = this._executeIfOff ? { executeIfOff: true } : {};
94
+ await this.sendCommand("MoveToLevel", {
95
+ level: this._targetLevel,
96
+ transitionTime: this._transitionTime,
97
+ optionsMask,
98
+ optionsOverride
99
+ });
100
+ }
101
+ async _handleMoveToLevelWithOnOff() {
102
+ const optionsMask = this._executeIfOff ? { executeIfOff: true } : {};
103
+ const optionsOverride = this._executeIfOff ? { executeIfOff: true } : {};
104
+ await this.sendCommand("MoveToLevelWithOnOff", {
105
+ level: this._targetLevel,
106
+ transitionTime: this._transitionTime,
107
+ optionsMask,
108
+ optionsOverride
109
+ });
110
+ }
111
+ };
112
+ __decorateClass([
113
+ state()
114
+ ], LevelControlClusterCommands.prototype, "_targetLevel", 2);
115
+ __decorateClass([
116
+ state()
117
+ ], LevelControlClusterCommands.prototype, "_transitionTime", 2);
118
+ __decorateClass([
119
+ state()
120
+ ], LevelControlClusterCommands.prototype, "_executeIfOff", 2);
121
+ LevelControlClusterCommands = __decorateClass([
122
+ customElement("level-control-cluster-commands")
123
+ ], LevelControlClusterCommands);
124
+ registerClusterCommands(CLUSTER_ID, "level-control-cluster-commands");
125
+ //# sourceMappingURL=level-control-commands.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/pages/cluster-commands/clusters/level-control-commands.ts"],
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,SAAS,YAAY;AACrB,SAAS,eAAe,aAAa;AACrC,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AAExC,MAAM,aAAa;AAOnB,IAAM,8BAAN,cAA0C,oBAAoB;AAAA,EAA9D;AAAA;AAEI,SAAQ,eAAe;AAGvB,SAAQ,kBAAkB;AAG1B,SAAQ,gBAAgB;AAAA;AAAA,EAEf,SAAS;AACd,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAWsB,OAAO,KAAK,YAAY,CAAC;AAAA,qCACzB,KAAK,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAQ7B,OAAO,KAAK,eAAe,CAAC;AAAA,qCAC5B,KAAK,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAM1B,KAAK,aAAa;AAAA,0CACnB,KAAK,yBAAyB;AAAA;AAAA;AAAA;AAAA,qDAInB,KAAK,kBAAkB;AAAA,qDACvB,KAAK,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjF;AAAA,EAEQ,yBAAyB,GAAU;AACvC,UAAM,QAAQ,EAAE;AAChB,QAAI,QAAQ,SAAS,MAAM,OAAO,EAAE;AACpC,QAAI,MAAM,KAAK,EAAG,SAAQ;AAC1B,QAAI,QAAQ,EAAG,SAAQ;AACvB,QAAI,QAAQ,IAAK,SAAQ;AACzB,SAAK,eAAe;AAAA,EACxB;AAAA,EAEQ,4BAA4B,GAAU;AAC1C,UAAM,QAAQ,EAAE;AAChB,QAAI,QAAQ,SAAS,MAAM,OAAO,EAAE;AACpC,QAAI,MAAM,KAAK,EAAG,SAAQ;AAC1B,QAAI,QAAQ,EAAG,SAAQ;AACvB,QAAI,QAAQ,MAAO,SAAQ;AAC3B,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEQ,0BAA0B,GAAU;AACxC,UAAM,QAAQ,EAAE;AAChB,SAAK,gBAAgB,MAAM;AAAA,EAC/B;AAAA,EAEA,MAAc,qBAAqB;AAE/B,UAAM,cAAc,KAAK,gBAAgB,EAAE,cAAc,KAAK,IAAI,CAAC;AACnE,UAAM,kBAAkB,KAAK,gBAAgB,EAAE,cAAc,KAAK,IAAI,CAAC;AAEvE,UAAM,KAAK,YAAY,eAAe;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,8BAA8B;AAExC,UAAM,cAAc,KAAK,gBAAgB,EAAE,cAAc,KAAK,IAAI,CAAC;AACnE,UAAM,kBAAkB,KAAK,gBAAgB,EAAE,cAAc,KAAK,IAAI,CAAC;AAEvE,UAAM,KAAK,YAAY,wBAAwB;AAAA,MAC3C,OAAO,KAAK;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAnGY;AAAA,EADP,MAAM;AAAA,GADL,4BAEM;AAGA;AAAA,EADP,MAAM;AAAA,GAJL,4BAKM;AAGA;AAAA,EADP,MAAM;AAAA,GAPL,4BAQM;AARN,8BAAN;AAAA,EADC,cAAc,gCAAgC;AAAA,GACzC;AAwGN,wBAAwB,YAAY,gCAAgC;",
5
+ "names": []
6
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import "@material/web/button/filled-button";
7
+ import "@material/web/button/outlined-button";
8
+ import { BaseClusterCommands } from "../base-cluster-commands.js";
9
+ /**
10
+ * Command panel for OnOff cluster (ID: 6).
11
+ * Provides On, Off, and Toggle commands.
12
+ */
13
+ declare class OnOffClusterCommands extends BaseClusterCommands {
14
+ render(): import("lit-html").TemplateResult<1>;
15
+ private _handleOn;
16
+ private _handleOff;
17
+ private _handleToggle;
18
+ }
19
+ declare global {
20
+ interface HTMLElementTagNameMap {
21
+ "on-off-cluster-commands": OnOffClusterCommands;
22
+ }
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=on-off-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-off-commands.d.ts","sourceRoot":"","sources":["../../../../../src/pages/cluster-commands/clusters/on-off-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAKlE;;;GAGG;AACH,cACM,oBAAqB,SAAQ,mBAAmB;IACzC,MAAM;YAeD,SAAS;YAIT,UAAU;YAIV,aAAa;CAG9B;AAKD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,yBAAyB,EAAE,oBAAoB,CAAC;KACnD;CACJ"}
@@ -0,0 +1,52 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ /**
12
+ * @license
13
+ * Copyright 2025-2026 Open Home Foundation
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+ import "@material/web/button/filled-button";
17
+ import "@material/web/button/outlined-button";
18
+ import { html } from "lit";
19
+ import { customElement } from "lit/decorators.js";
20
+ import { BaseClusterCommands } from "../base-cluster-commands.js";
21
+ import { registerClusterCommands } from "../registry.js";
22
+ const CLUSTER_ID = 6;
23
+ let OnOffClusterCommands = class extends BaseClusterCommands {
24
+ render() {
25
+ return html`
26
+ <details class="command-panel">
27
+ <summary>OnOff Commands</summary>
28
+ <div class="command-content">
29
+ <div class="command-row">
30
+ <md-outlined-button @click=${this._handleOn}>On</md-outlined-button>
31
+ <md-outlined-button @click=${this._handleOff}>Off</md-outlined-button>
32
+ <md-outlined-button @click=${this._handleToggle}>Toggle</md-outlined-button>
33
+ </div>
34
+ </div>
35
+ </details>
36
+ `;
37
+ }
38
+ async _handleOn() {
39
+ await this.sendCommand("On");
40
+ }
41
+ async _handleOff() {
42
+ await this.sendCommand("Off");
43
+ }
44
+ async _handleToggle() {
45
+ await this.sendCommand("Toggle");
46
+ }
47
+ };
48
+ OnOffClusterCommands = __decorateClass([
49
+ customElement("on-off-cluster-commands")
50
+ ], OnOffClusterCommands);
51
+ registerClusterCommands(CLUSTER_ID, "on-off-cluster-commands");
52
+ //# sourceMappingURL=on-off-commands.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/pages/cluster-commands/clusters/on-off-commands.ts"],
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,OAAO;AACP,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AAExC,MAAM,aAAa;AAOnB,IAAM,uBAAN,cAAmC,oBAAoB;AAAA,EAC1C,SAAS;AACd,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,qDAKsC,KAAK,SAAS;AAAA,qDACd,KAAK,UAAU;AAAA,qDACf,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnE;AAAA,EAEA,MAAc,YAAY;AACtB,UAAM,KAAK,YAAY,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAc,aAAa;AACvB,UAAM,KAAK,YAAY,KAAK;AAAA,EAChC;AAAA,EAEA,MAAc,gBAAgB;AAC1B,UAAM,KAAK,YAAY,QAAQ;AAAA,EACnC;AACJ;AA3BM,uBAAN;AAAA,EADC,cAAc,yBAAyB;AAAA,GAClC;AA8BN,wBAAwB,YAAY,yBAAyB;",
5
+ "names": []
6
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Cluster-specific command panels.
8
+ * Import this file to register all cluster command components.
9
+ */
10
+ export { getClusterCommandsTag, hasClusterCommands, registerClusterCommands } from "./registry.js";
11
+ export { BaseClusterCommands } from "./base-cluster-commands.js";
12
+ import "./clusters/level-control-commands.js";
13
+ import "./clusters/on-off-commands.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pages/cluster-commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AAGH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,sCAAsC,CAAC;AAC9C,OAAO,+BAA+B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getClusterCommandsTag, hasClusterCommands, registerClusterCommands } from "./registry.js";
7
+ import { BaseClusterCommands } from "./base-cluster-commands.js";
8
+ import "./clusters/level-control-commands.js";
9
+ import "./clusters/on-off-commands.js";
10
+ export {
11
+ BaseClusterCommands,
12
+ getClusterCommandsTag,
13
+ hasClusterCommands,
14
+ registerClusterCommands
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/cluster-commands/index.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,SAAS,uBAAuB,oBAAoB,+BAA+B;AAGnF,SAAS,2BAA2B;AAGpC,OAAO;AACP,OAAO;",
5
+ "names": []
6
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Register a cluster command panel component.
8
+ * @param clusterId - The Matter cluster ID (e.g., 6 for OnOff, 8 for LevelControl)
9
+ * @param tagName - The custom element tag name (e.g., "on-off-cluster-commands")
10
+ */
11
+ export declare function registerClusterCommands(clusterId: number, tagName: string): void;
12
+ /**
13
+ * Get the registered component tag name for a cluster ID.
14
+ * @param clusterId - The Matter cluster ID
15
+ * @returns The custom element tag name, or undefined if not registered
16
+ */
17
+ export declare function getClusterCommandsTag(clusterId: number): string | undefined;
18
+ /**
19
+ * Check if a cluster has a registered command panel.
20
+ * @param clusterId - The Matter cluster ID
21
+ * @returns true if a command panel is registered
22
+ */
23
+ export declare function hasClusterCommands(clusterId: number): boolean;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/pages/cluster-commands/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const clusterCommandRegistry = /* @__PURE__ */ new Map();
7
+ function registerClusterCommands(clusterId, tagName) {
8
+ clusterCommandRegistry.set(clusterId, tagName);
9
+ }
10
+ function getClusterCommandsTag(clusterId) {
11
+ return clusterCommandRegistry.get(clusterId);
12
+ }
13
+ function hasClusterCommands(clusterId) {
14
+ return clusterCommandRegistry.has(clusterId);
15
+ }
16
+ export {
17
+ getClusterCommandsTag,
18
+ hasClusterCommands,
19
+ registerClusterCommands
20
+ };
21
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/cluster-commands/registry.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM,yBAAyB,oBAAI,IAAoB;AAOhD,SAAS,wBAAwB,WAAmB,SAAuB;AAC9E,yBAAuB,IAAI,WAAW,OAAO;AACjD;AAOO,SAAS,sBAAsB,WAAuC;AACzE,SAAO,uBAAuB,IAAI,SAAS;AAC/C;AAOO,SAAS,mBAAmB,WAA4B;AAC3D,SAAO,uBAAuB,IAAI,SAAS;AAC/C;",
5
+ "names": []
6
+ }
@@ -23,6 +23,8 @@ declare class MatterClusterView extends LitElement {
23
23
  cluster?: number;
24
24
  render(): import("lit-html").TemplateResult<1>;
25
25
  private _showAttributeValue;
26
+ private _renderClusterCommands;
27
+ updated(changedProperties: Map<string, unknown>): void;
26
28
  private _goBack;
27
29
  static styles: import("lit").CSSResult;
28
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"matter-cluster-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-cluster-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAqB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAG1C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ;AAYD,cACM,iBAAkB,SAAQ,UAAU;IAC/B,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAIlB,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM;YA+DD,mBAAmB;IAOjC,OAAO,CAAC,OAAO;IAIf,OAAgB,MAAM,0BAoCpB;CACL"}
1
+ {"version":3,"file":"matter-cluster-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-cluster-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAqB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAK1C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ;AAYD,cACM,iBAAkB,SAAQ,UAAU;IAC/B,MAAM,EAAG,YAAY,CAAC;IAGtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAIlB,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM;YAkED,mBAAmB;IAOjC,OAAO,CAAC,sBAAsB;IAkBrB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBxD,OAAO,CAAC,OAAO;IAIf,OAAgB,MAAM,0BAoCpB;CACL"}
@@ -21,13 +21,15 @@ import "@material/web/list/list-item";
21
21
  import { toBigIntAwareJson } from "@matter-server/ws-client";
22
22
  import { LitElement, css, html } from "lit";
23
23
  import { customElement, property } from "lit/decorators.js";
24
+ import { unsafeHTML } from "lit/directives/unsafe-html.js";
24
25
  import { clusters } from "../client/models/descriptions.js";
25
26
  import { showAlertDialog } from "../components/dialog-box/show-dialog-box.js";
26
27
  import "../components/ha-svg-icon";
27
28
  import "../pages/components/node-details";
28
29
  import { bindingContext } from "./components/context.js";
30
+ import { getClusterCommandsTag } from "./cluster-commands/index.js";
29
31
  function clusterAttributes(attributes, endpoint, cluster) {
30
- return Object.keys(attributes).filter((key) => key.startsWith(`${endpoint}/${cluster}`)).map((key) => {
32
+ return Object.keys(attributes).filter((key) => key.startsWith(`${endpoint}/${cluster}/`)).map((key) => {
31
33
  const attributeKey = Number(key.split("/")[2]);
32
34
  return { key: attributeKey, value: attributes[key] };
33
35
  }, []);
@@ -52,6 +54,9 @@ let MatterClusterView = class extends LitElement {
52
54
  <node-details .node=${this.node} .client=${this.client}></node-details>
53
55
  </div>
54
56
 
57
+ <!-- Cluster commands section (if available for this cluster) -->
58
+ ${this._renderClusterCommands()}
59
+
55
60
  <!-- Cluster attributes listing -->
56
61
  <div class="container">
57
62
  <md-list>
@@ -97,6 +102,32 @@ let MatterClusterView = class extends LitElement {
97
102
  text: toBigIntAwareJson(value)
98
103
  });
99
104
  }
105
+ _renderClusterCommands() {
106
+ if (this.cluster === void 0) return html``;
107
+ if (!this.node?.available) return html``;
108
+ const tagName = getClusterCommandsTag(this.cluster);
109
+ if (!tagName) return html``;
110
+ const componentHtml = `<${tagName}></${tagName}>`;
111
+ const element = unsafeHTML(componentHtml);
112
+ return html`
113
+ <div class="container">
114
+ <div id="cluster-commands-container">${element}</div>
115
+ </div>
116
+ `;
117
+ }
118
+ updated(changedProperties) {
119
+ super.updated(changedProperties);
120
+ const container = this.shadowRoot?.getElementById("cluster-commands-container");
121
+ if (container) {
122
+ const commandsElement = container.firstElementChild;
123
+ if (commandsElement && this.node && this.client) {
124
+ commandsElement.client = this.client;
125
+ commandsElement.node = this.node;
126
+ commandsElement.endpoint = this.endpoint;
127
+ commandsElement.cluster = this.cluster;
128
+ }
129
+ }
130
+ }
100
131
  _goBack() {
101
132
  history.back();
102
133
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/pages/matter-cluster-view.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }