zwave-js 12.12.4 → 12.13.0
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/build/lib/node/Node.d.ts +20 -1
- package/build/lib/node/Node.d.ts.map +1 -1
- package/build/lib/node/Node.js +211 -38
- package/build/lib/node/Node.js.map +1 -1
- package/build/lib/node/_Types.d.ts +30 -0
- package/build/lib/node/_Types.d.ts.map +1 -1
- package/build/lib/node/_Types.js +5 -1
- package/build/lib/node/_Types.js.map +1 -1
- package/package.json +9 -9
package/build/lib/node/Node.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { DeviceClass } from "./DeviceClass";
|
|
|
10
10
|
import { type NodeDump } from "./Dump";
|
|
11
11
|
import { Endpoint } from "./Endpoint";
|
|
12
12
|
import { type NodeStatistics, NodeStatisticsHost } from "./NodeStatistics";
|
|
13
|
-
import type
|
|
13
|
+
import { type DateAndTime, type LifelineHealthCheckResult, type LifelineHealthCheckSummary, type LinkReliabilityCheckOptions, type LinkReliabilityCheckResult, type RefreshInfoOptions, type RouteHealthCheckResult, type RouteHealthCheckSummary, type ZWaveNodeEventCallbacks } from "./_Types";
|
|
14
14
|
import { InterviewStage, NodeStatus } from "./_Types";
|
|
15
15
|
export interface ZWaveNode extends TypedEventEmitter<ZWaveNodeEventCallbacks & StatisticsEventCallbacksWithSelf<ZWaveNode, NodeStatistics>>, NodeStatisticsHost {
|
|
16
16
|
}
|
|
@@ -438,6 +438,25 @@ export declare class ZWaveNode extends Endpoint implements SecurityClassOwner, I
|
|
|
438
438
|
*/
|
|
439
439
|
checkRouteHealth(targetNodeId: number, rounds?: number, onProgress?: (round: number, totalRounds: number, lastRating: number, lastResult: RouteHealthCheckResult) => void): Promise<RouteHealthCheckSummary>;
|
|
440
440
|
private checkRouteHealthInternal;
|
|
441
|
+
private _linkReliabilityCheckInProgress;
|
|
442
|
+
/**
|
|
443
|
+
* Returns whether a link reliability check is currently in progress for this node
|
|
444
|
+
*/
|
|
445
|
+
isLinkReliabilityCheckInProgress(): boolean;
|
|
446
|
+
private _linkReliabilityCheckAborted;
|
|
447
|
+
private _abortLinkReliabilityCheckPromise;
|
|
448
|
+
/**
|
|
449
|
+
* Aborts an ongoing link reliability check if one is currently in progress.
|
|
450
|
+
*
|
|
451
|
+
* **Note:** The link reliability check may take a few seconds to actually be aborted.
|
|
452
|
+
* When it is, the promise returned by {@link checkLinkReliability} will be resolved with the results obtained so far.
|
|
453
|
+
*/
|
|
454
|
+
abortLinkReliabilityCheck(): void;
|
|
455
|
+
/**
|
|
456
|
+
* Tests the reliability of the link between the controller and this node and returns the results.
|
|
457
|
+
*/
|
|
458
|
+
checkLinkReliability(options: LinkReliabilityCheckOptions): Promise<LinkReliabilityCheckResult>;
|
|
459
|
+
private checkLinkReliabilityBasicSetOnOff;
|
|
441
460
|
/**
|
|
442
461
|
* Sets the current date, time and timezone (or a subset of those) on the node using one or more of the respective CCs.
|
|
443
462
|
* Returns whether the operation was successful.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../../src/lib/node/Node.ts"],"names":[],"mappings":";AAAA,OAAO,EAWN,KAAK,0BAA0B,EAI/B,KAAK,oBAAoB,EAezB,UAAU,EAIV,KAAK,kBAAkB,EAQvB,iBAAiB,EACjB,iBAAiB,EAOjB,MAAM,cAAc,CAAC;AAiGtB,OAAO,EACN,KAAK,cAAc,EAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,KAAK,YAAY,EAIjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,cAAc,EACd,KAAK,QAAQ,EACb,QAAQ,EAER,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAIlB,QAAQ,EACR,KAAK,iBAAiB,EACtB,eAAe,EACf,SAAS,EAGT,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAKvB,KAAK,iBAAiB,EAEtB,OAAO,EACP,KAAK,OAAO,EACZ,aAAa,EAgCb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAGN,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../../src/lib/node/Node.ts"],"names":[],"mappings":"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"}
|
package/build/lib/node/Node.js
CHANGED
|
@@ -89,6 +89,7 @@ const NodeReadyMachine_1 = require("./NodeReadyMachine");
|
|
|
89
89
|
const NodeStatistics_1 = require("./NodeStatistics");
|
|
90
90
|
const NodeStatusMachine_1 = require("./NodeStatusMachine");
|
|
91
91
|
const _Types_1 = require("./_Types");
|
|
92
|
+
const _Types_2 = require("./_Types");
|
|
92
93
|
const nodeUtils = __importStar(require("./utils"));
|
|
93
94
|
const MAX_ASSOCIATIONS = 1;
|
|
94
95
|
/**
|
|
@@ -272,30 +273,30 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
272
273
|
this.emit(eventName, this, outArg);
|
|
273
274
|
}
|
|
274
275
|
statusMachine;
|
|
275
|
-
_status =
|
|
276
|
+
_status = _Types_2.NodeStatus.Unknown;
|
|
276
277
|
onStatusChange(newStatus) {
|
|
277
278
|
// Ignore duplicate events
|
|
278
279
|
if (newStatus === this._status)
|
|
279
280
|
return;
|
|
280
281
|
const oldStatus = this._status;
|
|
281
282
|
this._status = newStatus;
|
|
282
|
-
if (this._status ===
|
|
283
|
+
if (this._status === _Types_2.NodeStatus.Asleep) {
|
|
283
284
|
this.emit("sleep", this, oldStatus);
|
|
284
285
|
}
|
|
285
|
-
else if (this._status ===
|
|
286
|
+
else if (this._status === _Types_2.NodeStatus.Awake) {
|
|
286
287
|
this.emit("wake up", this, oldStatus);
|
|
287
288
|
}
|
|
288
|
-
else if (this._status ===
|
|
289
|
+
else if (this._status === _Types_2.NodeStatus.Dead) {
|
|
289
290
|
this.emit("dead", this, oldStatus);
|
|
290
291
|
}
|
|
291
|
-
else if (this._status ===
|
|
292
|
+
else if (this._status === _Types_2.NodeStatus.Alive) {
|
|
292
293
|
this.emit("alive", this, oldStatus);
|
|
293
294
|
}
|
|
294
295
|
// To be marked ready, a node must be known to be not dead.
|
|
295
296
|
// This means that listening nodes must have communicated with us and
|
|
296
297
|
// sleeping nodes are assumed to be ready
|
|
297
|
-
this.readyMachine.send(this._status !==
|
|
298
|
-
&& this._status !==
|
|
298
|
+
this.readyMachine.send(this._status !== _Types_2.NodeStatus.Unknown
|
|
299
|
+
&& this._status !== _Types_2.NodeStatus.Dead
|
|
299
300
|
? "NOT_DEAD"
|
|
300
301
|
: "MAYBE_DEAD");
|
|
301
302
|
}
|
|
@@ -338,7 +339,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
338
339
|
if (!this.canSleep || !this.supportsCC(core_1.CommandClasses["Wake Up"])) {
|
|
339
340
|
throw new core_1.ZWaveError(`Node ${this.id} does not support wakeup!`, core_1.ZWaveErrorCodes.CC_NotSupported);
|
|
340
341
|
}
|
|
341
|
-
else if (this._status ===
|
|
342
|
+
else if (this._status === _Types_2.NodeStatus.Awake) {
|
|
342
343
|
return Promise.resolve();
|
|
343
344
|
}
|
|
344
345
|
return new Promise((resolve) => {
|
|
@@ -1085,7 +1086,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1085
1086
|
*/
|
|
1086
1087
|
get interviewStage() {
|
|
1087
1088
|
return (this.driver.cacheGet(NetworkCache_1.cacheKeys.node(this.id).interviewStage)
|
|
1088
|
-
??
|
|
1089
|
+
?? _Types_2.InterviewStage.None);
|
|
1089
1090
|
}
|
|
1090
1091
|
set interviewStage(value) {
|
|
1091
1092
|
this.driver.cacheSet(NetworkCache_1.cacheKeys.node(this.id).interviewStage, value);
|
|
@@ -1172,7 +1173,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1172
1173
|
if (resetSecurityClasses)
|
|
1173
1174
|
this.securityClasses.clear();
|
|
1174
1175
|
this._interviewAttempts = 0;
|
|
1175
|
-
this.interviewStage =
|
|
1176
|
+
this.interviewStage = _Types_2.InterviewStage.None;
|
|
1176
1177
|
this._ready = false;
|
|
1177
1178
|
this.deviceClass = undefined;
|
|
1178
1179
|
this.isListening = undefined;
|
|
@@ -1187,6 +1188,9 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1187
1188
|
this.deviceConfigHash = undefined;
|
|
1188
1189
|
this._hasEmittedNoS0NetworkKeyError = false;
|
|
1189
1190
|
this._hasEmittedNoS2NetworkKeyError = false;
|
|
1191
|
+
for (const ep of this.getAllEndpoints()) {
|
|
1192
|
+
ep["reset"]();
|
|
1193
|
+
}
|
|
1190
1194
|
this._valueDB.clear({ noEvent: true });
|
|
1191
1195
|
this._endpointInstances.clear();
|
|
1192
1196
|
super.reset();
|
|
@@ -1226,7 +1230,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1226
1230
|
* for a specific node, use `node.refreshInfo()` instead
|
|
1227
1231
|
*/
|
|
1228
1232
|
async interviewInternal() {
|
|
1229
|
-
if (this.interviewStage ===
|
|
1233
|
+
if (this.interviewStage === _Types_2.InterviewStage.Complete) {
|
|
1230
1234
|
this.driver.controllerLog.logNode(this.id, `skipping interview because it is already completed`);
|
|
1231
1235
|
return true;
|
|
1232
1236
|
}
|
|
@@ -1252,7 +1256,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1252
1256
|
// The interview is done in several stages. At each point, the interview process might be aborted
|
|
1253
1257
|
// due to a stage failing. The reached stage is saved, so we can continue it later without
|
|
1254
1258
|
// repeating stages unnecessarily
|
|
1255
|
-
if (this.interviewStage ===
|
|
1259
|
+
if (this.interviewStage === _Types_2.InterviewStage.None) {
|
|
1256
1260
|
// do a full interview starting with the protocol info
|
|
1257
1261
|
this.driver.controllerLog.logNode(this.id, `new node, doing a full interview...`);
|
|
1258
1262
|
this.emit("interview started", this);
|
|
@@ -1260,24 +1264,24 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1260
1264
|
}
|
|
1261
1265
|
if (!this.isControllerNode) {
|
|
1262
1266
|
if ((this.isListening || this.isFrequentListening)
|
|
1263
|
-
&& this.status !==
|
|
1267
|
+
&& this.status !== _Types_2.NodeStatus.Alive) {
|
|
1264
1268
|
// Ping non-sleeping nodes to determine their status
|
|
1265
1269
|
if (!await this.ping()) {
|
|
1266
1270
|
// Not alive, abort the interview
|
|
1267
1271
|
return false;
|
|
1268
1272
|
}
|
|
1269
1273
|
}
|
|
1270
|
-
if (this.interviewStage ===
|
|
1274
|
+
if (this.interviewStage === _Types_2.InterviewStage.ProtocolInfo) {
|
|
1271
1275
|
if (!(await tryInterviewStage(() => this.interviewNodeInfo()))) {
|
|
1272
1276
|
return false;
|
|
1273
1277
|
}
|
|
1274
1278
|
}
|
|
1275
1279
|
// At this point the basic interview of new nodes is done. Start here when re-interviewing known nodes
|
|
1276
1280
|
// to get updated information about command classes
|
|
1277
|
-
if (this.interviewStage ===
|
|
1281
|
+
if (this.interviewStage === _Types_2.InterviewStage.NodeInfo) {
|
|
1278
1282
|
// Only advance the interview if it was completed, otherwise abort
|
|
1279
1283
|
if (await this.interviewCCs()) {
|
|
1280
|
-
this.setInterviewStage(
|
|
1284
|
+
this.setInterviewStage(_Types_2.InterviewStage.CommandClasses);
|
|
1281
1285
|
}
|
|
1282
1286
|
else {
|
|
1283
1287
|
return false;
|
|
@@ -1285,15 +1289,15 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1285
1289
|
}
|
|
1286
1290
|
}
|
|
1287
1291
|
if ((this.isControllerNode
|
|
1288
|
-
&& this.interviewStage ===
|
|
1292
|
+
&& this.interviewStage === _Types_2.InterviewStage.ProtocolInfo)
|
|
1289
1293
|
|| (!this.isControllerNode
|
|
1290
|
-
&& this.interviewStage ===
|
|
1294
|
+
&& this.interviewStage === _Types_2.InterviewStage.CommandClasses)) {
|
|
1291
1295
|
// Load a config file for this node if it exists and overwrite the previously reported information
|
|
1292
1296
|
await this.overwriteConfig();
|
|
1293
1297
|
}
|
|
1294
1298
|
// Remember the state of the device config that is used for this node
|
|
1295
1299
|
this.deviceConfigHash = this._deviceConfig?.getHash();
|
|
1296
|
-
this.setInterviewStage(
|
|
1300
|
+
this.setInterviewStage(_Types_2.InterviewStage.Complete);
|
|
1297
1301
|
this.readyMachine.send("INTERVIEW_DONE");
|
|
1298
1302
|
// Tell listeners that the interview is completed
|
|
1299
1303
|
// The driver will then send this node to sleep
|
|
@@ -1303,7 +1307,7 @@ let ZWaveNode = class ZWaveNode extends Endpoint_1.Endpoint {
|
|
|
1303
1307
|
/** Updates this node's interview stage and saves to cache when appropriate */
|
|
1304
1308
|
setInterviewStage(completedStage) {
|
|
1305
1309
|
this.interviewStage = completedStage;
|
|
1306
|
-
this.emit("interview stage completed", this, (0, shared_1.getEnumMemberName)(
|
|
1310
|
+
this.emit("interview stage completed", this, (0, shared_1.getEnumMemberName)(_Types_2.InterviewStage, completedStage));
|
|
1307
1311
|
this.driver.controllerLog.interviewStage(this);
|
|
1308
1312
|
}
|
|
1309
1313
|
/** Step #1 of the node interview */
|
|
@@ -1348,16 +1352,16 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1348
1352
|
});
|
|
1349
1353
|
// Assume that sleeping nodes start asleep (unless we know it is awake)
|
|
1350
1354
|
if (this.canSleep) {
|
|
1351
|
-
if (this.status ===
|
|
1355
|
+
if (this.status === _Types_2.NodeStatus.Alive) {
|
|
1352
1356
|
// If it was just included and is currently communicating with us,
|
|
1353
1357
|
// then we didn't know yet that it can sleep. So we need to switch from alive/dead to awake/asleep
|
|
1354
1358
|
this.markAsAwake();
|
|
1355
1359
|
}
|
|
1356
|
-
else if (this.status !==
|
|
1360
|
+
else if (this.status !== _Types_2.NodeStatus.Awake) {
|
|
1357
1361
|
this.markAsAsleep();
|
|
1358
1362
|
}
|
|
1359
1363
|
}
|
|
1360
|
-
this.setInterviewStage(
|
|
1364
|
+
this.setInterviewStage(_Types_2.InterviewStage.ProtocolInfo);
|
|
1361
1365
|
}
|
|
1362
1366
|
/** Node interview: pings the node to see if it responds */
|
|
1363
1367
|
async ping() {
|
|
@@ -1418,7 +1422,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1418
1422
|
if ((0, core_1.isZWaveError)(e)) {
|
|
1419
1423
|
if (attempts === 1
|
|
1420
1424
|
&& this.canSleep
|
|
1421
|
-
&& this.status !==
|
|
1425
|
+
&& this.status !== _Types_2.NodeStatus.Asleep
|
|
1422
1426
|
&& e.code === core_1.ZWaveErrorCodes.Controller_CallbackNOK) {
|
|
1423
1427
|
this.driver.controllerLog.logNode(this.id, `Querying the node info failed, the node is probably asleep. Retrying after wakeup...`, "error");
|
|
1424
1428
|
// We assumed the node to be awake, but it is not.
|
|
@@ -1434,7 +1438,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1434
1438
|
}
|
|
1435
1439
|
}
|
|
1436
1440
|
}
|
|
1437
|
-
this.setInterviewStage(
|
|
1441
|
+
this.setInterviewStage(_Types_2.InterviewStage.NodeInfo);
|
|
1438
1442
|
}
|
|
1439
1443
|
async requestNodeInfo() {
|
|
1440
1444
|
const resp = await this.driver.sendMessage(new RequestNodeInfoMessages_1.RequestNodeInfoRequest(this.driver, { nodeId: this.id }));
|
|
@@ -1621,7 +1625,9 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1621
1625
|
else {
|
|
1622
1626
|
this.driver.controllerLog.logNode(this.id, "Version CC is not supported. Using the highest implemented version for each CC", "debug");
|
|
1623
1627
|
for (const [ccId, info] of this.getCCs()) {
|
|
1624
|
-
if (info.isSupported
|
|
1628
|
+
if (info.isSupported
|
|
1629
|
+
// The support status of Basic CC is not known yet at this point
|
|
1630
|
+
|| ccId === core_1.CommandClasses.Basic) {
|
|
1625
1631
|
this.addCC(ccId, { version: (0, cc_1.getImplementedVersion)(ccId) });
|
|
1626
1632
|
}
|
|
1627
1633
|
}
|
|
@@ -1831,7 +1837,9 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1831
1837
|
level: "debug",
|
|
1832
1838
|
});
|
|
1833
1839
|
for (const [ccId, info] of endpoint.getCCs()) {
|
|
1834
|
-
if (info.isSupported
|
|
1840
|
+
if (info.isSupported
|
|
1841
|
+
// The support status of Basic CC is not known yet at this point
|
|
1842
|
+
|| ccId === core_1.CommandClasses.Basic) {
|
|
1835
1843
|
endpoint.addCC(ccId, {
|
|
1836
1844
|
version: (0, cc_1.getImplementedVersion)(ccId),
|
|
1837
1845
|
});
|
|
@@ -1948,7 +1956,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1948
1956
|
* Handles the receipt of a NIF / NodeUpdatePayload
|
|
1949
1957
|
*/
|
|
1950
1958
|
updateNodeInfo(nodeInfo) {
|
|
1951
|
-
if (this.interviewStage <
|
|
1959
|
+
if (this.interviewStage < _Types_2.InterviewStage.NodeInfo) {
|
|
1952
1960
|
for (const cc of nodeInfo.supportedCCs) {
|
|
1953
1961
|
if (cc === core_1.CommandClasses.Basic) {
|
|
1954
1962
|
// Basic CC MUST not be in the NIF and we have special rules to determine support
|
|
@@ -1965,7 +1973,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
1965
1973
|
// This is not the handler for wakeup notifications, but some legacy devices send this
|
|
1966
1974
|
// message whenever there's an update and want to be polled.
|
|
1967
1975
|
// We do this unless we know for certain that the device sends unsolicited reports for its actuator or sensor CCs
|
|
1968
|
-
if (this.interviewStage ===
|
|
1976
|
+
if (this.interviewStage === _Types_2.InterviewStage.Complete
|
|
1969
1977
|
&& !this.supportsCC(core_1.CommandClasses["Z-Wave Plus Info"])
|
|
1970
1978
|
&& (!this.valueDB.getValue(AssociationCC_1.AssociationCCValues.hasLifeline.id)
|
|
1971
1979
|
|| !cc_1.utils.doesAnyLifelineSendActuatorOrSensorReports(this.driver, this))) {
|
|
@@ -2043,7 +2051,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
2043
2051
|
*/
|
|
2044
2052
|
async autoRefreshValues() {
|
|
2045
2053
|
// Do not attempt to communicate with dead nodes automatically
|
|
2046
|
-
if (this.status ===
|
|
2054
|
+
if (this.status === _Types_2.NodeStatus.Dead)
|
|
2047
2055
|
return;
|
|
2048
2056
|
for (const endpoint of this.getAllEndpoints()) {
|
|
2049
2057
|
for (const cc of endpoint
|
|
@@ -2165,7 +2173,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
2165
2173
|
}
|
|
2166
2174
|
}
|
|
2167
2175
|
}
|
|
2168
|
-
this.setInterviewStage(
|
|
2176
|
+
this.setInterviewStage(_Types_2.InterviewStage.OverwriteConfig);
|
|
2169
2177
|
}
|
|
2170
2178
|
/**
|
|
2171
2179
|
* @internal
|
|
@@ -4571,7 +4579,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
4571
4579
|
// Restore the device config
|
|
4572
4580
|
await this.loadDeviceConfig();
|
|
4573
4581
|
// Mark already-interviewed nodes as potentially ready
|
|
4574
|
-
if (this.interviewStage ===
|
|
4582
|
+
if (this.interviewStage === _Types_2.InterviewStage.Complete) {
|
|
4575
4583
|
this.readyMachine.send("RESTART_FROM_CACHE");
|
|
4576
4584
|
}
|
|
4577
4585
|
}
|
|
@@ -4593,8 +4601,8 @@ protocol version: ${this.protocolVersion}`;
|
|
|
4593
4601
|
return false;
|
|
4594
4602
|
this.isSendingNoMoreInformation = true;
|
|
4595
4603
|
let msgSent = false;
|
|
4596
|
-
if (this.status ===
|
|
4597
|
-
&& this.interviewStage ===
|
|
4604
|
+
if (this.status === _Types_2.NodeStatus.Awake
|
|
4605
|
+
&& this.interviewStage === _Types_2.InterviewStage.Complete) {
|
|
4598
4606
|
this.driver.controllerLog.logNode(this.id, {
|
|
4599
4607
|
message: "Sending node back to sleep...",
|
|
4600
4608
|
direction: "outbound",
|
|
@@ -4771,7 +4779,7 @@ protocol version: ${this.protocolVersion}`;
|
|
|
4771
4779
|
};
|
|
4772
4780
|
}
|
|
4773
4781
|
};
|
|
4774
|
-
if (this.canSleep && this.status !==
|
|
4782
|
+
if (this.canSleep && this.status !== _Types_2.NodeStatus.Awake) {
|
|
4775
4783
|
// Wait for node to wake up to avoid incorrectly long delays in the first health check round
|
|
4776
4784
|
this.driver.controllerLog.logNode(this.id, `waiting for node to wake up...`);
|
|
4777
4785
|
await Promise.race([
|
|
@@ -5008,7 +5016,7 @@ ${(0, HealthCheck_1.formatLifelineHealthCheckSummary)(summary)}`);
|
|
|
5008
5016
|
};
|
|
5009
5017
|
}
|
|
5010
5018
|
};
|
|
5011
|
-
if (this.canSleep && this.status !==
|
|
5019
|
+
if (this.canSleep && this.status !== _Types_2.NodeStatus.Awake) {
|
|
5012
5020
|
// Wait for node to wake up to avoid incorrectly long delays in the first health check round
|
|
5013
5021
|
this.driver.controllerLog.logNode(this.id, `waiting for node to wake up...`);
|
|
5014
5022
|
await Promise.race([
|
|
@@ -5124,6 +5132,171 @@ ${(0, HealthCheck_1.formatLifelineHealthCheckSummary)(summary)}`);
|
|
|
5124
5132
|
${(0, HealthCheck_1.formatRouteHealthCheckSummary)(this.id, otherNode.id, summary)}`);
|
|
5125
5133
|
return summary;
|
|
5126
5134
|
}
|
|
5135
|
+
_linkReliabilityCheckInProgress = false;
|
|
5136
|
+
/**
|
|
5137
|
+
* Returns whether a link reliability check is currently in progress for this node
|
|
5138
|
+
*/
|
|
5139
|
+
isLinkReliabilityCheckInProgress() {
|
|
5140
|
+
return this._linkReliabilityCheckInProgress;
|
|
5141
|
+
}
|
|
5142
|
+
_linkReliabilityCheckAborted = false;
|
|
5143
|
+
_abortLinkReliabilityCheckPromise;
|
|
5144
|
+
/**
|
|
5145
|
+
* Aborts an ongoing link reliability check if one is currently in progress.
|
|
5146
|
+
*
|
|
5147
|
+
* **Note:** The link reliability check may take a few seconds to actually be aborted.
|
|
5148
|
+
* When it is, the promise returned by {@link checkLinkReliability} will be resolved with the results obtained so far.
|
|
5149
|
+
*/
|
|
5150
|
+
abortLinkReliabilityCheck() {
|
|
5151
|
+
this._linkReliabilityCheckAborted = true;
|
|
5152
|
+
this._abortLinkReliabilityCheckPromise?.resolve();
|
|
5153
|
+
}
|
|
5154
|
+
/**
|
|
5155
|
+
* Tests the reliability of the link between the controller and this node and returns the results.
|
|
5156
|
+
*/
|
|
5157
|
+
async checkLinkReliability(options) {
|
|
5158
|
+
if (this._linkReliabilityCheckInProgress) {
|
|
5159
|
+
throw new core_1.ZWaveError("A link reliability check is already in progress for this node!", core_1.ZWaveErrorCodes.LinkReliabilityCheck_Busy);
|
|
5160
|
+
}
|
|
5161
|
+
if (typeof options.rounds === "number" && options.rounds < 1) {
|
|
5162
|
+
throw new core_1.ZWaveError("The number of rounds must be at least 1!", core_1.ZWaveErrorCodes.Argument_Invalid);
|
|
5163
|
+
}
|
|
5164
|
+
try {
|
|
5165
|
+
this._linkReliabilityCheckInProgress = true;
|
|
5166
|
+
this._abortLinkReliabilityCheckPromise = (0, deferred_promise_1.createDeferredPromise)();
|
|
5167
|
+
switch (options.mode) {
|
|
5168
|
+
case _Types_1.LinkReliabilityCheckMode.BasicSetOnOff:
|
|
5169
|
+
return await this.checkLinkReliabilityBasicSetOnOff(options);
|
|
5170
|
+
}
|
|
5171
|
+
}
|
|
5172
|
+
finally {
|
|
5173
|
+
this._linkReliabilityCheckInProgress = false;
|
|
5174
|
+
this._linkReliabilityCheckAborted = false;
|
|
5175
|
+
this._abortLinkReliabilityCheckPromise = undefined;
|
|
5176
|
+
}
|
|
5177
|
+
}
|
|
5178
|
+
async checkLinkReliabilityBasicSetOnOff(options) {
|
|
5179
|
+
this.driver.controllerLog.logNode(this.id, `Starting link reliability check (Basic Set On/Off) with ${options.rounds} round${options.rounds !== 1 ? "s" : ""}...`);
|
|
5180
|
+
const useSupervision = this.supportsCC(core_1.CommandClasses.Supervision);
|
|
5181
|
+
const result = {
|
|
5182
|
+
rounds: 0,
|
|
5183
|
+
commandsSent: 0,
|
|
5184
|
+
commandErrors: 0,
|
|
5185
|
+
missingResponses: useSupervision ? 0 : undefined,
|
|
5186
|
+
latency: {
|
|
5187
|
+
min: Number.POSITIVE_INFINITY,
|
|
5188
|
+
max: 0,
|
|
5189
|
+
average: 0,
|
|
5190
|
+
},
|
|
5191
|
+
ackRSSI: {
|
|
5192
|
+
min: 0,
|
|
5193
|
+
max: Number.NEGATIVE_INFINITY,
|
|
5194
|
+
average: Number.NEGATIVE_INFINITY,
|
|
5195
|
+
},
|
|
5196
|
+
responseRSSI: useSupervision
|
|
5197
|
+
? {
|
|
5198
|
+
min: 0,
|
|
5199
|
+
max: Number.NEGATIVE_INFINITY,
|
|
5200
|
+
average: Number.NEGATIVE_INFINITY,
|
|
5201
|
+
}
|
|
5202
|
+
: undefined,
|
|
5203
|
+
};
|
|
5204
|
+
const aborted = () => {
|
|
5205
|
+
this.driver.controllerLog.logNode(this.id, `Link reliability check aborted`);
|
|
5206
|
+
return result;
|
|
5207
|
+
};
|
|
5208
|
+
let lastProgressReport = 0;
|
|
5209
|
+
const reportProgress = () => {
|
|
5210
|
+
if (Date.now() - lastProgressReport >= 250) {
|
|
5211
|
+
options.onProgress?.((0, shared_1.cloneDeep)(result));
|
|
5212
|
+
lastProgressReport = Date.now();
|
|
5213
|
+
}
|
|
5214
|
+
};
|
|
5215
|
+
if (this.canSleep && this.status !== _Types_2.NodeStatus.Awake) {
|
|
5216
|
+
// Wait for node to wake up to avoid incorrectly long delays in the first health check round
|
|
5217
|
+
this.driver.controllerLog.logNode(this.id, `waiting for node to wake up...`);
|
|
5218
|
+
await Promise.race([
|
|
5219
|
+
this.waitForWakeup(),
|
|
5220
|
+
this._abortLinkReliabilityCheckPromise,
|
|
5221
|
+
]);
|
|
5222
|
+
if (this._linkReliabilityCheckAborted)
|
|
5223
|
+
return aborted();
|
|
5224
|
+
}
|
|
5225
|
+
// TODO: report progress with throttle
|
|
5226
|
+
let txReport;
|
|
5227
|
+
let latency = 0;
|
|
5228
|
+
const basicSetAPI = this.commandClasses.Basic.withOptions({
|
|
5229
|
+
// Don't change the node status when the ACK is missing. We're likely testing the limits here.
|
|
5230
|
+
changeNodeStatusOnMissingACK: false,
|
|
5231
|
+
// Avoid using explorer frames, because they can create a ton of delay
|
|
5232
|
+
transmitOptions: core_1.TransmitOptions.ACK
|
|
5233
|
+
| core_1.TransmitOptions.AutoRoute,
|
|
5234
|
+
// And remember the transmit report, so we can evaluate it
|
|
5235
|
+
onTXReport: (report) => {
|
|
5236
|
+
txReport = report;
|
|
5237
|
+
},
|
|
5238
|
+
});
|
|
5239
|
+
let lastStart;
|
|
5240
|
+
for (let round = 1; round <= (options.rounds ?? Number.POSITIVE_INFINITY); round++) {
|
|
5241
|
+
if (this._linkReliabilityCheckAborted)
|
|
5242
|
+
return aborted();
|
|
5243
|
+
result.rounds = round;
|
|
5244
|
+
lastStart = Date.now();
|
|
5245
|
+
// Reset TX report before each command
|
|
5246
|
+
txReport = undefined;
|
|
5247
|
+
try {
|
|
5248
|
+
await basicSetAPI.set(round % 2 === 1 ? 0xff : 0x00);
|
|
5249
|
+
// The command was sent successfully (and possibly got a response)
|
|
5250
|
+
result.commandsSent++;
|
|
5251
|
+
// Measure the RTT or latency, whatever is available
|
|
5252
|
+
const rtt = Date.now() - lastStart;
|
|
5253
|
+
latency = Math.max(latency, txReport ? txReport.txTicks * 10 : rtt);
|
|
5254
|
+
result.latency.min = Math.min(result.latency.min, latency);
|
|
5255
|
+
result.latency.max = Math.max(result.latency.max, latency);
|
|
5256
|
+
// incrementally update the average latency
|
|
5257
|
+
result.latency.average += (latency - result.latency.average)
|
|
5258
|
+
/ round;
|
|
5259
|
+
}
|
|
5260
|
+
catch (e) {
|
|
5261
|
+
if ((0, core_1.isZWaveError)(e)) {
|
|
5262
|
+
if (e.code === core_1.ZWaveErrorCodes.Controller_ResponseNOK
|
|
5263
|
+
|| e.code === core_1.ZWaveErrorCodes.Controller_CallbackNOK) {
|
|
5264
|
+
// The command could not be sent or was not acknowledged
|
|
5265
|
+
result.commandErrors++;
|
|
5266
|
+
}
|
|
5267
|
+
else if (e.code === core_1.ZWaveErrorCodes.Controller_NodeTimeout) {
|
|
5268
|
+
// The command was sent using Supervision and a response was
|
|
5269
|
+
// expected but none came
|
|
5270
|
+
result.missingResponses ??= 0;
|
|
5271
|
+
result.missingResponses++;
|
|
5272
|
+
}
|
|
5273
|
+
}
|
|
5274
|
+
}
|
|
5275
|
+
if (txReport?.ackRSSI != undefined
|
|
5276
|
+
&& !(0, core_1.isRssiError)(txReport.ackRSSI)) {
|
|
5277
|
+
result.ackRSSI.min = Math.min(result.ackRSSI.min, txReport.ackRSSI);
|
|
5278
|
+
result.ackRSSI.max = Math.max(result.ackRSSI.max, txReport.ackRSSI);
|
|
5279
|
+
// incrementally update the average RSSI
|
|
5280
|
+
if (Number.isFinite(result.ackRSSI.average)) {
|
|
5281
|
+
result.ackRSSI.average +=
|
|
5282
|
+
(txReport.ackRSSI - result.ackRSSI.average)
|
|
5283
|
+
/ round;
|
|
5284
|
+
}
|
|
5285
|
+
else {
|
|
5286
|
+
result.ackRSSI.average = txReport.ackRSSI;
|
|
5287
|
+
}
|
|
5288
|
+
}
|
|
5289
|
+
// TODO: Capture incoming RSSI and average it
|
|
5290
|
+
reportProgress();
|
|
5291
|
+
// Throttle the next command
|
|
5292
|
+
const waitDurationMs = Math.max(0, options.interval - (Date.now() - lastStart));
|
|
5293
|
+
await Promise.race([
|
|
5294
|
+
(0, async_1.wait)(waitDurationMs, true),
|
|
5295
|
+
this._abortLinkReliabilityCheckPromise,
|
|
5296
|
+
]);
|
|
5297
|
+
}
|
|
5298
|
+
return result;
|
|
5299
|
+
}
|
|
5127
5300
|
/**
|
|
5128
5301
|
* Updates the average RTT of this node
|
|
5129
5302
|
* @internal
|
|
@@ -5422,7 +5595,7 @@ ${(0, HealthCheck_1.formatRouteHealthCheckSummary)(this.id, otherNode.id, summar
|
|
|
5422
5595
|
*/
|
|
5423
5596
|
hasDeviceConfigChanged() {
|
|
5424
5597
|
// We can't know if the node is not fully interviewed
|
|
5425
|
-
if (this.interviewStage !==
|
|
5598
|
+
if (this.interviewStage !== _Types_2.InterviewStage.Complete)
|
|
5426
5599
|
return core_1.NOT_KNOWN;
|
|
5427
5600
|
// The controller cannot be re-interviewed
|
|
5428
5601
|
if (this.isControllerNode)
|
|
@@ -5458,7 +5631,7 @@ ${(0, HealthCheck_1.formatRouteHealthCheckSummary)(this.id, otherNode.id, summar
|
|
|
5458
5631
|
: "unknown",
|
|
5459
5632
|
firmwareVersion: this.firmwareVersion ?? "unknown",
|
|
5460
5633
|
},
|
|
5461
|
-
interviewStage: (0, shared_1.getEnumMemberName)(
|
|
5634
|
+
interviewStage: (0, shared_1.getEnumMemberName)(_Types_2.InterviewStage, this.interviewStage),
|
|
5462
5635
|
ready: this.ready,
|
|
5463
5636
|
dsk: this.dsk ? (0, core_1.dskToString)(this.dsk) : undefined,
|
|
5464
5637
|
securityClasses: {},
|