@matter-server/dashboard 1.1.8-alpha.0-20260707-c552b9d → 1.2.1

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 (133) hide show
  1. package/README.md +30 -1
  2. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts +6 -0
  3. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
  4. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js +55 -2
  5. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js.map +1 -1
  6. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts +6 -0
  7. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
  8. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js +53 -3
  9. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js.map +1 -1
  10. package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.d.ts +29 -0
  11. package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.d.ts.map +1 -0
  12. package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.js +112 -0
  13. package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.js.map +6 -0
  14. package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.d.ts +8 -0
  15. package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.d.ts.map +1 -0
  16. package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.js +17 -0
  17. package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.js.map +6 -0
  18. package/dist/esm/components/dialogs/settings/settings-dialog.d.ts +28 -0
  19. package/dist/esm/components/dialogs/settings/settings-dialog.d.ts.map +1 -1
  20. package/dist/esm/components/dialogs/settings/settings-dialog.js +496 -105
  21. package/dist/esm/components/dialogs/settings/settings-dialog.js.map +1 -1
  22. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +6 -0
  23. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  24. package/dist/esm/pages/cluster-commands/base-cluster-commands.js +8 -0
  25. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
  26. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts.map +1 -1
  27. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js +21 -7
  28. package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js.map +1 -1
  29. package/dist/esm/pages/cluster-commands/clusters/avsum-commands.d.ts.map +1 -1
  30. package/dist/esm/pages/cluster-commands/clusters/avsum-commands.js +34 -13
  31. package/dist/esm/pages/cluster-commands/clusters/avsum-commands.js.map +1 -1
  32. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -1
  33. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +17 -11
  34. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +1 -1
  35. package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts.map +1 -1
  36. package/dist/esm/pages/cluster-commands/clusters/binding-commands.js +24 -9
  37. package/dist/esm/pages/cluster-commands/clusters/binding-commands.js.map +1 -1
  38. package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.d.ts +54 -0
  39. package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.d.ts.map +1 -0
  40. package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.js +514 -0
  41. package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.js.map +6 -0
  42. package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
  43. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
  44. package/dist/esm/pages/cluster-commands/index.js +1 -0
  45. package/dist/esm/pages/cluster-commands/index.js.map +1 -1
  46. package/dist/esm/pages/components/node-details.d.ts +2 -0
  47. package/dist/esm/pages/components/node-details.d.ts.map +1 -1
  48. package/dist/esm/pages/components/node-details.js +43 -2
  49. package/dist/esm/pages/components/node-details.js.map +1 -1
  50. package/dist/esm/pages/components/server-details.d.ts +4 -0
  51. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  52. package/dist/esm/pages/components/server-details.js +50 -2
  53. package/dist/esm/pages/components/server-details.js.map +1 -1
  54. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  55. package/dist/esm/pages/matter-cluster-view.js +1 -1
  56. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  57. package/dist/esm/pages/matter-network-view.d.ts +2 -0
  58. package/dist/esm/pages/matter-network-view.d.ts.map +1 -1
  59. package/dist/esm/pages/matter-network-view.js +23 -0
  60. package/dist/esm/pages/matter-network-view.js.map +1 -1
  61. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  62. package/dist/esm/pages/matter-server-view.js +35 -1
  63. package/dist/esm/pages/matter-server-view.js.map +1 -1
  64. package/dist/esm/pages/network/border-router-store.d.ts +11 -4
  65. package/dist/esm/pages/network/border-router-store.d.ts.map +1 -1
  66. package/dist/esm/pages/network/border-router-store.js +39 -0
  67. package/dist/esm/pages/network/border-router-store.js.map +1 -1
  68. package/dist/esm/pages/network/network-details.d.ts +11 -1
  69. package/dist/esm/pages/network/network-details.d.ts.map +1 -1
  70. package/dist/esm/pages/network/network-details.js +305 -3
  71. package/dist/esm/pages/network/network-details.js.map +1 -1
  72. package/dist/esm/pages/network/network-types.d.ts +3 -183
  73. package/dist/esm/pages/network/network-types.d.ts.map +1 -1
  74. package/dist/esm/pages/network/network-types.js +1 -10
  75. package/dist/esm/pages/network/network-types.js.map +2 -2
  76. package/dist/esm/pages/network/network-utils.d.ts +19 -171
  77. package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
  78. package/dist/esm/pages/network/network-utils.js +118 -510
  79. package/dist/esm/pages/network/network-utils.js.map +2 -2
  80. package/dist/esm/pages/network/thread-graph.d.ts +23 -1
  81. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -1
  82. package/dist/esm/pages/network/thread-graph.js +187 -10
  83. package/dist/esm/pages/network/thread-graph.js.map +1 -1
  84. package/dist/esm/util/duration.d.ts +8 -0
  85. package/dist/esm/util/duration.d.ts.map +1 -0
  86. package/dist/esm/util/duration.js +25 -0
  87. package/dist/esm/util/duration.js.map +6 -0
  88. package/dist/esm/util/icd.d.ts +54 -0
  89. package/dist/esm/util/icd.d.ts.map +1 -0
  90. package/dist/esm/util/icd.js +139 -0
  91. package/dist/esm/util/icd.js.map +6 -0
  92. package/dist/web/js/{attribute-write-dialog-Bk3AWMoZ.js → attribute-write-dialog-Bu7d1xMh.js} +1 -1
  93. package/dist/web/js/{command-invoke-dialog-H8A7dCFd.js → command-invoke-dialog-BK7MYWq-.js} +1 -1
  94. package/dist/web/js/{commission-node-dialog-GIvqBYGw.js → commission-node-dialog-BeRg7rEp.js} +5 -5
  95. package/dist/web/js/{commission-node-existing-DglV5NXP.js → commission-node-existing-ugSNvMcK.js} +2 -2
  96. package/dist/web/js/{commission-node-thread-DzrHWt8R.js → commission-node-thread-CT_Qbe1U.js} +53 -4
  97. package/dist/web/js/{commission-node-wifi-DWQ9mxqk.js → commission-node-wifi-Bx1nhWl4.js} +48 -5
  98. package/dist/web/js/{dialog-box-CsqgNzj2.js → dialog-box-DolVvXoK.js} +1 -1
  99. package/dist/web/js/fabric-label-dialog-D4NlfZS9.js +94 -0
  100. package/dist/web/js/fire_event-CJVsUQ4T.js +18 -0
  101. package/dist/web/js/main.js +101 -22
  102. package/dist/web/js/{matter-dashboard-app-BrbVPiqG.js → matter-dashboard-app-DMIDxj8f.js} +3118 -944
  103. package/dist/web/js/{node-acl-add-dialog-COL4myAw.js → node-acl-add-dialog-8qtV5Lx-.js} +1 -1
  104. package/dist/web/js/{node-binding-dialog-_Odw2AGk.js → node-binding-dialog-B75AcGPb.js} +1 -1
  105. package/dist/web/js/{node-label-dialog-D6hA1gVX.js → node-label-dialog-QxhxDvAP.js} +1 -1
  106. package/dist/web/js/settings-dialog-CeBkVje3.js +980 -0
  107. package/package.json +4 -4
  108. package/src/components/dialogs/commission-node-dialog/commission-node-thread.ts +64 -3
  109. package/src/components/dialogs/commission-node-dialog/commission-node-wifi.ts +62 -4
  110. package/src/components/dialogs/fabric-label-dialog/fabric-label-dialog.ts +109 -0
  111. package/src/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.ts +16 -0
  112. package/src/components/dialogs/settings/settings-dialog.ts +526 -118
  113. package/src/pages/cluster-commands/base-cluster-commands.ts +11 -0
  114. package/src/pages/cluster-commands/clusters/access-control-commands.ts +21 -7
  115. package/src/pages/cluster-commands/clusters/avsum-commands.ts +34 -13
  116. package/src/pages/cluster-commands/clusters/basic-information-commands.ts +17 -12
  117. package/src/pages/cluster-commands/clusters/binding-commands.ts +26 -10
  118. package/src/pages/cluster-commands/clusters/icd-management-commands.ts +551 -0
  119. package/src/pages/cluster-commands/index.ts +1 -0
  120. package/src/pages/components/node-details.ts +46 -2
  121. package/src/pages/components/server-details.ts +55 -2
  122. package/src/pages/matter-cluster-view.ts +4 -3
  123. package/src/pages/matter-network-view.ts +25 -0
  124. package/src/pages/matter-server-view.ts +37 -1
  125. package/src/pages/network/border-router-store.ts +51 -4
  126. package/src/pages/network/network-details.ts +379 -3
  127. package/src/pages/network/network-types.ts +19 -193
  128. package/src/pages/network/network-utils.ts +125 -803
  129. package/src/pages/network/thread-graph.ts +241 -13
  130. package/src/util/duration.ts +24 -0
  131. package/src/util/icd.ts +197 -0
  132. package/dist/web/js/fire_event-BEdDUG4R.js +0 -168
  133. package/dist/web/js/settings-dialog-DUmZpfSq.js +0 -606
@@ -0,0 +1,514 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
5
+ };
6
+ var __decorateClass = (decorators, target, key, kind) => {
7
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
+ if (decorator = decorators[i])
10
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
+ if (kind && result) __defProp(target, key, result);
12
+ return result;
13
+ };
14
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
15
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
16
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
17
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
18
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
19
+ var __privateWrapper = (obj, member, setter, getter) => ({
20
+ set _(value) {
21
+ __privateSet(obj, member, value, setter);
22
+ },
23
+ get _() {
24
+ return __privateGet(obj, member, getter);
25
+ }
26
+ });
27
+ /**
28
+ * @license
29
+ * Copyright 2025-2026 Open Home Foundation
30
+ * SPDX-License-Identifier: Apache-2.0
31
+ */
32
+ var _loadedForNode, _flowGeneration, _refreshInFlight, _IcdManagementClusterCommands_instances, doRefreshServerState_fn;
33
+ import "@material/web/button/filled-button";
34
+ import "@material/web/button/outlined-button";
35
+ import "@material/web/progress/circular-progress";
36
+ import "@material/web/radio/radio";
37
+ import {
38
+ ICD_MULTI_ADMIN_ERROR_CODE,
39
+ ServerCommandError
40
+ } from "@matter-server/ws-client";
41
+ import { css, html, nothing } from "lit";
42
+ import { customElement, state } from "lit/decorators.js";
43
+ import { showAlertDialog, showPromptDialog } from "../../../components/dialog-box/show-dialog-box.js";
44
+ import { handleAsync } from "../../../util/async-handler.js";
45
+ import { formatDuration } from "../../../util/duration.js";
46
+ import {
47
+ decodeRegisteredClients,
48
+ ICD_CLUSTER_ID,
49
+ icdInfo,
50
+ isRegisteredByUs,
51
+ litSpecVersionOk,
52
+ otherFabricClientCount,
53
+ parseMultiAdminDetails,
54
+ wakeInstruction
55
+ } from "../../../util/icd.js";
56
+ import { BaseClusterCommands } from "../base-cluster-commands.js";
57
+ import { registerClusterCommands } from "../registry.js";
58
+ const COMMISSIONED_FABRICS_PATH = "0/62/3";
59
+ const CURRENT_FABRIC_INDEX_PATH = "0/62/5";
60
+ const REGISTERED_CLIENTS_PATH = `0/${ICD_CLUSTER_ID}/3`;
61
+ let IcdManagementClusterCommands = class extends BaseClusterCommands {
62
+ constructor() {
63
+ super(...arguments);
64
+ __privateAdd(this, _IcdManagementClusterCommands_instances);
65
+ this._busy = false;
66
+ this._busyLabel = "";
67
+ __privateAdd(this, _loadedForNode);
68
+ __privateAdd(this, _flowGeneration, 0);
69
+ __privateAdd(this, _refreshInFlight);
70
+ }
71
+ updated(changedProperties) {
72
+ super.updated(changedProperties);
73
+ if (!this.client || !this.node) return;
74
+ if (__privateGet(this, _loadedForNode) !== String(this.node.node_id)) {
75
+ __privateSet(this, _loadedForNode, String(this.node.node_id));
76
+ __privateWrapper(this, _flowGeneration)._++;
77
+ this._serverState = void 0;
78
+ this._selectedMode = void 0;
79
+ this._busy = false;
80
+ this._busyLabel = "";
81
+ handleAsync(() => this._ensureLoaded())();
82
+ return;
83
+ }
84
+ if (!this._busy && changedProperties.has("node") && changedProperties.get("node") !== this.node) {
85
+ handleAsync(() => this._refreshServerState(this.node, this.endpoint))();
86
+ }
87
+ }
88
+ get _info() {
89
+ return icdInfo(this.node.attributes);
90
+ }
91
+ get _actionTimeoutMs() {
92
+ return ((this._info.idleModeDuration ?? 60) + 30) * 1e3;
93
+ }
94
+ async _ensureLoaded() {
95
+ await this._refreshServerState(this.node, this.endpoint);
96
+ }
97
+ _refreshServerState(node, endpoint, options) {
98
+ const key = `${String(node.node_id)}:${endpoint}`;
99
+ const inFlight = __privateGet(this, _refreshInFlight);
100
+ if (inFlight?.key === key && !options?.force) return inFlight.promise;
101
+ const promise = (inFlight?.key === key ? inFlight.promise.then(() => __privateMethod(this, _IcdManagementClusterCommands_instances, doRefreshServerState_fn).call(this, node, endpoint)) : __privateMethod(this, _IcdManagementClusterCommands_instances, doRefreshServerState_fn).call(this, node, endpoint)).finally(() => {
102
+ if (__privateGet(this, _refreshInFlight)?.promise === promise) __privateSet(this, _refreshInFlight, void 0);
103
+ });
104
+ __privateSet(this, _refreshInFlight, { key, promise });
105
+ return promise;
106
+ }
107
+ get _idleText() {
108
+ const idle = this._info.idleModeDuration;
109
+ return idle !== void 0 ? formatDuration(idle) : "its idle interval";
110
+ }
111
+ get _commissionedFabrics() {
112
+ const value = this.node.attributes[COMMISSIONED_FABRICS_PATH];
113
+ return typeof value === "number" ? value : 1;
114
+ }
115
+ get _registered() {
116
+ if (this._serverState !== void 0) return this._serverState.registered;
117
+ return isRegisteredByUs(this._info.registeredClients, this.client.serverInfo?.controller_node_id);
118
+ }
119
+ /** matter.js only treats a peer as LIT-capable with LITS feature AND spec version >= 1.4.0. */
120
+ get _litSupported() {
121
+ return this._serverState?.lit_supported ?? (this._info.features.longIdleTimeSupport && litSpecVersionOk(this.node.attributes));
122
+ }
123
+ get _actualMode() {
124
+ return this._registered ? "batterySaver" : "standard";
125
+ }
126
+ _resetSelectedMode() {
127
+ this._selectedMode = this._actualMode;
128
+ }
129
+ render() {
130
+ if (!this.node || this.cluster !== ICD_CLUSTER_ID) return nothing;
131
+ const info = this._info;
132
+ if (!info.supported) return nothing;
133
+ return html`
134
+ <details class="command-panel" open>
135
+ <summary>Power & Sleep (ICD)</summary>
136
+ <div class="command-content">
137
+ <p>This device saves power by sleeping between short check-in windows.</p>
138
+ ${info.operatingMode === "LIT" ? html`<p class="info-banner">
139
+ This device is currently in <b>Battery Saver Mode</b>: any action you trigger (commands,
140
+ reads, re-subscriptions) may take up to <b>${this._idleText}</b> while the device sleeps.
141
+ Updates reported by the device itself (e.g. sensor changes) are not delayed — the device
142
+ wakes up on its own to report them.
143
+ ${this.node.available ? nothing : html`<br /><b class="offline-line"
144
+ >The device is currently offline — reconnecting on its own can take up to
145
+ ${this._idleText}.</b
146
+ >`}
147
+ </p>` : html`<p>
148
+ Current mode: <b>Standard</b> — the device sleeps between short check-ins and typically
149
+ reacts within seconds to a few minutes.
150
+ </p>`}
151
+ ${info.features.userActiveModeTrigger ? this._renderWakeHint(info) : nothing}
152
+ ${info.features.longIdleTimeSupport || this._registered ? this._renderIcdManagement() : nothing}
153
+ </div>
154
+ </details>
155
+ `;
156
+ }
157
+ _renderWakeHint(info) {
158
+ const wake = wakeInstruction(info.userActiveModeTriggerHint, info.userActiveModeTriggerInstruction);
159
+ return wake.kind === "custom" ? html`<p>To wake the device immediately, follow the device's instructions: "${wake.text}".</p>` : html`<p>To wake the device immediately: ${wake.text}.</p>`;
160
+ }
161
+ _renderIcdManagement() {
162
+ const litUnsupported = this._info.features.longIdleTimeSupport && !this._litSupported;
163
+ const notice = litUnsupported ? html`<p class="info-banner">
164
+ ICD management is available but unreliable: the device reports a Matter version below 1.4. Mode
165
+ management is disabled.
166
+ </p>` : nothing;
167
+ if (litUnsupported && !this._registered) return html`${notice}`;
168
+ return html` ${notice}${this._renderModeChooser()} `;
169
+ }
170
+ _renderModeChooser() {
171
+ const actualMode = this._actualMode;
172
+ const selected = this._selectedMode ?? actualMode;
173
+ const single = this._commissionedFabrics <= 1;
174
+ return html`
175
+ <h4>Response speed vs. battery life</h4>
176
+ <div class="mode-options">
177
+ <label class="mode-option">
178
+ <md-radio
179
+ name="icd-mode"
180
+ value="standard"
181
+ .checked=${selected === "standard"}
182
+ @change=${() => this._selectedMode = "standard"}
183
+ ></md-radio>
184
+ <div class="mode-option-text">
185
+ <b>Standard Mode</b>
186
+ <p>
187
+ Best for faster responses, with higher battery use. The device still sleeps between short
188
+ check-ins, but wakes much more often — commands and reads typically reach it within seconds
189
+ to a few minutes (its regular polling/subscription interval). It is not permanently
190
+ connected.
191
+ </p>
192
+ </div>
193
+ </label>
194
+ <label class="mode-option">
195
+ <md-radio
196
+ name="icd-mode"
197
+ value="batterySaver"
198
+ .checked=${selected === "batterySaver"}
199
+ @change=${() => this._selectedMode = "batterySaver"}
200
+ ></md-radio>
201
+ <div class="mode-option-text">
202
+ <b>Battery Saver Mode (Long Idle)</b>
203
+ <p>
204
+ Best for longest battery life. The device sleeps most of the time and wakes on its own
205
+ schedule.
206
+ </p>
207
+ <ul>
208
+ <li>Commands may take up to <b>${this._idleText}</b> to be delivered while it sleeps.</li>
209
+ <li>
210
+ Updates reported by the device itself are <b>not</b> delayed (the device wakes itself to
211
+ report).
212
+ </li>
213
+ <li>
214
+ If the connection is lost (e.g. after a server restart, when no subscription is active),
215
+ reconnecting can also take up to <b>${this._idleText}</b>.
216
+ </li>
217
+ <li>
218
+ <b>Every</b> ecosystem (e.g. Apple, Google) this device is paired with must support
219
+ Battery Saver Mode (called Matter LIT (Long Idle Time) ICD), otherwise the device will
220
+ appear offline or unresponsive there.
221
+ </li>
222
+ </ul>
223
+ </div>
224
+ </label>
225
+ </div>
226
+ <p class="info-banner">
227
+ Every ecosystem (e.g. Apple, Google) this device is paired with must support Battery Saver Mode (called
228
+ Matter LIT (Long Idle Time) ICD). You can switch back to Standard Mode later as long as no other
229
+ ecosystem is registered for it.
230
+ ${!single && !this._registered ? html` This device is already paired with <b>${this._commissionedFabrics - 1}</b> other
231
+ ecosystem(s).` : nothing}
232
+ </p>
233
+ <div class="command-row">
234
+ <md-filled-button
235
+ @click=${handleAsync(() => this._changeMode())}
236
+ ?disabled=${this._busy || selected === actualMode}
237
+ >
238
+ Change mode
239
+ </md-filled-button>
240
+ <md-outlined-button
241
+ @click=${handleAsync(() => this._resync())}
242
+ ?disabled=${this._busy || this.node.available}
243
+ title="Drops the local Battery Saver registration and reconnects from scratch. Use when the device appears stuck offline although it should be reachable."
244
+ >
245
+ Resync state
246
+ </md-outlined-button>
247
+ ${this._busy ? html`<md-circular-progress indeterminate></md-circular-progress>
248
+ <span class="busy">${this._busyLabel}</span>` : nothing}
249
+ </div>
250
+ `;
251
+ }
252
+ async _changeMode() {
253
+ const target = this._selectedMode;
254
+ if (target === void 0 || target === this._actualMode) return;
255
+ if (target === "batterySaver") {
256
+ await this._enable();
257
+ } else {
258
+ await this._disable();
259
+ }
260
+ }
261
+ _enableConfirmText() {
262
+ const single = this._commissionedFabrics <= 1;
263
+ return html`
264
+ <p>
265
+ The device will sleep most of the time. Commands may take up to <b>${this._idleText}</b> to reach it;
266
+ updates from the device itself are not delayed.
267
+ </p>
268
+ <p>
269
+ <b>Important:</b>
270
+ ${single ? html`every ecosystem (e.g. Apple, Google) you pair this device with later must support Battery
271
+ Saver Mode (called Matter LIT (Long Idle Time) ICD). In an ecosystem without support the device
272
+ will appear offline or unresponsive.` : html`this device is already paired with <b>${this._commissionedFabrics - 1}</b> other
273
+ ecosystem(s). All of them must support Battery Saver Mode (called Matter LIT (Long Idle Time)
274
+ ICD), otherwise the device will appear offline or unresponsive in those ecosystems.`}
275
+ </p>
276
+ <p>
277
+ You can switch back to Standard Mode later as long as no other ecosystem is registered for Battery Saver
278
+ Mode.
279
+ </p>
280
+ `;
281
+ }
282
+ async _enable() {
283
+ const node = this.node;
284
+ const endpoint = this.endpoint;
285
+ if (this._serverState !== void 0 && !this._serverState.lit_supported) {
286
+ await showAlertDialog({
287
+ title: "Battery Saver Mode not supported",
288
+ text: "This device advertises Battery Saver support but reports a Matter version below 1.4 \u2014 enabling is not safe and has been disabled."
289
+ });
290
+ if (this.isSameContext(node, endpoint)) this._resetSelectedMode();
291
+ return;
292
+ }
293
+ const confirmed = await showPromptDialog({
294
+ title: "Enable Battery Saver Mode?",
295
+ text: this._enableConfirmText(),
296
+ confirmText: "Enable"
297
+ });
298
+ if (!confirmed) {
299
+ if (this.isSameContext(node, endpoint)) this._resetSelectedMode();
300
+ return;
301
+ }
302
+ if (!this.isSameContext(node, endpoint)) return;
303
+ await this._runBusy(node, endpoint, "Enabling \u2014 waiting for the device to wake up\u2026", async () => {
304
+ try {
305
+ await this._register(node, false);
306
+ } catch (error) {
307
+ if (!await this._handleMultiAdmin(node, endpoint, error)) throw error;
308
+ }
309
+ });
310
+ }
311
+ /** Returns true when the error was a handled multi-admin rejection. */
312
+ async _handleMultiAdmin(node, endpoint, error) {
313
+ if (!(error instanceof ServerCommandError) || error.errorCode !== ICD_MULTI_ADMIN_ERROR_CODE) return false;
314
+ const vendorIds = parseMultiAdminDetails(error.message) ?? new Array();
315
+ let names;
316
+ if (vendorIds.length === 0) {
317
+ names = "unknown ecosystems";
318
+ } else {
319
+ try {
320
+ const lookup = await this.client.getVendorNames(vendorIds);
321
+ names = vendorIds.map((id) => lookup[String(id)] ?? `Vendor 0x${id.toString(16).padStart(4, "0")}`).join(", ");
322
+ } catch {
323
+ names = vendorIds.map((id) => `Vendor 0x${id.toString(16).padStart(4, "0")}`).join(", ");
324
+ }
325
+ }
326
+ if (!this.isSameContext(node, endpoint)) return true;
327
+ const retry = await showPromptDialog({
328
+ title: "Other ecosystems may not support Battery Saver Mode",
329
+ text: html`
330
+ <p>These connected ecosystems may not fully support Battery Saver Mode: <b>${names}</b>.</p>
331
+ <p>
332
+ Enabling it can make the device appear offline or unresponsive in those ecosystems. Enable anyway?
333
+ </p>
334
+ `,
335
+ confirmText: "Enable anyway"
336
+ });
337
+ if (!retry) {
338
+ if (this.isSameContext(node, endpoint)) this._resetSelectedMode();
339
+ return true;
340
+ }
341
+ if (!this.isSameContext(node, endpoint)) return true;
342
+ await this._register(node, true);
343
+ return true;
344
+ }
345
+ async _register(node, allowMultiAdmin) {
346
+ await this.client.registerIcd(node.node_id, { allowMultiAdmin }, this._actionTimeoutMs);
347
+ }
348
+ async _disable() {
349
+ const node = this.node;
350
+ const endpoint = this.endpoint;
351
+ const confirmed = await showPromptDialog({
352
+ title: "Switch to Standard Mode?",
353
+ text: "The device will wake much more often and respond faster, at the cost of higher battery use. It still sleeps briefly between check-ins \u2014 it does not become permanently connected.",
354
+ confirmText: "Switch"
355
+ });
356
+ if (!confirmed) {
357
+ if (this.isSameContext(node, endpoint)) this._resetSelectedMode();
358
+ return;
359
+ }
360
+ if (!this.isSameContext(node, endpoint)) return;
361
+ await this._runBusy(node, endpoint, "Switching \u2014 waiting for the device to wake up\u2026", async () => {
362
+ const others = await this._otherClientCount(node, endpoint);
363
+ if (!this.isSameContext(node, endpoint)) return;
364
+ if (others > 0) {
365
+ await showAlertDialog({
366
+ title: "Cannot disable Battery Saver Mode",
367
+ text: `Battery Saver Mode cannot be disabled: ${others} other controller(s) are still registered with this device. Remove the device from those ecosystems (or disable Battery Saver Mode there) first.`
368
+ });
369
+ if (this.isSameContext(node, endpoint)) this._resetSelectedMode();
370
+ return;
371
+ }
372
+ await this.client.unregisterIcd(node.node_id, false, this._actionTimeoutMs);
373
+ });
374
+ }
375
+ /** Non-fabric-filtered RegisteredClients read; counts clients on other fabrics. */
376
+ async _otherClientCount(node, endpoint) {
377
+ const ourFabricIndexRaw = node.attributes[CURRENT_FABRIC_INDEX_PATH];
378
+ const result = await this.client.readAttribute(
379
+ node.node_id,
380
+ [REGISTERED_CLIENTS_PATH, CURRENT_FABRIC_INDEX_PATH],
381
+ this._actionTimeoutMs
382
+ );
383
+ if (this.isSameContext(node, endpoint)) Object.assign(this.node.attributes, result);
384
+ const clients = decodeRegisteredClients(result[REGISTERED_CLIENTS_PATH]);
385
+ const ourFabricIndex = result[CURRENT_FABRIC_INDEX_PATH] ?? ourFabricIndexRaw;
386
+ return otherFabricClientCount(clients, typeof ourFabricIndex === "number" ? ourFabricIndex : void 0);
387
+ }
388
+ async _resync() {
389
+ const node = this.node;
390
+ const endpoint = this.endpoint;
391
+ const confirmed = await showPromptDialog({
392
+ title: "Resync Battery Saver state?",
393
+ text: "Drops the local Battery Saver registration and reconnects from scratch. Use when the device appears stuck offline although it should be reachable.",
394
+ confirmText: "Resync"
395
+ });
396
+ if (!confirmed || !this.isSameContext(node, endpoint)) return;
397
+ await this._runBusy(node, endpoint, "Resyncing\u2026", async () => {
398
+ await this.client.resyncIcd(node.node_id);
399
+ });
400
+ }
401
+ async _runBusy(node, endpoint, label, action) {
402
+ if (this._busy || !this.isSameContext(node, endpoint)) return;
403
+ const gen = ++__privateWrapper(this, _flowGeneration)._;
404
+ this._busy = true;
405
+ this._busyLabel = label;
406
+ try {
407
+ await action();
408
+ } catch (error) {
409
+ const message = error instanceof Error ? error.message : String(error);
410
+ if (this.isSameContext(node, endpoint)) {
411
+ await showAlertDialog({ title: "ICD operation failed", text: message });
412
+ }
413
+ } finally {
414
+ if (gen === __privateGet(this, _flowGeneration)) {
415
+ this._busy = false;
416
+ await this._refreshServerState(node, endpoint, { force: true });
417
+ }
418
+ }
419
+ }
420
+ };
421
+ _loadedForNode = new WeakMap();
422
+ _flowGeneration = new WeakMap();
423
+ _refreshInFlight = new WeakMap();
424
+ _IcdManagementClusterCommands_instances = new WeakSet();
425
+ doRefreshServerState_fn = async function(node, endpoint) {
426
+ let state2;
427
+ try {
428
+ state2 = await this.client.getIcdState(node.node_id);
429
+ } catch {
430
+ state2 = void 0;
431
+ }
432
+ if (!this.isSameContext(node, endpoint)) return;
433
+ const previousMode = this._actualMode;
434
+ this._serverState = state2;
435
+ if (this._selectedMode === void 0 || previousMode !== this._actualMode) {
436
+ this._resetSelectedMode();
437
+ }
438
+ this.requestUpdate();
439
+ };
440
+ IcdManagementClusterCommands.styles = [
441
+ BaseClusterCommands.styles,
442
+ css`
443
+ .info-banner {
444
+ padding: 8px 12px;
445
+ border-radius: 4px;
446
+ font-size: 14px;
447
+ background-color: var(--md-sys-color-surface-variant);
448
+ color: var(--md-sys-color-on-surface-variant);
449
+ }
450
+ .mode-options {
451
+ display: flex;
452
+ flex-direction: column;
453
+ gap: 8px;
454
+ }
455
+ .mode-option {
456
+ display: flex;
457
+ align-items: flex-start;
458
+ gap: 8px;
459
+ cursor: pointer;
460
+ }
461
+ .mode-option md-radio {
462
+ flex-shrink: 0;
463
+ margin-top: 2px;
464
+ }
465
+ .mode-option-text {
466
+ display: flex;
467
+ flex-direction: column;
468
+ gap: 2px;
469
+ font-size: 14px;
470
+ }
471
+ .mode-option-text p {
472
+ margin: 2px 0;
473
+ color: var(--text-color, rgba(0, 0, 0, 0.6));
474
+ }
475
+ .mode-option-text ul {
476
+ padding-left: 18px;
477
+ margin: 4px 0;
478
+ }
479
+ .busy {
480
+ color: var(--text-color, rgba(0, 0, 0, 0.6));
481
+ font-size: 14px;
482
+ align-self: center;
483
+ }
484
+
485
+ md-circular-progress {
486
+ --md-circular-progress-size: 24px;
487
+ align-self: center;
488
+ }
489
+
490
+ .offline-line {
491
+ color: var(--danger-color, #d32f2f);
492
+ }
493
+ `
494
+ ];
495
+ __decorateClass([
496
+ state()
497
+ ], IcdManagementClusterCommands.prototype, "_serverState", 2);
498
+ __decorateClass([
499
+ state()
500
+ ], IcdManagementClusterCommands.prototype, "_selectedMode", 2);
501
+ __decorateClass([
502
+ state()
503
+ ], IcdManagementClusterCommands.prototype, "_busy", 2);
504
+ __decorateClass([
505
+ state()
506
+ ], IcdManagementClusterCommands.prototype, "_busyLabel", 2);
507
+ IcdManagementClusterCommands = __decorateClass([
508
+ customElement("icd-management-cluster-commands")
509
+ ], IcdManagementClusterCommands);
510
+ registerClusterCommands(ICD_CLUSTER_ID, "icd-management-cluster-commands");
511
+ export {
512
+ IcdManagementClusterCommands
513
+ };
514
+ //# sourceMappingURL=icd-management-commands.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/pages/cluster-commands/clusters/icd-management-commands.ts"],
4
+ "mappings": "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",
5
+ "names": ["state"]
6
+ }
@@ -14,6 +14,7 @@ import "./clusters/avsum-commands.js";
14
14
  import "./clusters/basic-information-commands.js";
15
15
  import "./clusters/binding-commands.js";
16
16
  import "./clusters/chime-commands.js";
17
+ import "./clusters/icd-management-commands.js";
17
18
  import "./clusters/level-control-commands.js";
18
19
  import "./clusters/on-off-commands.js";
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,uCAAuC,CAAC;AAC/C,OAAO,8BAA8B,CAAC;AACtC,OAAO,0CAA0C,CAAC;AAClD,OAAO,gCAAgC,CAAC;AACxC,OAAO,8BAA8B,CAAC;AACtC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,+BAA+B,CAAC"}
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,uCAAuC,CAAC;AAC/C,OAAO,8BAA8B,CAAC;AACtC,OAAO,0CAA0C,CAAC;AAClD,OAAO,gCAAgC,CAAC;AACxC,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,+BAA+B,CAAC"}
@@ -10,6 +10,7 @@ import "./clusters/avsum-commands.js";
10
10
  import "./clusters/basic-information-commands.js";
11
11
  import "./clusters/binding-commands.js";
12
12
  import "./clusters/chime-commands.js";
13
+ import "./clusters/icd-management-commands.js";
13
14
  import "./clusters/level-control-commands.js";
14
15
  import "./clusters/on-off-commands.js";
15
16
  export {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
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;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,SAAS,uBAAuB,oBAAoB,+BAA+B;AAGnF,SAAS,2BAA2B;AAGpC,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
5
5
  "names": []
6
6
  }
@@ -25,6 +25,8 @@ export declare class NodeDetails extends LitElement {
25
25
  private _reinterview;
26
26
  private _remove;
27
27
  private _openCameraOverlay;
28
+ /** "1.5 (1234)" from SoftwareVersionString (0/40/10) + SoftwareVersion (0/40/9); manufacturers mix these up, so show both. */
29
+ private _formatSoftwareVersion;
28
30
  private _searchUpdate;
29
31
  private _openCommissioningWindow;
30
32
  static styles: import("lit").CSSResult;
@@ -1 +1 @@
1
- {"version":3,"file":"node-details.d.ts","sourceRoot":"","sources":["../../../../src/pages/components/node-details.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAOrD,OAAO,8BAA8B,CAAC;AACtC,OAAO,sBAAsB,CAAC;AAqC9B,qBACa,WAAY,SAAQ,UAAU;IAEhC,MAAM,EAAG,YAAY,CAAC;IAG7B,SAAS,CAAC,KAAK,SAAK;IAED,IAAI,CAAC,EAAE,UAAU,CAAC;IAGrC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,QAAQ,EAAG,MAAM,CAAC;IAElB,UAAmB,MAAM,yCA4FxB;IAED,OAAO,CAAC,cAAc;YAIR,YAAY;YAyBZ,OAAO;IAsBrB,OAAO,CAAC,kBAAkB;YAYZ,aAAa;YA0Db,wBAAwB;IAwBtC,OAAgB,MAAM,0BAiDpB;CACL"}
1
+ {"version":3,"file":"node-details.d.ts","sourceRoot":"","sources":["../../../../src/pages/components/node-details.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,oCAAoC,CAAC;AAC5C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAOrD,OAAO,8BAA8B,CAAC;AACtC,OAAO,sBAAsB,CAAC;AAsC9B,qBACa,WAAY,SAAQ,UAAU;IAEhC,MAAM,EAAG,YAAY,CAAC;IAG7B,SAAS,CAAC,KAAK,SAAK;IAED,IAAI,CAAC,EAAE,UAAU,CAAC;IAGrC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,QAAQ,EAAG,MAAM,CAAC;IAElB,UAAmB,MAAM,yCAqGxB;IAED,OAAO,CAAC,cAAc;YAIR,YAAY;YAyBZ,OAAO;IAsBrB,OAAO,CAAC,kBAAkB;IAY1B,8HAA8H;IAC9H,OAAO,CAAC,sBAAsB;YAOhB,aAAa;YA2Db,wBAAwB;IAwBtC,OAAgB,MAAM,0BA0EpB;CACL"}