@willieee802/zigbee-herdsman 0.49.3 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/.github/dependabot.yml +0 -3
  2. package/.github/workflows/ci.yml +1 -2
  3. package/.github/workflows/release-please.yml +1 -1
  4. package/.github/workflows/typedoc.yaml +3 -3
  5. package/.release-please-manifest.json +1 -1
  6. package/CHANGELOG.md +143 -0
  7. package/biome.json +1 -1
  8. package/dist/adapter/adapter.d.ts +14 -1
  9. package/dist/adapter/adapter.d.ts.map +1 -1
  10. package/dist/adapter/adapter.js +17 -0
  11. package/dist/adapter/adapter.js.map +1 -1
  12. package/dist/adapter/adapterDiscovery.d.ts.map +1 -1
  13. package/dist/adapter/adapterDiscovery.js.map +1 -1
  14. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +1 -3
  15. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  16. package/dist/adapter/deconz/adapter/deconzAdapter.js +14 -29
  17. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  18. package/dist/adapter/deconz/driver/constants.d.ts +1 -1
  19. package/dist/adapter/deconz/driver/constants.d.ts.map +1 -1
  20. package/dist/adapter/ember/adapter/emberAdapter.d.ts +1 -1
  21. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  22. package/dist/adapter/ember/adapter/emberAdapter.js +19 -10
  23. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  24. package/dist/adapter/ember/adapter/oneWaitress.d.ts +2 -0
  25. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  26. package/dist/adapter/ember/adapter/oneWaitress.js +13 -5
  27. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  28. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +1 -3
  29. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  30. package/dist/adapter/ezsp/adapter/ezspAdapter.js +17 -30
  31. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  32. package/dist/adapter/ezsp/driver/index.d.ts +1 -1
  33. package/dist/adapter/ezsp/driver/index.d.ts.map +1 -1
  34. package/dist/adapter/ezsp/driver/index.js +1 -1
  35. package/dist/adapter/ezsp/driver/index.js.map +1 -1
  36. package/dist/adapter/ezsp/driver/types/index.d.ts +1 -1
  37. package/dist/adapter/ezsp/driver/types/index.d.ts.map +1 -1
  38. package/dist/adapter/ezsp/driver/types/index.js +3 -3
  39. package/dist/adapter/ezsp/driver/types/index.js.map +1 -1
  40. package/dist/adapter/serialPort.d.ts.map +1 -1
  41. package/dist/adapter/serialPort.js +7 -0
  42. package/dist/adapter/serialPort.js.map +1 -1
  43. package/dist/adapter/z-stack/adapter/adapter-backup.js +1 -1
  44. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  45. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +1 -1
  46. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +1 -1
  47. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  48. package/dist/adapter/z-stack/adapter/manager.js +12 -2
  49. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  50. package/dist/adapter/z-stack/adapter/tstype.d.ts.map +1 -1
  51. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +1 -3
  52. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  53. package/dist/adapter/z-stack/adapter/zStackAdapter.js +20 -34
  54. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  55. package/dist/adapter/z-stack/constants/index.d.ts +1 -1
  56. package/dist/adapter/z-stack/constants/index.d.ts.map +1 -1
  57. package/dist/adapter/z-stack/constants/index.js +1 -1
  58. package/dist/adapter/z-stack/constants/index.js.map +1 -1
  59. package/dist/adapter/z-stack/unpi/constants.d.ts +1 -1
  60. package/dist/adapter/z-stack/unpi/constants.d.ts.map +1 -1
  61. package/dist/adapter/z-stack/unpi/constants.js +1 -1
  62. package/dist/adapter/z-stack/unpi/constants.js.map +1 -1
  63. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +7 -8
  64. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -1
  65. package/dist/adapter/zboss/adapter/zbossAdapter.js +12 -30
  66. package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -1
  67. package/dist/adapter/zboss/driver.d.ts.map +1 -1
  68. package/dist/adapter/zboss/driver.js +8 -1
  69. package/dist/adapter/zboss/driver.js.map +1 -1
  70. package/dist/adapter/zboss/uart.d.ts.map +1 -1
  71. package/dist/adapter/zboss/uart.js +14 -2
  72. package/dist/adapter/zboss/uart.js.map +1 -1
  73. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +1 -3
  74. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  75. package/dist/adapter/zigate/adapter/zigateAdapter.js +8 -29
  76. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  77. package/dist/adapter/zoh/adapter/zohAdapter.d.ts +1 -3
  78. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -1
  79. package/dist/adapter/zoh/adapter/zohAdapter.js +18 -33
  80. package/dist/adapter/zoh/adapter/zohAdapter.js.map +1 -1
  81. package/dist/controller/controller.d.ts.map +1 -1
  82. package/dist/controller/controller.js +10 -2
  83. package/dist/controller/controller.js.map +1 -1
  84. package/dist/controller/greenPower.d.ts.map +1 -1
  85. package/dist/controller/greenPower.js +15 -9
  86. package/dist/controller/greenPower.js.map +1 -1
  87. package/dist/controller/helpers/ota.d.ts +4 -4
  88. package/dist/controller/helpers/ota.d.ts.map +1 -1
  89. package/dist/controller/helpers/ota.js +28 -9
  90. package/dist/controller/helpers/ota.js.map +1 -1
  91. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  92. package/dist/controller/helpers/zclFrameConverter.js +17 -16
  93. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  94. package/dist/controller/model/device.d.ts +14 -4
  95. package/dist/controller/model/device.d.ts.map +1 -1
  96. package/dist/controller/model/device.js +167 -85
  97. package/dist/controller/model/device.js.map +1 -1
  98. package/dist/controller/model/endpoint.d.ts +7 -3
  99. package/dist/controller/model/endpoint.d.ts.map +1 -1
  100. package/dist/controller/model/endpoint.js +34 -21
  101. package/dist/controller/model/endpoint.js.map +1 -1
  102. package/dist/controller/model/group.d.ts +0 -1
  103. package/dist/controller/model/group.d.ts.map +1 -1
  104. package/dist/controller/model/group.js +14 -19
  105. package/dist/controller/model/group.js.map +1 -1
  106. package/dist/controller/touchlink.js +3 -3
  107. package/dist/controller/touchlink.js.map +1 -1
  108. package/dist/utils/timeService.js +2 -2
  109. package/dist/utils/timeService.js.map +1 -1
  110. package/dist/zspec/zcl/buffaloZcl.d.ts +3 -3
  111. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  112. package/dist/zspec/zcl/buffaloZcl.js +198 -96
  113. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  114. package/dist/zspec/zcl/definition/cluster.d.ts +2 -2
  115. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  116. package/dist/zspec/zcl/definition/cluster.js +2699 -2808
  117. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  118. package/dist/zspec/zcl/definition/clusters-types.d.ts +63 -1109
  119. package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -1
  120. package/dist/zspec/zcl/definition/enums.d.ts +0 -1
  121. package/dist/zspec/zcl/definition/enums.d.ts.map +1 -1
  122. package/dist/zspec/zcl/definition/enums.js +0 -1
  123. package/dist/zspec/zcl/definition/enums.js.map +1 -1
  124. package/dist/zspec/zcl/definition/foundation.d.ts +306 -7
  125. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  126. package/dist/zspec/zcl/definition/foundation.js +552 -207
  127. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  128. package/dist/zspec/zcl/definition/status.d.ts +21 -10
  129. package/dist/zspec/zcl/definition/status.d.ts.map +1 -1
  130. package/dist/zspec/zcl/definition/status.js +11 -0
  131. package/dist/zspec/zcl/definition/status.js.map +1 -1
  132. package/dist/zspec/zcl/definition/tstype.d.ts +57 -48
  133. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  134. package/dist/zspec/zcl/utils.d.ts +7 -4
  135. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  136. package/dist/zspec/zcl/utils.js +133 -240
  137. package/dist/zspec/zcl/utils.js.map +1 -1
  138. package/dist/zspec/zcl/zclFrame.d.ts +4 -4
  139. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  140. package/dist/zspec/zcl/zclFrame.js +19 -103
  141. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  142. package/dist/zspec/zcl/zclStatusError.d.ts +1 -1
  143. package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -1
  144. package/dist/zspec/zcl/zclStatusError.js +2 -2
  145. package/dist/zspec/zcl/zclStatusError.js.map +1 -1
  146. package/package.json +1 -1
  147. package/scripts/clusters-typegen.ts +44 -139
  148. package/src/adapter/adapter.ts +38 -3
  149. package/src/adapter/adapterDiscovery.ts +2 -1
  150. package/src/adapter/deconz/adapter/deconzAdapter.ts +24 -51
  151. package/src/adapter/deconz/driver/constants.ts +1 -1
  152. package/src/adapter/ember/adapter/emberAdapter.ts +23 -10
  153. package/src/adapter/ember/adapter/oneWaitress.ts +16 -6
  154. package/src/adapter/ezsp/adapter/ezspAdapter.ts +27 -48
  155. package/src/adapter/ezsp/driver/index.ts +1 -1
  156. package/src/adapter/ezsp/driver/types/index.ts +99 -99
  157. package/src/adapter/serialPort.ts +9 -0
  158. package/src/adapter/z-stack/adapter/adapter-backup.ts +1 -1
  159. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +1 -1
  160. package/src/adapter/z-stack/adapter/manager.ts +16 -2
  161. package/src/adapter/z-stack/adapter/tstype.ts +1 -0
  162. package/src/adapter/z-stack/adapter/zStackAdapter.ts +34 -81
  163. package/src/adapter/z-stack/constants/index.ts +1 -1
  164. package/src/adapter/z-stack/unpi/constants.ts +1 -1
  165. package/src/adapter/zboss/adapter/zbossAdapter.ts +23 -54
  166. package/src/adapter/zboss/driver.ts +8 -1
  167. package/src/adapter/zboss/uart.ts +14 -1
  168. package/src/adapter/zigate/adapter/zigateAdapter.ts +17 -48
  169. package/src/adapter/zoh/adapter/zohAdapter.ts +27 -50
  170. package/src/controller/controller.ts +12 -2
  171. package/src/controller/greenPower.ts +16 -9
  172. package/src/controller/helpers/ota.ts +37 -11
  173. package/src/controller/helpers/zclFrameConverter.ts +20 -17
  174. package/src/controller/model/device.ts +204 -97
  175. package/src/controller/model/endpoint.ts +36 -24
  176. package/src/controller/model/group.ts +14 -20
  177. package/src/controller/touchlink.ts +3 -3
  178. package/src/utils/timeService.ts +2 -2
  179. package/src/zspec/zcl/buffaloZcl.ts +226 -100
  180. package/src/zspec/zcl/definition/cluster.ts +2713 -2822
  181. package/src/zspec/zcl/definition/clusters-types.ts +80 -1135
  182. package/src/zspec/zcl/definition/enums.ts +0 -1
  183. package/src/zspec/zcl/definition/foundation.ts +703 -216
  184. package/src/zspec/zcl/definition/status.ts +22 -11
  185. package/src/zspec/zcl/definition/tstype.ts +59 -58
  186. package/src/zspec/zcl/utils.ts +137 -264
  187. package/src/zspec/zcl/zclFrame.ts +25 -130
  188. package/src/zspec/zcl/zclStatusError.ts +2 -2
  189. package/test/adapter/ember/emberAdapter.test.ts +191 -4
  190. package/test/adapter/ezsp/uart.test.ts +10 -10
  191. package/test/adapter/z-stack/adapter.test.ts +88 -32
  192. package/test/adapter/zoh/zohAdapter.test.ts +4 -4
  193. package/test/controller.test.ts +822 -248
  194. package/test/device-ota.test.ts +141 -16
  195. package/test/device.test.ts +731 -0
  196. package/test/requests.bench.ts +2 -0
  197. package/test/zcl.test.ts +70 -95
  198. package/test/zspec/zcl/buffalo.test.ts +251 -11
  199. package/test/zspec/zcl/foundation.test.ts +990 -0
  200. package/test/zspec/zcl/frame.test.ts +84 -69
  201. package/test/zspec/zcl/utils.test.ts +105 -81
  202. package/tsconfig.json +0 -1
  203. package/scripts/check-clusters-changes.ts +0 -328
  204. package/scripts/clusters-changes.log +0 -584
  205. package/scripts/utils.ts +0 -88
  206. package/scripts/zap-update-clusters-report.json +0 -303
  207. package/scripts/zap-update-clusters.ts +0 -1520
  208. package/scripts/zap-update-types.ts +0 -707
  209. package/scripts/zap-xml-clusters-overrides-data.ts +0 -52
  210. package/scripts/zap-xml-clusters-overrides.ts +0 -400
  211. package/scripts/zap-xml-types.ts +0 -146
@@ -922,6 +922,10 @@ const commissioned3x0AlignedRequestMock = empty3x0AlignedRequestMock
922
922
  )
923
923
  .nvExtended(NvSystemIds.ZSTACK, NvItemsIds.ZCD_NV_EX_ADDRMGR, 0, Buffer.from("01ff4f3a0800000000000000", "hex"));
924
924
 
925
+ const commissioned3x0AlignedPrecfgKeyMismatchRequestMock = commissioned3x0AlignedRequestMock
926
+ .clone()
927
+ .nv(NvItemsIds.PRECFGKEY, Buffer.from("aabbccddeeff00112233445566778899", "hex"));
928
+
925
929
  const empty12UnalignedRequestMock = baseZnpRequestMock
926
930
  .clone()
927
931
  .handle(Subsystem.SYS, "version", (payload) => (equals(payload, {}) ? {payload: {product: ZnpVersion.ZStack12}} : undefined))
@@ -1971,6 +1975,18 @@ describe("zstack-adapter", () => {
1971
1975
  expect(mockLogger.warning.mock.calls[0][0]).toBe("Extended PAN ID is reversed (expected=00124b0009d69f77, actual=779fd609004b1200)");
1972
1976
  });
1973
1977
 
1978
+ it("should start with 3.x.0 adapter - warn when preconfigured key doesn't match network key", async () => {
1979
+ // https://github.com/Koenkk/zigbee-herdsman/pull/1692
1980
+ mockZnpRequestWith(commissioned3x0AlignedPrecfgKeyMismatchRequestMock);
1981
+ const result = await adapter.start();
1982
+ expect(result).toBe("resumed");
1983
+ expect(mockLogger.warning.mock.calls[0][0]).toBe(
1984
+ "Adapter preconfigured (transport) key does not match configured network key " +
1985
+ "(preconfigured=aabbccddeeff00112233445566778899, configured=01030507090b0d0f00020406080a0c0d). " +
1986
+ "This is typically harmless on Z-Stack 3.x adapters where only the active key matters.",
1987
+ );
1988
+ });
1989
+
1974
1990
  it("should restore unified backup with 3.0.x adapter - commissioned, mismatched adapter-config, matching config-backup", async () => {
1975
1991
  const backupFile = getTempFile();
1976
1992
  fs.writeFileSync(backupFile, JSON.stringify(backupMatchingConfig), "utf8");
@@ -2305,6 +2321,34 @@ describe("zstack-adapter", () => {
2305
2321
  );
2306
2322
  });
2307
2323
 
2324
+ it("Send zcl frame with APS encryption", async () => {
2325
+ basicMocks();
2326
+ await adapter.start();
2327
+
2328
+ mockZnpRequest.mockClear();
2329
+ mockQueueExecute.mockClear();
2330
+ const frame = Zcl.Frame.create(
2331
+ Zcl.FrameType.GLOBAL,
2332
+ Zcl.Direction.CLIENT_TO_SERVER,
2333
+ true,
2334
+ undefined,
2335
+ 3,
2336
+ "read",
2337
+ "zigbeeDirectConfiguration",
2338
+ [{attrId: 0}],
2339
+ {},
2340
+ );
2341
+ await adapter.sendZclFrameToEndpoint("0x1122334455667788", 1234, 232, frame, 10000, true, false);
2342
+ expect(mockQueueExecute.mock.calls[0][1]).toBe(1234);
2343
+ expect(mockZnpRequest).toHaveBeenCalledTimes(1);
2344
+ expect(mockZnpRequest).toHaveBeenCalledWith(
2345
+ 4,
2346
+ "dataRequest",
2347
+ {clusterid: 61, data: frame.toBuffer(), destendpoint: 232, dstaddr: 1234, len: 5, options: 64, radius: 30, srcendpoint: 1, transid: 1},
2348
+ 99,
2349
+ );
2350
+ });
2351
+
2308
2352
  it("Send zcl frame network address retry on MAC channel access failure", async () => {
2309
2353
  basicMocks();
2310
2354
  dataConfirmCode = 225;
@@ -3062,7 +3106,7 @@ describe("zstack-adapter", () => {
3062
3106
  expect(error.message).toStrictEqual("Data request failed with error: 'APS_DUPLICATE_ENTRY' (0xb8)");
3063
3107
  });
3064
3108
 
3065
- it("Send zcl frame network address and default response", async () => {
3109
+ it("Send zcl frame network address matches by tsn", async () => {
3066
3110
  basicMocks();
3067
3111
  await adapter.start();
3068
3112
 
@@ -3129,7 +3173,7 @@ describe("zstack-adapter", () => {
3129
3173
  expect(result.data).toStrictEqual(Buffer.from([24, 100, 1, 0, 0, 0, 32, 2]));
3130
3174
  });
3131
3175
 
3132
- it("Send zcl frame network address and default response", async () => {
3176
+ it("Send zcl frame network address matches on default response", async () => {
3133
3177
  basicMocks();
3134
3178
  await adapter.start();
3135
3179
 
@@ -3147,26 +3191,18 @@ describe("zstack-adapter", () => {
3147
3191
  [{attrId: 0, attrData: 5, dataType: 32, status: 0}],
3148
3192
  {},
3149
3193
  );
3150
- const responseFrame = Zcl.Frame.create(
3194
+ const defaultResponse = Zcl.Frame.create(
3151
3195
  Zcl.FrameType.GLOBAL,
3152
3196
  Zcl.Direction.SERVER_TO_CLIENT,
3153
3197
  true,
3154
3198
  undefined,
3155
3199
  100,
3156
- "readRsp",
3200
+ "defaultRsp",
3157
3201
  0,
3158
- [{attrId: 0, attrData: 2, dataType: 32, status: 0}],
3202
+ {cmdId: 0, statusCode: Zcl.Status.NOT_AUTHORIZED},
3159
3203
  {},
3160
3204
  );
3161
3205
  const frame = Zcl.Frame.create(Zcl.FrameType.GLOBAL, Zcl.Direction.CLIENT_TO_SERVER, false, undefined, 100, "read", 0, [{attrId: 0}], {});
3162
- const object = mockZpiObject(Type.AREQ, Subsystem.AF, "incomingMsg", {
3163
- clusterid: 0,
3164
- srcendpoint: 20,
3165
- srcaddr: 2,
3166
- linkquality: 101,
3167
- groupid: 12,
3168
- data: responseFrame.toBuffer(),
3169
- });
3170
3206
  const objectMismatch = mockZpiObject(Type.AREQ, Subsystem.AF, "incomingMsg", {
3171
3207
  clusterid: 0,
3172
3208
  srcendpoint: 20,
@@ -3175,29 +3211,17 @@ describe("zstack-adapter", () => {
3175
3211
  groupid: 12,
3176
3212
  data: responseMismatchFrame.toBuffer(),
3177
3213
  });
3178
- const defaultReponse = Zcl.Frame.create(
3179
- Zcl.FrameType.GLOBAL,
3180
- Zcl.Direction.SERVER_TO_CLIENT,
3181
- true,
3182
- undefined,
3183
- 100,
3184
- "defaultRsp",
3185
- 0,
3186
- {cmdId: 0, status: 0},
3187
- {},
3188
- );
3189
3214
  const defaultObject = mockZpiObject(Type.AREQ, Subsystem.AF, "incomingMsg", {
3190
3215
  clusterid: 0,
3191
3216
  srcendpoint: 20,
3192
3217
  srcaddr: 2,
3193
3218
  linkquality: 101,
3194
3219
  groupid: 12,
3195
- data: defaultReponse.toBuffer(),
3220
+ data: defaultResponse.toBuffer(),
3196
3221
  });
3197
3222
  const response = adapter.sendZclFrameToEndpoint("0x02", 2, 20, frame, 10000, false, false);
3198
3223
  znpReceived(objectMismatch);
3199
3224
  znpReceived(defaultObject);
3200
- znpReceived(object);
3201
3225
  const result = await response;
3202
3226
 
3203
3227
  expect(mockZnpRequest).toHaveBeenCalledWith(
@@ -3213,7 +3237,7 @@ describe("zstack-adapter", () => {
3213
3237
  expect(result.linkquality).toStrictEqual(101);
3214
3238
  expect(result.address).toStrictEqual(2);
3215
3239
  expect(result.groupID).toStrictEqual(12);
3216
- expect(result.data).toStrictEqual(Buffer.from([24, 100, 1, 0, 0, 0, 32, 2]));
3240
+ expect(result.data).toStrictEqual(Buffer.from([24, 100, 11, 0, 126]));
3217
3241
  });
3218
3242
 
3219
3243
  it("Send zcl frame network address data confirm fails with default response", async () => {
@@ -3300,7 +3324,7 @@ describe("zstack-adapter", () => {
3300
3324
  {clusterid: 0, data: frame.toBuffer(), destendpoint: 20, dstaddr: 2, len: 5, options: 0, radius: 30, srcendpoint: 1, transid: 2},
3301
3325
  99,
3302
3326
  );
3303
- expect(error).toStrictEqual(new Error("Timeout - 2 - 20 - 100 - 0 - 1 after 1ms"));
3327
+ expect(error).toStrictEqual(new Error("Timeout after 1ms [address=2 endpoint=20 clusterId=0 cmdId=1 tsn=100]"));
3304
3328
  });
3305
3329
 
3306
3330
  it("Send zcl frame network address timeout should discover route, rewrite child entry and retry for sleepy end device", async () => {
@@ -3361,7 +3385,7 @@ describe("zstack-adapter", () => {
3361
3385
  {clusterid: 0, data: frame.toBuffer(), destendpoint: 20, dstaddr: 2, len: 5, options: 0, radius: 30, srcendpoint: 1, transid: 2},
3362
3386
  99,
3363
3387
  );
3364
- expect(error).toStrictEqual(new Error("Timeout - 2 - 20 - 100 - 0 - 1 after 1ms"));
3388
+ expect(error).toStrictEqual(new Error("Timeout after 1ms [address=2 endpoint=20 clusterId=0 cmdId=1 tsn=100]"));
3365
3389
  });
3366
3390
 
3367
3391
  it("Send zcl frame network address with default response timeout shouldnt care because command has response", async () => {
@@ -3975,7 +3999,7 @@ describe("zstack-adapter", () => {
3975
3999
  expect(error).toStrictEqual(new Error("Failed to connect to the adapter (Error: Couldnt lock port)"));
3976
4000
  });
3977
4001
 
3978
- it("Wait for", async () => {
4002
+ it("Wait for resolves on cmd", async () => {
3979
4003
  basicMocks();
3980
4004
  await adapter.start();
3981
4005
 
@@ -3998,17 +4022,49 @@ describe("zstack-adapter", () => {
3998
4022
  groupid: 12,
3999
4023
  data: responseFrame.toBuffer(),
4000
4024
  });
4001
- const wait = adapter.waitFor(2, 20, 0, 1, 100, 0, 1, 10);
4025
+ const wait = adapter.waitFor(2, 20, 0, 1, 100, 0, 1, undefined, 10);
4002
4026
  znpReceived(object);
4003
4027
  const result = await wait.promise;
4004
4028
  expect(result.endpoint).toStrictEqual(20);
4005
4029
  expect(result.groupID).toStrictEqual(12);
4006
4030
  expect(result.linkquality).toStrictEqual(101);
4007
4031
  expect(result.address).toStrictEqual(2);
4008
- expect(result.groupID).toStrictEqual(12);
4009
4032
  expect(result.data).toStrictEqual(Buffer.from([24, 100, 1, 0, 0, 0, 32, 2]));
4010
4033
  });
4011
4034
 
4035
+ it("Wait for resolves on specified default response", async () => {
4036
+ basicMocks();
4037
+ await adapter.start();
4038
+
4039
+ const responseFrame = Zcl.Frame.create(
4040
+ Zcl.FrameType.GLOBAL,
4041
+ Zcl.Direction.SERVER_TO_CLIENT,
4042
+ true,
4043
+ undefined,
4044
+ 99,
4045
+ "defaultRsp",
4046
+ "genOta",
4047
+ {cmdId: 5, statusCode: Zcl.Status.MALFORMED_COMMAND},
4048
+ {},
4049
+ );
4050
+ const object = mockZpiObject(Type.AREQ, Subsystem.AF, "incomingMsg", {
4051
+ clusterid: 0x0019,
4052
+ srcendpoint: 1,
4053
+ srcaddr: 1234,
4054
+ linkquality: 101,
4055
+ groupid: 0,
4056
+ data: responseFrame.toBuffer(),
4057
+ });
4058
+ const wait = adapter.waitFor(1234, 1, Zcl.FrameType.SPECIFIC, Zcl.Direction.CLIENT_TO_SERVER, undefined, 0x0019, 3, 5, 15000);
4059
+ znpReceived(object);
4060
+ const result = await wait.promise;
4061
+ expect(result.endpoint).toStrictEqual(1);
4062
+ expect(result.groupID).toStrictEqual(0);
4063
+ expect(result.linkquality).toStrictEqual(101);
4064
+ expect(result.address).toStrictEqual(1234);
4065
+ expect(result.data).toStrictEqual(Buffer.from([24, 99, 11, 5, Zcl.Status.MALFORMED_COMMAND]));
4066
+ });
4067
+
4012
4068
  it("Command should fail when in interpan", async () => {
4013
4069
  const frame = Zcl.Frame.create(
4014
4070
  Zcl.FrameType.GLOBAL,
@@ -572,7 +572,7 @@ describe("Zigbee on Host", () => {
572
572
 
573
573
  const sendUnicastSpy = vi.spyOn(adapter.driver, "sendUnicast");
574
574
 
575
- const zclPayload = Buffer.from([16, 123, Zcl.Foundation.read.ID]);
575
+ const zclPayload = Buffer.from([16, 123, Zcl.Foundation.read.ID, 0x12, 0x34]);
576
576
  const zclFrame = Zcl.Frame.fromBuffer(Zcl.Clusters.genGroups.ID, Zcl.Header.fromBuffer(zclPayload), zclPayload, {});
577
577
 
578
578
  const p1 = adapter.sendZclFrameToEndpoint("0x00000000000004d2", 0x9876, 1, zclFrame, 10000, false, false, 2);
@@ -634,7 +634,7 @@ describe("Zigbee on Host", () => {
634
634
  await expect(p2).resolves.toStrictEqual(undefined);
635
635
  expect(sendUnicastSpy).toHaveBeenLastCalledWith(zclFrame.toBuffer(), ZSpec.HA_PROFILE_ID, Zcl.Clusters.genGroups.ID, 0x9876, undefined, 1, 1);
636
636
 
637
- const zclPayloadDefRsp = Buffer.from([0, 123, Zcl.Foundation.read.ID]);
637
+ const zclPayloadDefRsp = Buffer.from([0, 123, Zcl.Foundation.read.ID, 0x12, 0x34]);
638
638
  const zclFrameDefRsp = Zcl.Frame.fromBuffer(Zcl.Clusters.genGroups.ID, Zcl.Header.fromBuffer(zclPayloadDefRsp), zclPayloadDefRsp, {});
639
639
 
640
640
  sendUnicastSpy.mockResolvedValueOnce(3);
@@ -770,7 +770,7 @@ describe("Zigbee on Host", () => {
770
770
 
771
771
  const sendGroupcastSpy = vi.spyOn(adapter.driver, "sendGroupcast").mockResolvedValueOnce(1).mockResolvedValueOnce(1).mockResolvedValueOnce(1);
772
772
 
773
- const zclPayload = Buffer.from([0, 123, Zcl.Foundation.read.ID]);
773
+ const zclPayload = Buffer.from([0, 123, Zcl.Foundation.read.ID, 0x12, 0x34]);
774
774
  const zclFrame = Zcl.Frame.fromBuffer(Zcl.Clusters.genGroups.ID, Zcl.Header.fromBuffer(zclPayload), zclPayload, {});
775
775
 
776
776
  const p1 = adapter.sendZclFrameToGroup(123, zclFrame, 5);
@@ -791,7 +791,7 @@ describe("Zigbee on Host", () => {
791
791
 
792
792
  const sendBroadcastSpy = vi.spyOn(adapter.driver, "sendBroadcast").mockResolvedValueOnce(1).mockResolvedValueOnce(1);
793
793
 
794
- const zclPayload = Buffer.from([0, 123, Zcl.Foundation.read.ID]);
794
+ const zclPayload = Buffer.from([0, 123, Zcl.Foundation.read.ID, 0x12, 0x34]);
795
795
  const zclFrame = Zcl.Frame.fromBuffer(Zcl.Clusters.genAlarms.ID, Zcl.Header.fromBuffer(zclPayload), zclPayload, {});
796
796
 
797
797
  const p = adapter.sendZclFrameToAll(3, zclFrame, 1, 0xfffc);