zigbee-herdsman 6.0.2 → 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 (252) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +12 -3
  3. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  4. package/.github/dependabot.yml +0 -22
  5. package/.github/workflows/ci.yml +0 -69
  6. package/.github/workflows/release-please.yml +0 -18
  7. package/.github/workflows/stale.yml +0 -20
  8. package/.github/workflows/typedoc.yaml +0 -47
  9. package/.release-please-manifest.json +0 -3
  10. package/.vscode/extensions.json +0 -3
  11. package/.vscode/settings.json +0 -11
  12. package/biome.json +0 -98
  13. package/examples/join-and-log.js +0 -24
  14. package/release-please-config.json +0 -9
  15. package/src/adapter/adapter.ts +0 -189
  16. package/src/adapter/adapterDiscovery.ts +0 -666
  17. package/src/adapter/const.ts +0 -12
  18. package/src/adapter/deconz/adapter/deconzAdapter.ts +0 -877
  19. package/src/adapter/deconz/driver/constants.ts +0 -246
  20. package/src/adapter/deconz/driver/driver.ts +0 -1540
  21. package/src/adapter/deconz/driver/frame.ts +0 -11
  22. package/src/adapter/deconz/driver/frameParser.ts +0 -753
  23. package/src/adapter/deconz/driver/parser.ts +0 -45
  24. package/src/adapter/deconz/driver/writer.ts +0 -22
  25. package/src/adapter/deconz/types.d.ts +0 -13
  26. package/src/adapter/ember/adapter/emberAdapter.ts +0 -2265
  27. package/src/adapter/ember/adapter/endpoints.ts +0 -86
  28. package/src/adapter/ember/adapter/oneWaitress.ts +0 -324
  29. package/src/adapter/ember/adapter/tokensManager.ts +0 -782
  30. package/src/adapter/ember/consts.ts +0 -178
  31. package/src/adapter/ember/enums.ts +0 -1746
  32. package/src/adapter/ember/ezsp/buffalo.ts +0 -1392
  33. package/src/adapter/ember/ezsp/consts.ts +0 -148
  34. package/src/adapter/ember/ezsp/enums.ts +0 -1114
  35. package/src/adapter/ember/ezsp/ezsp.ts +0 -9061
  36. package/src/adapter/ember/ezspError.ts +0 -10
  37. package/src/adapter/ember/types.ts +0 -866
  38. package/src/adapter/ember/uart/ash.ts +0 -1960
  39. package/src/adapter/ember/uart/consts.ts +0 -109
  40. package/src/adapter/ember/uart/enums.ts +0 -192
  41. package/src/adapter/ember/uart/parser.ts +0 -48
  42. package/src/adapter/ember/uart/queues.ts +0 -247
  43. package/src/adapter/ember/uart/writer.ts +0 -53
  44. package/src/adapter/ember/utils/initters.ts +0 -58
  45. package/src/adapter/ember/utils/math.ts +0 -73
  46. package/src/adapter/events.ts +0 -21
  47. package/src/adapter/ezsp/adapter/backup.ts +0 -109
  48. package/src/adapter/ezsp/adapter/ezspAdapter.ts +0 -614
  49. package/src/adapter/ezsp/driver/commands.ts +0 -2497
  50. package/src/adapter/ezsp/driver/consts.ts +0 -11
  51. package/src/adapter/ezsp/driver/driver.ts +0 -1002
  52. package/src/adapter/ezsp/driver/ezsp.ts +0 -802
  53. package/src/adapter/ezsp/driver/frame.ts +0 -101
  54. package/src/adapter/ezsp/driver/index.ts +0 -4
  55. package/src/adapter/ezsp/driver/multicast.ts +0 -78
  56. package/src/adapter/ezsp/driver/parser.ts +0 -81
  57. package/src/adapter/ezsp/driver/types/basic.ts +0 -201
  58. package/src/adapter/ezsp/driver/types/index.ts +0 -239
  59. package/src/adapter/ezsp/driver/types/named.ts +0 -2330
  60. package/src/adapter/ezsp/driver/types/struct.ts +0 -844
  61. package/src/adapter/ezsp/driver/uart.ts +0 -460
  62. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +0 -44
  63. package/src/adapter/ezsp/driver/utils/index.ts +0 -32
  64. package/src/adapter/ezsp/driver/writer.ts +0 -64
  65. package/src/adapter/index.ts +0 -3
  66. package/src/adapter/serialPort.ts +0 -58
  67. package/src/adapter/socketPortUtils.ts +0 -16
  68. package/src/adapter/tstype.ts +0 -78
  69. package/src/adapter/z-stack/adapter/adapter-backup.ts +0 -519
  70. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +0 -457
  71. package/src/adapter/z-stack/adapter/endpoints.ts +0 -57
  72. package/src/adapter/z-stack/adapter/manager.ts +0 -543
  73. package/src/adapter/z-stack/adapter/tstype.ts +0 -6
  74. package/src/adapter/z-stack/adapter/zStackAdapter.ts +0 -1190
  75. package/src/adapter/z-stack/constants/af.ts +0 -27
  76. package/src/adapter/z-stack/constants/common.ts +0 -285
  77. package/src/adapter/z-stack/constants/dbg.ts +0 -23
  78. package/src/adapter/z-stack/constants/index.ts +0 -11
  79. package/src/adapter/z-stack/constants/mac.ts +0 -128
  80. package/src/adapter/z-stack/constants/sapi.ts +0 -25
  81. package/src/adapter/z-stack/constants/sys.ts +0 -72
  82. package/src/adapter/z-stack/constants/util.ts +0 -82
  83. package/src/adapter/z-stack/constants/utils.ts +0 -14
  84. package/src/adapter/z-stack/constants/zdo.ts +0 -103
  85. package/src/adapter/z-stack/models/startup-options.ts +0 -13
  86. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +0 -44
  87. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +0 -19
  88. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +0 -12
  89. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +0 -21
  90. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +0 -19
  91. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +0 -21
  92. package/src/adapter/z-stack/structs/entries/channel-list.ts +0 -8
  93. package/src/adapter/z-stack/structs/entries/has-configured.ts +0 -16
  94. package/src/adapter/z-stack/structs/entries/index.ts +0 -16
  95. package/src/adapter/z-stack/structs/entries/nib.ts +0 -66
  96. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +0 -15
  97. package/src/adapter/z-stack/structs/entries/nwk-key.ts +0 -13
  98. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +0 -8
  99. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +0 -20
  100. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +0 -19
  101. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +0 -33
  102. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +0 -22
  103. package/src/adapter/z-stack/structs/index.ts +0 -4
  104. package/src/adapter/z-stack/structs/serializable-memory-object.ts +0 -14
  105. package/src/adapter/z-stack/structs/struct.ts +0 -367
  106. package/src/adapter/z-stack/structs/table.ts +0 -198
  107. package/src/adapter/z-stack/unpi/constants.ts +0 -33
  108. package/src/adapter/z-stack/unpi/frame.ts +0 -62
  109. package/src/adapter/z-stack/unpi/index.ts +0 -4
  110. package/src/adapter/z-stack/unpi/parser.ts +0 -56
  111. package/src/adapter/z-stack/unpi/writer.ts +0 -21
  112. package/src/adapter/z-stack/utils/channel-list.ts +0 -40
  113. package/src/adapter/z-stack/utils/index.ts +0 -2
  114. package/src/adapter/z-stack/utils/network-options.ts +0 -26
  115. package/src/adapter/z-stack/znp/buffaloZnp.ts +0 -175
  116. package/src/adapter/z-stack/znp/definition.ts +0 -2713
  117. package/src/adapter/z-stack/znp/index.ts +0 -2
  118. package/src/adapter/z-stack/znp/parameterType.ts +0 -22
  119. package/src/adapter/z-stack/znp/tstype.ts +0 -44
  120. package/src/adapter/z-stack/znp/utils.ts +0 -10
  121. package/src/adapter/z-stack/znp/znp.ts +0 -342
  122. package/src/adapter/z-stack/znp/zpiObject.ts +0 -148
  123. package/src/adapter/zboss/adapter/zbossAdapter.ts +0 -526
  124. package/src/adapter/zboss/commands.ts +0 -1184
  125. package/src/adapter/zboss/consts.ts +0 -9
  126. package/src/adapter/zboss/driver.ts +0 -422
  127. package/src/adapter/zboss/enums.ts +0 -360
  128. package/src/adapter/zboss/frame.ts +0 -227
  129. package/src/adapter/zboss/reader.ts +0 -65
  130. package/src/adapter/zboss/types.ts +0 -0
  131. package/src/adapter/zboss/uart.ts +0 -428
  132. package/src/adapter/zboss/utils.ts +0 -58
  133. package/src/adapter/zboss/writer.ts +0 -49
  134. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +0 -27
  135. package/src/adapter/zigate/adapter/zigateAdapter.ts +0 -618
  136. package/src/adapter/zigate/driver/LICENSE +0 -17
  137. package/src/adapter/zigate/driver/buffaloZiGate.ts +0 -212
  138. package/src/adapter/zigate/driver/commandType.ts +0 -418
  139. package/src/adapter/zigate/driver/constants.ts +0 -150
  140. package/src/adapter/zigate/driver/frame.ts +0 -197
  141. package/src/adapter/zigate/driver/messageType.ts +0 -287
  142. package/src/adapter/zigate/driver/parameterType.ts +0 -32
  143. package/src/adapter/zigate/driver/ziGateObject.ts +0 -146
  144. package/src/adapter/zigate/driver/zigate.ts +0 -423
  145. package/src/adapter/zoh/adapter/utils.ts +0 -27
  146. package/src/adapter/zoh/adapter/zohAdapter.ts +0 -838
  147. package/src/buffalo/buffalo.ts +0 -342
  148. package/src/buffalo/index.ts +0 -1
  149. package/src/controller/controller.ts +0 -1022
  150. package/src/controller/database.ts +0 -124
  151. package/src/controller/events.ts +0 -52
  152. package/src/controller/greenPower.ts +0 -603
  153. package/src/controller/helpers/index.ts +0 -1
  154. package/src/controller/helpers/installCodes.ts +0 -107
  155. package/src/controller/helpers/request.ts +0 -96
  156. package/src/controller/helpers/requestQueue.ts +0 -125
  157. package/src/controller/helpers/zclFrameConverter.ts +0 -47
  158. package/src/controller/helpers/zclTransactionSequenceNumber.ts +0 -19
  159. package/src/controller/index.ts +0 -6
  160. package/src/controller/model/device.ts +0 -1249
  161. package/src/controller/model/endpoint.ts +0 -1105
  162. package/src/controller/model/entity.ts +0 -23
  163. package/src/controller/model/group.ts +0 -424
  164. package/src/controller/model/index.ts +0 -5
  165. package/src/controller/model/zigbeeEntity.ts +0 -30
  166. package/src/controller/touchlink.ts +0 -189
  167. package/src/controller/tstype.ts +0 -274
  168. package/src/index.ts +0 -12
  169. package/src/models/backup-storage-legacy.ts +0 -48
  170. package/src/models/backup-storage-unified.ts +0 -47
  171. package/src/models/backup.ts +0 -37
  172. package/src/models/index.ts +0 -5
  173. package/src/models/network-options.ts +0 -11
  174. package/src/utils/backup.ts +0 -152
  175. package/src/utils/index.ts +0 -5
  176. package/src/utils/logger.ts +0 -20
  177. package/src/utils/patchBigIntSerialization.ts +0 -8
  178. package/src/utils/queue.ts +0 -76
  179. package/src/utils/types.d.ts +0 -3
  180. package/src/utils/utils.ts +0 -19
  181. package/src/utils/wait.ts +0 -5
  182. package/src/utils/waitress.ts +0 -96
  183. package/src/zspec/consts.ts +0 -84
  184. package/src/zspec/enums.ts +0 -22
  185. package/src/zspec/index.ts +0 -3
  186. package/src/zspec/tstypes.ts +0 -18
  187. package/src/zspec/utils.ts +0 -247
  188. package/src/zspec/zcl/buffaloZcl.ts +0 -1220
  189. package/src/zspec/zcl/definition/cluster.ts +0 -5915
  190. package/src/zspec/zcl/definition/clusters-typegen.ts +0 -588
  191. package/src/zspec/zcl/definition/clusters-types.ts +0 -7331
  192. package/src/zspec/zcl/definition/consts.ts +0 -24
  193. package/src/zspec/zcl/definition/enums.ts +0 -203
  194. package/src/zspec/zcl/definition/foundation.ts +0 -329
  195. package/src/zspec/zcl/definition/manufacturerCode.ts +0 -729
  196. package/src/zspec/zcl/definition/status.ts +0 -69
  197. package/src/zspec/zcl/definition/tstype.ts +0 -377
  198. package/src/zspec/zcl/index.ts +0 -11
  199. package/src/zspec/zcl/utils.ts +0 -321
  200. package/src/zspec/zcl/zclFrame.ts +0 -356
  201. package/src/zspec/zcl/zclHeader.ts +0 -102
  202. package/src/zspec/zcl/zclStatusError.ts +0 -10
  203. package/src/zspec/zdo/buffaloZdo.ts +0 -2336
  204. package/src/zspec/zdo/definition/clusters.ts +0 -722
  205. package/src/zspec/zdo/definition/consts.ts +0 -16
  206. package/src/zspec/zdo/definition/enums.ts +0 -99
  207. package/src/zspec/zdo/definition/status.ts +0 -105
  208. package/src/zspec/zdo/definition/tstypes.ts +0 -1062
  209. package/src/zspec/zdo/index.ts +0 -7
  210. package/src/zspec/zdo/utils.ts +0 -76
  211. package/src/zspec/zdo/zdoStatusError.ts +0 -10
  212. package/test/adapter/adapter.test.ts +0 -1062
  213. package/test/adapter/ember/ash.test.ts +0 -337
  214. package/test/adapter/ember/consts.ts +0 -131
  215. package/test/adapter/ember/emberAdapter.test.ts +0 -3449
  216. package/test/adapter/ember/ezsp.test.ts +0 -385
  217. package/test/adapter/ember/ezspBuffalo.test.ts +0 -93
  218. package/test/adapter/ember/ezspError.test.ts +0 -12
  219. package/test/adapter/ember/math.test.ts +0 -206
  220. package/test/adapter/ezsp/frame.test.ts +0 -30
  221. package/test/adapter/ezsp/uart.test.ts +0 -181
  222. package/test/adapter/z-stack/adapter.test.ts +0 -3984
  223. package/test/adapter/z-stack/constants.test.ts +0 -33
  224. package/test/adapter/z-stack/structs.test.ts +0 -115
  225. package/test/adapter/z-stack/unpi.test.ts +0 -213
  226. package/test/adapter/z-stack/znp.test.ts +0 -1284
  227. package/test/adapter/zboss/fixZdoResponse.test.ts +0 -179
  228. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +0 -81
  229. package/test/adapter/zigate/zdo.test.ts +0 -187
  230. package/test/adapter/zoh/utils.test.ts +0 -36
  231. package/test/adapter/zoh/zohAdapter.test.ts +0 -1307
  232. package/test/benchOptions.ts +0 -14
  233. package/test/buffalo.test.ts +0 -431
  234. package/test/controller.bench.ts +0 -214
  235. package/test/controller.test.ts +0 -8702
  236. package/test/greenpower.test.ts +0 -1408
  237. package/test/mockAdapters.ts +0 -65
  238. package/test/mockDevices.ts +0 -598
  239. package/test/requests.bench.ts +0 -229
  240. package/test/testUtils.ts +0 -20
  241. package/test/tsconfig.json +0 -9
  242. package/test/utils/math.ts +0 -19
  243. package/test/utils.test.ts +0 -279
  244. package/test/vitest.config.mts +0 -26
  245. package/test/zcl.test.ts +0 -2831
  246. package/test/zspec/utils.test.ts +0 -68
  247. package/test/zspec/zcl/buffalo.test.ts +0 -1374
  248. package/test/zspec/zcl/frame.test.ts +0 -960
  249. package/test/zspec/zcl/utils.test.ts +0 -273
  250. package/test/zspec/zdo/buffalo.test.ts +0 -1850
  251. package/test/zspec/zdo/utils.test.ts +0 -241
  252. 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";