zigbee-herdsman 3.5.2 → 4.0.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 (725) hide show
  1. package/.github/workflows/ci.yml +2 -4
  2. package/.github/workflows/stale.yml +1 -1
  3. package/.release-please-manifest.json +1 -1
  4. package/.vscode/extensions.json +3 -0
  5. package/.vscode/settings.json +11 -0
  6. package/CHANGELOG.md +17 -0
  7. package/biome.json +89 -0
  8. package/dist/adapter/adapter.d.ts +11 -11
  9. package/dist/adapter/adapter.d.ts.map +1 -1
  10. package/dist/adapter/adapter.js +14 -14
  11. package/dist/adapter/adapterDiscovery.d.ts +6 -6
  12. package/dist/adapter/adapterDiscovery.d.ts.map +1 -1
  13. package/dist/adapter/adapterDiscovery.js +139 -141
  14. package/dist/adapter/adapterDiscovery.js.map +1 -1
  15. package/dist/adapter/const.d.ts +1 -1
  16. package/dist/adapter/const.js +2 -2
  17. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +16 -16
  18. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  19. package/dist/adapter/deconz/adapter/deconzAdapter.js +95 -100
  20. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  21. package/dist/adapter/deconz/driver/constants.d.ts +5 -5
  22. package/dist/adapter/deconz/driver/constants.d.ts.map +1 -1
  23. package/dist/adapter/deconz/driver/driver.d.ts +9 -9
  24. package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
  25. package/dist/adapter/deconz/driver/driver.js +112 -106
  26. package/dist/adapter/deconz/driver/driver.js.map +1 -1
  27. package/dist/adapter/deconz/driver/frame.d.ts +1 -1
  28. package/dist/adapter/deconz/driver/frame.d.ts.map +1 -1
  29. package/dist/adapter/deconz/driver/frame.js +1 -2
  30. package/dist/adapter/deconz/driver/frame.js.map +1 -1
  31. package/dist/adapter/deconz/driver/frameParser.d.ts +1 -1
  32. package/dist/adapter/deconz/driver/frameParser.d.ts.map +1 -1
  33. package/dist/adapter/deconz/driver/frameParser.js +66 -70
  34. package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
  35. package/dist/adapter/deconz/driver/parser.d.ts +1 -1
  36. package/dist/adapter/deconz/driver/parser.d.ts.map +1 -1
  37. package/dist/adapter/deconz/driver/parser.js +2 -2
  38. package/dist/adapter/deconz/driver/parser.js.map +1 -1
  39. package/dist/adapter/deconz/driver/writer.d.ts +2 -2
  40. package/dist/adapter/deconz/driver/writer.d.ts.map +1 -1
  41. package/dist/adapter/deconz/driver/writer.js +1 -1
  42. package/dist/adapter/ember/adapter/emberAdapter.d.ts +19 -19
  43. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  44. package/dist/adapter/ember/adapter/emberAdapter.js +117 -97
  45. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  46. package/dist/adapter/ember/adapter/endpoints.d.ts +1 -1
  47. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  48. package/dist/adapter/ember/adapter/oneWaitress.d.ts +5 -5
  49. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  50. package/dist/adapter/ember/adapter/oneWaitress.js +2 -2
  51. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  52. package/dist/adapter/ember/adapter/tokensManager.d.ts +3 -3
  53. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  54. package/dist/adapter/ember/adapter/tokensManager.js +20 -23
  55. package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
  56. package/dist/adapter/ember/enums.d.ts +4 -4
  57. package/dist/adapter/ember/enums.d.ts.map +1 -1
  58. package/dist/adapter/ember/enums.js +4 -6
  59. package/dist/adapter/ember/enums.js.map +1 -1
  60. package/dist/adapter/ember/ezsp/buffalo.d.ts +4 -4
  61. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +1 -1
  62. package/dist/adapter/ember/ezsp/buffalo.js +30 -32
  63. package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
  64. package/dist/adapter/ember/ezsp/ezsp.d.ts +46 -46
  65. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  66. package/dist/adapter/ember/ezsp/ezsp.js +85 -111
  67. package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
  68. package/dist/adapter/ember/ezspError.d.ts +1 -1
  69. package/dist/adapter/ember/types.d.ts +14 -14
  70. package/dist/adapter/ember/types.d.ts.map +1 -1
  71. package/dist/adapter/ember/uart/ash.d.ts +5 -5
  72. package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
  73. package/dist/adapter/ember/uart/ash.js +80 -71
  74. package/dist/adapter/ember/uart/ash.js.map +1 -1
  75. package/dist/adapter/ember/uart/parser.d.ts +2 -2
  76. package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
  77. package/dist/adapter/ember/uart/parser.js +2 -1
  78. package/dist/adapter/ember/uart/parser.js.map +1 -1
  79. package/dist/adapter/ember/uart/queues.js +27 -29
  80. package/dist/adapter/ember/uart/queues.js.map +1 -1
  81. package/dist/adapter/ember/uart/writer.d.ts +1 -1
  82. package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
  83. package/dist/adapter/ember/uart/writer.js +3 -5
  84. package/dist/adapter/ember/uart/writer.js.map +1 -1
  85. package/dist/adapter/ember/utils/initters.d.ts +2 -2
  86. package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
  87. package/dist/adapter/ember/utils/initters.js +1 -1
  88. package/dist/adapter/ember/utils/math.js +1 -1
  89. package/dist/adapter/events.d.ts +1 -1
  90. package/dist/adapter/events.d.ts.map +1 -1
  91. package/dist/adapter/ezsp/adapter/backup.d.ts +3 -3
  92. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  93. package/dist/adapter/ezsp/adapter/backup.js +8 -10
  94. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  95. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +12 -12
  96. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  97. package/dist/adapter/ezsp/adapter/ezspAdapter.js +45 -44
  98. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  99. package/dist/adapter/ezsp/driver/driver.d.ts +12 -12
  100. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  101. package/dist/adapter/ezsp/driver/driver.js +148 -141
  102. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  103. package/dist/adapter/ezsp/driver/ezsp.d.ts +7 -7
  104. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  105. package/dist/adapter/ezsp/driver/ezsp.js +61 -59
  106. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  107. package/dist/adapter/ezsp/driver/frame.js +2 -2
  108. package/dist/adapter/ezsp/driver/index.d.ts +2 -2
  109. package/dist/adapter/ezsp/driver/multicast.d.ts +8 -5
  110. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  111. package/dist/adapter/ezsp/driver/multicast.js +9 -9
  112. package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
  113. package/dist/adapter/ezsp/driver/parser.d.ts +1 -1
  114. package/dist/adapter/ezsp/driver/parser.js +3 -3
  115. package/dist/adapter/ezsp/driver/types/basic.d.ts +5 -5
  116. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +1 -1
  117. package/dist/adapter/ezsp/driver/types/basic.js +12 -33
  118. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  119. package/dist/adapter/ezsp/driver/types/index.d.ts +3 -3
  120. package/dist/adapter/ezsp/driver/types/index.d.ts.map +1 -1
  121. package/dist/adapter/ezsp/driver/types/index.js +8 -9
  122. package/dist/adapter/ezsp/driver/types/index.js.map +1 -1
  123. package/dist/adapter/ezsp/driver/types/named.d.ts +2 -2
  124. package/dist/adapter/ezsp/driver/types/named.d.ts.map +1 -1
  125. package/dist/adapter/ezsp/driver/types/named.js +8 -11
  126. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  127. package/dist/adapter/ezsp/driver/types/struct.d.ts +2 -2
  128. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +1 -1
  129. package/dist/adapter/ezsp/driver/types/struct.js +207 -214
  130. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  131. package/dist/adapter/ezsp/driver/uart.d.ts +2 -2
  132. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  133. package/dist/adapter/ezsp/driver/uart.js +48 -37
  134. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  135. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +3 -3
  136. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +1 -1
  137. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +16 -34
  138. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +1 -1
  139. package/dist/adapter/ezsp/driver/utils/index.d.ts +4 -4
  140. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +1 -1
  141. package/dist/adapter/ezsp/driver/utils/index.js +4 -4
  142. package/dist/adapter/ezsp/driver/utils/index.js.map +1 -1
  143. package/dist/adapter/ezsp/driver/writer.d.ts +1 -1
  144. package/dist/adapter/ezsp/driver/writer.js +2 -2
  145. package/dist/adapter/index.d.ts +3 -3
  146. package/dist/adapter/serialPort.d.ts +3 -3
  147. package/dist/adapter/serialPort.d.ts.map +1 -1
  148. package/dist/adapter/serialPort.js +1 -0
  149. package/dist/adapter/serialPort.js.map +1 -1
  150. package/dist/adapter/socketPortUtils.js +3 -3
  151. package/dist/adapter/tstype.d.ts +6 -6
  152. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +4 -4
  153. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  154. package/dist/adapter/z-stack/adapter/adapter-backup.js +106 -119
  155. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  156. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +10 -10
  157. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +1 -1
  158. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +23 -24
  159. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +1 -1
  160. package/dist/adapter/z-stack/adapter/manager.d.ts +6 -6
  161. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  162. package/dist/adapter/z-stack/adapter/manager.js +115 -127
  163. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  164. package/dist/adapter/z-stack/adapter/tstype.d.ts +3 -3
  165. package/dist/adapter/z-stack/adapter/tstype.js +3 -3
  166. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +10 -10
  167. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  168. package/dist/adapter/z-stack/adapter/zStackAdapter.js +125 -137
  169. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  170. package/dist/adapter/z-stack/constants/common.d.ts.map +1 -1
  171. package/dist/adapter/z-stack/constants/common.js +0 -3
  172. package/dist/adapter/z-stack/constants/common.js.map +1 -1
  173. package/dist/adapter/z-stack/constants/index.d.ts +10 -10
  174. package/dist/adapter/z-stack/constants/index.d.ts.map +1 -1
  175. package/dist/adapter/z-stack/constants/index.js +2 -2
  176. package/dist/adapter/z-stack/constants/index.js.map +1 -1
  177. package/dist/adapter/z-stack/constants/utils.d.ts +1 -1
  178. package/dist/adapter/z-stack/constants/utils.js +2 -2
  179. package/dist/adapter/z-stack/constants/utils.js.map +1 -1
  180. package/dist/adapter/z-stack/models/startup-options.d.ts +2 -2
  181. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
  182. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +1 -1
  183. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +1 -1
  184. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +4 -5
  185. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +1 -1
  186. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +2 -2
  187. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +1 -1
  188. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +3 -4
  189. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +1 -1
  190. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +1 -1
  191. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +1 -1
  192. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +1 -2
  193. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +1 -1
  194. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +2 -2
  195. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +1 -1
  196. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +3 -4
  197. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +1 -1
  198. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +1 -1
  199. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +1 -1
  200. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +6 -7
  201. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +1 -1
  202. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +2 -2
  203. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +1 -1
  204. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +3 -4
  205. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +1 -1
  206. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +1 -1
  207. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +1 -1
  208. package/dist/adapter/z-stack/structs/entries/channel-list.js +1 -2
  209. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +1 -1
  210. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +1 -1
  211. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +1 -1
  212. package/dist/adapter/z-stack/structs/entries/has-configured.js +2 -3
  213. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +1 -1
  214. package/dist/adapter/z-stack/structs/entries/index.d.ts +16 -16
  215. package/dist/adapter/z-stack/structs/entries/nib.d.ts +1 -1
  216. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +1 -1
  217. package/dist/adapter/z-stack/structs/entries/nib.js +49 -50
  218. package/dist/adapter/z-stack/structs/entries/nib.js.map +1 -1
  219. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +1 -1
  220. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +1 -1
  221. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +1 -2
  222. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +1 -1
  223. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +1 -1
  224. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +1 -1
  225. package/dist/adapter/z-stack/structs/entries/nwk-key.js +1 -2
  226. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +1 -1
  227. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +1 -1
  228. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +1 -1
  229. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +1 -2
  230. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +1 -1
  231. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +1 -1
  232. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +1 -1
  233. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +3 -4
  234. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +1 -1
  235. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +2 -2
  236. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +1 -1
  237. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +3 -4
  238. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +1 -1
  239. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +1 -1
  240. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +1 -1
  241. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +4 -5
  242. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +1 -1
  243. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +2 -2
  244. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +1 -1
  245. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +3 -4
  246. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +1 -1
  247. package/dist/adapter/z-stack/structs/index.d.ts +4 -4
  248. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +2 -2
  249. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +1 -1
  250. package/dist/adapter/z-stack/structs/struct.d.ts +8 -8
  251. package/dist/adapter/z-stack/structs/struct.d.ts.map +1 -1
  252. package/dist/adapter/z-stack/structs/struct.js +42 -43
  253. package/dist/adapter/z-stack/structs/struct.js.map +1 -1
  254. package/dist/adapter/z-stack/structs/table.d.ts +3 -3
  255. package/dist/adapter/z-stack/structs/table.d.ts.map +1 -1
  256. package/dist/adapter/z-stack/structs/table.js +10 -10
  257. package/dist/adapter/z-stack/structs/table.js.map +1 -1
  258. package/dist/adapter/z-stack/unpi/frame.d.ts +1 -1
  259. package/dist/adapter/z-stack/unpi/frame.d.ts.map +1 -1
  260. package/dist/adapter/z-stack/unpi/frame.js +2 -4
  261. package/dist/adapter/z-stack/unpi/frame.js.map +1 -1
  262. package/dist/adapter/z-stack/unpi/index.d.ts +4 -4
  263. package/dist/adapter/z-stack/unpi/parser.d.ts +1 -1
  264. package/dist/adapter/z-stack/unpi/parser.js +3 -3
  265. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  266. package/dist/adapter/z-stack/unpi/writer.d.ts +2 -2
  267. package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
  268. package/dist/adapter/z-stack/unpi/writer.js +1 -1
  269. package/dist/adapter/z-stack/utils/index.d.ts +2 -2
  270. package/dist/adapter/z-stack/utils/network-options.d.ts +1 -1
  271. package/dist/adapter/z-stack/utils/network-options.d.ts.map +1 -1
  272. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +3 -3
  273. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  274. package/dist/adapter/z-stack/znp/buffaloZnp.js +34 -20
  275. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  276. package/dist/adapter/z-stack/znp/definition.d.ts +2 -2
  277. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  278. package/dist/adapter/z-stack/znp/definition.js +1111 -1111
  279. package/dist/adapter/z-stack/znp/index.d.ts +2 -2
  280. package/dist/adapter/z-stack/znp/tstype.d.ts +7 -7
  281. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  282. package/dist/adapter/z-stack/znp/utils.d.ts +1 -1
  283. package/dist/adapter/z-stack/znp/utils.d.ts.map +1 -1
  284. package/dist/adapter/z-stack/znp/utils.js +2 -2
  285. package/dist/adapter/z-stack/znp/znp.d.ts +7 -7
  286. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  287. package/dist/adapter/z-stack/znp/znp.js +46 -45
  288. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  289. package/dist/adapter/z-stack/znp/zpiObject.d.ts +8 -8
  290. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +1 -1
  291. package/dist/adapter/z-stack/znp/zpiObject.js +6 -6
  292. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  293. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +11 -11
  294. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -1
  295. package/dist/adapter/zboss/adapter/zbossAdapter.js +37 -36
  296. package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -1
  297. package/dist/adapter/zboss/commands.d.ts +4 -6
  298. package/dist/adapter/zboss/commands.d.ts.map +1 -1
  299. package/dist/adapter/zboss/commands.js +321 -287
  300. package/dist/adapter/zboss/commands.js.map +1 -1
  301. package/dist/adapter/zboss/driver.d.ts +9 -9
  302. package/dist/adapter/zboss/driver.d.ts.map +1 -1
  303. package/dist/adapter/zboss/driver.js +25 -25
  304. package/dist/adapter/zboss/driver.js.map +1 -1
  305. package/dist/adapter/zboss/frame.d.ts +9 -9
  306. package/dist/adapter/zboss/frame.d.ts.map +1 -1
  307. package/dist/adapter/zboss/frame.js +15 -15
  308. package/dist/adapter/zboss/frame.js.map +1 -1
  309. package/dist/adapter/zboss/reader.d.ts +2 -2
  310. package/dist/adapter/zboss/reader.d.ts.map +1 -1
  311. package/dist/adapter/zboss/reader.js +6 -5
  312. package/dist/adapter/zboss/reader.js.map +1 -1
  313. package/dist/adapter/zboss/uart.d.ts +3 -3
  314. package/dist/adapter/zboss/uart.d.ts.map +1 -1
  315. package/dist/adapter/zboss/uart.js +36 -36
  316. package/dist/adapter/zboss/uart.js.map +1 -1
  317. package/dist/adapter/zboss/writer.d.ts +1 -1
  318. package/dist/adapter/zboss/writer.d.ts.map +1 -1
  319. package/dist/adapter/zboss/writer.js +3 -5
  320. package/dist/adapter/zboss/writer.js.map +1 -1
  321. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js +2 -2
  322. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js.map +1 -1
  323. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +14 -14
  324. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  325. package/dist/adapter/zigate/adapter/zigateAdapter.js +52 -53
  326. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  327. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +6 -6
  328. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  329. package/dist/adapter/zigate/driver/buffaloZiGate.js +41 -23
  330. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  331. package/dist/adapter/zigate/driver/commandType.d.ts +2 -2
  332. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  333. package/dist/adapter/zigate/driver/commandType.js +37 -37
  334. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  335. package/dist/adapter/zigate/driver/constants.d.ts +27 -200
  336. package/dist/adapter/zigate/driver/constants.d.ts.map +1 -1
  337. package/dist/adapter/zigate/driver/constants.js +40 -236
  338. package/dist/adapter/zigate/driver/constants.js.map +1 -1
  339. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  340. package/dist/adapter/zigate/driver/frame.js +4 -3
  341. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  342. package/dist/adapter/zigate/driver/messageType.d.ts +1 -1
  343. package/dist/adapter/zigate/driver/messageType.js +76 -76
  344. package/dist/adapter/zigate/driver/ziGateObject.d.ts +3 -3
  345. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  346. package/dist/adapter/zigate/driver/ziGateObject.js +7 -6
  347. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  348. package/dist/adapter/zigate/driver/zigate.d.ts +8 -8
  349. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  350. package/dist/adapter/zigate/driver/zigate.js +59 -54
  351. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  352. package/dist/adapter/zoh/adapter/utils.js +1 -1
  353. package/dist/adapter/zoh/adapter/zohAdapter.d.ts +13 -13
  354. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -1
  355. package/dist/adapter/zoh/adapter/zohAdapter.js +101 -67
  356. package/dist/adapter/zoh/adapter/zohAdapter.js.map +1 -1
  357. package/dist/buffalo/buffalo.d.ts +2 -2
  358. package/dist/buffalo/buffalo.js +4 -4
  359. package/dist/buffalo/buffalo.js.map +1 -1
  360. package/dist/buffalo/index.d.ts +1 -1
  361. package/dist/controller/controller.d.ts +7 -7
  362. package/dist/controller/controller.d.ts.map +1 -1
  363. package/dist/controller/controller.js +94 -98
  364. package/dist/controller/controller.js.map +1 -1
  365. package/dist/controller/database.d.ts +1 -1
  366. package/dist/controller/database.d.ts.map +1 -1
  367. package/dist/controller/database.js +9 -9
  368. package/dist/controller/database.js.map +1 -1
  369. package/dist/controller/events.d.ts +6 -6
  370. package/dist/controller/events.d.ts.map +1 -1
  371. package/dist/controller/greenPower.d.ts +21 -21
  372. package/dist/controller/greenPower.d.ts.map +1 -1
  373. package/dist/controller/greenPower.js +41 -41
  374. package/dist/controller/greenPower.js.map +1 -1
  375. package/dist/controller/helpers/index.d.ts +1 -1
  376. package/dist/controller/helpers/request.d.ts +2 -2
  377. package/dist/controller/helpers/request.d.ts.map +1 -1
  378. package/dist/controller/helpers/request.js +31 -27
  379. package/dist/controller/helpers/request.js.map +1 -1
  380. package/dist/controller/helpers/requestQueue.d.ts +3 -3
  381. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  382. package/dist/controller/helpers/requestQueue.js +20 -20
  383. package/dist/controller/helpers/requestQueue.js.map +1 -1
  384. package/dist/controller/helpers/zclFrameConverter.d.ts +2 -2
  385. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  386. package/dist/controller/helpers/zclFrameConverter.js +1 -1
  387. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  388. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +6 -4
  389. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +1 -1
  390. package/dist/controller/helpers/zclTransactionSequenceNumber.js +6 -5
  391. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +1 -1
  392. package/dist/controller/index.d.ts +1 -1
  393. package/dist/controller/model/device.d.ts +23 -19
  394. package/dist/controller/model/device.d.ts.map +1 -1
  395. package/dist/controller/model/device.js +153 -128
  396. package/dist/controller/model/device.js.map +1 -1
  397. package/dist/controller/model/endpoint.d.ts +11 -11
  398. package/dist/controller/model/endpoint.d.ts.map +1 -1
  399. package/dist/controller/model/endpoint.js +84 -67
  400. package/dist/controller/model/endpoint.js.map +1 -1
  401. package/dist/controller/model/entity.d.ts +3 -3
  402. package/dist/controller/model/entity.d.ts.map +1 -1
  403. package/dist/controller/model/group.d.ts +4 -4
  404. package/dist/controller/model/group.d.ts.map +1 -1
  405. package/dist/controller/model/group.js +21 -9
  406. package/dist/controller/model/group.js.map +1 -1
  407. package/dist/controller/model/index.d.ts +4 -4
  408. package/dist/controller/touchlink.d.ts +1 -1
  409. package/dist/controller/touchlink.d.ts.map +1 -1
  410. package/dist/controller/touchlink.js +11 -11
  411. package/dist/controller/tstype.d.ts +3 -3
  412. package/dist/index.d.ts +10 -10
  413. package/dist/models/backup-storage-legacy.d.ts +14 -16
  414. package/dist/models/backup-storage-legacy.d.ts.map +1 -1
  415. package/dist/models/backup-storage-unified.d.ts +1 -1
  416. package/dist/models/backup.d.ts +2 -2
  417. package/dist/models/backup.d.ts.map +1 -1
  418. package/dist/models/index.d.ts +4 -4
  419. package/dist/utils/backup.d.ts +1 -1
  420. package/dist/utils/backup.d.ts.map +1 -1
  421. package/dist/utils/backup.js +26 -26
  422. package/dist/utils/backup.js.map +1 -1
  423. package/dist/utils/index.d.ts +5 -5
  424. package/dist/utils/logger.js +3 -3
  425. package/dist/utils/patchBigIntSerialization.js +1 -1
  426. package/dist/utils/patchBigIntSerialization.js.map +1 -1
  427. package/dist/utils/queue.d.ts.map +1 -1
  428. package/dist/utils/queue.js +1 -0
  429. package/dist/utils/queue.js.map +1 -1
  430. package/dist/utils/utils.d.ts.map +1 -1
  431. package/dist/utils/utils.js +5 -4
  432. package/dist/utils/utils.js.map +1 -1
  433. package/dist/utils/waitress.d.ts +1 -1
  434. package/dist/utils/waitress.js +3 -3
  435. package/dist/zspec/consts.d.ts +1 -1
  436. package/dist/zspec/consts.d.ts.map +1 -1
  437. package/dist/zspec/consts.js +1 -1
  438. package/dist/zspec/index.d.ts +3 -3
  439. package/dist/zspec/tstypes.d.ts +1 -1
  440. package/dist/zspec/utils.d.ts +4 -4
  441. package/dist/zspec/utils.d.ts.map +1 -1
  442. package/dist/zspec/utils.js +9 -13
  443. package/dist/zspec/utils.js.map +1 -1
  444. package/dist/zspec/zcl/buffaloZcl.d.ts +3 -3
  445. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  446. package/dist/zspec/zcl/buffaloZcl.js +127 -84
  447. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  448. package/dist/zspec/zcl/definition/cluster.d.ts +1 -1
  449. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  450. package/dist/zspec/zcl/definition/cluster.js +894 -893
  451. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  452. package/dist/zspec/zcl/definition/consts.js +7 -7
  453. package/dist/zspec/zcl/definition/foundation.d.ts +3 -3
  454. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  455. package/dist/zspec/zcl/definition/foundation.js +88 -89
  456. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  457. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +1 -1
  458. package/dist/zspec/zcl/definition/manufacturerCode.js +1 -1
  459. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -1
  460. package/dist/zspec/zcl/definition/status.d.ts +3 -3
  461. package/dist/zspec/zcl/definition/status.js +3 -3
  462. package/dist/zspec/zcl/definition/tstype.d.ts +3 -3
  463. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  464. package/dist/zspec/zcl/index.d.ts +10 -10
  465. package/dist/zspec/zcl/utils.d.ts +3 -3
  466. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  467. package/dist/zspec/zcl/utils.js +18 -21
  468. package/dist/zspec/zcl/utils.js.map +1 -1
  469. package/dist/zspec/zcl/zclFrame.d.ts +7 -7
  470. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  471. package/dist/zspec/zcl/zclFrame.js +38 -41
  472. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  473. package/dist/zspec/zcl/zclHeader.d.ts +2 -2
  474. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
  475. package/dist/zspec/zcl/zclHeader.js +3 -3
  476. package/dist/zspec/zcl/zclStatusError.d.ts +1 -1
  477. package/dist/zspec/zdo/buffaloZdo.d.ts +7 -7
  478. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -1
  479. package/dist/zspec/zdo/buffaloZdo.js +4 -4
  480. package/dist/zspec/zdo/buffaloZdo.js.map +1 -1
  481. package/dist/zspec/zdo/definition/status.d.ts +1 -1
  482. package/dist/zspec/zdo/definition/status.js +1 -1
  483. package/dist/zspec/zdo/definition/tstypes.d.ts +48 -48
  484. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -1
  485. package/dist/zspec/zdo/index.d.ts +7 -7
  486. package/dist/zspec/zdo/utils.d.ts +2 -2
  487. package/dist/zspec/zdo/utils.d.ts.map +1 -1
  488. package/dist/zspec/zdo/utils.js +1 -1
  489. package/dist/zspec/zdo/utils.js.map +1 -1
  490. package/dist/zspec/zdo/zdoStatusError.d.ts +1 -1
  491. package/examples/join-and-log.js +5 -5
  492. package/package.json +4 -11
  493. package/src/adapter/adapter.ts +189 -0
  494. package/src/adapter/adapterDiscovery.ts +653 -0
  495. package/src/adapter/const.ts +12 -0
  496. package/src/adapter/deconz/adapter/deconzAdapter.ts +768 -0
  497. package/src/adapter/deconz/driver/constants.ts +180 -0
  498. package/src/adapter/deconz/driver/driver.ts +900 -0
  499. package/src/adapter/deconz/driver/frame.ts +11 -0
  500. package/src/adapter/deconz/driver/frameParser.ts +557 -0
  501. package/src/adapter/deconz/driver/parser.ts +45 -0
  502. package/src/adapter/deconz/driver/writer.ts +22 -0
  503. package/src/adapter/deconz/types.d.ts +13 -0
  504. package/src/adapter/ember/adapter/emberAdapter.ts +2266 -0
  505. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  506. package/src/adapter/ember/adapter/oneWaitress.ts +322 -0
  507. package/src/adapter/ember/adapter/tokensManager.ts +782 -0
  508. package/src/adapter/ember/consts.ts +178 -0
  509. package/src/adapter/ember/enums.ts +2123 -0
  510. package/src/adapter/ember/ezsp/buffalo.ts +1397 -0
  511. package/src/adapter/ember/ezsp/consts.ts +148 -0
  512. package/src/adapter/ember/ezsp/enums.ts +1087 -0
  513. package/src/adapter/ember/ezsp/ezsp.ts +8985 -0
  514. package/src/adapter/ember/ezspError.ts +10 -0
  515. package/src/adapter/ember/types.ts +866 -0
  516. package/src/adapter/ember/uart/ash.ts +1969 -0
  517. package/src/adapter/ember/uart/consts.ts +109 -0
  518. package/src/adapter/ember/uart/enums.ts +192 -0
  519. package/src/adapter/ember/uart/parser.ts +48 -0
  520. package/src/adapter/ember/uart/queues.ts +247 -0
  521. package/src/adapter/ember/uart/writer.ts +53 -0
  522. package/src/adapter/ember/utils/initters.ts +58 -0
  523. package/src/adapter/ember/utils/math.ts +73 -0
  524. package/src/adapter/events.ts +21 -0
  525. package/src/adapter/ezsp/adapter/backup.ts +109 -0
  526. package/src/adapter/ezsp/adapter/ezspAdapter.ts +614 -0
  527. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  528. package/src/adapter/ezsp/driver/consts.ts +11 -0
  529. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  530. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  531. package/src/adapter/ezsp/driver/frame.ts +101 -0
  532. package/src/adapter/ezsp/driver/index.ts +4 -0
  533. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  534. package/src/adapter/ezsp/driver/parser.ts +81 -0
  535. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  536. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  537. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  538. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  539. package/src/adapter/ezsp/driver/uart.ts +460 -0
  540. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  541. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  542. package/src/adapter/ezsp/driver/writer.ts +64 -0
  543. package/src/adapter/index.ts +3 -0
  544. package/src/adapter/serialPort.ts +58 -0
  545. package/src/adapter/socketPortUtils.ts +16 -0
  546. package/src/adapter/tstype.ts +78 -0
  547. package/src/adapter/z-stack/adapter/adapter-backup.ts +519 -0
  548. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  549. package/src/adapter/z-stack/adapter/endpoints.ts +57 -0
  550. package/src/adapter/z-stack/adapter/manager.ts +543 -0
  551. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  552. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1190 -0
  553. package/src/adapter/z-stack/constants/af.ts +27 -0
  554. package/src/adapter/z-stack/constants/common.ts +285 -0
  555. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  556. package/src/adapter/z-stack/constants/index.ts +11 -0
  557. package/src/adapter/z-stack/constants/mac.ts +128 -0
  558. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  559. package/src/adapter/z-stack/constants/sys.ts +72 -0
  560. package/src/adapter/z-stack/constants/util.ts +82 -0
  561. package/src/adapter/z-stack/constants/utils.ts +14 -0
  562. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  563. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  564. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  565. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  566. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  567. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  568. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  569. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  570. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  571. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  572. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  573. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  574. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  575. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  576. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  577. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  578. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  579. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  580. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  581. package/src/adapter/z-stack/structs/index.ts +4 -0
  582. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  583. package/src/adapter/z-stack/structs/struct.ts +367 -0
  584. package/src/adapter/z-stack/structs/table.ts +198 -0
  585. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  586. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  587. package/src/adapter/z-stack/unpi/index.ts +4 -0
  588. package/src/adapter/z-stack/unpi/parser.ts +56 -0
  589. package/src/adapter/z-stack/unpi/writer.ts +21 -0
  590. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  591. package/src/adapter/z-stack/utils/index.ts +2 -0
  592. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  593. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  594. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  595. package/src/adapter/z-stack/znp/index.ts +2 -0
  596. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  597. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  598. package/src/adapter/z-stack/znp/utils.ts +10 -0
  599. package/src/adapter/z-stack/znp/znp.ts +342 -0
  600. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  601. package/src/adapter/zboss/adapter/zbossAdapter.ts +527 -0
  602. package/src/adapter/zboss/commands.ts +1184 -0
  603. package/src/adapter/zboss/consts.ts +9 -0
  604. package/src/adapter/zboss/driver.ts +423 -0
  605. package/src/adapter/zboss/enums.ts +360 -0
  606. package/src/adapter/zboss/frame.ts +227 -0
  607. package/src/adapter/zboss/reader.ts +65 -0
  608. package/src/adapter/zboss/types.ts +0 -0
  609. package/src/adapter/zboss/uart.ts +428 -0
  610. package/src/adapter/zboss/utils.ts +58 -0
  611. package/src/adapter/zboss/writer.ts +49 -0
  612. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +27 -0
  613. package/src/adapter/zigate/adapter/zigateAdapter.ts +618 -0
  614. package/src/adapter/zigate/driver/LICENSE +17 -0
  615. package/src/adapter/zigate/driver/buffaloZiGate.ts +212 -0
  616. package/src/adapter/zigate/driver/commandType.ts +418 -0
  617. package/src/adapter/zigate/driver/constants.ts +150 -0
  618. package/src/adapter/zigate/driver/frame.ts +197 -0
  619. package/src/adapter/zigate/driver/messageType.ts +287 -0
  620. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  621. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  622. package/src/adapter/zigate/driver/zigate.ts +426 -0
  623. package/src/adapter/zoh/adapter/utils.ts +27 -0
  624. package/src/adapter/zoh/adapter/zohAdapter.ts +837 -0
  625. package/src/buffalo/buffalo.ts +335 -0
  626. package/src/buffalo/index.ts +1 -0
  627. package/src/controller/controller.ts +1048 -0
  628. package/src/controller/database.ts +124 -0
  629. package/src/controller/events.ts +51 -0
  630. package/src/controller/greenPower.ts +603 -0
  631. package/src/controller/helpers/index.ts +1 -0
  632. package/src/controller/helpers/request.ts +94 -0
  633. package/src/controller/helpers/requestQueue.ts +125 -0
  634. package/src/controller/helpers/zclFrameConverter.ts +51 -0
  635. package/src/controller/helpers/zclTransactionSequenceNumber.ts +19 -0
  636. package/src/controller/index.ts +6 -0
  637. package/src/controller/model/device.ts +1320 -0
  638. package/src/controller/model/endpoint.ts +1040 -0
  639. package/src/controller/model/entity.ts +23 -0
  640. package/src/controller/model/group.ts +333 -0
  641. package/src/controller/model/index.ts +4 -0
  642. package/src/controller/touchlink.ts +189 -0
  643. package/src/controller/tstype.ts +39 -0
  644. package/src/index.ts +12 -0
  645. package/src/models/backup-storage-legacy.ts +48 -0
  646. package/src/models/backup-storage-unified.ts +47 -0
  647. package/src/models/backup.ts +37 -0
  648. package/src/models/index.ts +5 -0
  649. package/src/models/network-options.ts +11 -0
  650. package/src/utils/backup.ts +152 -0
  651. package/src/utils/index.ts +5 -0
  652. package/src/utils/logger.ts +20 -0
  653. package/src/utils/patchBigIntSerialization.ts +8 -0
  654. package/src/utils/queue.ts +76 -0
  655. package/src/utils/types.d.ts +3 -0
  656. package/src/utils/utils.ts +20 -0
  657. package/src/utils/wait.ts +5 -0
  658. package/src/utils/waitress.ts +95 -0
  659. package/src/zspec/consts.ts +84 -0
  660. package/src/zspec/enums.ts +22 -0
  661. package/src/zspec/index.ts +3 -0
  662. package/src/zspec/tstypes.ts +18 -0
  663. package/src/zspec/utils.ts +308 -0
  664. package/src/zspec/zcl/buffaloZcl.ts +1133 -0
  665. package/src/zspec/zcl/definition/cluster.ts +5398 -0
  666. package/src/zspec/zcl/definition/consts.ts +24 -0
  667. package/src/zspec/zcl/definition/enums.ts +194 -0
  668. package/src/zspec/zcl/definition/foundation.ts +301 -0
  669. package/src/zspec/zcl/definition/manufacturerCode.ts +729 -0
  670. package/src/zspec/zcl/definition/status.ts +69 -0
  671. package/src/zspec/zcl/definition/tstype.ts +236 -0
  672. package/src/zspec/zcl/index.ts +10 -0
  673. package/src/zspec/zcl/utils.ts +342 -0
  674. package/src/zspec/zcl/zclFrame.ts +336 -0
  675. package/src/zspec/zcl/zclHeader.ts +102 -0
  676. package/src/zspec/zcl/zclStatusError.ts +10 -0
  677. package/src/zspec/zdo/buffaloZdo.ts +2345 -0
  678. package/src/zspec/zdo/definition/clusters.ts +722 -0
  679. package/src/zspec/zdo/definition/consts.ts +16 -0
  680. package/src/zspec/zdo/definition/enums.ts +99 -0
  681. package/src/zspec/zdo/definition/status.ts +105 -0
  682. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  683. package/src/zspec/zdo/index.ts +7 -0
  684. package/src/zspec/zdo/utils.ts +76 -0
  685. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  686. package/test/adapter/adapter.test.ts +1062 -0
  687. package/test/adapter/ember/ash.test.ts +337 -0
  688. package/test/adapter/ember/consts.ts +131 -0
  689. package/test/adapter/ember/emberAdapter.test.ts +3449 -0
  690. package/test/adapter/ember/ezsp.test.ts +386 -0
  691. package/test/adapter/ember/ezspBuffalo.test.ts +92 -0
  692. package/test/adapter/ember/ezspError.test.ts +11 -0
  693. package/test/adapter/ember/math.test.ts +205 -0
  694. package/test/adapter/ezsp/frame.test.ts +29 -0
  695. package/test/adapter/ezsp/uart.test.ts +180 -0
  696. package/test/adapter/z-stack/adapter.test.ts +3985 -0
  697. package/test/adapter/z-stack/constants.test.ts +32 -0
  698. package/test/adapter/z-stack/structs.test.ts +114 -0
  699. package/test/adapter/z-stack/unpi.test.ts +212 -0
  700. package/test/adapter/z-stack/znp.test.ts +1284 -0
  701. package/test/adapter/zboss/fixZdoResponse.test.ts +178 -0
  702. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +80 -0
  703. package/test/adapter/zigate/zdo.test.ts +187 -0
  704. package/test/adapter/zoh/utils.test.ts +35 -0
  705. package/test/adapter/zoh/zohAdapter.test.ts +1306 -0
  706. package/test/buffalo.test.ts +430 -0
  707. package/test/controller.test.ts +10005 -0
  708. package/test/greenpower.test.ts +1421 -0
  709. package/test/mockAdapters.ts +65 -0
  710. package/test/mockDevices.ts +472 -0
  711. package/test/testUtils.ts +20 -0
  712. package/test/tsconfig.json +10 -0
  713. package/test/utils/math.ts +19 -0
  714. package/test/utils.test.ts +227 -0
  715. package/test/vitest.config.mts +25 -0
  716. package/test/zcl.test.ts +2832 -0
  717. package/test/zspec/utils.test.ts +131 -0
  718. package/test/zspec/zcl/buffalo.test.ts +1231 -0
  719. package/test/zspec/zcl/frame.test.ts +925 -0
  720. package/test/zspec/zcl/utils.test.ts +280 -0
  721. package/test/zspec/zdo/buffalo.test.ts +1849 -0
  722. package/test/zspec/zdo/utils.test.ts +240 -0
  723. package/.prettierignore +0 -2
  724. package/.prettierrc +0 -26
  725. package/eslint.config.mjs +0 -32
@@ -0,0 +1,900 @@
1
+ /* v8 ignore start */
2
+
3
+ import events from "node:events";
4
+ import net from "node:net";
5
+
6
+ import slip from "slip";
7
+
8
+ import {logger} from "../../../utils/logger";
9
+ import {SerialPort} from "../../serialPort";
10
+ import SocketPortUtils from "../../socketPortUtils";
11
+ import PARAM, {type ApsDataRequest, type ParameterT, type ReceivedDataResponse, type Request} from "./constants";
12
+ import {frameParserEvents} from "./frameParser";
13
+ import Parser from "./parser";
14
+ import Writer from "./writer";
15
+
16
+ const NS = "zh:deconz:driver";
17
+
18
+ const queue: Array<Request> = [];
19
+ export const busyQueue: Array<Request> = [];
20
+ const apsQueue: Array<Request> = [];
21
+ export const apsBusyQueue: Array<Request> = [];
22
+ const apsConfirmIndQueue: Array<Request> = [];
23
+ export let readyToSend = true;
24
+
25
+ export function enableRTS(): void {
26
+ if (readyToSend === false) {
27
+ readyToSend = true;
28
+ }
29
+ }
30
+
31
+ export function disableRTS(): void {
32
+ readyToSend = false;
33
+ }
34
+
35
+ export let enableRtsTimeout: NodeJS.Timeout | undefined;
36
+
37
+ class Driver extends events.EventEmitter {
38
+ private path: string;
39
+ private serialPort?: SerialPort;
40
+ private initialized: boolean;
41
+ private writer: Writer;
42
+ private parser: Parser;
43
+ private frameParserEvent = frameParserEvents;
44
+ private seqNumber: number;
45
+ private timeoutResetTimeout?: NodeJS.Timeout;
46
+ private apsRequestFreeSlots: number;
47
+ private apsDataConfirm: number;
48
+ private apsDataIndication: number;
49
+ private configChanged: number;
50
+ private socketPort?: net.Socket;
51
+ private delay: number;
52
+ private readyToSendTimeout: number;
53
+ private handleDeviceStatusDelay: number;
54
+ private processQueues: number;
55
+ private timeoutCounter = 0;
56
+ private currentBaudRate = 0;
57
+
58
+ public constructor(path: string) {
59
+ super();
60
+ this.path = path;
61
+ this.initialized = false;
62
+ this.seqNumber = 0;
63
+ this.timeoutResetTimeout = undefined;
64
+
65
+ this.apsRequestFreeSlots = 1;
66
+ this.apsDataConfirm = 0;
67
+ this.apsDataIndication = 0;
68
+ this.configChanged = 0;
69
+ this.delay = 0;
70
+ this.readyToSendTimeout = 1;
71
+ this.handleDeviceStatusDelay = 5;
72
+ this.processQueues = 5;
73
+
74
+ this.writer = new Writer();
75
+ this.parser = new Parser();
76
+
77
+ setInterval(() => {
78
+ this.deviceStateRequest()
79
+ .then(() => {})
80
+ .catch(() => {});
81
+ }, 10000);
82
+
83
+ setInterval(
84
+ () => {
85
+ this.writeParameterRequest(0x26, 600) // reset watchdog // 10 minutes
86
+ .then(() => {})
87
+ .catch(() => {
88
+ //try again
89
+ logger.debug("try again to reset watchdog", NS);
90
+ this.writeParameterRequest(0x26, 600)
91
+ .then(() => {})
92
+ .catch(() => {
93
+ logger.debug("warning watchdog was not reset", NS);
94
+ });
95
+ });
96
+ },
97
+ 1000 * 60 * 8,
98
+ ); // 8 minutes
99
+
100
+ this.onParsed = this.onParsed.bind(this);
101
+ this.frameParserEvent.on("receivedDataNotification", (data: number) => {
102
+ this.checkDeviceStatus(data);
103
+ });
104
+
105
+ this.on("close", () => {
106
+ for (const interval of this.intervals) {
107
+ clearInterval(interval);
108
+ }
109
+ queue.length = 0;
110
+ busyQueue.length = 0;
111
+ apsQueue.length = 0;
112
+ apsBusyQueue.length = 0;
113
+ apsConfirmIndQueue.length = 0;
114
+ this.timeoutCounter = 0;
115
+ });
116
+ }
117
+
118
+ protected intervals: NodeJS.Timeout[] = [];
119
+
120
+ protected registerInterval(interval: NodeJS.Timeout): void {
121
+ this.intervals.push(interval);
122
+ }
123
+
124
+ protected async catchPromise<T>(val: Promise<T>): Promise<undefined | Awaited<T>> {
125
+ return (await Promise.resolve(val).catch((err) => logger.debug(`Promise was caught with reason: ${err}`, NS))) as undefined | Awaited<T>;
126
+ }
127
+
128
+ public setDelay(delay: number): void {
129
+ logger.debug(`Set delay to ${delay}`, NS);
130
+ this.delay = delay;
131
+ this.readyToSendTimeout = delay;
132
+ this.processQueues = delay;
133
+ this.handleDeviceStatusDelay = delay;
134
+
135
+ if (this.readyToSendTimeout === 0) {
136
+ this.readyToSendTimeout = 1;
137
+ }
138
+
139
+ if (this.processQueues < 5) {
140
+ this.processQueues = 5;
141
+ }
142
+
143
+ if (this.handleDeviceStatusDelay < 5) {
144
+ this.handleDeviceStatusDelay = 5;
145
+ }
146
+
147
+ if (this.processQueues > 60) {
148
+ this.processQueues = 60;
149
+ }
150
+
151
+ if (this.handleDeviceStatusDelay > 60) {
152
+ this.handleDeviceStatusDelay = 60;
153
+ }
154
+
155
+ this.registerInterval(
156
+ setInterval(() => {
157
+ this.processQueue();
158
+ }, this.processQueues),
159
+ ); // fire non aps requests
160
+ this.registerInterval(
161
+ setInterval(async () => {
162
+ await this.catchPromise(this.processBusyQueue());
163
+ }, this.processQueues),
164
+ ); // check timeouts for non aps requests
165
+ this.registerInterval(
166
+ setInterval(async () => {
167
+ await this.catchPromise(this.processApsQueue());
168
+ }, this.processQueues),
169
+ ); // fire aps request
170
+ this.registerInterval(
171
+ setInterval(() => {
172
+ this.processApsBusyQueue();
173
+ }, this.processQueues),
174
+ ); // check timeouts for all open aps requests
175
+ this.registerInterval(
176
+ setInterval(() => {
177
+ this.processApsConfirmIndQueue();
178
+ }, this.processQueues),
179
+ ); // fire aps indications and confirms
180
+ this.registerInterval(
181
+ setInterval(async () => {
182
+ await this.catchPromise(this.handleDeviceStatus());
183
+ }, this.handleDeviceStatusDelay),
184
+ ); // query confirm and indication requests
185
+ }
186
+
187
+ private onPortClose(): void {
188
+ logger.debug("Port closed", NS);
189
+ this.initialized = false;
190
+ this.emit("close");
191
+ }
192
+
193
+ public async open(baudrate: number): Promise<void> {
194
+ this.currentBaudRate = baudrate;
195
+ return await (SocketPortUtils.isTcpPath(this.path) ? this.openSocketPort() : this.openSerialPort(baudrate));
196
+ }
197
+
198
+ public openSerialPort(baudrate: number): Promise<void> {
199
+ logger.debug(`Opening with ${this.path}`, NS);
200
+ this.serialPort = new SerialPort({path: this.path, baudRate: baudrate, autoOpen: false}); //38400 RaspBee //115200 ConBee3
201
+
202
+ this.writer.pipe(this.serialPort);
203
+
204
+ this.serialPort.pipe(this.parser);
205
+ this.parser.on("parsed", this.onParsed);
206
+
207
+ return new Promise((resolve, reject): void => {
208
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
209
+ this.serialPort!.open((error) => {
210
+ if (error) {
211
+ reject(new Error(`Error while opening serialport '${error}'`));
212
+ this.initialized = false;
213
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
214
+ if (this.serialPort!.isOpen) {
215
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
216
+ this.serialPort!.close();
217
+ }
218
+ } else {
219
+ logger.debug("Serialport opened", NS);
220
+ this.initialized = true;
221
+ resolve();
222
+ }
223
+ });
224
+ });
225
+ }
226
+
227
+ private async openSocketPort(): Promise<void> {
228
+ const info = SocketPortUtils.parseTcpPath(this.path);
229
+ logger.debug(`Opening TCP socket with ${info.host}:${info.port}`, NS);
230
+ this.socketPort = new net.Socket();
231
+ this.socketPort.setNoDelay(true);
232
+ this.socketPort.setKeepAlive(true, 15000);
233
+
234
+ this.writer = new Writer();
235
+ this.writer.pipe(this.socketPort);
236
+
237
+ this.parser = new Parser();
238
+ this.socketPort.pipe(this.parser);
239
+ this.parser.on("parsed", this.onParsed);
240
+
241
+ return await new Promise((resolve, reject): void => {
242
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
243
+ this.socketPort!.on("connect", () => {
244
+ logger.debug("Socket connected", NS);
245
+ });
246
+
247
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
248
+ this.socketPort!.on("ready", () => {
249
+ logger.debug("Socket ready", NS);
250
+ this.initialized = true;
251
+ resolve();
252
+ });
253
+
254
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
255
+ this.socketPort!.once("close", this.onPortClose);
256
+
257
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
258
+ this.socketPort!.on("error", (error) => {
259
+ logger.error(`Socket error ${error}`, NS);
260
+ reject(new Error("Error while opening socket"));
261
+ this.initialized = false;
262
+ });
263
+
264
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
265
+ this.socketPort!.connect(info.port, info.host);
266
+ });
267
+ }
268
+
269
+ public close(): Promise<void> {
270
+ return new Promise((resolve, reject): void => {
271
+ if (this.initialized) {
272
+ if (this.serialPort) {
273
+ this.serialPort.flush((): void => {
274
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
275
+ this.serialPort!.close((error): void => {
276
+ this.initialized = false;
277
+
278
+ if (error == null) {
279
+ resolve();
280
+ } else {
281
+ reject(new Error(`Error while closing serialport '${error}'`));
282
+ }
283
+
284
+ this.emit("close");
285
+ });
286
+ });
287
+ } else {
288
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
289
+ this.socketPort!.destroy();
290
+ resolve();
291
+ }
292
+ } else {
293
+ resolve();
294
+ this.emit("close");
295
+ }
296
+ });
297
+ }
298
+
299
+ public readParameterRequest(parameterId: number): Promise<unknown> {
300
+ const seqNumber = this.nextSeqNumber();
301
+ return new Promise((resolve, reject): void => {
302
+ //logger.debug(`push read parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId}`, NS);
303
+ const ts = 0;
304
+ const commandId = PARAM.PARAM.FrameType.ReadParameter;
305
+ const req: Request = {commandId, parameterId, seqNumber, resolve, reject, ts};
306
+ queue.push(req);
307
+ });
308
+ }
309
+
310
+ public writeParameterRequest(parameterId: number, parameter: ParameterT): Promise<void> {
311
+ const seqNumber = this.nextSeqNumber();
312
+ return new Promise((resolve, reject): void => {
313
+ //logger.debug(`push write parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId} parameter: ${parameter}`, NS);
314
+ const ts = 0;
315
+ const commandId = PARAM.PARAM.FrameType.WriteParameter;
316
+ const req: Request = {commandId, parameterId, parameter, seqNumber, resolve, reject, ts};
317
+ queue.push(req);
318
+ });
319
+ }
320
+
321
+ public async writeLinkKey(ieeeAddress: string, hashedKey: Buffer): Promise<void> {
322
+ await this.writeParameterRequest(PARAM.PARAM.Network.LINK_KEY, [...this.macAddrStringToArray(ieeeAddress), ...hashedKey]);
323
+ }
324
+
325
+ public readFirmwareVersionRequest(): Promise<number[]> {
326
+ const seqNumber = this.nextSeqNumber();
327
+ return new Promise((resolve, reject): void => {
328
+ //logger.debug(`push read firmware version request to queue. seqNr: ${seqNumber}`, NS);
329
+ const ts = 0;
330
+ const commandId = PARAM.PARAM.FrameType.ReadFirmwareVersion;
331
+ const req: Request = {commandId, seqNumber, resolve, reject, ts};
332
+ queue.push(req);
333
+ });
334
+ }
335
+
336
+ private sendReadParameterRequest(parameterId: number, seqNumber: number): void {
337
+ /* command id, sequence number, 0, framelength(U16), payloadlength(U16), parameter id */
338
+ if (parameterId === PARAM.PARAM.Network.NETWORK_KEY) {
339
+ this.sendRequest(Buffer.from([PARAM.PARAM.FrameType.ReadParameter, seqNumber, 0x00, 0x09, 0x00, 0x02, 0x00, parameterId, 0x00]));
340
+ } else {
341
+ this.sendRequest(Buffer.from([PARAM.PARAM.FrameType.ReadParameter, seqNumber, 0x00, 0x08, 0x00, 0x01, 0x00, parameterId]));
342
+ }
343
+ }
344
+
345
+ private sendWriteParameterRequest(parameterId: number, value: ParameterT, seqNumber: number): void {
346
+ /* command id, sequence number, 0, framelength(U16), payloadlength(U16), parameter id, pameter */
347
+ let parameterLength = 0;
348
+ if (parameterId === PARAM.PARAM.STK.Endpoint) {
349
+ const arrayParameterValue = value as number[];
350
+ parameterLength = arrayParameterValue.length;
351
+ } else {
352
+ parameterLength = this.getLengthOfParameter(parameterId);
353
+ }
354
+ //logger.debug("SEND WRITE_PARAMETER Request - parameter id: " + parameterId + " value: " + value.toString(16) + " length: " + parameterLength, NS);
355
+
356
+ const payloadLength = 1 + parameterLength;
357
+ const frameLength = 7 + payloadLength;
358
+
359
+ const fLength1 = frameLength & 0xff;
360
+ const fLength2 = frameLength >> 8;
361
+
362
+ const pLength1 = payloadLength & 0xff;
363
+ const pLength2 = payloadLength >> 8;
364
+
365
+ if (parameterId === PARAM.PARAM.Network.NETWORK_KEY) {
366
+ this.sendRequest(
367
+ Buffer.from([PARAM.PARAM.FrameType.WriteParameter, seqNumber, 0x00, 0x19, 0x00, 0x12, 0x00, parameterId, 0x00].concat(value)),
368
+ );
369
+ } else {
370
+ this.sendRequest(
371
+ Buffer.from([
372
+ PARAM.PARAM.FrameType.WriteParameter,
373
+ seqNumber,
374
+ 0x00,
375
+ fLength1,
376
+ fLength2,
377
+ pLength1,
378
+ pLength2,
379
+ parameterId,
380
+ ...this.parameterBuffer(value, parameterLength),
381
+ ]),
382
+ );
383
+ }
384
+ }
385
+
386
+ private getLengthOfParameter(parameterId: number): number {
387
+ switch (parameterId) {
388
+ case 9:
389
+ case 16:
390
+ case 21:
391
+ case 28:
392
+ case 33:
393
+ case 36:
394
+ return 1;
395
+ case 5:
396
+ case 7:
397
+ case 34:
398
+ return 2;
399
+ case 10:
400
+ case 38:
401
+ return 4;
402
+ case 1:
403
+ case 8:
404
+ case 11:
405
+ case 14:
406
+ return 8;
407
+ case 24:
408
+ case 25:
409
+ return 16;
410
+ default:
411
+ return 0;
412
+ }
413
+ }
414
+
415
+ private parameterBuffer(parameter: ParameterT, parameterLength: number): Buffer {
416
+ if (typeof parameter === "number") {
417
+ // for parameter <= 4 Byte
418
+ if (parameterLength > 4) throw new Error("parameter to big for type number");
419
+
420
+ const buf = Buffer.alloc(parameterLength);
421
+ buf.writeUIntLE(parameter, 0, parameterLength);
422
+
423
+ return buf;
424
+ }
425
+
426
+ return Buffer.from(parameter.reverse());
427
+ }
428
+
429
+ private sendReadFirmwareVersionRequest(seqNumber: number): void {
430
+ /* command id, sequence number, 0, framelength(U16) */
431
+ this.sendRequest(Buffer.from([PARAM.PARAM.FrameType.ReadFirmwareVersion, seqNumber, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]));
432
+ }
433
+
434
+ private sendReadDeviceStateRequest(seqNumber: number): void {
435
+ /* command id, sequence number, 0, framelength(U16) */
436
+ this.sendRequest(Buffer.from([PARAM.PARAM.FrameType.ReadDeviceState, seqNumber, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00]));
437
+ }
438
+
439
+ private sendRequest(buffer: Buffer): void {
440
+ const frame = Buffer.concat([buffer, this.calcCrc(buffer)]);
441
+ const slipframe = slip.encode(frame);
442
+
443
+ // TODO: write not awaited?
444
+ if (this.serialPort) {
445
+ this.serialPort.write(slipframe, (err) => {
446
+ if (err) {
447
+ logger.debug(`Error writing serial Port: ${err.message}`, NS);
448
+ }
449
+ });
450
+ } else {
451
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
452
+ this.socketPort!.write(slipframe, (err) => {
453
+ if (err) {
454
+ logger.debug(`Error writing socket Port: ${err.message}`, NS);
455
+ }
456
+ });
457
+ }
458
+ }
459
+
460
+ private processQueue(): void {
461
+ if (queue.length === 0) {
462
+ return;
463
+ }
464
+ if (busyQueue.length > 0) {
465
+ return;
466
+ }
467
+
468
+ const req = queue.shift();
469
+
470
+ if (req) {
471
+ req.ts = Date.now();
472
+
473
+ switch (req.commandId) {
474
+ case PARAM.PARAM.FrameType.ReadParameter:
475
+ logger.debug(`send read parameter request from queue. seqNr: ${req.seqNumber} paramId: ${req.parameterId}`, NS);
476
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
477
+ this.sendReadParameterRequest(req.parameterId!, req.seqNumber);
478
+ break;
479
+ case PARAM.PARAM.FrameType.WriteParameter:
480
+ logger.debug(
481
+ `send write parameter request from queue. seqNr: ${req.seqNumber} paramId: ${req.parameterId} param: ${req.parameter}`,
482
+ NS,
483
+ );
484
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
485
+ this.sendWriteParameterRequest(req.parameterId!, req.parameter!, req.seqNumber);
486
+ break;
487
+ case PARAM.PARAM.FrameType.ReadFirmwareVersion:
488
+ logger.debug(`send read firmware version request from queue. seqNr: ${req.seqNumber}`, NS);
489
+ this.sendReadFirmwareVersionRequest(req.seqNumber);
490
+ break;
491
+ case PARAM.PARAM.FrameType.ReadDeviceState:
492
+ logger.debug(`send read device state from queue. seqNr: ${req.seqNumber}`, NS);
493
+ this.sendReadDeviceStateRequest(req.seqNumber);
494
+ break;
495
+ case PARAM.PARAM.NetworkState.CHANGE_NETWORK_STATE:
496
+ logger.debug(`send change network state request from queue. seqNr: ${req.seqNumber}`, NS);
497
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
498
+ this.sendChangeNetworkStateRequest(req.seqNumber, req.networkState!);
499
+ break;
500
+ default:
501
+ throw new Error("process queue - unknown command id");
502
+ }
503
+
504
+ busyQueue.push(req);
505
+ }
506
+ }
507
+
508
+ private async processBusyQueue(): Promise<void> {
509
+ let i = busyQueue.length;
510
+ while (i--) {
511
+ const req: Request = busyQueue[i];
512
+ const now = Date.now();
513
+
514
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
515
+ if (now - req.ts! > 10000) {
516
+ logger.debug(`Timeout for request - CMD: 0x${req.commandId.toString(16)} seqNr: ${req.seqNumber}`, NS);
517
+ //remove from busyQueue
518
+ busyQueue.splice(i, 1);
519
+ this.timeoutCounter++;
520
+ // after a timeout the timeoutcounter will be reset after 1 min. If another timeout happen then the timeoutcounter
521
+ // will not be reset
522
+ clearTimeout(this.timeoutResetTimeout);
523
+ this.timeoutResetTimeout = undefined;
524
+ this.resetTimeoutCounterAfter1min();
525
+ req.reject(new Error("TIMEOUT"));
526
+ if (this.timeoutCounter >= 2) {
527
+ this.timeoutCounter = 0;
528
+ logger.debug("too many timeouts - restart serial connecion", NS);
529
+ if (this.serialPort?.isOpen) {
530
+ this.serialPort.close();
531
+ }
532
+ if (this.socketPort) {
533
+ this.socketPort.destroy();
534
+ }
535
+ await this.open(this.currentBaudRate);
536
+ }
537
+ }
538
+ }
539
+ }
540
+
541
+ public changeNetworkStateRequest(networkState: number): Promise<void> {
542
+ const seqNumber = this.nextSeqNumber();
543
+ return new Promise((resolve, reject): void => {
544
+ //logger.debug(`push change network state request to apsQueue. seqNr: ${seqNumber}`, NS);
545
+ const ts = 0;
546
+ const commandId = PARAM.PARAM.NetworkState.CHANGE_NETWORK_STATE;
547
+ const req: Request = {commandId, networkState, seqNumber, resolve, reject, ts};
548
+ queue.push(req);
549
+ });
550
+ }
551
+
552
+ private sendChangeNetworkStateRequest(seqNumber: number, networkState: number): void {
553
+ this.sendRequest(Buffer.from([PARAM.PARAM.NetworkState.CHANGE_NETWORK_STATE, seqNumber, 0x00, 0x06, 0x00, networkState]));
554
+ }
555
+
556
+ private async deviceStateRequest(): Promise<void> {
557
+ const seqNumber = this.nextSeqNumber();
558
+ return await new Promise((resolve, reject): void => {
559
+ //logger.debug(`DEVICE_STATE Request - seqNr: ${seqNumber}`, NS);
560
+ const ts = 0;
561
+ const commandId = PARAM.PARAM.FrameType.ReadDeviceState;
562
+ const req: Request = {commandId, seqNumber, resolve, reject, ts};
563
+ queue.push(req);
564
+ });
565
+ }
566
+
567
+ private checkDeviceStatus(currentDeviceStatus: number): void {
568
+ const networkState = currentDeviceStatus & 0x03;
569
+ this.apsDataConfirm = (currentDeviceStatus >> 2) & 0x01;
570
+ this.apsDataIndication = (currentDeviceStatus >> 3) & 0x01;
571
+ this.configChanged = (currentDeviceStatus >> 4) & 0x01;
572
+ this.apsRequestFreeSlots = (currentDeviceStatus >> 5) & 0x01;
573
+
574
+ logger.debug(
575
+ `networkstate: ${networkState} apsDataConfirm: ${this.apsDataConfirm} apsDataIndication: ${this.apsDataIndication} configChanged: ${this.configChanged} apsRequestFreeSlots: ${this.apsRequestFreeSlots}`,
576
+ NS,
577
+ );
578
+ }
579
+
580
+ private async handleDeviceStatus(): Promise<void> {
581
+ if (this.apsDataConfirm === 1) {
582
+ try {
583
+ logger.debug("query aps data confirm", NS);
584
+ this.apsDataConfirm = 0;
585
+ await this.querySendDataStateRequest();
586
+ } catch (error) {
587
+ // @ts-expect-error TODO: this doesn't look right?
588
+ if (error.status === 5) {
589
+ this.apsDataConfirm = 0;
590
+ }
591
+ }
592
+ }
593
+ if (this.apsDataIndication === 1) {
594
+ try {
595
+ logger.debug("query aps data indication", NS);
596
+ this.apsDataIndication = 0;
597
+ await this.readReceivedDataRequest();
598
+ } catch (error) {
599
+ // @ts-expect-error TODO: this doesn't look right?
600
+ if (error.status === 5) {
601
+ this.apsDataIndication = 0;
602
+ }
603
+ }
604
+ }
605
+ if (this.configChanged === 1) {
606
+ // when network settings changed
607
+ }
608
+ }
609
+
610
+ // DATA_IND
611
+ private readReceivedDataRequest(): Promise<void> {
612
+ const seqNumber = this.nextSeqNumber();
613
+ return new Promise((resolve, reject): void => {
614
+ //logger.debug(`push read received data request to apsQueue. seqNr: ${seqNumber}`, NS);
615
+ const ts = 0;
616
+ const commandId = PARAM.PARAM.APS.DATA_INDICATION;
617
+ const req: Request = {commandId, seqNumber, resolve, reject, ts};
618
+ apsConfirmIndQueue.push(req);
619
+ });
620
+ }
621
+
622
+ // DATA_REQ
623
+ public enqueueSendDataRequest(request: ApsDataRequest): Promise<undefined | ReceivedDataResponse> {
624
+ const seqNumber = this.nextSeqNumber();
625
+ return new Promise((resolve, reject): void => {
626
+ //logger.debug(`push enqueue send data request to apsQueue. seqNr: ${seqNumber}`, NS);
627
+ const ts = 0;
628
+ const commandId = PARAM.PARAM.APS.DATA_REQUEST;
629
+ const req: Request = {commandId, seqNumber, request, resolve, reject, ts};
630
+ apsQueue.push(req);
631
+ });
632
+ }
633
+
634
+ // DATA_CONF
635
+ private querySendDataStateRequest(): Promise<void> {
636
+ const seqNumber = this.nextSeqNumber();
637
+ return new Promise((resolve, reject): void => {
638
+ //logger.debug(`push query send data state request to apsQueue. seqNr: ${seqNumber}`, NS);
639
+ const ts = 0;
640
+ const commandId = PARAM.PARAM.APS.DATA_CONFIRM;
641
+ const req: Request = {commandId, seqNumber, resolve, reject, ts};
642
+ apsConfirmIndQueue.push(req);
643
+ });
644
+ }
645
+
646
+ private async processApsQueue(): Promise<void> {
647
+ if (apsQueue.length === 0) {
648
+ return;
649
+ }
650
+
651
+ if (this.apsRequestFreeSlots !== 1) {
652
+ logger.debug("no free slots. Delay sending of APS Request", NS);
653
+ await this.sleep(1000);
654
+ return;
655
+ }
656
+
657
+ const req = apsQueue.shift();
658
+
659
+ if (req) {
660
+ req.ts = Date.now();
661
+
662
+ switch (req.commandId) {
663
+ case PARAM.PARAM.APS.DATA_REQUEST:
664
+ if (readyToSend === false) {
665
+ // wait until last request was confirmed or given time elapsed
666
+ logger.debug("delay sending of APS Request", NS);
667
+ apsQueue.unshift(req);
668
+ break;
669
+ }
670
+
671
+ disableRTS();
672
+ enableRtsTimeout = setTimeout(() => {
673
+ enableRTS();
674
+ }, this.readyToSendTimeout);
675
+ apsBusyQueue.push(req);
676
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
677
+ this.sendEnqueueSendDataRequest(req.request!, req.seqNumber);
678
+ break;
679
+ default:
680
+ throw new Error("process APS queue - unknown command id");
681
+ }
682
+ }
683
+ }
684
+
685
+ private processApsConfirmIndQueue(): void {
686
+ if (apsConfirmIndQueue.length === 0) {
687
+ return;
688
+ }
689
+
690
+ const req = apsConfirmIndQueue.shift();
691
+
692
+ if (req) {
693
+ req.ts = Date.now();
694
+
695
+ apsBusyQueue.push(req);
696
+
697
+ switch (req.commandId) {
698
+ case PARAM.PARAM.APS.DATA_INDICATION:
699
+ //logger.debug(`read received data request. seqNr: ${req.seqNumber}`, NS);
700
+ if (this.delay === 0) {
701
+ this.sendReadReceivedDataRequest(req.seqNumber);
702
+ } else {
703
+ this.sendReadReceivedDataRequest(req.seqNumber);
704
+ }
705
+ break;
706
+ case PARAM.PARAM.APS.DATA_CONFIRM:
707
+ //logger.debug(`query send data state request. seqNr: ${req.seqNumber}`, NS);
708
+ if (this.delay === 0) {
709
+ this.sendQueryDataStateRequest(req.seqNumber);
710
+ } else {
711
+ this.sendQueryDataStateRequest(req.seqNumber);
712
+ }
713
+ break;
714
+ default:
715
+ throw new Error("process APS Confirm/Ind queue - unknown command id");
716
+ }
717
+ }
718
+ }
719
+
720
+ private sendQueryDataStateRequest(seqNumber: number): void {
721
+ logger.debug(`DATA_CONFIRM - sending data state request - SeqNr. ${seqNumber}`, NS);
722
+ this.sendRequest(Buffer.from([PARAM.PARAM.APS.DATA_CONFIRM, seqNumber, 0x00, 0x07, 0x00, 0x00, 0x00]));
723
+ }
724
+
725
+ private sendReadReceivedDataRequest(seqNumber: number): void {
726
+ logger.debug(`DATA_INDICATION - sending read data request - SeqNr. ${seqNumber}`, NS);
727
+ // payloadlength = 0, flag = none
728
+ this.sendRequest(Buffer.from([PARAM.PARAM.APS.DATA_INDICATION, seqNumber, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01]));
729
+ }
730
+
731
+ private sendEnqueueSendDataRequest(request: ApsDataRequest, seqNumber: number): void {
732
+ const payloadLength =
733
+ 12 +
734
+ (request.destAddrMode === PARAM.PARAM.addressMode.GROUP_ADDR ? 2 : request.destAddrMode === PARAM.PARAM.addressMode.NWK_ADDR ? 3 : 9) +
735
+ request.asduLength;
736
+ const frameLength = 7 + payloadLength;
737
+ const cid1 = request.clusterId & 0xff;
738
+ const cid2 = (request.clusterId >> 8) & 0xff;
739
+ const asdul1 = request.asduLength & 0xff;
740
+ const asdul2 = (request.asduLength >> 8) & 0xff;
741
+ let destArray: Array<number> = [];
742
+ let dest = "";
743
+
744
+ if (request.destAddr16 !== undefined) {
745
+ destArray[0] = request.destAddr16 & 0xff;
746
+ destArray[1] = (request.destAddr16 >> 8) & 0xff;
747
+ dest = request.destAddr16.toString(16);
748
+ }
749
+ if (request.destAddr64 !== undefined) {
750
+ dest = request.destAddr64;
751
+ destArray = this.macAddrStringToArray(request.destAddr64);
752
+ }
753
+ if (request.destEndpoint !== undefined) {
754
+ destArray.push(request.destEndpoint);
755
+ dest += " EP:";
756
+ dest += request.destEndpoint;
757
+ }
758
+
759
+ logger.debug(`DATA_REQUEST - destAddr: 0x${dest} SeqNr. ${seqNumber} request id: ${request.requestId}`, NS);
760
+
761
+ this.sendRequest(
762
+ Buffer.from([
763
+ PARAM.PARAM.APS.DATA_REQUEST,
764
+ seqNumber,
765
+ 0x00,
766
+ frameLength & 0xff,
767
+ (frameLength >> 8) & 0xff,
768
+ payloadLength & 0xff,
769
+ (payloadLength >> 8) & 0xff,
770
+ request.requestId,
771
+ 0x00,
772
+ request.destAddrMode,
773
+ ...destArray,
774
+ request.profileId & 0xff,
775
+ (request.profileId >> 8) & 0xff,
776
+ cid1,
777
+ cid2,
778
+ request.srcEndpoint,
779
+ asdul1,
780
+ asdul2,
781
+ ...request.asduPayload,
782
+ request.txOptions,
783
+ request.radius,
784
+ ]),
785
+ );
786
+ }
787
+
788
+ private processApsBusyQueue(): void {
789
+ let i = apsBusyQueue.length;
790
+ while (i--) {
791
+ const req = apsBusyQueue[i];
792
+ const now = Date.now();
793
+ let timeout = 60000;
794
+ if (req.request != null && req.request.timeout != null) {
795
+ timeout = req.request.timeout * 1000; // seconds * 1000 = milliseconds
796
+ }
797
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
798
+ if (now - req.ts! > timeout) {
799
+ logger.debug(`Timeout for aps request CMD: 0x${req.commandId.toString(16)} seq: ${req.seqNumber}`, NS);
800
+ //remove from busyQueue
801
+ apsBusyQueue.splice(i, 1);
802
+ req.reject(new Error("APS TIMEOUT"));
803
+ }
804
+ }
805
+ }
806
+
807
+ private calcCrc(buffer: Uint8Array): Buffer {
808
+ let crc = 0;
809
+ for (let i = 0; i < buffer.length; i++) {
810
+ crc += buffer[i];
811
+ }
812
+ const crc0 = (~crc + 1) & 0xff;
813
+ const crc1 = ((~crc + 1) >> 8) & 0xff;
814
+ return Buffer.from([crc0, crc1]);
815
+ }
816
+
817
+ public macAddrStringToArray(addr: string): Array<number> {
818
+ if (addr.indexOf("0x") === 0) {
819
+ addr = addr.slice(2, addr.length);
820
+ }
821
+ if (addr.length < 16) {
822
+ for (let l = 0; l < 16 - addr.length; l++) {
823
+ addr = `0${addr}`;
824
+ }
825
+ }
826
+ const result = new Array<number>();
827
+ let y = 0;
828
+ for (let i = 0; i < 8; i++) {
829
+ result[i] = Number.parseInt(addr.substr(y, 2), 16);
830
+ y += 2;
831
+ }
832
+ const reverse = result.reverse();
833
+ return reverse;
834
+ }
835
+
836
+ public macAddrArrayToString(addr: Array<number>): string {
837
+ if (addr.length !== 8) {
838
+ throw new Error(`invalid array length for MAC address: ${addr.length}`);
839
+ }
840
+
841
+ let result = "0x";
842
+ let char = "";
843
+ let i = 8;
844
+ while (i--) {
845
+ char = addr[i].toString(16);
846
+ if (char.length < 2) {
847
+ char = `0${char}`;
848
+ }
849
+ result += char;
850
+ }
851
+ return result;
852
+ }
853
+
854
+ /**
855
+ * generalArrayToString result is not reversed!
856
+ */
857
+ public generalArrayToString(key: Array<number>, length: number): string {
858
+ let result = "0x";
859
+ let char = "";
860
+ let i = 0;
861
+ while (i < length) {
862
+ char = key[i].toString(16);
863
+ if (char.length < 2) {
864
+ char = `0${char}`;
865
+ }
866
+ result += char;
867
+ i++;
868
+ }
869
+ return result;
870
+ }
871
+
872
+ private nextSeqNumber(): number {
873
+ this.seqNumber++;
874
+
875
+ if (this.seqNumber > 254) {
876
+ this.seqNumber = 1;
877
+ }
878
+
879
+ return this.seqNumber;
880
+ }
881
+
882
+ private onParsed(frame: Uint8Array): void {
883
+ this.emit("rxFrame", frame);
884
+ }
885
+
886
+ private sleep(ms: number): Promise<void> {
887
+ return new Promise((resolve) => setTimeout(resolve, ms));
888
+ }
889
+
890
+ private resetTimeoutCounterAfter1min(): void {
891
+ if (this.timeoutResetTimeout === undefined) {
892
+ this.timeoutResetTimeout = setTimeout(() => {
893
+ this.timeoutCounter = 0;
894
+ this.timeoutResetTimeout = undefined;
895
+ }, 60000);
896
+ }
897
+ }
898
+ }
899
+
900
+ export default Driver;