@matter-server/dashboard 0.8.0 → 0.8.1-alpha.0-20260605-9f5c78b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,16 +39,48 @@ Node colors indicate device status:
39
39
  - **Red**: Offline device (not responding)
40
40
  - **Orange**: Unknown/external device (not commissioned to this fabric, detected in neighbor tables)
41
41
 
42
+ ### Understanding Node Role Badges
43
+
44
+ Thread nodes commissioned to this fabric carry a small corner badge over the device icon showing their Thread routing role:
45
+
46
+ - **Crown (amber)**: Leader — the elected coordinator of the Thread network
47
+ - **Swap arrows (blue)**: Router — forwards traffic for other nodes
48
+ - **Small dot (grey-blue)**: End Device or REED (Router-Eligible End Device)
49
+ - **Zzz / sleep (grey-blue)**: Sleepy End Device — radio off when idle to save battery
50
+ - **No badge**: Role unassigned/unspecified, or an external device whose role can't be queried
51
+
52
+ Thread Border Routers use the device icon itself to show role:
53
+
54
+ - **Crown**: this Border Router is currently the Thread Leader
55
+ - **Wireless router icon**: a Border Router that is not the Leader
56
+ - **Star badge (teal)**: the Primary Backbone Border Router (BBR). Independent of the Leader role — a node can be either, both, or neither.
57
+
58
+ Other node icons:
59
+
60
+ - **WiFi symbol**: WiFi-connected node
61
+ - **Access point (orange)**: external/unknown router-capable device
62
+ - **Question mark (orange)**: external/unknown end device
63
+
42
64
  ### Understanding Connection Lines
43
65
 
44
- Connection lines represent the communication links between devices:
66
+ Connection lines represent the communication links between devices.
67
+
68
+ **Line style:**
45
69
 
46
- - **Solid lines**: Connections to online devices
47
- - **Dashed lines**: Connections to offline or unknown devices (based on last known data)
48
- - **Line colors** indicate signal quality:
49
- - **Green**: Strong signal (RSSI > -60 dBm or LQI > 200)
50
- - **Yellow/Orange**: Medium signal (RSSI > -75 dBm or LQI > 100)
51
- - **Red**: Weak signal
70
+ - **Solid lines**: link to an online device
71
+ - **Dashed lines**: link to an offline or unknown/external device (based on last known data), **or** an asymmetric link where the peer reports no usable link back (one direction is dead)
72
+
73
+ **Line color** indicates signal quality. Thread links are scored by LQI (Link Quality Indicator, typically 0–3 on the underlying stack; higher is better); WiFi links by RSSI:
74
+
75
+ - **Green**: strong signal (LQI > 2, or RSSI > -70 dBm)
76
+ - **Orange**: medium signal (LQI = 2, or RSSI -70 to -85 dBm)
77
+ - **Red**: weak signal (LQI = 1, or RSSI ≤ -85 dBm)
78
+ - **Grey**: no usable link (LQI = 0 — stale or dead neighbor entry)
79
+
80
+ **Arrows** appear only on asymmetric links and point from the reporting node toward the node it sees:
81
+
82
+ - A link drawn with an arrow means only one side reports the other in its neighbor/route table, or the link is shown from the peer's perspective rather than the selected node's.
83
+ - A plain line (no arrow) means both nodes see each other — a healthy bidirectional link.
52
84
 
53
85
  ### Thread Network Details
54
86
 
@@ -62,11 +94,18 @@ When you click on a Thread device, the details panel shows network information:
62
94
 
63
95
  Each connection shows:
64
96
 
65
- - **LQI (Link Quality Indicator)**: 0-255, higher is better. Derived from RF signal quality.
97
+ - **LQI (Link Quality Indicator)**: higher is better. The Matter spec types this as 0255, but the OpenThread stack reports 0–3 in practice. Derived from RF signal quality.
66
98
  - **RSSI (Received Signal Strength)**: In dBm, closer to 0 is stronger (e.g., -50 dBm is better than -80 dBm).
67
- - **Bidir (Bidirectional LQI)**: Average of inbound and outbound LQI from the route table. Only available for router connections.
99
+ - **Bidir (Bidirectional LQI)**: Average of the inbound and outbound LQI from the route table — i.e. the link quality measured in **both directions**. Only available for router connections, which maintain a route table.
68
100
  - **Cost (Path Cost)**: Number of hops to reach the destination. 1 = direct link, higher = multi-hop route.
69
101
 
102
+ A connection may also be tagged with a direction hint:
103
+
104
+ - **← one-way**: the peer reports this node as a neighbor, but this node has no matching neighbor-table entry for the peer. This points to asymmetric (one-way) visibility — caused by range, transmit-power differences, or a stale neighbor table — rather than a healthy two-way link.
105
+ - **(reverse)**: the displayed link comes from the peer's neighbor/route table, not the selected node's. The data is real, just measured from the other end.
106
+
107
+ A connection with neither tag is bidirectional: both nodes see each other.
108
+
70
109
  #### Data Sources
71
110
 
72
111
  Thread devices maintain two tables:
@@ -88,11 +127,12 @@ This is useful when network topology changes or when you want the latest signal
88
127
 
89
128
  ### Unknown Devices
90
129
 
91
- Devices that appear in neighbor tables but are not commissioned to your fabric are shown as "Unknown" with an orange icon. These could be:
130
+ Devices that appear in neighbor or route tables but are not commissioned to your fabric are shown as "Unknown" with an orange icon. Because these tables live at the Thread mesh layer, an unknown entry is always a node on the **same** Thread network as your devices — just not reachable by us. They could be:
92
131
 
93
- - Devices commissioned to a different fabric (e.g., Home Assistant's Thread Border Router)
94
- - Border routers from other Thread networks
95
- - Thread devices in pairing mode
132
+ - **Devices on a different Matter fabric**: a single Thread network is often shared by several fabrics (e.g. Home Assistant, Apple, Google). Their nodes and Border Routers are RF neighbors of your devices, but we cannot query them.
133
+ - **Non-Matter Thread infrastructure**: Border Routers, range extenders, and other Thread devices (e.g. HomeKit-only Thread devices) that are not Matter devices and can never be commissioned.
134
+ - **A Border Router under an unstable radio MAC**: some vendors (notably Apple and Aqara) randomize their Thread radio MAC at each reboot. The same physical Border Router then shows up twice — once as the known BR (matched via its stable MeshCoP `xa` identifier) and once here as an "External Router" carrying its current radio MAC. After such a reboot the old MAC lingers until neighbor tables age out.
135
+ - **Stale entries**: a neighbor may keep listing a node that has left the network or a battery-powered (sleepy) device it has not heard from recently, until the entry ages out. Use the refresh button to re-read current tables; sometimes a device restart is needed before its tables drop the obsolete entry.
96
136
 
97
137
  Unknown devices show as "Router (external)" or "End Device (external)" based on their radio behavior (rxOnWhenIdle). Since they're not commissioned to this fabric, we cannot query their actual Thread role (Leader, Router, etc.).
98
138
 
@@ -94,7 +94,7 @@ let WiFiGraph = class extends BaseNetworkGraph {
94
94
  const isSelected = String(apId) === String(this._selectedNodeId);
95
95
  graphNodes.push({
96
96
  id: apId,
97
- label: `AP ${bssid.slice(-8)}`,
97
+ label: `AP ${bssid}`,
98
98
  image: createWiFiRouterIconDataUrl(isSelected),
99
99
  shape: "image",
100
100
  networkType: "wifi",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/pages/network/wifi-graph.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1,4 +1,4 @@
1
- import { i, n, r, e, b as i$1, A, o as formatHex, d as b, h as handleAsync, g as t } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { i, n, r, e, b as i$1, A, o as formatHex, d as b, h as handleAsync, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { t as toBigIntAwareJson } from './main.js';
3
3
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
4
4
  import { p as parseJsonPayload } from './parse-json-payload-DU9TWKdu.js';
@@ -1,4 +1,4 @@
1
- import { i, n, r, e, b as i$1, A, o as formatHex, d as b, h as handleAsync, g as t } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { i, n, r, e, b as i$1, A, o as formatHex, d as b, h as handleAsync, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { t as toBigIntAwareJson } from './main.js';
3
3
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
4
4
  import { p as parseJsonPayload, i as isPlainObject } from './parse-json-payload-DU9TWKdu.js';
@@ -1,4 +1,4 @@
1
- import { r, c, a as clientContext, t as tickContext, g as t, b as i, d as b } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { r, c, a as clientContext, t as tickContext, g as t, b as i, d as b } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -52,18 +52,18 @@ let ComissionNodeDialog = class extends i {
52
52
  if (!this.client.serverInfo.bluetooth_enabled) {
53
53
  return;
54
54
  }
55
- import('./commission-node-wifi-BzeVHU3H.js');
55
+ import('./commission-node-wifi-DxAYNS1A.js');
56
56
  this._mode = "wifi";
57
57
  }
58
58
  _commissionThread() {
59
59
  if (!this.client.serverInfo.bluetooth_enabled) {
60
60
  return;
61
61
  }
62
- import('./commission-node-thread-BlC2ZhGB.js');
62
+ import('./commission-node-thread-djdz2dXW.js');
63
63
  this._mode = "thread";
64
64
  }
65
65
  _commissionExisting() {
66
- import('./commission-node-existing-Cf6SG9fC.js');
66
+ import('./commission-node-existing-B2M2hyDh.js');
67
67
  this._mode = "existing";
68
68
  }
69
69
  _nodeCommissioned(ev) {
@@ -71,7 +71,7 @@ let ComissionNodeDialog = class extends i {
71
71
  this._close();
72
72
  }
73
73
  _requestSettings() {
74
- import('./matter-dashboard-app-D7-YX94X.js').then(function (n) { return n.v; }).then(({
74
+ import('./matter-dashboard-app-CVi_GDky.js').then(function (n) { return n.v; }).then(({
75
75
  showSettingsDialog
76
76
  }) => {
77
77
  showSettingsDialog("network-credentials");
@@ -1,5 +1,5 @@
1
- import { r, c, a as clientContext, n, e, g as t, b as i, A, h as handleAsync, d as b, s as showAlertDialog } from './matter-dashboard-app-D7-YX94X.js';
2
- import { f as fireEvent } from './fire_event-B0dFAh3R.js';
1
+ import { r, c, a as clientContext, n, e, g as t, b as i, A, h as handleAsync, d as b, s as showAlertDialog } from './matter-dashboard-app-CVi_GDky.js';
2
+ import { f as fireEvent } from './fire_event-BleYfTLc.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- import { i, c, a as clientContext, n, r, e, b as i$1, A, h as handleAsync, d as b, j as mdiAccessPoint, s as showAlertDialog, g as t } from './matter-dashboard-app-D7-YX94X.js';
2
- import { f as fireEvent } from './fire_event-B0dFAh3R.js';
1
+ import { i, c, a as clientContext, n, r, e, b as i$1, A, h as handleAsync, d as b, j as mdiAccessPoint, s as showAlertDialog, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
+ import { f as fireEvent } from './fire_event-BleYfTLc.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- import { i, c, a as clientContext, n, r, e, b as i$1, A, h as handleAsync, d as b, m as mdiWifi, s as showAlertDialog, g as t } from './matter-dashboard-app-D7-YX94X.js';
2
- import { f as fireEvent } from './fire_event-B0dFAh3R.js';
1
+ import { i, c, a as clientContext, n, r, e, b as i$1, A, h as handleAsync, d as b, m as mdiWifi, s as showAlertDialog, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
+ import { f as fireEvent } from './fire_event-BleYfTLc.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- import { i, n, b as i$1, d as b, g as t } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { i, n, b as i$1, d as b, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { q as mixinDelegatesAria, b as i, _ as __decorate, n, A, u as e, d as b, i as i$1, g as t } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { q as mixinDelegatesAria, b as i, _ as __decorate, n, A, u as e, d as b, i as i$1, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
2
 
3
3
  /**
4
4
  * @license
@@ -801,7 +801,7 @@ const ThemeService = new ThemeServiceImpl();
801
801
  * SPDX-License-Identifier: Apache-2.0
802
802
  */
803
803
  async function main() {
804
- import('./matter-dashboard-app-D7-YX94X.js').then(function (n) { return n.x; });
804
+ import('./matter-dashboard-app-CVi_GDky.js').then(function (n) { return n.x; });
805
805
  let url = "";
806
806
  const isProductionServer = window.__MATTERJS_PRODUCTION_MODE__ === true || location.origin.includes(":5580") || location.href.includes("hassio_ingress") || location.href.includes("/api/ingress/");
807
807
  if (!isProductionServer) {
@@ -4040,7 +4040,7 @@ MdListItem = __decorate([t$1('md-list-item')], MdListItem);
4040
4040
  */
4041
4041
  const showSettingsDialog = async section => {
4042
4042
  var _document$querySelect;
4043
- await import('./settings-dialog-Di2Qnh3-.js');
4043
+ await import('./settings-dialog-BG5MgZcO.js');
4044
4044
  const dialog = document.createElement("settings-dialog");
4045
4045
  if (section) dialog.scrollToSection = section;
4046
4046
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
@@ -21796,7 +21796,7 @@ const clusters = {
21796
21796
  * SPDX-License-Identifier: Apache-2.0
21797
21797
  */
21798
21798
  const showDialogBox = async (type, dialogParams) => {
21799
- await import('./dialog-box-8CugytjX.js');
21799
+ await import('./dialog-box-tHvPVxDN.js');
21800
21800
  return new Promise(resolve => {
21801
21801
  const dialog = document.createElement("dialog-box");
21802
21802
  dialog.params = dialogParams;
@@ -21815,7 +21815,7 @@ const showPromptDialog = dialogParams => showDialogBox("prompt", dialogParams);
21815
21815
  */
21816
21816
  const showAttributeWriteDialog = async options => {
21817
21817
  var _document$querySelect;
21818
- await import('./attribute-write-dialog-f6XnfRjW.js');
21818
+ await import('./attribute-write-dialog-W7xpCE2E.js');
21819
21819
  const dialog = document.createElement("attribute-write-dialog");
21820
21820
  dialog.client = options.client;
21821
21821
  dialog.nodeId = options.nodeId;
@@ -21834,7 +21834,7 @@ const showAttributeWriteDialog = async options => {
21834
21834
  */
21835
21835
  const showCommandInvokeDialog = async options => {
21836
21836
  var _document$querySelect;
21837
- await import('./command-invoke-dialog-jzzpwI81.js');
21837
+ await import('./command-invoke-dialog-BAqAAdJw.js');
21838
21838
  const dialog = document.createElement("command-invoke-dialog");
21839
21839
  dialog.client = options.client;
21840
21840
  dialog.nodeId = options.nodeId;
@@ -22007,7 +22007,7 @@ MdTextButton = __decorate([t$1('md-text-button')], MdTextButton);
22007
22007
  */
22008
22008
  const showNodeBindingDialog = async (node, endpoint) => {
22009
22009
  var _document$querySelect;
22010
- await import('./node-binding-dialog-Dpjn-GtG.js');
22010
+ await import('./node-binding-dialog-B9IdqHrZ.js');
22011
22011
  const dialog = document.createElement("node-binding-dialog");
22012
22012
  dialog.node = node;
22013
22013
  dialog.endpoint = endpoint;
@@ -22021,7 +22021,7 @@ const showNodeBindingDialog = async (node, endpoint) => {
22021
22021
  */
22022
22022
  const showNodeLabelDialog = async (client, node) => {
22023
22023
  var _document$querySelect;
22024
- await import('./node-label-dialog-B31BzWy6.js');
22024
+ await import('./node-label-dialog-DVZSjsXU.js');
22025
22025
  const dialog = document.createElement("node-label-dialog");
22026
22026
  dialog.client = client;
22027
22027
  dialog.node = node;
@@ -44576,7 +44576,7 @@ let WiFiGraph = class extends BaseNetworkGraph {
44576
44576
  const isSelected = String(apId) === String(this._selectedNodeId);
44577
44577
  graphNodes.push({
44578
44578
  id: apId,
44579
- label: `AP ${bssid.slice(-8)}`,
44579
+ label: `AP ${bssid}`,
44580
44580
  image: createWiFiRouterIconDataUrl(isSelected),
44581
44581
  shape: "image",
44582
44582
  networkType: "wifi",
@@ -45512,7 +45512,7 @@ MatterNodeView = __decorateClass$3([t$1("matter-node-view")], MatterNodeView);
45512
45512
  */
45513
45513
  const showCommissionNodeDialog = async () => {
45514
45514
  var _document$querySelect;
45515
- await import('./commission-node-dialog-B3RBDYQU.js');
45515
+ await import('./commission-node-dialog-BTzCGgdy.js');
45516
45516
  const dialog = document.createElement("commission-node-dialog");
45517
45517
  (_document$querySelect = document.querySelector("matter-dashboard-app")) === null || _document$querySelect === void 0 || _document$querySelect.renderRoot.appendChild(dialog);
45518
45518
  };
@@ -1,4 +1,4 @@
1
- import { i, c, a as clientContext, n, e, b as i$1, p as showPromptDialog, s as showAlertDialog, A, d as b, h as handleAsync, g as t } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { i, c, a as clientContext, n, e, b as i$1, p as showPromptDialog, s as showAlertDialog, A, d as b, h as handleAsync, g as t } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { r, n, g as t, b as i, M as MAX_NODE_LABEL_LENGTH, d as b, w as writeNodeLabel, s as showAlertDialog } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { r, n, g as t, b as i, M as MAX_NODE_LABEL_LENGTH, d as b, w as writeNodeLabel, s as showAlertDialog } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { i, c, a as clientContext, t as tickContext, r, e, b as i$1, f as fireAndForget, s as showAlertDialog, d as b, A, h as handleAsync, g as t, n, D as DevModeService, m as mdiWifi, j as mdiAccessPoint, k as mdiEyeOff, l as mdiEye } from './matter-dashboard-app-D7-YX94X.js';
1
+ import { i, c, a as clientContext, t as tickContext, r, e, b as i$1, f as fireAndForget, s as showAlertDialog, d as b, A, h as handleAsync, g as t, n, D as DevModeService, m as mdiWifi, j as mdiAccessPoint, k as mdiEyeOff, l as mdiEye } from './matter-dashboard-app-CVi_GDky.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter-server/dashboard",
3
- "version": "0.8.0",
3
+ "version": "0.8.1-alpha.0-20260605-9f5c78b",
4
4
  "description": "Dashboard for OHF Matter Server",
5
5
  "homepage": "https://github.com/matter-js/matterjs-server",
6
6
  "bugs": {
@@ -33,8 +33,8 @@
33
33
  "dependencies": {
34
34
  "@lit/context": "^1.1.6",
35
35
  "@material/web": "^2.4.1",
36
- "@matter-server/custom-clusters": "0.8.0",
37
- "@matter-server/ws-client": "0.8.0",
36
+ "@matter-server/custom-clusters": "0.8.1-alpha.0-20260605-9f5c78b",
37
+ "@matter-server/ws-client": "0.8.1-alpha.0-20260605-9f5c78b",
38
38
  "@mdi/js": "^7.4.47",
39
39
  "lit": "^3.3.3",
40
40
  "tslib": "^2.8.1",
@@ -112,7 +112,7 @@ export class WiFiGraph extends BaseNetworkGraph {
112
112
 
113
113
  graphNodes.push({
114
114
  id: apId,
115
- label: `AP ${bssid.slice(-8)}`,
115
+ label: `AP ${bssid}`,
116
116
  image: createWiFiRouterIconDataUrl(isSelected),
117
117
  shape: "image",
118
118
  networkType: "wifi",