zwave-js 14.3.9 → 14.3.11
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/controller/FirmwareUpdateService.js +1 -0
- package/build/cjs/lib/controller/FirmwareUpdateService.js.map +2 -2
- package/build/cjs/lib/node/mixins/70_FirmwareUpdate.js +4 -2
- 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.d.ts.map +1 -1
- package/build/esm/lib/_version.js +1 -1
- package/build/esm/lib/_version.js.map +1 -1
- package/build/esm/lib/controller/FirmwareUpdateService.d.ts.map +1 -1
- package/build/esm/lib/controller/FirmwareUpdateService.js +1 -0
- package/build/esm/lib/controller/FirmwareUpdateService.js.map +1 -1
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.d.ts.map +1 -1
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.js +8 -6
- package/build/esm/lib/node/mixins/70_FirmwareUpdate.js.map +1 -1
- package/package.json +6 -6
|
@@ -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.11";
|
|
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.11\";\nexport const PACKAGE_NAME = \"zwave-js\";\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;AACO,MAAM,kBAAkB;AACxB,MAAM,eAAe;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -112,6 +112,7 @@ function rfRegionToUpdateServiceRegion(rfRegion) {
|
|
|
112
112
|
switch (rfRegion) {
|
|
113
113
|
case import_core.RFRegion["Default (EU)"]:
|
|
114
114
|
case import_core.RFRegion.Europe:
|
|
115
|
+
case import_core.RFRegion["Europe (Long Range)"]:
|
|
115
116
|
return "europe";
|
|
116
117
|
case import_core.RFRegion.USA:
|
|
117
118
|
case import_core.RFRegion["USA (Long Range)"]:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/controller/FirmwareUpdateService.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype Firmware,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tdigest,\n\textractFirmwareAsync,\n\tguessFirmwareFileFormat,\n} from \"@zwave-js/core\";\nimport { Bytes, formatId } from \"@zwave-js/shared\";\nimport type { Headers, OptionsOfTextResponseBody } from \"got\";\nimport type PQueue from \"p-queue\";\nimport type {\n\tFirmwareUpdateDeviceID,\n\tFirmwareUpdateFileInfo,\n\tFirmwareUpdateInfo,\n\tFirmwareUpdateServiceResponse,\n} from \"./_Types.js\";\n\nfunction serviceURL(): string {\n\treturn process.env.ZWAVEJS_FW_SERVICE_URL || \"https://firmware.zwave-js.io\";\n}\nconst DOWNLOAD_TIMEOUT = 60000;\n// const MAX_FIRMWARE_SIZE = 10 * 1024 * 1024; // 10MB should be enough for any conceivable Z-Wave chip\n\nconst MAX_CACHE_SECONDS = 60 * 60 * 24; // Cache for a day at max\nconst CLEAN_CACHE_INTERVAL_MS = 60 * 60 * 1000; // Remove stale entries from the cache every hour\n\nconst requestCache = new Map<string, CachedRequest<unknown>>();\ninterface CachedRequest<T> {\n\tresponse: T;\n\tstaleDate: number;\n}\n\n// Queue requests to the firmware update service. Only allow few parallel requests so we can make some use of the cache.\nlet requestQueue: PQueue | undefined;\n\nlet cleanCacheTimeout: NodeJS.Timeout | undefined;\nfunction cleanCache() {\n\tif (cleanCacheTimeout) {\n\t\tclearTimeout(cleanCacheTimeout);\n\t\tcleanCacheTimeout = undefined;\n\t}\n\n\tconst now = Date.now();\n\tfor (const [key, cached] of requestCache) {\n\t\tif (cached.staleDate < now) {\n\t\t\trequestCache.delete(key);\n\t\t}\n\t}\n\n\tif (requestCache.size > 0) {\n\t\tcleanCacheTimeout = setTimeout(\n\t\t\tcleanCache,\n\t\t\tCLEAN_CACHE_INTERVAL_MS,\n\t\t).unref();\n\t}\n}\n\nasync function cachedGot<T>(config: OptionsOfTextResponseBody): Promise<T> {\n\t// Replaces got's built-in cache functionality because it uses Keyv internally\n\t// which apparently has some issues: https://github.com/zwave-js/node-zwave-js/issues/5404\n\n\tconst hash = Bytes.view(\n\t\tawait digest(\n\t\t\t\"sha-256\",\n\t\t\tBytes.from(JSON.stringify(config.json)),\n\t\t),\n\t).toString(\"hex\");\n\tconst cacheKey = `${config.method}:${config.url!.toString()}:${hash}`;\n\n\t// Return cached requests if they are not stale yet\n\tif (requestCache.has(cacheKey)) {\n\t\tconst cached = requestCache.get(cacheKey)!;\n\t\tif (cached.staleDate > Date.now()) {\n\t\t\treturn cached.response as T;\n\t\t}\n\t}\n\n\tconst { got } = await import(\"got\");\n\tconst response = await got(config);\n\tconst responseJson = JSON.parse(response.body) as T;\n\n\t// Check if we can cache the response\n\tif (response.statusCode === 200 && response.headers[\"cache-control\"]) {\n\t\tconst cacheControl = response.headers[\"cache-control\"];\n\n\t\tlet maxAge: number | undefined;\n\t\tconst maxAgeMatch = cacheControl.match(/max-age=(\\d+)/);\n\t\tif (maxAgeMatch) {\n\t\t\tmaxAge = Math.max(0, parseInt(maxAgeMatch[1], 10));\n\t\t}\n\n\t\tif (maxAge) {\n\t\t\tlet currentAge: number;\n\t\t\tif (response.headers.age) {\n\t\t\t\tcurrentAge = parseInt(response.headers.age, 10);\n\t\t\t} else if (response.headers.date) {\n\t\t\t\tcurrentAge = (Date.now() - Date.parse(response.headers.date))\n\t\t\t\t\t/ 1000;\n\t\t\t} else {\n\t\t\t\tcurrentAge = 0;\n\t\t\t}\n\t\t\tcurrentAge = Math.max(0, currentAge);\n\n\t\t\tif (maxAge > currentAge) {\n\t\t\t\trequestCache.set(cacheKey, {\n\t\t\t\t\tresponse: responseJson,\n\t\t\t\t\tstaleDate: Date.now()\n\t\t\t\t\t\t+ Math.min(MAX_CACHE_SECONDS, maxAge - currentAge)\n\t\t\t\t\t\t\t* 1000,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Regularly clean the cache\n\tif (!cleanCacheTimeout) {\n\t\tcleanCacheTimeout = setTimeout(\n\t\t\tcleanCache,\n\t\t\tCLEAN_CACHE_INTERVAL_MS,\n\t\t).unref();\n\t}\n\n\treturn responseJson;\n}\n\nfunction hasExtension(pathname: string): boolean {\n\treturn /\\.[a-z0-9_]+$/i.test(pathname);\n}\n\nexport interface GetAvailableFirmwareUpdateOptions {\n\tuserAgent: string;\n\tapiKey?: string;\n\tincludePrereleases?: boolean;\n}\n\n/** Converts the RF region to a format the update service understands */\nfunction rfRegionToUpdateServiceRegion(\n\trfRegion?: RFRegion,\n): string | undefined {\n\tswitch (rfRegion) {\n\t\tcase RFRegion[\"Default (EU)\"]:\n\t\tcase RFRegion.Europe:\n\t\t\treturn \"europe\";\n\t\tcase RFRegion.USA:\n\t\tcase RFRegion[\"USA (Long Range)\"]:\n\t\t\treturn \"usa\";\n\t\tcase RFRegion[\"Australia/New Zealand\"]:\n\t\t\treturn \"australia/new zealand\";\n\t\tcase RFRegion[\"Hong Kong\"]:\n\t\t\treturn \"hong kong\";\n\t\tcase RFRegion.India:\n\t\t\treturn \"india\";\n\t\tcase RFRegion.Israel:\n\t\t\treturn \"israel\";\n\t\tcase RFRegion.Russia:\n\t\t\treturn \"russia\";\n\t\tcase RFRegion.China:\n\t\t\treturn \"china\";\n\t\tcase RFRegion.Japan:\n\t\t\treturn \"japan\";\n\t\tcase RFRegion.Korea:\n\t\t\treturn \"korea\";\n\t}\n}\n\n/**\n * Retrieves the available firmware updates for the node with the given fingerprint.\n * Returns the service response or `undefined` in case of an error.\n */\nexport async function getAvailableFirmwareUpdates(\n\tdeviceId: FirmwareUpdateDeviceID,\n\toptions: GetAvailableFirmwareUpdateOptions,\n): Promise<FirmwareUpdateInfo[]> {\n\tconst headers: Headers = {\n\t\t\"User-Agent\": options.userAgent,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\tif (options.apiKey) {\n\t\theaders[\"X-API-Key\"] = options.apiKey;\n\t}\n\n\tconst body: Record<string, string> = {\n\t\tmanufacturerId: formatId(deviceId.manufacturerId),\n\t\tproductType: formatId(deviceId.productType),\n\t\tproductId: formatId(deviceId.productId),\n\t\tfirmwareVersion: deviceId.firmwareVersion,\n\t};\n\tconst rfRegion = rfRegionToUpdateServiceRegion(deviceId.rfRegion);\n\tif (rfRegion) {\n\t\tbody.region = rfRegion;\n\t}\n\n\t// Prereleases and/or RF region-specific updates are only available in v3\n\tconst apiVersion = options.includePrereleases || !!rfRegion ? \"v3\" : \"v1\";\n\n\tconst config: OptionsOfTextResponseBody = {\n\t\tmethod: \"POST\",\n\t\turl: `${serviceURL()}/api/${apiVersion}/updates`,\n\t\tjson: body,\n\t\t// Consider re-enabling this instead of using cachedGot()\n\t\t// At the moment, the built-in caching has some issues though, so we stick\n\t\t// with our own implementation\n\t\t// cache: requestCache,\n\t\t// cacheOptions: {\n\t\t// \tshared: false,\n\t\t// },\n\t\theaders,\n\t};\n\n\tif (!requestQueue) {\n\t\t// I just love ESM\n\t\tconst PQueue = (await import(\"p-queue\")).default;\n\t\trequestQueue = new PQueue({ concurrency: 2 });\n\t}\n\t// Weird types...\n\tconst result = (\n\t\tawait requestQueue.add(() => cachedGot(config))\n\t) as FirmwareUpdateServiceResponse[];\n\n\t// Remember the device ID in the response, so we can use it later\n\t// to ensure the update is for the correct device\n\treturn result.map((update) => ({\n\t\tdevice: deviceId,\n\t\t...update,\n\t\tchannel: update.channel ?? \"stable\",\n\t}));\n}\n\nexport async function downloadFirmwareUpdate(\n\tfile: FirmwareUpdateFileInfo,\n): Promise<Firmware> {\n\tconst [hashAlgorithm, expectedHash] = file.integrity.split(\":\", 2);\n\n\tif (hashAlgorithm !== \"sha256\") {\n\t\tthrow new ZWaveError(\n\t\t\t`Unsupported hash algorithm ${hashAlgorithm} for integrity check`,\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\t// TODO: Make request abort-able (requires AbortController, Node 14.17+ / Node 16)\n\n\t// Download the firmware file\n\tconst { got } = await import(\"got\");\n\tconst downloadResponse = await got.get(file.url, {\n\t\ttimeout: { request: DOWNLOAD_TIMEOUT },\n\t\tresponseType: \"buffer\",\n\t\t// TODO: figure out how to do maxContentLength: MAX_FIRMWARE_SIZE,\n\t});\n\n\tconst rawData = downloadResponse.body;\n\n\tconst requestedPathname = new URL(file.url).pathname;\n\t// The response may be redirected, so the filename information may be different\n\t// from the requested URL\n\tlet actualPathname: string | undefined;\n\ttry {\n\t\tactualPathname = new URL(downloadResponse.url).pathname;\n\t} catch {\n\t\t// ignore\n\t}\n\n\t// Infer the file type from the content-disposition header or the filename\n\tlet filename: string;\n\tif (\n\t\tdownloadResponse.headers[\"content-disposition\"]?.startsWith(\n\t\t\t\"attachment; filename=\",\n\t\t)\n\t) {\n\t\tfilename = downloadResponse.headers[\"content-disposition\"]\n\t\t\t.split(\"filename=\")[1]\n\t\t\t.replace(/^\"/, \"\")\n\t\t\t.replace(/[\";]$/, \"\");\n\t} else if (actualPathname && hasExtension(actualPathname)) {\n\t\tfilename = actualPathname;\n\t} else {\n\t\tfilename = requestedPathname;\n\t}\n\n\t// Extract the raw data\n\tconst format = guessFirmwareFileFormat(filename, rawData);\n\tconst firmware = await extractFirmwareAsync(rawData, format);\n\n\t// Ensure the hash matches\n\tconst actualHash = Bytes.view(\n\t\tawait digest(\"sha-256\", firmware.data),\n\t).toString(\"hex\");\n\n\tif (actualHash !== expectedHash) {\n\t\tthrow new ZWaveError(\n\t\t\t`Integrity check failed. Expected hash ${expectedHash}, got ${actualHash}`,\n\t\t\tZWaveErrorCodes.FWUpdateService_IntegrityCheckFailed,\n\t\t);\n\t}\n\n\treturn {\n\t\tdata: firmware.data,\n\t\t// Don't trust the guessed firmware target, use the one from the provided info\n\t\tfirmwareTarget: file.target,\n\t};\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,kBAQO;AACP,oBAAgC;AAUhC,SAAS,aAAU;AAClB,SAAO,QAAQ,IAAI,0BAA0B;AAC9C;AAFS;AAGT,MAAM,mBAAmB;AAGzB,MAAM,oBAAoB,KAAK,KAAK;AACpC,MAAM,0BAA0B,KAAK,KAAK;AAE1C,MAAM,eAAe,oBAAI,IAAG;AAO5B,IAAI;AAEJ,IAAI;AACJ,SAAS,aAAU;AAClB,MAAI,mBAAmB;AACtB,iBAAa,iBAAiB;AAC9B,wBAAoB;EACrB;AAEA,QAAM,MAAM,KAAK,IAAG;AACpB,aAAW,CAAC,KAAK,MAAM,KAAK,cAAc;AACzC,QAAI,OAAO,YAAY,KAAK;AAC3B,mBAAa,OAAO,GAAG;IACxB;EACD;AAEA,MAAI,aAAa,OAAO,GAAG;AAC1B,wBAAoB,WACnB,YACA,uBAAuB,EACtB,MAAK;EACR;AACD;AAnBS;AAqBT,eAAe,UAAa,QAAiC;AAI5D,QAAM,OAAO,oBAAM,KAClB,UAAM,oBACL,WACA,oBAAM,KAAK,KAAK,UAAU,OAAO,IAAI,CAAC,CAAC,CACvC,EACA,SAAS,KAAK;AAChB,QAAM,WAAW,GAAG,OAAO,MAAM,IAAI,OAAO,IAAK,SAAQ,CAAE,IAAI,IAAI;AAGnE,MAAI,aAAa,IAAI,QAAQ,GAAG;AAC/B,UAAM,SAAS,aAAa,IAAI,QAAQ;AACxC,QAAI,OAAO,YAAY,KAAK,IAAG,GAAI;AAClC,aAAO,OAAO;IACf;EACD;AAEA,QAAM,EAAE,IAAG,IAAK,MAAM,OAAO,KAAK;AAClC,QAAM,WAAW,MAAM,IAAI,MAAM;AACjC,QAAM,eAAe,KAAK,MAAM,SAAS,IAAI;AAG7C,MAAI,SAAS,eAAe,OAAO,SAAS,QAAQ,eAAe,GAAG;AACrE,UAAM,eAAe,SAAS,QAAQ,eAAe;AAErD,QAAI;AACJ,UAAM,cAAc,aAAa,MAAM,eAAe;AACtD,QAAI,aAAa;AAChB,eAAS,KAAK,IAAI,GAAG,SAAS,YAAY,CAAC,GAAG,EAAE,CAAC;IAClD;AAEA,QAAI,QAAQ;AACX,UAAI;AACJ,UAAI,SAAS,QAAQ,KAAK;AACzB,qBAAa,SAAS,SAAS,QAAQ,KAAK,EAAE;MAC/C,WAAW,SAAS,QAAQ,MAAM;AACjC,sBAAc,KAAK,IAAG,IAAK,KAAK,MAAM,SAAS,QAAQ,IAAI,KACxD;MACJ,OAAO;AACN,qBAAa;MACd;AACA,mBAAa,KAAK,IAAI,GAAG,UAAU;AAEnC,UAAI,SAAS,YAAY;AACxB,qBAAa,IAAI,UAAU;UAC1B,UAAU;UACV,WAAW,KAAK,IAAG,IAChB,KAAK,IAAI,mBAAmB,SAAS,UAAU,IAC9C;SACJ;MACF;IACD;EACD;AAGA,MAAI,CAAC,mBAAmB;AACvB,wBAAoB,WACnB,YACA,uBAAuB,EACtB,MAAK;EACR;AAEA,SAAO;AACR;AAlEe;AAoEf,SAAS,aAAa,UAAgB;AACrC,SAAO,iBAAiB,KAAK,QAAQ;AACtC;AAFS;AAWT,SAAS,8BACR,UAAmB;AAEnB,UAAQ,UAAU;IACjB,KAAK,qBAAS,cAAc;IAC5B,KAAK,qBAAS;
|
|
4
|
+
"sourcesContent": ["import {\n\ttype Firmware,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tdigest,\n\textractFirmwareAsync,\n\tguessFirmwareFileFormat,\n} from \"@zwave-js/core\";\nimport { Bytes, formatId } from \"@zwave-js/shared\";\nimport type { Headers, OptionsOfTextResponseBody } from \"got\";\nimport type PQueue from \"p-queue\";\nimport type {\n\tFirmwareUpdateDeviceID,\n\tFirmwareUpdateFileInfo,\n\tFirmwareUpdateInfo,\n\tFirmwareUpdateServiceResponse,\n} from \"./_Types.js\";\n\nfunction serviceURL(): string {\n\treturn process.env.ZWAVEJS_FW_SERVICE_URL || \"https://firmware.zwave-js.io\";\n}\nconst DOWNLOAD_TIMEOUT = 60000;\n// const MAX_FIRMWARE_SIZE = 10 * 1024 * 1024; // 10MB should be enough for any conceivable Z-Wave chip\n\nconst MAX_CACHE_SECONDS = 60 * 60 * 24; // Cache for a day at max\nconst CLEAN_CACHE_INTERVAL_MS = 60 * 60 * 1000; // Remove stale entries from the cache every hour\n\nconst requestCache = new Map<string, CachedRequest<unknown>>();\ninterface CachedRequest<T> {\n\tresponse: T;\n\tstaleDate: number;\n}\n\n// Queue requests to the firmware update service. Only allow few parallel requests so we can make some use of the cache.\nlet requestQueue: PQueue | undefined;\n\nlet cleanCacheTimeout: NodeJS.Timeout | undefined;\nfunction cleanCache() {\n\tif (cleanCacheTimeout) {\n\t\tclearTimeout(cleanCacheTimeout);\n\t\tcleanCacheTimeout = undefined;\n\t}\n\n\tconst now = Date.now();\n\tfor (const [key, cached] of requestCache) {\n\t\tif (cached.staleDate < now) {\n\t\t\trequestCache.delete(key);\n\t\t}\n\t}\n\n\tif (requestCache.size > 0) {\n\t\tcleanCacheTimeout = setTimeout(\n\t\t\tcleanCache,\n\t\t\tCLEAN_CACHE_INTERVAL_MS,\n\t\t).unref();\n\t}\n}\n\nasync function cachedGot<T>(config: OptionsOfTextResponseBody): Promise<T> {\n\t// Replaces got's built-in cache functionality because it uses Keyv internally\n\t// which apparently has some issues: https://github.com/zwave-js/node-zwave-js/issues/5404\n\n\tconst hash = Bytes.view(\n\t\tawait digest(\n\t\t\t\"sha-256\",\n\t\t\tBytes.from(JSON.stringify(config.json)),\n\t\t),\n\t).toString(\"hex\");\n\tconst cacheKey = `${config.method}:${config.url!.toString()}:${hash}`;\n\n\t// Return cached requests if they are not stale yet\n\tif (requestCache.has(cacheKey)) {\n\t\tconst cached = requestCache.get(cacheKey)!;\n\t\tif (cached.staleDate > Date.now()) {\n\t\t\treturn cached.response as T;\n\t\t}\n\t}\n\n\tconst { got } = await import(\"got\");\n\tconst response = await got(config);\n\tconst responseJson = JSON.parse(response.body) as T;\n\n\t// Check if we can cache the response\n\tif (response.statusCode === 200 && response.headers[\"cache-control\"]) {\n\t\tconst cacheControl = response.headers[\"cache-control\"];\n\n\t\tlet maxAge: number | undefined;\n\t\tconst maxAgeMatch = cacheControl.match(/max-age=(\\d+)/);\n\t\tif (maxAgeMatch) {\n\t\t\tmaxAge = Math.max(0, parseInt(maxAgeMatch[1], 10));\n\t\t}\n\n\t\tif (maxAge) {\n\t\t\tlet currentAge: number;\n\t\t\tif (response.headers.age) {\n\t\t\t\tcurrentAge = parseInt(response.headers.age, 10);\n\t\t\t} else if (response.headers.date) {\n\t\t\t\tcurrentAge = (Date.now() - Date.parse(response.headers.date))\n\t\t\t\t\t/ 1000;\n\t\t\t} else {\n\t\t\t\tcurrentAge = 0;\n\t\t\t}\n\t\t\tcurrentAge = Math.max(0, currentAge);\n\n\t\t\tif (maxAge > currentAge) {\n\t\t\t\trequestCache.set(cacheKey, {\n\t\t\t\t\tresponse: responseJson,\n\t\t\t\t\tstaleDate: Date.now()\n\t\t\t\t\t\t+ Math.min(MAX_CACHE_SECONDS, maxAge - currentAge)\n\t\t\t\t\t\t\t* 1000,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Regularly clean the cache\n\tif (!cleanCacheTimeout) {\n\t\tcleanCacheTimeout = setTimeout(\n\t\t\tcleanCache,\n\t\t\tCLEAN_CACHE_INTERVAL_MS,\n\t\t).unref();\n\t}\n\n\treturn responseJson;\n}\n\nfunction hasExtension(pathname: string): boolean {\n\treturn /\\.[a-z0-9_]+$/i.test(pathname);\n}\n\nexport interface GetAvailableFirmwareUpdateOptions {\n\tuserAgent: string;\n\tapiKey?: string;\n\tincludePrereleases?: boolean;\n}\n\n/** Converts the RF region to a format the update service understands */\nfunction rfRegionToUpdateServiceRegion(\n\trfRegion?: RFRegion,\n): string | undefined {\n\tswitch (rfRegion) {\n\t\tcase RFRegion[\"Default (EU)\"]:\n\t\tcase RFRegion.Europe:\n\t\tcase RFRegion[\"Europe (Long Range)\"]:\n\t\t\treturn \"europe\";\n\t\tcase RFRegion.USA:\n\t\tcase RFRegion[\"USA (Long Range)\"]:\n\t\t\treturn \"usa\";\n\t\tcase RFRegion[\"Australia/New Zealand\"]:\n\t\t\treturn \"australia/new zealand\";\n\t\tcase RFRegion[\"Hong Kong\"]:\n\t\t\treturn \"hong kong\";\n\t\tcase RFRegion.India:\n\t\t\treturn \"india\";\n\t\tcase RFRegion.Israel:\n\t\t\treturn \"israel\";\n\t\tcase RFRegion.Russia:\n\t\t\treturn \"russia\";\n\t\tcase RFRegion.China:\n\t\t\treturn \"china\";\n\t\tcase RFRegion.Japan:\n\t\t\treturn \"japan\";\n\t\tcase RFRegion.Korea:\n\t\t\treturn \"korea\";\n\t}\n}\n\n/**\n * Retrieves the available firmware updates for the node with the given fingerprint.\n * Returns the service response or `undefined` in case of an error.\n */\nexport async function getAvailableFirmwareUpdates(\n\tdeviceId: FirmwareUpdateDeviceID,\n\toptions: GetAvailableFirmwareUpdateOptions,\n): Promise<FirmwareUpdateInfo[]> {\n\tconst headers: Headers = {\n\t\t\"User-Agent\": options.userAgent,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\tif (options.apiKey) {\n\t\theaders[\"X-API-Key\"] = options.apiKey;\n\t}\n\n\tconst body: Record<string, string> = {\n\t\tmanufacturerId: formatId(deviceId.manufacturerId),\n\t\tproductType: formatId(deviceId.productType),\n\t\tproductId: formatId(deviceId.productId),\n\t\tfirmwareVersion: deviceId.firmwareVersion,\n\t};\n\tconst rfRegion = rfRegionToUpdateServiceRegion(deviceId.rfRegion);\n\tif (rfRegion) {\n\t\tbody.region = rfRegion;\n\t}\n\n\t// Prereleases and/or RF region-specific updates are only available in v3\n\tconst apiVersion = options.includePrereleases || !!rfRegion ? \"v3\" : \"v1\";\n\n\tconst config: OptionsOfTextResponseBody = {\n\t\tmethod: \"POST\",\n\t\turl: `${serviceURL()}/api/${apiVersion}/updates`,\n\t\tjson: body,\n\t\t// Consider re-enabling this instead of using cachedGot()\n\t\t// At the moment, the built-in caching has some issues though, so we stick\n\t\t// with our own implementation\n\t\t// cache: requestCache,\n\t\t// cacheOptions: {\n\t\t// \tshared: false,\n\t\t// },\n\t\theaders,\n\t};\n\n\tif (!requestQueue) {\n\t\t// I just love ESM\n\t\tconst PQueue = (await import(\"p-queue\")).default;\n\t\trequestQueue = new PQueue({ concurrency: 2 });\n\t}\n\t// Weird types...\n\tconst result = (\n\t\tawait requestQueue.add(() => cachedGot(config))\n\t) as FirmwareUpdateServiceResponse[];\n\n\t// Remember the device ID in the response, so we can use it later\n\t// to ensure the update is for the correct device\n\treturn result.map((update) => ({\n\t\tdevice: deviceId,\n\t\t...update,\n\t\tchannel: update.channel ?? \"stable\",\n\t}));\n}\n\nexport async function downloadFirmwareUpdate(\n\tfile: FirmwareUpdateFileInfo,\n): Promise<Firmware> {\n\tconst [hashAlgorithm, expectedHash] = file.integrity.split(\":\", 2);\n\n\tif (hashAlgorithm !== \"sha256\") {\n\t\tthrow new ZWaveError(\n\t\t\t`Unsupported hash algorithm ${hashAlgorithm} for integrity check`,\n\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t);\n\t}\n\t// TODO: Make request abort-able (requires AbortController, Node 14.17+ / Node 16)\n\n\t// Download the firmware file\n\tconst { got } = await import(\"got\");\n\tconst downloadResponse = await got.get(file.url, {\n\t\ttimeout: { request: DOWNLOAD_TIMEOUT },\n\t\tresponseType: \"buffer\",\n\t\t// TODO: figure out how to do maxContentLength: MAX_FIRMWARE_SIZE,\n\t});\n\n\tconst rawData = downloadResponse.body;\n\n\tconst requestedPathname = new URL(file.url).pathname;\n\t// The response may be redirected, so the filename information may be different\n\t// from the requested URL\n\tlet actualPathname: string | undefined;\n\ttry {\n\t\tactualPathname = new URL(downloadResponse.url).pathname;\n\t} catch {\n\t\t// ignore\n\t}\n\n\t// Infer the file type from the content-disposition header or the filename\n\tlet filename: string;\n\tif (\n\t\tdownloadResponse.headers[\"content-disposition\"]?.startsWith(\n\t\t\t\"attachment; filename=\",\n\t\t)\n\t) {\n\t\tfilename = downloadResponse.headers[\"content-disposition\"]\n\t\t\t.split(\"filename=\")[1]\n\t\t\t.replace(/^\"/, \"\")\n\t\t\t.replace(/[\";]$/, \"\");\n\t} else if (actualPathname && hasExtension(actualPathname)) {\n\t\tfilename = actualPathname;\n\t} else {\n\t\tfilename = requestedPathname;\n\t}\n\n\t// Extract the raw data\n\tconst format = guessFirmwareFileFormat(filename, rawData);\n\tconst firmware = await extractFirmwareAsync(rawData, format);\n\n\t// Ensure the hash matches\n\tconst actualHash = Bytes.view(\n\t\tawait digest(\"sha-256\", firmware.data),\n\t).toString(\"hex\");\n\n\tif (actualHash !== expectedHash) {\n\t\tthrow new ZWaveError(\n\t\t\t`Integrity check failed. Expected hash ${expectedHash}, got ${actualHash}`,\n\t\t\tZWaveErrorCodes.FWUpdateService_IntegrityCheckFailed,\n\t\t);\n\t}\n\n\treturn {\n\t\tdata: firmware.data,\n\t\t// Don't trust the guessed firmware target, use the one from the provided info\n\t\tfirmwareTarget: file.target,\n\t};\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,kBAQO;AACP,oBAAgC;AAUhC,SAAS,aAAU;AAClB,SAAO,QAAQ,IAAI,0BAA0B;AAC9C;AAFS;AAGT,MAAM,mBAAmB;AAGzB,MAAM,oBAAoB,KAAK,KAAK;AACpC,MAAM,0BAA0B,KAAK,KAAK;AAE1C,MAAM,eAAe,oBAAI,IAAG;AAO5B,IAAI;AAEJ,IAAI;AACJ,SAAS,aAAU;AAClB,MAAI,mBAAmB;AACtB,iBAAa,iBAAiB;AAC9B,wBAAoB;EACrB;AAEA,QAAM,MAAM,KAAK,IAAG;AACpB,aAAW,CAAC,KAAK,MAAM,KAAK,cAAc;AACzC,QAAI,OAAO,YAAY,KAAK;AAC3B,mBAAa,OAAO,GAAG;IACxB;EACD;AAEA,MAAI,aAAa,OAAO,GAAG;AAC1B,wBAAoB,WACnB,YACA,uBAAuB,EACtB,MAAK;EACR;AACD;AAnBS;AAqBT,eAAe,UAAa,QAAiC;AAI5D,QAAM,OAAO,oBAAM,KAClB,UAAM,oBACL,WACA,oBAAM,KAAK,KAAK,UAAU,OAAO,IAAI,CAAC,CAAC,CACvC,EACA,SAAS,KAAK;AAChB,QAAM,WAAW,GAAG,OAAO,MAAM,IAAI,OAAO,IAAK,SAAQ,CAAE,IAAI,IAAI;AAGnE,MAAI,aAAa,IAAI,QAAQ,GAAG;AAC/B,UAAM,SAAS,aAAa,IAAI,QAAQ;AACxC,QAAI,OAAO,YAAY,KAAK,IAAG,GAAI;AAClC,aAAO,OAAO;IACf;EACD;AAEA,QAAM,EAAE,IAAG,IAAK,MAAM,OAAO,KAAK;AAClC,QAAM,WAAW,MAAM,IAAI,MAAM;AACjC,QAAM,eAAe,KAAK,MAAM,SAAS,IAAI;AAG7C,MAAI,SAAS,eAAe,OAAO,SAAS,QAAQ,eAAe,GAAG;AACrE,UAAM,eAAe,SAAS,QAAQ,eAAe;AAErD,QAAI;AACJ,UAAM,cAAc,aAAa,MAAM,eAAe;AACtD,QAAI,aAAa;AAChB,eAAS,KAAK,IAAI,GAAG,SAAS,YAAY,CAAC,GAAG,EAAE,CAAC;IAClD;AAEA,QAAI,QAAQ;AACX,UAAI;AACJ,UAAI,SAAS,QAAQ,KAAK;AACzB,qBAAa,SAAS,SAAS,QAAQ,KAAK,EAAE;MAC/C,WAAW,SAAS,QAAQ,MAAM;AACjC,sBAAc,KAAK,IAAG,IAAK,KAAK,MAAM,SAAS,QAAQ,IAAI,KACxD;MACJ,OAAO;AACN,qBAAa;MACd;AACA,mBAAa,KAAK,IAAI,GAAG,UAAU;AAEnC,UAAI,SAAS,YAAY;AACxB,qBAAa,IAAI,UAAU;UAC1B,UAAU;UACV,WAAW,KAAK,IAAG,IAChB,KAAK,IAAI,mBAAmB,SAAS,UAAU,IAC9C;SACJ;MACF;IACD;EACD;AAGA,MAAI,CAAC,mBAAmB;AACvB,wBAAoB,WACnB,YACA,uBAAuB,EACtB,MAAK;EACR;AAEA,SAAO;AACR;AAlEe;AAoEf,SAAS,aAAa,UAAgB;AACrC,SAAO,iBAAiB,KAAK,QAAQ;AACtC;AAFS;AAWT,SAAS,8BACR,UAAmB;AAEnB,UAAQ,UAAU;IACjB,KAAK,qBAAS,cAAc;IAC5B,KAAK,qBAAS;IACd,KAAK,qBAAS,qBAAqB;AAClC,aAAO;IACR,KAAK,qBAAS;IACd,KAAK,qBAAS,kBAAkB;AAC/B,aAAO;IACR,KAAK,qBAAS,uBAAuB;AACpC,aAAO;IACR,KAAK,qBAAS,WAAW;AACxB,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;IACR,KAAK,qBAAS;AACb,aAAO;EACT;AACD;AA5BS;AAkCT,eAAsB,4BACrB,UACA,SAA0C;AAE1C,QAAM,UAAmB;IACxB,cAAc,QAAQ;IACtB,gBAAgB;;AAEjB,MAAI,QAAQ,QAAQ;AACnB,YAAQ,WAAW,IAAI,QAAQ;EAChC;AAEA,QAAM,OAA+B;IACpC,oBAAgB,wBAAS,SAAS,cAAc;IAChD,iBAAa,wBAAS,SAAS,WAAW;IAC1C,eAAW,wBAAS,SAAS,SAAS;IACtC,iBAAiB,SAAS;;AAE3B,QAAM,WAAW,8BAA8B,SAAS,QAAQ;AAChE,MAAI,UAAU;AACb,SAAK,SAAS;EACf;AAGA,QAAM,aAAa,QAAQ,sBAAsB,CAAC,CAAC,WAAW,OAAO;AAErE,QAAM,SAAoC;IACzC,QAAQ;IACR,KAAK,GAAG,WAAU,CAAE,QAAQ,UAAU;IACtC,MAAM;;;;;;;;IAQN;;AAGD,MAAI,CAAC,cAAc;AAElB,UAAM,UAAU,MAAM,OAAO,SAAS,GAAG;AACzC,mBAAe,IAAI,OAAO,EAAE,aAAa,EAAC,CAAE;EAC7C;AAEA,QAAM,SACL,MAAM,aAAa,IAAI,MAAM,UAAU,MAAM,CAAC;AAK/C,SAAO,OAAO,IAAI,CAAC,YAAY;IAC9B,QAAQ;IACR,GAAG;IACH,SAAS,OAAO,WAAW;IAC1B;AACH;AAzDsB;AA2DtB,eAAsB,uBACrB,MAA4B;AAE5B,QAAM,CAAC,eAAe,YAAY,IAAI,KAAK,UAAU,MAAM,KAAK,CAAC;AAEjE,MAAI,kBAAkB,UAAU;AAC/B,UAAM,IAAI,uBACT,8BAA8B,aAAa,wBAC3C,4BAAgB,gBAAgB;EAElC;AAIA,QAAM,EAAE,IAAG,IAAK,MAAM,OAAO,KAAK;AAClC,QAAM,mBAAmB,MAAM,IAAI,IAAI,KAAK,KAAK;IAChD,SAAS,EAAE,SAAS,iBAAgB;IACpC,cAAc;;GAEd;AAED,QAAM,UAAU,iBAAiB;AAEjC,QAAM,oBAAoB,IAAI,IAAI,KAAK,GAAG,EAAE;AAG5C,MAAI;AACJ,MAAI;AACH,qBAAiB,IAAI,IAAI,iBAAiB,GAAG,EAAE;EAChD,QAAQ;EAER;AAGA,MAAI;AACJ,MACC,iBAAiB,QAAQ,qBAAqB,GAAG,WAChD,uBAAuB,GAEvB;AACD,eAAW,iBAAiB,QAAQ,qBAAqB,EACvD,MAAM,WAAW,EAAE,CAAC,EACpB,QAAQ,MAAM,EAAE,EAChB,QAAQ,SAAS,EAAE;EACtB,WAAW,kBAAkB,aAAa,cAAc,GAAG;AAC1D,eAAW;EACZ,OAAO;AACN,eAAW;EACZ;AAGA,QAAM,aAAS,qCAAwB,UAAU,OAAO;AACxD,QAAM,WAAW,UAAM,kCAAqB,SAAS,MAAM;AAG3D,QAAM,aAAa,oBAAM,KACxB,UAAM,oBAAO,WAAW,SAAS,IAAI,CAAC,EACrC,SAAS,KAAK;AAEhB,MAAI,eAAe,cAAc;AAChC,UAAM,IAAI,uBACT,yCAAyC,YAAY,SAAS,UAAU,IACxE,4BAAgB,oCAAoC;EAEtD;AAEA,SAAO;IACN,MAAM,SAAS;;IAEf,gBAAgB,KAAK;;AAEvB;AAvEsB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -318,7 +318,7 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
|
|
|
318
318
|
message: `Starting firmware update...`,
|
|
319
319
|
direction: "outbound"
|
|
320
320
|
});
|
|
321
|
-
await api.requestUpdate({
|
|
321
|
+
let result = await api.requestUpdate({
|
|
322
322
|
// TODO: Should manufacturer id be provided externally?
|
|
323
323
|
manufacturerId,
|
|
324
324
|
firmwareId,
|
|
@@ -329,7 +329,9 @@ class FirmwareUpdateMixin extends import_ScheduledPoll.SchedulePollMixin {
|
|
|
329
329
|
resume,
|
|
330
330
|
nonSecureTransfer
|
|
331
331
|
});
|
|
332
|
-
|
|
332
|
+
if (!result) {
|
|
333
|
+
result = yield () => this.driver.waitForCommand((cc) => cc instanceof import_cc.FirmwareUpdateMetaDataCCRequestReport && cc.nodeId === this.id, 6e4);
|
|
334
|
+
}
|
|
333
335
|
switch (result.status) {
|
|
334
336
|
case import_cc.FirmwareUpdateRequestStatus.Error_AuthenticationExpected:
|
|
335
337
|
throw new import_core.ZWaveError(`Failed to start the update: A manual authentication event (e.g. button push) was expected!`, import_core.ZWaveErrorCodes.FirmwareUpdateCC_FailedToStart);
|
|
@@ -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 {\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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
|
|
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\tlet result = await 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\n\t\t// On some devices the response can take a minute or so to be received,\n\t\t// probably because of a manual out-of-band activation.\n\t\tif (!result) {\n\t\t\tresult = (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 instanceof FirmwareUpdateMetaDataCCRequestReport\n\t\t\t\t\t\t\t&& cc.nodeId === this.id,\n\t\t\t\t\t\t60000,\n\t\t\t\t\t)) as FirmwareUpdateMetaDataCCRequestReport;\n\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": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,gBAcO;AACP,kBAWO;AACP,uBAA2B;AAC3B,oBAA4C;AAC5C,oBAAyB;AACzB,mBAAqB;AACrB,8BAGO;AACP,kBAAwB;AACxB,kBAIO;AAEP,2BAAkC;AAa5B,SAAU,wBAAwB,GAAgB;AACvD,SAAO,EAAE,KAAK,OAAO;AACtB;AAFgB;AAgCV,MAAgB,4BAA4B,uCAAiB;EAvFnE,OAuFmE;;;EAG1D;EACD,MAAM,sBAAmB;AAC/B,QAAI,CAAC,KAAK;AAAsB;AAChC,UAAM,KAAK,qBAAoB;EAChC;;;EAIQ;;EAGA;EAID,MAAM,eACZ,SACA,UAAiC,CAAA,GAAE;AAEnC,QAAI,QAAQ,WAAW,GAAG;AACzB,YAAM,IAAI,uBACT,wCACA,4BAAgB,gBAAgB;IAElC;AAGA,QAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,WAAW,CAAC,GAAG;AAC7C,YAAM,IAAI,uBACT,0DACA,4BAAgB,gBAAgB;IAElC;AAGA,YACC,wBAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,WAC/C,QAAQ,QACZ;AACD,YAAM,IAAI,uBACT,8DACA,4BAAgB,gBAAgB;IAElC;AAGA,QAAI,KAAK,OAAO,WAAW,2BAA0B,GAAI;AACxD,YAAM,IAAI,uBACT,gFACA,4BAAgB,qBAAqB;IAEvC;AAGA,UAAM,OAAO,KAAK,sBAAsB,SAAS,OAAO;AACxD,QAAI,gBAAgB,SAAS;AAC5B,YAAM,IAAI,uBACT,uFACA,4BAAgB,qBAAqB;IAEvC;AAGA,WAAO,KAAK,OAAO,UAAU,UAAU,IAAI;EAC5C;EAEO,6BAA0B;AAChC,WAAO,CAAC,CAAC,KAAK,OAAO,UAAU,SAAS,uBAAuB;EAChE;EAEQ,sBACP,SACA,UAAiC,CAAA,GAAE;AAEnC,UAAM,OAAO;AAGb,UAAM,eAAe,KAAK,OAAO,UAAU,SAEzC,CAAC,MACF,EAAE,KAAK,OAAO,yBACX,EAAE,IAAI,WAAW,KAAK,EAAE;AAE5B,QAAI;AAAc,aAAO;AAEzB,QAAI;AAEJ,WAAO;;MAEN,UAAU,yBAAa;MACvB,KAAK,EAAE,IAAI,uBAAuB,QAAQ,KAAK,GAAE;MACjD,MAAM,uCAAgB,qBAAkB;AAEvC,oBAAY,KAAK;AACjB,aAAK,YAAY;AAGjB,cAAM,eAAe;UACpB,OAAO;UACP,gBAAgB;UAChB,kBAAc,+CAAqB;;AAGpC,aAAK,uBAAuB,YAAW;AACtC,cAAI,aAAa,gBAAgB;AAChC,kBAAM,IAAI,uBACT,yEACA,4BAAgB,8BAA8B;UAEhD;AAEA,eAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;YAC1C,SAAS;YACT,WAAW;WACX;AAGD,uBAAa,QAAQ;AACrB,gBAAM,UAAU,MAAM,aAAa;AACnC,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI,uBACT,mDACA,4BAAgB,8BAA8B;UAEhD;AACA,eAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;YAC1C,SAAS;YACT,WAAW;WACX;QACF;AAGA,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACH,gBAAM,gBAAgB,MAAM,KAC1B,8BACA,QAAQ,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,GACxC,YAAY;AAId,cAAI,aAAa,OAAO;AACvB,kBAAMA,UAA+B;cACpC,SAAS;cACT,QAAQ,+BACN;cACF,aAAa;;AAEd,iBAAK,MACJ,4BACA,MACAA,OAAM;AAEP,mBAAOA;UACR;AAGA,WAAC;YACA;YACA;YACA;YACA,GAAG;cACA;QACL,QAAQ;AAEP,gBAAMA,UAA+B;YACpC,SAAS;YACT,QAAQ,+BAAqB;YAC7B,aAAa;;AAGd,iBAAOA;QACR;AAEA;AAIA,YAAI,CAAC,KAAK;AAAkB,kBAAQ,SAAS;AAE7C,cAAM,gBAAgB,KAAK,wBAAuB;AAClD,cAAM,WAAW,kBAAkB,0BAAc,iBAC7C,+BAAkB,aAAa;AACnC,YAAI,CAAC,UAAU;AAEd,kBAAQ,oBAAoB;QAC7B,WAAW,CAAC,KAAK,2BAA2B;AAC3C,kBAAQ,oBAAoB;QAC7B;AAGA,cAAM,qBAAiB,wBACtB,CAAC,aACA,KAAK,MACJ,4BACA,MACA,QAAQ,GAEV,KACA,IAAI;AAIL,cAAM,sBAAsB,QAAQ,IAAI,CAAC,OAAO;UAC/C,GAAG;UACH,cAAU,yBAAY,EAAE,IAAI;UAC3B;AACF,YAAI,oBAAoB;AACxB,YAAI,eAAe,QAAQ,UACvB,KAAK,wBAAwB;AACjC,YAAI,cAAc;AACjB,8BAAoB,oBAAoB,UACvC,CAAC,MAAM,EAAE,aAAa,KAAK,oBAAoB;AAEhD,cAAI,sBAAsB;AAAI,2BAAe;QAC9C;AAGA,YAAI;AACJ,YAAI;AAEJ,cAAM,aAAqB,oBAAoB,OAC9C,CAAC,OAAO,WAAW,QAAQ,OAAO,KAAK,QACvC,CAAC;AAEF,YAAI,2BAA2B;AAE/B,iBAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;AACpD,gBAAM;;YAEL,gBAAgB,SAAS;;YAEzB,aAAa,WAAW,IACrB,KAAK,aACL,KAAK,sBAAsB,SAAS,CAAC;YACxC;YACA;UAAQ,IACL,oBAAoB,CAAC;AAEzB,cAAI,IAAI,mBAAmB;AAE1B,iBAAK,OAAO,cAAc,QACzB,KAAK,IACL,oDACC,IAAI,CACL,MAAM,oBAAoB,MAAM,MAAM;AAEvC,wCAA4B,KAAK;AACjC;UACD;AAEA,eAAK,OAAO,cAAc,QACzB,KAAK,IACL,2BACC,IAAI,CACL,MAAM,oBAAoB,MAAM,MAAM;AAKvC,cAAI,eAAe,QAAQ,oBACxB,wBACA;AAGH,gBAAM,EAAE,QAAQ,kBAAiB,IAAK,OAAO,KAC3C,4BACA,MACA,KAAK,gBACL,QACA,YACA,cACA,UACA,iBACA,cACA,QAAQ,iBAAiB;AAI3B,cAAI,QAAQ,qBAAqB,CAAC,mBAAmB;AACpD,2BAAe;UAChB;AAGA,eAAK,uBAAuB;AAE5B,cAAI,cAAc;AACjB,iBAAK,OAAO,cAAc,QACzB,KAAK,IACL,QACC,SAAS,aAAa,gBACvB,yBAAyB;UAE3B;AACA,cAAI,mBAAmB;AACtB,iBAAK,OAAO,cAAc,QACzB,KAAK,IACL,oDAAoD;UAEtD;AAEA;AAGA,yBAAe,OAAO,KAAK,yBAC1B,MACA,cACA,mBACA,cACA,CAAC,UAAU,UAAS;AACnB,kBAAM,WAAmC;cACxC,aAAa,IAAI;cACjB,YAAY,oBAAoB;cAChC,eAAe;cACf,gBAAgB;cAChB,cAAU,sBAEP,2BACE,KAAK,IACN,WAAW,cACX,KAAK,MAAM,KAEX,aACC,KACJ,CAAC;;AAGH,2BAAe,QAAQ;AAGvB,gBAAI,aAAa,OAAO;AACvB,0CAA4B,KAAK;YAClC;UACD,CAAC;AAIF,iCAAuB,KAAK,OAC1B,2CACA,aAAa,QAAQ;AAGvB,cAAI,CAAC,aAAa,SAAS;AAC1B,iBAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;cAC1C,SAAS,yBACR,IAAI,CACL,MAAM,oBAAoB,MAAM,4BAC/B,iCACC,gCACA,aAAa,MAAM,CAErB;cACA,WAAW;aACX;AAED,kBAAMA,UAA+B;cACpC,GAAG;cACH,UAAU;cACV,aAAa;;AAEd,iBAAK,MACJ,4BACA,MACAA,OAAM;AAGP,mBAAOA;UACR,WAAW,IAAI,oBAAoB,SAAS,GAAG;AAG9C,iBAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;cAC1C,SAAS,yBACR,IAAI,CACL,MAAM,oBAAoB,MAAM,+BAC/B,iCACC,gCACA,aAAa,MAAM,CAErB;cACA,WAAW;aACX;AAED,iBAAK,OAAO,cAAc,QACzB,KAAK,IACL,gCAAgC,oBAAoB,aAAa;AAIlE,2BAAe;AAEf,kBAAM,UAAM,mBAAK,uBAAuB,KAAM,IAAI;UACnD;QACD;AAGA,aAAK,uBAAuB;AAE5B,cAAM,SAA+B;UACpC,GAAG;UACH,UAAU;UACV,aAAa;;AAKd,oBAAY;AAEZ,aAAK,MAAM,4BAA4B,MAAM,MAAM;AAEnD,eAAO;MACR,GAlUM;MAmUN,UAAO;AACN,aAAK,uBAAuB;AAC5B,aAAK,kCAAkC;AAGvC,aAAK,YAAY;AACjB,YAAI,CAAC,WAAW;AACf,uBAAa,MAAK;AACjB,iBAAK,OAAO,wBAAwB,IAAI;UACzC,CAAC;QACF;AAEA,eAAO,QAAQ,QAAO;MACvB;;EAEF;;EAGQ,MAAM,8BACb,SACA,cAAwC;AAQxC,UAAM,MAAM,KAAK,eAAe,2BAA2B;AAK3D,UAAM,OAAO,MAAM,IAAI,YAAW;AAClC,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,uBACT,iEACA,4BAAgB,sBAAsB;IAExC;AAEA,eAAW,UAAU,SAAS;AAC7B,UAAI,WAAW,GAAG;AACjB,YAAI,CAAC,KAAK,oBAAoB;AAC7B,gBAAM,IAAI,uBACT,2EACA,4BAAgB,8BAA8B;QAEhD;MACD,OAAO;AACN,YAAI,IAAI,UAAU,GAAG;AACpB,gBAAM,IAAI,uBACT,uGACA,4BAAgB,+BAA+B;QAEjD,WACC,KAAK,sBAAsB,SAAS,CAAC,KAAK,QACzC;AACD,gBAAM,IAAI,uBACT,gDAAgD,MAAM,4BACtD,4BAAgB,+BAA+B;QAEjD;MACD;IACD;AAKA,UAAM,MAAM,IAAI,mCAAyB,EAAE,QAAQ,KAAK,GAAE,CAAE;AAC5D,QAAI,wBACH,+BAAmB,UACnB,KAAK,OAAO,WAAW,IAAI,MAAM,KAAK,EAAE,CAAC;AAE1C,UAAM,4BAA4B,KAAK,OACrC,wBACA,GAAG;AAEL,UAAM,+BAA+B,KAAK,OACxC,wBAAwB,KAAK,IAAI;AAEnC,UAAM,gBAAY,iCAAsB,KAAK,QAAQ,GAAG;AACxD,UAAM,0BAA0B,4BAC7B,KACC,aAAa,IAAI,IAAI;AACzB,UAAM,6BAA6B,+BAChC,KACC,aAAa,IAAI,IAAI;AAGzB,UAAM,qBAAqB,KAAK,IAC/B,yBACA,KAAK,mBAAmB,OAAO,iBAAiB;AAEjD,UAAM,wBAAwB,KAAK,IAClC,4BACA,KAAK,mBAAmB,OAAO,iBAAiB;AAGjD,QAAI,aAAa,OAAO;AACvB,mBAAa,aAAa,QAAQ,IAAI;AACtC;IACD,OAAO;AACN,aAAO;QACN,GAAG;QACH;QACA;;IAEF;EACD;EAEU,MAAM,kCACf,SAAoC;AAIpC,QAAI,KAAK,2BAA0B,GAAI;AACtC,WAAK,kCAAkC;AACvC;IACD;AAGA,SAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;MAC1C,SACC;MACD,WAAW;KACX;AAGD,UAAM,MAAM,IAAI,mCAAyB,EAAE,QAAQ,KAAK,GAAE,CAAE;AAC5D,QAAI,wBACH,+BAAmB,UACnB,CAAC,EAAE,QAAQ,qBAAqB,+BAAmB,SAAS;AAE7D,UAAM,gBAAY,iCAAsB,KAAK,QAAQ,GAAG;AACxD,UAAM,eAAe,KAAK,OAAO,wBAAwB,GAAG,IACzD,KACC,aAAa,IAAI,IAAI;AACzB,UAAM,eAAW,yBAAY,YAAY;AACzC,QAAI;AACH,YAAM,KAAK,kCACV,QAAQ,cACR,QAAQ;IAEV,QAAQ;IAER;EACD;;EAGQ,OAAO,4BACd,MACA,gBACA,QACA,YACA,cACA,UACA,iBACA,QACA,mBAA2B;AAE3B,UAAM,MAAM,KAAK,eAAe,2BAA2B;AAK3D,SAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;MAC1C,SAAS;MACT,WAAW;KACX;AAGD,QAAI,SAAS,MAAM,IAAI,cAAc;;MAEpC;MACA;MACA,gBAAgB;MAChB;MACA;MACA;MACA;MACA;KACA;AAID,QAAI,CAAC,QAAQ;AACZ,eAAU,MAAM,MACf,KAAK,OACH,eACA,CAAC,OACA,cAAc,mDACX,GAAG,WAAW,KAAK,IACvB,GAAK;IAET;AAEA,YAAQ,OAAO,QAAQ;MACtB,KAAK,sCAA4B;AAChC,cAAM,IAAI,uBACT,8FACA,4BAAgB,8BAA8B;MAEhD,KAAK,sCAA4B;AAChC,cAAM,IAAI,uBACT,6DACA,4BAAgB,8BAA8B;MAEhD,KAAK,sCACH;AACD,cAAM,IAAI,uBACT,0EACA,4BAAgB,qBAAqB;MAEvC,KAAK,sCACH;AACD,cAAM,IAAI,uBACT,oEACA,4BAAgB,8BAA8B;MAEhD,KAAK,sCAA4B;AAChC,cAAM,IAAI,uBACT,yDACA,4BAAgB,8BAA8B;MAEhD,KAAK,sCAA4B;AAChC,cAAM,IAAI,uBACT,gDAAgD,MAAM,uBACtD,4BAAgB,8BAA8B;MAEhD,KAAK,sCAA4B;AAChC,cAAM,IAAI,uBACT,sEACA,4BAAgB,8BAA8B;MAEhD,KAAK,sCAA4B;AAGhC,aAAK,YAAY;IACnB;AAEA,WAAO;MACN,QAAQ,CAAC,CAAC,OAAO;MACjB,mBAAmB,CAAC,CAAC,OAAO;;EAE9B;EAEU,MAAM,gCACf,SAA4C;AAE5C,UAAM,WAAW,KAAK,YAAY,QAAQ,aAAa,KACnD;AAIJ,UAAM,MAAM,SACV,UAAU,2BAAe,2BAA2B,GAAG,KAAK,EAC5D,YAAY;;;MAGZ,oBAAoB,QAAQ,qBACzB,CAAC,+BAAmB;KACvB;AAGF,UAAM,IAAI,eAAe;MACxB,gBAAgB,KAAK,OAAO,QAAQ,QAAQ,kBACxC;MACJ,oBAAoB;MACpB,iBAAiB,KAAK,OAAO,QAAQ,QAAQ,mBACzC;KACJ;EACF;EAEQ,MAAM,kCACb,WACA,UACA,oBAA6B,OAAK;AAElC,QAAI;AACH,YAAM,KAAK,eAAe,2BAA2B,EACnD,YAAY;;QAEZ,iBAAiB,CAAC;OAClB,EACA,qBAAqB,WAAW,MAAM,QAAQ;IACjD,QAAQ;IAER;EACD;EAEQ,iCACP,gBAAsB;AAGtB,UAAM,4BAA4B,wBAAC,MAClC,EAAE,QAAQ,UAAS,MAAO,KAAK,UAC5B,6BAAW,EAAE,OAAO,KACpB,EAAE,QAAQ,mBAAmB,4CAC7B,EAAE,QAAQ,QAAQ,iBAAiB,gBAJL;AAMlC,WAAO,KAAK,OAAO,uBAClB,yBAAyB;EAE3B;EAEQ,OAAO,yBACd,MACA,cACA,mBACA,cACA,YAAqD;AAMrD,UAAM,eAAe,KAAK,KAAK,KAAK,SAAS,YAAY;AAGzD,SAAK,kCAAkC;AAKvC,WAAQ,QAAO,MAAM;AACpB;AAIA,UAAI;AACJ,UAAI,KAAK,iCAAiC;AACzC,0BAAkB,KAAK;AACvB,aAAK,kCAAkC;MACxC,OAAO;AACN,YAAI;AACH,4BAAkB,MAAM,MACvB,KAAK,OACH;YACA,CAAC,OACA,GAAG,WAAW,KAAK,MAChB,cACS;;;YAGb,qBAAS,QAAQ,CAAC;UAAC;QAEvB,QAAQ;AAGP,eAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;YAC1C,SAAS;YACT,WAAW;YACX,OAAO;WACP;AAED,iBAAO;YACN,SAAS;YACT,QAAQ,+BAAqB;;QAE/B;MACD;AAGA,WAAK,YAAW;AAEhB,UAAI,gBAAgB,eAAe,cAAc;AAChD,aAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;UAC1C,SACC;UACD,WAAW;SACX;AACD,cAAM,KAAK,kCACV,gBAAgB,kBAChB,yBAAY,YAAY,GACxB,iBAAiB;AAGlB,cAAM;MACP;AAGA,cAAS,UACJ,MAAM,gBAAgB,cAC1B,MACG,gBAAgB,eACf,gBAAgB,YACpB,OACC;AACD;AAGA,YAAI,MAAM,cAAc;AACvB;QACD;AACA,cAAM,WAAW,KAAK,UACpB,MAAM,KAAK,cACZ,MAAM,YAAY;AAGnB,YAAI,aAAa,OAAO;AACvB,gBAAM,KAAK,kCACV,gBAAgB,kBAChB,yBAAY,SAAS,MAAM,GAC3B,iBAAiB;AAGlB,gBAAM;QACP,OAAO;AAEN,cAAI,KAAK,iCAAiC,GAAG,GAAG;AAC/C,iBAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;cAC1C,SAAS,qBAAqB,GAAG;cACjC,OAAO;aACP;AACD,qBAAS;UACV;AAEA,eAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;YAC1C,SACC,6BAA6B,GAAG,MAAM,YAAY;YACnD,WAAW;WACX;AACD,gBAAM,SAAS,QAAQ;AAEvB,cAAI;AACH,kBAAM,KACJ,eAAe,2BAA2B,EAC1C,YAAY;;cAEZ,iBAAiB,CAAC;aAClB,EACA,qBAAqB,KAAK,QAAQ,QAAQ;AAE5C,uBAAW,KAAK,YAAY;AAG5B,gBAAI,QAAQ;AACX,2BAAa,iBAAiB;AAC9B,oBAAM;YACP;UACD,QAAQ;AAEP,iBAAK,OAAO,cAAc,QAAQ,KAAK,IAAI;cAC1C,SACC,oCAAoC,GAAG,MAAM,YAAY;cAC1D,WAAW;cACX,OAAO;aACP;AACD,kBAAM;UACP;QACD;MACD;IACD;AAEA;AAMA,UAAM,eAES,MAAM,MACnB,KAAK,OACH;MACA,CAAC,OACA,GAAG,WAAW,KAAK,MAChB,cACS;;;MAGb,IAAI;IAAK,EAET,MAAM,MAAM,MAAS;AAEzB,QAAI,aAAa,OAAO;AACvB,mBAAa,aAAa,QACzB,cAAc,WACT,+BAAqB,wBAAwB;IAEpD;AAEA,QAAI,CAAC,cAAc;AAClB,WAAK,OAAO,cAAc,QACzB,KAAK,IACL,qDACA,MAAM;AAGP,aAAO;QACN,SAAS;QACT,QAAQ,+BAAqB;;IAE/B;AAEA,UAAM,EAAE,QAAQ,SAAQ,IAAK;AAI7B,UAAM,UAAU,UAAU,+BAAqB;AAE/C,WAAO;MACN;MACA;MACA;;EAEF;;",
|
|
6
6
|
"names": ["result"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_version.d.ts","sourceRoot":"","sources":["../../../src/lib/_version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"_version.d.ts","sourceRoot":"","sources":["../../../src/lib/_version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,YAAY,CAAC;AACzC,eAAO,MAAM,YAAY,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_version.js","sourceRoot":"","sources":["../../../src/lib/_version.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"_version.js","sourceRoot":"","sources":["../../../src/lib/_version.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateService.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAOb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EACX,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAElB,MAAM,aAAa,CAAC;AAkHrB,MAAM,WAAW,iCAAiC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateService.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAOb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EACX,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAElB,MAAM,aAAa,CAAC;AAkHrB,MAAM,WAAW,iCAAiC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAiCD;;;GAGG;AACH,wBAAsB,2BAA2B,CAChD,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,iCAAiC,GACxC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsD/B;AAED,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAqEnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateService.js","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateService.js","sourceRoot":"","sources":["../../../../src/lib/controller/FirmwareUpdateService.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;IAyW7B,8FAA8F;YAChF,6BAA6B;cA6F3B,iCAAiC,CAChD,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,IAAI,CAAC;IAoChB,yHAAyH;YAC1G,2BAA2B;
|
|
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;cAiG1B,+BAA+B,CAC9C,OAAO,EAAE,mCAAmC,GAC1C,OAAO,CAAC,IAAI,CAAC;YAyBF,iCAAiC;IAiB/C,OAAO,CAAC,gCAAgC;YAezB,wBAAwB;CA0MvC"}
|
|
@@ -366,7 +366,7 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
366
366
|
direction: "outbound",
|
|
367
367
|
});
|
|
368
368
|
// Request the node to start the upgrade
|
|
369
|
-
await api.requestUpdate({
|
|
369
|
+
let result = await api.requestUpdate({
|
|
370
370
|
// TODO: Should manufacturer id be provided externally?
|
|
371
371
|
manufacturerId,
|
|
372
372
|
firmwareId,
|
|
@@ -377,11 +377,13 @@ export class FirmwareUpdateMixin extends SchedulePollMixin {
|
|
|
377
377
|
resume,
|
|
378
378
|
nonSecureTransfer,
|
|
379
379
|
});
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
380
|
+
// On some devices the response can take a minute or so to be received,
|
|
381
|
+
// probably because of a manual out-of-band activation.
|
|
382
|
+
if (!result) {
|
|
383
|
+
result = (yield () => this.driver
|
|
384
|
+
.waitForCommand((cc) => cc instanceof FirmwareUpdateMetaDataCCRequestReport
|
|
385
|
+
&& cc.nodeId === this.id, 60000));
|
|
386
|
+
}
|
|
385
387
|
switch (result.status) {
|
|
386
388
|
case FirmwareUpdateRequestStatus.Error_AuthenticationExpected:
|
|
387
389
|
throw new ZWaveError(`Failed to start the update: A manual authentication event (e.g. button push) was expected!`, ZWaveErrorCodes.FirmwareUpdateCC_FailedToStart);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"70_FirmwareUpdate.js","sourceRoot":"","sources":["../../../../../src/lib/node/mixins/70_FirmwareUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,wBAAwB,EACxB,2BAA2B,EAE3B,8BAA8B,EAC9B,qCAAqC,EACrC,oCAAoC,EAGpC,2BAA2B,EAE3B,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,WAAW,EACX,cAAc,EACd,kBAAkB,EAElB,aAAa,EACb,UAAU,EACV,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,QAAQ,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAEN,qBAAqB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAGN,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAY1D,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CAAC,CAAgB;IACvD,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,qBAAqB,CAAC;AAC5C,CAAC;AA8BD,MAAM,OAAgB,mBAAoB,SAAQ,iBAAiB;IAG1D,oBAAoB,CAAoC;IACzD,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnC,CAAC;IAED,+DAA+D;IAC/D,iGAAiG;IACzF,oBAAoB,CAAqB;IAEjD,6FAA6F;IACrF,+BAA+B,CAE1B;IAEN,KAAK,CAAC,cAAc,CAC1B,OAAmB,EACnB,UAAiC,EAAE;QAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,UAAU,CACnB,sCAAsC,EACtC,eAAe,CAAC,gBAAgB,CAChC,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,UAAU,CACnB,wDAAwD,EACxD,eAAe,CAAC,gBAAgB,CAChC,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IACC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;gBACrD,OAAO,CAAC,MAAM,EAClB,CAAC;YACF,MAAM,IAAI,UAAU,CACnB,4DAA4D,EAC5D,eAAe,CAAC,gBAAgB,CAChC,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,UAAU,CACnB,8EAA8E,EAC9E,eAAe,CAAC,qBAAqB,CACrC,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CACnB,qFAAqF,EACrF,eAAe,CAAC,qBAAqB,CACrC,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEM,0BAA0B;QAChC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAClE,CAAC;IAEO,qBAAqB,CAC5B,OAAmB,EACnB,UAAiC,EAAE;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,2CAA2C;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAEjD,CAAC,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,qBAAqB;eAChC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAC3B,CAAC;QACF,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QAEtC,IAAI,SAAkB,CAAC;QAEvB,OAAO;YACN,2EAA2E;YAC3E,QAAQ,EAAE,YAAY,CAAC,KAAK;YAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACnD,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC,kBAAkB;gBACvC,sDAAsD;gBACtD,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEtB,8BAA8B;gBAC9B,MAAM,YAAY,GAAG;oBACpB,KAAK,EAAE,KAAK;oBACZ,cAAc,EAAE,KAAK;oBACrB,YAAY,EAAE,qBAAqB,EAAW;iBAC9C,CAAC;gBAEF,IAAI,CAAC,oBAAoB,GAAG,KAAK,IAAI,EAAE;oBACtC,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;wBACjC,MAAM,IAAI,UAAU,CACnB,uEAAuE,EACvE,eAAe,CAAC,8BAA8B,CAC9C,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;wBAC1C,OAAO,EAAE,6BAA6B;wBACtC,SAAS,EAAE,UAAU;qBACrB,CAAC,CAAC;oBAEH,oBAAoB;oBACpB,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC;oBAC1B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;oBAChD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACd,MAAM,IAAI,UAAU,CACnB,iDAAiD,EACjD,eAAe,CAAC,8BAA8B,CAC9C,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;wBAC1C,OAAO,EAAE,yBAAyB;wBAClC,SAAS,EAAE,SAAS;qBACpB,CAAC,CAAC;gBACJ,CAAC,CAAC;gBAEF,8BAA8B;gBAC9B,IAAI,kBAA0B,CAAC;gBAC/B,IAAI,qBAA6B,CAAC;gBAClC,IAAI,eAAmC,CAAC;gBACxC,IAAI,IAA4B,CAAC;gBACjC,IAAI,CAAC;oBACJ,MAAM,aAAa,GAAG,MAAM,IAAI;yBAC9B,6BAA6B,CAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,EACzC,YAAY,CACZ,CAAC;oBAEH,sBAAsB;oBACtB,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,MAAM,GAAyB;4BACpC,OAAO,EAAE,KAAK;4BACd,MAAM,EAAE,oBAAoB;iCAC1B,wBAAwB;4BAC1B,WAAW,EAAE,KAAK;yBAClB,CAAC;wBACF,IAAI,CAAC,KAAK,CACT,0BAA0B,EAC1B,IAAI,EACJ,MAAM,CACN,CAAC;wBACF,OAAO,MAAM,CAAC;oBACf,CAAC;oBAED,8EAA8E;oBAC9E,CAAC;wBACA,kBAAkB;wBAClB,qBAAqB;wBACrB,eAAe;wBACf,GAAG,IAAI;qBACP,GAAG,aAAc,CAAC,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACR,uEAAuE;oBACvE,MAAM,MAAM,GAAyB;wBACpC,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,oBAAoB,CAAC,wBAAwB;wBACrD,WAAW,EAAE,KAAK;qBAClB,CAAC;oBAEF,OAAO,MAAM,CAAC;gBACf,CAAC;gBAED,KAAK,CAAC,CAAC,oDAAoD;gBAE3D,+EAA+E;gBAC/E,mEAAmE;gBACnE,IAAI,CAAC,IAAI,CAAC,gBAAgB;oBAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;gBAEnD,MAAM,aAAa,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACrD,MAAM,QAAQ,GAAG,aAAa,KAAK,aAAa,CAAC,SAAS;uBACtD,iBAAiB,CAAC,aAAa,CAAC,CAAC;gBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,mEAAmE;oBACnE,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBACnC,CAAC;qBAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC5C,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBACnC,CAAC;gBAED,8EAA8E;gBAC9E,MAAM,cAAc,GAAG,QAAQ,CAC9B,CAAC,QAAQ,EAAE,EAAE,CACZ,IAAI,CAAC,KAAK,CACT,0BAA0B,EAC1B,IAAI,EACJ,QAAQ,CACR,EACF,GAAG,EACH,IAAI,CACJ,CAAC;gBAEF,sFAAsF;gBACtF,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,GAAG,CAAC;oBACJ,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;iBAC7B,CAAC,CAAC,CAAC;gBACJ,IAAI,iBAAiB,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM;uBAC7B,IAAI,CAAC,oBAAoB,IAAI,SAAS,CAAC;gBAC3C,IAAI,YAAY,EAAE,CAAC;oBAClB,iBAAiB,GAAG,mBAAmB,CAAC,SAAS,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,oBAAoB,CAC/C,CAAC;oBACF,IAAI,iBAAiB,KAAK,CAAC,CAAC;wBAAE,YAAY,GAAG,KAAK,CAAC;gBACpD,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,YAA0C,CAAC;gBAC/C,IAAI,oBAA4B,CAAC;gBAEjC,MAAM,UAAU,GAAW,mBAAmB,CAAC,MAAM,CACpD,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAC7C,CAAC,CACD,CAAC;gBACF,IAAI,wBAAwB,GAAG,CAAC,CAAC;gBAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrD,MAAM;oBACL,8DAA8D;oBAC9D,cAAc,EAAE,MAAM,GAAG,CAAC;oBAC1B,0EAA0E;oBAC1E,UAAU,GAAG,MAAM,KAAK,CAAC;wBACxB,CAAC,CAAC,IAAI,CAAC,UAAU;wBACjB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,EACzC,IAAI,EACJ,QAAQ,GACR,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAE3B,IAAI,CAAC,GAAG,iBAAiB,EAAE,CAAC;wBAC3B,sEAAsE;wBACtE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,oDACC,CAAC,GAAG,CACL,MAAM,mBAAmB,CAAC,MAAM,MAAM,CACtC,CAAC;wBACF,wBAAwB,IAAI,IAAI,CAAC,MAAM,CAAC;wBACxC,SAAS;oBACV,CAAC;oBAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,2BACC,CAAC,GAAG,CACL,MAAM,mBAAmB,CAAC,MAAM,MAAM,CACtC,CAAC;oBAEF,kFAAkF;oBAClF,qEAAqE;oBACrE,IAAI,YAAY,GAAG,OAAO,CAAC,iBAAiB;wBAC3C,CAAC,CAAC,qBAAqB;wBACvB,CAAC,CAAC,kBAAkB,CAAC;oBAEtB,8CAA8C;oBAC9C,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI;yBAC/C,2BAA2B,CAC3B,IAAI,EACJ,IAAI,CAAC,cAAc,EACnB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,OAAO,CAAC,iBAAiB,CACzB,CAAC;oBAEH,sFAAsF;oBACtF,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACrD,YAAY,GAAG,kBAAkB,CAAC;oBACnC,CAAC;oBAED,uDAAuD;oBACvD,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;oBAErC,IAAI,YAAY,EAAE,CAAC;wBAClB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,QACC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBACvB,yBAAyB,CACzB,CAAC;oBACH,CAAC;oBACD,IAAI,iBAAiB,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,oDAAoD,CACpD,CAAC;oBACH,CAAC;oBAED,KAAK,CAAC,CAAC,oDAAoD;oBAE3D,+DAA+D;oBAC/D,YAAY,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAClD,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;wBACnB,MAAM,QAAQ,GAA2B;4BACxC,WAAW,EAAE,CAAC,GAAG,CAAC;4BAClB,UAAU,EAAE,mBAAmB,CAAC,MAAM;4BACtC,aAAa,EAAE,QAAQ;4BACvB,cAAc,EAAE,KAAK;4BACrB,QAAQ,EAAE,OAAO,CAChB,CACC,CAAC,wBAAwB;kCACtB,IAAI,CAAC,GAAG,CACT,QAAQ,GAAG,YAAY,EACvB,IAAI,CAAC,MAAM,CACX,CAAC;kCACD,UAAU,CACZ,GAAG,GAAG,EACP,CAAC,CACD;yBACD,CAAC;wBACF,cAAc,CAAC,QAAQ,CAAC,CAAC;wBAEzB,yGAAyG;wBACzG,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;4BACxB,wBAAwB,IAAI,IAAI,CAAC,MAAM,CAAC;wBACzC,CAAC;oBACF,CAAC,CACD,CAAC;oBAEF,wFAAwF;oBACxF,oBAAoB,GAAG,IAAI,CAAC,MAAM;yBAChC,0CAA0C,CAC1C,YAAY,CAAC,QAAQ,CACrB,CAAC;oBAEH,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;wBAC3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;4BAC1C,OAAO,EAAE,yBACR,CAAC,GAAG,CACL,MAAM,mBAAmB,CAAC,MAAM,wBAC/B,iBAAiB,CAChB,oBAAoB,EACpB,YAAY,CAAC,MAAM,CAErB,EAAE;4BACF,SAAS,EAAE,SAAS;yBACpB,CAAC,CAAC;wBAEH,MAAM,MAAM,GAAyB;4BACpC,GAAG,YAAY;4BACf,QAAQ,EAAE,SAAS;4BACnB,WAAW,EAAE,KAAK;yBAClB,CAAC;wBACF,IAAI,CAAC,KAAK,CACT,0BAA0B,EAC1B,IAAI,EACJ,MAAM,CACN,CAAC;wBAEF,OAAO,MAAM,CAAC;oBACf,CAAC;yBAAM,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/C,2CAA2C;wBAE3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;4BAC1C,OAAO,EAAE,yBACR,CAAC,GAAG,CACL,MAAM,mBAAmB,CAAC,MAAM,2BAC/B,iBAAiB,CAChB,oBAAoB,EACpB,YAAY,CAAC,MAAM,CAErB,EAAE;4BACF,SAAS,EAAE,SAAS;yBACpB,CAAC,CAAC;wBAEH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,gCAAgC,oBAAoB,aAAa,CACjE,CAAC;wBAEF,iFAAiF;wBACjF,YAAY,GAAG,KAAK,CAAC;wBAErB,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACF,CAAC;gBAED,4CAA4C;gBAC5C,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBAEtC,MAAM,MAAM,GAAyB;oBACpC,GAAG,YAAY;oBACf,QAAQ,EAAE,oBAAqB;oBAC/B,WAAW,EAAE,IAAI;iBACjB,CAAC;gBAEF,uFAAuF;gBACvF,gDAAgD;gBAChD,SAAS,GAAG,IAAI,CAAC;gBAEjB,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAErD,OAAO,MAAM,CAAC;YACf,CAAC;YACD,OAAO;gBACN,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBACtC,IAAI,CAAC,+BAA+B,GAAG,SAAS,CAAC;gBAEjD,0DAA0D;gBAC1D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,YAAY,CAAC,GAAG,EAAE;wBACjB,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;oBAC3C,CAAC,CAAC,CAAC;gBACJ,CAAC;gBAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;SACD,CAAC;IACH,CAAC;IAED,8FAA8F;IACtF,KAAK,CAAC,6BAA6B,CAC1C,OAAiB,EACjB,YAAwC;QAQxC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAE7D,mCAAmC;QACnC,UAAU;QACV,mCAAmC;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,UAAU,CACnB,+DAA+D,EAC/D,eAAe,CAAC,sBAAsB,CACtC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC9B,MAAM,IAAI,UAAU,CACnB,yEAAyE,EACzE,eAAe,CAAC,8BAA8B,CAC9C,CAAC;gBACH,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAI,UAAU,CACnB,qGAAqG,EACrG,eAAe,CAAC,+BAA+B,CAC/C,CAAC;gBACH,CAAC;qBAAM,IACN,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAClD,CAAC;oBACF,MAAM,IAAI,UAAU,CACnB,gDAAgD,MAAM,0BAA0B,EAChF,eAAe,CAAC,+BAA+B,CAC/C,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;QAED,mCAAmC;QACnC,UAAU;QACV,8BAA8B;QAC9B,MAAM,GAAG,GAAG,IAAI,wBAAwB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,uBAAuB,CAC1B,kBAAkB,CAAC,QAAQ,EAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CACzC,CAAC;QACF,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM;aAC3C,uBAAuB,CACvB,GAAG,CACH,CAAC;QACH,MAAM,4BAA4B,GAAG,IAAI,CAAC,MAAM;aAC9C,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,uBAAuB,GAAG,yBAAyB;cACtD,CAAC,CAAC,gBAAgB;cAClB,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QACxC,MAAM,0BAA0B,GAAG,4BAA4B;cAC5D,CAAC,CAAC,gBAAgB;cAClB,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QAExC,mCAAmC;QACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAClC,uBAAuB,EACvB,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAChD,CAAC;QACF,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CACrC,0BAA0B,EAC1B,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAChD,CAAC;QAEF,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACxB,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO;QACR,CAAC;aAAM,CAAC;YACP,OAAO;gBACN,GAAG,IAAI;gBACP,kBAAkB;gBAClB,qBAAqB;aACrB,CAAC;QACH,CAAC;IACF,CAAC;IAES,KAAK,CAAC,iCAAiC,CAChD,OAAoC;QAEpC,2DAA2D;QAC3D,gGAAgG;QAChG,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,+BAA+B,GAAG,OAAO,CAAC;YAC/C,OAAO;QACR,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1C,OAAO,EACN,mGAAmG;YACpG,SAAS,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,+EAA+E;QAC/E,MAAM,GAAG,GAAG,IAAI,wBAAwB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,uBAAuB,CAC1B,kBAAkB,CAAC,QAAQ,EAC3B,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAC5D,CAAC;QACF,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC;cAC1D,CAAC,CAAC,gBAAgB;cAClB,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,iCAAiC,CAC3C,OAAO,CAAC,YAAY,EACpB,QAAQ,CACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IAED,yHAAyH;IACjH,KAAK,CAAC,CAAC,2BAA2B,CACzC,IAAgB,EAChB,cAAsB,EACtB,MAAc,EACd,UAAkB,EAClB,YAAoB,EACpB,QAAgB,EAChB,eAAwB,EACxB,MAAgB,EAChB,iBAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAE7D,mCAAmC;QACnC,UAAU;QACV,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1C,OAAO,EAAE,6BAA6B;YACtC,SAAS,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,GAAG,CAAC,aAAa,CAAC;YACvB,uDAAuD;YACvD,cAAc;YACd,UAAU;YACV,cAAc,EAAE,MAAM;YACtB,YAAY;YACZ,QAAQ;YACR,eAAe;YACf,MAAM;YACN,iBAAiB;SACjB,CAAC,CAAC;QACH,uEAAuE;QACvE,iBAAiB;QACjB,MAAM,MAAM,GAA0C,MAAM,GAAG,EAAE,CAChE,IAAI,CAAC,MAAM;aACT,cAAc,CACd,CAAC,EAAE,EAAE,EAAE,CACN,EAAE,YAAY,qCAAqC;eAChD,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EACzB,KAAK,CACL,CAAC;QAEJ,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,2BAA2B,CAAC,4BAA4B;gBAC5D,MAAM,IAAI,UAAU,CACnB,4FAA4F,EAC5F,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B,CAAC,gBAAgB;gBAChD,MAAM,IAAI,UAAU,CACnB,2DAA2D,EAC3D,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B;iBAC9B,+BAA+B;gBAChC,MAAM,IAAI,UAAU,CACnB,wEAAwE,EACxE,eAAe,CAAC,qBAAqB,CACrC,CAAC;YACH,KAAK,2BAA2B;iBAC9B,qCAAqC;gBACtC,MAAM,IAAI,UAAU,CACnB,kEAAkE,EAClE,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B,CAAC,4BAA4B;gBAC5D,MAAM,IAAI,UAAU,CACnB,uDAAuD,EACvD,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B,CAAC,mBAAmB;gBACnD,MAAM,IAAI,UAAU,CACnB,gDAAgD,MAAM,qBAAqB,EAC3E,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B,CAAC,0BAA0B;gBAC1D,MAAM,IAAI,UAAU,CACnB,oEAAoE,EACpE,eAAe,CAAC,8BAA8B,CAC9C,CAAC;YACH,KAAK,2BAA2B,CAAC,EAAE;gBAClC,6BAA6B;gBAC7B,gDAAgD;gBAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,OAAO;YACN,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;YACvB,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,iBAAiB;SAC7C,CAAC;IACH,CAAC;IAES,KAAK,CAAC,+BAA+B,CAC9C,OAA4C;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;eACpD,IAAI,CAAC;QAET,wFAAwF;QACxF,6DAA6D;QAC7D,MAAM,GAAG,GAAG,QAAQ;aAClB,SAAS,CAAC,cAAc,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC;aAC7D,WAAW,CAAC;YACZ,wDAAwD;YACxD,2DAA2D;YAC3D,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;kBAC3C,CAAC,kBAAkB,CAAC,WAAW;SAClC,CAAC,CAAC;QAEJ,iDAAiD;QACjD,MAAM,GAAG,CAAC,cAAc,CAAC;YACxB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc;mBACtD,MAAM;YACV,kBAAkB,EAAE,KAAK;YACzB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe;mBACxD,CAAC;SACL,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iCAAiC,CAC9C,SAAiB,EACjB,QAAoB,EACpB,oBAA6B,KAAK;QAElC,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,cAAc,CAAC,2BAA2B,CAAC;iBACpD,WAAW,CAAC;gBACZ,6CAA6C;gBAC7C,eAAe,EAAE,CAAC,iBAAiB;aACnC,CAAC;iBACD,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IAEO,gCAAgC,CACvC,cAAsB;QAEtB,oCAAoC;QACpC,MAAM,yBAAyB,GAAG,CAAC,CAAc,EAAE,EAAE,CACpD,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE;eAC9B,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;eACrB,CAAC,CAAC,OAAO,CAAC,OAAO,YAAY,8BAA8B;eAC3D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,KAAK,cAAc,CAAC;QAEtD,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CACxC,yBAAyB,CACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,CAAC,wBAAwB,CACtC,IAAgB,EAChB,YAAoB,EACpB,iBAA0B,EAC1B,YAAwC,EACxC,UAAqD;QAMrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QAE3D,oEAAoE;QACpE,IAAI,CAAC,+BAA+B,GAAG,SAAS,CAAC;QAEjD,mCAAmC;QACnC,UAAU;QACV,6CAA6C;QAC7C,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,CAAC,oDAAoD;YAE3D,iIAAiI;YACjI,8GAA8G;YAC9G,IAAI,eAA4C,CAAC;YACjD,IAAI,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBAC1C,eAAe,GAAG,IAAI,CAAC,+BAA+B,CAAC;gBACvD,IAAI,CAAC,+BAA+B,GAAG,SAAS,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC;oBACJ,eAAe,GAAG,MAAM,GAAG,EAAE,CAC5B,IAAI,CAAC,MAAM;yBACT,cAAc,CACd,CAAC,EAAE,EAAE,EAAE,CACN,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE;2BAClB,EAAE;uCACO,2BAA2B;oBACxC,kDAAkD;oBAClD,0FAA0F;oBAC1F,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CACnB,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACR,6EAA6E;oBAC7E,oEAAoE;oBACpE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;wBAC1C,OAAO,EAAE,2BAA2B;wBACpC,SAAS,EAAE,MAAM;wBACjB,KAAK,EAAE,MAAM;qBACb,CAAC,CAAC;oBAEH,OAAO;wBACN,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,oBAAoB,CAAC,aAAa;qBAC1C,CAAC;gBACH,CAAC;YACF,CAAC;YAED,oEAAoE;YACpE,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,IAAI,eAAe,CAAC,YAAY,GAAG,YAAY,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;oBAC1C,OAAO,EACN,0FAA0F;oBAC3F,SAAS,EAAE,SAAS;iBACpB,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,iCAAiC,CAC3C,eAAe,CAAC,YAAY,EAC5B,WAAW,CAAC,YAAY,CAAC,EACzB,iBAAiB,CACjB,CAAC;gBACF,+DAA+D;gBAC/D,MAAM,MAAM,CAAC;YACd,CAAC;YAED,qCAAqC;YACrC,OAAO,EAAE,KACR,IAAI,GAAG,GAAG,eAAe,CAAC,YAAY,EACtC,GAAG;kBACA,eAAe,CAAC,YAAY;sBAC3B,eAAe,CAAC,UAAU,EAC9B,GAAG,EAAE,EACJ,CAAC;gBACF,KAAK,CAAC,CAAC,oDAAoD;gBAE3D,2DAA2D;gBAC3D,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;oBACxB,MAAM;gBACP,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAC7B,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,YAAY,EACxB,GAAG,GAAG,YAAY,CAClB,CAAC;gBAEF,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,iCAAiC,CAC3C,eAAe,CAAC,YAAY,EAC5B,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC5B,iBAAiB,CACjB,CAAC;oBACF,+DAA+D;oBAC/D,MAAM,MAAM,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACP,oCAAoC;oBACpC,IAAI,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;4BAC1C,OAAO,EAAE,qBAAqB,GAAG,iBAAiB;4BAClD,KAAK,EAAE,MAAM;yBACb,CAAC,CAAC;wBACH,SAAS,OAAO,CAAC;oBAClB,CAAC;oBAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;wBAC1C,OAAO,EACN,6BAA6B,GAAG,MAAM,YAAY,EAAE;wBACrD,SAAS,EAAE,UAAU;qBACrB,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,GAAG,KAAK,YAAY,CAAC;oBAEpC,IAAI,CAAC;wBACJ,MAAM,IAAI;6BACR,cAAc,CAAC,2BAA2B,CAAC;6BAC3C,WAAW,CAAC;4BACZ,6CAA6C;4BAC7C,eAAe,EAAE,CAAC,iBAAiB;yBACnC,CAAC;6BACD,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;wBAE9C,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;wBAE9B,sFAAsF;wBACtF,IAAI,MAAM,EAAE,CAAC;4BACZ,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC;4BACnC,MAAM,MAAM,CAAC;wBACd,CAAC;oBACF,CAAC;oBAAC,MAAM,CAAC;wBACR,mHAAmH;wBACnH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;4BAC1C,OAAO,EACN,oCAAoC,GAAG,MAAM,YAAY,EAAE;4BAC5D,SAAS,EAAE,UAAU;4BACrB,KAAK,EAAE,MAAM;yBACb,CAAC,CAAC;wBACH,MAAM,OAAO,CAAC;oBACf,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,KAAK,CAAC,CAAC,oDAAoD;QAE3D,mCAAmC;QACnC,UAAU;QACV,8BAA8B;QAE9B,MAAM,YAAY,GAEH,MAAM,GAAG,EAAE,CACxB,IAAI,CAAC,MAAM;aACT,cAAc,CACd,CAAC,EAAE,EAAE,EAAE,CACN,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE;eAClB,EAAE;2BACO,oCAAoC;QACjD,sEAAsE;QACtE,8BAA8B;QAC9B,CAAC,GAAG,KAAK,CACT;aACA,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE3B,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACxB,YAAY,CAAC,YAAY,CAAC,OAAO,CAChC,YAAY,EAAE,MAAM;oBACf,oBAAoB,CAAC,wBAAwB,CAClD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAChC,IAAI,CAAC,EAAE,EACP,mDAAmD,EACnD,MAAM,CACN,CAAC;YAEF,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,oBAAoB,CAAC,aAAa;aAC1C,CAAC;QACH,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;QAE1C,6EAA6E;QAC7E,+CAA+C;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,CAAC;QAEvE,OAAO;YACN,OAAO;YACP,MAAM;YACN,QAAQ;SACR,CAAC;IACH,CAAC;CACD"}
|
|
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.11",
|
|
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.
|
|
102
|
+
"@zwave-js/cc": "14.3.10",
|
|
103
|
+
"@zwave-js/config": "14.3.10",
|
|
104
104
|
"@zwave-js/core": "14.3.9",
|
|
105
|
-
"@zwave-js/host": "14.3.
|
|
105
|
+
"@zwave-js/host": "14.3.10",
|
|
106
106
|
"@zwave-js/nvmedit": "14.3.9",
|
|
107
|
-
"@zwave-js/serial": "14.3.
|
|
107
|
+
"@zwave-js/serial": "14.3.10",
|
|
108
108
|
"@zwave-js/shared": "14.3.7",
|
|
109
|
-
"@zwave-js/testing": "14.3.
|
|
109
|
+
"@zwave-js/testing": "14.3.10",
|
|
110
110
|
"alcalzone-shared": "^5.0.0",
|
|
111
111
|
"ansi-colors": "^4.1.3",
|
|
112
112
|
"execa": "^5.1.1",
|