@matter-server/dashboard 0.3.3 → 0.3.4

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 (66) hide show
  1. package/README.md +76 -0
  2. package/dist/esm/pages/components/node-details.js +1 -1
  3. package/dist/esm/pages/components/node-details.js.map +1 -1
  4. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  5. package/dist/esm/pages/matter-cluster-view.js +9 -4
  6. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  7. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  8. package/dist/esm/pages/matter-endpoint-view.js +8 -2
  9. package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
  10. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  11. package/dist/esm/pages/matter-node-view.js +17 -3
  12. package/dist/esm/pages/matter-node-view.js.map +1 -1
  13. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -1
  14. package/dist/esm/pages/network/base-network-graph.js +10 -2
  15. package/dist/esm/pages/network/base-network-graph.js.map +1 -1
  16. package/dist/esm/pages/network/device-icons.js +1 -1
  17. package/dist/esm/pages/network/network-details.d.ts +31 -1
  18. package/dist/esm/pages/network/network-details.d.ts.map +1 -1
  19. package/dist/esm/pages/network/network-details.js +233 -15
  20. package/dist/esm/pages/network/network-details.js.map +1 -1
  21. package/dist/esm/pages/network/network-types.d.ts +6 -0
  22. package/dist/esm/pages/network/network-types.d.ts.map +1 -1
  23. package/dist/esm/pages/network/network-utils.d.ts +26 -0
  24. package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
  25. package/dist/esm/pages/network/network-utils.js +71 -3
  26. package/dist/esm/pages/network/network-utils.js.map +1 -1
  27. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -1
  28. package/dist/esm/pages/network/thread-graph.js +5 -2
  29. package/dist/esm/pages/network/thread-graph.js.map +1 -1
  30. package/dist/esm/pages/network/update-connections-dialog.d.ts +55 -0
  31. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -0
  32. package/dist/esm/pages/network/update-connections-dialog.js +284 -0
  33. package/dist/esm/pages/network/update-connections-dialog.js.map +6 -0
  34. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -1
  35. package/dist/esm/pages/network/wifi-graph.js +5 -3
  36. package/dist/esm/pages/network/wifi-graph.js.map +1 -1
  37. package/dist/esm/util/format_hex.d.ts +18 -0
  38. package/dist/esm/util/format_hex.d.ts.map +1 -1
  39. package/dist/esm/util/format_hex.js +21 -1
  40. package/dist/esm/util/format_hex.js.map +1 -1
  41. package/dist/web/js/{commission-node-dialog-B1_khzZb.js → commission-node-dialog-CcMuttYO.js} +5 -5
  42. package/dist/web/js/{commission-node-existing-RpdajrwF.js → commission-node-existing-CqTRDMAr.js} +2 -2
  43. package/dist/web/js/{commission-node-thread-5f2itkTG.js → commission-node-thread-DgwtTVwK.js} +2 -2
  44. package/dist/web/js/{commission-node-wifi-DZ_pWqsa.js → commission-node-wifi-XaN2SEnE.js} +2 -2
  45. package/dist/web/js/{dialog-box-DEUxM4B1.js → dialog-box-COpDD8i7.js} +2 -2
  46. package/dist/web/js/{fire_event-BczBMT8E.js → fire_event-mDYWi2sw.js} +1 -1
  47. package/dist/web/js/{log-level-dialog-Cr3PfX1X.js → log-level-dialog-Bc32kZVw.js} +2 -2
  48. package/dist/web/js/main.js +1 -1
  49. package/dist/web/js/{matter-dashboard-app-BuCe_Jxf.js → matter-dashboard-app-CrBHT4fT.js} +1824 -208
  50. package/dist/web/js/{node-binding-dialog-DMiHNDLA.js → node-binding-dialog-C8fqOJiB.js} +2 -2
  51. package/dist/web/js/prevent_default-D-ohDGsN.js +8 -0
  52. package/package.json +4 -4
  53. package/src/pages/components/node-details.ts +1 -1
  54. package/src/pages/matter-cluster-view.ts +11 -4
  55. package/src/pages/matter-endpoint-view.ts +10 -3
  56. package/src/pages/matter-node-view.ts +19 -4
  57. package/src/pages/network/base-network-graph.ts +17 -3
  58. package/src/pages/network/device-icons.ts +1 -1
  59. package/src/pages/network/network-details.ts +281 -16
  60. package/src/pages/network/network-types.ts +6 -0
  61. package/src/pages/network/network-utils.ts +109 -0
  62. package/src/pages/network/thread-graph.ts +7 -1
  63. package/src/pages/network/update-connections-dialog.ts +327 -0
  64. package/src/pages/network/wifi-graph.ts +4 -3
  65. package/src/util/format_hex.ts +39 -0
  66. package/dist/web/js/prevent_default-D4FX_PIh.js +0 -774
@@ -13,16 +13,21 @@ var __decorateClass = (decorators, target, key, kind) => {
13
13
  * Copyright 2025-2026 Open Home Foundation
14
14
  * SPDX-License-Identifier: Apache-2.0
15
15
  */
16
+ import { consume } from "@lit/context";
16
17
  import "@material/web/divider/divider";
17
- import { mdiClose, mdiSignal, mdiSignalCellular1, mdiSignalCellular2 } from "@mdi/js";
18
+ import { isTestNodeId } from "@matter-server/ws-client";
19
+ import { mdiClose, mdiRefresh, mdiSignal, mdiSignalCellular1, mdiSignalCellular2 } from "@mdi/js";
18
20
  import { LitElement, css, html, nothing } from "lit";
19
- import { customElement, property } from "lit/decorators.js";
21
+ import { customElement, property, state } from "lit/decorators.js";
22
+ import { clientContext } from "../../client/client-context.js";
20
23
  import "../../components/ha-svg-icon";
24
+ import { formatNodeAddressFromAny, getEffectiveFabricIndex } from "../../util/format_hex.js";
21
25
  import {
22
26
  buildExtAddrMap,
23
27
  getDeviceName,
24
28
  getNetworkType,
25
29
  getNodeConnections,
30
+ getRoutableDestinationsCount,
26
31
  getSignalColor,
27
32
  getSignalColorFromRssi,
28
33
  getThreadChannel,
@@ -34,6 +39,7 @@ import {
34
39
  getWiFiVersionName,
35
40
  parseNeighborTable
36
41
  } from "./network-utils.js";
42
+ import "./update-connections-dialog.js";
37
43
  let NetworkDetails = class extends LitElement {
38
44
  constructor() {
39
45
  super(...arguments);
@@ -41,6 +47,7 @@ let NetworkDetails = class extends LitElement {
41
47
  this.nodes = {};
42
48
  this.unknownDevices = /* @__PURE__ */ new Map();
43
49
  this.wifiAccessPoints = /* @__PURE__ */ new Map();
50
+ this._showUpdateDialog = false;
44
51
  }
45
52
  _handleClose() {
46
53
  this.dispatchEvent(
@@ -84,6 +91,16 @@ let NetworkDetails = class extends LitElement {
84
91
  if (color === "#ff9800") return mdiSignalCellular2;
85
92
  return mdiSignalCellular1;
86
93
  }
94
+ /**
95
+ * Format a node ID as hex for Matter log format display.
96
+ * Returns format like "@1:7b" for node ID 123.
97
+ */
98
+ _formatNodeIdHex(nodeId) {
99
+ const node = this.nodes[String(nodeId)];
100
+ const isTestNode = node ? isTestNodeId(node.node_id) : false;
101
+ const fabricIndex = getEffectiveFabricIndex(this.client?.serverInfo?.fabric_index, isTestNode);
102
+ return formatNodeAddressFromAny(fabricIndex, nodeId);
103
+ }
87
104
  _renderWiFiInfo(node) {
88
105
  const wifiDiag = getWiFiDiagnostics(node);
89
106
  if (!wifiDiag.bssid && wifiDiag.rssi === null) {
@@ -152,6 +169,19 @@ let NetworkDetails = class extends LitElement {
152
169
  <span class="value mono">${extAddressHex}</span>
153
170
  </div>
154
171
  ` : nothing}
172
+ <div class="info-row">
173
+ <span class="label">Direct neighbors:</span>
174
+ <span class="value">${connections.length}</span>
175
+ </div>
176
+ ${(() => {
177
+ const routableCount = getRoutableDestinationsCount(node);
178
+ return routableCount > 0 ? html`
179
+ <div class="info-row">
180
+ <span class="label">Routable destinations:</span>
181
+ <span class="value">${routableCount}</span>
182
+ </div>
183
+ ` : nothing;
184
+ })()}
155
185
  </div>
156
186
 
157
187
  ${connections.length > 0 ? html`
@@ -174,12 +204,15 @@ let NetworkDetails = class extends LitElement {
174
204
  ></ha-svg-icon>
175
205
  <div class="neighbor-info">
176
206
  <div class="neighbor-name">
177
- ${conn.connectedNode ? html`Node ${conn.connectedNodeId}:
178
- ${getDeviceName(conn.connectedNode)}` : html`External: <span class="mono">${conn.extAddressHex}</span>`}
207
+ ${conn.connectedNode ? html`Node ${conn.connectedNodeId}
208
+ <span class="node-id-hex"
209
+ >${this._formatNodeIdHex(conn.connectedNodeId)}</span
210
+ >: ${getDeviceName(conn.connectedNode)}` : html`External: <span class="mono">${conn.extAddressHex}</span>`}
179
211
  </div>
180
212
  <div class="neighbor-signal">
181
- ${conn.rssi !== null ? html`RSSI: ${conn.rssi} dBm, ` : nothing}
182
- ${conn.lqi !== null ? html`LQI: ${conn.lqi}` : nothing}
213
+ ${conn.rssi !== null ? html`RSSI: ${conn.rssi} dBm` : nothing}${conn.rssi !== null && conn.lqi !== null ? ", " : nothing}${conn.lqi !== null ? html`LQI: ${conn.lqi}` : nothing}${conn.bidirectionalLqi !== void 0 ? html`<span class="route-info"
214
+ >, Bidir: ${conn.bidirectionalLqi}</span
215
+ >` : nothing}${conn.pathCost !== void 0 ? html`<span class="route-info">, Cost: ${conn.pathCost}</span>` : nothing}
183
216
  ${!conn.isOutgoing ? html`<span class="direction-hint">(reverse)</span>` : nothing}
184
217
  </div>
185
218
  </div>
@@ -300,7 +333,11 @@ let NetworkDetails = class extends LitElement {
300
333
  ></ha-svg-icon>
301
334
  ` : nothing}
302
335
  <div class="neighbor-info">
303
- <div class="neighbor-name">Node ${nodeId}: ${getDeviceName(node)}</div>
336
+ <div class="neighbor-name">
337
+ Node ${nodeId}
338
+ <span class="node-id-hex">${this._formatNodeIdHex(nodeId)}</span>:
339
+ ${getDeviceName(node)}
340
+ </div>
304
341
  ${neighborEntry ? html`
305
342
  <div class="neighbor-signal">
306
343
  ${rssi !== null ? html`RSSI: ${rssi} dBm, ` : nothing}
@@ -324,6 +361,87 @@ let NetworkDetails = class extends LitElement {
324
361
  </div>
325
362
  `;
326
363
  }
364
+ /**
365
+ * Determine if update connections button should be shown.
366
+ */
367
+ _canUpdateConnections() {
368
+ if (this.selectedNodeId === null) return false;
369
+ const isAccessPoint = typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("ap_");
370
+ if (isAccessPoint) return false;
371
+ const isUnknown = typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("unknown_");
372
+ if (isUnknown) {
373
+ return this._getOnlineSeenByNodes().length > 0;
374
+ }
375
+ const node = this.nodes[this.selectedNodeId.toString()];
376
+ if (!node) return false;
377
+ const networkType = getNetworkType(node);
378
+ if (networkType === "ethernet" || networkType === "unknown") return false;
379
+ return true;
380
+ }
381
+ /**
382
+ * Get the type of the currently selected node for dialog variant.
383
+ */
384
+ _getSelectedNodeType() {
385
+ if (typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("unknown_")) {
386
+ return "unknown";
387
+ }
388
+ const node = this.nodes[this.selectedNodeId.toString()];
389
+ if (!node || node.available === false) {
390
+ return "offline";
391
+ }
392
+ return "online";
393
+ }
394
+ /**
395
+ * Get online neighbors for a Thread node.
396
+ */
397
+ _getOnlineNeighbors(nodeId) {
398
+ const node = this.nodes[nodeId];
399
+ if (!node) return [];
400
+ const networkType = getNetworkType(node);
401
+ if (networkType === "thread") {
402
+ const extAddrMap = buildExtAddrMap(this.nodes);
403
+ const connections = getNodeConnections(nodeId, this.nodes, extAddrMap);
404
+ return connections.filter((conn) => {
405
+ if (typeof conn.connectedNodeId === "string" && conn.connectedNodeId.startsWith("unknown_")) {
406
+ return false;
407
+ }
408
+ const connectedNode = this.nodes[String(conn.connectedNodeId)];
409
+ return connectedNode?.available === true;
410
+ }).map((conn) => String(conn.connectedNodeId));
411
+ }
412
+ return [];
413
+ }
414
+ /**
415
+ * Get online nodes that see an unknown device.
416
+ */
417
+ _getOnlineSeenByNodes() {
418
+ if (typeof this.selectedNodeId !== "string" || !this.selectedNodeId.startsWith("unknown_")) {
419
+ return [];
420
+ }
421
+ const unknown = this.unknownDevices.get(this.selectedNodeId);
422
+ if (!unknown) return [];
423
+ return unknown.seenBy.filter((nodeId) => {
424
+ const node = this.nodes[nodeId.toString()];
425
+ return node?.available === true;
426
+ });
427
+ }
428
+ /**
429
+ * Get the name of the selected node for display in dialog.
430
+ */
431
+ _getSelectedNodeName() {
432
+ if (typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("unknown_")) {
433
+ const unknown = this.unknownDevices.get(this.selectedNodeId);
434
+ return unknown ? `Unknown (${unknown.extAddressHex.slice(-8)})` : "Unknown Device";
435
+ }
436
+ const node = this.nodes[this.selectedNodeId.toString()];
437
+ return node ? getDeviceName(node) : "Unknown";
438
+ }
439
+ _handleUpdateConnections() {
440
+ this._showUpdateDialog = true;
441
+ }
442
+ _handleDialogClose() {
443
+ this._showUpdateDialog = false;
444
+ }
327
445
  _renderWiFiAccessPointInfo(apId) {
328
446
  const ap = this.wifiAccessPoints.get(apId);
329
447
  if (!ap) {
@@ -359,7 +477,11 @@ let NetworkDetails = class extends LitElement {
359
477
  @click=${() => this._handleSelectNode(nodeId)}
360
478
  @keydown=${(e) => this._handleKeyDown(e, nodeId)}
361
479
  >
362
- <div class="node-name">Node ${nodeId}: ${getDeviceName(node)}</div>
480
+ <div class="node-name">
481
+ Node ${nodeId}
482
+ <span class="node-id-hex">${this._formatNodeIdHex(nodeId)}</span>:
483
+ ${getDeviceName(node)}
484
+ </div>
363
485
  ${wifiDiag.rssi !== null ? html`<div class="node-signal" style="color: ${signalColor}">
364
486
  ${wifiDiag.rssi} dBm
365
487
  </div>` : nothing}
@@ -387,16 +509,40 @@ let NetworkDetails = class extends LitElement {
387
509
  }
388
510
  const isUnknown = typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("unknown_");
389
511
  if (isUnknown) {
512
+ const onlineSeenByNodes = this._getOnlineSeenByNodes();
390
513
  return html`
391
514
  <div class="details-panel">
392
515
  <div class="header">
393
516
  <h3>External Device</h3>
394
- <button class="close-button" @click=${this._handleClose} aria-label="Close details panel">
395
- <ha-svg-icon .path=${mdiClose}></ha-svg-icon>
396
- </button>
517
+ <div class="header-actions">
518
+ ${onlineSeenByNodes.length > 0 ? html`
519
+ <button
520
+ class="action-button"
521
+ @click=${this._handleUpdateConnections}
522
+ aria-label="Update connection data"
523
+ title="Update connection data"
524
+ >
525
+ <ha-svg-icon .path=${mdiRefresh}></ha-svg-icon>
526
+ </button>
527
+ ` : nothing}
528
+ <button class="close-button" @click=${this._handleClose} aria-label="Close details panel">
529
+ <ha-svg-icon .path=${mdiClose}></ha-svg-icon>
530
+ </button>
531
+ </div>
397
532
  </div>
398
533
  <div class="content">${this._renderUnknownDeviceInfo(this.selectedNodeId)}</div>
399
534
  </div>
535
+ ${this._showUpdateDialog ? html`
536
+ <update-connections-dialog
537
+ .client=${this.client}
538
+ .nodes=${this.nodes}
539
+ selectedNodeType="unknown"
540
+ .selectedNodeName=${this._getSelectedNodeName()}
541
+ .selectedNodeId=${this.selectedNodeId}
542
+ .onlineNeighborIds=${onlineSeenByNodes}
543
+ @dialog-closed=${this._handleDialogClose}
544
+ ></update-connections-dialog>
545
+ ` : nothing}
400
546
  `;
401
547
  }
402
548
  const isAccessPoint = typeof this.selectedNodeId === "string" && this.selectedNodeId.startsWith("ap_");
@@ -421,19 +567,48 @@ let NetworkDetails = class extends LitElement {
421
567
  </div>
422
568
  `;
423
569
  }
570
+ const canUpdate = this._canUpdateConnections();
571
+ const nodeType = this._getSelectedNodeType();
572
+ const onlineNeighbors = this._getOnlineNeighbors(String(this.selectedNodeId));
424
573
  return html`
425
574
  <div class="details-panel">
426
575
  <div class="header">
427
- <h3>Node ${this.selectedNodeId}</h3>
428
- <button class="close-button" @click=${this._handleClose} aria-label="Close details panel">
429
- <ha-svg-icon .path=${mdiClose}></ha-svg-icon>
430
- </button>
576
+ <h3>
577
+ Node ${this.selectedNodeId}
578
+ <span class="node-id-hex">${this._formatNodeIdHex(this.selectedNodeId)}</span>
579
+ </h3>
580
+ <div class="header-actions">
581
+ ${canUpdate ? html`
582
+ <button
583
+ class="action-button"
584
+ @click=${this._handleUpdateConnections}
585
+ aria-label="Update connection data"
586
+ title="Update connection data"
587
+ >
588
+ <ha-svg-icon .path=${mdiRefresh}></ha-svg-icon>
589
+ </button>
590
+ ` : nothing}
591
+ <button class="close-button" @click=${this._handleClose} aria-label="Close details panel">
592
+ <ha-svg-icon .path=${mdiClose}></ha-svg-icon>
593
+ </button>
594
+ </div>
431
595
  </div>
432
596
  <div class="content">${this._renderNodeInfo(node)}</div>
433
597
  <div class="footer">
434
598
  <a href="#node/${this.selectedNodeId}" class="view-link">View node details</a>
435
599
  </div>
436
600
  </div>
601
+ ${this._showUpdateDialog ? html`
602
+ <update-connections-dialog
603
+ .client=${this.client}
604
+ .nodes=${this.nodes}
605
+ .selectedNodeType=${nodeType}
606
+ .selectedNodeName=${this._getSelectedNodeName()}
607
+ .selectedNodeId=${this.selectedNodeId}
608
+ .onlineNeighborIds=${onlineNeighbors}
609
+ @dialog-closed=${this._handleDialogClose}
610
+ ></update-connections-dialog>
611
+ ` : nothing}
437
612
  `;
438
613
  }
439
614
  };
@@ -479,6 +654,38 @@ NetworkDetails.styles = css`
479
654
  color: var(--md-sys-color-on-surface, #333);
480
655
  }
481
656
 
657
+ .node-id-hex {
658
+ font-size: 0.75em;
659
+ font-weight: 400;
660
+ color: var(--md-sys-color-on-surface-variant, #666);
661
+ font-family: monospace;
662
+ }
663
+
664
+ .header-actions {
665
+ display: flex;
666
+ align-items: center;
667
+ gap: 4px;
668
+ }
669
+
670
+ .action-button {
671
+ background: none;
672
+ border: none;
673
+ padding: 4px;
674
+ cursor: pointer;
675
+ border-radius: 50%;
676
+ display: flex;
677
+ align-items: center;
678
+ justify-content: center;
679
+ }
680
+
681
+ .action-button:hover {
682
+ background-color: var(--md-sys-color-surface-container-high, #e8e8e8);
683
+ }
684
+
685
+ .action-button ha-svg-icon {
686
+ --icon-primary-color: var(--md-sys-color-on-surface-variant, #666);
687
+ }
688
+
482
689
  .close-button {
483
690
  background: none;
484
691
  border: none;
@@ -600,6 +807,11 @@ NetworkDetails.styles = css`
600
807
  opacity: 0.8;
601
808
  }
602
809
 
810
+ .route-info {
811
+ color: var(--md-sys-color-tertiary, #7d5260);
812
+ font-size: 0.85em;
813
+ }
814
+
603
815
  .footer {
604
816
  padding: 12px 16px;
605
817
  border-top: 1px solid var(--md-sys-color-outline-variant, #ccc);
@@ -677,6 +889,12 @@ __decorateClass([
677
889
  __decorateClass([
678
890
  property({ type: Object })
679
891
  ], NetworkDetails.prototype, "wifiAccessPoints", 2);
892
+ __decorateClass([
893
+ consume({ context: clientContext })
894
+ ], NetworkDetails.prototype, "client", 2);
895
+ __decorateClass([
896
+ state()
897
+ ], NetworkDetails.prototype, "_showUpdateDialog", 2);
680
898
  NetworkDetails = __decorateClass([
681
899
  customElement("network-details")
682
900
  ], NetworkDetails);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/pages/network/network-details.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -99,6 +99,12 @@ export interface ThreadConnection {
99
99
  signalColor: string;
100
100
  lqi: number;
101
101
  rssi: number | null;
102
+ /** Path cost from route table (1 = direct, higher = multi-hop). Only available for routers. */
103
+ pathCost?: number;
104
+ /** Bidirectional LQI from route table (average of lqiIn and lqiOut) */
105
+ bidirectionalLqi?: number;
106
+ /** Whether this connection was supplemented by route table data (vs neighbor table only) */
107
+ fromRouteTable?: boolean;
102
108
  }
103
109
  /**
104
110
  * Unknown Thread device seen in neighbor tables but not commissioned.
@@ -1 +1 @@
1
- {"version":3,"file":"network-types.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network-types.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-types.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,22 @@ export declare function parseNeighborTable(node: MatterNode): ThreadNeighbor[];
73
73
  * The data uses numeric keys matching the Matter spec field IDs.
74
74
  */
75
75
  export declare function parseRouteTable(node: MatterNode): ThreadRoute[];
76
+ /**
77
+ * Find a route table entry for a specific destination by extended address.
78
+ * Returns the route entry if found, undefined otherwise.
79
+ */
80
+ export declare function findRouteByExtAddress(node: MatterNode, targetExtAddr: bigint): ThreadRoute | undefined;
81
+ /**
82
+ * Count the number of routable destinations for a node (from route table).
83
+ * Only counts entries where allocated=true and linkEstablished=true.
84
+ * This is typically only meaningful for router nodes.
85
+ */
86
+ export declare function getRoutableDestinationsCount(node: MatterNode): number;
87
+ /**
88
+ * Calculate combined bidirectional LQI from route table entry.
89
+ * Returns average of lqiIn and lqiOut if both are non-zero.
90
+ */
91
+ export declare function getRouteBidirectionalLqi(route: ThreadRoute): number | undefined;
76
92
  /**
77
93
  * Gets the RLOC16 (short address) for a Thread node.
78
94
  * Uses attribute 0/53/64 (Rloc16, 0x0040).
@@ -103,6 +119,12 @@ export declare function findUnknownDevices(nodes: Record<string, MatterNode>, ex
103
119
  * Red: Weak signal
104
120
  */
105
121
  export declare function getSignalColor(neighbor: ThreadNeighbor): string;
122
+ /**
123
+ * Get signal color based on LQI value alone.
124
+ * Used for route table entries where only LQI is available.
125
+ * @param lqi Link Quality Indicator (0-255, higher is better)
126
+ */
127
+ export declare function getSignalColorFromLqi(lqi: number): string;
106
128
  /**
107
129
  * Gets a human-readable display name for a node.
108
130
  * Format: nodeLabel || productName (serialNumber)
@@ -154,6 +176,10 @@ export interface NodeConnection {
154
176
  isOutgoing: boolean;
155
177
  /** Whether this is an unknown/external device */
156
178
  isUnknown: boolean;
179
+ /** Path cost from route table (1 = direct, higher = multi-hop). Only available for routers. */
180
+ pathCost?: number;
181
+ /** Bidirectional LQI from route table (average of lqiIn and lqiOut) */
182
+ bidirectionalLqi?: number;
157
183
  }
158
184
  /**
159
185
  * Get all connections for a specific node (bidirectional).
@@ -1 +1 @@
1
- {"version":3,"file":"network-utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network-utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EACR,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,mBAAmB,EACtB,MAAM,oBAAoB,CAAC;AAoB5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mBAAmB;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oBAAoB;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA0CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAmB5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,kBAAkB,CAevF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAErE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAyB7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAMhF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE,CA0CrE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,CAkC/D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGtG;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGrE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAO/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAMpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAatF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAarF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,mBAAmB,EAAE,CAgDvB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAsB/D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAatD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmBlE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAkCpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAWlE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAiB3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAmBjE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,cAAc,EAAE,mBAAmB,EAAE,GACtC,gBAAgB,EAAE,CAoGpB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,iFAAiF;IACjF,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,sDAAsD;IACtD,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+GAA+G;IAC/G,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,cAAc,EAAE,CA8ElB"}
@@ -170,6 +170,22 @@ function parseRouteTable(node) {
170
170
  };
171
171
  });
172
172
  }
173
+ function findRouteByExtAddress(node, targetExtAddr) {
174
+ const routes = parseRouteTable(node);
175
+ return routes.find((route) => route.extAddress === targetExtAddr && route.linkEstablished);
176
+ }
177
+ function getRoutableDestinationsCount(node) {
178
+ const routes = parseRouteTable(node);
179
+ return routes.filter((route) => route.allocated && route.linkEstablished).length;
180
+ }
181
+ function getRouteBidirectionalLqi(route) {
182
+ if (route.lqiIn > 0 && route.lqiOut > 0) {
183
+ return Math.round((route.lqiIn + route.lqiOut) / 2);
184
+ }
185
+ if (route.lqiIn > 0) return route.lqiIn;
186
+ if (route.lqiOut > 0) return route.lqiOut;
187
+ return void 0;
188
+ }
173
189
  function getThreadRloc16(node) {
174
190
  const value = node.attributes["0/53/64"];
175
191
  if (typeof value === "number") {
@@ -254,6 +270,15 @@ function getSignalColor(neighbor) {
254
270
  }
255
271
  return SIGNAL_COLOR_WEAK;
256
272
  }
273
+ function getSignalColorFromLqi(lqi) {
274
+ if (lqi > LQI_STRONG_THRESHOLD) {
275
+ return SIGNAL_COLOR_STRONG;
276
+ }
277
+ if (lqi > LQI_MEDIUM_THRESHOLD) {
278
+ return SIGNAL_COLOR_MEDIUM;
279
+ }
280
+ return SIGNAL_COLOR_WEAK;
281
+ }
257
282
  function getDeviceName(node) {
258
283
  if (node.nodeLabel) {
259
284
  return node.nodeLabel;
@@ -385,12 +410,43 @@ function buildThreadConnections(nodes, extAddrMap, unknownDevices) {
385
410
  continue;
386
411
  }
387
412
  seenConnections.add(connectionKey);
413
+ const routeEntry = findRouteByExtAddress(node, neighbor.extAddress);
414
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
388
415
  connections.push({
389
416
  fromNodeId,
390
417
  toNodeId,
391
418
  signalColor: getSignalColor(neighbor),
392
419
  lqi: neighbor.lqi,
393
- rssi: neighbor.avgRssi ?? neighbor.lastRssi
420
+ rssi: neighbor.avgRssi ?? neighbor.lastRssi,
421
+ pathCost: routeEntry?.pathCost,
422
+ bidirectionalLqi
423
+ });
424
+ }
425
+ const routes = parseRouteTable(node);
426
+ for (const route of routes) {
427
+ if (!route.linkEstablished || !route.allocated) continue;
428
+ let toNodeId = extAddrMap.get(route.extAddress);
429
+ if (toNodeId === void 0) {
430
+ toNodeId = unknownExtAddrMap.get(route.extAddress);
431
+ }
432
+ if (toNodeId === void 0 || toNodeId === fromNodeId) continue;
433
+ const connectionKey = `${fromNodeId}-${toNodeId}`;
434
+ const reverseKey = `${toNodeId}-${fromNodeId}`;
435
+ if (seenConnections.has(connectionKey) || seenConnections.has(reverseKey)) {
436
+ continue;
437
+ }
438
+ seenConnections.add(connectionKey);
439
+ const bidirectionalLqi = getRouteBidirectionalLqi(route);
440
+ const signalColor = bidirectionalLqi !== void 0 ? getSignalColorFromLqi(bidirectionalLqi) : "var(--md-sys-color-outline, grey)";
441
+ connections.push({
442
+ fromNodeId,
443
+ toNodeId,
444
+ signalColor,
445
+ lqi: bidirectionalLqi ?? 0,
446
+ rssi: null,
447
+ pathCost: route.pathCost,
448
+ bidirectionalLqi,
449
+ fromRouteTable: true
394
450
  });
395
451
  }
396
452
  }
@@ -409,6 +465,8 @@ function getNodeConnections(nodeId, nodes, extAddrMap) {
409
465
  const isUnknown = connectedNodeId === void 0;
410
466
  const displayId = isUnknown ? `unknown_${neighbor.extAddress.toString(16).toUpperCase().padStart(16, "0")}` : connectedNodeId;
411
467
  seenConnectedIds.add(displayId);
468
+ const routeEntry = findRouteByExtAddress(node, neighbor.extAddress);
469
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
412
470
  connections.push({
413
471
  connectedNodeId: displayId,
414
472
  connectedNode,
@@ -417,7 +475,9 @@ function getNodeConnections(nodeId, nodes, extAddrMap) {
417
475
  lqi: neighbor.lqi,
418
476
  rssi: neighbor.avgRssi ?? neighbor.lastRssi,
419
477
  isOutgoing: true,
420
- isUnknown
478
+ isUnknown,
479
+ pathCost: routeEntry?.pathCost,
480
+ bidirectionalLqi
421
481
  });
422
482
  }
423
483
  if (thisExtAddr !== void 0) {
@@ -430,6 +490,8 @@ function getNodeConnections(nodeId, nodes, extAddrMap) {
430
490
  if (reverseEntry) {
431
491
  const otherExtAddr = getThreadExtendedAddress(otherNode);
432
492
  const extAddrHex = otherExtAddr ? otherExtAddr.toString(16).toUpperCase().padStart(16, "0") : "Unknown";
493
+ const routeEntry = findRouteByExtAddress(otherNode, thisExtAddr);
494
+ const bidirectionalLqi = routeEntry ? getRouteBidirectionalLqi(routeEntry) : void 0;
433
495
  connections.push({
434
496
  connectedNodeId: otherNodeId,
435
497
  connectedNode: otherNode,
@@ -438,7 +500,9 @@ function getNodeConnections(nodeId, nodes, extAddrMap) {
438
500
  lqi: reverseEntry.lqi,
439
501
  rssi: reverseEntry.avgRssi ?? reverseEntry.lastRssi,
440
502
  isOutgoing: false,
441
- isUnknown: false
503
+ isUnknown: false,
504
+ pathCost: routeEntry?.pathCost,
505
+ bidirectionalLqi
442
506
  });
443
507
  }
444
508
  }
@@ -450,11 +514,15 @@ export {
450
514
  buildRloc16Map,
451
515
  buildThreadConnections,
452
516
  categorizeDevices,
517
+ findRouteByExtAddress,
453
518
  findUnknownDevices,
454
519
  getDeviceName,
455
520
  getNetworkType,
456
521
  getNodeConnections,
522
+ getRoutableDestinationsCount,
523
+ getRouteBidirectionalLqi,
457
524
  getSignalColor,
525
+ getSignalColorFromLqi,
458
526
  getSignalColorFromRssi,
459
527
  getThreadChannel,
460
528
  getThreadExtendedAddress,