@willieee802/zigbee-herdsman 0.49.0 → 0.49.1
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/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +38 -0
- package/biome.json +1 -1
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
- package/dist/adapter/const.d.ts.map +1 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -0
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -0
- package/dist/adapter/ember/utils/initters.d.ts.map +1 -0
- package/dist/adapter/events.d.ts.map +1 -0
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -0
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/index.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -0
- package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -0
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
- package/dist/adapter/zboss/driver.d.ts.map +1 -0
- package/dist/adapter/zboss/frame.d.ts.map +1 -0
- package/dist/adapter/zboss/frame.js +200 -0
- package/dist/adapter/zboss/frame.js.map +1 -0
- package/dist/adapter/zboss/uart.d.ts.map +1 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.js +198 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -0
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -0
- package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
- package/dist/controller/controller.d.ts.map +1 -0
- package/dist/controller/controller.js +874 -0
- package/dist/controller/controller.js.map +1 -0
- package/dist/controller/database.d.ts.map +1 -0
- package/dist/controller/events.d.ts.map +1 -0
- package/dist/controller/events.js +3 -0
- package/dist/controller/events.js.map +1 -0
- package/dist/controller/greenPower.d.ts.map +1 -0
- package/dist/controller/greenPower.js +425 -0
- package/dist/controller/greenPower.js.map +1 -0
- package/dist/controller/helpers/index.d.ts.map +1 -0
- package/dist/controller/helpers/ota.d.ts.map +1 -0
- package/dist/controller/helpers/ota.js +467 -0
- package/dist/controller/helpers/ota.js.map +1 -0
- package/dist/controller/helpers/request.d.ts.map +1 -0
- package/dist/controller/helpers/requestQueue.d.ts.map +1 -0
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -0
- package/dist/controller/helpers/zclFrameConverter.js +84 -0
- package/dist/controller/helpers/zclFrameConverter.js.map +1 -0
- package/dist/controller/index.d.ts.map +1 -0
- package/dist/controller/model/device.d.ts.map +1 -0
- package/dist/controller/model/device.js +1396 -0
- package/dist/controller/model/device.js.map +1 -0
- package/dist/controller/model/endpoint.d.ts.map +1 -0
- package/dist/controller/model/endpoint.js +822 -0
- package/dist/controller/model/endpoint.js.map +1 -0
- package/dist/controller/model/entity.d.ts.map +1 -0
- package/dist/controller/model/group.d.ts.map +1 -0
- package/dist/controller/model/group.js +343 -0
- package/dist/controller/model/group.js.map +1 -0
- package/dist/controller/model/index.d.ts.map +1 -0
- package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
- package/dist/controller/touchlink.d.ts.map +1 -0
- package/dist/controller/tstype.d.ts.map +1 -0
- package/dist/controller/tstype.js +3 -0
- package/dist/controller/tstype.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/utils/timeService.d.ts.map +1 -0
- package/dist/utils/timeService.js +127 -0
- package/dist/utils/timeService.js.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.js +969 -0
- package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
- package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/cluster.js +7507 -0
- package/dist/zspec/zcl/definition/cluster.js.map +1 -0
- package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
- package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/clusters-types.js +3 -0
- package/dist/zspec/zcl/definition/clusters-types.js.map +1 -0
- package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/foundation.js +312 -0
- package/dist/zspec/zcl/definition/foundation.js.map +1 -0
- package/dist/zspec/zcl/definition/tstype.d.ts +273 -0
- package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/tstype.js +3 -0
- package/dist/zspec/zcl/definition/tstype.js.map +1 -0
- package/dist/zspec/zcl/index.d.ts.map +1 -0
- package/dist/zspec/zcl/index.js +57 -0
- package/dist/zspec/zcl/index.js.map +1 -0
- package/dist/zspec/zcl/utils.d.ts.map +1 -0
- package/dist/zspec/zcl/utils.js +419 -0
- package/dist/zspec/zcl/utils.js.map +1 -0
- package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
- package/dist/zspec/zcl/zclFrame.js +328 -0
- package/dist/zspec/zcl/zclFrame.js.map +1 -0
- package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
- package/dist/zspec/zcl/zclHeader.js +88 -0
- package/dist/zspec/zcl/zclHeader.js.map +1 -0
- package/package.json +90 -83
- package/src/controller/helpers/ota.ts +5 -2
- package/src/zspec/zcl/definition/cluster.ts +3 -294
- package/src/zspec/zcl/definition/clusters-types.ts +6 -355
- package/src/zspec/zcl/definition/tstype.ts +0 -14
- package/src/zspec/zcl/utils.ts +14 -31
- package/test/controller.test.ts +16 -8
- package/test/zcl.test.ts +36 -7
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.OtaSession = exports.UPGRADE_FILE_IDENTIFIER_BUF = exports.UPGRADE_FILE_IDENTIFIER = exports.OtaTagId = void 0;
|
|
40
|
+
exports.setOtaConfiguration = setOtaConfiguration;
|
|
41
|
+
exports.getOtaFirmware = getOtaFirmware;
|
|
42
|
+
exports.getOtaIndex = getOtaIndex;
|
|
43
|
+
exports.parseOtaHeader = parseOtaHeader;
|
|
44
|
+
exports.parseOtaSubElement = parseOtaSubElement;
|
|
45
|
+
exports.parseOtaImage = parseOtaImage;
|
|
46
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
47
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
48
|
+
const node_fs_1 = require("node:fs");
|
|
49
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
50
|
+
const node_perf_hooks_1 = require("node:perf_hooks");
|
|
51
|
+
const logger_1 = require("../../utils/logger");
|
|
52
|
+
const Zcl = __importStar(require("../../zspec/zcl"));
|
|
53
|
+
const NS = "zh:controller:ota";
|
|
54
|
+
// OTA_HEADER_VERSION_ZIGBEE 0x0100
|
|
55
|
+
// ZIGBEE_2006_STACK_VERSION 0x0000
|
|
56
|
+
// ZIGBEE_2007_STACK_VERSION 0x0001
|
|
57
|
+
// ZIGBEE_PRO_STACK_VERSION 0x0002
|
|
58
|
+
// ZIGBEE_IP_STACK_VERSION 0x0003
|
|
59
|
+
// MANUFACTURE_CODE_WILD_CARD 0xFFFF
|
|
60
|
+
// IMAGE_TYPE_WILD_CARD 0xFFFF
|
|
61
|
+
// IMAGE_TYPE_SECURITY 0xFFC0
|
|
62
|
+
// IMAGE_TYPE_CONFIG 0xFFC1
|
|
63
|
+
// IMAGE_TYPE_LOG 0xFFC2
|
|
64
|
+
// FILE_VERSION_WILD_CARD 0xFFFFFFFF
|
|
65
|
+
var OtaTagId;
|
|
66
|
+
(function (OtaTagId) {
|
|
67
|
+
OtaTagId[OtaTagId["UpgradeImage"] = 0] = "UpgradeImage";
|
|
68
|
+
/** signer IEEE address (8-byte), signature data (42-byte) */
|
|
69
|
+
OtaTagId[OtaTagId["ECDSASignatureCryptoSuite1"] = 1] = "ECDSASignatureCryptoSuite1";
|
|
70
|
+
/** ECDSA certificate (48-byte) */
|
|
71
|
+
OtaTagId[OtaTagId["ECDSASigningCertificateCryptoSuite1"] = 2] = "ECDSASigningCertificateCryptoSuite1";
|
|
72
|
+
/** hash value (16-byte) */
|
|
73
|
+
OtaTagId[OtaTagId["ImageIntegrityCode"] = 3] = "ImageIntegrityCode";
|
|
74
|
+
/** */
|
|
75
|
+
OtaTagId[OtaTagId["PictureData"] = 4] = "PictureData";
|
|
76
|
+
/** signer IEEE address (8-byte), signature data (72-byte) */
|
|
77
|
+
OtaTagId[OtaTagId["ECDSASignatureCryptoSuite2"] = 5] = "ECDSASignatureCryptoSuite2";
|
|
78
|
+
/** ECDSA certificate (74-byte) */
|
|
79
|
+
OtaTagId[OtaTagId["ECDSASigningCertificateCryptoSuite2"] = 6] = "ECDSASigningCertificateCryptoSuite2";
|
|
80
|
+
// "Manufacturer Specific Use" = 0xf000 – 0xffff,
|
|
81
|
+
/**
|
|
82
|
+
* 2-byte header before actual `UpgradeImage`
|
|
83
|
+
* see https://github.com/telink-semi/telink_zigbee_sdk/blob/d5bc2f7b0c1f8536fe21c8127ca680ea8214bc8e/tl_zigbee_sdk/zigbee/ota/ota.h#L38
|
|
84
|
+
*/
|
|
85
|
+
OtaTagId[OtaTagId["TelinkAES"] = 61440] = "TelinkAES";
|
|
86
|
+
// IkeaUnknown1 = 0xffbf, // parse fine as regular tag
|
|
87
|
+
// IkeaUnknown2 = 0xffbe, // parse fine as regular tag (custom ECDSA?)
|
|
88
|
+
})(OtaTagId || (exports.OtaTagId = OtaTagId = {}));
|
|
89
|
+
const ZIGBEE_OTA_LATEST_URL = "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/index.json";
|
|
90
|
+
const ZIGBEE_OTA_PREVIOUS_URL = "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/index1.json";
|
|
91
|
+
const UPGRADE_END_REQUEST_ID = Zcl.Clusters.genOta.commands.upgradeEndRequest.ID;
|
|
92
|
+
const IMAGE_BLOCK_REQUEST_ID = Zcl.Clusters.genOta.commands.imageBlockRequest.ID;
|
|
93
|
+
const IMAGE_PAGE_REQUEST_ID = Zcl.Clusters.genOta.commands.imagePageRequest.ID;
|
|
94
|
+
/** uint32 LE */
|
|
95
|
+
exports.UPGRADE_FILE_IDENTIFIER = 0x0beef11e;
|
|
96
|
+
exports.UPGRADE_FILE_IDENTIFIER_BUF = Buffer.from([0x1e, 0xf1, 0xee, 0x0b]);
|
|
97
|
+
// #region General Utils
|
|
98
|
+
let dataDir;
|
|
99
|
+
let overrideIndexLocation;
|
|
100
|
+
/**
|
|
101
|
+
* Set the dataDir for relative path needs (firmware file, index) as well as override index if any.
|
|
102
|
+
*/
|
|
103
|
+
function setOtaConfiguration(inDataDir, inOverrideIndexLocation) {
|
|
104
|
+
dataDir = inDataDir;
|
|
105
|
+
// If the file name is not a full path, then treat it as a relative to the data directory
|
|
106
|
+
overrideIndexLocation =
|
|
107
|
+
inOverrideIndexLocation && !isValidUrl(inOverrideIndexLocation) && !node_path_1.default.isAbsolute(inOverrideIndexLocation)
|
|
108
|
+
? node_path_1.default.join(dataDir, inOverrideIndexLocation)
|
|
109
|
+
: inOverrideIndexLocation;
|
|
110
|
+
}
|
|
111
|
+
function isValidUrl(url) {
|
|
112
|
+
try {
|
|
113
|
+
const parsed = new URL(url);
|
|
114
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function getJson(pageUrl) {
|
|
121
|
+
const response = await fetch(pageUrl);
|
|
122
|
+
if (!response.ok || !response.body) {
|
|
123
|
+
throw new Error(`Invalid response from ${pageUrl} status=${response.status}`);
|
|
124
|
+
}
|
|
125
|
+
return (await response.json());
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Validates a firmware file and returns the appropriate buffer (without possible manufacturer-specific header)
|
|
129
|
+
*/
|
|
130
|
+
function validateFirmware(fileBuffer, sha512) {
|
|
131
|
+
const otaIdentifier = fileBuffer.indexOf(exports.UPGRADE_FILE_IDENTIFIER_BUF);
|
|
132
|
+
(0, node_assert_1.default)(otaIdentifier !== -1, "Not a valid OTA file");
|
|
133
|
+
if (sha512) {
|
|
134
|
+
const hash = node_crypto_1.default.createHash("sha512");
|
|
135
|
+
hash.update(fileBuffer);
|
|
136
|
+
(0, node_assert_1.default)(hash.digest("hex") === sha512, "File checksum validation failed");
|
|
137
|
+
}
|
|
138
|
+
return fileBuffer.subarray(otaIdentifier);
|
|
139
|
+
}
|
|
140
|
+
async function fetchFirmware(url, sha512) {
|
|
141
|
+
logger_1.logger.debug(() => `Downloading firmware image from '${url}'`, NS);
|
|
142
|
+
const firmwareFileRsp = await fetch(url);
|
|
143
|
+
if (!firmwareFileRsp.ok || !firmwareFileRsp.body) {
|
|
144
|
+
throw new Error(`Invalid response from ${url} status=${firmwareFileRsp.status}`);
|
|
145
|
+
}
|
|
146
|
+
const fileBuffer = Buffer.from(await firmwareFileRsp.arrayBuffer());
|
|
147
|
+
return validateFirmware(fileBuffer, sha512);
|
|
148
|
+
}
|
|
149
|
+
function readFirmware(filePath, sha512) {
|
|
150
|
+
logger_1.logger.debug(() => `Reading firmware image from '${filePath}'`, NS);
|
|
151
|
+
if (dataDir && !node_path_1.default.isAbsolute(filePath)) {
|
|
152
|
+
// If the file name is not a full path, then treat it as a relative to the data directory
|
|
153
|
+
filePath = node_path_1.default.join(dataDir, filePath);
|
|
154
|
+
}
|
|
155
|
+
const fileBuffer = (0, node_fs_1.readFileSync)(filePath);
|
|
156
|
+
return validateFirmware(fileBuffer, sha512);
|
|
157
|
+
}
|
|
158
|
+
async function getOtaFirmware(url, sha512) {
|
|
159
|
+
return isValidUrl(url) ? await fetchFirmware(url, sha512) : readFirmware(url, sha512);
|
|
160
|
+
}
|
|
161
|
+
async function getOtaIndexInternal(url) {
|
|
162
|
+
return isValidUrl(url) ? await getJson(url) : JSON.parse((0, node_fs_1.readFileSync)(url, "utf-8"));
|
|
163
|
+
}
|
|
164
|
+
async function getOtaIndex(source) {
|
|
165
|
+
let mainIndexUrl;
|
|
166
|
+
if (source.url) {
|
|
167
|
+
if (!isValidUrl(source.url) && !node_path_1.default.isAbsolute(source.url)) {
|
|
168
|
+
if (!dataDir) {
|
|
169
|
+
throw new Error("Invalid OTA configuration");
|
|
170
|
+
}
|
|
171
|
+
mainIndexUrl = node_path_1.default.join(dataDir, source.url);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
mainIndexUrl = source.url;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
mainIndexUrl = source.downgrade ? ZIGBEE_OTA_PREVIOUS_URL : ZIGBEE_OTA_LATEST_URL;
|
|
179
|
+
}
|
|
180
|
+
if (overrideIndexLocation) {
|
|
181
|
+
logger_1.logger.debug(`Loading override index '${overrideIndexLocation}'`, NS);
|
|
182
|
+
const localIndex = await getOtaIndexInternal(overrideIndexLocation);
|
|
183
|
+
// Resulting index will have overridden items first
|
|
184
|
+
const mappedLocalIndex = localIndex.map((meta) => {
|
|
185
|
+
// Web-hosted images must come with all fields filled already
|
|
186
|
+
// Nothing to do if needed fields were filled already
|
|
187
|
+
if (isValidUrl(meta.url) || (meta.imageType !== undefined && meta.manufacturerCode !== undefined && meta.fileVersion !== undefined)) {
|
|
188
|
+
return meta;
|
|
189
|
+
}
|
|
190
|
+
const image = parseOtaImage(readFirmware(meta.url, meta.sha512));
|
|
191
|
+
meta.imageType = image.header.imageType;
|
|
192
|
+
meta.manufacturerCode = image.header.manufacturerCode;
|
|
193
|
+
meta.fileVersion = image.header.fileVersion;
|
|
194
|
+
return meta;
|
|
195
|
+
});
|
|
196
|
+
try {
|
|
197
|
+
const mainIndex = await getOtaIndexInternal(mainIndexUrl);
|
|
198
|
+
logger_1.logger.debug("Retrieved main index", NS);
|
|
199
|
+
return mappedLocalIndex.concat(mainIndex);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
logger_1.logger.info("Failed to download main index, only override index is loaded", NS);
|
|
203
|
+
return mappedLocalIndex;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return await getOtaIndexInternal(mainIndexUrl);
|
|
207
|
+
}
|
|
208
|
+
// #endregion
|
|
209
|
+
// #region OTA Utils
|
|
210
|
+
function parseOtaHeader(buffer) {
|
|
211
|
+
const otaUpgradeFileIdentifier = buffer.readUInt32LE(0);
|
|
212
|
+
(0, node_assert_1.default)(exports.UPGRADE_FILE_IDENTIFIER === otaUpgradeFileIdentifier, "Not a valid OTA file");
|
|
213
|
+
const otaHeaderVersion = buffer.readUInt16LE(4);
|
|
214
|
+
const otaHeaderLength = buffer.readUInt16LE(6);
|
|
215
|
+
const otaHeaderFieldControl = buffer.readUInt16LE(8);
|
|
216
|
+
const manufacturerCode = buffer.readUInt16LE(10);
|
|
217
|
+
const imageType = buffer.readUInt16LE(12);
|
|
218
|
+
const fileVersion = buffer.readUInt32LE(14);
|
|
219
|
+
const zigbeeStackVersion = buffer.readUInt16LE(18);
|
|
220
|
+
const otaHeaderString = buffer.toString("utf8", 20, 52);
|
|
221
|
+
const totalImageSize = buffer.readUInt32LE(52);
|
|
222
|
+
const header = {
|
|
223
|
+
otaUpgradeFileIdentifier,
|
|
224
|
+
otaHeaderVersion,
|
|
225
|
+
otaHeaderLength,
|
|
226
|
+
otaHeaderFieldControl,
|
|
227
|
+
manufacturerCode,
|
|
228
|
+
imageType,
|
|
229
|
+
fileVersion,
|
|
230
|
+
zigbeeStackVersion,
|
|
231
|
+
otaHeaderString,
|
|
232
|
+
totalImageSize,
|
|
233
|
+
};
|
|
234
|
+
let headerPosition = 56;
|
|
235
|
+
if (header.otaHeaderFieldControl & 1) {
|
|
236
|
+
header.securityCredentialVersion = buffer.readUInt8(headerPosition);
|
|
237
|
+
headerPosition += 1;
|
|
238
|
+
}
|
|
239
|
+
if (header.otaHeaderFieldControl & 2) {
|
|
240
|
+
header.upgradeFileDestination = buffer.subarray(headerPosition, headerPosition + 8);
|
|
241
|
+
headerPosition += 8;
|
|
242
|
+
}
|
|
243
|
+
if (header.otaHeaderFieldControl & 4) {
|
|
244
|
+
header.minimumHardwareVersion = buffer.readUInt16LE(headerPosition);
|
|
245
|
+
headerPosition += 2;
|
|
246
|
+
header.maximumHardwareVersion = buffer.readUInt16LE(headerPosition);
|
|
247
|
+
headerPosition += 2;
|
|
248
|
+
}
|
|
249
|
+
return header;
|
|
250
|
+
}
|
|
251
|
+
function parseOtaSubElement(buffer, position) {
|
|
252
|
+
const tagId = buffer.readUInt16LE(position);
|
|
253
|
+
const length = buffer.readUInt32LE(position + 2);
|
|
254
|
+
// this is fine for now, no known other uses of this tag
|
|
255
|
+
if (tagId === OtaTagId.TelinkAES) {
|
|
256
|
+
// OTA_FLAG_IMAGE_ELEM_INFO1 (1-byte) + OTA_FLAG_IMAGE_ELEM_INFO2 (1-byte)
|
|
257
|
+
// buffer.subarray(position + 6, position + 8);
|
|
258
|
+
const data = buffer.subarray(position + 8, position + 8 + length);
|
|
259
|
+
return [{ tagId, length, data }, 8];
|
|
260
|
+
}
|
|
261
|
+
const data = buffer.subarray(position + 6, position + 6 + length);
|
|
262
|
+
return [{ tagId, length, data }, 6];
|
|
263
|
+
}
|
|
264
|
+
function parseOtaImage(buffer) {
|
|
265
|
+
const header = parseOtaHeader(buffer);
|
|
266
|
+
const raw = buffer.subarray(0, header.totalImageSize);
|
|
267
|
+
let position = header.otaHeaderLength;
|
|
268
|
+
const elements = [];
|
|
269
|
+
while (position < header.totalImageSize) {
|
|
270
|
+
const [element, metaOffset] = parseOtaSubElement(buffer, position);
|
|
271
|
+
position += element.data.length + metaOffset;
|
|
272
|
+
elements.push(element);
|
|
273
|
+
}
|
|
274
|
+
(0, node_assert_1.default)(position === header.totalImageSize, "Size mismatch");
|
|
275
|
+
return { header, elements, raw };
|
|
276
|
+
}
|
|
277
|
+
function buildImageBlockPayload(image, requestPayload, pageOffset, pageSize, baseDataSize) {
|
|
278
|
+
let dataSize = baseDataSize;
|
|
279
|
+
if (requestPayload.manufacturerCode === Zcl.ManufacturerCode.INSTA_GMBH ||
|
|
280
|
+
requestPayload.manufacturerCode === Zcl.ManufacturerCode.DRESDEN_ELEKTRONIK_INGENIEURTECHNIK_GMBH) {
|
|
281
|
+
// Insta and some Dresden Elektronik devices, OTA only works for data sizes 40 and smaller (= manufacturerCode 4474 [Insta], 4405 [Dresden Elektronik]).
|
|
282
|
+
dataSize = 40;
|
|
283
|
+
}
|
|
284
|
+
if (requestPayload.manufacturerCode === Zcl.ManufacturerCode.LEGRAND_GROUP) {
|
|
285
|
+
// Legrand devices (newer firmware) require up to 64 bytes (= manufacturerCode 4129), let it drive the size
|
|
286
|
+
dataSize = requestPayload.maximumDataSize;
|
|
287
|
+
}
|
|
288
|
+
if (Number.isFinite(requestPayload.maximumDataSize)) {
|
|
289
|
+
dataSize = Math.min(dataSize, requestPayload.maximumDataSize);
|
|
290
|
+
}
|
|
291
|
+
let start = requestPayload.fileOffset + pageOffset;
|
|
292
|
+
/* v8 ignore start */
|
|
293
|
+
if (requestPayload.manufacturerCode === Zcl.ManufacturerCode.LEGRAND_GROUP &&
|
|
294
|
+
requestPayload.fileOffset === 50 &&
|
|
295
|
+
requestPayload.maximumDataSize === 12) {
|
|
296
|
+
// Hack for https://github.com/Koenkk/zigbee-OTA/issues/328 (Legrand OTA not working)
|
|
297
|
+
logger_1.logger.info("Detected Legrand firmware issue, attempting to reset the OTA stack", NS);
|
|
298
|
+
// The following vector seems to buffer overflow the device to reset the OTA stack!
|
|
299
|
+
start = 78;
|
|
300
|
+
dataSize = 64;
|
|
301
|
+
}
|
|
302
|
+
/* v8 ignore stop */
|
|
303
|
+
if (pageSize) {
|
|
304
|
+
dataSize = Math.min(dataSize, pageSize - pageOffset);
|
|
305
|
+
}
|
|
306
|
+
let end = start + dataSize;
|
|
307
|
+
if (end > image.raw.length) {
|
|
308
|
+
end = image.raw.length;
|
|
309
|
+
}
|
|
310
|
+
logger_1.logger.debug(() => `Request offsets: fileOffset=${requestPayload.fileOffset} pageOffset=${pageOffset} maximumDataSize=${requestPayload.maximumDataSize}`, NS);
|
|
311
|
+
logger_1.logger.debug(() => `Payload offsets: start=${start} end=${end} dataSize=${dataSize}`, NS);
|
|
312
|
+
return {
|
|
313
|
+
status: Zcl.Status.SUCCESS,
|
|
314
|
+
manufacturerCode: requestPayload.manufacturerCode,
|
|
315
|
+
imageType: requestPayload.imageType,
|
|
316
|
+
fileVersion: requestPayload.fileVersion,
|
|
317
|
+
fileOffset: start,
|
|
318
|
+
dataSize: end - start,
|
|
319
|
+
data: image.raw.subarray(start, end),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
class OtaSession {
|
|
323
|
+
ieeeAddr;
|
|
324
|
+
endpoint;
|
|
325
|
+
image;
|
|
326
|
+
onProgress;
|
|
327
|
+
dataSettings;
|
|
328
|
+
waitForOtaCommand;
|
|
329
|
+
#lastBlockResponseTime = 0;
|
|
330
|
+
#lastProgressUpdate = 0;
|
|
331
|
+
#startTime;
|
|
332
|
+
get startTime() {
|
|
333
|
+
return this.#startTime;
|
|
334
|
+
}
|
|
335
|
+
constructor(ieeeAddr, endpoint, image, onProgress, dataSettings, waitForOtaCommand) {
|
|
336
|
+
this.ieeeAddr = ieeeAddr;
|
|
337
|
+
this.endpoint = endpoint;
|
|
338
|
+
this.image = image;
|
|
339
|
+
this.onProgress = onProgress;
|
|
340
|
+
this.dataSettings = dataSettings;
|
|
341
|
+
this.waitForOtaCommand = waitForOtaCommand;
|
|
342
|
+
this.#startTime = node_perf_hooks_1.performance.now();
|
|
343
|
+
// TODO: should `dataSettings.requestTimeout` be override if >0?
|
|
344
|
+
// to allow easier testing when devices misbehave otherwise potentially overridden by below switch
|
|
345
|
+
// if (!this.dataSettings.requestTimeout) {
|
|
346
|
+
switch (image.header.manufacturerCode) {
|
|
347
|
+
case Zcl.ManufacturerCode.ROBERT_BOSCH_GMBH: {
|
|
348
|
+
// Bosch transmits the firmware updates in the background in their native implementation.
|
|
349
|
+
// According to the app, this can take up to 2 days. Therefore, we assume to get at least
|
|
350
|
+
// one package request per hour from the device here.
|
|
351
|
+
this.dataSettings.requestTimeout = 60 * 60 * 1000;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
case Zcl.ManufacturerCode.LEGRAND_GROUP: {
|
|
355
|
+
// Increase the timeout for Legrand devices, so that they will re-initiate and update themselves
|
|
356
|
+
// Newer firmwares have awkward behaviours when it comes to the handling of the last bytes of OTA updates
|
|
357
|
+
this.dataSettings.requestTimeout = 30 * 60 * 1000;
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
case Zcl.ManufacturerCode.SHENZHEN_COOLKIT_TECHNOLOGY_CO_LTD: {
|
|
361
|
+
if (image.header.imageType === 8199) {
|
|
362
|
+
// increase the upgradeEndReq wait time to solve the problem of OTA timeout failure of Sonoff Devices
|
|
363
|
+
// (https://github.com/Koenkk/zigbee-herdsman-converters/issues/6657)
|
|
364
|
+
this.dataSettings.requestTimeout = 3600000;
|
|
365
|
+
}
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// }
|
|
370
|
+
if (!this.dataSettings.requestTimeout) {
|
|
371
|
+
this.dataSettings.requestTimeout = 150000; // ensures never zero
|
|
372
|
+
}
|
|
373
|
+
if (!this.dataSettings.baseSize) {
|
|
374
|
+
this.dataSettings.baseSize = 50; // ensures never zero
|
|
375
|
+
}
|
|
376
|
+
// report initial progress with estimated time
|
|
377
|
+
const expectedBlocks = Math.ceil(image.header.totalImageSize / dataSettings.baseSize);
|
|
378
|
+
const blocksPerSec = dataSettings.responseDelay > 0 ? Math.round((1000 / dataSettings.responseDelay) * 100) / 100 : 20; // (1000 / 50)
|
|
379
|
+
const estimatedRemainingSeconds = expectedBlocks / blocksPerSec;
|
|
380
|
+
onProgress(0, estimatedRemainingSeconds);
|
|
381
|
+
logger_1.logger.info(() => `OTA update of '${this.ieeeAddr}' estimated at ${estimatedRemainingSeconds} seconds (${expectedBlocks} chunks, ${blocksPerSec} per second)`, NS);
|
|
382
|
+
}
|
|
383
|
+
async run() {
|
|
384
|
+
// can take a long time, use max (int32 - 1), ~24 days
|
|
385
|
+
const upgradeEndRequest = this.waitForOtaCommand(this.endpoint.ID, UPGRADE_END_REQUEST_ID, undefined, 2147483647);
|
|
386
|
+
try {
|
|
387
|
+
for await (const request of this.commandStream(upgradeEndRequest)) {
|
|
388
|
+
if (request.command.ID === UPGRADE_END_REQUEST_ID) {
|
|
389
|
+
return request;
|
|
390
|
+
}
|
|
391
|
+
if (request.command.ID === IMAGE_PAGE_REQUEST_ID) {
|
|
392
|
+
const pagePayload = request.payload;
|
|
393
|
+
let pageOffset = 0;
|
|
394
|
+
while (pageOffset < pagePayload.pageSize) {
|
|
395
|
+
pageOffset = await this.sendImageBlockResponse(pagePayload, request.header.transactionSequenceNumber, pageOffset, pagePayload.pageSize);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
await this.sendImageBlockResponse(request.payload, request.header.transactionSequenceNumber, 0, 0);
|
|
400
|
+
}
|
|
401
|
+
/* v8 ignore start */
|
|
402
|
+
}
|
|
403
|
+
// this code is logically unreachable
|
|
404
|
+
// the generator always yields `UPGRADE_END_REQUEST_ID` before completing or it will eventually throw a timeout
|
|
405
|
+
// but TypeScript can't detect this and requires a return statement
|
|
406
|
+
const endPayload = await upgradeEndRequest.promise;
|
|
407
|
+
return endPayload;
|
|
408
|
+
/* v8 ignore stop */
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
upgradeEndRequest.cancel();
|
|
412
|
+
const err = error;
|
|
413
|
+
err.message = `Device ${this.ieeeAddr} did not start/finish firmware download after being notified. (${err.message})`;
|
|
414
|
+
throw err;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
async *commandStream(upgradeEndRequest) {
|
|
418
|
+
while (true) {
|
|
419
|
+
const imageBlockRequest = this.waitForOtaCommand(this.endpoint.ID, IMAGE_BLOCK_REQUEST_ID, undefined, this.dataSettings.requestTimeout);
|
|
420
|
+
const imagePageRequest = this.waitForOtaCommand(this.endpoint.ID, IMAGE_PAGE_REQUEST_ID, undefined, this.dataSettings.requestTimeout);
|
|
421
|
+
const dataRequest = Promise.race([imageBlockRequest.promise, imagePageRequest.promise]);
|
|
422
|
+
const request = await Promise.race([dataRequest, upgradeEndRequest.promise]);
|
|
423
|
+
imageBlockRequest.cancel();
|
|
424
|
+
imagePageRequest.cancel();
|
|
425
|
+
// if this is `UPGRADE_END_REQUEST_ID`, `run()` will return and thus terminate the generator (no endless loop possible)
|
|
426
|
+
yield request;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
async sendImageBlockResponse(requestPayload, requestTsn, pageOffset, pageSize) {
|
|
430
|
+
// throttle if needed
|
|
431
|
+
let callNow = node_perf_hooks_1.performance.now();
|
|
432
|
+
const timeSinceLast = callNow - this.#lastBlockResponseTime;
|
|
433
|
+
const delayNeeded = this.dataSettings.responseDelay - timeSinceLast;
|
|
434
|
+
if (delayNeeded > 0) {
|
|
435
|
+
await new Promise((resolve) => setTimeout(resolve, delayNeeded));
|
|
436
|
+
// avoids a second call to `performance.now()`
|
|
437
|
+
callNow += delayNeeded;
|
|
438
|
+
}
|
|
439
|
+
this.#lastBlockResponseTime = callNow;
|
|
440
|
+
try {
|
|
441
|
+
const blockPayload = buildImageBlockPayload(this.image, requestPayload, pageOffset, pageSize, this.dataSettings.baseSize);
|
|
442
|
+
await this.endpoint.commandResponse("genOta", "imageBlockResponse", blockPayload, undefined, requestTsn);
|
|
443
|
+
const nextOffset = pageOffset + blockPayload.dataSize;
|
|
444
|
+
const now = node_perf_hooks_1.performance.now();
|
|
445
|
+
if (now - this.#lastProgressUpdate > 30000) {
|
|
446
|
+
const totalDurationSeconds = (now - this.#startTime) / 1000;
|
|
447
|
+
const bytesPerSecond = requestPayload.fileOffset / totalDurationSeconds;
|
|
448
|
+
// first 30 seconds will be ignored due to first fileOffset being 0
|
|
449
|
+
// remain on ctor progress estimate until then (more reliable)
|
|
450
|
+
if (bytesPerSecond > 0) {
|
|
451
|
+
const percentage = Math.round((requestPayload.fileOffset / this.image.header.totalImageSize) * 10000) / 100;
|
|
452
|
+
const remainingSeconds = Math.round((this.image.header.totalImageSize - requestPayload.fileOffset) / bytesPerSecond);
|
|
453
|
+
logger_1.logger.info(() => `OTA update of '${this.ieeeAddr}' at ${percentage}%, ${remainingSeconds} seconds remaining`, NS);
|
|
454
|
+
this.onProgress(percentage, remainingSeconds);
|
|
455
|
+
}
|
|
456
|
+
this.#lastProgressUpdate = now;
|
|
457
|
+
}
|
|
458
|
+
return nextOffset;
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
logger_1.logger.debug(() => `Image block response failed for ${this.ieeeAddr}: ${error.message}`, NS);
|
|
462
|
+
return pageOffset;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
exports.OtaSession = OtaSession;
|
|
467
|
+
//# sourceMappingURL=ota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ota.js","sourceRoot":"","sources":["../../../src/controller/helpers/ota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/controller/helpers/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAG1C,qBAAa,OAAO,CAAC,IAAI,GAAG,GAAG;IAC3B,MAAM,CAAC,iBAAiB,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAwBnD;IAEF,OAAO,CAAC,IAAI,CAAsB;IAClC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,SAAS,CAAQ;gBAGrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACzB,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,UAAU,EACvB,SAAS,CAAC,EAAE,KAAK,EACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,EAC/B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAWnC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAOxC,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAKlF,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAO3B,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI;IAOpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU9B;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestQueue.d.ts","sourceRoot":"","sources":["../../../src/controller/helpers/requestQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAMrC,qBAAa,YAAa,SAAQ,GAAG,CAAC,OAAO,CAAC;IAC1C,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,QAAQ,EAAE,QAAQ;IAOjB,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCzC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;CAqD3C;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zclFrameConverter.d.ts","sourceRoot":"","sources":["../../../src/controller/helpers/zclFrameConverter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,KAAK,EAAU,cAAc,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,EAAC,2BAA2B,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAiB3E,iBAAS,iBAAiB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM,SAAS,cAAc,GAAG,SAAS,GAAG,SAAS,EACxG,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,oBAAoB,EAAE,MAAM,GAAG,SAAS,EACxC,cAAc,EAAE,cAAc,GAC/B,2BAA2B,CAAC,EAAE,EAAE,MAAM,CAAC,CAsBzC;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAYzI;AAED,OAAO,EAAC,iBAAiB,EAAE,aAAa,EAAC,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.attributeKeyValue = attributeKeyValue;
|
|
37
|
+
exports.attributeList = attributeList;
|
|
38
|
+
const logger_1 = require("../../utils/logger");
|
|
39
|
+
const Zcl = __importStar(require("../../zspec/zcl"));
|
|
40
|
+
const NS = "zh:controller:zcl";
|
|
41
|
+
// Legrand devices (e.g. 4129) fail to set the manufacturerSpecific flag and
|
|
42
|
+
// manufacturerCode in the frame header, despite using specific attributes.
|
|
43
|
+
// This leads to incorrect reported attribute names.
|
|
44
|
+
// Remap the attributes using the target device's manufacturer ID
|
|
45
|
+
// if the header is lacking the information.
|
|
46
|
+
function getCluster(frame, deviceManufacturerID, customClusters) {
|
|
47
|
+
let cluster = frame.cluster;
|
|
48
|
+
if (!frame?.header?.manufacturerCode && frame?.cluster && deviceManufacturerID === Zcl.ManufacturerCode.LEGRAND_GROUP) {
|
|
49
|
+
cluster = Zcl.Utils.getCluster(frame.cluster.ID, deviceManufacturerID, customClusters);
|
|
50
|
+
}
|
|
51
|
+
return cluster;
|
|
52
|
+
}
|
|
53
|
+
function attributeKeyValue(frame, deviceManufacturerID, customClusters) {
|
|
54
|
+
const payload = {};
|
|
55
|
+
const cluster = getCluster(frame, deviceManufacturerID, customClusters);
|
|
56
|
+
// TODO: remove this type once Zcl.Frame is typed
|
|
57
|
+
for (const item of frame.payload) {
|
|
58
|
+
const attribute = cluster.getAttribute(item.attrId);
|
|
59
|
+
if (attribute) {
|
|
60
|
+
try {
|
|
61
|
+
const attrData = Zcl.Utils.processAttributePostRead(attribute, item.attrData);
|
|
62
|
+
payload[attribute.name] = attrData;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger_1.logger.debug(`Ignoring attribute ${attribute.name} from response: ${error}`, NS);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
payload[item.attrId] = item.attrData;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return payload;
|
|
73
|
+
}
|
|
74
|
+
function attributeList(frame, deviceManufacturerID, customClusters) {
|
|
75
|
+
const payload = [];
|
|
76
|
+
const cluster = getCluster(frame, deviceManufacturerID, customClusters);
|
|
77
|
+
// TODO: remove this type once Zcl.Frame is typed
|
|
78
|
+
for (const item of frame.payload) {
|
|
79
|
+
const attribute = cluster.getAttribute(item.attrId);
|
|
80
|
+
payload.push(attribute?.name ?? item.attrId);
|
|
81
|
+
}
|
|
82
|
+
return payload;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=zclFrameConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zclFrameConverter.js","sourceRoot":"","sources":["../../../src/controller/helpers/zclFrameConverter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DQ,8CAAiB;AAAE,sCAAa;AA/DxC,+CAA0C;AAC1C,qDAAuC;AAKvC,MAAM,EAAE,GAAG,mBAAmB,CAAC;AAE/B,4EAA4E;AAC5E,2EAA2E;AAC3E,oDAAoD;AACpD,iEAAiE;AACjE,4CAA4C;AAC5C,SAAS,UAAU,CAAC,KAAgB,EAAE,oBAAwC,EAAE,cAA8B;IAC1G,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,IAAI,KAAK,EAAE,OAAO,IAAI,oBAAoB,KAAK,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;QACpH,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAgB,EAChB,oBAAwC,EACxC,cAA8B;IAE9B,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAExE,iDAAiD;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAsD,EAAE,CAAC;QAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE9E,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,eAAM,CAAC,KAAK,CAAC,sBAAsB,SAAS,CAAC,IAAI,mBAAmB,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,CAAC;IACL,CAAC;IAED,OAAO,OAAkD,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB,EAAE,oBAAwC,EAAE,cAA8B;IAC7G,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAExE,iDAAiD;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAA8B,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpD,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controller/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC;;GAEG;AACH,OAAO,EAAC,UAAU,EAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/controller/model/device.ts"],"names":[],"mappings":"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"}
|