zigbee-herdsman 6.0.1 → 6.0.3

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 (260) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/adapter/ezsp/driver/uart.js +1 -1
  3. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  4. package/dist/adapter/z-stack/adapter/zStackAdapter.js +4 -4
  5. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  6. package/dist/adapter/zigate/adapter/zigateAdapter.js +4 -4
  7. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  8. package/dist/controller/model/device.d.ts.map +1 -1
  9. package/dist/controller/model/device.js +1 -0
  10. package/dist/controller/model/device.js.map +1 -1
  11. package/package.json +14 -6
  12. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  13. package/.github/dependabot.yml +0 -22
  14. package/.github/workflows/ci.yml +0 -64
  15. package/.github/workflows/release-please.yml +0 -18
  16. package/.github/workflows/stale.yml +0 -20
  17. package/.github/workflows/typedoc.yaml +0 -47
  18. package/.release-please-manifest.json +0 -3
  19. package/.vscode/extensions.json +0 -3
  20. package/.vscode/settings.json +0 -11
  21. package/biome.json +0 -98
  22. package/examples/join-and-log.js +0 -24
  23. package/release-please-config.json +0 -9
  24. package/src/adapter/adapter.ts +0 -189
  25. package/src/adapter/adapterDiscovery.ts +0 -666
  26. package/src/adapter/const.ts +0 -12
  27. package/src/adapter/deconz/adapter/deconzAdapter.ts +0 -877
  28. package/src/adapter/deconz/driver/constants.ts +0 -246
  29. package/src/adapter/deconz/driver/driver.ts +0 -1540
  30. package/src/adapter/deconz/driver/frame.ts +0 -11
  31. package/src/adapter/deconz/driver/frameParser.ts +0 -753
  32. package/src/adapter/deconz/driver/parser.ts +0 -45
  33. package/src/adapter/deconz/driver/writer.ts +0 -22
  34. package/src/adapter/deconz/types.d.ts +0 -13
  35. package/src/adapter/ember/adapter/emberAdapter.ts +0 -2265
  36. package/src/adapter/ember/adapter/endpoints.ts +0 -86
  37. package/src/adapter/ember/adapter/oneWaitress.ts +0 -324
  38. package/src/adapter/ember/adapter/tokensManager.ts +0 -782
  39. package/src/adapter/ember/consts.ts +0 -178
  40. package/src/adapter/ember/enums.ts +0 -1746
  41. package/src/adapter/ember/ezsp/buffalo.ts +0 -1392
  42. package/src/adapter/ember/ezsp/consts.ts +0 -148
  43. package/src/adapter/ember/ezsp/enums.ts +0 -1114
  44. package/src/adapter/ember/ezsp/ezsp.ts +0 -9061
  45. package/src/adapter/ember/ezspError.ts +0 -10
  46. package/src/adapter/ember/types.ts +0 -866
  47. package/src/adapter/ember/uart/ash.ts +0 -1960
  48. package/src/adapter/ember/uart/consts.ts +0 -109
  49. package/src/adapter/ember/uart/enums.ts +0 -192
  50. package/src/adapter/ember/uart/parser.ts +0 -48
  51. package/src/adapter/ember/uart/queues.ts +0 -247
  52. package/src/adapter/ember/uart/writer.ts +0 -53
  53. package/src/adapter/ember/utils/initters.ts +0 -58
  54. package/src/adapter/ember/utils/math.ts +0 -73
  55. package/src/adapter/events.ts +0 -21
  56. package/src/adapter/ezsp/adapter/backup.ts +0 -109
  57. package/src/adapter/ezsp/adapter/ezspAdapter.ts +0 -614
  58. package/src/adapter/ezsp/driver/commands.ts +0 -2497
  59. package/src/adapter/ezsp/driver/consts.ts +0 -11
  60. package/src/adapter/ezsp/driver/driver.ts +0 -1002
  61. package/src/adapter/ezsp/driver/ezsp.ts +0 -802
  62. package/src/adapter/ezsp/driver/frame.ts +0 -101
  63. package/src/adapter/ezsp/driver/index.ts +0 -4
  64. package/src/adapter/ezsp/driver/multicast.ts +0 -78
  65. package/src/adapter/ezsp/driver/parser.ts +0 -81
  66. package/src/adapter/ezsp/driver/types/basic.ts +0 -201
  67. package/src/adapter/ezsp/driver/types/index.ts +0 -239
  68. package/src/adapter/ezsp/driver/types/named.ts +0 -2330
  69. package/src/adapter/ezsp/driver/types/struct.ts +0 -844
  70. package/src/adapter/ezsp/driver/uart.ts +0 -460
  71. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +0 -44
  72. package/src/adapter/ezsp/driver/utils/index.ts +0 -32
  73. package/src/adapter/ezsp/driver/writer.ts +0 -64
  74. package/src/adapter/index.ts +0 -3
  75. package/src/adapter/serialPort.ts +0 -58
  76. package/src/adapter/socketPortUtils.ts +0 -16
  77. package/src/adapter/tstype.ts +0 -78
  78. package/src/adapter/z-stack/adapter/adapter-backup.ts +0 -519
  79. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +0 -457
  80. package/src/adapter/z-stack/adapter/endpoints.ts +0 -57
  81. package/src/adapter/z-stack/adapter/manager.ts +0 -543
  82. package/src/adapter/z-stack/adapter/tstype.ts +0 -6
  83. package/src/adapter/z-stack/adapter/zStackAdapter.ts +0 -1190
  84. package/src/adapter/z-stack/constants/af.ts +0 -27
  85. package/src/adapter/z-stack/constants/common.ts +0 -285
  86. package/src/adapter/z-stack/constants/dbg.ts +0 -23
  87. package/src/adapter/z-stack/constants/index.ts +0 -11
  88. package/src/adapter/z-stack/constants/mac.ts +0 -128
  89. package/src/adapter/z-stack/constants/sapi.ts +0 -25
  90. package/src/adapter/z-stack/constants/sys.ts +0 -72
  91. package/src/adapter/z-stack/constants/util.ts +0 -82
  92. package/src/adapter/z-stack/constants/utils.ts +0 -14
  93. package/src/adapter/z-stack/constants/zdo.ts +0 -103
  94. package/src/adapter/z-stack/models/startup-options.ts +0 -13
  95. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +0 -44
  96. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +0 -19
  97. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +0 -12
  98. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +0 -21
  99. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +0 -19
  100. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +0 -21
  101. package/src/adapter/z-stack/structs/entries/channel-list.ts +0 -8
  102. package/src/adapter/z-stack/structs/entries/has-configured.ts +0 -16
  103. package/src/adapter/z-stack/structs/entries/index.ts +0 -16
  104. package/src/adapter/z-stack/structs/entries/nib.ts +0 -66
  105. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +0 -15
  106. package/src/adapter/z-stack/structs/entries/nwk-key.ts +0 -13
  107. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +0 -8
  108. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +0 -20
  109. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +0 -19
  110. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +0 -33
  111. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +0 -22
  112. package/src/adapter/z-stack/structs/index.ts +0 -4
  113. package/src/adapter/z-stack/structs/serializable-memory-object.ts +0 -14
  114. package/src/adapter/z-stack/structs/struct.ts +0 -367
  115. package/src/adapter/z-stack/structs/table.ts +0 -198
  116. package/src/adapter/z-stack/unpi/constants.ts +0 -33
  117. package/src/adapter/z-stack/unpi/frame.ts +0 -62
  118. package/src/adapter/z-stack/unpi/index.ts +0 -4
  119. package/src/adapter/z-stack/unpi/parser.ts +0 -56
  120. package/src/adapter/z-stack/unpi/writer.ts +0 -21
  121. package/src/adapter/z-stack/utils/channel-list.ts +0 -40
  122. package/src/adapter/z-stack/utils/index.ts +0 -2
  123. package/src/adapter/z-stack/utils/network-options.ts +0 -26
  124. package/src/adapter/z-stack/znp/buffaloZnp.ts +0 -175
  125. package/src/adapter/z-stack/znp/definition.ts +0 -2713
  126. package/src/adapter/z-stack/znp/index.ts +0 -2
  127. package/src/adapter/z-stack/znp/parameterType.ts +0 -22
  128. package/src/adapter/z-stack/znp/tstype.ts +0 -44
  129. package/src/adapter/z-stack/znp/utils.ts +0 -10
  130. package/src/adapter/z-stack/znp/znp.ts +0 -342
  131. package/src/adapter/z-stack/znp/zpiObject.ts +0 -148
  132. package/src/adapter/zboss/adapter/zbossAdapter.ts +0 -526
  133. package/src/adapter/zboss/commands.ts +0 -1184
  134. package/src/adapter/zboss/consts.ts +0 -9
  135. package/src/adapter/zboss/driver.ts +0 -422
  136. package/src/adapter/zboss/enums.ts +0 -360
  137. package/src/adapter/zboss/frame.ts +0 -227
  138. package/src/adapter/zboss/reader.ts +0 -65
  139. package/src/adapter/zboss/types.ts +0 -0
  140. package/src/adapter/zboss/uart.ts +0 -428
  141. package/src/adapter/zboss/utils.ts +0 -58
  142. package/src/adapter/zboss/writer.ts +0 -49
  143. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +0 -27
  144. package/src/adapter/zigate/adapter/zigateAdapter.ts +0 -618
  145. package/src/adapter/zigate/driver/LICENSE +0 -17
  146. package/src/adapter/zigate/driver/buffaloZiGate.ts +0 -212
  147. package/src/adapter/zigate/driver/commandType.ts +0 -418
  148. package/src/adapter/zigate/driver/constants.ts +0 -150
  149. package/src/adapter/zigate/driver/frame.ts +0 -197
  150. package/src/adapter/zigate/driver/messageType.ts +0 -287
  151. package/src/adapter/zigate/driver/parameterType.ts +0 -32
  152. package/src/adapter/zigate/driver/ziGateObject.ts +0 -146
  153. package/src/adapter/zigate/driver/zigate.ts +0 -423
  154. package/src/adapter/zoh/adapter/utils.ts +0 -27
  155. package/src/adapter/zoh/adapter/zohAdapter.ts +0 -838
  156. package/src/buffalo/buffalo.ts +0 -342
  157. package/src/buffalo/index.ts +0 -1
  158. package/src/controller/controller.ts +0 -1022
  159. package/src/controller/database.ts +0 -124
  160. package/src/controller/events.ts +0 -52
  161. package/src/controller/greenPower.ts +0 -603
  162. package/src/controller/helpers/index.ts +0 -1
  163. package/src/controller/helpers/installCodes.ts +0 -107
  164. package/src/controller/helpers/request.ts +0 -96
  165. package/src/controller/helpers/requestQueue.ts +0 -125
  166. package/src/controller/helpers/zclFrameConverter.ts +0 -47
  167. package/src/controller/helpers/zclTransactionSequenceNumber.ts +0 -19
  168. package/src/controller/index.ts +0 -6
  169. package/src/controller/model/device.ts +0 -1248
  170. package/src/controller/model/endpoint.ts +0 -1105
  171. package/src/controller/model/entity.ts +0 -23
  172. package/src/controller/model/group.ts +0 -424
  173. package/src/controller/model/index.ts +0 -5
  174. package/src/controller/model/zigbeeEntity.ts +0 -30
  175. package/src/controller/touchlink.ts +0 -189
  176. package/src/controller/tstype.ts +0 -274
  177. package/src/index.ts +0 -12
  178. package/src/models/backup-storage-legacy.ts +0 -48
  179. package/src/models/backup-storage-unified.ts +0 -47
  180. package/src/models/backup.ts +0 -37
  181. package/src/models/index.ts +0 -5
  182. package/src/models/network-options.ts +0 -11
  183. package/src/utils/backup.ts +0 -152
  184. package/src/utils/index.ts +0 -5
  185. package/src/utils/logger.ts +0 -20
  186. package/src/utils/patchBigIntSerialization.ts +0 -8
  187. package/src/utils/queue.ts +0 -76
  188. package/src/utils/types.d.ts +0 -3
  189. package/src/utils/utils.ts +0 -19
  190. package/src/utils/wait.ts +0 -5
  191. package/src/utils/waitress.ts +0 -96
  192. package/src/zspec/consts.ts +0 -84
  193. package/src/zspec/enums.ts +0 -22
  194. package/src/zspec/index.ts +0 -3
  195. package/src/zspec/tstypes.ts +0 -18
  196. package/src/zspec/utils.ts +0 -247
  197. package/src/zspec/zcl/buffaloZcl.ts +0 -1220
  198. package/src/zspec/zcl/definition/cluster.ts +0 -5915
  199. package/src/zspec/zcl/definition/clusters-typegen.ts +0 -588
  200. package/src/zspec/zcl/definition/clusters-types.ts +0 -7331
  201. package/src/zspec/zcl/definition/consts.ts +0 -24
  202. package/src/zspec/zcl/definition/enums.ts +0 -203
  203. package/src/zspec/zcl/definition/foundation.ts +0 -329
  204. package/src/zspec/zcl/definition/manufacturerCode.ts +0 -729
  205. package/src/zspec/zcl/definition/status.ts +0 -69
  206. package/src/zspec/zcl/definition/tstype.ts +0 -377
  207. package/src/zspec/zcl/index.ts +0 -11
  208. package/src/zspec/zcl/utils.ts +0 -321
  209. package/src/zspec/zcl/zclFrame.ts +0 -356
  210. package/src/zspec/zcl/zclHeader.ts +0 -102
  211. package/src/zspec/zcl/zclStatusError.ts +0 -10
  212. package/src/zspec/zdo/buffaloZdo.ts +0 -2336
  213. package/src/zspec/zdo/definition/clusters.ts +0 -722
  214. package/src/zspec/zdo/definition/consts.ts +0 -16
  215. package/src/zspec/zdo/definition/enums.ts +0 -99
  216. package/src/zspec/zdo/definition/status.ts +0 -105
  217. package/src/zspec/zdo/definition/tstypes.ts +0 -1062
  218. package/src/zspec/zdo/index.ts +0 -7
  219. package/src/zspec/zdo/utils.ts +0 -76
  220. package/src/zspec/zdo/zdoStatusError.ts +0 -10
  221. package/test/adapter/adapter.test.ts +0 -1062
  222. package/test/adapter/ember/ash.test.ts +0 -337
  223. package/test/adapter/ember/consts.ts +0 -131
  224. package/test/adapter/ember/emberAdapter.test.ts +0 -3449
  225. package/test/adapter/ember/ezsp.test.ts +0 -385
  226. package/test/adapter/ember/ezspBuffalo.test.ts +0 -93
  227. package/test/adapter/ember/ezspError.test.ts +0 -12
  228. package/test/adapter/ember/math.test.ts +0 -206
  229. package/test/adapter/ezsp/frame.test.ts +0 -30
  230. package/test/adapter/ezsp/uart.test.ts +0 -181
  231. package/test/adapter/z-stack/adapter.test.ts +0 -3984
  232. package/test/adapter/z-stack/constants.test.ts +0 -33
  233. package/test/adapter/z-stack/structs.test.ts +0 -115
  234. package/test/adapter/z-stack/unpi.test.ts +0 -213
  235. package/test/adapter/z-stack/znp.test.ts +0 -1284
  236. package/test/adapter/zboss/fixZdoResponse.test.ts +0 -179
  237. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +0 -81
  238. package/test/adapter/zigate/zdo.test.ts +0 -187
  239. package/test/adapter/zoh/utils.test.ts +0 -36
  240. package/test/adapter/zoh/zohAdapter.test.ts +0 -1307
  241. package/test/buffalo.test.ts +0 -431
  242. package/test/controller.bench.ts +0 -193
  243. package/test/controller.test.ts +0 -8702
  244. package/test/greenpower.test.ts +0 -1408
  245. package/test/mockAdapters.ts +0 -65
  246. package/test/mockDevices.ts +0 -598
  247. package/test/requests.bench.ts +0 -206
  248. package/test/testUtils.ts +0 -20
  249. package/test/tsconfig.json +0 -9
  250. package/test/utils/math.ts +0 -19
  251. package/test/utils.test.ts +0 -279
  252. package/test/vitest.config.mts +0 -27
  253. package/test/zcl.test.ts +0 -2831
  254. package/test/zspec/utils.test.ts +0 -68
  255. package/test/zspec/zcl/buffalo.test.ts +0 -1374
  256. package/test/zspec/zcl/frame.test.ts +0 -960
  257. package/test/zspec/zcl/utils.test.ts +0 -273
  258. package/test/zspec/zdo/buffalo.test.ts +0 -1850
  259. package/test/zspec/zdo/utils.test.ts +0 -241
  260. package/tsconfig.json +0 -24
@@ -1,337 +0,0 @@
1
- import {MockBinding, type MockPortBinding} from "@serialport/binding-mock";
2
- import type {OpenOptions} from "@serialport/stream";
3
- import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest";
4
- import {EzspStatus} from "../../../src/adapter/ember/enums";
5
- import {EzspBuffalo} from "../../../src/adapter/ember/ezsp/buffalo";
6
- import {
7
- EZSP_EXTENDED_FRAME_CONTROL_LB_INDEX,
8
- EZSP_FRAME_CONTROL_COMMAND,
9
- EZSP_FRAME_CONTROL_NETWORK_INDEX_MASK,
10
- EZSP_FRAME_CONTROL_NETWORK_INDEX_OFFSET,
11
- EZSP_FRAME_CONTROL_SLEEP_MODE_MASK,
12
- EZSP_FRAME_ID_INDEX,
13
- EZSP_MAX_FRAME_LENGTH,
14
- EZSP_PARAMETERS_INDEX,
15
- EZSP_SEQUENCE_INDEX,
16
- } from "../../../src/adapter/ember/ezsp/consts";
17
- import {EzspFrameID} from "../../../src/adapter/ember/ezsp/enums";
18
- import {CONFIG_TX_K, UartAsh} from "../../../src/adapter/ember/uart/ash";
19
- import {EZSP_HOST_RX_POOL_SIZE, TX_POOL_BUFFERS} from "../../../src/adapter/ember/uart/consts";
20
- import {EzspBuffer} from "../../../src/adapter/ember/uart/queues";
21
- import {lowByte} from "../../../src/adapter/ember/utils/math";
22
- import {wait} from "../../../src/utils/";
23
- import {ASH_ACK_FIRST_BYTES, adapterSONOFFDongleE, RECD_RSTACK_BYTES, SEND_ACK_FIRST_BYTES, SEND_RST_BYTES} from "./consts";
24
-
25
- const mockSerialPortCloseEvent = vi.fn();
26
- const mockSerialPortErrorEvent = vi.fn();
27
-
28
- // todo doesnt reset if closing
29
- // todo doesnt start if closing or connected
30
- // todo doesnt close port if already closed on stop
31
- // todo port error triggers stop
32
- // todo emit `reset` only on port error
33
- // todo emit `close` only when ASH layer stopped
34
- // todo emit `frame` only on valid DATA frame
35
-
36
- const mocks = [mockSerialPortCloseEvent, mockSerialPortErrorEvent];
37
-
38
- describe("Ember UART ASH Protocol", () => {
39
- const openOpts: OpenOptions<MockPortBinding> = {path: "/dev/ttyACM0", baudRate: 115200, binding: MockBinding};
40
- /**
41
- * Mock binding provides:
42
- *
43
- * uartAsh.serialPort.port.recording => Buffer of all data written if record==true
44
- *
45
- * uartAsh.serialPort.port.lastWrite => Buffer of last write
46
- */
47
- let uartAsh: UartAsh;
48
- let buffalo: EzspBuffalo;
49
- let frameSequence: number;
50
-
51
- beforeAll(() => {
52
- vi.useRealTimers(); // messes with serialport promise handling otherwise?
53
- });
54
-
55
- afterAll(() => {
56
- vi.useRealTimers();
57
- });
58
-
59
- beforeEach(() => {
60
- for (const mock of mocks) {
61
- mock.mockClear();
62
- }
63
-
64
- frameSequence = 0;
65
- uartAsh = new UartAsh(openOpts);
66
- buffalo = new EzspBuffalo(Buffer.alloc(EZSP_MAX_FRAME_LENGTH));
67
- MockBinding.createPort("/dev/ttyACM0", {/*echo: true,*/ record: true, /*readyData: emitRSTACK,*/ ...adapterSONOFFDongleE});
68
-
69
- buffalo.setPosition(0);
70
- });
71
-
72
- afterEach(async () => {
73
- await uartAsh.stop();
74
- MockBinding.reset();
75
- });
76
-
77
- it("Inits properly and allocates buffers as needed", () => {
78
- expect(uartAsh.connected).toStrictEqual(false);
79
- expect(uartAsh.txQueue).toBeDefined();
80
- expect(uartAsh.reTxQueue).toBeDefined();
81
- expect(uartAsh.txFree).toBeDefined();
82
- expect(uartAsh.rxQueue).toBeDefined();
83
- expect(uartAsh.rxFree).toBeDefined();
84
- expect(uartAsh.ncpSleepEnabled).toStrictEqual(false);
85
- expect(uartAsh.ncpHasCallbacks).toStrictEqual(false);
86
- expect(uartAsh.txQueue.length).toStrictEqual(0);
87
- expect(uartAsh.reTxQueue.length).toStrictEqual(0);
88
- expect(uartAsh.txFree.length).toStrictEqual(TX_POOL_BUFFERS);
89
- expect(uartAsh.rxQueue.length).toStrictEqual(0);
90
- expect(uartAsh.rxFree.length).toStrictEqual(EZSP_HOST_RX_POOL_SIZE);
91
- expect(uartAsh.txQueue.tail).toStrictEqual(undefined);
92
- expect(uartAsh.reTxQueue.tail).toStrictEqual(undefined);
93
- expect(uartAsh.txFree.link).toBeInstanceOf(EzspBuffer);
94
- expect(uartAsh.txFree.link!.data.length).toStrictEqual(EZSP_MAX_FRAME_LENGTH);
95
- expect(uartAsh.rxQueue.tail).toStrictEqual(undefined);
96
- expect(uartAsh.rxFree.link).toBeInstanceOf(EzspBuffer);
97
- expect(uartAsh.rxFree.link!.data.length).toStrictEqual(EZSP_MAX_FRAME_LENGTH);
98
-
99
- for (const c in uartAsh.counters) {
100
- expect(uartAsh.counters[c]).toStrictEqual(0);
101
- }
102
-
103
- // this is mostly Queues testing, but make sure it works in "real" context
104
- const link = uartAsh.txFree.link;
105
- const buffer = uartAsh.txFree.allocBuffer();
106
-
107
- expect(buffer).toStrictEqual(link);
108
- expect(uartAsh.txFree.link).toStrictEqual(buffer!.link);
109
- expect(uartAsh.txFree.length).toStrictEqual(TX_POOL_BUFFERS - 1);
110
-
111
- uartAsh.txQueue.addTail(buffer!);
112
-
113
- expect(buffer!.link).toStrictEqual(undefined);
114
- expect(uartAsh.txQueue.tail).toStrictEqual(buffer);
115
- expect(uartAsh.txQueue.length).toStrictEqual(1);
116
-
117
- const head = uartAsh.txQueue.removeHead();
118
-
119
- expect(head).toStrictEqual(buffer);
120
- expect(head).toStrictEqual(link);
121
- expect(uartAsh.txQueue.tail).toStrictEqual(undefined);
122
- expect(uartAsh.txQueue.length).toStrictEqual(0);
123
-
124
- uartAsh.txFree.freeBuffer(head);
125
-
126
- uartAsh.txQueue.addTail(uartAsh.txFree.allocBuffer()!);
127
- uartAsh.txQueue.addTail(uartAsh.txFree.allocBuffer()!);
128
-
129
- expect(uartAsh.txQueue.length).toStrictEqual(2);
130
- expect(uartAsh.txFree.length).toStrictEqual(TX_POOL_BUFFERS - 2);
131
- });
132
-
133
- it("Reaches CONNECTED state", async () => {
134
- //@ts-expect-error private
135
- const initPortSpy = vi.spyOn(uartAsh, "initPort");
136
- const resetNcpSpy = vi.spyOn(uartAsh, "resetNcp");
137
- const sendExecSpy = vi.spyOn(uartAsh, "sendExec");
138
- //@ts-expect-error private
139
- const onPortCloseSpy = vi.spyOn(uartAsh, "onPortClose");
140
- //@ts-expect-error private
141
- const onPortErrorSpy = vi.spyOn(uartAsh, "onPortError");
142
-
143
- const resetResult = await uartAsh.resetNcp();
144
-
145
- //@ts-expect-error private
146
- expect(uartAsh.serialPort.settings.binding).toBe(MockBinding); // just making sure mock was registered
147
- expect(resetResult).toStrictEqual(EzspStatus.SUCCESS);
148
- expect(resetNcpSpy).toHaveBeenCalledTimes(1);
149
- expect(initPortSpy).toHaveBeenCalledTimes(1);
150
- //@ts-expect-error private
151
- expect(uartAsh.flags).toStrictEqual(48); // RST|CAN
152
- //@ts-expect-error private
153
- expect(uartAsh.serialPort).toBeDefined();
154
- //@ts-expect-error private
155
- expect(uartAsh.writer).toBeDefined();
156
- //@ts-expect-error private
157
- expect(uartAsh.parser).toBeDefined();
158
- expect(uartAsh.portOpen).toBeTruthy();
159
-
160
- //@ts-expect-error private
161
- vi.spyOn(uartAsh.serialPort, "asyncFlush").mockImplementationOnce(vi.fn());
162
- //@ts-expect-error private
163
- uartAsh.serialPort.port.emitData(Buffer.from(RECD_RSTACK_BYTES));
164
- const startResult = await uartAsh.start();
165
-
166
- expect(startResult).toStrictEqual(EzspStatus.SUCCESS);
167
- expect(sendExecSpy).toHaveBeenCalled();
168
- await new Promise(setImmediate); // flush
169
- //@ts-expect-error private
170
- expect(uartAsh.serialPort.port.recording).toStrictEqual(Buffer.from([...SEND_RST_BYTES, ...ASH_ACK_FIRST_BYTES]));
171
- expect(uartAsh.connected).toBeTruthy();
172
- expect(uartAsh.counters.txAllFrames).toStrictEqual(2); // RST + ACK
173
- expect(uartAsh.counters.txAckFrames).toStrictEqual(1); // post-RSTACK ACK
174
- expect(uartAsh.counters.rxAllFrames).toStrictEqual(1); // RSTACK
175
-
176
- for (const key in uartAsh.counters) {
177
- if (key !== "txAllFrames" && key !== "rxAllFrames" && key !== "txAckFrames") {
178
- expect(uartAsh.counters[key]).toStrictEqual(0);
179
- }
180
- }
181
-
182
- await uartAsh.stop();
183
-
184
- expect(onPortErrorSpy).toHaveBeenCalledTimes(0);
185
- expect(onPortCloseSpy).toHaveBeenCalledTimes(1);
186
- });
187
-
188
- it.skip("Resets but failed to start b/c error in RSTACK frame returned by NCP", async () => {
189
- //@ts-expect-error private
190
- const rejectFrameSpy = vi.spyOn(uartAsh, "rejectFrame");
191
- //@ts-expect-error private
192
- const receiveFrameSpy = vi.spyOn(uartAsh, "receiveFrame");
193
- //@ts-expect-error private
194
- const decodeByteSpy = vi.spyOn(uartAsh, "decodeByte");
195
-
196
- const resetResult = await uartAsh.resetNcp();
197
-
198
- expect(resetResult).toStrictEqual(EzspStatus.SUCCESS);
199
-
200
- const badCrcRSTACK = Buffer.from(RECD_RSTACK_BYTES);
201
- badCrcRSTACK[badCrcRSTACK.length - 2] = 0; // throw CRC low
202
-
203
- //@ts-expect-error private
204
- vi.spyOn(uartAsh.serialPort, "asyncFlush").mockImplementationOnce(vi.fn());
205
- //@ts-expect-error private
206
- uartAsh.serialPort.port.emitData(badCrcRSTACK);
207
- const startResult = await uartAsh.start();
208
-
209
- await wait(10);
210
-
211
- expect(startResult).toStrictEqual(EzspStatus.HOST_FATAL_ERROR);
212
- expect(uartAsh.counters.txAllFrames).toStrictEqual(1);
213
- expect(uartAsh.counters.rxAllFrames).toStrictEqual(0);
214
- expect(uartAsh.counters.rxCrcErrors).toStrictEqual(1);
215
- expect(rejectFrameSpy).toHaveBeenCalledTimes(1); // received bad RSTACK
216
- expect(decodeByteSpy.mock.results[decodeByteSpy.mock.results.length - 1].value[0]).toStrictEqual(EzspStatus.ASH_BAD_CRC);
217
- expect(receiveFrameSpy).toHaveLastReturnedWith(EzspStatus.NO_RX_DATA);
218
- expect(uartAsh.connected).toBeFalsy();
219
- });
220
-
221
- describe("In CONNECTED state...", () => {
222
- beforeEach(async () => {
223
- const resetResult = await uartAsh.resetNcp();
224
- //@ts-expect-error private
225
- vi.spyOn(uartAsh.serialPort, "asyncFlush").mockImplementationOnce(vi.fn());
226
- //@ts-expect-error private
227
- uartAsh.serialPort.port.emitData(Buffer.from(RECD_RSTACK_BYTES));
228
- const startResult = await uartAsh.start();
229
-
230
- expect(resetResult).toStrictEqual(EzspStatus.SUCCESS);
231
- expect(startResult).toStrictEqual(EzspStatus.SUCCESS);
232
- expect(uartAsh.connected).toBeTruthy();
233
-
234
- uartAsh.sendExec(); // ACK for RSTACK == 8070787e
235
- expect(uartAsh.idle).toBeTruthy();
236
- expect(uartAsh.counters.txAckFrames).toStrictEqual(1); // ACK for RSTACK
237
- });
238
- afterEach(async () => {});
239
-
240
- it("Sends DATA frame to NCP", async () => {
241
- buffalo.setPosition(EZSP_PARAMETERS_INDEX);
242
- buffalo.setCommandByte(EZSP_FRAME_ID_INDEX, lowByte(EzspFrameID.VERSION));
243
- buffalo.setCommandByte(EZSP_SEQUENCE_INDEX, frameSequence++);
244
- buffalo.setCommandByte(
245
- EZSP_EXTENDED_FRAME_CONTROL_LB_INDEX,
246
- EZSP_FRAME_CONTROL_COMMAND |
247
- (0x00 & EZSP_FRAME_CONTROL_SLEEP_MODE_MASK) |
248
- ((0x00 << EZSP_FRAME_CONTROL_NETWORK_INDEX_OFFSET) & EZSP_FRAME_CONTROL_NETWORK_INDEX_MASK),
249
- );
250
- buffalo.writeUInt8(13); // desiredProtocolVersion
251
-
252
- const sendBuf = buffalo.getWritten();
253
-
254
- uartAsh.send(sendBuf.length, sendBuf);
255
-
256
- await wait(10);
257
-
258
- expect(uartAsh.counters.txDataFrames).toStrictEqual(1);
259
- //@ts-expect-error private
260
- expect(uartAsh.serialPort.port.recording).toStrictEqual(
261
- Buffer.concat([
262
- Buffer.from("1ac038bc7e", "hex"), // RST
263
- Buffer.from("8070787e", "hex"), // RSTACK ACK
264
- Buffer.from("004221a8597c057e", "hex"), // DATA
265
- ]),
266
- );
267
- });
268
-
269
- it("Sends DATA frame and receives response from NCP", async () => {
270
- buffalo.setPosition(EZSP_PARAMETERS_INDEX);
271
- buffalo.setCommandByte(EZSP_FRAME_ID_INDEX, lowByte(EzspFrameID.VERSION));
272
- buffalo.setCommandByte(EZSP_SEQUENCE_INDEX, frameSequence++);
273
- buffalo.setCommandByte(
274
- EZSP_EXTENDED_FRAME_CONTROL_LB_INDEX,
275
- EZSP_FRAME_CONTROL_COMMAND |
276
- (0x00 & EZSP_FRAME_CONTROL_SLEEP_MODE_MASK) |
277
- ((0x00 << EZSP_FRAME_CONTROL_NETWORK_INDEX_OFFSET) & EZSP_FRAME_CONTROL_NETWORK_INDEX_MASK),
278
- );
279
- buffalo.writeUInt8(2); // desiredProtocolVersion
280
-
281
- const sendBuf = buffalo.getWritten();
282
-
283
- uartAsh.send(sendBuf.length, sendBuf);
284
-
285
- await wait(10);
286
-
287
- //@ts-expect-error private
288
- uartAsh.serialPort.port.emitData(Buffer.from(SEND_ACK_FIRST_BYTES)); // just an ACK, doesn't matter what it is
289
-
290
- await wait(10); // force wait new frame
291
-
292
- expect(uartAsh.counters.txAckFrames).toStrictEqual(1);
293
- expect(uartAsh.counters.rxAckFrames).toStrictEqual(1);
294
- });
295
-
296
- it("TODO: Sends DATA frame with NR flags when buffers are low on host", async () => {});
297
-
298
- it("TODO: Sends DATA frame but times out waiting for response", async () => {});
299
-
300
- it("TODO: Resends DATA frame", async () => {});
301
-
302
- it("Allows sending up to TX_K frames before receiving ACK", async () => {
303
- buffalo.setPosition(EZSP_PARAMETERS_INDEX);
304
- buffalo.setCommandByte(EZSP_FRAME_ID_INDEX, lowByte(EzspFrameID.VERSION));
305
- buffalo.setCommandByte(EZSP_SEQUENCE_INDEX, frameSequence++);
306
- buffalo.setCommandByte(
307
- EZSP_EXTENDED_FRAME_CONTROL_LB_INDEX,
308
- EZSP_FRAME_CONTROL_COMMAND |
309
- (0x00 & EZSP_FRAME_CONTROL_SLEEP_MODE_MASK) |
310
- ((0x00 << EZSP_FRAME_CONTROL_NETWORK_INDEX_OFFSET) & EZSP_FRAME_CONTROL_NETWORK_INDEX_MASK),
311
- );
312
- buffalo.writeUInt8(13); // desiredProtocolVersion
313
-
314
- const sendBuf = buffalo.getWritten();
315
-
316
- for (let i = 0; i <= CONFIG_TX_K; i++) {
317
- uartAsh.send(sendBuf.length, sendBuf);
318
- }
319
-
320
- await wait(10);
321
-
322
- expect(uartAsh.counters.txDataFrames).toStrictEqual(3);
323
- expect(uartAsh.txQueue.length).toStrictEqual(1);
324
-
325
- //@ts-expect-error private
326
- expect(uartAsh.serialPort.port.recording).toStrictEqual(
327
- Buffer.concat([
328
- Buffer.from("1ac038bc7e", "hex"), // RST
329
- Buffer.from("8070787e", "hex"), // RSTACK ACK
330
- Buffer.from("004221a8597c057e", "hex"), // DATA 1
331
- Buffer.from("104221a859785f7e", "hex"), // DATA 2
332
- Buffer.from("204221a85974b17e", "hex"), // DATA 3
333
- ]),
334
- );
335
- });
336
- });
337
- });
@@ -1,131 +0,0 @@
1
- import {ASH_VERSION} from "../../../src/adapter/ember/uart/consts";
2
- import {AshFrameType, AshReservedByte, NcpFailedCode} from "../../../src/adapter/ember/uart/enums";
3
-
4
- export const adapterSONOFFDongleE = {manufacturer: "ITEAD", vendorId: "1a86", productId: "55d4"};
5
- export const adapterHASkyConnect = {manufacturer: "Nabu Casa", vendorId: "10c4", productId: "ea60"};
6
-
7
- /**
8
- * Bytes sent to NCP on init
9
- *
10
- * 1ac038bc7e
11
- */
12
- export const SEND_RST_BYTES = [
13
- AshReservedByte.CANCEL, // 26 - 0x1a
14
- AshFrameType.RST, // 192 - 0xc0
15
- 56, // CRC high - 0x38
16
- 188, // CRC low - 0xbc
17
- AshReservedByte.FLAG, // 126 - 0x7e
18
- ];
19
-
20
- /**
21
- * Pre-decoding values.
22
- *
23
- * [193, 2, 2, 155, 123, 126]
24
- *
25
- * 1ac1020b0a527e
26
- */
27
- export const RECD_RSTACK_BYTES = [
28
- AshReservedByte.CANCEL, // 26 - 0x1a
29
- AshFrameType.RSTACK, // 193 - 0xc1
30
- ASH_VERSION, // 2 - 0x02
31
- NcpFailedCode.RESET_SOFTWARE, // 11 - 0x0b
32
- 10, // CRC high - 0x0a
33
- 82, // CRC low - 0x52
34
- AshReservedByte.FLAG, // 126 - 0x7e
35
- ];
36
-
37
- /**
38
- * ACK following first DATA frame sent.
39
- *
40
- * ACK(1)+
41
- */
42
- export const SEND_ACK_FIRST_BYTES = [
43
- AshFrameType.ACK + 1,
44
- 0x60, // CRC High
45
- 0x59, // CRC Low
46
- AshReservedByte.FLAG,
47
- ];
48
-
49
- /**
50
- * ACK sent by ASH (Z2M) after RSTACK received.
51
- *
52
- * ACK(0)+
53
- */
54
- export const ASH_ACK_FIRST_BYTES = [
55
- AshFrameType.ACK,
56
- 0x70, // CRC High
57
- 0x78, // CRC Low
58
- AshReservedByte.FLAG,
59
- ];
60
-
61
- /**
62
- * Pre-decoding values.
63
- *
64
- * [194, 2, 81, 168, 189, 126]
65
- *
66
- * c20251a8bd7e
67
- */
68
- export const RECD_ERROR_ACK_TIMEOUT_BYTES = [
69
- AshFrameType.ERROR,
70
- ASH_VERSION,
71
- NcpFailedCode.ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT,
72
- 0xa8, // CRC High
73
- 0xbd, // CRC Low
74
- AshReservedByte.FLAG,
75
- ];
76
-
77
- export const RCED_ERROR_WATCHDOG_BYTES = [
78
- AshFrameType.ERROR,
79
- ASH_VERSION,
80
- NcpFailedCode.RESET_WATCHDOG,
81
- 0xd2, // CRC High
82
- 0x0a, // CRC Low
83
- AshReservedByte.FLAG,
84
- ];
85
-
86
- export const RCED_DATA_WITH_CRC_ERROR = Buffer.from("b658904124ab5593499cdd93623cd29874f5de5083f97b1e66efc9af417e", "hex");
87
-
88
- export const RCED_DATA_RETRY = Buffer.from("0eafb1a96b2a7d334fa674eb04aaa760499d4e27cdd9ce6192f2c46989fcfb817e", "hex");
89
-
90
- /** desiredProtocolVersion: 13 */
91
- export const SEND_DATA_VERSION = Buffer.from("004221a8597c057e", "hex");
92
- /** protocolVersion: 13, stackType: 2, stackVersion: 29712 */
93
- export const RCED_DATA_VERSION = Buffer.from("0142a1a8592805c6a8777e", "hex");
94
- export const RCED_DATA_VERSION_RES = [13, 2, 29712];
95
-
96
- // [ZCL to=51678 apsFrame={"profileId":260,"clusterId":6,"sourceEndpoint":1,"destinationEndpoint":1,"options":4416,"groupId":0,"sequence":0} header={"frameControl":{"reservedBits":0,"frameType":1,"direction":0,"disableDefaultResponse":false,"manufacturerSpecific":false},"manufacturerCode":null,"transactionSequenceNumber":4,"commandIdentifier":0}]
97
- // [FRAME: ID=52:"SEND_UNICAST" Seq=39 Len=25]
98
- // [FRAME type=DATA frmTx=7 frmRx=0]
99
- export const SEND_UNICAST_ASH_RAW = "706521a9602a156c90904b23aa5493098d4e27abeece648af9c677b97e";
100
- // [FRAME type=DATA ackNum=0 frmNum=0]
101
- export const SEND_UNICAST_REPLY_FN0_ASH_RAW = "0065a1a9602a15b25994d0954c7e";
102
- // [FRAME: ID=52:"SEND_UNICAST" Seq=39 Len=10]
103
- // [SENT type=DIRECT apsSequence=154 messageTag=3 status=OK]
104
- export const SEND_UNICAST_REPLY_FN0_EZSP = "2780013400000000009a";
105
-
106
- // [FRAME type=DATA ackNum=0 frmNum=1]
107
- export const MESSAGE_SENT_HANDLER_FN1_ASH_RAW = "1065b1a96b2a15b259944afb6351934f9c4f26ebfcce677d31fec66357897e";
108
- // [CBFRAME: ID=63:"MESSAGE_SENT_HANDLER" Seq=39 Len=26]
109
- // ezspMessageSentHandler(): callback called with: [status=OK], [type=DIRECT], [indexOrDestination=51678], [apsFrame={"profileId":260,"clusterId":6,"sourceEndpoint":1,"destinationEndpoint":1,"options":4416,"groupId":0,"sequence":154}], [messageTag=3]
110
- export const MESSAGE_SENT_HANDLER_FN1_EZSP = "2790013f000000000000dec9040106000101401100009a030000";
111
-
112
- // [FRAME type=DATA ackNum=0 frmNum=2]
113
- export const INCOMING_MESSAGE_HANDLER_FN2_ASH_RAW = "2065b1a97d312a15b658924a24ab5593499c3ef962edce678bfdc6638903813ca7edcdde6f8ae7c3d0d5d26b68937e";
114
- // [CBFRAME: ID=69:"INCOMING_MESSAGE_HANDLER" Seq=39 Len=42]
115
- // ezspIncomingMessageHandler(): callback called with: [type=UNICAST], [apsFrame={"profileId":260,"clusterId":6,"sourceEndpoint":1,"destinationEndpoint":1,"options":256,"groupId":0,"sequence":112}], [packetInfo:{"senderShortId":51678,"senderLongId":"0x0000000000000000","bindingIndex":255,"addressIndex":255,"lastHopLqi":3,"lastHopRssi":0,"lastHopTimestamp":6}], [messageContents=18040b0000]
116
- // Received payload: clusterID=6, address=51678, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=3, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":4,"commandIdentifier":11},"payload":{"cmdId":0,"statusCode":0},"command":{"ID":11,"name":"defaultRsp","parameters":[{"name":"cmdId","type":32},{"name":"statusCode","type":32}]}}
117
- export const INCOMING_MESSAGE_HANDLER_FN2_EZSP = "2790014500000401060001010001000070dec90000000000000000ffff0300060000000518040b000002";
118
-
119
- // [FRAME type=DATA ackNum=0 frmNum=0]
120
- export const MESSAGE_SENT_HANDLER_FN0_ASH_RAW = "0065b1a96b2a15b259944afb6351934f9c4f26ebfcce6766fec66302907e";
121
- // [CBFRAME: ID=63:"MESSAGE_SENT_HANDLER" Seq=39 Len=26]
122
- // ezspMessageSentHandler(): callback called with: [status=OK], [type=DIRECT], [indexOrDestination=51678], [apsFrame={"profileId":260,"clusterId":6,"sourceEndpoint":1,"destinationEndpoint":1,"options":4416,"groupId":0,"sequence":237}], [messageTag=3]
123
- export const MESSAGE_SENT_HANDLER_FN0_EZSP = "2790013f000000000000dec904010600010140110000ed030000";
124
-
125
- // [FRAME: ID=85:"SET_POLICY" Seq=79 Len=7]
126
- // [FRAME type=DATA frmTx=7 frmRx=0]
127
- export const SET_POLICY_ASH_RAW = "700d21a9012a15b0f5667e";
128
- // [FRAME type=DATA ackNum=0 frmNum=1]
129
- export const SET_POLICY_REPLY_FN1_ASH_RAW = "100da1a9012a15b259944fb87e";
130
- // [FRAME: ID=85:"SET_POLICY" Seq=79 Len=9]
131
- export const SET_POLICY_REPLY_FN1_EZSP = "4f8001550000000000";