zigbee-herdsman 3.5.1 → 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 (726) hide show
  1. package/.github/dependabot.yml +9 -3
  2. package/.github/workflows/ci.yml +2 -4
  3. package/.github/workflows/stale.yml +1 -1
  4. package/.release-please-manifest.json +1 -1
  5. package/.vscode/extensions.json +3 -0
  6. package/.vscode/settings.json +11 -0
  7. package/CHANGELOG.md +25 -0
  8. package/biome.json +89 -0
  9. package/dist/adapter/adapter.d.ts +11 -11
  10. package/dist/adapter/adapter.d.ts.map +1 -1
  11. package/dist/adapter/adapter.js +14 -14
  12. package/dist/adapter/adapterDiscovery.d.ts +6 -6
  13. package/dist/adapter/adapterDiscovery.d.ts.map +1 -1
  14. package/dist/adapter/adapterDiscovery.js +139 -141
  15. package/dist/adapter/adapterDiscovery.js.map +1 -1
  16. package/dist/adapter/const.d.ts +1 -1
  17. package/dist/adapter/const.js +2 -2
  18. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +16 -16
  19. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  20. package/dist/adapter/deconz/adapter/deconzAdapter.js +95 -100
  21. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  22. package/dist/adapter/deconz/driver/constants.d.ts +5 -5
  23. package/dist/adapter/deconz/driver/constants.d.ts.map +1 -1
  24. package/dist/adapter/deconz/driver/driver.d.ts +9 -9
  25. package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
  26. package/dist/adapter/deconz/driver/driver.js +112 -106
  27. package/dist/adapter/deconz/driver/driver.js.map +1 -1
  28. package/dist/adapter/deconz/driver/frame.d.ts +1 -1
  29. package/dist/adapter/deconz/driver/frame.d.ts.map +1 -1
  30. package/dist/adapter/deconz/driver/frame.js +1 -2
  31. package/dist/adapter/deconz/driver/frame.js.map +1 -1
  32. package/dist/adapter/deconz/driver/frameParser.d.ts +1 -1
  33. package/dist/adapter/deconz/driver/frameParser.d.ts.map +1 -1
  34. package/dist/adapter/deconz/driver/frameParser.js +66 -70
  35. package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
  36. package/dist/adapter/deconz/driver/parser.d.ts +1 -1
  37. package/dist/adapter/deconz/driver/parser.d.ts.map +1 -1
  38. package/dist/adapter/deconz/driver/parser.js +2 -2
  39. package/dist/adapter/deconz/driver/parser.js.map +1 -1
  40. package/dist/adapter/deconz/driver/writer.d.ts +2 -2
  41. package/dist/adapter/deconz/driver/writer.d.ts.map +1 -1
  42. package/dist/adapter/deconz/driver/writer.js +1 -1
  43. package/dist/adapter/ember/adapter/emberAdapter.d.ts +19 -19
  44. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  45. package/dist/adapter/ember/adapter/emberAdapter.js +117 -97
  46. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  47. package/dist/adapter/ember/adapter/endpoints.d.ts +1 -1
  48. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  49. package/dist/adapter/ember/adapter/oneWaitress.d.ts +5 -5
  50. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  51. package/dist/adapter/ember/adapter/oneWaitress.js +2 -2
  52. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  53. package/dist/adapter/ember/adapter/tokensManager.d.ts +3 -3
  54. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  55. package/dist/adapter/ember/adapter/tokensManager.js +20 -23
  56. package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
  57. package/dist/adapter/ember/enums.d.ts +4 -4
  58. package/dist/adapter/ember/enums.d.ts.map +1 -1
  59. package/dist/adapter/ember/enums.js +4 -6
  60. package/dist/adapter/ember/enums.js.map +1 -1
  61. package/dist/adapter/ember/ezsp/buffalo.d.ts +4 -4
  62. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +1 -1
  63. package/dist/adapter/ember/ezsp/buffalo.js +30 -32
  64. package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
  65. package/dist/adapter/ember/ezsp/ezsp.d.ts +46 -46
  66. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  67. package/dist/adapter/ember/ezsp/ezsp.js +85 -111
  68. package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
  69. package/dist/adapter/ember/ezspError.d.ts +1 -1
  70. package/dist/adapter/ember/types.d.ts +14 -14
  71. package/dist/adapter/ember/types.d.ts.map +1 -1
  72. package/dist/adapter/ember/uart/ash.d.ts +5 -5
  73. package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
  74. package/dist/adapter/ember/uart/ash.js +80 -71
  75. package/dist/adapter/ember/uart/ash.js.map +1 -1
  76. package/dist/adapter/ember/uart/parser.d.ts +2 -2
  77. package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
  78. package/dist/adapter/ember/uart/parser.js +2 -1
  79. package/dist/adapter/ember/uart/parser.js.map +1 -1
  80. package/dist/adapter/ember/uart/queues.js +27 -29
  81. package/dist/adapter/ember/uart/queues.js.map +1 -1
  82. package/dist/adapter/ember/uart/writer.d.ts +1 -1
  83. package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
  84. package/dist/adapter/ember/uart/writer.js +3 -5
  85. package/dist/adapter/ember/uart/writer.js.map +1 -1
  86. package/dist/adapter/ember/utils/initters.d.ts +2 -2
  87. package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
  88. package/dist/adapter/ember/utils/initters.js +1 -1
  89. package/dist/adapter/ember/utils/math.js +1 -1
  90. package/dist/adapter/events.d.ts +1 -1
  91. package/dist/adapter/events.d.ts.map +1 -1
  92. package/dist/adapter/ezsp/adapter/backup.d.ts +3 -3
  93. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  94. package/dist/adapter/ezsp/adapter/backup.js +8 -10
  95. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  96. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +12 -12
  97. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  98. package/dist/adapter/ezsp/adapter/ezspAdapter.js +45 -44
  99. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  100. package/dist/adapter/ezsp/driver/driver.d.ts +12 -12
  101. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  102. package/dist/adapter/ezsp/driver/driver.js +148 -141
  103. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  104. package/dist/adapter/ezsp/driver/ezsp.d.ts +7 -7
  105. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  106. package/dist/adapter/ezsp/driver/ezsp.js +61 -59
  107. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  108. package/dist/adapter/ezsp/driver/frame.js +2 -2
  109. package/dist/adapter/ezsp/driver/index.d.ts +2 -2
  110. package/dist/adapter/ezsp/driver/multicast.d.ts +8 -5
  111. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  112. package/dist/adapter/ezsp/driver/multicast.js +9 -9
  113. package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
  114. package/dist/adapter/ezsp/driver/parser.d.ts +1 -1
  115. package/dist/adapter/ezsp/driver/parser.js +3 -3
  116. package/dist/adapter/ezsp/driver/types/basic.d.ts +5 -5
  117. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +1 -1
  118. package/dist/adapter/ezsp/driver/types/basic.js +12 -33
  119. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  120. package/dist/adapter/ezsp/driver/types/index.d.ts +3 -3
  121. package/dist/adapter/ezsp/driver/types/index.d.ts.map +1 -1
  122. package/dist/adapter/ezsp/driver/types/index.js +8 -9
  123. package/dist/adapter/ezsp/driver/types/index.js.map +1 -1
  124. package/dist/adapter/ezsp/driver/types/named.d.ts +2 -2
  125. package/dist/adapter/ezsp/driver/types/named.d.ts.map +1 -1
  126. package/dist/adapter/ezsp/driver/types/named.js +8 -11
  127. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  128. package/dist/adapter/ezsp/driver/types/struct.d.ts +2 -2
  129. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +1 -1
  130. package/dist/adapter/ezsp/driver/types/struct.js +207 -214
  131. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  132. package/dist/adapter/ezsp/driver/uart.d.ts +2 -2
  133. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  134. package/dist/adapter/ezsp/driver/uart.js +48 -37
  135. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  136. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +3 -3
  137. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +1 -1
  138. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +16 -34
  139. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +1 -1
  140. package/dist/adapter/ezsp/driver/utils/index.d.ts +4 -4
  141. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +1 -1
  142. package/dist/adapter/ezsp/driver/utils/index.js +4 -4
  143. package/dist/adapter/ezsp/driver/utils/index.js.map +1 -1
  144. package/dist/adapter/ezsp/driver/writer.d.ts +1 -1
  145. package/dist/adapter/ezsp/driver/writer.js +2 -2
  146. package/dist/adapter/index.d.ts +3 -3
  147. package/dist/adapter/serialPort.d.ts +3 -3
  148. package/dist/adapter/serialPort.d.ts.map +1 -1
  149. package/dist/adapter/serialPort.js +1 -0
  150. package/dist/adapter/serialPort.js.map +1 -1
  151. package/dist/adapter/socketPortUtils.js +3 -3
  152. package/dist/adapter/tstype.d.ts +6 -6
  153. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +4 -4
  154. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  155. package/dist/adapter/z-stack/adapter/adapter-backup.js +106 -119
  156. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  157. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +10 -10
  158. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +1 -1
  159. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +23 -24
  160. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +1 -1
  161. package/dist/adapter/z-stack/adapter/manager.d.ts +6 -6
  162. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  163. package/dist/adapter/z-stack/adapter/manager.js +115 -127
  164. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  165. package/dist/adapter/z-stack/adapter/tstype.d.ts +3 -3
  166. package/dist/adapter/z-stack/adapter/tstype.js +3 -3
  167. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +10 -10
  168. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  169. package/dist/adapter/z-stack/adapter/zStackAdapter.js +125 -137
  170. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  171. package/dist/adapter/z-stack/constants/common.d.ts.map +1 -1
  172. package/dist/adapter/z-stack/constants/common.js +0 -3
  173. package/dist/adapter/z-stack/constants/common.js.map +1 -1
  174. package/dist/adapter/z-stack/constants/index.d.ts +10 -10
  175. package/dist/adapter/z-stack/constants/index.d.ts.map +1 -1
  176. package/dist/adapter/z-stack/constants/index.js +2 -2
  177. package/dist/adapter/z-stack/constants/index.js.map +1 -1
  178. package/dist/adapter/z-stack/constants/utils.d.ts +1 -1
  179. package/dist/adapter/z-stack/constants/utils.js +2 -2
  180. package/dist/adapter/z-stack/constants/utils.js.map +1 -1
  181. package/dist/adapter/z-stack/models/startup-options.d.ts +2 -2
  182. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
  183. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +1 -1
  184. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +1 -1
  185. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +4 -5
  186. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +1 -1
  187. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +2 -2
  188. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +1 -1
  189. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +3 -4
  190. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +1 -1
  191. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +1 -1
  192. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +1 -1
  193. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +1 -2
  194. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +1 -1
  195. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +2 -2
  196. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +1 -1
  197. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +3 -4
  198. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +1 -1
  199. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +1 -1
  200. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +1 -1
  201. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +6 -7
  202. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +1 -1
  203. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +2 -2
  204. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +1 -1
  205. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +3 -4
  206. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +1 -1
  207. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +1 -1
  208. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +1 -1
  209. package/dist/adapter/z-stack/structs/entries/channel-list.js +1 -2
  210. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +1 -1
  211. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +1 -1
  212. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +1 -1
  213. package/dist/adapter/z-stack/structs/entries/has-configured.js +2 -3
  214. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +1 -1
  215. package/dist/adapter/z-stack/structs/entries/index.d.ts +16 -16
  216. package/dist/adapter/z-stack/structs/entries/nib.d.ts +1 -1
  217. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +1 -1
  218. package/dist/adapter/z-stack/structs/entries/nib.js +49 -50
  219. package/dist/adapter/z-stack/structs/entries/nib.js.map +1 -1
  220. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +1 -1
  221. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +1 -1
  222. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +1 -2
  223. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +1 -1
  224. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +1 -1
  225. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +1 -1
  226. package/dist/adapter/z-stack/structs/entries/nwk-key.js +1 -2
  227. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +1 -1
  228. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +1 -1
  229. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +1 -1
  230. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +1 -2
  231. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +1 -1
  232. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +1 -1
  233. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +1 -1
  234. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +3 -4
  235. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +1 -1
  236. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +2 -2
  237. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +1 -1
  238. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +3 -4
  239. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +1 -1
  240. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +1 -1
  241. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +1 -1
  242. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +4 -5
  243. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +1 -1
  244. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +2 -2
  245. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +1 -1
  246. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +3 -4
  247. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +1 -1
  248. package/dist/adapter/z-stack/structs/index.d.ts +4 -4
  249. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +2 -2
  250. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +1 -1
  251. package/dist/adapter/z-stack/structs/struct.d.ts +8 -8
  252. package/dist/adapter/z-stack/structs/struct.d.ts.map +1 -1
  253. package/dist/adapter/z-stack/structs/struct.js +42 -43
  254. package/dist/adapter/z-stack/structs/struct.js.map +1 -1
  255. package/dist/adapter/z-stack/structs/table.d.ts +3 -3
  256. package/dist/adapter/z-stack/structs/table.d.ts.map +1 -1
  257. package/dist/adapter/z-stack/structs/table.js +10 -10
  258. package/dist/adapter/z-stack/structs/table.js.map +1 -1
  259. package/dist/adapter/z-stack/unpi/frame.d.ts +1 -1
  260. package/dist/adapter/z-stack/unpi/frame.d.ts.map +1 -1
  261. package/dist/adapter/z-stack/unpi/frame.js +2 -4
  262. package/dist/adapter/z-stack/unpi/frame.js.map +1 -1
  263. package/dist/adapter/z-stack/unpi/index.d.ts +4 -4
  264. package/dist/adapter/z-stack/unpi/parser.d.ts +1 -1
  265. package/dist/adapter/z-stack/unpi/parser.js +3 -3
  266. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  267. package/dist/adapter/z-stack/unpi/writer.d.ts +2 -2
  268. package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
  269. package/dist/adapter/z-stack/unpi/writer.js +1 -1
  270. package/dist/adapter/z-stack/utils/index.d.ts +2 -2
  271. package/dist/adapter/z-stack/utils/network-options.d.ts +1 -1
  272. package/dist/adapter/z-stack/utils/network-options.d.ts.map +1 -1
  273. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +3 -3
  274. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  275. package/dist/adapter/z-stack/znp/buffaloZnp.js +34 -20
  276. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  277. package/dist/adapter/z-stack/znp/definition.d.ts +2 -2
  278. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  279. package/dist/adapter/z-stack/znp/definition.js +1111 -1111
  280. package/dist/adapter/z-stack/znp/index.d.ts +2 -2
  281. package/dist/adapter/z-stack/znp/tstype.d.ts +7 -7
  282. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  283. package/dist/adapter/z-stack/znp/utils.d.ts +1 -1
  284. package/dist/adapter/z-stack/znp/utils.d.ts.map +1 -1
  285. package/dist/adapter/z-stack/znp/utils.js +2 -2
  286. package/dist/adapter/z-stack/znp/znp.d.ts +7 -7
  287. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  288. package/dist/adapter/z-stack/znp/znp.js +46 -45
  289. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  290. package/dist/adapter/z-stack/znp/zpiObject.d.ts +8 -8
  291. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +1 -1
  292. package/dist/adapter/z-stack/znp/zpiObject.js +6 -6
  293. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  294. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +11 -11
  295. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -1
  296. package/dist/adapter/zboss/adapter/zbossAdapter.js +37 -36
  297. package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -1
  298. package/dist/adapter/zboss/commands.d.ts +4 -6
  299. package/dist/adapter/zboss/commands.d.ts.map +1 -1
  300. package/dist/adapter/zboss/commands.js +321 -287
  301. package/dist/adapter/zboss/commands.js.map +1 -1
  302. package/dist/adapter/zboss/driver.d.ts +9 -9
  303. package/dist/adapter/zboss/driver.d.ts.map +1 -1
  304. package/dist/adapter/zboss/driver.js +25 -25
  305. package/dist/adapter/zboss/driver.js.map +1 -1
  306. package/dist/adapter/zboss/frame.d.ts +9 -9
  307. package/dist/adapter/zboss/frame.d.ts.map +1 -1
  308. package/dist/adapter/zboss/frame.js +15 -15
  309. package/dist/adapter/zboss/frame.js.map +1 -1
  310. package/dist/adapter/zboss/reader.d.ts +2 -2
  311. package/dist/adapter/zboss/reader.d.ts.map +1 -1
  312. package/dist/adapter/zboss/reader.js +6 -5
  313. package/dist/adapter/zboss/reader.js.map +1 -1
  314. package/dist/adapter/zboss/uart.d.ts +3 -3
  315. package/dist/adapter/zboss/uart.d.ts.map +1 -1
  316. package/dist/adapter/zboss/uart.js +36 -36
  317. package/dist/adapter/zboss/uart.js.map +1 -1
  318. package/dist/adapter/zboss/writer.d.ts +1 -1
  319. package/dist/adapter/zboss/writer.d.ts.map +1 -1
  320. package/dist/adapter/zboss/writer.js +3 -5
  321. package/dist/adapter/zboss/writer.js.map +1 -1
  322. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js +2 -2
  323. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js.map +1 -1
  324. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +14 -14
  325. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  326. package/dist/adapter/zigate/adapter/zigateAdapter.js +52 -53
  327. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  328. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +6 -6
  329. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  330. package/dist/adapter/zigate/driver/buffaloZiGate.js +41 -23
  331. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  332. package/dist/adapter/zigate/driver/commandType.d.ts +2 -2
  333. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  334. package/dist/adapter/zigate/driver/commandType.js +37 -37
  335. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  336. package/dist/adapter/zigate/driver/constants.d.ts +27 -200
  337. package/dist/adapter/zigate/driver/constants.d.ts.map +1 -1
  338. package/dist/adapter/zigate/driver/constants.js +40 -236
  339. package/dist/adapter/zigate/driver/constants.js.map +1 -1
  340. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  341. package/dist/adapter/zigate/driver/frame.js +4 -3
  342. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  343. package/dist/adapter/zigate/driver/messageType.d.ts +1 -1
  344. package/dist/adapter/zigate/driver/messageType.js +76 -76
  345. package/dist/adapter/zigate/driver/ziGateObject.d.ts +3 -3
  346. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  347. package/dist/adapter/zigate/driver/ziGateObject.js +7 -6
  348. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  349. package/dist/adapter/zigate/driver/zigate.d.ts +8 -8
  350. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  351. package/dist/adapter/zigate/driver/zigate.js +59 -54
  352. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  353. package/dist/adapter/zoh/adapter/utils.js +1 -1
  354. package/dist/adapter/zoh/adapter/zohAdapter.d.ts +13 -13
  355. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -1
  356. package/dist/adapter/zoh/adapter/zohAdapter.js +101 -67
  357. package/dist/adapter/zoh/adapter/zohAdapter.js.map +1 -1
  358. package/dist/buffalo/buffalo.d.ts +2 -2
  359. package/dist/buffalo/buffalo.js +4 -4
  360. package/dist/buffalo/buffalo.js.map +1 -1
  361. package/dist/buffalo/index.d.ts +1 -1
  362. package/dist/controller/controller.d.ts +7 -7
  363. package/dist/controller/controller.d.ts.map +1 -1
  364. package/dist/controller/controller.js +94 -98
  365. package/dist/controller/controller.js.map +1 -1
  366. package/dist/controller/database.d.ts +1 -1
  367. package/dist/controller/database.d.ts.map +1 -1
  368. package/dist/controller/database.js +9 -9
  369. package/dist/controller/database.js.map +1 -1
  370. package/dist/controller/events.d.ts +6 -6
  371. package/dist/controller/events.d.ts.map +1 -1
  372. package/dist/controller/greenPower.d.ts +21 -21
  373. package/dist/controller/greenPower.d.ts.map +1 -1
  374. package/dist/controller/greenPower.js +41 -41
  375. package/dist/controller/greenPower.js.map +1 -1
  376. package/dist/controller/helpers/index.d.ts +1 -1
  377. package/dist/controller/helpers/request.d.ts +2 -2
  378. package/dist/controller/helpers/request.d.ts.map +1 -1
  379. package/dist/controller/helpers/request.js +31 -27
  380. package/dist/controller/helpers/request.js.map +1 -1
  381. package/dist/controller/helpers/requestQueue.d.ts +3 -3
  382. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  383. package/dist/controller/helpers/requestQueue.js +20 -20
  384. package/dist/controller/helpers/requestQueue.js.map +1 -1
  385. package/dist/controller/helpers/zclFrameConverter.d.ts +2 -2
  386. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  387. package/dist/controller/helpers/zclFrameConverter.js +1 -1
  388. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  389. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +6 -4
  390. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +1 -1
  391. package/dist/controller/helpers/zclTransactionSequenceNumber.js +6 -5
  392. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +1 -1
  393. package/dist/controller/index.d.ts +1 -1
  394. package/dist/controller/model/device.d.ts +23 -19
  395. package/dist/controller/model/device.d.ts.map +1 -1
  396. package/dist/controller/model/device.js +153 -128
  397. package/dist/controller/model/device.js.map +1 -1
  398. package/dist/controller/model/endpoint.d.ts +11 -11
  399. package/dist/controller/model/endpoint.d.ts.map +1 -1
  400. package/dist/controller/model/endpoint.js +84 -67
  401. package/dist/controller/model/endpoint.js.map +1 -1
  402. package/dist/controller/model/entity.d.ts +3 -3
  403. package/dist/controller/model/entity.d.ts.map +1 -1
  404. package/dist/controller/model/group.d.ts +4 -4
  405. package/dist/controller/model/group.d.ts.map +1 -1
  406. package/dist/controller/model/group.js +21 -9
  407. package/dist/controller/model/group.js.map +1 -1
  408. package/dist/controller/model/index.d.ts +4 -4
  409. package/dist/controller/touchlink.d.ts +1 -1
  410. package/dist/controller/touchlink.d.ts.map +1 -1
  411. package/dist/controller/touchlink.js +11 -11
  412. package/dist/controller/tstype.d.ts +3 -3
  413. package/dist/index.d.ts +10 -10
  414. package/dist/models/backup-storage-legacy.d.ts +14 -16
  415. package/dist/models/backup-storage-legacy.d.ts.map +1 -1
  416. package/dist/models/backup-storage-unified.d.ts +1 -1
  417. package/dist/models/backup.d.ts +2 -2
  418. package/dist/models/backup.d.ts.map +1 -1
  419. package/dist/models/index.d.ts +4 -4
  420. package/dist/utils/backup.d.ts +1 -1
  421. package/dist/utils/backup.d.ts.map +1 -1
  422. package/dist/utils/backup.js +26 -26
  423. package/dist/utils/backup.js.map +1 -1
  424. package/dist/utils/index.d.ts +5 -5
  425. package/dist/utils/logger.js +3 -3
  426. package/dist/utils/patchBigIntSerialization.js +1 -1
  427. package/dist/utils/patchBigIntSerialization.js.map +1 -1
  428. package/dist/utils/queue.d.ts.map +1 -1
  429. package/dist/utils/queue.js +1 -0
  430. package/dist/utils/queue.js.map +1 -1
  431. package/dist/utils/utils.d.ts.map +1 -1
  432. package/dist/utils/utils.js +5 -4
  433. package/dist/utils/utils.js.map +1 -1
  434. package/dist/utils/waitress.d.ts +1 -1
  435. package/dist/utils/waitress.js +3 -3
  436. package/dist/zspec/consts.d.ts +1 -1
  437. package/dist/zspec/consts.d.ts.map +1 -1
  438. package/dist/zspec/consts.js +1 -1
  439. package/dist/zspec/index.d.ts +3 -3
  440. package/dist/zspec/tstypes.d.ts +1 -1
  441. package/dist/zspec/utils.d.ts +4 -4
  442. package/dist/zspec/utils.d.ts.map +1 -1
  443. package/dist/zspec/utils.js +9 -13
  444. package/dist/zspec/utils.js.map +1 -1
  445. package/dist/zspec/zcl/buffaloZcl.d.ts +3 -3
  446. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  447. package/dist/zspec/zcl/buffaloZcl.js +127 -84
  448. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  449. package/dist/zspec/zcl/definition/cluster.d.ts +1 -1
  450. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  451. package/dist/zspec/zcl/definition/cluster.js +894 -893
  452. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  453. package/dist/zspec/zcl/definition/consts.js +7 -7
  454. package/dist/zspec/zcl/definition/foundation.d.ts +3 -3
  455. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  456. package/dist/zspec/zcl/definition/foundation.js +88 -89
  457. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  458. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +1 -1
  459. package/dist/zspec/zcl/definition/manufacturerCode.js +1 -1
  460. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -1
  461. package/dist/zspec/zcl/definition/status.d.ts +3 -3
  462. package/dist/zspec/zcl/definition/status.js +3 -3
  463. package/dist/zspec/zcl/definition/tstype.d.ts +3 -3
  464. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  465. package/dist/zspec/zcl/index.d.ts +10 -10
  466. package/dist/zspec/zcl/utils.d.ts +3 -3
  467. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  468. package/dist/zspec/zcl/utils.js +18 -21
  469. package/dist/zspec/zcl/utils.js.map +1 -1
  470. package/dist/zspec/zcl/zclFrame.d.ts +7 -7
  471. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  472. package/dist/zspec/zcl/zclFrame.js +38 -41
  473. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  474. package/dist/zspec/zcl/zclHeader.d.ts +2 -2
  475. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
  476. package/dist/zspec/zcl/zclHeader.js +3 -3
  477. package/dist/zspec/zcl/zclStatusError.d.ts +1 -1
  478. package/dist/zspec/zdo/buffaloZdo.d.ts +7 -7
  479. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -1
  480. package/dist/zspec/zdo/buffaloZdo.js +4 -4
  481. package/dist/zspec/zdo/buffaloZdo.js.map +1 -1
  482. package/dist/zspec/zdo/definition/status.d.ts +1 -1
  483. package/dist/zspec/zdo/definition/status.js +1 -1
  484. package/dist/zspec/zdo/definition/tstypes.d.ts +48 -48
  485. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -1
  486. package/dist/zspec/zdo/index.d.ts +7 -7
  487. package/dist/zspec/zdo/utils.d.ts +2 -2
  488. package/dist/zspec/zdo/utils.d.ts.map +1 -1
  489. package/dist/zspec/zdo/utils.js +1 -1
  490. package/dist/zspec/zdo/utils.js.map +1 -1
  491. package/dist/zspec/zdo/zdoStatusError.d.ts +1 -1
  492. package/examples/join-and-log.js +5 -5
  493. package/package.json +6 -13
  494. package/src/adapter/adapter.ts +189 -0
  495. package/src/adapter/adapterDiscovery.ts +653 -0
  496. package/src/adapter/const.ts +12 -0
  497. package/src/adapter/deconz/adapter/deconzAdapter.ts +768 -0
  498. package/src/adapter/deconz/driver/constants.ts +180 -0
  499. package/src/adapter/deconz/driver/driver.ts +900 -0
  500. package/src/adapter/deconz/driver/frame.ts +11 -0
  501. package/src/adapter/deconz/driver/frameParser.ts +557 -0
  502. package/src/adapter/deconz/driver/parser.ts +45 -0
  503. package/src/adapter/deconz/driver/writer.ts +22 -0
  504. package/src/adapter/deconz/types.d.ts +13 -0
  505. package/src/adapter/ember/adapter/emberAdapter.ts +2266 -0
  506. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  507. package/src/adapter/ember/adapter/oneWaitress.ts +322 -0
  508. package/src/adapter/ember/adapter/tokensManager.ts +782 -0
  509. package/src/adapter/ember/consts.ts +178 -0
  510. package/src/adapter/ember/enums.ts +2123 -0
  511. package/src/adapter/ember/ezsp/buffalo.ts +1397 -0
  512. package/src/adapter/ember/ezsp/consts.ts +148 -0
  513. package/src/adapter/ember/ezsp/enums.ts +1087 -0
  514. package/src/adapter/ember/ezsp/ezsp.ts +8985 -0
  515. package/src/adapter/ember/ezspError.ts +10 -0
  516. package/src/adapter/ember/types.ts +866 -0
  517. package/src/adapter/ember/uart/ash.ts +1969 -0
  518. package/src/adapter/ember/uart/consts.ts +109 -0
  519. package/src/adapter/ember/uart/enums.ts +192 -0
  520. package/src/adapter/ember/uart/parser.ts +48 -0
  521. package/src/adapter/ember/uart/queues.ts +247 -0
  522. package/src/adapter/ember/uart/writer.ts +53 -0
  523. package/src/adapter/ember/utils/initters.ts +58 -0
  524. package/src/adapter/ember/utils/math.ts +73 -0
  525. package/src/adapter/events.ts +21 -0
  526. package/src/adapter/ezsp/adapter/backup.ts +109 -0
  527. package/src/adapter/ezsp/adapter/ezspAdapter.ts +614 -0
  528. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  529. package/src/adapter/ezsp/driver/consts.ts +11 -0
  530. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  531. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  532. package/src/adapter/ezsp/driver/frame.ts +101 -0
  533. package/src/adapter/ezsp/driver/index.ts +4 -0
  534. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  535. package/src/adapter/ezsp/driver/parser.ts +81 -0
  536. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  537. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  538. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  539. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  540. package/src/adapter/ezsp/driver/uart.ts +460 -0
  541. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  542. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  543. package/src/adapter/ezsp/driver/writer.ts +64 -0
  544. package/src/adapter/index.ts +3 -0
  545. package/src/adapter/serialPort.ts +58 -0
  546. package/src/adapter/socketPortUtils.ts +16 -0
  547. package/src/adapter/tstype.ts +78 -0
  548. package/src/adapter/z-stack/adapter/adapter-backup.ts +519 -0
  549. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  550. package/src/adapter/z-stack/adapter/endpoints.ts +57 -0
  551. package/src/adapter/z-stack/adapter/manager.ts +543 -0
  552. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  553. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1190 -0
  554. package/src/adapter/z-stack/constants/af.ts +27 -0
  555. package/src/adapter/z-stack/constants/common.ts +285 -0
  556. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  557. package/src/adapter/z-stack/constants/index.ts +11 -0
  558. package/src/adapter/z-stack/constants/mac.ts +128 -0
  559. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  560. package/src/adapter/z-stack/constants/sys.ts +72 -0
  561. package/src/adapter/z-stack/constants/util.ts +82 -0
  562. package/src/adapter/z-stack/constants/utils.ts +14 -0
  563. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  564. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  565. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  566. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  567. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  568. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  569. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  570. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  571. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  572. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  573. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  574. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  575. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  576. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  577. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  578. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  579. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  580. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  581. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  582. package/src/adapter/z-stack/structs/index.ts +4 -0
  583. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  584. package/src/adapter/z-stack/structs/struct.ts +367 -0
  585. package/src/adapter/z-stack/structs/table.ts +198 -0
  586. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  587. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  588. package/src/adapter/z-stack/unpi/index.ts +4 -0
  589. package/src/adapter/z-stack/unpi/parser.ts +56 -0
  590. package/src/adapter/z-stack/unpi/writer.ts +21 -0
  591. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  592. package/src/adapter/z-stack/utils/index.ts +2 -0
  593. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  594. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  595. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  596. package/src/adapter/z-stack/znp/index.ts +2 -0
  597. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  598. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  599. package/src/adapter/z-stack/znp/utils.ts +10 -0
  600. package/src/adapter/z-stack/znp/znp.ts +342 -0
  601. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  602. package/src/adapter/zboss/adapter/zbossAdapter.ts +527 -0
  603. package/src/adapter/zboss/commands.ts +1184 -0
  604. package/src/adapter/zboss/consts.ts +9 -0
  605. package/src/adapter/zboss/driver.ts +423 -0
  606. package/src/adapter/zboss/enums.ts +360 -0
  607. package/src/adapter/zboss/frame.ts +227 -0
  608. package/src/adapter/zboss/reader.ts +65 -0
  609. package/src/adapter/zboss/types.ts +0 -0
  610. package/src/adapter/zboss/uart.ts +428 -0
  611. package/src/adapter/zboss/utils.ts +58 -0
  612. package/src/adapter/zboss/writer.ts +49 -0
  613. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +27 -0
  614. package/src/adapter/zigate/adapter/zigateAdapter.ts +618 -0
  615. package/src/adapter/zigate/driver/LICENSE +17 -0
  616. package/src/adapter/zigate/driver/buffaloZiGate.ts +212 -0
  617. package/src/adapter/zigate/driver/commandType.ts +418 -0
  618. package/src/adapter/zigate/driver/constants.ts +150 -0
  619. package/src/adapter/zigate/driver/frame.ts +197 -0
  620. package/src/adapter/zigate/driver/messageType.ts +287 -0
  621. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  622. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  623. package/src/adapter/zigate/driver/zigate.ts +426 -0
  624. package/src/adapter/zoh/adapter/utils.ts +27 -0
  625. package/src/adapter/zoh/adapter/zohAdapter.ts +837 -0
  626. package/src/buffalo/buffalo.ts +335 -0
  627. package/src/buffalo/index.ts +1 -0
  628. package/src/controller/controller.ts +1048 -0
  629. package/src/controller/database.ts +124 -0
  630. package/src/controller/events.ts +51 -0
  631. package/src/controller/greenPower.ts +603 -0
  632. package/src/controller/helpers/index.ts +1 -0
  633. package/src/controller/helpers/request.ts +94 -0
  634. package/src/controller/helpers/requestQueue.ts +125 -0
  635. package/src/controller/helpers/zclFrameConverter.ts +51 -0
  636. package/src/controller/helpers/zclTransactionSequenceNumber.ts +19 -0
  637. package/src/controller/index.ts +6 -0
  638. package/src/controller/model/device.ts +1320 -0
  639. package/src/controller/model/endpoint.ts +1040 -0
  640. package/src/controller/model/entity.ts +23 -0
  641. package/src/controller/model/group.ts +333 -0
  642. package/src/controller/model/index.ts +4 -0
  643. package/src/controller/touchlink.ts +189 -0
  644. package/src/controller/tstype.ts +39 -0
  645. package/src/index.ts +12 -0
  646. package/src/models/backup-storage-legacy.ts +48 -0
  647. package/src/models/backup-storage-unified.ts +47 -0
  648. package/src/models/backup.ts +37 -0
  649. package/src/models/index.ts +5 -0
  650. package/src/models/network-options.ts +11 -0
  651. package/src/utils/backup.ts +152 -0
  652. package/src/utils/index.ts +5 -0
  653. package/src/utils/logger.ts +20 -0
  654. package/src/utils/patchBigIntSerialization.ts +8 -0
  655. package/src/utils/queue.ts +76 -0
  656. package/src/utils/types.d.ts +3 -0
  657. package/src/utils/utils.ts +20 -0
  658. package/src/utils/wait.ts +5 -0
  659. package/src/utils/waitress.ts +95 -0
  660. package/src/zspec/consts.ts +84 -0
  661. package/src/zspec/enums.ts +22 -0
  662. package/src/zspec/index.ts +3 -0
  663. package/src/zspec/tstypes.ts +18 -0
  664. package/src/zspec/utils.ts +308 -0
  665. package/src/zspec/zcl/buffaloZcl.ts +1133 -0
  666. package/src/zspec/zcl/definition/cluster.ts +5398 -0
  667. package/src/zspec/zcl/definition/consts.ts +24 -0
  668. package/src/zspec/zcl/definition/enums.ts +194 -0
  669. package/src/zspec/zcl/definition/foundation.ts +301 -0
  670. package/src/zspec/zcl/definition/manufacturerCode.ts +729 -0
  671. package/src/zspec/zcl/definition/status.ts +69 -0
  672. package/src/zspec/zcl/definition/tstype.ts +236 -0
  673. package/src/zspec/zcl/index.ts +10 -0
  674. package/src/zspec/zcl/utils.ts +342 -0
  675. package/src/zspec/zcl/zclFrame.ts +336 -0
  676. package/src/zspec/zcl/zclHeader.ts +102 -0
  677. package/src/zspec/zcl/zclStatusError.ts +10 -0
  678. package/src/zspec/zdo/buffaloZdo.ts +2345 -0
  679. package/src/zspec/zdo/definition/clusters.ts +722 -0
  680. package/src/zspec/zdo/definition/consts.ts +16 -0
  681. package/src/zspec/zdo/definition/enums.ts +99 -0
  682. package/src/zspec/zdo/definition/status.ts +105 -0
  683. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  684. package/src/zspec/zdo/index.ts +7 -0
  685. package/src/zspec/zdo/utils.ts +76 -0
  686. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  687. package/test/adapter/adapter.test.ts +1062 -0
  688. package/test/adapter/ember/ash.test.ts +337 -0
  689. package/test/adapter/ember/consts.ts +131 -0
  690. package/test/adapter/ember/emberAdapter.test.ts +3449 -0
  691. package/test/adapter/ember/ezsp.test.ts +386 -0
  692. package/test/adapter/ember/ezspBuffalo.test.ts +92 -0
  693. package/test/adapter/ember/ezspError.test.ts +11 -0
  694. package/test/adapter/ember/math.test.ts +205 -0
  695. package/test/adapter/ezsp/frame.test.ts +29 -0
  696. package/test/adapter/ezsp/uart.test.ts +180 -0
  697. package/test/adapter/z-stack/adapter.test.ts +3985 -0
  698. package/test/adapter/z-stack/constants.test.ts +32 -0
  699. package/test/adapter/z-stack/structs.test.ts +114 -0
  700. package/test/adapter/z-stack/unpi.test.ts +212 -0
  701. package/test/adapter/z-stack/znp.test.ts +1284 -0
  702. package/test/adapter/zboss/fixZdoResponse.test.ts +178 -0
  703. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +80 -0
  704. package/test/adapter/zigate/zdo.test.ts +187 -0
  705. package/test/adapter/zoh/utils.test.ts +35 -0
  706. package/test/adapter/zoh/zohAdapter.test.ts +1306 -0
  707. package/test/buffalo.test.ts +430 -0
  708. package/test/controller.test.ts +10005 -0
  709. package/test/greenpower.test.ts +1421 -0
  710. package/test/mockAdapters.ts +65 -0
  711. package/test/mockDevices.ts +472 -0
  712. package/test/testUtils.ts +20 -0
  713. package/test/tsconfig.json +10 -0
  714. package/test/utils/math.ts +19 -0
  715. package/test/utils.test.ts +227 -0
  716. package/test/vitest.config.mts +25 -0
  717. package/test/zcl.test.ts +2832 -0
  718. package/test/zspec/utils.test.ts +131 -0
  719. package/test/zspec/zcl/buffalo.test.ts +1231 -0
  720. package/test/zspec/zcl/frame.test.ts +925 -0
  721. package/test/zspec/zcl/utils.test.ts +280 -0
  722. package/test/zspec/zdo/buffalo.test.ts +1849 -0
  723. package/test/zspec/zdo/utils.test.ts +240 -0
  724. package/.prettierignore +0 -2
  725. package/.prettierrc +0 -26
  726. package/eslint.config.mjs +0 -32
@@ -0,0 +1,1133 @@
1
+ import {Buffalo} from "../../buffalo";
2
+ import {logger} from "../../utils/logger";
3
+ import {isNumberArray} from "../../utils/utils";
4
+ import {BuffaloZclDataType, DataType, StructuredIndicatorType} from "./definition/enums";
5
+ import type {BuffaloZclOptions, StructuredSelector, ZclArray} from "./definition/tstype";
6
+ import * as Utils from "./utils";
7
+
8
+ const NS = "zh:zcl:buffalo";
9
+
10
+ interface KeyValue {
11
+ [s: string | number]: number | string;
12
+ }
13
+
14
+ const SEC_KEY_LENGTH = 16;
15
+
16
+ const EXTENSION_FIELD_SETS_DATA_TYPE: {[key: number]: DataType[]} = {
17
+ 6: [DataType.UINT8],
18
+ 8: [DataType.UINT8],
19
+ 258: [DataType.UINT8, DataType.UINT8],
20
+ 768: [DataType.UINT16, DataType.UINT16, DataType.UINT16, DataType.UINT8, DataType.UINT8, DataType.UINT8, DataType.UINT16, DataType.UINT16],
21
+ };
22
+
23
+ interface Struct {
24
+ elmType: DataType;
25
+ elmVal: unknown;
26
+ }
27
+
28
+ interface ZclTimeOfDay {
29
+ /** [0-23] */
30
+ hours?: number;
31
+ /** [0-59] */
32
+ minutes?: number;
33
+ /** [0-59] */
34
+ seconds?: number;
35
+ /** [0-99] */
36
+ hundredths?: number;
37
+ }
38
+
39
+ interface ZclDate {
40
+ /** [1900-2155], converted to/from [0-255] => value+1900=year */
41
+ year?: number;
42
+ /** [1-12] */
43
+ month?: number;
44
+ /** [1-31] */
45
+ dayOfMonth?: number;
46
+ /** [1-7] */
47
+ dayOfWeek?: number;
48
+ }
49
+
50
+ interface ZoneInfo {
51
+ zoneID: number;
52
+ zoneStatus: number;
53
+ }
54
+
55
+ interface ExtensionFieldSet {
56
+ clstId: number;
57
+ len: number;
58
+ extField: unknown[];
59
+ }
60
+
61
+ interface ThermoTransition {
62
+ transitionTime: number;
63
+ heatSetpoint?: number;
64
+ coolSetpoint?: number;
65
+ }
66
+
67
+ interface Gpd {
68
+ deviceID: number;
69
+ options: number;
70
+ extendedOptions: number;
71
+ securityKey: Buffer;
72
+ keyMic: number;
73
+ outgoingCounter: number;
74
+ applicationInfo: number;
75
+ manufacturerID: number;
76
+ modelID: number;
77
+ numGpdCommands: number;
78
+ gpdCommandIdList: Buffer;
79
+ numServerClusters: number;
80
+ numClientClusters: number;
81
+ gpdServerClusters: Buffer;
82
+ gpdClientClusters: Buffer;
83
+ genericSwitchConfig: number;
84
+ currentContactStatus: number;
85
+ }
86
+
87
+ interface GPDChannelRequest {
88
+ nextChannel: number;
89
+ nextNextChannel: number;
90
+ }
91
+
92
+ export interface GPDChannelConfiguration {
93
+ commandID: number;
94
+ operationalChannel: number;
95
+ basic: boolean;
96
+ }
97
+
98
+ export interface GPDCommissioningReply {
99
+ commandID: number;
100
+ options: number;
101
+ /** expected valid if corresponding `options` bits set */
102
+ panID?: number;
103
+ /** expected valid if corresponding `options` bits set */
104
+ securityKey?: Buffer;
105
+ /** expected valid if corresponding `options` bits set */
106
+ keyMic?: number;
107
+ /** expected valid if corresponding `options` bits set */
108
+ frameCounter?: number;
109
+ }
110
+
111
+ interface GPDCustomReply {
112
+ commandID: number;
113
+ buffer: Buffer;
114
+ }
115
+
116
+ interface GPDAttributeReport {
117
+ manufacturerCode: number;
118
+ clusterID: number;
119
+ attributes: KeyValue;
120
+ }
121
+
122
+ interface TuyaDataPointValue {
123
+ dp: number;
124
+ datatype: number;
125
+ data: Buffer;
126
+ }
127
+
128
+ interface MiboxerZone {
129
+ zoneNum: number;
130
+ groupId: number;
131
+ }
132
+
133
+ export class BuffaloZcl extends Buffalo {
134
+ private writeOctetStr(value: number[]): void {
135
+ // TODO: this does not allow "non-value" 0xFF
136
+ this.writeUInt8(value.length);
137
+ this.writeBuffer(value, value.length);
138
+ }
139
+
140
+ private readOctetStr(): Buffer {
141
+ const length = this.readUInt8();
142
+ return length < 0xff ? this.readBuffer(length) : Buffer.from([]); // non-value
143
+ }
144
+
145
+ private writeCharStr(value: string | number[]): void {
146
+ // TODO: this does not allow "non-value" 0xFF
147
+ if (typeof value === "string") {
148
+ this.writeUInt8(Buffer.byteLength(value, "utf8"));
149
+ this.writeUtf8String(value);
150
+ } else {
151
+ // XXX: value.length not written?
152
+ this.writeBuffer(value, value.length);
153
+ }
154
+ }
155
+
156
+ private readCharStr(): string {
157
+ const length = this.readUInt8();
158
+
159
+ return length < 0xff ? this.readUtf8String(length) : "";
160
+ }
161
+
162
+ private writeLongOctetStr(value: number[]): void {
163
+ // TODO: this does not allow "non-value" 0xFF
164
+ this.writeUInt16(value.length);
165
+ this.writeBuffer(value, value.length);
166
+ }
167
+
168
+ private readLongOctetStr(): Buffer {
169
+ const length = this.readUInt16();
170
+ return length < 0xffff ? this.readBuffer(length) : Buffer.from([]); // non-value
171
+ }
172
+
173
+ private writeLongCharStr(value: string): void {
174
+ // TODO: this does not allow "non-value" 0xFF
175
+ this.writeUInt16(Buffer.byteLength(value, "utf8"));
176
+ this.writeUtf8String(value);
177
+ }
178
+
179
+ private readLongCharStr(): string {
180
+ const length = this.readUInt16();
181
+ return length < 0xffff ? this.readUtf8String(length) : ""; // non-value
182
+ }
183
+
184
+ private writeArray(value: ZclArray): void {
185
+ const elTypeNumeric = typeof value.elementType === "number" ? value.elementType : DataType[value.elementType];
186
+ this.writeUInt8(elTypeNumeric);
187
+ // TODO: this does not allow writing "non-value" 0xFFFF
188
+ this.writeUInt16(value.elements.length);
189
+
190
+ for (const element of value.elements) {
191
+ this.write(elTypeNumeric, element, {});
192
+ }
193
+ }
194
+
195
+ private readArray(): unknown[] {
196
+ const values: unknown[] = [];
197
+
198
+ const elementType = this.readUInt8();
199
+ const numberOfElements = this.readUInt16();
200
+
201
+ if (numberOfElements < 0xffff) {
202
+ for (let i = 0; i < numberOfElements; i++) {
203
+ const value = this.read(elementType, {});
204
+ values.push(value);
205
+ }
206
+ }
207
+
208
+ return values;
209
+ }
210
+
211
+ private writeStruct(value: Struct[]): void {
212
+ // XXX: from ZCL spec: "The zeroth element may not be written to."
213
+ // how does this translates to writing here?
214
+ // TODO: this does not allow writing "non-value" 0xFFFF
215
+ this.writeUInt16(value.length);
216
+
217
+ for (const v of value) {
218
+ this.writeUInt8(v.elmType);
219
+ this.write(v.elmType, v.elmVal, {});
220
+ }
221
+ }
222
+
223
+ private readStruct(): Struct[] {
224
+ const values: Struct[] = [];
225
+ const numberOfElements = this.readUInt16();
226
+
227
+ if (numberOfElements < 0xffff) {
228
+ for (let i = 0; i < numberOfElements; i++) {
229
+ const elementType = this.readUInt8();
230
+ const value = this.read(elementType, {});
231
+ values.push({elmType: elementType, elmVal: value});
232
+ }
233
+ }
234
+
235
+ return values;
236
+ }
237
+
238
+ private writeToD(value: ZclTimeOfDay): void {
239
+ this.writeUInt8(value.hours ?? 0xff);
240
+ this.writeUInt8(value.minutes ?? 0xff);
241
+ this.writeUInt8(value.seconds ?? 0xff);
242
+ this.writeUInt8(value.hundredths ?? 0xff);
243
+ }
244
+
245
+ private readToD(): ZclTimeOfDay {
246
+ const hours = this.readUInt8();
247
+ const minutes = this.readUInt8();
248
+ const seconds = this.readUInt8();
249
+ const hundredths = this.readUInt8();
250
+
251
+ return {
252
+ hours: hours < 0xff ? hours : undefined,
253
+ minutes: minutes < 0xff ? minutes : undefined,
254
+ seconds: seconds < 0xff ? seconds : undefined,
255
+ hundredths: hundredths < 0xff ? hundredths : undefined,
256
+ };
257
+ }
258
+
259
+ private writeDate(value: ZclDate): void {
260
+ this.writeUInt8(value.year !== undefined ? value.year - 1900 : 0xff);
261
+ this.writeUInt8(value.month ?? 0xff);
262
+ this.writeUInt8(value.dayOfMonth ?? 0xff);
263
+ this.writeUInt8(value.dayOfWeek ?? 0xff);
264
+ }
265
+
266
+ private readDate(): ZclDate {
267
+ const year = this.readUInt8();
268
+ const month = this.readUInt8();
269
+ const dayOfMonth = this.readUInt8();
270
+ const dayOfWeek = this.readUInt8();
271
+
272
+ return {
273
+ year: year < 0xff ? year + 1900 : undefined,
274
+ month: month < 0xff ? month : undefined,
275
+ dayOfMonth: dayOfMonth < 0xff ? dayOfMonth : undefined,
276
+ dayOfWeek: dayOfWeek < 0xff ? dayOfWeek : undefined,
277
+ };
278
+ }
279
+
280
+ //--- BuffaloZclDataType
281
+
282
+ private writeListZoneInfo(values: ZoneInfo[]): void {
283
+ for (const value of values) {
284
+ this.writeUInt8(value.zoneID);
285
+ this.writeUInt16(value.zoneStatus);
286
+ }
287
+ }
288
+
289
+ private readListZoneInfo(length: number): ZoneInfo[] {
290
+ const value: ZoneInfo[] = [];
291
+ for (let i = 0; i < length; i++) {
292
+ value.push({
293
+ zoneID: this.readUInt8(),
294
+ zoneStatus: this.readUInt16(),
295
+ });
296
+ }
297
+
298
+ return value;
299
+ }
300
+
301
+ private writeExtensionFieldSets(values: {clstId: number; len: number; extField: number[]}[]): void {
302
+ for (const value of values) {
303
+ this.writeUInt16(value.clstId);
304
+ this.writeUInt8(value.len);
305
+ let index = 0;
306
+
307
+ for (const entry of value.extField) {
308
+ this.write(EXTENSION_FIELD_SETS_DATA_TYPE[value.clstId][index], entry, {});
309
+ index++;
310
+ }
311
+ }
312
+ }
313
+
314
+ private readExtensionFieldSets(): ExtensionFieldSet[] {
315
+ const value: ExtensionFieldSet[] = [];
316
+
317
+ // XXX: doesn't work if buffer has more unrelated fields after this one
318
+ while (this.isMore()) {
319
+ const clstId = this.readUInt16();
320
+ const len = this.readUInt8();
321
+ const end = this.getPosition() + len;
322
+ let index = 0;
323
+ const extField: unknown[] = [];
324
+
325
+ while (this.getPosition() < end) {
326
+ extField.push(this.read(EXTENSION_FIELD_SETS_DATA_TYPE[clstId][index], {}));
327
+ index++;
328
+ }
329
+
330
+ value.push({extField, clstId, len});
331
+ }
332
+
333
+ return value;
334
+ }
335
+
336
+ private writeListThermoTransitions(value: ThermoTransition[]): void {
337
+ for (const entry of value) {
338
+ this.writeUInt16(entry.transitionTime);
339
+
340
+ if (entry.heatSetpoint != null) {
341
+ this.writeUInt16(entry.heatSetpoint);
342
+ }
343
+
344
+ if (entry.coolSetpoint != null) {
345
+ this.writeUInt16(entry.coolSetpoint);
346
+ }
347
+ }
348
+ }
349
+
350
+ private readListThermoTransitions(options: BuffaloZclOptions): ThermoTransition[] {
351
+ if (options.payload == null || options.payload.mode == null || options.payload.numoftrans == null) {
352
+ throw new Error("Cannot read LIST_THERMO_TRANSITIONS without required payload options specified");
353
+ }
354
+
355
+ const heat = options.payload.mode & 1;
356
+ const cool = options.payload.mode & 2;
357
+ const result: ThermoTransition[] = [];
358
+
359
+ for (let i = 0; i < options.payload.numoftrans; i++) {
360
+ const entry: ThermoTransition = {
361
+ transitionTime: this.readUInt16(),
362
+ };
363
+
364
+ if (heat) {
365
+ entry.heatSetpoint = this.readUInt16();
366
+ }
367
+
368
+ if (cool) {
369
+ entry.coolSetpoint = this.readUInt16();
370
+ }
371
+
372
+ result.push(entry);
373
+ }
374
+
375
+ return result;
376
+ }
377
+
378
+ private writeGpdFrame(value: GPDCommissioningReply | GPDChannelConfiguration | GPDCustomReply): void {
379
+ if (value.commandID === 0xf0) {
380
+ // Commissioning Reply
381
+ const v = value as GPDCommissioningReply;
382
+
383
+ const panIDPresent = Boolean(v.options & 0x1);
384
+ const gpdSecurityKeyPresent = Boolean(v.options & 0x2);
385
+ const gpdKeyEncryption = Boolean((v.options >> 2) & 0x1);
386
+ const securityLevel = (v.options >> 3) & 0x3;
387
+ const hasGPDKeyMIC = gpdKeyEncryption && gpdSecurityKeyPresent;
388
+ const hasFrameCounter = gpdSecurityKeyPresent && gpdKeyEncryption && (securityLevel === 0b10 || securityLevel === 0b11);
389
+
390
+ this.writeUInt8(1 + (panIDPresent ? 2 : 0) + (gpdSecurityKeyPresent ? 16 : 0) + (hasGPDKeyMIC ? 4 : 0) + (hasFrameCounter ? 4 : 0)); // Length
391
+ this.writeUInt8(v.options);
392
+
393
+ if (panIDPresent) {
394
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
395
+ this.writeUInt16(v.panID!);
396
+ }
397
+
398
+ if (gpdSecurityKeyPresent) {
399
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
400
+ this.writeBuffer(v.securityKey!, 16);
401
+ }
402
+
403
+ if (hasGPDKeyMIC) {
404
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
405
+ this.writeUInt32(v.keyMic!);
406
+ }
407
+
408
+ if (hasFrameCounter) {
409
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
410
+ this.writeUInt32(v.frameCounter!);
411
+ }
412
+ } else if (value.commandID === 0xf3) {
413
+ // Channel configuration
414
+ const v = value as GPDChannelConfiguration;
415
+
416
+ this.writeUInt8(1);
417
+ this.writeUInt8((v.operationalChannel & 0xf) | ((v.basic ? 1 : 0) << 4));
418
+ } else if (value.commandID === 0xf4 || value.commandID === 0xf5 || (value.commandID >= 0xf7 && value.commandID <= 0xff)) {
419
+ // Other commands sent to GPD
420
+ const v = value as GPDCustomReply;
421
+
422
+ this.writeUInt8(v.buffer.length);
423
+ this.writeBuffer(v.buffer, v.buffer.length);
424
+ }
425
+ // 0xf1: Write Attributes
426
+ // 0xf2: Read Attributes
427
+ // 0xf6: ZCL Tunneling
428
+ }
429
+
430
+ private readGpdFrame(options: BuffaloZclOptions): Gpd | GPDChannelRequest | GPDAttributeReport | {raw: Buffer} | Record<string, never> {
431
+ // ensure offset by options.payload.payloadSize (if any) at end of parsing to not cause issues with spec changes (until supported)
432
+ const startPosition = this.position;
433
+
434
+ if (options.payload?.commandID === 0xe0) {
435
+ // Commisioning
436
+ const frame = {
437
+ deviceID: this.readUInt8(),
438
+ options: this.readUInt8(),
439
+ extendedOptions: 0,
440
+ securityKey: Buffer.alloc(16),
441
+ keyMic: 0,
442
+ outgoingCounter: 0,
443
+ applicationInfo: 0,
444
+ manufacturerID: 0,
445
+ modelID: 0,
446
+ numGpdCommands: 0,
447
+ gpdCommandIdList: Buffer.alloc(0),
448
+ numServerClusters: 0,
449
+ numClientClusters: 0,
450
+ gpdServerClusters: Buffer.alloc(0),
451
+ gpdClientClusters: Buffer.alloc(0),
452
+ genericSwitchConfig: 0,
453
+ currentContactStatus: 0,
454
+ };
455
+
456
+ if (frame.options & 0x80) {
457
+ frame.extendedOptions = this.readUInt8();
458
+ }
459
+
460
+ if (frame.extendedOptions & 0x20) {
461
+ frame.securityKey = this.readBuffer(16);
462
+ }
463
+
464
+ if (frame.extendedOptions & 0x40) {
465
+ frame.keyMic = this.readUInt32();
466
+ }
467
+
468
+ if (frame.extendedOptions & 0x80) {
469
+ frame.outgoingCounter = this.readUInt32();
470
+ }
471
+
472
+ if (frame.options & 0x04) {
473
+ frame.applicationInfo = this.readUInt8();
474
+ }
475
+
476
+ if (frame.applicationInfo & 0x01) {
477
+ frame.manufacturerID = this.readUInt16();
478
+ }
479
+
480
+ if (frame.applicationInfo & 0x02) {
481
+ frame.modelID = this.readUInt16();
482
+ }
483
+
484
+ if (frame.applicationInfo & 0x04) {
485
+ frame.numGpdCommands = this.readUInt8();
486
+ frame.gpdCommandIdList = this.readBuffer(frame.numGpdCommands);
487
+ }
488
+
489
+ if (frame.applicationInfo & 0x08) {
490
+ const len = this.readUInt8();
491
+ frame.numServerClusters = len & 0xf;
492
+ frame.numClientClusters = (len >> 4) & 0xf;
493
+
494
+ frame.gpdServerClusters = this.readBuffer(2 * frame.numServerClusters);
495
+ frame.gpdClientClusters = this.readBuffer(2 * frame.numClientClusters);
496
+ }
497
+
498
+ if (frame.applicationInfo & 0x10) {
499
+ const len = this.readUInt8();
500
+
501
+ if (len >= 1) {
502
+ frame.genericSwitchConfig = this.readUInt8();
503
+ }
504
+
505
+ if (len >= 2) {
506
+ frame.currentContactStatus = this.readUInt8();
507
+ }
508
+ }
509
+
510
+ if (options.payload.payloadSize) {
511
+ this.position = startPosition + options.payload.payloadSize;
512
+ }
513
+
514
+ return frame;
515
+ }
516
+
517
+ if (options.payload?.commandID === 0xe3) {
518
+ // Channel Request
519
+ const channelOpts = this.readUInt8();
520
+
521
+ /* v8 ignore start */
522
+ if (options.payload?.payloadSize) {
523
+ this.position = startPosition + options.payload.payloadSize;
524
+ }
525
+ /* v8 ignore stop */
526
+
527
+ return {
528
+ nextChannel: channelOpts & 0xf,
529
+ nextNextChannel: channelOpts >> 4,
530
+ };
531
+ }
532
+
533
+ if (options.payload?.commandID === 0xa1) {
534
+ // Manufacturer-specific Attribute Reporting
535
+ if (options.payload.payloadSize === undefined) {
536
+ throw new Error("Cannot read GPD_FRAME with commandID=0xA1 without payloadSize options specified");
537
+ }
538
+
539
+ const start = this.position;
540
+ const frame = {
541
+ manufacturerCode: this.readUInt16(),
542
+ clusterID: this.readUInt16(),
543
+ attributes: {} as KeyValue,
544
+ };
545
+
546
+ const cluster = Utils.getCluster(frame.clusterID, frame.manufacturerCode, {});
547
+
548
+ while (this.position - start < options.payload.payloadSize) {
549
+ const attributeID = this.readUInt16();
550
+ const type = this.readUInt8();
551
+
552
+ let attribute: number | string = attributeID;
553
+ try {
554
+ attribute = cluster.getAttribute(attributeID).name;
555
+ } catch {
556
+ // this is spammy because of the many manufacturer-specific attributes not currently used
557
+ logger.debug(`Unknown attribute ${attributeID} in cluster ${cluster.name}`, NS);
558
+ }
559
+
560
+ frame.attributes[attribute] = this.read(type, options);
561
+ }
562
+
563
+ this.position = startPosition + options.payload.payloadSize;
564
+
565
+ return frame;
566
+ }
567
+
568
+ if (options.payload?.payloadSize && this.isMore()) {
569
+ // might contain `gppNwkAddr`, `gppGpdLink` & `mic` from ZCL cluster, so limit by `payloadSize`
570
+ return {raw: this.readBuffer(options.payload.payloadSize)};
571
+ }
572
+
573
+ if (options.payload?.payloadSize) {
574
+ this.position = startPosition + options.payload.payloadSize;
575
+ }
576
+
577
+ return {};
578
+ }
579
+
580
+ private writeStructuredSelector(value: StructuredSelector): void {
581
+ if (value != null) {
582
+ const indexes = value.indexes || [];
583
+ const indicatorType = value.indicatorType || StructuredIndicatorType.Whole;
584
+ const indicator = indexes.length + indicatorType;
585
+
586
+ this.writeUInt8(indicator);
587
+
588
+ for (const index of indexes) {
589
+ this.writeUInt16(index);
590
+ }
591
+ }
592
+ }
593
+
594
+ private readStructuredSelector(): StructuredSelector {
595
+ /** [0-15] range */
596
+ const indicator = this.readUInt8();
597
+
598
+ if (indicator === 0) {
599
+ // no indexes, whole attribute value is to be read
600
+ return {indicatorType: StructuredIndicatorType.Whole};
601
+ }
602
+
603
+ if (indicator < StructuredIndicatorType.WriteAdd) {
604
+ const indexes: StructuredSelector["indexes"] = [];
605
+
606
+ for (let i = 0; i < indicator; i++) {
607
+ const index = this.readUInt16();
608
+ indexes.push(index);
609
+ }
610
+
611
+ return {indexes};
612
+ }
613
+
614
+ throw new Error("Read structured selector was outside [0-15] range.");
615
+ }
616
+
617
+ private writeListTuyaDataPointValues(dpValues: TuyaDataPointValue[]): void {
618
+ for (const dpValue of dpValues) {
619
+ this.writeUInt8(dpValue.dp);
620
+ this.writeUInt8(dpValue.datatype);
621
+ const dataLen = dpValue.data.length;
622
+ // UInt16BE
623
+ this.writeUInt8((dataLen >> 8) & 0xff);
624
+ this.writeUInt8(dataLen & 0xff);
625
+ this.writeBuffer(dpValue.data, dataLen);
626
+ }
627
+ }
628
+
629
+ private readListTuyaDataPointValues(): TuyaDataPointValue[] {
630
+ const value: TuyaDataPointValue[] = [];
631
+
632
+ // XXX: doesn't work if buffer has more unrelated fields after this one
633
+ while (this.isMore()) {
634
+ try {
635
+ const dp = this.readUInt8();
636
+ const datatype = this.readUInt8();
637
+ const len_hi = this.readUInt8();
638
+ const len_lo = this.readUInt8();
639
+ const data = this.readBuffer(len_lo + (len_hi << 8));
640
+ value.push({dp, datatype, data});
641
+ } catch {
642
+ break;
643
+ }
644
+ }
645
+
646
+ return value;
647
+ }
648
+
649
+ private writeListMiboxerZones(values: MiboxerZone[]): void {
650
+ this.writeUInt8(values.length);
651
+
652
+ for (const value of values) {
653
+ this.writeUInt16(value.groupId);
654
+ this.writeUInt8(value.zoneNum);
655
+ }
656
+ }
657
+
658
+ private readListMiboxerZones(): MiboxerZone[] {
659
+ const value: MiboxerZone[] = [];
660
+ const len = this.readUInt8();
661
+
662
+ for (let i = 0; i < len; i++) {
663
+ const groupId = this.readUInt16();
664
+ const zoneNum = this.readUInt8();
665
+
666
+ value.push({groupId, zoneNum});
667
+ }
668
+
669
+ return value;
670
+ }
671
+
672
+ private writeBigEndianUInt24(value: number): void {
673
+ this.buffer.writeUIntBE(value, this.position, 3);
674
+ this.position += 3;
675
+ }
676
+
677
+ private readBigEndianUInt24(): number {
678
+ const value = this.buffer.readUIntBE(this.position, 3);
679
+ this.position += 3;
680
+ return value;
681
+ }
682
+
683
+ // NOTE: writeMiStruct is not supported.
684
+ private readMiStruct(): Record<number, number | number[]> {
685
+ const length = this.readUInt8();
686
+ const value: Record<number, number | number[]> = {};
687
+
688
+ if (length === 0xff) {
689
+ return value;
690
+ }
691
+
692
+ for (let i = 0; i < length; i++) {
693
+ const index = this.readUInt8();
694
+ const dataType = this.readUInt8();
695
+ value[index] = this.read(dataType, {});
696
+
697
+ const remaining = this.buffer.length - this.position;
698
+ if (remaining <= 1) {
699
+ if (remaining === 1) {
700
+ // Some Xiaomi structs have a trailing byte, skip it.
701
+ this.position += 1;
702
+ }
703
+ break;
704
+ }
705
+ }
706
+
707
+ return value;
708
+ }
709
+ // biome-ignore lint/suspicious/noExplicitAny: API
710
+ public write(type: DataType | BuffaloZclDataType, value: any, options: BuffaloZclOptions): void {
711
+ switch (type) {
712
+ case DataType.NO_DATA:
713
+ case DataType.UNKNOWN: {
714
+ return; // nothing to write
715
+ }
716
+ case DataType.DATA8:
717
+ case DataType.BOOLEAN:
718
+ case DataType.BITMAP8:
719
+ case DataType.UINT8:
720
+ case DataType.ENUM8: {
721
+ this.writeUInt8(value);
722
+ break;
723
+ }
724
+ case DataType.DATA16:
725
+ case DataType.BITMAP16:
726
+ case DataType.UINT16:
727
+ case DataType.ENUM16:
728
+ case DataType.CLUSTER_ID:
729
+ case DataType.ATTR_ID: {
730
+ this.writeUInt16(value);
731
+ break;
732
+ }
733
+ case DataType.DATA24:
734
+ case DataType.BITMAP24:
735
+ case DataType.UINT24: {
736
+ this.writeUInt24(value);
737
+ break;
738
+ }
739
+ case DataType.DATA32:
740
+ case DataType.BITMAP32:
741
+ case DataType.UINT32:
742
+ case DataType.UTC:
743
+ case DataType.BAC_OID: {
744
+ this.writeUInt32(value);
745
+ break;
746
+ }
747
+ case DataType.DATA40:
748
+ case DataType.BITMAP40:
749
+ case DataType.UINT40: {
750
+ this.writeUInt40(value);
751
+ break;
752
+ }
753
+ case DataType.DATA48:
754
+ case DataType.BITMAP48:
755
+ case DataType.UINT48: {
756
+ this.writeUInt48(value);
757
+ break;
758
+ }
759
+ case DataType.DATA56:
760
+ case DataType.BITMAP56:
761
+ case DataType.UINT56: {
762
+ this.writeUInt56(value);
763
+ break;
764
+ }
765
+ case DataType.DATA64:
766
+ case DataType.BITMAP64:
767
+ case DataType.UINT64: {
768
+ this.writeUInt64(value);
769
+ break;
770
+ }
771
+ case DataType.INT8: {
772
+ this.writeInt8(value);
773
+ break;
774
+ }
775
+ case DataType.INT16: {
776
+ this.writeInt16(value);
777
+ break;
778
+ }
779
+ case DataType.INT24: {
780
+ this.writeInt24(value);
781
+ break;
782
+ }
783
+ case DataType.INT32: {
784
+ this.writeInt32(value);
785
+ break;
786
+ }
787
+ case DataType.INT40: {
788
+ this.writeInt40(value);
789
+ break;
790
+ }
791
+ case DataType.INT48: {
792
+ this.writeInt48(value);
793
+ break;
794
+ }
795
+ case DataType.INT56: {
796
+ this.writeInt56(value);
797
+ break;
798
+ }
799
+ case DataType.INT64: {
800
+ this.writeInt64(value);
801
+ break;
802
+ }
803
+ // case DataType.SEMI_PREC: {
804
+ // // https://tc39.es/proposal-float16array/
805
+ // // not currently used
806
+ // this.writeSemiFloatLE(value);
807
+ // break;
808
+ // }
809
+ case DataType.SINGLE_PREC: {
810
+ this.writeFloatLE(value);
811
+ break;
812
+ }
813
+ case DataType.DOUBLE_PREC: {
814
+ this.writeDoubleLE(value);
815
+ break;
816
+ }
817
+ case DataType.OCTET_STR: {
818
+ this.writeOctetStr(value);
819
+ break;
820
+ }
821
+ case DataType.CHAR_STR: {
822
+ this.writeCharStr(value);
823
+ break;
824
+ }
825
+ case DataType.LONG_OCTET_STR: {
826
+ this.writeLongOctetStr(value);
827
+ break;
828
+ }
829
+ case DataType.LONG_CHAR_STR: {
830
+ this.writeLongCharStr(value);
831
+ break;
832
+ }
833
+ case DataType.ARRAY:
834
+ case DataType.SET:
835
+ case DataType.BAG: {
836
+ this.writeArray(value);
837
+ break;
838
+ }
839
+ case DataType.STRUCT: {
840
+ this.writeStruct(value);
841
+ break;
842
+ }
843
+ case DataType.TOD: {
844
+ this.writeToD(value);
845
+ break;
846
+ }
847
+ case DataType.DATE: {
848
+ this.writeDate(value);
849
+ break;
850
+ }
851
+ case DataType.IEEE_ADDR: {
852
+ this.writeIeeeAddr(value);
853
+ break;
854
+ }
855
+ case DataType.SEC_KEY: {
856
+ this.writeBuffer(value, SEC_KEY_LENGTH);
857
+ break;
858
+ }
859
+ case BuffaloZclDataType.USE_DATA_TYPE: {
860
+ if (options.dataType == null) {
861
+ if (Buffer.isBuffer(value) || isNumberArray(value)) {
862
+ this.writeBuffer(value, value.length);
863
+ break;
864
+ }
865
+
866
+ throw new Error("Cannot write USE_DATA_TYPE without dataType option specified");
867
+ }
868
+
869
+ this.write(options.dataType, value, options);
870
+ break;
871
+ }
872
+ case BuffaloZclDataType.LIST_UINT8: {
873
+ this.writeListUInt8(value);
874
+ break;
875
+ }
876
+ case BuffaloZclDataType.LIST_UINT16: {
877
+ this.writeListUInt16(value);
878
+ break;
879
+ }
880
+ case BuffaloZclDataType.LIST_UINT24: {
881
+ this.writeListUInt24(value);
882
+ break;
883
+ }
884
+ case BuffaloZclDataType.LIST_UINT32: {
885
+ this.writeListUInt32(value);
886
+ break;
887
+ }
888
+ case BuffaloZclDataType.LIST_ZONEINFO: {
889
+ this.writeListZoneInfo(value);
890
+ break;
891
+ }
892
+ case BuffaloZclDataType.EXTENSION_FIELD_SETS: {
893
+ this.writeExtensionFieldSets(value);
894
+ break;
895
+ }
896
+ case BuffaloZclDataType.LIST_THERMO_TRANSITIONS: {
897
+ this.writeListThermoTransitions(value);
898
+ break;
899
+ }
900
+ case BuffaloZclDataType.BUFFER: {
901
+ // XXX: inconsistent with read that allows partial with options.length, here always "whole"
902
+ this.writeBuffer(value, value.length);
903
+ break;
904
+ }
905
+ case BuffaloZclDataType.GPD_FRAME: {
906
+ this.writeGpdFrame(value);
907
+ break;
908
+ }
909
+ case BuffaloZclDataType.STRUCTURED_SELECTOR: {
910
+ this.writeStructuredSelector(value);
911
+ break;
912
+ }
913
+ case BuffaloZclDataType.LIST_TUYA_DATAPOINT_VALUES: {
914
+ this.writeListTuyaDataPointValues(value);
915
+ break;
916
+ }
917
+ case BuffaloZclDataType.LIST_MIBOXER_ZONES: {
918
+ this.writeListMiboxerZones(value);
919
+ break;
920
+ }
921
+ case BuffaloZclDataType.BIG_ENDIAN_UINT24: {
922
+ this.writeBigEndianUInt24(value);
923
+ break;
924
+ }
925
+ default: {
926
+ // In case the type is undefined, write it as a buffer to easily allow for custom types
927
+ // e.g. for https://github.com/Koenkk/zigbee-herdsman/issues/127
928
+ if (Buffer.isBuffer(value) || isNumberArray(value)) {
929
+ this.writeBuffer(value, value.length);
930
+ break;
931
+ }
932
+
933
+ throw new Error(`Write for '${type}' not available`);
934
+ }
935
+ }
936
+ }
937
+
938
+ // biome-ignore lint/suspicious/noExplicitAny: API
939
+ public read(type: DataType | BuffaloZclDataType, options: BuffaloZclOptions): any {
940
+ switch (type) {
941
+ case DataType.NO_DATA:
942
+ case DataType.UNKNOWN: {
943
+ return; // nothing to write
944
+ }
945
+ case DataType.DATA8:
946
+ case DataType.BOOLEAN:
947
+ case DataType.BITMAP8:
948
+ case DataType.UINT8:
949
+ case DataType.ENUM8: {
950
+ return this.readUInt8();
951
+ }
952
+ case DataType.DATA16:
953
+ case DataType.BITMAP16:
954
+ case DataType.UINT16:
955
+ case DataType.ENUM16:
956
+ case DataType.CLUSTER_ID:
957
+ case DataType.ATTR_ID: {
958
+ return this.readUInt16();
959
+ }
960
+ case DataType.DATA24:
961
+ case DataType.BITMAP24:
962
+ case DataType.UINT24: {
963
+ return this.readUInt24();
964
+ }
965
+ case DataType.DATA32:
966
+ case DataType.BITMAP32:
967
+ case DataType.UINT32:
968
+ case DataType.UTC:
969
+ case DataType.BAC_OID: {
970
+ return this.readUInt32();
971
+ }
972
+ case DataType.DATA40:
973
+ case DataType.BITMAP40:
974
+ case DataType.UINT40: {
975
+ return this.readUInt40();
976
+ }
977
+ case DataType.DATA48:
978
+ case DataType.BITMAP48:
979
+ case DataType.UINT48: {
980
+ return this.readUInt48();
981
+ }
982
+ case DataType.DATA56:
983
+ case DataType.BITMAP56:
984
+ case DataType.UINT56: {
985
+ return this.readUInt56();
986
+ }
987
+ case DataType.DATA64:
988
+ case DataType.BITMAP64:
989
+ case DataType.UINT64: {
990
+ return this.readUInt64();
991
+ }
992
+ case DataType.INT8: {
993
+ return this.readInt8();
994
+ }
995
+ case DataType.INT16: {
996
+ return this.readInt16();
997
+ }
998
+ case DataType.INT24: {
999
+ return this.readInt24();
1000
+ }
1001
+ case DataType.INT32: {
1002
+ return this.readInt32();
1003
+ }
1004
+ case DataType.INT40: {
1005
+ return this.readInt40();
1006
+ }
1007
+ case DataType.INT48: {
1008
+ return this.readInt48();
1009
+ }
1010
+ case DataType.INT56: {
1011
+ return this.readInt56();
1012
+ }
1013
+ case DataType.INT64: {
1014
+ return this.readInt64();
1015
+ }
1016
+ // case DataType.SEMI_PREC: {
1017
+ // // https://tc39.es/proposal-float16array/
1018
+ // // not currently used
1019
+ // return this.readSemiFloatLE();
1020
+ // }
1021
+ case DataType.SINGLE_PREC: {
1022
+ return this.readFloatLE();
1023
+ }
1024
+ case DataType.DOUBLE_PREC: {
1025
+ return this.readDoubleLE();
1026
+ }
1027
+ case DataType.OCTET_STR: {
1028
+ return this.readOctetStr();
1029
+ }
1030
+ case DataType.CHAR_STR: {
1031
+ return this.readCharStr();
1032
+ }
1033
+ case DataType.LONG_OCTET_STR: {
1034
+ return this.readLongOctetStr();
1035
+ }
1036
+ case DataType.LONG_CHAR_STR: {
1037
+ return this.readLongCharStr();
1038
+ }
1039
+ case DataType.ARRAY:
1040
+ case DataType.SET:
1041
+ case DataType.BAG: {
1042
+ return this.readArray();
1043
+ }
1044
+ case DataType.STRUCT: {
1045
+ return this.readStruct();
1046
+ }
1047
+ case DataType.TOD: {
1048
+ return this.readToD();
1049
+ }
1050
+ case DataType.DATE: {
1051
+ return this.readDate();
1052
+ }
1053
+ case DataType.IEEE_ADDR: {
1054
+ return this.readIeeeAddr();
1055
+ }
1056
+ case DataType.SEC_KEY: {
1057
+ return this.readBuffer(SEC_KEY_LENGTH);
1058
+ }
1059
+ case BuffaloZclDataType.USE_DATA_TYPE: {
1060
+ if (options.dataType == null) {
1061
+ return this.readBuffer(options.length ?? this.buffer.length);
1062
+ }
1063
+
1064
+ return this.read(options.dataType, options);
1065
+ }
1066
+ case BuffaloZclDataType.LIST_UINT8: {
1067
+ if (options.length == null) {
1068
+ throw new Error("Cannot read LIST_UINT8 without length option specified");
1069
+ }
1070
+
1071
+ return this.readListUInt8(options.length);
1072
+ }
1073
+ case BuffaloZclDataType.LIST_UINT16: {
1074
+ if (options.length == null) {
1075
+ throw new Error("Cannot read LIST_UINT16 without length option specified");
1076
+ }
1077
+
1078
+ return this.readListUInt16(options.length);
1079
+ }
1080
+ case BuffaloZclDataType.LIST_UINT24: {
1081
+ if (options.length == null) {
1082
+ throw new Error("Cannot read LIST_UINT24 without length option specified");
1083
+ }
1084
+
1085
+ return this.readListUInt24(options.length);
1086
+ }
1087
+ case BuffaloZclDataType.LIST_UINT32: {
1088
+ if (options.length == null) {
1089
+ throw new Error("Cannot read LIST_UINT32 without length option specified");
1090
+ }
1091
+
1092
+ return this.readListUInt32(options.length);
1093
+ }
1094
+ case BuffaloZclDataType.LIST_ZONEINFO: {
1095
+ if (options.length == null) {
1096
+ throw new Error("Cannot read LIST_ZONEINFO without length option specified");
1097
+ }
1098
+
1099
+ return this.readListZoneInfo(options.length);
1100
+ }
1101
+ case BuffaloZclDataType.EXTENSION_FIELD_SETS: {
1102
+ return this.readExtensionFieldSets();
1103
+ }
1104
+ case BuffaloZclDataType.LIST_THERMO_TRANSITIONS: {
1105
+ return this.readListThermoTransitions(options);
1106
+ }
1107
+ case BuffaloZclDataType.BUFFER: {
1108
+ // if length option not specified, read the whole buffer
1109
+ return this.readBuffer(options.length ?? this.buffer.length);
1110
+ }
1111
+ case BuffaloZclDataType.GPD_FRAME: {
1112
+ return this.readGpdFrame(options);
1113
+ }
1114
+ case BuffaloZclDataType.STRUCTURED_SELECTOR: {
1115
+ return this.readStructuredSelector();
1116
+ }
1117
+ case BuffaloZclDataType.LIST_TUYA_DATAPOINT_VALUES: {
1118
+ return this.readListTuyaDataPointValues();
1119
+ }
1120
+ case BuffaloZclDataType.LIST_MIBOXER_ZONES: {
1121
+ return this.readListMiboxerZones();
1122
+ }
1123
+ case BuffaloZclDataType.BIG_ENDIAN_UINT24: {
1124
+ return this.readBigEndianUInt24();
1125
+ }
1126
+ case BuffaloZclDataType.MI_STRUCT: {
1127
+ return this.readMiStruct();
1128
+ }
1129
+ }
1130
+
1131
+ throw new Error(`Read for '${type}' not available`);
1132
+ }
1133
+ }