zigbee-herdsman 3.5.2 → 4.0.2

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 (728) hide show
  1. package/.github/dependabot.yml +4 -0
  2. package/.github/workflows/ci.yml +3 -5
  3. package/.github/workflows/stale.yml +1 -1
  4. package/.github/workflows/typedoc.yaml +1 -1
  5. package/.release-please-manifest.json +1 -1
  6. package/.vscode/extensions.json +3 -0
  7. package/.vscode/settings.json +11 -0
  8. package/CHANGELOG.md +32 -0
  9. package/biome.json +89 -0
  10. package/dist/adapter/adapter.d.ts +11 -11
  11. package/dist/adapter/adapter.d.ts.map +1 -1
  12. package/dist/adapter/adapter.js +14 -14
  13. package/dist/adapter/adapterDiscovery.d.ts +6 -6
  14. package/dist/adapter/adapterDiscovery.d.ts.map +1 -1
  15. package/dist/adapter/adapterDiscovery.js +139 -141
  16. package/dist/adapter/adapterDiscovery.js.map +1 -1
  17. package/dist/adapter/const.d.ts +1 -1
  18. package/dist/adapter/const.js +2 -2
  19. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +16 -16
  20. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  21. package/dist/adapter/deconz/adapter/deconzAdapter.js +95 -100
  22. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  23. package/dist/adapter/deconz/driver/constants.d.ts +5 -5
  24. package/dist/adapter/deconz/driver/constants.d.ts.map +1 -1
  25. package/dist/adapter/deconz/driver/driver.d.ts +9 -9
  26. package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
  27. package/dist/adapter/deconz/driver/driver.js +112 -106
  28. package/dist/adapter/deconz/driver/driver.js.map +1 -1
  29. package/dist/adapter/deconz/driver/frame.d.ts +1 -1
  30. package/dist/adapter/deconz/driver/frame.d.ts.map +1 -1
  31. package/dist/adapter/deconz/driver/frame.js +1 -2
  32. package/dist/adapter/deconz/driver/frame.js.map +1 -1
  33. package/dist/adapter/deconz/driver/frameParser.d.ts +1 -1
  34. package/dist/adapter/deconz/driver/frameParser.d.ts.map +1 -1
  35. package/dist/adapter/deconz/driver/frameParser.js +66 -70
  36. package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
  37. package/dist/adapter/deconz/driver/parser.d.ts +1 -1
  38. package/dist/adapter/deconz/driver/parser.d.ts.map +1 -1
  39. package/dist/adapter/deconz/driver/parser.js +2 -2
  40. package/dist/adapter/deconz/driver/parser.js.map +1 -1
  41. package/dist/adapter/deconz/driver/writer.d.ts +2 -2
  42. package/dist/adapter/deconz/driver/writer.d.ts.map +1 -1
  43. package/dist/adapter/deconz/driver/writer.js +1 -1
  44. package/dist/adapter/ember/adapter/emberAdapter.d.ts +19 -19
  45. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  46. package/dist/adapter/ember/adapter/emberAdapter.js +117 -97
  47. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  48. package/dist/adapter/ember/adapter/endpoints.d.ts +1 -1
  49. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  50. package/dist/adapter/ember/adapter/oneWaitress.d.ts +5 -5
  51. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  52. package/dist/adapter/ember/adapter/oneWaitress.js +2 -2
  53. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  54. package/dist/adapter/ember/adapter/tokensManager.d.ts +3 -3
  55. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  56. package/dist/adapter/ember/adapter/tokensManager.js +20 -23
  57. package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
  58. package/dist/adapter/ember/enums.d.ts +4 -4
  59. package/dist/adapter/ember/enums.d.ts.map +1 -1
  60. package/dist/adapter/ember/enums.js +4 -6
  61. package/dist/adapter/ember/enums.js.map +1 -1
  62. package/dist/adapter/ember/ezsp/buffalo.d.ts +4 -4
  63. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +1 -1
  64. package/dist/adapter/ember/ezsp/buffalo.js +30 -32
  65. package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
  66. package/dist/adapter/ember/ezsp/ezsp.d.ts +46 -46
  67. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  68. package/dist/adapter/ember/ezsp/ezsp.js +85 -111
  69. package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
  70. package/dist/adapter/ember/ezspError.d.ts +1 -1
  71. package/dist/adapter/ember/types.d.ts +14 -14
  72. package/dist/adapter/ember/types.d.ts.map +1 -1
  73. package/dist/adapter/ember/uart/ash.d.ts +5 -5
  74. package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
  75. package/dist/adapter/ember/uart/ash.js +80 -71
  76. package/dist/adapter/ember/uart/ash.js.map +1 -1
  77. package/dist/adapter/ember/uart/parser.d.ts +2 -2
  78. package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
  79. package/dist/adapter/ember/uart/parser.js +2 -1
  80. package/dist/adapter/ember/uart/parser.js.map +1 -1
  81. package/dist/adapter/ember/uart/queues.js +27 -29
  82. package/dist/adapter/ember/uart/queues.js.map +1 -1
  83. package/dist/adapter/ember/uart/writer.d.ts +1 -1
  84. package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
  85. package/dist/adapter/ember/uart/writer.js +3 -5
  86. package/dist/adapter/ember/uart/writer.js.map +1 -1
  87. package/dist/adapter/ember/utils/initters.d.ts +2 -2
  88. package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
  89. package/dist/adapter/ember/utils/initters.js +1 -1
  90. package/dist/adapter/ember/utils/math.js +1 -1
  91. package/dist/adapter/events.d.ts +1 -1
  92. package/dist/adapter/events.d.ts.map +1 -1
  93. package/dist/adapter/ezsp/adapter/backup.d.ts +3 -3
  94. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  95. package/dist/adapter/ezsp/adapter/backup.js +8 -10
  96. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  97. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +12 -12
  98. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  99. package/dist/adapter/ezsp/adapter/ezspAdapter.js +45 -44
  100. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  101. package/dist/adapter/ezsp/driver/driver.d.ts +12 -12
  102. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  103. package/dist/adapter/ezsp/driver/driver.js +148 -141
  104. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  105. package/dist/adapter/ezsp/driver/ezsp.d.ts +7 -7
  106. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  107. package/dist/adapter/ezsp/driver/ezsp.js +61 -59
  108. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  109. package/dist/adapter/ezsp/driver/frame.js +2 -2
  110. package/dist/adapter/ezsp/driver/index.d.ts +2 -2
  111. package/dist/adapter/ezsp/driver/multicast.d.ts +8 -5
  112. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  113. package/dist/adapter/ezsp/driver/multicast.js +9 -9
  114. package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
  115. package/dist/adapter/ezsp/driver/parser.d.ts +1 -1
  116. package/dist/adapter/ezsp/driver/parser.js +3 -3
  117. package/dist/adapter/ezsp/driver/types/basic.d.ts +5 -5
  118. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +1 -1
  119. package/dist/adapter/ezsp/driver/types/basic.js +12 -33
  120. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  121. package/dist/adapter/ezsp/driver/types/index.d.ts +3 -3
  122. package/dist/adapter/ezsp/driver/types/index.d.ts.map +1 -1
  123. package/dist/adapter/ezsp/driver/types/index.js +8 -9
  124. package/dist/adapter/ezsp/driver/types/index.js.map +1 -1
  125. package/dist/adapter/ezsp/driver/types/named.d.ts +2 -2
  126. package/dist/adapter/ezsp/driver/types/named.d.ts.map +1 -1
  127. package/dist/adapter/ezsp/driver/types/named.js +8 -11
  128. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  129. package/dist/adapter/ezsp/driver/types/struct.d.ts +2 -2
  130. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +1 -1
  131. package/dist/adapter/ezsp/driver/types/struct.js +207 -214
  132. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  133. package/dist/adapter/ezsp/driver/uart.d.ts +2 -2
  134. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  135. package/dist/adapter/ezsp/driver/uart.js +48 -37
  136. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  137. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +3 -3
  138. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +1 -1
  139. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +16 -34
  140. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +1 -1
  141. package/dist/adapter/ezsp/driver/utils/index.d.ts +4 -4
  142. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +1 -1
  143. package/dist/adapter/ezsp/driver/utils/index.js +4 -4
  144. package/dist/adapter/ezsp/driver/utils/index.js.map +1 -1
  145. package/dist/adapter/ezsp/driver/writer.d.ts +1 -1
  146. package/dist/adapter/ezsp/driver/writer.js +2 -2
  147. package/dist/adapter/index.d.ts +3 -3
  148. package/dist/adapter/serialPort.d.ts +3 -3
  149. package/dist/adapter/serialPort.d.ts.map +1 -1
  150. package/dist/adapter/serialPort.js +1 -0
  151. package/dist/adapter/serialPort.js.map +1 -1
  152. package/dist/adapter/socketPortUtils.js +3 -3
  153. package/dist/adapter/tstype.d.ts +6 -6
  154. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +4 -4
  155. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  156. package/dist/adapter/z-stack/adapter/adapter-backup.js +106 -119
  157. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  158. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +10 -10
  159. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +1 -1
  160. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +23 -24
  161. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +1 -1
  162. package/dist/adapter/z-stack/adapter/manager.d.ts +6 -6
  163. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  164. package/dist/adapter/z-stack/adapter/manager.js +116 -127
  165. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  166. package/dist/adapter/z-stack/adapter/tstype.d.ts +3 -3
  167. package/dist/adapter/z-stack/adapter/tstype.js +3 -3
  168. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +10 -10
  169. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  170. package/dist/adapter/z-stack/adapter/zStackAdapter.js +125 -137
  171. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  172. package/dist/adapter/z-stack/constants/common.d.ts.map +1 -1
  173. package/dist/adapter/z-stack/constants/common.js +0 -3
  174. package/dist/adapter/z-stack/constants/common.js.map +1 -1
  175. package/dist/adapter/z-stack/constants/index.d.ts +10 -10
  176. package/dist/adapter/z-stack/constants/index.d.ts.map +1 -1
  177. package/dist/adapter/z-stack/constants/index.js +2 -2
  178. package/dist/adapter/z-stack/constants/index.js.map +1 -1
  179. package/dist/adapter/z-stack/constants/utils.d.ts +1 -1
  180. package/dist/adapter/z-stack/constants/utils.js +2 -2
  181. package/dist/adapter/z-stack/constants/utils.js.map +1 -1
  182. package/dist/adapter/z-stack/models/startup-options.d.ts +2 -2
  183. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
  184. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +1 -1
  185. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +1 -1
  186. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +4 -5
  187. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +1 -1
  188. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +2 -2
  189. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +1 -1
  190. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +3 -4
  191. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +1 -1
  192. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +1 -1
  193. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +1 -1
  194. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +1 -2
  195. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +1 -1
  196. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +2 -2
  197. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +1 -1
  198. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +3 -4
  199. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +1 -1
  200. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +1 -1
  201. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +1 -1
  202. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +6 -7
  203. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +1 -1
  204. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +2 -2
  205. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +1 -1
  206. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +3 -4
  207. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +1 -1
  208. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +1 -1
  209. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +1 -1
  210. package/dist/adapter/z-stack/structs/entries/channel-list.js +1 -2
  211. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +1 -1
  212. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +1 -1
  213. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +1 -1
  214. package/dist/adapter/z-stack/structs/entries/has-configured.js +2 -3
  215. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +1 -1
  216. package/dist/adapter/z-stack/structs/entries/index.d.ts +16 -16
  217. package/dist/adapter/z-stack/structs/entries/nib.d.ts +1 -1
  218. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +1 -1
  219. package/dist/adapter/z-stack/structs/entries/nib.js +49 -50
  220. package/dist/adapter/z-stack/structs/entries/nib.js.map +1 -1
  221. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +1 -1
  222. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +1 -1
  223. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +1 -2
  224. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +1 -1
  225. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +1 -1
  226. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +1 -1
  227. package/dist/adapter/z-stack/structs/entries/nwk-key.js +1 -2
  228. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +1 -1
  229. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +1 -1
  230. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +1 -1
  231. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +1 -2
  232. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +1 -1
  233. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +1 -1
  234. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +1 -1
  235. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +3 -4
  236. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +1 -1
  237. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +2 -2
  238. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +1 -1
  239. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +3 -4
  240. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +1 -1
  241. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +1 -1
  242. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +1 -1
  243. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +4 -5
  244. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +1 -1
  245. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +2 -2
  246. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +1 -1
  247. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +3 -4
  248. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +1 -1
  249. package/dist/adapter/z-stack/structs/index.d.ts +4 -4
  250. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +2 -2
  251. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +1 -1
  252. package/dist/adapter/z-stack/structs/struct.d.ts +8 -8
  253. package/dist/adapter/z-stack/structs/struct.d.ts.map +1 -1
  254. package/dist/adapter/z-stack/structs/struct.js +42 -43
  255. package/dist/adapter/z-stack/structs/struct.js.map +1 -1
  256. package/dist/adapter/z-stack/structs/table.d.ts +3 -3
  257. package/dist/adapter/z-stack/structs/table.d.ts.map +1 -1
  258. package/dist/adapter/z-stack/structs/table.js +10 -10
  259. package/dist/adapter/z-stack/structs/table.js.map +1 -1
  260. package/dist/adapter/z-stack/unpi/frame.d.ts +1 -1
  261. package/dist/adapter/z-stack/unpi/frame.d.ts.map +1 -1
  262. package/dist/adapter/z-stack/unpi/frame.js +2 -4
  263. package/dist/adapter/z-stack/unpi/frame.js.map +1 -1
  264. package/dist/adapter/z-stack/unpi/index.d.ts +4 -4
  265. package/dist/adapter/z-stack/unpi/parser.d.ts +1 -1
  266. package/dist/adapter/z-stack/unpi/parser.js +3 -3
  267. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  268. package/dist/adapter/z-stack/unpi/writer.d.ts +2 -2
  269. package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
  270. package/dist/adapter/z-stack/unpi/writer.js +1 -1
  271. package/dist/adapter/z-stack/utils/index.d.ts +2 -2
  272. package/dist/adapter/z-stack/utils/network-options.d.ts +1 -1
  273. package/dist/adapter/z-stack/utils/network-options.d.ts.map +1 -1
  274. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +3 -3
  275. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  276. package/dist/adapter/z-stack/znp/buffaloZnp.js +34 -20
  277. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  278. package/dist/adapter/z-stack/znp/definition.d.ts +2 -2
  279. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  280. package/dist/adapter/z-stack/znp/definition.js +1111 -1111
  281. package/dist/adapter/z-stack/znp/index.d.ts +2 -2
  282. package/dist/adapter/z-stack/znp/tstype.d.ts +7 -7
  283. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  284. package/dist/adapter/z-stack/znp/utils.d.ts +1 -1
  285. package/dist/adapter/z-stack/znp/utils.d.ts.map +1 -1
  286. package/dist/adapter/z-stack/znp/utils.js +2 -2
  287. package/dist/adapter/z-stack/znp/znp.d.ts +7 -7
  288. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  289. package/dist/adapter/z-stack/znp/znp.js +46 -45
  290. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  291. package/dist/adapter/z-stack/znp/zpiObject.d.ts +8 -8
  292. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +1 -1
  293. package/dist/adapter/z-stack/znp/zpiObject.js +6 -6
  294. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  295. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +11 -11
  296. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -1
  297. package/dist/adapter/zboss/adapter/zbossAdapter.js +37 -36
  298. package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -1
  299. package/dist/adapter/zboss/commands.d.ts +4 -6
  300. package/dist/adapter/zboss/commands.d.ts.map +1 -1
  301. package/dist/adapter/zboss/commands.js +321 -287
  302. package/dist/adapter/zboss/commands.js.map +1 -1
  303. package/dist/adapter/zboss/driver.d.ts +9 -9
  304. package/dist/adapter/zboss/driver.d.ts.map +1 -1
  305. package/dist/adapter/zboss/driver.js +25 -25
  306. package/dist/adapter/zboss/driver.js.map +1 -1
  307. package/dist/adapter/zboss/frame.d.ts +9 -9
  308. package/dist/adapter/zboss/frame.d.ts.map +1 -1
  309. package/dist/adapter/zboss/frame.js +15 -15
  310. package/dist/adapter/zboss/frame.js.map +1 -1
  311. package/dist/adapter/zboss/reader.d.ts +2 -2
  312. package/dist/adapter/zboss/reader.d.ts.map +1 -1
  313. package/dist/adapter/zboss/reader.js +6 -5
  314. package/dist/adapter/zboss/reader.js.map +1 -1
  315. package/dist/adapter/zboss/uart.d.ts +3 -3
  316. package/dist/adapter/zboss/uart.d.ts.map +1 -1
  317. package/dist/adapter/zboss/uart.js +36 -36
  318. package/dist/adapter/zboss/uart.js.map +1 -1
  319. package/dist/adapter/zboss/writer.d.ts +1 -1
  320. package/dist/adapter/zboss/writer.d.ts.map +1 -1
  321. package/dist/adapter/zboss/writer.js +3 -5
  322. package/dist/adapter/zboss/writer.js.map +1 -1
  323. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js +2 -2
  324. package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js.map +1 -1
  325. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +14 -14
  326. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  327. package/dist/adapter/zigate/adapter/zigateAdapter.js +52 -53
  328. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  329. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +6 -6
  330. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  331. package/dist/adapter/zigate/driver/buffaloZiGate.js +41 -23
  332. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  333. package/dist/adapter/zigate/driver/commandType.d.ts +2 -2
  334. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  335. package/dist/adapter/zigate/driver/commandType.js +37 -37
  336. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  337. package/dist/adapter/zigate/driver/constants.d.ts +27 -200
  338. package/dist/adapter/zigate/driver/constants.d.ts.map +1 -1
  339. package/dist/adapter/zigate/driver/constants.js +40 -236
  340. package/dist/adapter/zigate/driver/constants.js.map +1 -1
  341. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  342. package/dist/adapter/zigate/driver/frame.js +4 -3
  343. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  344. package/dist/adapter/zigate/driver/messageType.d.ts +1 -1
  345. package/dist/adapter/zigate/driver/messageType.js +76 -76
  346. package/dist/adapter/zigate/driver/ziGateObject.d.ts +3 -3
  347. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  348. package/dist/adapter/zigate/driver/ziGateObject.js +7 -6
  349. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  350. package/dist/adapter/zigate/driver/zigate.d.ts +8 -8
  351. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  352. package/dist/adapter/zigate/driver/zigate.js +59 -54
  353. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  354. package/dist/adapter/zoh/adapter/utils.js +1 -1
  355. package/dist/adapter/zoh/adapter/zohAdapter.d.ts +13 -13
  356. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -1
  357. package/dist/adapter/zoh/adapter/zohAdapter.js +101 -67
  358. package/dist/adapter/zoh/adapter/zohAdapter.js.map +1 -1
  359. package/dist/buffalo/buffalo.d.ts +2 -2
  360. package/dist/buffalo/buffalo.js +4 -4
  361. package/dist/buffalo/buffalo.js.map +1 -1
  362. package/dist/buffalo/index.d.ts +1 -1
  363. package/dist/controller/controller.d.ts +7 -7
  364. package/dist/controller/controller.d.ts.map +1 -1
  365. package/dist/controller/controller.js +94 -98
  366. package/dist/controller/controller.js.map +1 -1
  367. package/dist/controller/database.d.ts +1 -1
  368. package/dist/controller/database.d.ts.map +1 -1
  369. package/dist/controller/database.js +9 -9
  370. package/dist/controller/database.js.map +1 -1
  371. package/dist/controller/events.d.ts +6 -6
  372. package/dist/controller/events.d.ts.map +1 -1
  373. package/dist/controller/greenPower.d.ts +21 -21
  374. package/dist/controller/greenPower.d.ts.map +1 -1
  375. package/dist/controller/greenPower.js +41 -41
  376. package/dist/controller/greenPower.js.map +1 -1
  377. package/dist/controller/helpers/index.d.ts +1 -1
  378. package/dist/controller/helpers/request.d.ts +2 -2
  379. package/dist/controller/helpers/request.d.ts.map +1 -1
  380. package/dist/controller/helpers/request.js +31 -27
  381. package/dist/controller/helpers/request.js.map +1 -1
  382. package/dist/controller/helpers/requestQueue.d.ts +3 -3
  383. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  384. package/dist/controller/helpers/requestQueue.js +20 -20
  385. package/dist/controller/helpers/requestQueue.js.map +1 -1
  386. package/dist/controller/helpers/zclFrameConverter.d.ts +2 -2
  387. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  388. package/dist/controller/helpers/zclFrameConverter.js +1 -1
  389. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  390. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +6 -4
  391. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +1 -1
  392. package/dist/controller/helpers/zclTransactionSequenceNumber.js +6 -5
  393. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +1 -1
  394. package/dist/controller/index.d.ts +1 -1
  395. package/dist/controller/model/device.d.ts +23 -19
  396. package/dist/controller/model/device.d.ts.map +1 -1
  397. package/dist/controller/model/device.js +153 -128
  398. package/dist/controller/model/device.js.map +1 -1
  399. package/dist/controller/model/endpoint.d.ts +11 -11
  400. package/dist/controller/model/endpoint.d.ts.map +1 -1
  401. package/dist/controller/model/endpoint.js +84 -67
  402. package/dist/controller/model/endpoint.js.map +1 -1
  403. package/dist/controller/model/entity.d.ts +3 -3
  404. package/dist/controller/model/entity.d.ts.map +1 -1
  405. package/dist/controller/model/group.d.ts +4 -4
  406. package/dist/controller/model/group.d.ts.map +1 -1
  407. package/dist/controller/model/group.js +21 -9
  408. package/dist/controller/model/group.js.map +1 -1
  409. package/dist/controller/model/index.d.ts +4 -4
  410. package/dist/controller/touchlink.d.ts +1 -1
  411. package/dist/controller/touchlink.d.ts.map +1 -1
  412. package/dist/controller/touchlink.js +11 -11
  413. package/dist/controller/tstype.d.ts +3 -3
  414. package/dist/index.d.ts +10 -10
  415. package/dist/models/backup-storage-legacy.d.ts +14 -16
  416. package/dist/models/backup-storage-legacy.d.ts.map +1 -1
  417. package/dist/models/backup-storage-unified.d.ts +1 -1
  418. package/dist/models/backup.d.ts +2 -2
  419. package/dist/models/backup.d.ts.map +1 -1
  420. package/dist/models/index.d.ts +4 -4
  421. package/dist/utils/backup.d.ts +1 -1
  422. package/dist/utils/backup.d.ts.map +1 -1
  423. package/dist/utils/backup.js +26 -26
  424. package/dist/utils/backup.js.map +1 -1
  425. package/dist/utils/index.d.ts +5 -5
  426. package/dist/utils/logger.js +3 -3
  427. package/dist/utils/patchBigIntSerialization.js +1 -1
  428. package/dist/utils/patchBigIntSerialization.js.map +1 -1
  429. package/dist/utils/queue.d.ts.map +1 -1
  430. package/dist/utils/queue.js +1 -0
  431. package/dist/utils/queue.js.map +1 -1
  432. package/dist/utils/utils.d.ts.map +1 -1
  433. package/dist/utils/utils.js +5 -4
  434. package/dist/utils/utils.js.map +1 -1
  435. package/dist/utils/waitress.d.ts +1 -1
  436. package/dist/utils/waitress.js +3 -3
  437. package/dist/zspec/consts.d.ts +1 -1
  438. package/dist/zspec/consts.d.ts.map +1 -1
  439. package/dist/zspec/consts.js +1 -1
  440. package/dist/zspec/index.d.ts +3 -3
  441. package/dist/zspec/tstypes.d.ts +1 -1
  442. package/dist/zspec/utils.d.ts +4 -4
  443. package/dist/zspec/utils.d.ts.map +1 -1
  444. package/dist/zspec/utils.js +9 -13
  445. package/dist/zspec/utils.js.map +1 -1
  446. package/dist/zspec/zcl/buffaloZcl.d.ts +3 -3
  447. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  448. package/dist/zspec/zcl/buffaloZcl.js +127 -84
  449. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  450. package/dist/zspec/zcl/definition/cluster.d.ts +1 -1
  451. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  452. package/dist/zspec/zcl/definition/cluster.js +1280 -911
  453. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  454. package/dist/zspec/zcl/definition/consts.js +7 -7
  455. package/dist/zspec/zcl/definition/foundation.d.ts +3 -3
  456. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  457. package/dist/zspec/zcl/definition/foundation.js +88 -89
  458. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  459. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +1 -1
  460. package/dist/zspec/zcl/definition/manufacturerCode.js +1 -1
  461. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -1
  462. package/dist/zspec/zcl/definition/status.d.ts +3 -3
  463. package/dist/zspec/zcl/definition/status.js +3 -3
  464. package/dist/zspec/zcl/definition/tstype.d.ts +3 -3
  465. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  466. package/dist/zspec/zcl/index.d.ts +10 -10
  467. package/dist/zspec/zcl/utils.d.ts +3 -3
  468. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  469. package/dist/zspec/zcl/utils.js +18 -21
  470. package/dist/zspec/zcl/utils.js.map +1 -1
  471. package/dist/zspec/zcl/zclFrame.d.ts +7 -7
  472. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  473. package/dist/zspec/zcl/zclFrame.js +38 -41
  474. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  475. package/dist/zspec/zcl/zclHeader.d.ts +2 -2
  476. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
  477. package/dist/zspec/zcl/zclHeader.js +3 -3
  478. package/dist/zspec/zcl/zclStatusError.d.ts +1 -1
  479. package/dist/zspec/zdo/buffaloZdo.d.ts +7 -7
  480. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -1
  481. package/dist/zspec/zdo/buffaloZdo.js +4 -4
  482. package/dist/zspec/zdo/buffaloZdo.js.map +1 -1
  483. package/dist/zspec/zdo/definition/status.d.ts +1 -1
  484. package/dist/zspec/zdo/definition/status.js +1 -1
  485. package/dist/zspec/zdo/definition/tstypes.d.ts +48 -48
  486. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -1
  487. package/dist/zspec/zdo/index.d.ts +7 -7
  488. package/dist/zspec/zdo/utils.d.ts +2 -2
  489. package/dist/zspec/zdo/utils.d.ts.map +1 -1
  490. package/dist/zspec/zdo/utils.js +1 -1
  491. package/dist/zspec/zdo/utils.js.map +1 -1
  492. package/dist/zspec/zdo/zdoStatusError.d.ts +1 -1
  493. package/examples/join-and-log.js +5 -5
  494. package/package.json +4 -11
  495. package/src/adapter/adapter.ts +189 -0
  496. package/src/adapter/adapterDiscovery.ts +653 -0
  497. package/src/adapter/const.ts +12 -0
  498. package/src/adapter/deconz/adapter/deconzAdapter.ts +768 -0
  499. package/src/adapter/deconz/driver/constants.ts +180 -0
  500. package/src/adapter/deconz/driver/driver.ts +900 -0
  501. package/src/adapter/deconz/driver/frame.ts +11 -0
  502. package/src/adapter/deconz/driver/frameParser.ts +557 -0
  503. package/src/adapter/deconz/driver/parser.ts +45 -0
  504. package/src/adapter/deconz/driver/writer.ts +22 -0
  505. package/src/adapter/deconz/types.d.ts +13 -0
  506. package/src/adapter/ember/adapter/emberAdapter.ts +2266 -0
  507. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  508. package/src/adapter/ember/adapter/oneWaitress.ts +322 -0
  509. package/src/adapter/ember/adapter/tokensManager.ts +782 -0
  510. package/src/adapter/ember/consts.ts +178 -0
  511. package/src/adapter/ember/enums.ts +2123 -0
  512. package/src/adapter/ember/ezsp/buffalo.ts +1397 -0
  513. package/src/adapter/ember/ezsp/consts.ts +148 -0
  514. package/src/adapter/ember/ezsp/enums.ts +1087 -0
  515. package/src/adapter/ember/ezsp/ezsp.ts +8985 -0
  516. package/src/adapter/ember/ezspError.ts +10 -0
  517. package/src/adapter/ember/types.ts +866 -0
  518. package/src/adapter/ember/uart/ash.ts +1969 -0
  519. package/src/adapter/ember/uart/consts.ts +109 -0
  520. package/src/adapter/ember/uart/enums.ts +192 -0
  521. package/src/adapter/ember/uart/parser.ts +48 -0
  522. package/src/adapter/ember/uart/queues.ts +247 -0
  523. package/src/adapter/ember/uart/writer.ts +53 -0
  524. package/src/adapter/ember/utils/initters.ts +58 -0
  525. package/src/adapter/ember/utils/math.ts +73 -0
  526. package/src/adapter/events.ts +21 -0
  527. package/src/adapter/ezsp/adapter/backup.ts +109 -0
  528. package/src/adapter/ezsp/adapter/ezspAdapter.ts +614 -0
  529. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  530. package/src/adapter/ezsp/driver/consts.ts +11 -0
  531. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  532. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  533. package/src/adapter/ezsp/driver/frame.ts +101 -0
  534. package/src/adapter/ezsp/driver/index.ts +4 -0
  535. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  536. package/src/adapter/ezsp/driver/parser.ts +81 -0
  537. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  538. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  539. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  540. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  541. package/src/adapter/ezsp/driver/uart.ts +460 -0
  542. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  543. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  544. package/src/adapter/ezsp/driver/writer.ts +64 -0
  545. package/src/adapter/index.ts +3 -0
  546. package/src/adapter/serialPort.ts +58 -0
  547. package/src/adapter/socketPortUtils.ts +16 -0
  548. package/src/adapter/tstype.ts +78 -0
  549. package/src/adapter/z-stack/adapter/adapter-backup.ts +519 -0
  550. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  551. package/src/adapter/z-stack/adapter/endpoints.ts +57 -0
  552. package/src/adapter/z-stack/adapter/manager.ts +544 -0
  553. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  554. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1190 -0
  555. package/src/adapter/z-stack/constants/af.ts +27 -0
  556. package/src/adapter/z-stack/constants/common.ts +285 -0
  557. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  558. package/src/adapter/z-stack/constants/index.ts +11 -0
  559. package/src/adapter/z-stack/constants/mac.ts +128 -0
  560. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  561. package/src/adapter/z-stack/constants/sys.ts +72 -0
  562. package/src/adapter/z-stack/constants/util.ts +82 -0
  563. package/src/adapter/z-stack/constants/utils.ts +14 -0
  564. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  565. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  566. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  567. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  568. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  569. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  570. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  571. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  572. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  573. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  574. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  575. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  576. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  577. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  578. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  579. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  580. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  581. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  582. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  583. package/src/adapter/z-stack/structs/index.ts +4 -0
  584. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  585. package/src/adapter/z-stack/structs/struct.ts +367 -0
  586. package/src/adapter/z-stack/structs/table.ts +198 -0
  587. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  588. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  589. package/src/adapter/z-stack/unpi/index.ts +4 -0
  590. package/src/adapter/z-stack/unpi/parser.ts +56 -0
  591. package/src/adapter/z-stack/unpi/writer.ts +21 -0
  592. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  593. package/src/adapter/z-stack/utils/index.ts +2 -0
  594. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  595. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  596. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  597. package/src/adapter/z-stack/znp/index.ts +2 -0
  598. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  599. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  600. package/src/adapter/z-stack/znp/utils.ts +10 -0
  601. package/src/adapter/z-stack/znp/znp.ts +342 -0
  602. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  603. package/src/adapter/zboss/adapter/zbossAdapter.ts +527 -0
  604. package/src/adapter/zboss/commands.ts +1184 -0
  605. package/src/adapter/zboss/consts.ts +9 -0
  606. package/src/adapter/zboss/driver.ts +423 -0
  607. package/src/adapter/zboss/enums.ts +360 -0
  608. package/src/adapter/zboss/frame.ts +227 -0
  609. package/src/adapter/zboss/reader.ts +65 -0
  610. package/src/adapter/zboss/types.ts +0 -0
  611. package/src/adapter/zboss/uart.ts +428 -0
  612. package/src/adapter/zboss/utils.ts +58 -0
  613. package/src/adapter/zboss/writer.ts +49 -0
  614. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +27 -0
  615. package/src/adapter/zigate/adapter/zigateAdapter.ts +618 -0
  616. package/src/adapter/zigate/driver/LICENSE +17 -0
  617. package/src/adapter/zigate/driver/buffaloZiGate.ts +212 -0
  618. package/src/adapter/zigate/driver/commandType.ts +418 -0
  619. package/src/adapter/zigate/driver/constants.ts +150 -0
  620. package/src/adapter/zigate/driver/frame.ts +197 -0
  621. package/src/adapter/zigate/driver/messageType.ts +287 -0
  622. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  623. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  624. package/src/adapter/zigate/driver/zigate.ts +426 -0
  625. package/src/adapter/zoh/adapter/utils.ts +27 -0
  626. package/src/adapter/zoh/adapter/zohAdapter.ts +837 -0
  627. package/src/buffalo/buffalo.ts +335 -0
  628. package/src/buffalo/index.ts +1 -0
  629. package/src/controller/controller.ts +1048 -0
  630. package/src/controller/database.ts +124 -0
  631. package/src/controller/events.ts +51 -0
  632. package/src/controller/greenPower.ts +603 -0
  633. package/src/controller/helpers/index.ts +1 -0
  634. package/src/controller/helpers/request.ts +94 -0
  635. package/src/controller/helpers/requestQueue.ts +125 -0
  636. package/src/controller/helpers/zclFrameConverter.ts +51 -0
  637. package/src/controller/helpers/zclTransactionSequenceNumber.ts +19 -0
  638. package/src/controller/index.ts +6 -0
  639. package/src/controller/model/device.ts +1320 -0
  640. package/src/controller/model/endpoint.ts +1040 -0
  641. package/src/controller/model/entity.ts +23 -0
  642. package/src/controller/model/group.ts +333 -0
  643. package/src/controller/model/index.ts +4 -0
  644. package/src/controller/touchlink.ts +189 -0
  645. package/src/controller/tstype.ts +39 -0
  646. package/src/index.ts +12 -0
  647. package/src/models/backup-storage-legacy.ts +48 -0
  648. package/src/models/backup-storage-unified.ts +47 -0
  649. package/src/models/backup.ts +37 -0
  650. package/src/models/index.ts +5 -0
  651. package/src/models/network-options.ts +11 -0
  652. package/src/utils/backup.ts +152 -0
  653. package/src/utils/index.ts +5 -0
  654. package/src/utils/logger.ts +20 -0
  655. package/src/utils/patchBigIntSerialization.ts +8 -0
  656. package/src/utils/queue.ts +76 -0
  657. package/src/utils/types.d.ts +3 -0
  658. package/src/utils/utils.ts +20 -0
  659. package/src/utils/wait.ts +5 -0
  660. package/src/utils/waitress.ts +95 -0
  661. package/src/zspec/consts.ts +84 -0
  662. package/src/zspec/enums.ts +22 -0
  663. package/src/zspec/index.ts +3 -0
  664. package/src/zspec/tstypes.ts +18 -0
  665. package/src/zspec/utils.ts +308 -0
  666. package/src/zspec/zcl/buffaloZcl.ts +1133 -0
  667. package/src/zspec/zcl/definition/cluster.ts +5766 -0
  668. package/src/zspec/zcl/definition/consts.ts +24 -0
  669. package/src/zspec/zcl/definition/enums.ts +194 -0
  670. package/src/zspec/zcl/definition/foundation.ts +301 -0
  671. package/src/zspec/zcl/definition/manufacturerCode.ts +729 -0
  672. package/src/zspec/zcl/definition/status.ts +69 -0
  673. package/src/zspec/zcl/definition/tstype.ts +268 -0
  674. package/src/zspec/zcl/index.ts +10 -0
  675. package/src/zspec/zcl/utils.ts +342 -0
  676. package/src/zspec/zcl/zclFrame.ts +336 -0
  677. package/src/zspec/zcl/zclHeader.ts +102 -0
  678. package/src/zspec/zcl/zclStatusError.ts +10 -0
  679. package/src/zspec/zdo/buffaloZdo.ts +2345 -0
  680. package/src/zspec/zdo/definition/clusters.ts +722 -0
  681. package/src/zspec/zdo/definition/consts.ts +16 -0
  682. package/src/zspec/zdo/definition/enums.ts +99 -0
  683. package/src/zspec/zdo/definition/status.ts +105 -0
  684. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  685. package/src/zspec/zdo/index.ts +7 -0
  686. package/src/zspec/zdo/utils.ts +76 -0
  687. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  688. package/test/adapter/adapter.test.ts +1062 -0
  689. package/test/adapter/ember/ash.test.ts +337 -0
  690. package/test/adapter/ember/consts.ts +131 -0
  691. package/test/adapter/ember/emberAdapter.test.ts +3449 -0
  692. package/test/adapter/ember/ezsp.test.ts +386 -0
  693. package/test/adapter/ember/ezspBuffalo.test.ts +92 -0
  694. package/test/adapter/ember/ezspError.test.ts +11 -0
  695. package/test/adapter/ember/math.test.ts +205 -0
  696. package/test/adapter/ezsp/frame.test.ts +29 -0
  697. package/test/adapter/ezsp/uart.test.ts +180 -0
  698. package/test/adapter/z-stack/adapter.test.ts +3985 -0
  699. package/test/adapter/z-stack/constants.test.ts +32 -0
  700. package/test/adapter/z-stack/structs.test.ts +114 -0
  701. package/test/adapter/z-stack/unpi.test.ts +212 -0
  702. package/test/adapter/z-stack/znp.test.ts +1284 -0
  703. package/test/adapter/zboss/fixZdoResponse.test.ts +178 -0
  704. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +80 -0
  705. package/test/adapter/zigate/zdo.test.ts +187 -0
  706. package/test/adapter/zoh/utils.test.ts +35 -0
  707. package/test/adapter/zoh/zohAdapter.test.ts +1306 -0
  708. package/test/buffalo.test.ts +430 -0
  709. package/test/controller.test.ts +10005 -0
  710. package/test/greenpower.test.ts +1421 -0
  711. package/test/mockAdapters.ts +65 -0
  712. package/test/mockDevices.ts +472 -0
  713. package/test/testUtils.ts +20 -0
  714. package/test/tsconfig.json +10 -0
  715. package/test/utils/math.ts +19 -0
  716. package/test/utils.test.ts +227 -0
  717. package/test/vitest.config.mts +25 -0
  718. package/test/zcl.test.ts +2832 -0
  719. package/test/zspec/utils.test.ts +131 -0
  720. package/test/zspec/zcl/buffalo.test.ts +1231 -0
  721. package/test/zspec/zcl/frame.test.ts +925 -0
  722. package/test/zspec/zcl/utils.test.ts +280 -0
  723. package/test/zspec/zdo/buffalo.test.ts +1849 -0
  724. package/test/zspec/zdo/utils.test.ts +240 -0
  725. package/.github/workflows/update-dependencies.yml +0 -39
  726. package/.prettierignore +0 -2
  727. package/.prettierrc +0 -26
  728. package/eslint.config.mjs +0 -32
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Device = void 0;
39
+ exports.Device = exports.InterviewState = void 0;
40
40
  const node_assert_1 = __importDefault(require("node:assert"));
41
41
  const utils_1 = require("../../utils");
42
42
  const logger_1 = require("../../utils/logger");
@@ -51,17 +51,24 @@ const entity_1 = __importDefault(require("./entity"));
51
51
  /**
52
52
  * @ignore
53
53
  */
54
- const OneJanuary2000 = new Date('January 01, 2000 00:00:00 UTC+00:00').getTime();
55
- const NS = 'zh:controller:device';
54
+ const OneJanuary2000 = new Date("January 01, 2000 00:00:00 UTC+00:00").getTime();
55
+ const NS = "zh:controller:device";
56
+ var InterviewState;
57
+ (function (InterviewState) {
58
+ InterviewState["Pending"] = "PENDING";
59
+ InterviewState["InProgress"] = "IN_PROGRESS";
60
+ InterviewState["Successful"] = "SUCCESSFUL";
61
+ InterviewState["Failed"] = "FAILED";
62
+ })(InterviewState || (exports.InterviewState = InterviewState = {}));
56
63
  class Device extends entity_1.default {
64
+ // biome-ignore lint/style/useNamingConvention: cross-repo impact
57
65
  ID;
58
66
  _applicationVersion;
59
67
  _dateCode;
60
68
  _endpoints;
61
69
  _hardwareVersion;
62
70
  _ieeeAddr;
63
- _interviewCompleted;
64
- _interviewing;
71
+ _interviewState;
65
72
  _lastSeen;
66
73
  _manufacturerID;
67
74
  _manufacturerName;
@@ -96,11 +103,8 @@ class Device extends entity_1.default {
96
103
  get endpoints() {
97
104
  return this._endpoints;
98
105
  }
99
- get interviewCompleted() {
100
- return this._interviewCompleted;
101
- }
102
- get interviewing() {
103
- return this._interviewing;
106
+ get interviewState() {
107
+ return this._interviewState;
104
108
  }
105
109
  get lastSeen() {
106
110
  return this._lastSeen;
@@ -156,7 +160,7 @@ class Device extends entity_1.default {
156
160
  return this._powerSource;
157
161
  }
158
162
  set powerSource(powerSource) {
159
- this._powerSource = typeof powerSource === 'number' ? Zcl.POWER_SOURCES[powerSource & ~(1 << 7)] : powerSource;
163
+ this._powerSource = typeof powerSource === "number" ? Zcl.POWER_SOURCES[powerSource & ~(1 << 7)] : powerSource;
160
164
  }
161
165
  get softwareBuildID() {
162
166
  return this._softwareBuildID;
@@ -220,65 +224,65 @@ class Device extends entity_1.default {
220
224
  static loadedFromDatabase = false;
221
225
  static deletedDevices = new Map();
222
226
  static nwkToIeeeCache = new Map();
223
- static ReportablePropertiesMapping = {
227
+ static REPORTABLE_PROPERTIES_MAPPING = {
224
228
  modelId: {
225
- key: 'modelID',
229
+ key: "modelID",
226
230
  set: (v, d) => {
227
231
  d.modelID = v;
228
232
  },
229
233
  },
230
234
  manufacturerName: {
231
- key: 'manufacturerName',
235
+ key: "manufacturerName",
232
236
  set: (v, d) => {
233
237
  d.manufacturerName = v;
234
238
  },
235
239
  },
236
240
  powerSource: {
237
- key: 'powerSource',
241
+ key: "powerSource",
238
242
  set: (v, d) => {
239
243
  d.powerSource = v;
240
244
  },
241
245
  },
242
246
  zclVersion: {
243
- key: 'zclVersion',
247
+ key: "zclVersion",
244
248
  set: (v, d) => {
245
249
  d.zclVersion = v;
246
250
  },
247
251
  },
248
252
  appVersion: {
249
- key: 'applicationVersion',
253
+ key: "applicationVersion",
250
254
  set: (v, d) => {
251
255
  d.applicationVersion = v;
252
256
  },
253
257
  },
254
258
  stackVersion: {
255
- key: 'stackVersion',
259
+ key: "stackVersion",
256
260
  set: (v, d) => {
257
261
  d.stackVersion = v;
258
262
  },
259
263
  },
260
264
  hwVersion: {
261
- key: 'hardwareVersion',
265
+ key: "hardwareVersion",
262
266
  set: (v, d) => {
263
267
  d.hardwareVersion = v;
264
268
  },
265
269
  },
266
270
  dateCode: {
267
- key: 'dateCode',
271
+ key: "dateCode",
268
272
  set: (v, d) => {
269
273
  d.dateCode = v;
270
274
  },
271
275
  },
272
276
  swBuildId: {
273
- key: 'softwareBuildID',
277
+ key: "softwareBuildID",
274
278
  set: (v, d) => {
275
279
  d.softwareBuildID = v;
276
280
  },
277
281
  },
278
282
  };
279
- constructor(ID, type, ieeeAddr, networkAddress, manufacturerID, endpoints, manufacturerName, powerSource, modelID, applicationVersion, stackVersion, zclVersion, hardwareVersion, dateCode, softwareBuildID, interviewCompleted, meta, lastSeen, checkinInterval, pendingRequestTimeout, gpSecurityKey) {
283
+ constructor(id, type, ieeeAddr, networkAddress, manufacturerID, endpoints, manufacturerName, powerSource, modelID, applicationVersion, stackVersion, zclVersion, hardwareVersion, dateCode, softwareBuildID, interviewState, meta, lastSeen, checkinInterval, pendingRequestTimeout, gpSecurityKey) {
280
284
  super();
281
- this.ID = ID;
285
+ this.ID = id;
282
286
  this._type = type;
283
287
  this._ieeeAddr = ieeeAddr;
284
288
  this._networkAddress = networkAddress;
@@ -293,8 +297,7 @@ class Device extends entity_1.default {
293
297
  this._hardwareVersion = hardwareVersion;
294
298
  this._dateCode = dateCode;
295
299
  this._softwareBuildID = softwareBuildID;
296
- this._interviewCompleted = interviewCompleted;
297
- this._interviewing = false;
300
+ this._interviewState = interviewState;
298
301
  this._skipDefaultResponse = false;
299
302
  this.meta = meta;
300
303
  this._lastSeen = lastSeen;
@@ -302,11 +305,11 @@ class Device extends entity_1.default {
302
305
  this._pendingRequestTimeout = pendingRequestTimeout;
303
306
  this._gpSecurityKey = gpSecurityKey;
304
307
  }
305
- createEndpoint(ID) {
306
- if (this.getEndpoint(ID)) {
307
- throw new Error(`Device '${this.ieeeAddr}' already has an endpoint '${ID}'`);
308
+ createEndpoint(id) {
309
+ if (this.getEndpoint(id)) {
310
+ throw new Error(`Device '${this.ieeeAddr}' already has an endpoint '${id}'`);
308
311
  }
309
- const endpoint = endpoint_1.default.create(ID, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
312
+ const endpoint = endpoint_1.default.create(id, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
310
313
  this.endpoints.push(endpoint);
311
314
  this.save();
312
315
  return endpoint;
@@ -316,11 +319,13 @@ class Device extends entity_1.default {
316
319
  this.ieeeAddr = ieeeAddr;
317
320
  Device.devices.set(this.ieeeAddr, this);
318
321
  Device.nwkToIeeeCache.set(this.networkAddress, this.ieeeAddr);
319
- this.endpoints.forEach((e) => (e.deviceIeeeAddress = ieeeAddr));
322
+ for (const ep of this.endpoints) {
323
+ ep.deviceIeeeAddress = ieeeAddr;
324
+ }
320
325
  this.save();
321
326
  }
322
- getEndpoint(ID) {
323
- return this.endpoints.find((e) => e.ID === ID);
327
+ getEndpoint(id) {
328
+ return this.endpoints.find((e) => e.ID === id);
324
329
  }
325
330
  // There might be multiple endpoints with same DeviceId but it is not supported and first endpoint is returned
326
331
  getEndpointByDeviceType(deviceType) {
@@ -344,20 +349,20 @@ class Device extends entity_1.default {
344
349
  }
345
350
  async onZclData(dataPayload, frame, endpoint) {
346
351
  // Update reportable properties
347
- if (frame.isCluster('genBasic') && (frame.isCommand('readRsp') || frame.isCommand('report'))) {
352
+ if (frame.isCluster("genBasic") && (frame.isCommand("readRsp") || frame.isCommand("report"))) {
348
353
  const attrKeyValue = helpers_1.ZclFrameConverter.attributeKeyValue(frame, this.manufacturerID, this.customClusters);
349
354
  for (const key in attrKeyValue) {
350
- Device.ReportablePropertiesMapping[key]?.set(attrKeyValue[key], this);
355
+ Device.REPORTABLE_PROPERTIES_MAPPING[key]?.set(attrKeyValue[key], this);
351
356
  }
352
357
  }
353
358
  // Respond to enroll requests
354
- if (frame.header.isSpecific && frame.isCluster('ssIasZone') && frame.isCommand('enrollReq')) {
359
+ if (frame.header.isSpecific && frame.isCluster("ssIasZone") && frame.isCommand("enrollReq")) {
355
360
  logger_1.logger.debug(`IAS - '${this.ieeeAddr}' responding to enroll response`, NS);
356
361
  const payload = { enrollrspcode: 0, zoneid: 23 };
357
- await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true });
362
+ await endpoint.command("ssIasZone", "enrollRsp", payload, { disableDefaultResponse: true });
358
363
  }
359
364
  // Reponse to read requests
360
- if (frame.header.isGlobal && frame.isCommand('read') && !this._customReadResponse?.(frame, endpoint)) {
365
+ if (frame.header.isGlobal && frame.isCommand("read") && !this._customReadResponse?.(frame, endpoint)) {
361
366
  const time = Math.round((new Date().getTime() - OneJanuary2000) / 1000);
362
367
  const attributes = {
363
368
  ...endpoint.clusters,
@@ -393,7 +398,7 @@ class Device extends entity_1.default {
393
398
  }
394
399
  }
395
400
  // Handle check-in from sleeping end devices
396
- if (frame.header.isSpecific && frame.isCluster('genPollCtrl') && frame.isCommand('checkin')) {
401
+ if (frame.header.isSpecific && frame.isCluster("genPollCtrl") && frame.isCommand("checkin")) {
397
402
  try {
398
403
  if (this.hasPendingRequests() || this._checkinInterval === undefined) {
399
404
  const payload = {
@@ -401,10 +406,10 @@ class Device extends entity_1.default {
401
406
  fastPollTimeout: 0,
402
407
  };
403
408
  logger_1.logger.debug(`check-in from ${this.ieeeAddr}: accepting fast-poll`, NS);
404
- await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
409
+ await endpoint.command(frame.cluster.ID, "checkinRsp", payload, { sendPolicy: "immediate" });
405
410
  // This is a good time to read the checkin interval if we haven't stored it previously
406
411
  if (this._checkinInterval === undefined) {
407
- const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
412
+ const pollPeriod = await endpoint.read("genPollCtrl", ["checkinInterval"], { sendPolicy: "immediate" });
408
413
  this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
409
414
  this.resetPendingRequestTimeout();
410
415
  logger_1.logger.debug(`Request Queue (${this.ieeeAddr}): default expiration timeout set to ${this.pendingRequestTimeout}`, NS);
@@ -413,7 +418,7 @@ class Device extends entity_1.default {
413
418
  // We *must* end fast-poll when we're done sending things. Otherwise
414
419
  // we cause undue power-drain.
415
420
  logger_1.logger.debug(`check-in from ${this.ieeeAddr}: stopping fast-poll`, NS);
416
- await endpoint.command(frame.cluster.ID, 'fastPollStop', {}, { sendPolicy: 'immediate' });
421
+ await endpoint.command(frame.cluster.ID, "fastPollStop", {}, { sendPolicy: "immediate" });
417
422
  }
418
423
  else {
419
424
  const payload = {
@@ -421,7 +426,7 @@ class Device extends entity_1.default {
421
426
  fastPollTimeout: 0,
422
427
  };
423
428
  logger_1.logger.debug(`check-in from ${this.ieeeAddr}: declining fast-poll`, NS);
424
- await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
429
+ await endpoint.command(frame.cluster.ID, "checkinRsp", payload, { sendPolicy: "immediate" });
425
430
  }
426
431
  }
427
432
  catch (error) {
@@ -429,14 +434,14 @@ class Device extends entity_1.default {
429
434
  }
430
435
  }
431
436
  // Send a default response if necessary.
432
- const isDefaultResponse = frame.header.isGlobal && frame.command.name === 'defaultRsp';
433
- const commandHasResponse = frame.command.response != undefined;
437
+ const isDefaultResponse = frame.header.isGlobal && frame.command.name === "defaultRsp";
438
+ const commandHasResponse = frame.command.response !== undefined;
434
439
  const disableDefaultResponse = frame.header.frameControl.disableDefaultResponse;
435
440
  /* v8 ignore next */
436
- const disableTuyaDefaultResponse = endpoint.getDevice().manufacturerName?.startsWith('_TZ') && process.env['DISABLE_TUYA_DEFAULT_RESPONSE'];
441
+ const disableTuyaDefaultResponse = endpoint.getDevice().manufacturerName?.startsWith("_TZ") && process.env.DISABLE_TUYA_DEFAULT_RESPONSE;
437
442
  // Sometimes messages are received twice, prevent responding twice
438
443
  const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.header.transactionSequenceNumber;
439
- if (this.type !== 'GreenPower' &&
444
+ if (this.type !== "GreenPower" &&
440
445
  !dataPayload.wasBroadcast &&
441
446
  !disableDefaultResponse &&
442
447
  !isDefaultResponse &&
@@ -482,9 +487,9 @@ class Device extends entity_1.default {
482
487
  for (const id in entry.endpoints) {
483
488
  endpoints.push(endpoint_1.default.fromDatabaseRecord(entry.endpoints[id], networkAddress, ieeeAddr));
484
489
  }
485
- const meta = entry.meta ? entry.meta : {};
486
- if (entry.type === 'Group') {
487
- throw new Error('Cannot load device from group');
490
+ const meta = entry.meta ?? {};
491
+ if (entry.type === "Group") {
492
+ throw new Error("Cannot load device from group");
488
493
  }
489
494
  // default: no timeout (messages expire immediately after first send attempt)
490
495
  let pendingRequestTimeout = 0;
@@ -498,7 +503,12 @@ class Device extends entity_1.default {
498
503
  pendingRequestTimeout = entry.checkinInterval * 1000; // milliseconds
499
504
  }
500
505
  logger_1.logger.debug(`Request Queue (${ieeeAddr}): default expiration timeout set to ${pendingRequestTimeout}`, NS);
501
- return new Device(entry.id, entry.type, ieeeAddr, networkAddress, entry.manufId, endpoints, entry.manufName, entry.powerSource, entry.modelId, entry.appVersion, entry.stackVersion, entry.zclVersion, entry.hwVersion, entry.dateCode, entry.swBuildId, entry.interviewCompleted, meta, entry.lastSeen, entry.checkinInterval, pendingRequestTimeout, entry.gpSecurityKey);
506
+ // Migrate interviewCompleted to interviewState
507
+ if (!entry.interviewState) {
508
+ entry.interviewState = entry.interviewCompleted ? InterviewState.Successful : InterviewState.Failed;
509
+ logger_1.logger.debug(`Migrated interviewState for '${ieeeAddr}': ${entry.interviewCompleted} -> ${entry.interviewState}`, NS);
510
+ }
511
+ return new Device(entry.id, entry.type, ieeeAddr, networkAddress, entry.manufId, endpoints, entry.manufName, entry.powerSource, entry.modelId, entry.appVersion, entry.stackVersion, entry.zclVersion, entry.hwVersion, entry.dateCode, entry.swBuildId, entry.interviewState, meta, entry.lastSeen, entry.checkinInterval, pendingRequestTimeout, entry.gpSecurityKey);
502
512
  }
503
513
  toDatabaseEntry() {
504
514
  const epList = this.endpoints.map((e) => e.ID);
@@ -523,7 +533,9 @@ class Device extends entity_1.default {
523
533
  dateCode: this.dateCode,
524
534
  swBuildId: this.softwareBuildID,
525
535
  zclVersion: this.zclVersion,
526
- interviewCompleted: this.interviewCompleted,
536
+ /** @deprecated Keep interviewCompleted for backwards compatibility (in case zh gets downgraded) */
537
+ interviewCompleted: this.interviewState === InterviewState.Successful,
538
+ interviewState: this.interviewState === InterviewState.InProgress ? InterviewState.Pending : this.interviewState,
527
539
  meta: this.meta,
528
540
  lastSeen: this.lastSeen,
529
541
  checkinInterval: this.checkinInterval,
@@ -531,11 +543,13 @@ class Device extends entity_1.default {
531
543
  };
532
544
  }
533
545
  save(writeDatabase = true) {
546
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
534
547
  entity_1.default.database.update(this.toDatabaseEntry(), writeDatabase);
535
548
  }
536
549
  static loadFromDatabaseIfNecessary() {
537
550
  if (!Device.loadedFromDatabase) {
538
- for (const entry of entity_1.default.database.getEntriesIterator(['Coordinator', 'EndDevice', 'Router', 'GreenPower', 'Unknown'])) {
551
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
552
+ for (const entry of entity_1.default.database.getEntriesIterator(["Coordinator", "EndDevice", "Router", "GreenPower", "Unknown"])) {
539
553
  const device = Device.fromDatabaseEntry(entry);
540
554
  Device.devices.set(device.ieeeAddr, device);
541
555
  Device.nwkToIeeeCache.set(device.networkAddress, device.ieeeAddr);
@@ -544,7 +558,7 @@ class Device extends entity_1.default {
544
558
  }
545
559
  }
546
560
  static find(ieeeOrNwkAddress, includeDeleted = false) {
547
- return typeof ieeeOrNwkAddress === 'string'
561
+ return typeof ieeeOrNwkAddress === "string"
548
562
  ? Device.byIeeeAddr(ieeeOrNwkAddress, includeDeleted)
549
563
  : Device.byNetworkAddress(ieeeOrNwkAddress, includeDeleted);
550
564
  }
@@ -579,23 +593,25 @@ class Device extends entity_1.default {
579
593
  }
580
594
  }
581
595
  }
582
- undelete(interviewCompleted) {
596
+ undelete() {
583
597
  if (Device.deletedDevices.delete(this.ieeeAddr)) {
584
598
  Device.devices.set(this.ieeeAddr, this);
585
- this._interviewCompleted = interviewCompleted ?? this._interviewCompleted;
599
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
586
600
  entity_1.default.database.insert(this.toDatabaseEntry());
587
601
  }
588
602
  else {
589
603
  throw new Error(`Device '${this.ieeeAddr}' is not deleted`);
590
604
  }
591
605
  }
592
- static create(type, ieeeAddr, networkAddress, manufacturerID, manufacturerName, powerSource, modelID, interviewCompleted, gpSecurityKey) {
606
+ static create(type, ieeeAddr, networkAddress, manufacturerID, manufacturerName, powerSource, modelID, interviewState, gpSecurityKey) {
593
607
  Device.loadFromDatabaseIfNecessary();
594
608
  if (Device.devices.has(ieeeAddr)) {
595
609
  throw new Error(`Device with IEEE address '${ieeeAddr}' already exists`);
596
610
  }
611
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
597
612
  const ID = entity_1.default.database.newID();
598
- const device = new Device(ID, type, ieeeAddr, networkAddress, manufacturerID, [], manufacturerName, powerSource, modelID, undefined, undefined, undefined, undefined, undefined, undefined, interviewCompleted, {}, undefined, undefined, 0, gpSecurityKey);
613
+ const device = new Device(ID, type, ieeeAddr, networkAddress, manufacturerID, [], manufacturerName, powerSource, modelID, undefined, undefined, undefined, undefined, undefined, undefined, interviewState, {}, undefined, undefined, 0, gpSecurityKey);
614
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
599
615
  entity_1.default.database.insert(device.toDatabaseEntry());
600
616
  Device.devices.set(device.ieeeAddr, device);
601
617
  Device.nwkToIeeeCache.set(device.networkAddress, device.ieeeAddr);
@@ -605,30 +621,31 @@ class Device extends entity_1.default {
605
621
  * Zigbee functions
606
622
  */
607
623
  async interview(ignoreCache = false) {
608
- if (this.interviewing) {
624
+ if (this.interviewState === InterviewState.InProgress) {
609
625
  const message = `Interview - interview already in progress for '${this.ieeeAddr}'`;
610
626
  logger_1.logger.debug(message, NS);
611
627
  throw new Error(message);
612
628
  }
613
629
  let err;
614
- this._interviewing = true;
630
+ this._interviewState = InterviewState.InProgress;
615
631
  logger_1.logger.debug(`Interview - start device '${this.ieeeAddr}'`, NS);
616
632
  try {
617
633
  await this.interviewInternal(ignoreCache);
618
634
  logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}'`, NS);
619
- this._interviewCompleted = true;
635
+ this._interviewState = InterviewState.Successful;
620
636
  }
621
637
  catch (error) {
622
638
  if (this.interviewQuirks()) {
639
+ this._interviewState = InterviewState.Successful;
623
640
  logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`, NS);
624
641
  }
625
642
  else {
643
+ this._interviewState = InterviewState.Failed;
626
644
  logger_1.logger.debug(`Interview - failed for device '${this.ieeeAddr}' with error '${error}'`, NS);
627
645
  err = error;
628
646
  }
629
647
  }
630
648
  finally {
631
- this._interviewing = false;
632
649
  this.save();
633
650
  }
634
651
  if (err) {
@@ -645,42 +662,40 @@ class Device extends entity_1.default {
645
662
  // https://github.com/Koenkk/zigbee2mqtt/issues/4655
646
663
  // Device does not change zoneState after enroll (event with original gateway)
647
664
  // modelID is mostly in the form of e.g. TS0202 and manufacturerName like e.g. _TYZB01_xph99wvr
648
- if (this.modelID?.match('^TS\\d*$') && (this.manufacturerName?.match('^_TZ.*_.*$') || this.manufacturerName?.match('^_TYZB01_.*$'))) {
649
- this._powerSource = this._powerSource || 'Battery';
650
- this._interviewing = false;
651
- this._interviewCompleted = true;
652
- logger_1.logger.debug(`Interview - quirks matched for Tuya end device`, NS);
665
+ if (this.modelID?.match("^TS\\d*$") && (this.manufacturerName?.match("^_TZ.*_.*$") || this.manufacturerName?.match("^_TYZB01_.*$"))) {
666
+ this._powerSource = this._powerSource || "Battery";
667
+ logger_1.logger.debug("Interview - quirks matched for Tuya end device", NS);
653
668
  return true;
654
669
  }
655
670
  // Some devices, e.g. Xiaomi end devices have a different interview procedure, after pairing they
656
671
  // report it's modelID trough a readResponse. The readResponse is received by the controller and set
657
672
  // on the device.
658
673
  const lookup = {
659
- '^3R.*?Z': {
660
- type: 'EndDevice',
661
- powerSource: 'Battery',
674
+ "^3R.*?Z": {
675
+ type: "EndDevice",
676
+ powerSource: "Battery",
662
677
  },
663
- 'lumi..*': {
664
- type: 'EndDevice',
678
+ "lumi..*": {
679
+ type: "EndDevice",
665
680
  manufacturerID: 4151,
666
- manufacturerName: 'LUMI',
667
- powerSource: 'Battery',
681
+ manufacturerName: "LUMI",
682
+ powerSource: "Battery",
668
683
  },
669
- 'TERNCY-PP01': {
670
- type: 'EndDevice',
684
+ "TERNCY-PP01": {
685
+ type: "EndDevice",
671
686
  manufacturerID: 4648,
672
- manufacturerName: 'TERNCY',
673
- powerSource: 'Battery',
687
+ manufacturerName: "TERNCY",
688
+ powerSource: "Battery",
674
689
  },
675
- '3RWS18BZ': {}, // https://github.com/Koenkk/zigbee-herdsman-converters/pull/2710
676
- 'MULTI-MECI--EA01': {},
690
+ "3RWS18BZ": {}, // https://github.com/Koenkk/zigbee-herdsman-converters/pull/2710
691
+ "MULTI-MECI--EA01": {},
677
692
  MOT003: {}, // https://github.com/Koenkk/zigbee2mqtt/issues/12471
678
- 'C-ZB-SEDC': {}, //candeo device that doesn't follow IAS enrollment process correctly and therefore fails to complete interview
679
- 'C-ZB-SEMO': {}, //candeo device that doesn't follow IAS enrollment process correctly and therefore fails to complete interview
693
+ "C-ZB-SEDC": {}, //candeo device that doesn't follow IAS enrollment process correctly and therefore fails to complete interview
694
+ "C-ZB-SEMO": {}, //candeo device that doesn't follow IAS enrollment process correctly and therefore fails to complete interview
680
695
  };
681
696
  let match;
682
697
  for (const key in lookup) {
683
- if (this.modelID && this.modelID.match(key)) {
698
+ if (this.modelID?.match(key)) {
684
699
  match = key;
685
700
  break;
686
701
  }
@@ -688,22 +703,18 @@ class Device extends entity_1.default {
688
703
  if (match) {
689
704
  const info = lookup[match];
690
705
  logger_1.logger.debug(`Interview procedure failed but got modelID matching '${match}', assuming interview succeeded`, NS);
691
- this._type = this._type === 'Unknown' && info.type ? info.type : this._type;
706
+ this._type = this._type === "Unknown" && info.type ? info.type : this._type;
692
707
  this._manufacturerID = this._manufacturerID || info.manufacturerID;
693
708
  this._manufacturerName = this._manufacturerName || info.manufacturerName;
694
709
  this._powerSource = this._powerSource || info.powerSource;
695
- this._interviewing = false;
696
- this._interviewCompleted = true;
697
710
  logger_1.logger.debug(`Interview - quirks matched on '${match}'`, NS);
698
711
  return true;
699
712
  }
700
- else {
701
- logger_1.logger.debug('Interview - quirks did not match', NS);
702
- return false;
703
- }
713
+ logger_1.logger.debug("Interview - quirks did not match", NS);
714
+ return false;
704
715
  }
705
716
  async interviewInternal(ignoreCache) {
706
- const hasNodeDescriptor = () => this._manufacturerID !== undefined && this._type !== 'Unknown';
717
+ const hasNodeDescriptor = () => this._manufacturerID !== undefined && this._type !== "Unknown";
707
718
  if (ignoreCache || !hasNodeDescriptor()) {
708
719
  for (let attempt = 0; attempt < 6; attempt++) {
709
720
  try {
@@ -715,10 +726,8 @@ class Device extends entity_1.default {
715
726
  logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`, NS);
716
727
  return;
717
728
  }
718
- else {
719
- // Most of the times the first node descriptor query fails and the seconds one succeeds.
720
- logger_1.logger.debug(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
721
- }
729
+ // Most of the times the first node descriptor query fails and the seconds one succeeds.
730
+ logger_1.logger.debug(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
722
731
  }
723
732
  }
724
733
  }
@@ -728,10 +737,10 @@ class Device extends entity_1.default {
728
737
  if (!hasNodeDescriptor()) {
729
738
  throw new Error(`Interview failed because can not get node descriptor ('${this.ieeeAddr}')`);
730
739
  }
731
- if (this.manufacturerID === 4619 && this._type === 'EndDevice') {
740
+ if (this.manufacturerID === 4619 && this._type === "EndDevice") {
732
741
  // Give Tuya end device some time to pair. Otherwise they leave immediately.
733
742
  // https://github.com/Koenkk/zigbee2mqtt/issues/5814
734
- logger_1.logger.debug('Interview - Detected Tuya end device, waiting 10 seconds...', NS);
743
+ logger_1.logger.debug("Interview - Detected Tuya end device, waiting 10 seconds...", NS);
735
744
  await (0, utils_1.wait)(10000);
736
745
  }
737
746
  else if (this.manufacturerID === 0 || this.manufacturerID === 4098) {
@@ -739,12 +748,12 @@ class Device extends entity_1.default {
739
748
  // In case the device responds, the endoint and modelID/manufacturerName are set
740
749
  // in controller.onZclOrRawData()
741
750
  // https://github.com/Koenkk/zigbee2mqtt/issues/7553
742
- logger_1.logger.debug('Interview - Detected potential Tuya end device, reading modelID and manufacturerName...', NS);
751
+ logger_1.logger.debug("Interview - Detected potential Tuya end device, reading modelID and manufacturerName...", NS);
743
752
  try {
744
753
  const endpoint = endpoint_1.default.create(1, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
745
- const result = await endpoint.read('genBasic', ['modelId', 'manufacturerName'], { sendPolicy: 'immediate' });
754
+ const result = await endpoint.read("genBasic", ["modelId", "manufacturerName"], { sendPolicy: "immediate" });
746
755
  for (const key in result) {
747
- Device.ReportablePropertiesMapping[key].set(result[key], this);
756
+ Device.REPORTABLE_PROPERTIES_MAPPING[key].set(result[key], this);
748
757
  }
749
758
  }
750
759
  catch (error) {
@@ -768,30 +777,30 @@ class Device extends entity_1.default {
768
777
  throw new Error(`Interview failed because can not get active endpoints ('${this.ieeeAddr}')`);
769
778
  }
770
779
  logger_1.logger.debug(`Interview - got active endpoints for device '${this.ieeeAddr}'`, NS);
771
- const coordinator = Device.byType('Coordinator')[0];
780
+ const coordinator = Device.byType("Coordinator")[0];
772
781
  for (const endpoint of this._endpoints) {
773
782
  await endpoint.updateSimpleDescriptor();
774
783
  logger_1.logger.debug(`Interview - got simple descriptor for endpoint '${endpoint.ID}' device '${this.ieeeAddr}'`, NS);
775
784
  // Read attributes
776
785
  // nice to have but not required for successful pairing as most of the attributes are not mandatory in ZCL specification
777
- if (endpoint.supportsInputCluster('genBasic')) {
778
- for (const key in Device.ReportablePropertiesMapping) {
779
- const item = Device.ReportablePropertiesMapping[key];
786
+ if (endpoint.supportsInputCluster("genBasic")) {
787
+ for (const key in Device.REPORTABLE_PROPERTIES_MAPPING) {
788
+ const item = Device.REPORTABLE_PROPERTIES_MAPPING[key];
780
789
  if (ignoreCache || !this[item.key]) {
781
790
  try {
782
791
  let result;
783
792
  try {
784
- result = await endpoint.read('genBasic', [key], { sendPolicy: 'immediate' });
793
+ result = await endpoint.read("genBasic", [key], { sendPolicy: "immediate" });
785
794
  }
786
795
  catch (error) {
787
796
  // Reading attributes can fail for many reason, e.g. it could be that device rejoins
788
797
  // while joining like in:
789
798
  // https://github.com/Koenkk/zigbee-herdsman-converters/issues/2485.
790
799
  // The modelID and manufacturerName are crucial for device identification, so retry.
791
- if (item.key === 'modelID' || item.key === 'manufacturerName') {
800
+ if (item.key === "modelID" || item.key === "manufacturerName") {
792
801
  logger_1.logger.debug(`Interview - first ${item.key} retrieval attempt failed, retrying after 10 seconds...`, NS);
793
802
  await (0, utils_1.wait)(10000);
794
- result = await endpoint.read('genBasic', [key], { sendPolicy: 'immediate' });
803
+ result = await endpoint.read("genBasic", [key], { sendPolicy: "immediate" });
795
804
  }
796
805
  else {
797
806
  throw error;
@@ -807,15 +816,15 @@ class Device extends entity_1.default {
807
816
  }
808
817
  }
809
818
  // Enroll IAS device
810
- if (endpoint.supportsInputCluster('ssIasZone')) {
819
+ if (endpoint.supportsInputCluster("ssIasZone")) {
811
820
  logger_1.logger.debug(`Interview - IAS - enrolling '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
812
- const stateBefore = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
821
+ const stateBefore = await endpoint.read("ssIasZone", ["iasCieAddr", "zoneState"], { sendPolicy: "immediate" });
813
822
  logger_1.logger.debug(`Interview - IAS - before enrolling state: '${JSON.stringify(stateBefore)}'`, NS);
814
823
  // Do not enroll when device has already been enrolled
815
824
  if (stateBefore.zoneState !== 1 || stateBefore.iasCieAddr !== coordinator.ieeeAddr) {
816
- logger_1.logger.debug(`Interview - IAS - not enrolled, enrolling`, NS);
817
- await endpoint.write('ssIasZone', { iasCieAddr: coordinator.ieeeAddr }, { sendPolicy: 'immediate' });
818
- logger_1.logger.debug(`Interview - IAS - wrote iasCieAddr`, NS);
825
+ logger_1.logger.debug("Interview - IAS - not enrolled, enrolling", NS);
826
+ await endpoint.write("ssIasZone", { iasCieAddr: coordinator.ieeeAddr }, { sendPolicy: "immediate" });
827
+ logger_1.logger.debug("Interview - IAS - wrote iasCieAddr", NS);
819
828
  // There are 2 enrollment procedures:
820
829
  // - Auto enroll: coordinator has to send enrollResponse without receiving an enroll request
821
830
  // this case is handled below.
@@ -825,11 +834,11 @@ class Device extends entity_1.default {
825
834
  await (0, utils_1.wait)(500);
826
835
  logger_1.logger.debug(`IAS - '${this.ieeeAddr}' sending enroll response (auto enroll)`, NS);
827
836
  const payload = { enrollrspcode: 0, zoneid: 23 };
828
- await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true, sendPolicy: 'immediate' });
837
+ await endpoint.command("ssIasZone", "enrollRsp", payload, { disableDefaultResponse: true, sendPolicy: "immediate" });
829
838
  let enrolled = false;
830
839
  for (let attempt = 0; attempt < 20; attempt++) {
831
840
  await (0, utils_1.wait)(500);
832
- const stateAfter = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
841
+ const stateAfter = await endpoint.read("ssIasZone", ["iasCieAddr", "zoneState"], { sendPolicy: "immediate" });
833
842
  logger_1.logger.debug(`Interview - IAS - after enrolling state (${attempt}): '${JSON.stringify(stateAfter)}'`, NS);
834
843
  if (stateAfter.zoneState === 1) {
835
844
  enrolled = true;
@@ -844,16 +853,16 @@ class Device extends entity_1.default {
844
853
  }
845
854
  }
846
855
  else {
847
- logger_1.logger.debug(`Interview - IAS - already enrolled, skipping enroll`, NS);
856
+ logger_1.logger.debug("Interview - IAS - already enrolled, skipping enroll", NS);
848
857
  }
849
858
  }
850
859
  }
851
860
  // Bind poll control
852
861
  try {
853
- for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('genPollCtrl'))) {
862
+ for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster("genPollCtrl"))) {
854
863
  logger_1.logger.debug(`Interview - Poll control - binding '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
855
- await endpoint.bind('genPollCtrl', coordinator.endpoints[0]);
856
- const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
864
+ await endpoint.bind("genPollCtrl", coordinator.endpoints[0]);
865
+ const pollPeriod = await endpoint.read("genPollCtrl", ["checkinInterval"], { sendPolicy: "immediate" });
857
866
  this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
858
867
  this.resetPendingRequestTimeout();
859
868
  }
@@ -866,7 +875,9 @@ class Device extends entity_1.default {
866
875
  }
867
876
  async updateNodeDescriptor() {
868
877
  const clusterId = Zdo.ClusterId.NODE_DESCRIPTOR_REQUEST;
878
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
869
879
  const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, this.networkAddress);
880
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
870
881
  const response = await entity_1.default.adapter.sendZdo(this.ieeeAddr, this.networkAddress, clusterId, zdoPayload, false);
871
882
  if (!Zdo.Buffalo.checkStatus(response)) {
872
883
  throw new Zdo.StatusError(response[0]);
@@ -876,13 +887,13 @@ class Device extends entity_1.default {
876
887
  this._manufacturerID = nodeDescriptor.manufacturerCode;
877
888
  switch (nodeDescriptor.logicalType) {
878
889
  case 0x0:
879
- this._type = 'Coordinator';
890
+ this._type = "Coordinator";
880
891
  break;
881
892
  case 0x1:
882
- this._type = 'Router';
893
+ this._type = "Router";
883
894
  break;
884
895
  case 0x2:
885
- this._type = 'EndDevice';
896
+ this._type = "EndDevice";
886
897
  break;
887
898
  }
888
899
  logger_1.logger.debug(`Interview - got node descriptor for device '${this.ieeeAddr}'`, NS);
@@ -890,13 +901,15 @@ class Device extends entity_1.default {
890
901
  // log for devices older than 1 from current revision
891
902
  if (nodeDescriptor.serverMask.stackComplianceRevision < ZSpec.ZIGBEE_REVISION - 1) {
892
903
  // always 0 before revision 21 where field was added
893
- const rev = nodeDescriptor.serverMask.stackComplianceRevision < 21 ? 'pre-21' : nodeDescriptor.serverMask.stackComplianceRevision;
904
+ const rev = nodeDescriptor.serverMask.stackComplianceRevision < 21 ? "pre-21" : nodeDescriptor.serverMask.stackComplianceRevision;
894
905
  logger_1.logger.info(`Device '${this.ieeeAddr}' is only compliant to revision '${rev}' of the ZigBee specification (current revision: ${ZSpec.ZIGBEE_REVISION}).`, NS);
895
906
  }
896
907
  }
897
908
  async updateActiveEndpoints() {
898
909
  const clusterId = Zdo.ClusterId.ACTIVE_ENDPOINTS_REQUEST;
910
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
899
911
  const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, this.networkAddress);
912
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
900
913
  const response = await entity_1.default.adapter.sendZdo(this.ieeeAddr, this.networkAddress, clusterId, zdoPayload, false);
901
914
  if (!Zdo.Buffalo.checkStatus(response)) {
902
915
  throw new Zdo.StatusError(response[0]);
@@ -921,21 +934,27 @@ class Device extends entity_1.default {
921
934
  */
922
935
  async requestNetworkAddress() {
923
936
  const clusterId = Zdo.ClusterId.NETWORK_ADDRESS_REQUEST;
937
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
924
938
  const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, this.ieeeAddr, false, 0);
939
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
925
940
  await entity_1.default.adapter.sendZdo(this.ieeeAddr, ZSpec.BroadcastAddress.RX_ON_WHEN_IDLE, clusterId, zdoPayload, true);
926
941
  }
927
942
  async removeFromNetwork() {
928
- if (this._type === 'GreenPower') {
943
+ if (this._type === "GreenPower") {
929
944
  const payload = {
930
945
  options: 0x002550,
931
946
  srcID: Number(this.ieeeAddr),
932
947
  };
933
- const frame = Zcl.Frame.create(Zcl.FrameType.SPECIFIC, Zcl.Direction.SERVER_TO_CLIENT, true, undefined, zclTransactionSequenceNumber_1.default.next(), 'pairing', 33, payload, this.customClusters);
948
+ const frame = Zcl.Frame.create(Zcl.FrameType.SPECIFIC, Zcl.Direction.SERVER_TO_CLIENT, true, undefined, zclTransactionSequenceNumber_1.default.next(), "pairing", 33, payload, this.customClusters);
949
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
934
950
  await entity_1.default.adapter.sendZclFrameToAll(242, frame, 242, enums_1.BroadcastAddress.RX_ON_WHEN_IDLE);
935
951
  }
936
952
  else {
937
953
  const clusterId = Zdo.ClusterId.LEAVE_REQUEST;
938
- const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, this.ieeeAddr, Zdo.LeaveRequestFlags.WITHOUT_REJOIN);
954
+ const zdoPayload = Zdo.Buffalo.buildRequest(
955
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
956
+ entity_1.default.adapter.hasZdoMessageOverhead, clusterId, this.ieeeAddr, Zdo.LeaveRequestFlags.WITHOUT_REJOIN);
957
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
939
958
  const response = await entity_1.default.adapter.sendZdo(this.ieeeAddr, this.networkAddress, clusterId, zdoPayload, false);
940
959
  if (!Zdo.Buffalo.checkStatus(response)) {
941
960
  throw new Zdo.StatusError(response[0]);
@@ -948,14 +967,16 @@ class Device extends entity_1.default {
948
967
  for (const endpoint of this.endpoints) {
949
968
  endpoint.removeFromAllGroupsDatabase();
950
969
  }
970
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
951
971
  if (entity_1.default.database.has(this.ID)) {
972
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
952
973
  entity_1.default.database.remove(this.ID);
953
974
  }
954
975
  Device.deletedDevices.set(this.ieeeAddr, this);
955
976
  Device.devices.delete(this.ieeeAddr);
956
977
  // Clear all data in case device joins again
957
- this._interviewCompleted = false;
958
- this._interviewing = false;
978
+ // Green power devices are never interviewed, keep existing interview state.
979
+ this._interviewState = this.type === "GreenPower" ? this._interviewState : InterviewState.Pending;
959
980
  this.meta = {};
960
981
  const newEndpoints = [];
961
982
  for (const endpoint of this.endpoints) {
@@ -968,7 +989,9 @@ class Device extends entity_1.default {
968
989
  // TODO return Zdo.LQITableEntry directly (requires updates in other repos)
969
990
  const neighbors = [];
970
991
  const request = async (startIndex) => {
992
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
971
993
  const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, startIndex);
994
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
972
995
  const response = await entity_1.default.adapter.sendZdo(this.ieeeAddr, this.networkAddress, clusterId, zdoPayload, false);
973
996
  if (!Zdo.Buffalo.checkStatus(response)) {
974
997
  throw new Zdo.StatusError(response[0]);
@@ -999,7 +1022,9 @@ class Device extends entity_1.default {
999
1022
  // TODO return Zdo.RoutingTableEntry directly (requires updates in other repos)
1000
1023
  const table = [];
1001
1024
  const request = async (startIndex) => {
1025
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
1002
1026
  const zdoPayload = Zdo.Buffalo.buildRequest(entity_1.default.adapter.hasZdoMessageOverhead, clusterId, startIndex);
1027
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
1003
1028
  const response = await entity_1.default.adapter.sendZdo(this.ieeeAddr, this.networkAddress, clusterId, zdoPayload, false);
1004
1029
  if (!Zdo.Buffalo.checkStatus(response)) {
1005
1030
  throw new Zdo.StatusError(response[0]);
@@ -1028,10 +1053,10 @@ class Device extends entity_1.default {
1028
1053
  // of a mandatory basic cluster attribute to keep it as lightweight as
1029
1054
  // possible.
1030
1055
  const endpoint = this.endpoints.find((ep) => ep.inputClusters.includes(0)) ?? this.endpoints[0];
1031
- await endpoint.read('genBasic', ['zclVersion'], { disableRecovery });
1056
+ await endpoint.read("genBasic", ["zclVersion"], { disableRecovery });
1032
1057
  }
1033
1058
  addCustomCluster(name, cluster) {
1034
- (0, node_assert_1.default)(![Zcl.Clusters.touchlink.ID, Zcl.Clusters.greenPower.ID].includes(cluster.ID), 'Overriding of greenPower or touchlink cluster is not supported');
1059
+ (0, node_assert_1.default)(![Zcl.Clusters.touchlink.ID, Zcl.Clusters.greenPower.ID].includes(cluster.ID), "Overriding of greenPower or touchlink cluster is not supported");
1035
1060
  if (Zcl.Utils.isClusterName(name)) {
1036
1061
  const existingCluster = Zcl.Clusters[name];
1037
1062
  // Extend existing cluster