@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.
Files changed (114) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +38 -0
  3. package/biome.json +1 -1
  4. package/dist/adapter/adapter.d.ts.map +1 -0
  5. package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
  6. package/dist/adapter/const.d.ts.map +1 -0
  7. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -0
  8. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -0
  9. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -0
  10. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -0
  11. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -0
  12. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -0
  13. package/dist/adapter/ember/utils/initters.d.ts.map +1 -0
  14. package/dist/adapter/events.d.ts.map +1 -0
  15. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -0
  16. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -0
  17. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -0
  18. package/dist/adapter/ezsp/driver/index.d.ts.map +1 -0
  19. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -0
  20. package/dist/adapter/index.d.ts.map +1 -0
  21. package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -0
  22. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -0
  23. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -0
  24. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -0
  25. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
  26. package/dist/adapter/zboss/driver.d.ts.map +1 -0
  27. package/dist/adapter/zboss/frame.d.ts.map +1 -0
  28. package/dist/adapter/zboss/frame.js +200 -0
  29. package/dist/adapter/zboss/frame.js.map +1 -0
  30. package/dist/adapter/zboss/uart.d.ts.map +1 -0
  31. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -0
  32. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -0
  33. package/dist/adapter/zigate/driver/buffaloZiGate.js +198 -0
  34. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -0
  35. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -0
  36. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -0
  37. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
  38. package/dist/controller/controller.d.ts.map +1 -0
  39. package/dist/controller/controller.js +874 -0
  40. package/dist/controller/controller.js.map +1 -0
  41. package/dist/controller/database.d.ts.map +1 -0
  42. package/dist/controller/events.d.ts.map +1 -0
  43. package/dist/controller/events.js +3 -0
  44. package/dist/controller/events.js.map +1 -0
  45. package/dist/controller/greenPower.d.ts.map +1 -0
  46. package/dist/controller/greenPower.js +425 -0
  47. package/dist/controller/greenPower.js.map +1 -0
  48. package/dist/controller/helpers/index.d.ts.map +1 -0
  49. package/dist/controller/helpers/ota.d.ts.map +1 -0
  50. package/dist/controller/helpers/ota.js +467 -0
  51. package/dist/controller/helpers/ota.js.map +1 -0
  52. package/dist/controller/helpers/request.d.ts.map +1 -0
  53. package/dist/controller/helpers/requestQueue.d.ts.map +1 -0
  54. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -0
  55. package/dist/controller/helpers/zclFrameConverter.js +84 -0
  56. package/dist/controller/helpers/zclFrameConverter.js.map +1 -0
  57. package/dist/controller/index.d.ts.map +1 -0
  58. package/dist/controller/model/device.d.ts.map +1 -0
  59. package/dist/controller/model/device.js +1396 -0
  60. package/dist/controller/model/device.js.map +1 -0
  61. package/dist/controller/model/endpoint.d.ts.map +1 -0
  62. package/dist/controller/model/endpoint.js +822 -0
  63. package/dist/controller/model/endpoint.js.map +1 -0
  64. package/dist/controller/model/entity.d.ts.map +1 -0
  65. package/dist/controller/model/group.d.ts.map +1 -0
  66. package/dist/controller/model/group.js +343 -0
  67. package/dist/controller/model/group.js.map +1 -0
  68. package/dist/controller/model/index.d.ts.map +1 -0
  69. package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
  70. package/dist/controller/touchlink.d.ts.map +1 -0
  71. package/dist/controller/tstype.d.ts.map +1 -0
  72. package/dist/controller/tstype.js +3 -0
  73. package/dist/controller/tstype.js.map +1 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/utils/timeService.d.ts.map +1 -0
  76. package/dist/utils/timeService.js +127 -0
  77. package/dist/utils/timeService.js.map +1 -0
  78. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
  79. package/dist/zspec/zcl/buffaloZcl.js +969 -0
  80. package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
  81. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
  82. package/dist/zspec/zcl/definition/cluster.js +7507 -0
  83. package/dist/zspec/zcl/definition/cluster.js.map +1 -0
  84. package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
  85. package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
  86. package/dist/zspec/zcl/definition/clusters-types.js +3 -0
  87. package/dist/zspec/zcl/definition/clusters-types.js.map +1 -0
  88. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
  89. package/dist/zspec/zcl/definition/foundation.js +312 -0
  90. package/dist/zspec/zcl/definition/foundation.js.map +1 -0
  91. package/dist/zspec/zcl/definition/tstype.d.ts +273 -0
  92. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
  93. package/dist/zspec/zcl/definition/tstype.js +3 -0
  94. package/dist/zspec/zcl/definition/tstype.js.map +1 -0
  95. package/dist/zspec/zcl/index.d.ts.map +1 -0
  96. package/dist/zspec/zcl/index.js +57 -0
  97. package/dist/zspec/zcl/index.js.map +1 -0
  98. package/dist/zspec/zcl/utils.d.ts.map +1 -0
  99. package/dist/zspec/zcl/utils.js +419 -0
  100. package/dist/zspec/zcl/utils.js.map +1 -0
  101. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
  102. package/dist/zspec/zcl/zclFrame.js +328 -0
  103. package/dist/zspec/zcl/zclFrame.js.map +1 -0
  104. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
  105. package/dist/zspec/zcl/zclHeader.js +88 -0
  106. package/dist/zspec/zcl/zclHeader.js.map +1 -0
  107. package/package.json +90 -83
  108. package/src/controller/helpers/ota.ts +5 -2
  109. package/src/zspec/zcl/definition/cluster.ts +3 -294
  110. package/src/zspec/zcl/definition/clusters-types.ts +6 -355
  111. package/src/zspec/zcl/definition/tstype.ts +0 -14
  112. package/src/zspec/zcl/utils.ts +14 -31
  113. package/test/controller.test.ts +16 -8
  114. 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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"}