zwave-js 14.3.7 → 14.3.9
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/cjs/lib/_version.d.ts +1 -1
- package/build/cjs/lib/_version.js +1 -1
- package/build/cjs/lib/_version.js.map +1 -1
- package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js +13 -6
- package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js.map +2 -2
- package/build/esm/lib/_version.d.ts +1 -1
- package/build/esm/lib/_version.js +1 -1
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.d.ts.map +1 -1
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.js +12 -8
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.js.map +1 -1
- package/package.json +9 -9
|
@@ -22,7 +22,7 @@ __export(version_exports, {
|
|
|
22
22
|
PACKAGE_VERSION: () => PACKAGE_VERSION
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(version_exports);
|
|
25
|
-
const PACKAGE_VERSION = "14.3.
|
|
25
|
+
const PACKAGE_VERSION = "14.3.9";
|
|
26
26
|
const PACKAGE_NAME = "zwave-js";
|
|
27
27
|
// Annotate the CommonJS export names for ESM import in node:
|
|
28
28
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/_version.ts"],
|
|
4
|
-
"sourcesContent": ["// This file is auto-generated by the codegen maintenance script\nexport const PACKAGE_VERSION = \"14.3.
|
|
4
|
+
"sourcesContent": ["// This file is auto-generated by the codegen maintenance script\nexport const PACKAGE_VERSION = \"14.3.9\";\nexport const PACKAGE_NAME = \"zwave-js\";\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;AACO,MAAM,kBAAkB;AACxB,MAAM,eAAe;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -166,7 +166,14 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
|
|
|
166
166
|
const totalBytes = updatesWithChecksum.reduce((total, update) => total + update.data.length, 0);
|
|
167
167
|
let sentBytesOfPreviousFiles = 0;
|
|
168
168
|
for (let i = 0; i < updatesWithChecksum.length; i++) {
|
|
169
|
-
const {
|
|
169
|
+
const {
|
|
170
|
+
// If the firmware target is not given, update the Z-Wave chip
|
|
171
|
+
firmwareTarget: target = 0,
|
|
172
|
+
// If the firmware ID is not given, use the current one for the given chip
|
|
173
|
+
firmwareId = target === 0 ? meta.firmwareId : meta.additionalFirmwareIDs[target - 1],
|
|
174
|
+
data,
|
|
175
|
+
checksum
|
|
176
|
+
} = updatesWithChecksum[i];
|
|
170
177
|
if (i < skipFinishedFiles) {
|
|
171
178
|
self.driver.controllerLog.logNode(self.id, `Skipping already completed firmware update (part ${i + 1} / ${updatesWithChecksum.length})...`);
|
|
172
179
|
sentBytesOfPreviousFiles += data.length;
|
|
@@ -174,7 +181,7 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
|
|
|
174
181
|
}
|
|
175
182
|
self.driver.controllerLog.logNode(self.id, `Updating firmware (part ${i + 1} / ${updatesWithChecksum.length})...`);
|
|
176
183
|
let fragmentSize = options.nonSecureTransfer ? fragmentSizeNonSecure : fragmentSizeSecure;
|
|
177
|
-
const { resume, nonSecureTransfer } = yield* self.beginFirmwareUpdateInternal(data, target,
|
|
184
|
+
const { resume, nonSecureTransfer } = yield* self.beginFirmwareUpdateInternal(data, meta.manufacturerId, target, firmwareId, fragmentSize, checksum, hardwareVersion, shouldResume, options.nonSecureTransfer);
|
|
178
185
|
if (options.nonSecureTransfer && !nonSecureTransfer) {
|
|
179
186
|
fragmentSize = fragmentSizeSecure;
|
|
180
187
|
}
|
|
@@ -305,16 +312,16 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
|
|
|
305
312
|
}
|
|
306
313
|
}
|
|
307
314
|
/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */
|
|
308
|
-
async *beginFirmwareUpdateInternal(data, target,
|
|
315
|
+
async *beginFirmwareUpdateInternal(data, manufacturerId, target, firmwareId, fragmentSize, checksum, hardwareVersion, resume, nonSecureTransfer) {
|
|
309
316
|
const api = this.commandClasses["Firmware Update Meta Data"];
|
|
310
317
|
this.driver.controllerLog.logNode(this.id, {
|
|
311
318
|
message: `Starting firmware update...`,
|
|
312
319
|
direction: "outbound"
|
|
313
320
|
});
|
|
314
321
|
await api.requestUpdate({
|
|
315
|
-
// TODO: Should manufacturer id
|
|
316
|
-
manufacturerId
|
|
317
|
-
firmwareId
|
|
322
|
+
// TODO: Should manufacturer id be provided externally?
|
|
323
|
+
manufacturerId,
|
|
324
|
+
firmwareId,
|
|
318
325
|
firmwareTarget: target,
|
|
319
326
|
fragmentSize,
|
|
320
327
|
checksum,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype FirmwareUpdateMetaData,\n\tFirmwareUpdateMetaDataCC,\n\tFirmwareUpdateMetaDataCCGet,\n\ttype FirmwareUpdateMetaDataCCMetaDataGet,\n\tFirmwareUpdateMetaDataCCReport,\n\tFirmwareUpdateMetaDataCCRequestReport,\n\tFirmwareUpdateMetaDataCCStatusReport,\n\ttype FirmwareUpdateOptions,\n\ttype FirmwareUpdateProgress,\n\tFirmwareUpdateRequestStatus,\n\ttype FirmwareUpdateResult,\n\tFirmwareUpdateStatus,\n\tgetEffectiveCCVersion,\n} from \"@zwave-js/cc\";\nimport {\n\tCRC16_CCITT,\n\tCommandClasses,\n\tEncapsulationFlags,\n\ttype Firmware,\n\tSecurityClass,\n\tZWaveError,\n\tZWaveErrorCodes,\n\trandomBytes,\n\tsecurityClassIsS2,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport { containsCC } from \"@zwave-js/serial/serialapi\";\nimport { getEnumMemberName, throttle } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { wait } from \"alcalzone-shared/async\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { roundTo } from \"alcalzone-shared/math\";\nimport {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskPriority,\n} from \"../../driver/Task.js\";\nimport { type Transaction } from \"../../driver/Transaction.js\";\nimport { SchedulePollMixin } from \"./60_ScheduledPoll.js\";\n\ninterface AbortFirmwareUpdateContext {\n\tabort: boolean;\n\ttooLateToAbort: boolean;\n\tabortPromise: DeferredPromise<boolean>;\n}\n\ntype PartialFirmwareUpdateResult =\n\t& Pick<FirmwareUpdateResult, \"status\" | \"waitTime\">\n\t& { success: boolean };\n\n/** Checks if a task belongs to a route rebuilding process */\nexport function isFirmwareUpdateOTATask(t: Task<unknown>): boolean {\n\treturn t.tag?.id === \"firmware-update-ota\";\n}\n\nexport interface NodeFirmwareUpdate {\n\t/**\n\t * Aborts an active firmware update process\n\t */\n\tabortFirmwareUpdate(): Promise<void>;\n\n\t/**\n\t * Performs an OTA firmware upgrade of one or more chips on this node.\n\t *\n\t * This method will resolve after the process has **COMPLETED**. Failure to start any one of the provided updates will throw an error.\n\t *\n\t * **WARNING: Use at your own risk! We don't take any responsibility if your devices don't work after an update.**\n\t *\n\t * @param updates An array of firmware updates that will be done in sequence\n\t *\n\t * @returns Whether all of the given updates were successful.\n\t */\n\tupdateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions?: FirmwareUpdateOptions,\n\t): Promise<FirmwareUpdateResult>;\n\n\t/**\n\t * Returns whether a firmware update is in progress for this node.\n\t */\n\tisFirmwareUpdateInProgress(): boolean;\n}\n\nexport abstract class FirmwareUpdateMixin extends SchedulePollMixin\n\timplements NodeFirmwareUpdate\n{\n\tprivate _abortFirmwareUpdate: (() => Promise<void>) | undefined;\n\tpublic async abortFirmwareUpdate(): Promise<void> {\n\t\tif (!this._abortFirmwareUpdate) return;\n\t\tawait this._abortFirmwareUpdate();\n\t}\n\n\t// Stores the CRC of the previously transferred firmware image.\n\t// Allows detecting whether resuming is supported and where to continue in a multi-file transfer.\n\tprivate _previousFirmwareCRC: number | undefined;\n\n\t/** Is used to remember fragment requests that came in before they were able to be handled */\n\tprivate _firmwareUpdatePrematureRequest:\n\t\t| FirmwareUpdateMetaDataCCGet\n\t\t| undefined;\n\n\tpublic async updateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> {\n\t\tif (updates.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one update must be provided`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that each update has a buffer with at least 1 byte\n\t\tif (updates.some((u) => u.data.length === 0)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`All firmware updates must have a non-empty data buffer`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that the targets are not duplicates\n\t\tif (\n\t\t\tdistinct(updates.map((u) => u.firmwareTarget ?? 0)).length\n\t\t\t\t!== updates.length\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The target of all provided firmware updates must be unique`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Don't start the process twice\n\t\tif (this.driver.controller.isFirmwareUpdateInProgress()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: An OTW upgrade of the controller is in progress!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Don't allow starting two firmware updates for the same node\n\t\tconst task = this.getUpdateFirmwareTask(updates, options);\n\t\tif (task instanceof Promise) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: A firmware update is already in progress for this node!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Queue the task\n\t\treturn this.driver.scheduler.queueTask(task);\n\t}\n\n\tpublic isFirmwareUpdateInProgress(): boolean {\n\t\treturn !!this.driver.scheduler.findTask(isFirmwareUpdateOTATask);\n\t}\n\n\tprivate getUpdateFirmwareTask(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> | TaskBuilder<FirmwareUpdateResult> {\n\t\tconst self = this;\n\n\t\t// This task should only run once at a time\n\t\tconst existingTask = this.driver.scheduler.findTask<\n\t\t\tFirmwareUpdateResult\n\t\t>((t) =>\n\t\t\tt.tag?.id === \"firmware-update-ota\"\n\t\t\t&& t.tag.nodeId === self.id\n\t\t);\n\t\tif (existingTask) return existingTask;\n\n\t\tlet keepAwake: boolean;\n\n\t\treturn {\n\t\t\t// Firmware updates cause a lot of traffic. Execute them in the background.\n\t\t\tpriority: TaskPriority.Lower,\n\t\t\ttag: { id: \"firmware-update-ota\", nodeId: self.id },\n\t\t\ttask: async function* firmwareUpdateTask() {\n\t\t\t\t// Keep battery powered nodes awake during the process\n\t\t\t\tkeepAwake = self.keepAwake;\n\t\t\t\tself.keepAwake = true;\n\n\t\t\t\t// Support aborting the update\n\t\t\t\tconst abortContext = {\n\t\t\t\t\tabort: false,\n\t\t\t\t\ttooLateToAbort: false,\n\t\t\t\t\tabortPromise: createDeferredPromise<boolean>(),\n\t\t\t\t};\n\n\t\t\t\tself._abortFirmwareUpdate = async () => {\n\t\t\t\t\tif (abortContext.tooLateToAbort) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The firmware update was transmitted completely, cannot abort anymore.`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Aborting firmware update...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Trigger the abort\n\t\t\t\t\tabortContext.abort = true;\n\t\t\t\t\tconst aborted = await abortContext.abortPromise;\n\t\t\t\t\tif (!aborted) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The node did not acknowledge the aborted update`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Firmware update aborted`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\t// Prepare the firmware update\n\t\t\t\tlet fragmentSizeSecure: number;\n\t\t\t\tlet fragmentSizeNonSecure: number;\n\t\t\t\tlet hardwareVersion: number | undefined;\n\t\t\t\tlet meta: FirmwareUpdateMetaData;\n\t\t\t\ttry {\n\t\t\t\t\tconst prepareResult = await self\n\t\t\t\t\t\t.prepareFirmwareUpdateInternal(\n\t\t\t\t\t\t\tupdates.map((u) => u.firmwareTarget ?? 0),\n\t\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Handle early aborts\n\t\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tstatus: FirmwareUpdateStatus\n\t\t\t\t\t\t\t\t.Error_TransmissionFailed,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the firmware update was not aborted, prepareResult is definitely defined\n\t\t\t\t\t({\n\t\t\t\t\t\tfragmentSizeSecure,\n\t\t\t\t\t\tfragmentSizeNonSecure,\n\t\t\t\t\t\thardwareVersion,\n\t\t\t\t\t\t...meta\n\t\t\t\t\t} = prepareResult!);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not sure what the error is, but we'll label it \"transmission failed\"\n\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// The resume and non-secure transfer features may not be supported by the node\n\t\t\t\t// If not, disable them, even though the application requested them\n\t\t\t\tif (!meta.supportsResuming) options.resume = false;\n\n\t\t\t\tconst securityClass = self.getHighestSecurityClass();\n\t\t\t\tconst isSecure = securityClass === SecurityClass.S0_Legacy\n\t\t\t\t\t|| securityClassIsS2(securityClass);\n\t\t\t\tif (!isSecure) {\n\t\t\t\t\t// The nonSecureTransfer option is only relevant for secure devices\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t} else if (!meta.supportsNonSecureTransfer) {\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t}\n\n\t\t\t\t// Throttle the progress emitter so applications can handle the load of events\n\t\t\t\tconst notifyProgress = throttle(\n\t\t\t\t\t(progress) =>\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update progress\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t),\n\t\t\t\t\t250,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\t// If resuming is supported and desired, try to figure out with which file to continue\n\t\t\t\tconst updatesWithChecksum = updates.map((u) => ({\n\t\t\t\t\t...u,\n\t\t\t\t\tchecksum: CRC16_CCITT(u.data),\n\t\t\t\t}));\n\t\t\t\tlet skipFinishedFiles = -1;\n\t\t\t\tlet shouldResume = options.resume\n\t\t\t\t\t&& self._previousFirmwareCRC != undefined;\n\t\t\t\tif (shouldResume) {\n\t\t\t\t\tskipFinishedFiles = updatesWithChecksum.findIndex(\n\t\t\t\t\t\t(u) => u.checksum === self._previousFirmwareCRC,\n\t\t\t\t\t);\n\t\t\t\t\tif (skipFinishedFiles === -1) shouldResume = false;\n\t\t\t\t}\n\n\t\t\t\t// Perform all firmware updates in sequence\n\t\t\t\tlet updateResult!: PartialFirmwareUpdateResult;\n\t\t\t\tlet conservativeWaitTime: number;\n\n\t\t\t\tconst totalBytes: number = updatesWithChecksum.reduce(\n\t\t\t\t\t(total, update) => total + update.data.length,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tlet sentBytesOfPreviousFiles = 0;\n\n\t\t\t\tfor (let i = 0; i < updatesWithChecksum.length; i++) {\n\t\t\t\t\tconst { firmwareTarget: target = 0, data, checksum } =\n\t\t\t\t\t\tupdatesWithChecksum[i];\n\n\t\t\t\t\tif (i < skipFinishedFiles) {\n\t\t\t\t\t\t// If we are resuming, skip this file since it was already done before\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Skipping already completed firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t`Updating firmware (part ${\n\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// For determining the initial fragment size, assume the node respects our choice.\n\t\t\t\t\t// If the node is not secure, these two values are identical anyways.\n\t\t\t\t\tlet fragmentSize = options.nonSecureTransfer\n\t\t\t\t\t\t? fragmentSizeNonSecure\n\t\t\t\t\t\t: fragmentSizeSecure;\n\n\t\t\t\t\t// Tell the node to start requesting fragments\n\t\t\t\t\tconst { resume, nonSecureTransfer } = yield* self\n\t\t\t\t\t\t.beginFirmwareUpdateInternal(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\t\tchecksum,\n\t\t\t\t\t\t\thardwareVersion,\n\t\t\t\t\t\t\tshouldResume,\n\t\t\t\t\t\t\toptions.nonSecureTransfer,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// If the node did not accept non-secure transfer, revisit our choice of fragment size\n\t\t\t\t\tif (options.nonSecureTransfer && !nonSecureTransfer) {\n\t\t\t\t\t\tfragmentSize = fragmentSizeSecure;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the checksum, so we can resume if necessary\n\t\t\t\t\tself._previousFirmwareCRC = checksum;\n\n\t\t\t\t\tif (shouldResume) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Node ${\n\t\t\t\t\t\t\t\tresume ? \"accepted\" : \"did not accept\"\n\t\t\t\t\t\t\t} resuming the update...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (nonSecureTransfer) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Firmware will be transferred without encryption...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t\t// Listen for firmware update fragment requests and handle them\n\t\t\t\t\tupdateResult = yield* self.doFirmwareUpdateInternal(\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t(fragment, total) => {\n\t\t\t\t\t\t\tconst progress: FirmwareUpdateProgress = {\n\t\t\t\t\t\t\t\tcurrentFile: i + 1,\n\t\t\t\t\t\t\t\ttotalFiles: updatesWithChecksum.length,\n\t\t\t\t\t\t\t\tsentFragments: fragment,\n\t\t\t\t\t\t\t\ttotalFragments: total,\n\t\t\t\t\t\t\t\tprogress: roundTo(\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t(sentBytesOfPreviousFiles\n\t\t\t\t\t\t\t\t\t\t\t+ Math.min(\n\t\t\t\t\t\t\t\t\t\t\t\tfragment * fragmentSize,\n\t\t\t\t\t\t\t\t\t\t\t\tdata.length,\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t/ totalBytes\n\t\t\t\t\t\t\t\t\t) * 100,\n\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tnotifyProgress(progress);\n\n\t\t\t\t\t\t\t// When this file is done, add the fragments to the total, so we can compute the total progress correctly\n\t\t\t\t\t\t\tif (fragment === total) {\n\t\t\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\t// If we wait, wait a bit longer than the device told us, so it is actually ready to use\n\t\t\t\t\tconservativeWaitTime = self.driver\n\t\t\t\t\t\t.getConservativeWaitTimeAfterFirmwareUpdate(\n\t\t\t\t\t\t\tupdateResult.waitTime,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!updateResult.success) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) failed with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\t...updateResult,\n\t\t\t\t\t\t\twaitTime: undefined,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} else if (i < updatesWithChecksum.length - 1) {\n\t\t\t\t\t\t// Update succeeded, but we're not done yet\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) succeeded with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Continuing with next part in ${conservativeWaitTime} seconds...`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// If we've resumed the previous file, there's no need to resume the next one too\n\t\t\t\t\t\tshouldResume = false;\n\n\t\t\t\t\t\tyield () => wait(conservativeWaitTime * 1000, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We're done. No need to resume this update\n\t\t\t\tself._previousFirmwareCRC = undefined;\n\n\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t...updateResult,\n\t\t\t\t\twaitTime: conservativeWaitTime!,\n\t\t\t\t\treInterview: true,\n\t\t\t\t};\n\n\t\t\t\t// After a successful firmware update, we want to interview sleeping nodes immediately,\n\t\t\t\t// so don't send them to sleep when they wake up\n\t\t\t\tkeepAwake = true;\n\n\t\t\t\tself._emit(\"firmware update finished\", self, result);\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tcleanup() {\n\t\t\t\tself._abortFirmwareUpdate = undefined;\n\t\t\t\tself._firmwareUpdatePrematureRequest = undefined;\n\n\t\t\t\t// Make sure that the keepAwake flag gets reset at the end\n\t\t\t\tself.keepAwake = keepAwake;\n\t\t\t\tif (!keepAwake) {\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tself.driver.debounceSendNodeToSleep(self);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Prepares the firmware update of a single target by collecting the necessary information */\n\tprivate async prepareFirmwareUpdateInternal(\n\t\ttargets: number[],\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t): Promise<\n\t\t| undefined\n\t\t| (FirmwareUpdateMetaData & {\n\t\t\tfragmentSizeSecure: number;\n\t\t\tfragmentSizeNonSecure: number;\n\t\t})\n\t> {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 1:\n\t\t// Check if this update is possible\n\t\tconst meta = await api.getMetaData();\n\t\tif (!meta) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: The node did not respond in time!`,\n\t\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t\t);\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tif (target === 0) {\n\t\t\t\tif (!meta.firmwareUpgradable) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The Z-Wave chip firmware is not upgradable!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (api.version < 3) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The node does not support upgrading a different firmware target than 0!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\tmeta.additionalFirmwareIDs[target - 1] == undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: Firmware target #${target} not found on this node!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ================================\n\t\t// STEP 2:\n\t\t// Determine the fragment size\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\tthis.driver.isCCSecure(fcc.ccId, this.id),\n\t\t);\n\t\tconst maxGrossPayloadSizeSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(\n\t\t\t\tfcc,\n\t\t\t);\n\t\tconst maxGrossPayloadSizeNonSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(fcc, true);\n\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst maxNetPayloadSizeSecure = maxGrossPayloadSizeSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst maxNetPayloadSizeNonSecure = maxGrossPayloadSizeNonSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\n\t\t// Use the smallest allowed payload\n\t\tconst fragmentSizeSecure = Math.min(\n\t\t\tmaxNetPayloadSizeSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\t\tconst fragmentSizeNonSecure = Math.min(\n\t\t\tmaxNetPayloadSizeNonSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(true);\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...meta,\n\t\t\t\tfragmentSizeSecure,\n\t\t\t\tfragmentSizeNonSecure,\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async handleUnexpectedFirmwareUpdateGet(\n\t\tcommand: FirmwareUpdateMetaDataCCGet,\n\t): Promise<void> {\n\t\t// This method will only be called under two circumstances:\n\t\t// 1. The node is currently busy responding to a firmware update request -> remember the request\n\t\tif (this.isFirmwareUpdateInProgress()) {\n\t\t\tthis._firmwareUpdatePrematureRequest = command;\n\t\t\treturn;\n\t\t}\n\n\t\t// 2. No firmware update is in progress -> abort\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage:\n\t\t\t\t`Received Firmware Update Get, but no firmware update is in progress. Forcing the node to abort...`,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\t// Since no update is in progress, we need to determine the fragment size again\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\t!!(command.encapsulationFlags & EncapsulationFlags.Security),\n\t\t);\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst fragmentSize = this.driver.computeNetCCPayloadSize(fcc)\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst fragment = randomBytes(fragmentSize);\n\t\ttry {\n\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\tcommand.reportNumber,\n\t\t\t\tfragment,\n\t\t\t);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */\n\tprivate async *beginFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\ttarget: number,\n\t\tmeta: FirmwareUpdateMetaData,\n\t\tfragmentSize: number,\n\t\tchecksum: number,\n\t\thardwareVersion?: number,\n\t\tresume?: boolean,\n\t\tnonSecureTransfer?: boolean,\n\t) {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 3:\n\t\t// Start the update\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage: `Starting firmware update...`,\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\t// Request the node to start the upgrade\n\t\tawait api.requestUpdate({\n\t\t\t// TODO: Should manufacturer id and firmware id be provided externally?\n\t\t\tmanufacturerId: meta.manufacturerId,\n\t\t\tfirmwareId: target == 0\n\t\t\t\t? meta.firmwareId\n\t\t\t\t: meta.additionalFirmwareIDs[target - 1],\n\t\t\tfirmwareTarget: target,\n\t\t\tfragmentSize,\n\t\t\tchecksum,\n\t\t\thardwareVersion,\n\t\t\tresume,\n\t\t\tnonSecureTransfer,\n\t\t});\n\t\t// Pause the task until the response is received, because that can take\n\t\t// up to a minute\n\t\tconst result: FirmwareUpdateMetaDataCCRequestReport = yield () =>\n\t\t\tthis.driver\n\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCRequestReport>(\n\t\t\t\t\t(cc) =>\n\t\t\t\t\t\tcc instanceof FirmwareUpdateMetaDataCCRequestReport\n\t\t\t\t\t\t&& cc.nodeId === this.id,\n\t\t\t\t\t60000,\n\t\t\t\t);\n\n\t\tswitch (result.status) {\n\t\t\tcase FirmwareUpdateRequestStatus.Error_AuthenticationExpected:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A manual authentication event (e.g. button push) was expected!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_BatteryLow:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The battery level is too low!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_FirmwareUpgradeInProgress:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A firmware upgrade is already in progress!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_InvalidManufacturerOrFirmwareID:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid manufacturer or firmware id!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_InvalidHardwareVersion:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid hardware version!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_NotUpgradable:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Firmware target #${target} is not upgradable!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_FragmentSizeTooLarge:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The chosen fragment size is too large!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.OK:\n\t\t\t\t// All good, we have started!\n\t\t\t\t// Keep the node awake until the update is done.\n\t\t\t\tthis.keepAwake = true;\n\t\t}\n\n\t\treturn {\n\t\t\tresume: !!result.resume,\n\t\t\tnonSecureTransfer: !!result.nonSecureTransfer,\n\t\t};\n\t}\n\n\tprotected async handleFirmwareUpdateMetaDataGet(\n\t\tcommand: FirmwareUpdateMetaDataCCMetaDataGet,\n\t): Promise<void> {\n\t\tconst endpoint = this.getEndpoint(command.endpointIndex)\n\t\t\t?? this;\n\n\t\t// We are being queried, so the device may actually not support the CC, just control it.\n\t\t// Using the commandClasses property would throw in that case\n\t\tconst api = endpoint\n\t\t\t.createAPI(CommandClasses[\"Firmware Update Meta Data\"], false)\n\t\t\t.withOptions({\n\t\t\t\t// Answer with the same encapsulation as asked, but omit\n\t\t\t\t// Supervision as it shouldn't be used for Get-Report flows\n\t\t\t\tencapsulationFlags: command.encapsulationFlags\n\t\t\t\t\t& ~EncapsulationFlags.Supervision,\n\t\t\t});\n\n\t\t// We do not support the firmware to be upgraded.\n\t\tawait api.reportMetaData({\n\t\t\tmanufacturerId: this.driver.options.vendor?.manufacturerId\n\t\t\t\t?? 0xffff,\n\t\t\tfirmwareUpgradable: false,\n\t\t\thardwareVersion: this.driver.options.vendor?.hardwareVersion\n\t\t\t\t?? 0,\n\t\t});\n\t}\n\n\tprivate async sendCorruptedFirmwareUpdateReport(\n\t\treportNum: number,\n\t\tfragment: Uint8Array,\n\t\tnonSecureTransfer: boolean = false,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t.withOptions({\n\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t})\n\t\t\t\t.sendFirmwareFragment(reportNum, true, fragment);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tprivate hasPendingFirmwareUpdateFragment(\n\t\tfragmentNumber: number,\n\t): boolean {\n\t\t// Avoid queuing duplicate fragments\n\t\tconst isCurrentFirmwareFragment = (t: Transaction) =>\n\t\t\tt.message.getNodeId() === this.id\n\t\t\t&& containsCC(t.message)\n\t\t\t&& t.message.command instanceof FirmwareUpdateMetaDataCCReport\n\t\t\t&& t.message.command.reportNumber === fragmentNumber;\n\n\t\treturn this.driver.hasPendingTransactions(\n\t\t\tisCurrentFirmwareFragment,\n\t\t);\n\t}\n\n\tprivate async *doFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\tfragmentSize: number,\n\t\tnonSecureTransfer: boolean,\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t\tonProgress: (fragment: number, total: number) => void,\n\t): AsyncGenerator<\n\t\tany,\n\t\tPartialFirmwareUpdateResult,\n\t\tany\n\t> {\n\t\tconst numFragments = Math.ceil(data.length / fragmentSize);\n\n\t\t// Make sure we're not responding to an outdated request immediately\n\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\n\t\t// ================================\n\t\t// STEP 4:\n\t\t// Respond to fragment requests from the node\n\t\tupdate: while (true) {\n\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t// During ongoing firmware updates, it can happen that the next request is received before the callback for the previous response\n\t\t\t// is back. In that case we can immediately handle the premature request. Otherwise wait for the next request.\n\t\t\tlet fragmentRequest: FirmwareUpdateMetaDataCCGet;\n\t\t\tif (this._firmwareUpdatePrematureRequest) {\n\t\t\t\tfragmentRequest = this._firmwareUpdatePrematureRequest;\n\t\t\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tfragmentRequest = yield () =>\n\t\t\t\t\t\tthis.driver\n\t\t\t\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCGet>(\n\t\t\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCGet,\n\t\t\t\t\t\t\t\t// Wait up to 2 minutes for each fragment request.\n\t\t\t\t\t\t\t\t// Some users try to update devices with unstable connections, where 30s can be too short.\n\t\t\t\t\t\t\t\ttimespan.minutes(2),\n\t\t\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// In some cases it can happen that the device stops requesting update frames\n\t\t\t\t\t// We need to timeout the update in this case so it can be restarted\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage: `Firmware update timed out`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When a node requests a firmware update fragment, it must be awake\n\t\t\tthis.markAsAwake();\n\n\t\t\tif (fragmentRequest.reportNumber > numFragments) {\n\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Received Firmware Update Get for an out-of-bounds fragment. Forcing the node to abort...`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\trandomBytes(fragmentSize),\n\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t);\n\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\tbreak update;\n\t\t\t}\n\n\t\t\t// Actually send the requested frames\n\t\t\trequest: for (\n\t\t\t\tlet num = fragmentRequest.reportNumber;\n\t\t\t\tnum\n\t\t\t\t\t< fragmentRequest.reportNumber\n\t\t\t\t\t\t+ fragmentRequest.numReports;\n\t\t\t\tnum++\n\t\t\t) {\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// Check if the node requested more fragments than are left\n\t\t\t\tif (num > numFragments) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst fragment = data.subarray(\n\t\t\t\t\t(num - 1) * fragmentSize,\n\t\t\t\t\tnum * fragmentSize,\n\t\t\t\t);\n\n\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\t\trandomBytes(fragment.length),\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t);\n\t\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\t\tbreak update;\n\t\t\t\t} else {\n\t\t\t\t\t// Avoid queuing duplicate fragments\n\t\t\t\t\tif (this.hasPendingFirmwareUpdateFragment(num)) {\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage: `Firmware fragment ${num} already queued`,\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue request;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Sending firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tconst isLast = num === numFragments;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this\n\t\t\t\t\t\t\t.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t\t\t\t.withOptions({\n\t\t\t\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.sendFirmwareFragment(num, isLast, fragment);\n\n\t\t\t\t\t\tonProgress(num, numFragments);\n\n\t\t\t\t\t\t// If that was the last one wait for status report from the node and restart interview\n\t\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\t\tabortContext.tooLateToAbort = true;\n\t\t\t\t\t\t\tbreak update;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// When transmitting fails, simply stop responding to this request and wait for the node to re-request the fragment\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Failed to send firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak request;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tyield; // Give the task scheduler time to do something else\n\n\t\t// ================================\n\t\t// STEP 5:\n\t\t// Finalize the update process\n\n\t\tconst statusReport:\n\t\t\t| FirmwareUpdateMetaDataCCStatusReport\n\t\t\t| undefined = yield () =>\n\t\t\t\tthis.driver\n\t\t\t\t\t.waitForCommand(\n\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCStatusReport,\n\t\t\t\t\t\t// Wait up to 5 minutes. It should never take that long, but the specs\n\t\t\t\t\t\t// don't say anything specific\n\t\t\t\t\t\t5 * 60000,\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() => undefined);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(\n\t\t\t\tstatusReport?.status\n\t\t\t\t\t=== FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t);\n\t\t}\n\n\t\tif (!statusReport) {\n\t\t\tthis.driver.controllerLog.logNode(\n\t\t\t\tthis.id,\n\t\t\t\t`The node did not acknowledge the completed update`,\n\t\t\t\t\"warn\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t};\n\t\t}\n\n\t\tconst { status, waitTime } = statusReport;\n\n\t\t// Actually, OK_WaitingForActivation should never happen since we don't allow\n\t\t// delayed activation in the RequestGet command\n\t\tconst success = status >= FirmwareUpdateStatus.OK_WaitingForActivation;\n\n\t\treturn {\n\t\t\tsuccess,\n\t\t\tstatus,\n\t\t\twaitTime,\n\t\t};\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import {\n\ttype FirmwareUpdateMetaData,\n\tFirmwareUpdateMetaDataCC,\n\tFirmwareUpdateMetaDataCCGet,\n\ttype FirmwareUpdateMetaDataCCMetaDataGet,\n\tFirmwareUpdateMetaDataCCReport,\n\tFirmwareUpdateMetaDataCCRequestReport,\n\tFirmwareUpdateMetaDataCCStatusReport,\n\ttype FirmwareUpdateOptions,\n\ttype FirmwareUpdateProgress,\n\tFirmwareUpdateRequestStatus,\n\ttype FirmwareUpdateResult,\n\tFirmwareUpdateStatus,\n\tgetEffectiveCCVersion,\n} from \"@zwave-js/cc\";\nimport {\n\tCRC16_CCITT,\n\tCommandClasses,\n\tEncapsulationFlags,\n\ttype Firmware,\n\tSecurityClass,\n\tZWaveError,\n\tZWaveErrorCodes,\n\trandomBytes,\n\tsecurityClassIsS2,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport { containsCC } from \"@zwave-js/serial/serialapi\";\nimport { getEnumMemberName, throttle } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { wait } from \"alcalzone-shared/async\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { roundTo } from \"alcalzone-shared/math\";\nimport {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskPriority,\n} from \"../../driver/Task.js\";\nimport { type Transaction } from \"../../driver/Transaction.js\";\nimport { SchedulePollMixin } from \"./60_ScheduledPoll.js\";\n\ninterface AbortFirmwareUpdateContext {\n\tabort: boolean;\n\ttooLateToAbort: boolean;\n\tabortPromise: DeferredPromise<boolean>;\n}\n\ntype PartialFirmwareUpdateResult =\n\t& Pick<FirmwareUpdateResult, \"status\" | \"waitTime\">\n\t& { success: boolean };\n\n/** Checks if a task belongs to a route rebuilding process */\nexport function isFirmwareUpdateOTATask(t: Task<unknown>): boolean {\n\treturn t.tag?.id === \"firmware-update-ota\";\n}\n\nexport interface NodeFirmwareUpdate {\n\t/**\n\t * Aborts an active firmware update process\n\t */\n\tabortFirmwareUpdate(): Promise<void>;\n\n\t/**\n\t * Performs an OTA firmware upgrade of one or more chips on this node.\n\t *\n\t * This method will resolve after the process has **COMPLETED**. Failure to start any one of the provided updates will throw an error.\n\t *\n\t * **WARNING: Use at your own risk! We don't take any responsibility if your devices don't work after an update.**\n\t *\n\t * @param updates An array of firmware updates that will be done in sequence\n\t *\n\t * @returns Whether all of the given updates were successful.\n\t */\n\tupdateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions?: FirmwareUpdateOptions,\n\t): Promise<FirmwareUpdateResult>;\n\n\t/**\n\t * Returns whether a firmware update is in progress for this node.\n\t */\n\tisFirmwareUpdateInProgress(): boolean;\n}\n\nexport abstract class FirmwareUpdateMixin extends SchedulePollMixin\n\timplements NodeFirmwareUpdate\n{\n\tprivate _abortFirmwareUpdate: (() => Promise<void>) | undefined;\n\tpublic async abortFirmwareUpdate(): Promise<void> {\n\t\tif (!this._abortFirmwareUpdate) return;\n\t\tawait this._abortFirmwareUpdate();\n\t}\n\n\t// Stores the CRC of the previously transferred firmware image.\n\t// Allows detecting whether resuming is supported and where to continue in a multi-file transfer.\n\tprivate _previousFirmwareCRC: number | undefined;\n\n\t/** Is used to remember fragment requests that came in before they were able to be handled */\n\tprivate _firmwareUpdatePrematureRequest:\n\t\t| FirmwareUpdateMetaDataCCGet\n\t\t| undefined;\n\n\tpublic async updateFirmware(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> {\n\t\tif (updates.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one update must be provided`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that each update has a buffer with at least 1 byte\n\t\tif (updates.some((u) => u.data.length === 0)) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`All firmware updates must have a non-empty data buffer`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Check that the targets are not duplicates\n\t\tif (\n\t\t\tdistinct(updates.map((u) => u.firmwareTarget ?? 0)).length\n\t\t\t\t!== updates.length\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The target of all provided firmware updates must be unique`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\t// Don't start the process twice\n\t\tif (this.driver.controller.isFirmwareUpdateInProgress()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: An OTW upgrade of the controller is in progress!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Don't allow starting two firmware updates for the same node\n\t\tconst task = this.getUpdateFirmwareTask(updates, options);\n\t\tif (task instanceof Promise) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: A firmware update is already in progress for this node!`,\n\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t);\n\t\t}\n\n\t\t// Queue the task\n\t\treturn this.driver.scheduler.queueTask(task);\n\t}\n\n\tpublic isFirmwareUpdateInProgress(): boolean {\n\t\treturn !!this.driver.scheduler.findTask(isFirmwareUpdateOTATask);\n\t}\n\n\tprivate getUpdateFirmwareTask(\n\t\tupdates: Firmware[],\n\t\toptions: FirmwareUpdateOptions = {},\n\t): Promise<FirmwareUpdateResult> | TaskBuilder<FirmwareUpdateResult> {\n\t\tconst self = this;\n\n\t\t// This task should only run once at a time\n\t\tconst existingTask = this.driver.scheduler.findTask<\n\t\t\tFirmwareUpdateResult\n\t\t>((t) =>\n\t\t\tt.tag?.id === \"firmware-update-ota\"\n\t\t\t&& t.tag.nodeId === self.id\n\t\t);\n\t\tif (existingTask) return existingTask;\n\n\t\tlet keepAwake: boolean;\n\n\t\treturn {\n\t\t\t// Firmware updates cause a lot of traffic. Execute them in the background.\n\t\t\tpriority: TaskPriority.Lower,\n\t\t\ttag: { id: \"firmware-update-ota\", nodeId: self.id },\n\t\t\ttask: async function* firmwareUpdateTask() {\n\t\t\t\t// Keep battery powered nodes awake during the process\n\t\t\t\tkeepAwake = self.keepAwake;\n\t\t\t\tself.keepAwake = true;\n\n\t\t\t\t// Support aborting the update\n\t\t\t\tconst abortContext = {\n\t\t\t\t\tabort: false,\n\t\t\t\t\ttooLateToAbort: false,\n\t\t\t\t\tabortPromise: createDeferredPromise<boolean>(),\n\t\t\t\t};\n\n\t\t\t\tself._abortFirmwareUpdate = async () => {\n\t\t\t\t\tif (abortContext.tooLateToAbort) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The firmware update was transmitted completely, cannot abort anymore.`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Aborting firmware update...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Trigger the abort\n\t\t\t\t\tabortContext.abort = true;\n\t\t\t\t\tconst aborted = await abortContext.abortPromise;\n\t\t\t\t\tif (!aborted) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`The node did not acknowledge the aborted update`,\n\t\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToAbort,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\tmessage: `Firmware update aborted`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\t// Prepare the firmware update\n\t\t\t\tlet fragmentSizeSecure: number;\n\t\t\t\tlet fragmentSizeNonSecure: number;\n\t\t\t\tlet hardwareVersion: number | undefined;\n\t\t\t\tlet meta: FirmwareUpdateMetaData;\n\t\t\t\ttry {\n\t\t\t\t\tconst prepareResult = await self\n\t\t\t\t\t\t.prepareFirmwareUpdateInternal(\n\t\t\t\t\t\t\tupdates.map((u) => u.firmwareTarget ?? 0),\n\t\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Handle early aborts\n\t\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tstatus: FirmwareUpdateStatus\n\t\t\t\t\t\t\t\t.Error_TransmissionFailed,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the firmware update was not aborted, prepareResult is definitely defined\n\t\t\t\t\t({\n\t\t\t\t\t\tfragmentSizeSecure,\n\t\t\t\t\t\tfragmentSizeNonSecure,\n\t\t\t\t\t\thardwareVersion,\n\t\t\t\t\t\t...meta\n\t\t\t\t\t} = prepareResult!);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not sure what the error is, but we'll label it \"transmission failed\"\n\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// The resume and non-secure transfer features may not be supported by the node\n\t\t\t\t// If not, disable them, even though the application requested them\n\t\t\t\tif (!meta.supportsResuming) options.resume = false;\n\n\t\t\t\tconst securityClass = self.getHighestSecurityClass();\n\t\t\t\tconst isSecure = securityClass === SecurityClass.S0_Legacy\n\t\t\t\t\t|| securityClassIsS2(securityClass);\n\t\t\t\tif (!isSecure) {\n\t\t\t\t\t// The nonSecureTransfer option is only relevant for secure devices\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t} else if (!meta.supportsNonSecureTransfer) {\n\t\t\t\t\toptions.nonSecureTransfer = false;\n\t\t\t\t}\n\n\t\t\t\t// Throttle the progress emitter so applications can handle the load of events\n\t\t\t\tconst notifyProgress = throttle(\n\t\t\t\t\t(progress) =>\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update progress\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t),\n\t\t\t\t\t250,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\t// If resuming is supported and desired, try to figure out with which file to continue\n\t\t\t\tconst updatesWithChecksum = updates.map((u) => ({\n\t\t\t\t\t...u,\n\t\t\t\t\tchecksum: CRC16_CCITT(u.data),\n\t\t\t\t}));\n\t\t\t\tlet skipFinishedFiles = -1;\n\t\t\t\tlet shouldResume = options.resume\n\t\t\t\t\t&& self._previousFirmwareCRC != undefined;\n\t\t\t\tif (shouldResume) {\n\t\t\t\t\tskipFinishedFiles = updatesWithChecksum.findIndex(\n\t\t\t\t\t\t(u) => u.checksum === self._previousFirmwareCRC,\n\t\t\t\t\t);\n\t\t\t\t\tif (skipFinishedFiles === -1) shouldResume = false;\n\t\t\t\t}\n\n\t\t\t\t// Perform all firmware updates in sequence\n\t\t\t\tlet updateResult!: PartialFirmwareUpdateResult;\n\t\t\t\tlet conservativeWaitTime: number;\n\n\t\t\t\tconst totalBytes: number = updatesWithChecksum.reduce(\n\t\t\t\t\t(total, update) => total + update.data.length,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tlet sentBytesOfPreviousFiles = 0;\n\n\t\t\t\tfor (let i = 0; i < updatesWithChecksum.length; i++) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\t// If the firmware target is not given, update the Z-Wave chip\n\t\t\t\t\t\tfirmwareTarget: target = 0,\n\t\t\t\t\t\t// If the firmware ID is not given, use the current one for the given chip\n\t\t\t\t\t\tfirmwareId = target === 0\n\t\t\t\t\t\t\t? meta.firmwareId\n\t\t\t\t\t\t\t: meta.additionalFirmwareIDs[target - 1],\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tchecksum,\n\t\t\t\t\t} = updatesWithChecksum[i];\n\n\t\t\t\t\tif (i < skipFinishedFiles) {\n\t\t\t\t\t\t// If we are resuming, skip this file since it was already done before\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Skipping already completed firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t`Updating firmware (part ${\n\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t} / ${updatesWithChecksum.length})...`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// For determining the initial fragment size, assume the node respects our choice.\n\t\t\t\t\t// If the node is not secure, these two values are identical anyways.\n\t\t\t\t\tlet fragmentSize = options.nonSecureTransfer\n\t\t\t\t\t\t? fragmentSizeNonSecure\n\t\t\t\t\t\t: fragmentSizeSecure;\n\n\t\t\t\t\t// Tell the node to start requesting fragments\n\t\t\t\t\tconst { resume, nonSecureTransfer } = yield* self\n\t\t\t\t\t\t.beginFirmwareUpdateInternal(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tmeta.manufacturerId,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tfirmwareId,\n\t\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\t\tchecksum,\n\t\t\t\t\t\t\thardwareVersion,\n\t\t\t\t\t\t\tshouldResume,\n\t\t\t\t\t\t\toptions.nonSecureTransfer,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// If the node did not accept non-secure transfer, revisit our choice of fragment size\n\t\t\t\t\tif (options.nonSecureTransfer && !nonSecureTransfer) {\n\t\t\t\t\t\tfragmentSize = fragmentSizeSecure;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the checksum, so we can resume if necessary\n\t\t\t\t\tself._previousFirmwareCRC = checksum;\n\n\t\t\t\t\tif (shouldResume) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Node ${\n\t\t\t\t\t\t\t\tresume ? \"accepted\" : \"did not accept\"\n\t\t\t\t\t\t\t} resuming the update...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (nonSecureTransfer) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Firmware will be transferred without encryption...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t\t// Listen for firmware update fragment requests and handle them\n\t\t\t\t\tupdateResult = yield* self.doFirmwareUpdateInternal(\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tfragmentSize,\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t\tabortContext,\n\t\t\t\t\t\t(fragment, total) => {\n\t\t\t\t\t\t\tconst progress: FirmwareUpdateProgress = {\n\t\t\t\t\t\t\t\tcurrentFile: i + 1,\n\t\t\t\t\t\t\t\ttotalFiles: updatesWithChecksum.length,\n\t\t\t\t\t\t\t\tsentFragments: fragment,\n\t\t\t\t\t\t\t\ttotalFragments: total,\n\t\t\t\t\t\t\t\tprogress: roundTo(\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t(sentBytesOfPreviousFiles\n\t\t\t\t\t\t\t\t\t\t\t+ Math.min(\n\t\t\t\t\t\t\t\t\t\t\t\tfragment * fragmentSize,\n\t\t\t\t\t\t\t\t\t\t\t\tdata.length,\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t/ totalBytes\n\t\t\t\t\t\t\t\t\t) * 100,\n\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tnotifyProgress(progress);\n\n\t\t\t\t\t\t\t// When this file is done, add the fragments to the total, so we can compute the total progress correctly\n\t\t\t\t\t\t\tif (fragment === total) {\n\t\t\t\t\t\t\t\tsentBytesOfPreviousFiles += data.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\t// If we wait, wait a bit longer than the device told us, so it is actually ready to use\n\t\t\t\t\tconservativeWaitTime = self.driver\n\t\t\t\t\t\t.getConservativeWaitTimeAfterFirmwareUpdate(\n\t\t\t\t\t\t\tupdateResult.waitTime,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!updateResult.success) {\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) failed with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t\t\t...updateResult,\n\t\t\t\t\t\t\twaitTime: undefined,\n\t\t\t\t\t\t\treInterview: false,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tself._emit(\n\t\t\t\t\t\t\t\"firmware update finished\",\n\t\t\t\t\t\t\tself,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} else if (i < updatesWithChecksum.length - 1) {\n\t\t\t\t\t\t// Update succeeded, but we're not done yet\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(self.id, {\n\t\t\t\t\t\t\tmessage: `Firmware update (part ${\n\t\t\t\t\t\t\t\ti + 1\n\t\t\t\t\t\t\t} / ${updatesWithChecksum.length}) succeeded with status ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tFirmwareUpdateStatus,\n\t\t\t\t\t\t\t\t\tupdateResult.status,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tself.driver.controllerLog.logNode(\n\t\t\t\t\t\t\tself.id,\n\t\t\t\t\t\t\t`Continuing with next part in ${conservativeWaitTime} seconds...`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// If we've resumed the previous file, there's no need to resume the next one too\n\t\t\t\t\t\tshouldResume = false;\n\n\t\t\t\t\t\tyield () => wait(conservativeWaitTime * 1000, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We're done. No need to resume this update\n\t\t\t\tself._previousFirmwareCRC = undefined;\n\n\t\t\t\tconst result: FirmwareUpdateResult = {\n\t\t\t\t\t...updateResult,\n\t\t\t\t\twaitTime: conservativeWaitTime!,\n\t\t\t\t\treInterview: true,\n\t\t\t\t};\n\n\t\t\t\t// After a successful firmware update, we want to interview sleeping nodes immediately,\n\t\t\t\t// so don't send them to sleep when they wake up\n\t\t\t\tkeepAwake = true;\n\n\t\t\t\tself._emit(\"firmware update finished\", self, result);\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tcleanup() {\n\t\t\t\tself._abortFirmwareUpdate = undefined;\n\t\t\t\tself._firmwareUpdatePrematureRequest = undefined;\n\n\t\t\t\t// Make sure that the keepAwake flag gets reset at the end\n\t\t\t\tself.keepAwake = keepAwake;\n\t\t\t\tif (!keepAwake) {\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tself.driver.debounceSendNodeToSleep(self);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Prepares the firmware update of a single target by collecting the necessary information */\n\tprivate async prepareFirmwareUpdateInternal(\n\t\ttargets: number[],\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t): Promise<\n\t\t| undefined\n\t\t| (FirmwareUpdateMetaData & {\n\t\t\tfragmentSizeSecure: number;\n\t\t\tfragmentSizeNonSecure: number;\n\t\t})\n\t> {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 1:\n\t\t// Check if this update is possible\n\t\tconst meta = await api.getMetaData();\n\t\tif (!meta) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Failed to start the update: The node did not respond in time!`,\n\t\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t\t);\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tif (target === 0) {\n\t\t\t\tif (!meta.firmwareUpgradable) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The Z-Wave chip firmware is not upgradable!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (api.version < 3) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: The node does not support upgrading a different firmware target than 0!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\tmeta.additionalFirmwareIDs[target - 1] == undefined\n\t\t\t\t) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`Failed to start the update: Firmware target #${target} not found on this node!`,\n\t\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_TargetNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ================================\n\t\t// STEP 2:\n\t\t// Determine the fragment size\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\tthis.driver.isCCSecure(fcc.ccId, this.id),\n\t\t);\n\t\tconst maxGrossPayloadSizeSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(\n\t\t\t\tfcc,\n\t\t\t);\n\t\tconst maxGrossPayloadSizeNonSecure = this.driver\n\t\t\t.computeNetCCPayloadSize(fcc, true);\n\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst maxNetPayloadSizeSecure = maxGrossPayloadSizeSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst maxNetPayloadSizeNonSecure = maxGrossPayloadSizeNonSecure\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\n\t\t// Use the smallest allowed payload\n\t\tconst fragmentSizeSecure = Math.min(\n\t\t\tmaxNetPayloadSizeSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\t\tconst fragmentSizeNonSecure = Math.min(\n\t\t\tmaxNetPayloadSizeNonSecure,\n\t\t\tmeta.maxFragmentSize ?? Number.POSITIVE_INFINITY,\n\t\t);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(true);\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...meta,\n\t\t\t\tfragmentSizeSecure,\n\t\t\t\tfragmentSizeNonSecure,\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async handleUnexpectedFirmwareUpdateGet(\n\t\tcommand: FirmwareUpdateMetaDataCCGet,\n\t): Promise<void> {\n\t\t// This method will only be called under two circumstances:\n\t\t// 1. The node is currently busy responding to a firmware update request -> remember the request\n\t\tif (this.isFirmwareUpdateInProgress()) {\n\t\t\tthis._firmwareUpdatePrematureRequest = command;\n\t\t\treturn;\n\t\t}\n\n\t\t// 2. No firmware update is in progress -> abort\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage:\n\t\t\t\t`Received Firmware Update Get, but no firmware update is in progress. Forcing the node to abort...`,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\t// Since no update is in progress, we need to determine the fragment size again\n\t\tconst fcc = new FirmwareUpdateMetaDataCC({ nodeId: this.id });\n\t\tfcc.toggleEncapsulationFlag(\n\t\t\tEncapsulationFlags.Security,\n\t\t\t!!(command.encapsulationFlags & EncapsulationFlags.Security),\n\t\t);\n\t\tconst ccVersion = getEffectiveCCVersion(this.driver, fcc);\n\t\tconst fragmentSize = this.driver.computeNetCCPayloadSize(fcc)\n\t\t\t- 2 // report number\n\t\t\t- (ccVersion >= 2 ? 2 : 0); // checksum\n\t\tconst fragment = randomBytes(fragmentSize);\n\t\ttry {\n\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\tcommand.reportNumber,\n\t\t\t\tfragment,\n\t\t\t);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */\n\tprivate async *beginFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\tmanufacturerId: number,\n\t\ttarget: number,\n\t\tfirmwareId: number,\n\t\tfragmentSize: number,\n\t\tchecksum: number,\n\t\thardwareVersion?: number,\n\t\tresume?: boolean,\n\t\tnonSecureTransfer?: boolean,\n\t) {\n\t\tconst api = this.commandClasses[\"Firmware Update Meta Data\"];\n\n\t\t// ================================\n\t\t// STEP 3:\n\t\t// Start the update\n\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\tmessage: `Starting firmware update...`,\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\t// Request the node to start the upgrade\n\t\tawait api.requestUpdate({\n\t\t\t// TODO: Should manufacturer id be provided externally?\n\t\t\tmanufacturerId,\n\t\t\tfirmwareId,\n\t\t\tfirmwareTarget: target,\n\t\t\tfragmentSize,\n\t\t\tchecksum,\n\t\t\thardwareVersion,\n\t\t\tresume,\n\t\t\tnonSecureTransfer,\n\t\t});\n\t\t// Pause the task until the response is received, because that can take\n\t\t// up to a minute\n\t\tconst result: FirmwareUpdateMetaDataCCRequestReport = yield () =>\n\t\t\tthis.driver\n\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCRequestReport>(\n\t\t\t\t\t(cc) =>\n\t\t\t\t\t\tcc instanceof FirmwareUpdateMetaDataCCRequestReport\n\t\t\t\t\t\t&& cc.nodeId === this.id,\n\t\t\t\t\t60000,\n\t\t\t\t);\n\n\t\tswitch (result.status) {\n\t\t\tcase FirmwareUpdateRequestStatus.Error_AuthenticationExpected:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A manual authentication event (e.g. button push) was expected!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_BatteryLow:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The battery level is too low!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_FirmwareUpgradeInProgress:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: A firmware upgrade is already in progress!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_Busy,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus\n\t\t\t\t.Error_InvalidManufacturerOrFirmwareID:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid manufacturer or firmware id!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_InvalidHardwareVersion:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Invalid hardware version!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_NotUpgradable:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: Firmware target #${target} is not upgradable!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_NotUpgradable,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.Error_FragmentSizeTooLarge:\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Failed to start the update: The chosen fragment size is too large!`,\n\t\t\t\t\tZWaveErrorCodes.FirmwareUpdateCC_FailedToStart,\n\t\t\t\t);\n\t\t\tcase FirmwareUpdateRequestStatus.OK:\n\t\t\t\t// All good, we have started!\n\t\t\t\t// Keep the node awake until the update is done.\n\t\t\t\tthis.keepAwake = true;\n\t\t}\n\n\t\treturn {\n\t\t\tresume: !!result.resume,\n\t\t\tnonSecureTransfer: !!result.nonSecureTransfer,\n\t\t};\n\t}\n\n\tprotected async handleFirmwareUpdateMetaDataGet(\n\t\tcommand: FirmwareUpdateMetaDataCCMetaDataGet,\n\t): Promise<void> {\n\t\tconst endpoint = this.getEndpoint(command.endpointIndex)\n\t\t\t?? this;\n\n\t\t// We are being queried, so the device may actually not support the CC, just control it.\n\t\t// Using the commandClasses property would throw in that case\n\t\tconst api = endpoint\n\t\t\t.createAPI(CommandClasses[\"Firmware Update Meta Data\"], false)\n\t\t\t.withOptions({\n\t\t\t\t// Answer with the same encapsulation as asked, but omit\n\t\t\t\t// Supervision as it shouldn't be used for Get-Report flows\n\t\t\t\tencapsulationFlags: command.encapsulationFlags\n\t\t\t\t\t& ~EncapsulationFlags.Supervision,\n\t\t\t});\n\n\t\t// We do not support the firmware to be upgraded.\n\t\tawait api.reportMetaData({\n\t\t\tmanufacturerId: this.driver.options.vendor?.manufacturerId\n\t\t\t\t?? 0xffff,\n\t\t\tfirmwareUpgradable: false,\n\t\t\thardwareVersion: this.driver.options.vendor?.hardwareVersion\n\t\t\t\t?? 0,\n\t\t});\n\t}\n\n\tprivate async sendCorruptedFirmwareUpdateReport(\n\t\treportNum: number,\n\t\tfragment: Uint8Array,\n\t\tnonSecureTransfer: boolean = false,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t.withOptions({\n\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t})\n\t\t\t\t.sendFirmwareFragment(reportNum, true, fragment);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tprivate hasPendingFirmwareUpdateFragment(\n\t\tfragmentNumber: number,\n\t): boolean {\n\t\t// Avoid queuing duplicate fragments\n\t\tconst isCurrentFirmwareFragment = (t: Transaction) =>\n\t\t\tt.message.getNodeId() === this.id\n\t\t\t&& containsCC(t.message)\n\t\t\t&& t.message.command instanceof FirmwareUpdateMetaDataCCReport\n\t\t\t&& t.message.command.reportNumber === fragmentNumber;\n\n\t\treturn this.driver.hasPendingTransactions(\n\t\t\tisCurrentFirmwareFragment,\n\t\t);\n\t}\n\n\tprivate async *doFirmwareUpdateInternal(\n\t\tdata: Uint8Array,\n\t\tfragmentSize: number,\n\t\tnonSecureTransfer: boolean,\n\t\tabortContext: AbortFirmwareUpdateContext,\n\t\tonProgress: (fragment: number, total: number) => void,\n\t): AsyncGenerator<\n\t\tany,\n\t\tPartialFirmwareUpdateResult,\n\t\tany\n\t> {\n\t\tconst numFragments = Math.ceil(data.length / fragmentSize);\n\n\t\t// Make sure we're not responding to an outdated request immediately\n\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\n\t\t// ================================\n\t\t// STEP 4:\n\t\t// Respond to fragment requests from the node\n\t\tupdate: while (true) {\n\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t// During ongoing firmware updates, it can happen that the next request is received before the callback for the previous response\n\t\t\t// is back. In that case we can immediately handle the premature request. Otherwise wait for the next request.\n\t\t\tlet fragmentRequest: FirmwareUpdateMetaDataCCGet;\n\t\t\tif (this._firmwareUpdatePrematureRequest) {\n\t\t\t\tfragmentRequest = this._firmwareUpdatePrematureRequest;\n\t\t\t\tthis._firmwareUpdatePrematureRequest = undefined;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tfragmentRequest = yield () =>\n\t\t\t\t\t\tthis.driver\n\t\t\t\t\t\t\t.waitForCommand<FirmwareUpdateMetaDataCCGet>(\n\t\t\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCGet,\n\t\t\t\t\t\t\t\t// Wait up to 2 minutes for each fragment request.\n\t\t\t\t\t\t\t\t// Some users try to update devices with unstable connections, where 30s can be too short.\n\t\t\t\t\t\t\t\ttimespan.minutes(2),\n\t\t\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// In some cases it can happen that the device stops requesting update frames\n\t\t\t\t\t// We need to timeout the update in this case so it can be restarted\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage: `Firmware update timed out`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When a node requests a firmware update fragment, it must be awake\n\t\t\tthis.markAsAwake();\n\n\t\t\tif (fragmentRequest.reportNumber > numFragments) {\n\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Received Firmware Update Get for an out-of-bounds fragment. Forcing the node to abort...`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\trandomBytes(fragmentSize),\n\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t);\n\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\tbreak update;\n\t\t\t}\n\n\t\t\t// Actually send the requested frames\n\t\t\trequest: for (\n\t\t\t\tlet num = fragmentRequest.reportNumber;\n\t\t\t\tnum\n\t\t\t\t\t< fragmentRequest.reportNumber\n\t\t\t\t\t\t+ fragmentRequest.numReports;\n\t\t\t\tnum++\n\t\t\t) {\n\t\t\t\tyield; // Give the task scheduler time to do something else\n\n\t\t\t\t// Check if the node requested more fragments than are left\n\t\t\t\tif (num > numFragments) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst fragment = data.subarray(\n\t\t\t\t\t(num - 1) * fragmentSize,\n\t\t\t\t\tnum * fragmentSize,\n\t\t\t\t);\n\n\t\t\t\tif (abortContext.abort) {\n\t\t\t\t\tawait this.sendCorruptedFirmwareUpdateReport(\n\t\t\t\t\t\tfragmentRequest.reportNumber,\n\t\t\t\t\t\trandomBytes(fragment.length),\n\t\t\t\t\t\tnonSecureTransfer,\n\t\t\t\t\t);\n\t\t\t\t\t// This will cause the node to abort the process, wait for that\n\t\t\t\t\tbreak update;\n\t\t\t\t} else {\n\t\t\t\t\t// Avoid queuing duplicate fragments\n\t\t\t\t\tif (this.hasPendingFirmwareUpdateFragment(num)) {\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage: `Firmware fragment ${num} already queued`,\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue request;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Sending firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tconst isLast = num === numFragments;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this\n\t\t\t\t\t\t\t.commandClasses[\"Firmware Update Meta Data\"]\n\t\t\t\t\t\t\t.withOptions({\n\t\t\t\t\t\t\t\t// Only encapsulate if the transfer is secure\n\t\t\t\t\t\t\t\tautoEncapsulate: !nonSecureTransfer,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.sendFirmwareFragment(num, isLast, fragment);\n\n\t\t\t\t\t\tonProgress(num, numFragments);\n\n\t\t\t\t\t\t// If that was the last one wait for status report from the node and restart interview\n\t\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\t\tabortContext.tooLateToAbort = true;\n\t\t\t\t\t\t\tbreak update;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// When transmitting fails, simply stop responding to this request and wait for the node to re-request the fragment\n\t\t\t\t\t\tthis.driver.controllerLog.logNode(this.id, {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t`Failed to send firmware fragment ${num} / ${numFragments}`,\n\t\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak request;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tyield; // Give the task scheduler time to do something else\n\n\t\t// ================================\n\t\t// STEP 5:\n\t\t// Finalize the update process\n\n\t\tconst statusReport:\n\t\t\t| FirmwareUpdateMetaDataCCStatusReport\n\t\t\t| undefined = yield () =>\n\t\t\t\tthis.driver\n\t\t\t\t\t.waitForCommand(\n\t\t\t\t\t\t(cc) =>\n\t\t\t\t\t\t\tcc.nodeId === this.id\n\t\t\t\t\t\t\t&& cc\n\t\t\t\t\t\t\t\tinstanceof FirmwareUpdateMetaDataCCStatusReport,\n\t\t\t\t\t\t// Wait up to 5 minutes. It should never take that long, but the specs\n\t\t\t\t\t\t// don't say anything specific\n\t\t\t\t\t\t5 * 60000,\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() => undefined);\n\n\t\tif (abortContext.abort) {\n\t\t\tabortContext.abortPromise.resolve(\n\t\t\t\tstatusReport?.status\n\t\t\t\t\t=== FirmwareUpdateStatus.Error_TransmissionFailed,\n\t\t\t);\n\t\t}\n\n\t\tif (!statusReport) {\n\t\t\tthis.driver.controllerLog.logNode(\n\t\t\t\tthis.id,\n\t\t\t\t`The node did not acknowledge the completed update`,\n\t\t\t\t\"warn\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstatus: FirmwareUpdateStatus.Error_Timeout,\n\t\t\t};\n\t\t}\n\n\t\tconst { status, waitTime } = statusReport;\n\n\t\t// Actually, OK_WaitingForActivation should never happen since we don't allow\n\t\t// delayed activation in the RequestGet command\n\t\tconst success = status >= FirmwareUpdateStatus.OK_WaitingForActivation;\n\n\t\treturn {\n\t\t\tsuccess,\n\t\t\tstatus,\n\t\t\twaitTime,\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["result"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"70_FirmwareUpdate.d.ts","sourceRoot":"","sources":["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,2BAA2B,EAC3B,KAAK,mCAAmC,EAIxC,KAAK,qBAAqB,EAG1B,KAAK,oBAAoB,EAGzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIN,KAAK,QAAQ,EAOb,MAAM,gBAAgB,CAAC;AAUxB,OAAO,EACN,KAAK,IAAI,EAGT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAY1D,6DAA6D;AAC7D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAEjE;AAED,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;;;;;;OAUG;IACH,cAAc,CACb,OAAO,EAAE,QAAQ,EAAE,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC;;OAEG;IACH,0BAA0B,IAAI,OAAO,CAAC;CACtC;AAED,8BAAsB,mBAAoB,SAAQ,iBACjD,YAAW,kBAAkB;IAE7B,OAAO,CAAC,oBAAoB,CAAoC;IACnD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjD,OAAO,CAAC,oBAAoB,CAAqB;IAEjD,6FAA6F;IAC7F,OAAO,CAAC,+BAA+B,CAE1B;IAEA,cAAc,CAC1B,OAAO,EAAE,QAAQ,EAAE,EACnB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,oBAAoB,CAAC;IAgDzB,0BAA0B,IAAI,OAAO;IAI5C,OAAO,CAAC,qBAAqB;
|
|
1
|
+
{"version":3,"file":"70_FirmwareUpdate.d.ts","sourceRoot":"","sources":["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,2BAA2B,EAC3B,KAAK,mCAAmC,EAIxC,KAAK,qBAAqB,EAG1B,KAAK,oBAAoB,EAGzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIN,KAAK,QAAQ,EAOb,MAAM,gBAAgB,CAAC;AAUxB,OAAO,EACN,KAAK,IAAI,EAGT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAY1D,6DAA6D;AAC7D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAEjE;AAED,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;;;;;;OAUG;IACH,cAAc,CACb,OAAO,EAAE,QAAQ,EAAE,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC;;OAEG;IACH,0BAA0B,IAAI,OAAO,CAAC;CACtC;AAED,8BAAsB,mBAAoB,SAAQ,iBACjD,YAAW,kBAAkB;IAE7B,OAAO,CAAC,oBAAoB,CAAoC;IACnD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjD,OAAO,CAAC,oBAAoB,CAAqB;IAEjD,6FAA6F;IAC7F,OAAO,CAAC,+BAA+B,CAE1B;IAEA,cAAc,CAC1B,OAAO,EAAE,QAAQ,EAAE,EACnB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,oBAAoB,CAAC;IAgDzB,0BAA0B,IAAI,OAAO;IAI5C,OAAO,CAAC,qBAAqB;IAyW7B,8FAA8F;YAChF,6BAA6B;cA6F3B,iCAAiC,CAChD,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,IAAI,CAAC;IAoChB,yHAAyH;YAC1G,2BAA2B;cA8F1B,+BAA+B,CAC9C,OAAO,EAAE,mCAAmC,GAC1C,OAAO,CAAC,IAAI,CAAC;YAyBF,iCAAiC;IAiB/C,OAAO,CAAC,gCAAgC;YAezB,wBAAwB;CA0MvC"}
|
|
@@ -165,7 +165,13 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
165
165
|
const totalBytes = updatesWithChecksum.reduce((total, update) => total + update.data.length, 0);
|
|
166
166
|
let sentBytesOfPreviousFiles = 0;
|
|
167
167
|
for (let i = 0; i < updatesWithChecksum.length; i++) {
|
|
168
|
-
const {
|
|
168
|
+
const {
|
|
169
|
+
// If the firmware target is not given, update the Z-Wave chip
|
|
170
|
+
firmwareTarget: target = 0,
|
|
171
|
+
// If the firmware ID is not given, use the current one for the given chip
|
|
172
|
+
firmwareId = target === 0
|
|
173
|
+
? meta.firmwareId
|
|
174
|
+
: meta.additionalFirmwareIDs[target - 1], data, checksum, } = updatesWithChecksum[i];
|
|
169
175
|
if (i < skipFinishedFiles) {
|
|
170
176
|
// If we are resuming, skip this file since it was already done before
|
|
171
177
|
self.driver.controllerLog.logNode(self.id, `Skipping already completed firmware update (part ${i + 1} / ${updatesWithChecksum.length})...`);
|
|
@@ -180,7 +186,7 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
180
186
|
: fragmentSizeSecure;
|
|
181
187
|
// Tell the node to start requesting fragments
|
|
182
188
|
const { resume, nonSecureTransfer } = yield* self
|
|
183
|
-
.beginFirmwareUpdateInternal(data, target,
|
|
189
|
+
.beginFirmwareUpdateInternal(data, meta.manufacturerId, target, firmwareId, fragmentSize, checksum, hardwareVersion, shouldResume, options.nonSecureTransfer);
|
|
184
190
|
// If the node did not accept non-secure transfer, revisit our choice of fragment size
|
|
185
191
|
if (options.nonSecureTransfer && !nonSecureTransfer) {
|
|
186
192
|
fragmentSize = fragmentSizeSecure;
|
|
@@ -350,7 +356,7 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
350
356
|
}
|
|
351
357
|
}
|
|
352
358
|
/** Kicks off a firmware update of a single target. Returns whether the node accepted resuming and non-secure transfer */
|
|
353
|
-
async *beginFirmwareUpdateInternal(data, target,
|
|
359
|
+
async *beginFirmwareUpdateInternal(data, manufacturerId, target, firmwareId, fragmentSize, checksum, hardwareVersion, resume, nonSecureTransfer) {
|
|
354
360
|
const api = this.commandClasses["Firmware Update Meta Data"];
|
|
355
361
|
// ================================
|
|
356
362
|
// STEP 3:
|
|
@@ -361,11 +367,9 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
361
367
|
});
|
|
362
368
|
// Request the node to start the upgrade
|
|
363
369
|
await api.requestUpdate({
|
|
364
|
-
// TODO: Should manufacturer id
|
|
365
|
-
manufacturerId
|
|
366
|
-
firmwareId
|
|
367
|
-
? meta.firmwareId
|
|
368
|
-
: meta.additionalFirmwareIDs[target - 1],
|
|
370
|
+
// TODO: Should manufacturer id be provided externally?
|
|
371
|
+
manufacturerId,
|
|
372
|
+
firmwareId,
|
|
369
373
|
firmwareTarget: target,
|
|
370
374
|
fragmentSize,
|
|
371
375
|
checksum,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"70_FirmwareUpdate.js","sourceRoot":"","sources":["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"70_FirmwareUpdate.js","sourceRoot":"","sources":["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zwave-js",
|
|
3
|
-
"version": "14.3.
|
|
3
|
+
"version": "14.3.9",
|
|
4
4
|
"description": "Z-Wave driver written entirely in JavaScript/TypeScript",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"type": "module",
|
|
@@ -99,14 +99,14 @@
|
|
|
99
99
|
"dependencies": {
|
|
100
100
|
"@alcalzone/jsonl-db": "^3.1.1",
|
|
101
101
|
"@homebridge/ciao": "^1.3.1",
|
|
102
|
-
"@zwave-js/cc": "14.3.
|
|
103
|
-
"@zwave-js/config": "14.3.
|
|
104
|
-
"@zwave-js/core": "14.3.
|
|
105
|
-
"@zwave-js/host": "14.3.
|
|
106
|
-
"@zwave-js/nvmedit": "14.3.
|
|
107
|
-
"@zwave-js/serial": "14.3.
|
|
102
|
+
"@zwave-js/cc": "14.3.9",
|
|
103
|
+
"@zwave-js/config": "14.3.9",
|
|
104
|
+
"@zwave-js/core": "14.3.9",
|
|
105
|
+
"@zwave-js/host": "14.3.9",
|
|
106
|
+
"@zwave-js/nvmedit": "14.3.9",
|
|
107
|
+
"@zwave-js/serial": "14.3.9",
|
|
108
108
|
"@zwave-js/shared": "14.3.7",
|
|
109
|
-
"@zwave-js/testing": "14.3.
|
|
109
|
+
"@zwave-js/testing": "14.3.9",
|
|
110
110
|
"alcalzone-shared": "^5.0.0",
|
|
111
111
|
"ansi-colors": "^4.1.3",
|
|
112
112
|
"execa": "^5.1.1",
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"@types/sinon": "^17.0.3",
|
|
132
132
|
"@types/source-map-support": "^0.5.10",
|
|
133
133
|
"@xstate/test": "^0.5.1",
|
|
134
|
-
"@zwave-js/maintenance": "14.3.
|
|
134
|
+
"@zwave-js/maintenance": "14.3.9",
|
|
135
135
|
"@zwave-js/transformers": "14.3.6",
|
|
136
136
|
"del-cli": "^6.0.0",
|
|
137
137
|
"mockdate": "^3.0.5",
|