@matter/nodejs-shell 0.17.9 → 0.18.0-alpha.0-20260812-4d7f2790e
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 +11 -1
- package/dist/esm/MatterNode.js +237 -134
- package/dist/esm/MatterNode.js.map +1 -1
- package/dist/esm/app.js +13 -7
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/shell/cmd_cluster-attributes.js +64 -45
- package/dist/esm/shell/cmd_cluster-attributes.js.map +2 -2
- package/dist/esm/shell/cmd_cluster-commands.js +11 -9
- package/dist/esm/shell/cmd_cluster-commands.js.map +1 -1
- package/dist/esm/shell/cmd_cluster-events.js +36 -9
- package/dist/esm/shell/cmd_cluster-events.js.map +1 -1
- package/dist/esm/shell/cmd_commission.js +119 -93
- package/dist/esm/shell/cmd_commission.js.map +1 -1
- package/dist/esm/shell/cmd_discover.js +23 -21
- package/dist/esm/shell/cmd_discover.js.map +1 -1
- package/dist/esm/shell/cmd_icd.js +46 -30
- package/dist/esm/shell/cmd_icd.js.map +1 -1
- package/dist/esm/shell/cmd_identify.js +11 -7
- package/dist/esm/shell/cmd_identify.js.map +1 -1
- package/dist/esm/shell/cmd_nodes.js +189 -168
- package/dist/esm/shell/cmd_nodes.js.map +1 -1
- package/dist/esm/shell/cmd_session.js +3 -4
- package/dist/esm/shell/cmd_session.js.map +1 -1
- package/dist/esm/shell/cmd_subscribe.js +26 -12
- package/dist/esm/shell/cmd_subscribe.js.map +1 -1
- package/dist/esm/util/ClusterEndpoint.js +61 -0
- package/dist/esm/util/ClusterEndpoint.js.map +6 -0
- package/dist/esm/util/awaitSeeded.js +31 -0
- package/dist/esm/util/awaitSeeded.js.map +6 -0
- package/dist/esm/util/diagnosticLogging.js +99 -0
- package/dist/esm/util/diagnosticLogging.js.map +6 -0
- package/dist/esm/util/legacyStorageMigration.js +188 -0
- package/dist/esm/util/legacyStorageMigration.js.map +6 -0
- package/package.json +10 -11
- package/src/MatterNode.ts +298 -159
- package/src/app.ts +17 -9
- package/src/shell/cmd_cluster-attributes.ts +77 -53
- package/src/shell/cmd_cluster-commands.ts +12 -13
- package/src/shell/cmd_cluster-events.ts +38 -11
- package/src/shell/cmd_commission.ts +136 -113
- package/src/shell/cmd_discover.ts +36 -22
- package/src/shell/cmd_icd.ts +52 -32
- package/src/shell/cmd_identify.ts +11 -7
- package/src/shell/cmd_nodes.ts +226 -199
- package/src/shell/cmd_session.ts +3 -5
- package/src/shell/cmd_subscribe.ts +37 -14
- package/src/shell/webassets/index.html +1 -1
- package/src/tsconfig.json +0 -3
- package/src/util/ClusterEndpoint.ts +107 -0
- package/src/util/awaitSeeded.ts +43 -0
- package/src/util/diagnosticLogging.ts +117 -0
- package/src/util/legacyStorageMigration.ts +275 -0
|
@@ -3,18 +3,65 @@
|
|
|
3
3
|
* Copyright 2022-2026 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Diagnostic, Logger,
|
|
6
|
+
import { Diagnostic, ImplementationError, Logger, Seconds } from "@matter/general";
|
|
7
|
+
import { BasicInformationClient } from "@matter/node/behaviors/basic-information";
|
|
8
|
+
import { DescriptorClient } from "@matter/node/behaviors/descriptor";
|
|
7
9
|
import { DiscoveryCapabilitiesSchema, ManualPairingCodeCodec, NodeId, QrCode, QrPairingCodeCodec } from "@matter/types";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
+
import { GeneralCommissioning } from "@matter/types/clusters";
|
|
11
|
+
import { awaitSeeded } from "../util/awaitSeeded.js";
|
|
10
12
|
const logger = Logger.get("Commission");
|
|
13
|
+
function findCommissionedNode(theNode, nodeId) {
|
|
14
|
+
return theNode.node.peers.commissioned.find((peer) => peer.peerAddress?.nodeId === nodeId);
|
|
15
|
+
}
|
|
11
16
|
function commands(theNode) {
|
|
12
17
|
return {
|
|
13
18
|
command: "commission",
|
|
14
19
|
describe: "Handle device commissioning",
|
|
15
20
|
builder: (yargs) => yargs.command("pair", "Pair with a matter device", (yargs2) => {
|
|
16
|
-
return yargs2.
|
|
17
|
-
|
|
21
|
+
return yargs2.options({
|
|
22
|
+
pairingCode: {
|
|
23
|
+
describe: "pairing code",
|
|
24
|
+
default: void 0,
|
|
25
|
+
type: "string"
|
|
26
|
+
},
|
|
27
|
+
qrCode: {
|
|
28
|
+
describe: "QR code string (MT:...)",
|
|
29
|
+
default: void 0,
|
|
30
|
+
type: "string"
|
|
31
|
+
},
|
|
32
|
+
qrCodeIndex: {
|
|
33
|
+
describe: "Index of QR code entry if multiple (1..n)",
|
|
34
|
+
default: 1,
|
|
35
|
+
type: "number"
|
|
36
|
+
},
|
|
37
|
+
setupPinCode: {
|
|
38
|
+
describe: "setup pin code",
|
|
39
|
+
default: 20202021,
|
|
40
|
+
type: "number"
|
|
41
|
+
},
|
|
42
|
+
instanceId: {
|
|
43
|
+
alias: "i",
|
|
44
|
+
describe: "instance id",
|
|
45
|
+
type: "string"
|
|
46
|
+
},
|
|
47
|
+
discriminator: {
|
|
48
|
+
alias: "d",
|
|
49
|
+
description: "Long discriminator",
|
|
50
|
+
type: "number"
|
|
51
|
+
},
|
|
52
|
+
shortDiscriminator: {
|
|
53
|
+
alias: "s",
|
|
54
|
+
description: "Short discriminator",
|
|
55
|
+
type: "number"
|
|
56
|
+
},
|
|
57
|
+
ble: {
|
|
58
|
+
alias: "b",
|
|
59
|
+
description: "Also discover over BLE",
|
|
60
|
+
type: "boolean",
|
|
61
|
+
default: false
|
|
62
|
+
}
|
|
63
|
+
}).command(
|
|
64
|
+
"* [node-id] [ip] [port]",
|
|
18
65
|
"Commission a matter device",
|
|
19
66
|
(yargs3) => {
|
|
20
67
|
return yargs3.positional("node-id", {
|
|
@@ -32,16 +79,14 @@ function commands(theNode) {
|
|
|
32
79
|
});
|
|
33
80
|
},
|
|
34
81
|
async (argv) => {
|
|
35
|
-
const {
|
|
36
|
-
pairingCode,
|
|
37
|
-
qrCode,
|
|
38
|
-
nodeId: nodeIdStr,
|
|
39
|
-
ipPort,
|
|
40
|
-
ip,
|
|
41
|
-
ble = false,
|
|
42
|
-
instanceId
|
|
43
|
-
} = argv;
|
|
82
|
+
const { pairingCode, qrCode, nodeId: nodeIdStr, port, ip, ble, instanceId } = argv;
|
|
44
83
|
let { setupPinCode, discriminator, shortDiscriminator, qrCodeIndex } = argv;
|
|
84
|
+
if (ip === void 0 !== (port === void 0)) {
|
|
85
|
+
console.log(
|
|
86
|
+
"Known-address commissioning requires both <ip> and <port>; provide both or neither (to use discovery)."
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
45
90
|
if (typeof pairingCode === "string" && pairingCode.length > 0) {
|
|
46
91
|
const { shortDiscriminator: pairingCodeShortDiscriminator, passcode } = ManualPairingCodeCodec.decode(pairingCode);
|
|
47
92
|
shortDiscriminator = pairingCodeShortDiscriminator;
|
|
@@ -84,27 +129,16 @@ function commands(theNode) {
|
|
|
84
129
|
}
|
|
85
130
|
const nodeId = nodeIdStr !== void 0 ? NodeId(BigInt(nodeIdStr)) : void 0;
|
|
86
131
|
await theNode.start();
|
|
87
|
-
if (theNode.commissioningController === void 0) {
|
|
88
|
-
throw new Error("CommissioningController not initialized");
|
|
89
|
-
}
|
|
90
|
-
const options = {
|
|
91
|
-
discovery: {
|
|
92
|
-
knownAddress: ip !== void 0 && ipPort !== void 0 ? { ip, port: ipPort, type: "udp" } : void 0,
|
|
93
|
-
identifierData: instanceId !== void 0 ? { instanceId } : discriminator !== void 0 ? { longDiscriminator: discriminator } : shortDiscriminator !== void 0 ? { shortDiscriminator } : {},
|
|
94
|
-
discoveryCapabilities: {
|
|
95
|
-
ble,
|
|
96
|
-
onIpNetwork: true
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
passcode: setupPinCode,
|
|
100
|
-
...createDiagnosticCallbacks()
|
|
101
|
-
};
|
|
102
132
|
const strictAttestation = await theNode.Store.get(
|
|
103
133
|
"StrictAttestationValidation",
|
|
104
134
|
false
|
|
105
135
|
);
|
|
106
|
-
|
|
107
|
-
|
|
136
|
+
const commissioningOptions = {
|
|
137
|
+
passcode: setupPinCode,
|
|
138
|
+
discriminator,
|
|
139
|
+
nodeId,
|
|
140
|
+
// The shell subscribes on demand via the `subscribe` command, not at commission.
|
|
141
|
+
autoSubscribe: false,
|
|
108
142
|
regulatoryLocation: GeneralCommissioning.RegulatoryLocationType.Outdoor,
|
|
109
143
|
// Set to the most restrictive if relevant
|
|
110
144
|
regulatoryCountryCode: "XX",
|
|
@@ -120,86 +154,64 @@ function commands(theNode) {
|
|
|
120
154
|
return accept;
|
|
121
155
|
}
|
|
122
156
|
};
|
|
123
|
-
|
|
157
|
+
const { passcode: _passcode, wifiNetwork, ...loggable } = commissioningOptions;
|
|
158
|
+
console.log(
|
|
159
|
+
Diagnostic.json({
|
|
160
|
+
...loggable,
|
|
161
|
+
...wifiNetwork && {
|
|
162
|
+
wifiNetwork: { ...wifiNetwork, wifiCredentials: "<redacted>" }
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
);
|
|
124
166
|
await theNode.certificateService();
|
|
125
167
|
const wifiSsid = await theNode.Store.get("WiFiSsid", "");
|
|
126
168
|
const wifiCredentials = await theNode.Store.get("WiFiPassword", "");
|
|
127
169
|
if (wifiSsid.length > 0 && wifiCredentials.length > 0) {
|
|
128
|
-
|
|
170
|
+
commissioningOptions.wifiNetwork = { wifiSsid, wifiCredentials };
|
|
129
171
|
}
|
|
130
172
|
const threadOperationalDataset = await theNode.Store.get(
|
|
131
173
|
"ThreadOperationalDataset",
|
|
132
174
|
""
|
|
133
175
|
);
|
|
134
176
|
if (threadOperationalDataset.length > 0) {
|
|
135
|
-
|
|
177
|
+
commissioningOptions.threadNetwork = {
|
|
136
178
|
networkName: await theNode.Store.get("ThreadName", ""),
|
|
137
179
|
operationalDataset: threadOperationalDataset
|
|
138
180
|
};
|
|
139
181
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
182
|
+
let node;
|
|
183
|
+
if (ip !== void 0 && port !== void 0) {
|
|
184
|
+
node = await theNode.node.peers.forDescriptor({
|
|
185
|
+
addresses: [{ ip, port, type: "udp" }]
|
|
186
|
+
});
|
|
187
|
+
await node.commission(commissioningOptions);
|
|
188
|
+
} else {
|
|
189
|
+
const identifierData = instanceId !== void 0 ? { instanceId } : shortDiscriminator !== void 0 ? { shortDiscriminator } : {};
|
|
190
|
+
node = await theNode.node.peers.commission({
|
|
191
|
+
...identifierData,
|
|
192
|
+
...commissioningOptions,
|
|
193
|
+
discoveryCapabilities: { ble, onIpNetwork: true }
|
|
194
|
+
});
|
|
145
195
|
}
|
|
146
|
-
|
|
196
|
+
console.log("Commissioned Node:", node.peerAddress?.nodeId.toString());
|
|
197
|
+
if (!await awaitSeeded(node)) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const descriptor = node.maybeStateOf(DescriptorClient);
|
|
147
201
|
if (descriptor !== void 0) {
|
|
148
|
-
console.log(
|
|
149
|
-
console.log(
|
|
202
|
+
console.log(descriptor.deviceTypeList);
|
|
203
|
+
console.log(descriptor.serverList);
|
|
150
204
|
} else {
|
|
151
205
|
console.log("No Descriptor Cluster found. This should never happen!");
|
|
152
206
|
}
|
|
153
|
-
const info = node.
|
|
207
|
+
const info = node.maybeStateOf(BasicInformationClient);
|
|
154
208
|
if (info !== void 0) {
|
|
155
|
-
console.log(
|
|
209
|
+
console.log(info.productName);
|
|
156
210
|
} else {
|
|
157
211
|
console.log("No BasicInformation Cluster found. This should never happen!");
|
|
158
212
|
}
|
|
159
213
|
}
|
|
160
|
-
)
|
|
161
|
-
pairingCode: {
|
|
162
|
-
describe: "pairing code",
|
|
163
|
-
default: void 0,
|
|
164
|
-
type: "string"
|
|
165
|
-
},
|
|
166
|
-
qrCode: {
|
|
167
|
-
describe: "QR code string (MT:...)",
|
|
168
|
-
default: void 0,
|
|
169
|
-
type: "string"
|
|
170
|
-
},
|
|
171
|
-
qrCodeIndex: {
|
|
172
|
-
describe: "Index of QR code entry if multiple (1..n)",
|
|
173
|
-
default: 1,
|
|
174
|
-
type: "number"
|
|
175
|
-
},
|
|
176
|
-
setupPinCode: {
|
|
177
|
-
describe: "setup pin code",
|
|
178
|
-
default: 20202021,
|
|
179
|
-
type: "number"
|
|
180
|
-
},
|
|
181
|
-
instanceId: {
|
|
182
|
-
alias: "i",
|
|
183
|
-
describe: "instance id",
|
|
184
|
-
type: "string"
|
|
185
|
-
},
|
|
186
|
-
discriminator: {
|
|
187
|
-
alias: "d",
|
|
188
|
-
description: "Long discriminator",
|
|
189
|
-
type: "number"
|
|
190
|
-
},
|
|
191
|
-
shortDiscriminator: {
|
|
192
|
-
alias: "s",
|
|
193
|
-
description: "Short discriminator",
|
|
194
|
-
type: "number"
|
|
195
|
-
},
|
|
196
|
-
ble: {
|
|
197
|
-
alias: "b",
|
|
198
|
-
description: "Also discover over BLE",
|
|
199
|
-
type: "boolean",
|
|
200
|
-
default: false
|
|
201
|
-
}
|
|
202
|
-
});
|
|
214
|
+
);
|
|
203
215
|
}).command(
|
|
204
216
|
"open-basic-window <node-id> [timeout]",
|
|
205
217
|
"Open a basic commissioning window",
|
|
@@ -218,7 +230,10 @@ function commands(theNode) {
|
|
|
218
230
|
const { nodeId, timeout } = argv;
|
|
219
231
|
await theNode.start();
|
|
220
232
|
const node = (await theNode.connectAndGetNodes(nodeId, { autoSubscribe: false }))[0];
|
|
221
|
-
await node
|
|
233
|
+
if (!await awaitSeeded(node)) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
await node.openBasicCommissioningWindow(Seconds(timeout));
|
|
222
237
|
console.log(`Basic Commissioning Window for node ${nodeId} opened`);
|
|
223
238
|
}
|
|
224
239
|
).command(
|
|
@@ -239,9 +254,13 @@ function commands(theNode) {
|
|
|
239
254
|
await theNode.start();
|
|
240
255
|
const { nodeId, timeout } = argv;
|
|
241
256
|
const node = (await theNode.connectAndGetNodes(nodeId, { autoSubscribe: false }))[0];
|
|
242
|
-
|
|
257
|
+
if (!await awaitSeeded(node)) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const { qrPairingCode, manualPairingCode } = await node.openEnhancedCommissioningWindow(
|
|
261
|
+
Seconds(timeout)
|
|
262
|
+
);
|
|
243
263
|
console.log(`Enhanced Commissioning Window for node ${nodeId} opened`);
|
|
244
|
-
const { qrPairingCode, manualPairingCode } = data;
|
|
245
264
|
console.log(QrCode.get(qrPairingCode));
|
|
246
265
|
console.log(
|
|
247
266
|
`QR Code URL: https://project-chip.github.io/connectedhomeip/qrcode.html?data=${qrPairingCode}`
|
|
@@ -266,11 +285,18 @@ function commands(theNode) {
|
|
|
266
285
|
},
|
|
267
286
|
async (argv) => {
|
|
268
287
|
await theNode.start();
|
|
269
|
-
const { nodeId, force } = argv;
|
|
288
|
+
const { nodeId: nodeIdStr, force } = argv;
|
|
270
289
|
if (force) {
|
|
271
|
-
|
|
290
|
+
const node = findCommissionedNode(theNode, NodeId(BigInt(nodeIdStr)));
|
|
291
|
+
if (node === void 0) {
|
|
292
|
+
throw new ImplementationError(`Node ${nodeIdStr} not commissioned`);
|
|
293
|
+
}
|
|
294
|
+
await node.delete();
|
|
272
295
|
} else {
|
|
273
|
-
const node = (await theNode.connectAndGetNodes(
|
|
296
|
+
const node = (await theNode.connectAndGetNodes(nodeIdStr, { autoSubscribe: false }))[0];
|
|
297
|
+
if (!await awaitSeeded(node)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
274
300
|
await node.decommission();
|
|
275
301
|
}
|
|
276
302
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/shell/cmd_commission.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY,QAAQ,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY,qBAAqB,QAAQ,eAAe;AAEjE,SAAS,8BAA8B;AACvC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B,wBAAwB,QAAQ,QAAQ,0BAA0B;AACxG,SAAS,4BAA4B;AAGrC,SAAS,mBAAmB;AAE5B,MAAM,SAAS,OAAO,IAAI,YAAY;AAGtC,SAAS,qBAAqB,SAAqB,QAAwC;AACvF,SAAO,QAAQ,KAAK,MAAM,aAAa,KAAK,UAAQ,KAAK,aAAa,WAAW,MAAM;AAC3F;AAEe,SAAR,SAA0B,SAAqB;AAClD,SAAO;AAAA,IACH,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS,CAAC,UACN,MAEK,QAAQ,QAAQ,6BAA6B,CAAAA,WAAS;AACnD,aACIA,OAEK,QAAQ;AAAA,QACL,aAAa;AAAA,UACT,UAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,UACJ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QACV;AAAA,QACA,aAAa;AAAA,UACT,UAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QACV;AAAA,QACA,cAAc;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QACV;AAAA,QACA,YAAY;AAAA,UACR,OAAO;AAAA,UACP,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,eAAe;AAAA,UACX,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,QACA,oBAAoB;AAAA,UAChB,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,QACV;AAAA,QACA,KAAK;AAAA,UACD,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AAAA,MACJ,CAAC,EAEA;AAAA,QACG;AAAA,QACA;AAAA,QACA,CAAAA,WAAS;AACL,iBAAOA,OACF,WAAW,WAAW;AAAA,YACnB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,MAAM;AAAA,UACV,CAAC,EACA,WAAW,MAAM;AAAA,YACd,UAAU;AAAA,YACV,SAAS;AAAA,YACT,MAAM;AAAA,UACV,CAAC,EACA,WAAW,QAAQ;AAAA,YAChB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,MAAM;AAAA,UACV,CAAC;AAAA,QACT;AAAA,QACA,OAAM,SAAQ;AACV,gBAAM,EAAE,aAAa,QAAQ,QAAQ,WAAW,MAAM,IAAI,KAAK,WAAW,IAAI;AAC9E,cAAI,EAAE,cAAc,eAAe,oBAAoB,YAAY,IAAI;AAEvE,cAAK,OAAO,YAAgB,SAAS,SAAY;AAC7C,oBAAQ;AAAA,cACJ;AAAA,YACJ;AACA;AAAA,UACJ;AAEA,cAAI,OAAO,gBAAgB,YAAY,YAAY,SAAS,GAAG;AAC3D,kBAAM,EAAE,oBAAoB,+BAA+B,SAAS,IAChE,uBAAuB,OAAO,WAAW;AAC7C,iCAAqB;AACrB,2BAAe;AACf,4BAAgB;AAAA,UACpB,WAAW,OAAO,WAAW,YAAY,OAAO,SAAS,GAAG;AACxD,kBAAM,mBAAmB,mBAAmB,OAAO,MAAM;AACzD,gBAAI,OAAO,gBAAgB,UAAU;AACjC,kBAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AAC/B,wBAAQ,IAAI,8CAA8C;AAC1D,8BAAc;AAAA,cAClB;AAAA,YACJ;AACA,gBAAI,UAAU,OAAO,WAAW;AAChC,gBAAI,iBAAiB,SAAS,GAAG;AAC7B,kBAAI,UAAU,KAAK,UAAU,iBAAiB,QAAQ;AAClD,wBAAQ;AAAA,kBACJ,aAAa,iBAAiB,MAAM;AAAA,gBACxC;AACA,0BAAU;AAAA,cACd,OAAO;AACH,wBAAQ;AAAA,kBACJ,aAAa,iBAAiB,MAAM,8DAA8D,OAAO;AAAA,gBAC7G;AAAA,cACJ;AAAA,YACJ,OAAO;AACH,wBAAU;AAAA,YACd;AACA,kBAAM,WAAW,iBAAiB,UAAU,CAAC;AAC7C,4BAAgB,SAAS;AACzB,iCAAqB;AACrB,2BAAe,SAAS;AACxB,gBACI,4BAA4B,OAAO,SAAS,qBAAqB,EAAE,OACnE,CAAC,KACH;AACE,sBAAQ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,WAAW,kBAAkB,UAAa,uBAAuB,QAAW;AACxE,4BAAgB;AAAA,UACpB;AAEA,gBAAM,SAAS,cAAc,SAAY,OAAO,OAAO,SAAS,CAAC,IAAI;AACrE,gBAAM,QAAQ,MAAM;AAGpB,gBAAM,oBAAoB,MAAM,QAAQ,MAAM;AAAA,YAC1C;AAAA,YACA;AAAA,UACJ;AAEA,gBAAM,uBAAiE;AAAA,YACnE,UAAU;AAAA,YACV;AAAA,YACA;AAAA;AAAA,YAEA,eAAe;AAAA,YACf,oBAAoB,qBAAqB,uBAAuB;AAAA;AAAA,YAChE,uBAAuB;AAAA,YACvB,sBAAsB,cAAY;AAC9B,oBAAM,SAAS,oBACT,SAAS,MAAM,OAAK,EAAE,UAAU,OAAO,IACvC;AACN,yBAAW,KAAK,UAAU;AACtB,uBAAO;AAAA,kBACH,uBAAuB,SAAS,aAAa,UAAU,KAAK,EAAE,KAAK;AAAA,kBACnE,EAAE;AAAA,kBACF,EAAE;AAAA,gBACN;AAAA,cACJ;AACA,qBAAO;AAAA,YACX;AAAA,UACJ;AAKA,gBAAM,EAAE,UAAU,WAAW,aAAa,GAAG,SAAS,IAAI;AAC1D,kBAAQ;AAAA,YACJ,WAAW,KAAK;AAAA,cACZ,GAAG;AAAA,cACH,GAAI,eAAe;AAAA,gBACf,aAAa,EAAE,GAAG,aAAa,iBAAiB,aAAa;AAAA,cACjE;AAAA,YACJ,CAAC;AAAA,UACL;AAEA,gBAAM,QAAQ,mBAAmB;AAEjC,gBAAM,WAAW,MAAM,QAAQ,MAAM,IAAY,YAAY,EAAE;AAC/D,gBAAM,kBAAkB,MAAM,QAAQ,MAAM,IAAY,gBAAgB,EAAE;AAC1E,cAAI,SAAS,SAAS,KAAK,gBAAgB,SAAS,GAAG;AACnD,iCAAqB,cAAc,EAAE,UAAU,gBAAgB;AAAA,UACnE;AACA,gBAAM,2BAA2B,MAAM,QAAQ,MAAM;AAAA,YACjD;AAAA,YACA;AAAA,UACJ;AACA,cAAI,yBAAyB,SAAS,GAAG;AACrC,iCAAqB,gBAAgB;AAAA,cACjC,aAAa,MAAM,QAAQ,MAAM,IAAY,cAAc,EAAE;AAAA,cAC7D,oBAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,cAAI;AACJ,cAAI,OAAO,UAAa,SAAS,QAAW;AAGxC,mBAAO,MAAM,QAAQ,KAAK,MAAM,cAAc;AAAA,cAC1C,WAAW,CAAC,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC;AAAA,YACzC,CAAC;AACD,kBAAM,KAAK,WAAW,oBAAoB;AAAA,UAC9C,OAAO;AACH,kBAAM,iBACF,eAAe,SACT,EAAE,WAAW,IACb,uBAAuB,SACrB,EAAE,mBAAmB,IACrB,CAAC;AACb,mBAAO,MAAM,QAAQ,KAAK,MAAM,WAAW;AAAA,cACvC,GAAG;AAAA,cACH,GAAG;AAAA,cACH,uBAAuB,EAAE,KAAK,aAAa,KAAK;AAAA,YACpD,CAAC;AAAA,UACL;AAEA,kBAAQ,IAAI,sBAAsB,KAAK,aAAa,OAAO,SAAS,CAAC;AAErE,cAAI,CAAE,MAAM,YAAY,IAAI,GAAI;AAC5B;AAAA,UACJ;AAGA,gBAAM,aAAa,KAAK,aAAa,gBAAgB;AACrD,cAAI,eAAe,QAAW;AAC1B,oBAAQ,IAAI,WAAW,cAAc;AACrC,oBAAQ,IAAI,WAAW,UAAU;AAAA,UACrC,OAAO;AACH,oBAAQ,IAAI,wDAAwD;AAAA,UACxE;AAEA,gBAAM,OAAO,KAAK,aAAa,sBAAsB;AACrD,cAAI,SAAS,QAAW;AACpB,oBAAQ,IAAI,KAAK,WAAW;AAAA,UAChC,OAAO;AACH,oBAAQ,IAAI,8DAA8D;AAAA,UAC9E;AAAA,QACJ;AAAA,MACJ;AAAA,IAEZ,CAAC,EACA;AAAA,MACG;AAAA,MACA;AAAA,MACA,CAAAA,WAAS;AACL,eAAOA,OACF,WAAW,WAAW;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,cAAc;AAAA,QAClB,CAAC,EACA,WAAW,WAAW;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC;AAAA,MACT;AAAA,MACA,OAAM,SAAQ;AACV,cAAM,EAAE,QAAQ,QAAQ,IAAI;AAC5B,cAAM,QAAQ,MAAM;AACpB,cAAM,QAAQ,MAAM,QAAQ,mBAAmB,QAAQ,EAAE,eAAe,MAAM,CAAC,GAAG,CAAC;AACnF,YAAI,CAAE,MAAM,YAAY,IAAI,GAAI;AAC5B;AAAA,QACJ;AAEA,cAAM,KAAK,6BAA6B,QAAQ,OAAO,CAAC;AAExD,gBAAQ,IAAI,uCAAuC,MAAM,SAAS;AAAA,MACtE;AAAA,IACJ,EACC;AAAA,MACG;AAAA,MACA;AAAA,MACA,CAAAA,WAAS;AACL,eAAOA,OACF,WAAW,WAAW;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,cAAc;AAAA,QAClB,CAAC,EACA,WAAW,WAAW;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,QACb,CAAC;AAAA,MACT;AAAA,MACA,OAAM,SAAQ;AACV,cAAM,QAAQ,MAAM;AACpB,cAAM,EAAE,QAAQ,QAAQ,IAAI;AAC5B,cAAM,QAAQ,MAAM,QAAQ,mBAAmB,QAAQ,EAAE,eAAe,MAAM,CAAC,GAAG,CAAC;AACnF,YAAI,CAAE,MAAM,YAAY,IAAI,GAAI;AAC5B;AAAA,QACJ;AACA,cAAM,EAAE,eAAe,kBAAkB,IAAI,MAAM,KAAK;AAAA,UACpD,QAAQ,OAAO;AAAA,QACnB;AAEA,gBAAQ,IAAI,0CAA0C,MAAM,SAAS;AAErE,gBAAQ,IAAI,OAAO,IAAI,aAAa,CAAC;AACrC,gBAAQ;AAAA,UACJ,gFAAgF,aAAa;AAAA,QACjG;AACA,gBAAQ,IAAI,wBAAwB,iBAAiB,EAAE;AAAA,MAC3D;AAAA,IACJ,EACC;AAAA,MACG;AAAA,MACA;AAAA,MACA,CAAAA,WAAS;AACL,eAAOA,OACF,WAAW,WAAW;AAAA,UACnB,UAAU;AAAA,UACV,MAAM;AAAA,UACN,cAAc;AAAA,QAClB,CAAC,EACA,QAAQ;AAAA,UACL,OAAO;AAAA,YACH,UAAU;AAAA,YACV,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,QACJ,CAAC;AAAA,MACT;AAAA,MACA,OAAM,SAAQ;AACV,cAAM,QAAQ,MAAM;AACpB,cAAM,EAAE,QAAQ,WAAW,MAAM,IAAI;AACrC,YAAI,OAAO;AAEP,gBAAM,OAAO,qBAAqB,SAAS,OAAO,OAAO,SAAS,CAAC,CAAC;AACpE,cAAI,SAAS,QAAW;AACpB,kBAAM,IAAI,oBAAoB,QAAQ,SAAS,mBAAmB;AAAA,UACtE;AACA,gBAAM,KAAK,OAAO;AAAA,QACtB,OAAO;AACH,gBAAM,QAAQ,MAAM,QAAQ,mBAAmB,WAAW,EAAE,eAAe,MAAM,CAAC,GAAG,CAAC;AACtF,cAAI,CAAE,MAAM,YAAY,IAAI,GAAI;AAC5B;AAAA,UACJ;AACA,gBAAM,KAAK,aAAa;AAAA,QAC5B;AAAA,MACJ;AAAA,IACJ;AAAA,IACR,SAAS,OAAO,SAAc;AAC1B,WAAK,YAAY;AAAA,IACrB;AAAA,EACJ;AACJ;",
|
|
5
5
|
"names": ["yargs"]
|
|
6
6
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2022-2026 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Diagnostic, Seconds } from "@matter/general";
|
|
6
|
+
import { ChannelType, Diagnostic, Seconds } from "@matter/general";
|
|
7
7
|
import { ManualPairingCodeCodec, VendorId } from "@matter/types";
|
|
8
8
|
function commands(theNode) {
|
|
9
9
|
return {
|
|
@@ -75,33 +75,35 @@ function commands(theNode) {
|
|
|
75
75
|
discriminator = void 0;
|
|
76
76
|
}
|
|
77
77
|
await theNode.start();
|
|
78
|
-
if (theNode.commissioningController === void 0) {
|
|
79
|
-
throw new Error("CommissioningController not initialized");
|
|
80
|
-
}
|
|
81
78
|
const identifierData = discriminator !== void 0 ? { longDiscriminator: discriminator } : shortDiscriminator !== void 0 ? { shortDiscriminator } : vendorId !== void 0 ? { vendorId: VendorId(vendorId) } : productId !== void 0 ? { productId } : deviceType !== void 0 ? { deviceType } : {};
|
|
82
79
|
console.log(
|
|
83
80
|
`Discover devices with identifier ${Diagnostic.json(
|
|
84
81
|
identifierData
|
|
85
82
|
)} for ${once ? "first match or " : ""}${timeoutSeconds} seconds.`
|
|
86
83
|
);
|
|
87
|
-
const
|
|
88
|
-
identifierData,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
84
|
+
const discovery = theNode.node.peers.discover({
|
|
85
|
+
...identifierData,
|
|
86
|
+
timeout: Seconds(timeoutSeconds),
|
|
87
|
+
scannerFilter: (scanner) => scanner.type === ChannelType.UDP || ble && scanner.type === ChannelType.BLE
|
|
88
|
+
});
|
|
89
|
+
const seen = /* @__PURE__ */ new Set();
|
|
90
|
+
discovery.discovered.on((node) => {
|
|
91
|
+
const { deviceIdentifier, addresses } = node.state.commissioning;
|
|
92
|
+
const id = deviceIdentifier || (addresses ?? []).map((a) => JSON.stringify(a)).sort().join("|");
|
|
93
|
+
if (seen.has(id)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
seen.add(id);
|
|
97
|
+
console.log(`Discovered device ${Diagnostic.json(node.state.commissioning)}`);
|
|
98
|
+
if (once) {
|
|
99
|
+
discovery.stop();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const results = await discovery;
|
|
103
|
+
console.log(
|
|
104
|
+
`Discovered ${results.length} devices`,
|
|
105
|
+
results.map((node) => node.state.commissioning)
|
|
103
106
|
);
|
|
104
|
-
console.log(`Discovered ${results.length} devices`, results);
|
|
105
107
|
}
|
|
106
108
|
),
|
|
107
109
|
handler: async (argv) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/shell/cmd_discover.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY,eAAe;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -3,18 +3,20 @@
|
|
|
3
3
|
* Copyright 2022-2026 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Duration, Millis, ObserverGroup } from "@matter/general";
|
|
7
|
-
import { IcdClient, IcdMultiAdminError } from "@matter/node";
|
|
6
|
+
import { Duration, ImplementationError, Millis, ObserverGroup } from "@matter/general";
|
|
7
|
+
import { IcdClient, IcdMultiAdminError, NodeConnectionState } from "@matter/node";
|
|
8
8
|
import { IcdManagementClient } from "@matter/node/behaviors/icd-management";
|
|
9
9
|
import { NodeId, SubjectId, VendorId } from "@matter/types";
|
|
10
10
|
import { IcdManagement } from "@matter/types/clusters/icd-management";
|
|
11
|
-
import {
|
|
11
|
+
import { awaitSeeded } from "../util/awaitSeeded.js";
|
|
12
12
|
const watchers = /* @__PURE__ */ new Map();
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
function findCommissionedNode(theNode, nodeId) {
|
|
14
|
+
return theNode.node.peers.commissioned.find((peer) => peer.peerAddress?.nodeId === nodeId);
|
|
15
|
+
}
|
|
16
|
+
async function printStatus(nodeId, clientNode) {
|
|
15
17
|
if (!clientNode.behaviors.has(IcdClient)) {
|
|
16
|
-
if (!
|
|
17
|
-
console.log(`node ${
|
|
18
|
+
if (!clientNode.lifecycle.isSeeded) {
|
|
19
|
+
console.log(`node ${nodeId}: uninitialized (no cached data yet)`);
|
|
18
20
|
}
|
|
19
21
|
return;
|
|
20
22
|
}
|
|
@@ -23,10 +25,10 @@ async function printStatus(paired) {
|
|
|
23
25
|
const supportsLit = IcdClient.litSupported(clientNode);
|
|
24
26
|
const awake = await clientNode.act((agent) => agent.get(IcdClient).awake);
|
|
25
27
|
const operatingModeLabel = mgmt === void 0 ? "n/a" : IcdManagement.OperatingMode[mgmt.operatingMode ?? -1] ?? mgmt.operatingMode ?? "unknown";
|
|
26
|
-
const marker =
|
|
28
|
+
const marker = clientNode.lifecycle.isSeeded ? "" : " [uninitialized]";
|
|
27
29
|
console.log(
|
|
28
30
|
[
|
|
29
|
-
`node ${
|
|
31
|
+
`node ${nodeId}:${marker}`,
|
|
30
32
|
` registered=${icd.registered}`,
|
|
31
33
|
` available=${icd.available}`,
|
|
32
34
|
` awake=${awake}`,
|
|
@@ -45,7 +47,10 @@ function selectsAll(nodeIdStr) {
|
|
|
45
47
|
}
|
|
46
48
|
async function targetNodeIds(theNode, nodeIdStr) {
|
|
47
49
|
await theNode.start();
|
|
48
|
-
|
|
50
|
+
if (!selectsAll(nodeIdStr)) {
|
|
51
|
+
return [NodeId(BigInt(nodeIdStr))];
|
|
52
|
+
}
|
|
53
|
+
return theNode.node.peers.commissioned.map((peer) => peer.peerAddress?.nodeId).filter((nodeId) => nodeId !== void 0);
|
|
49
54
|
}
|
|
50
55
|
async function eachNode(theNode, nodeIdStr, action) {
|
|
51
56
|
const all = selectsAll(nodeIdStr);
|
|
@@ -65,18 +70,18 @@ async function eachNode(theNode, nodeIdStr, action) {
|
|
|
65
70
|
}
|
|
66
71
|
}
|
|
67
72
|
}
|
|
68
|
-
async function
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
throw new
|
|
73
|
+
async function connectedIcdNode(theNode, nodeId) {
|
|
74
|
+
const clientNode = (await theNode.connectAndGetNodes(String(nodeId)))[0];
|
|
75
|
+
if (clientNode === void 0) {
|
|
76
|
+
throw new ImplementationError(`Node ${nodeId} not found / not connected`);
|
|
72
77
|
}
|
|
73
|
-
if (!
|
|
74
|
-
throw new
|
|
78
|
+
if (!await awaitSeeded(clientNode, { quiet: true })) {
|
|
79
|
+
throw new ImplementationError(`Node ${nodeId} did not become ready (offline?)`);
|
|
75
80
|
}
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return
|
|
81
|
+
if (!clientNode.behaviors.has(IcdClient)) {
|
|
82
|
+
throw new ImplementationError(`Node ${nodeId} is not an ICD device (no IcdManagement cluster)`);
|
|
83
|
+
}
|
|
84
|
+
return clientNode;
|
|
80
85
|
}
|
|
81
86
|
function stopWatch(nodeIdStr) {
|
|
82
87
|
if (selectsAll(nodeIdStr)) {
|
|
@@ -96,8 +101,7 @@ async function startWatch(theNode, nodeId) {
|
|
|
96
101
|
const key = String(nodeId);
|
|
97
102
|
watchers.get(key)?.close();
|
|
98
103
|
watchers.delete(key);
|
|
99
|
-
const
|
|
100
|
-
const clientNode = paired.node;
|
|
104
|
+
const clientNode = await connectedIcdNode(theNode, nodeId);
|
|
101
105
|
const observers = new ObserverGroup();
|
|
102
106
|
const stamp = (msg) => console.log(`[icd ${nodeId}] ${msg}`);
|
|
103
107
|
const wakefulnessSuffix = async () => {
|
|
@@ -121,9 +125,12 @@ async function startWatch(theNode, nodeId) {
|
|
|
121
125
|
observers.on(events.checkInMissed, async () => stamp(`check-in MISSED ${await wakefulnessSuffix()}`));
|
|
122
126
|
observers.on(events.keyRefreshed, () => stamp("key refreshed"));
|
|
123
127
|
observers.on(events.available$Changed, (value) => stamp(`available=${value}`));
|
|
124
|
-
observers.on(
|
|
128
|
+
observers.on(
|
|
129
|
+
clientNode.lifecycle.connectionStateChanged,
|
|
130
|
+
(state) => stamp(`connection=${NodeConnectionState[state] ?? state}`)
|
|
131
|
+
);
|
|
125
132
|
watchers.set(key, observers);
|
|
126
|
-
clientNode.lifecycle.destroyed
|
|
133
|
+
observers.on(clientNode.lifecycle.destroyed, () => {
|
|
127
134
|
watchers.get(key)?.close();
|
|
128
135
|
watchers.delete(key);
|
|
129
136
|
});
|
|
@@ -160,7 +167,7 @@ function commands(theNode) {
|
|
|
160
167
|
ignoredVendors: argv.ignoreVendor?.map((v) => VendorId(Number(v)))
|
|
161
168
|
};
|
|
162
169
|
await eachNode(theNode, argv.nodeId, async (nodeId) => {
|
|
163
|
-
const clientNode = await
|
|
170
|
+
const clientNode = await connectedIcdNode(theNode, nodeId);
|
|
164
171
|
try {
|
|
165
172
|
await clientNode.act((agent) => agent.get(IcdClient).register(options));
|
|
166
173
|
console.log(`Registered as Check-In client on node ${nodeId}`);
|
|
@@ -190,9 +197,14 @@ function commands(theNode) {
|
|
|
190
197
|
handler: async (argv) => {
|
|
191
198
|
await eachNode(theNode, argv.nodeId, async (nodeId) => {
|
|
192
199
|
if (argv.force) {
|
|
193
|
-
const clientNode2 = (
|
|
200
|
+
const clientNode2 = findCommissionedNode(theNode, nodeId);
|
|
201
|
+
if (clientNode2 === void 0) {
|
|
202
|
+
throw new ImplementationError(`Node ${nodeId} is not commissioned`);
|
|
203
|
+
}
|
|
194
204
|
if (!clientNode2.behaviors.has(IcdClient)) {
|
|
195
|
-
throw new
|
|
205
|
+
throw new ImplementationError(
|
|
206
|
+
`Node ${nodeId} is not an ICD device (no IcdManagement cluster)`
|
|
207
|
+
);
|
|
196
208
|
}
|
|
197
209
|
await clientNode2.act((agent) => agent.get(IcdClient).forget());
|
|
198
210
|
console.log(
|
|
@@ -200,7 +212,7 @@ function commands(theNode) {
|
|
|
200
212
|
);
|
|
201
213
|
return;
|
|
202
214
|
}
|
|
203
|
-
const clientNode = await
|
|
215
|
+
const clientNode = await connectedIcdNode(theNode, nodeId);
|
|
204
216
|
await clientNode.act((agent) => agent.get(IcdClient).unregister());
|
|
205
217
|
console.log(`Unregistered Check-In client on node ${nodeId}`);
|
|
206
218
|
});
|
|
@@ -219,7 +231,7 @@ function commands(theNode) {
|
|
|
219
231
|
}),
|
|
220
232
|
handler: async (argv) => {
|
|
221
233
|
await eachNode(theNode, argv.nodeId, async (nodeId) => {
|
|
222
|
-
const clientNode = await
|
|
234
|
+
const clientNode = await connectedIcdNode(theNode, nodeId);
|
|
223
235
|
const promised = await clientNode.act(
|
|
224
236
|
(agent) => agent.get(IcdClient).stayActive(Millis(argv.durationMs))
|
|
225
237
|
);
|
|
@@ -238,7 +250,11 @@ function commands(theNode) {
|
|
|
238
250
|
}
|
|
239
251
|
for (const nodeId of nodeIds) {
|
|
240
252
|
try {
|
|
241
|
-
|
|
253
|
+
const clientNode = findCommissionedNode(theNode, nodeId);
|
|
254
|
+
if (clientNode === void 0) {
|
|
255
|
+
throw new ImplementationError(`Node ${nodeId} is not commissioned`);
|
|
256
|
+
}
|
|
257
|
+
await printStatus(nodeId, clientNode);
|
|
242
258
|
} catch (e) {
|
|
243
259
|
console.log(
|
|
244
260
|
`node ${nodeId}: unavailable (${e instanceof Error ? e.message : String(e)})`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/shell/cmd_icd.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,UAAU,QAAQ,qBAAqB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["clientNode"]
|
|
6
6
|
}
|