@willieee802/zigbee-herdsman 0.48.3 → 0.49.1

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 (1045) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  2. package/.github/copilot-instructions.md +689 -0
  3. package/.github/dependabot.yml +22 -0
  4. package/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +294 -0
  5. package/.github/prompts/create-agentsmd.prompt.md +249 -0
  6. package/.github/prompts/create-specification.prompt.md +127 -0
  7. package/.github/prompts/review-and-refactor.prompt.md +15 -0
  8. package/.github/prompts/update-specification.prompt.md +127 -0
  9. package/.github/workflows/ci.yml +70 -0
  10. package/.github/workflows/release-please.yml +18 -0
  11. package/.github/workflows/stale.yml +20 -0
  12. package/.github/workflows/typedoc.yaml +47 -0
  13. package/.release-please-manifest.json +2 -2
  14. package/.vscode/extensions.json +3 -0
  15. package/.vscode/settings.json +11 -0
  16. package/AGENTS.md +441 -0
  17. package/CHANGELOG.md +1283 -0
  18. package/README.md +1 -1
  19. package/biome.json +103 -0
  20. package/dist/adapter/adapter.d.ts.map +1 -1
  21. package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
  22. package/dist/adapter/const.d.ts.map +1 -0
  23. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  24. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  25. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  26. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  27. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  28. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  29. package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
  30. package/dist/adapter/events.d.ts.map +1 -1
  31. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  32. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  33. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  34. package/dist/adapter/ezsp/driver/index.d.ts.map +1 -1
  35. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  36. package/dist/adapter/index.d.ts.map +1 -1
  37. package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -1
  38. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  39. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  40. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
  41. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
  42. package/dist/adapter/zboss/driver.d.ts.map +1 -0
  43. package/dist/adapter/zboss/frame.d.ts.map +1 -0
  44. package/dist/adapter/zboss/frame.js +200 -0
  45. package/dist/adapter/zboss/frame.js.map +1 -0
  46. package/dist/adapter/zboss/uart.d.ts.map +1 -0
  47. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  48. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  49. package/dist/adapter/zigate/driver/buffaloZiGate.js +70 -62
  50. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  51. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  52. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  53. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
  54. package/dist/controller/controller.d.ts.map +1 -1
  55. package/dist/controller/controller.js +524 -350
  56. package/dist/controller/controller.js.map +1 -1
  57. package/dist/controller/database.d.ts.map +1 -1
  58. package/dist/controller/events.d.ts.map +1 -1
  59. package/dist/controller/events.js +0 -110
  60. package/dist/controller/events.js.map +1 -1
  61. package/dist/controller/greenPower.d.ts.map +1 -1
  62. package/dist/controller/greenPower.js +330 -121
  63. package/dist/controller/greenPower.js.map +1 -1
  64. package/dist/controller/helpers/index.d.ts.map +1 -1
  65. package/dist/controller/helpers/ota.d.ts.map +1 -0
  66. package/dist/controller/helpers/ota.js +467 -0
  67. package/dist/controller/helpers/ota.js.map +1 -0
  68. package/dist/controller/helpers/request.d.ts.map +1 -1
  69. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  70. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  71. package/dist/controller/helpers/zclFrameConverter.js +36 -22
  72. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  73. package/dist/controller/index.d.ts.map +1 -1
  74. package/dist/controller/model/device.d.ts.map +1 -1
  75. package/dist/controller/model/device.js +1052 -402
  76. package/dist/controller/model/device.js.map +1 -1
  77. package/dist/controller/model/endpoint.d.ts.map +1 -1
  78. package/dist/controller/model/endpoint.js +447 -292
  79. package/dist/controller/model/endpoint.js.map +1 -1
  80. package/dist/controller/model/entity.d.ts.map +1 -1
  81. package/dist/controller/model/group.d.ts.map +1 -1
  82. package/dist/controller/model/group.js +202 -85
  83. package/dist/controller/model/group.js.map +1 -1
  84. package/dist/controller/model/index.d.ts.map +1 -1
  85. package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
  86. package/dist/controller/touchlink.d.ts.map +1 -1
  87. package/dist/controller/tstype.d.ts.map +1 -1
  88. package/dist/controller/tstype.js +0 -6
  89. package/dist/controller/tstype.js.map +1 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/utils/timeService.d.ts.map +1 -0
  92. package/dist/utils/timeService.js +127 -0
  93. package/dist/utils/timeService.js.map +1 -0
  94. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  95. package/dist/zspec/zcl/buffaloZcl.js +327 -287
  96. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  97. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  98. package/dist/zspec/zcl/definition/cluster.js +6050 -4043
  99. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  100. package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
  101. package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
  102. package/dist/zspec/zcl/definition/clusters-types.js +3 -0
  103. package/dist/zspec/zcl/definition/clusters-types.js.map +1 -0
  104. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  105. package/dist/zspec/zcl/definition/foundation.js +170 -99
  106. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  107. package/dist/zspec/zcl/definition/tstype.d.ts +190 -31
  108. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  109. package/dist/zspec/zcl/definition/tstype.js +0 -1
  110. package/dist/zspec/zcl/definition/tstype.js.map +1 -1
  111. package/dist/zspec/zcl/index.d.ts.map +1 -1
  112. package/dist/zspec/zcl/index.js +23 -13
  113. package/dist/zspec/zcl/index.js.map +1 -1
  114. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  115. package/dist/zspec/zcl/utils.js +288 -103
  116. package/dist/zspec/zcl/utils.js.map +1 -1
  117. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  118. package/dist/zspec/zcl/zclFrame.js +121 -97
  119. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  120. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
  121. package/dist/zspec/zcl/zclHeader.js +13 -13
  122. package/dist/zspec/zcl/zclHeader.js.map +1 -1
  123. package/examples/join-and-log.js +18 -18
  124. package/package.json +23 -3
  125. package/release-please-config.json +8 -8
  126. package/scripts/check-clusters-changes.ts +328 -0
  127. package/scripts/clusters-changes.log +584 -0
  128. package/scripts/clusters-typegen.ts +608 -0
  129. package/scripts/utils.ts +88 -0
  130. package/scripts/zap-update-clusters-report.json +303 -0
  131. package/scripts/zap-update-clusters.ts +1520 -0
  132. package/scripts/zap-update-types.ts +707 -0
  133. package/scripts/zap-xml-clusters-overrides-data.ts +52 -0
  134. package/scripts/zap-xml-clusters-overrides.ts +400 -0
  135. package/scripts/zap-xml-types.ts +146 -0
  136. package/src/adapter/adapter.ts +210 -0
  137. package/src/adapter/adapterDiscovery.ts +736 -0
  138. package/src/adapter/const.ts +12 -0
  139. package/src/adapter/deconz/adapter/deconzAdapter.ts +888 -0
  140. package/src/adapter/deconz/driver/constants.ts +246 -0
  141. package/src/adapter/deconz/driver/driver.ts +1528 -0
  142. package/src/adapter/deconz/driver/frame.ts +11 -0
  143. package/src/adapter/deconz/driver/frameParser.ts +766 -0
  144. package/src/adapter/deconz/driver/parser.ts +45 -0
  145. package/src/adapter/deconz/driver/writer.ts +22 -0
  146. package/src/adapter/deconz/types.d.ts +13 -0
  147. package/src/adapter/ember/adapter/emberAdapter.ts +2262 -0
  148. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  149. package/src/adapter/ember/adapter/oneWaitress.ts +324 -0
  150. package/src/adapter/ember/adapter/tokensManager.ts +780 -0
  151. package/src/adapter/ember/consts.ts +178 -0
  152. package/src/adapter/ember/enums.ts +1746 -0
  153. package/src/adapter/ember/ezsp/buffalo.ts +1392 -0
  154. package/src/adapter/ember/ezsp/consts.ts +148 -0
  155. package/src/adapter/ember/ezsp/enums.ts +1114 -0
  156. package/src/adapter/ember/ezsp/ezsp.ts +9073 -0
  157. package/src/adapter/ember/ezspError.ts +10 -0
  158. package/src/adapter/ember/types.ts +866 -0
  159. package/src/adapter/ember/uart/ash.ts +1933 -0
  160. package/src/adapter/ember/uart/consts.ts +109 -0
  161. package/src/adapter/ember/uart/enums.ts +192 -0
  162. package/src/adapter/ember/uart/parser.ts +42 -0
  163. package/src/adapter/ember/uart/queues.ts +247 -0
  164. package/src/adapter/ember/uart/writer.ts +50 -0
  165. package/src/adapter/ember/utils/initters.ts +58 -0
  166. package/src/adapter/ember/utils/math.ts +71 -0
  167. package/src/adapter/events.ts +21 -0
  168. package/src/adapter/ezsp/adapter/backup.ts +100 -0
  169. package/src/adapter/ezsp/adapter/ezspAdapter.ts +632 -0
  170. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  171. package/src/adapter/ezsp/driver/consts.ts +11 -0
  172. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  173. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  174. package/src/adapter/ezsp/driver/frame.ts +101 -0
  175. package/src/adapter/ezsp/driver/index.ts +4 -0
  176. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  177. package/src/adapter/ezsp/driver/parser.ts +81 -0
  178. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  179. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  180. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  181. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  182. package/src/adapter/ezsp/driver/uart.ts +460 -0
  183. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  184. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  185. package/src/adapter/ezsp/driver/writer.ts +64 -0
  186. package/src/adapter/index.ts +3 -0
  187. package/src/adapter/serialPort.ts +58 -0
  188. package/src/adapter/tstype.ts +57 -0
  189. package/src/adapter/utils.ts +41 -0
  190. package/src/adapter/z-stack/adapter/adapter-backup.ts +509 -0
  191. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  192. package/src/adapter/z-stack/adapter/endpoints.ts +60 -0
  193. package/src/adapter/z-stack/adapter/manager.ts +543 -0
  194. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  195. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1350 -0
  196. package/src/adapter/z-stack/constants/af.ts +27 -0
  197. package/src/adapter/z-stack/constants/common.ts +285 -0
  198. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  199. package/src/adapter/z-stack/constants/index.ts +11 -0
  200. package/src/adapter/z-stack/constants/mac.ts +128 -0
  201. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  202. package/src/adapter/z-stack/constants/sys.ts +72 -0
  203. package/src/adapter/z-stack/constants/util.ts +82 -0
  204. package/src/adapter/z-stack/constants/utils.ts +14 -0
  205. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  206. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  207. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  208. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  209. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  210. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  211. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  212. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  213. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  214. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  215. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  216. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  217. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  218. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  219. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  220. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  221. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  222. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  223. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  224. package/src/adapter/z-stack/structs/index.ts +4 -0
  225. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  226. package/src/adapter/z-stack/structs/struct.ts +367 -0
  227. package/src/adapter/z-stack/structs/table.ts +198 -0
  228. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  229. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  230. package/src/adapter/z-stack/unpi/index.ts +4 -0
  231. package/src/adapter/z-stack/unpi/parser.ts +67 -0
  232. package/src/adapter/z-stack/unpi/writer.ts +37 -0
  233. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  234. package/src/adapter/z-stack/utils/index.ts +2 -0
  235. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  236. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  237. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  238. package/src/adapter/z-stack/znp/index.ts +2 -0
  239. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  240. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  241. package/src/adapter/z-stack/znp/utils.ts +10 -0
  242. package/src/adapter/z-stack/znp/znp.ts +345 -0
  243. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  244. package/src/adapter/zboss/adapter/zbossAdapter.ts +535 -0
  245. package/src/adapter/zboss/commands.ts +1184 -0
  246. package/src/adapter/zboss/consts.ts +9 -0
  247. package/src/adapter/zboss/driver.ts +422 -0
  248. package/src/adapter/zboss/enums.ts +360 -0
  249. package/src/adapter/zboss/frame.ts +227 -0
  250. package/src/adapter/zboss/reader.ts +65 -0
  251. package/src/adapter/zboss/types.ts +0 -0
  252. package/src/adapter/zboss/uart.ts +428 -0
  253. package/src/adapter/zboss/utils.ts +58 -0
  254. package/src/adapter/zboss/writer.ts +49 -0
  255. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +25 -0
  256. package/src/adapter/zigate/adapter/zigateAdapter.ts +633 -0
  257. package/src/adapter/zigate/driver/LICENSE +17 -0
  258. package/src/adapter/zigate/driver/buffaloZiGate.ts +210 -0
  259. package/src/adapter/zigate/driver/commandType.ts +418 -0
  260. package/src/adapter/zigate/driver/constants.ts +150 -0
  261. package/src/adapter/zigate/driver/frame.ts +197 -0
  262. package/src/adapter/zigate/driver/messageType.ts +287 -0
  263. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  264. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  265. package/src/adapter/zigate/driver/zigate.ts +422 -0
  266. package/src/adapter/zoh/adapter/utils.ts +27 -0
  267. package/src/adapter/zoh/adapter/zohAdapter.ts +931 -0
  268. package/src/buffalo/buffalo.ts +336 -0
  269. package/src/buffalo/index.ts +1 -0
  270. package/src/controller/controller.ts +1159 -0
  271. package/src/controller/database.ts +148 -0
  272. package/src/controller/events.ts +52 -0
  273. package/src/controller/greenPower.ts +613 -0
  274. package/src/controller/helpers/index.ts +1 -0
  275. package/src/controller/helpers/installCodes.ts +107 -0
  276. package/src/controller/helpers/ota.ts +578 -0
  277. package/src/controller/helpers/request.ts +96 -0
  278. package/src/controller/helpers/requestQueue.ts +126 -0
  279. package/src/controller/helpers/zclFrameConverter.ts +64 -0
  280. package/src/controller/helpers/zclTransactionSequenceNumber.ts +15 -0
  281. package/src/controller/index.ts +6 -0
  282. package/src/controller/model/device.ts +1791 -0
  283. package/src/controller/model/endpoint.ts +1235 -0
  284. package/src/controller/model/entity.ts +43 -0
  285. package/src/controller/model/group.ts +446 -0
  286. package/src/controller/model/index.ts +5 -0
  287. package/src/controller/model/konnextConfig.ts +6 -0
  288. package/src/controller/model/zigbeeEntity.ts +30 -0
  289. package/src/controller/touchlink.ts +195 -0
  290. package/src/controller/tstype.ts +374 -0
  291. package/src/index.ts +14 -0
  292. package/src/models/backup-storage-legacy.ts +48 -0
  293. package/src/models/backup-storage-unified.ts +47 -0
  294. package/src/models/backup.ts +37 -0
  295. package/src/models/index.ts +5 -0
  296. package/src/models/network-options.ts +11 -0
  297. package/src/utils/aes.ts +218 -0
  298. package/src/utils/async-mutex.ts +31 -0
  299. package/src/utils/backup.ts +152 -0
  300. package/src/utils/index.ts +5 -0
  301. package/src/utils/logger.ts +20 -0
  302. package/src/utils/patchBigIntSerialization.ts +8 -0
  303. package/src/utils/queue.ts +79 -0
  304. package/src/utils/timeService.ts +139 -0
  305. package/src/utils/utils.ts +19 -0
  306. package/src/utils/wait.ts +5 -0
  307. package/src/utils/waitress.ts +96 -0
  308. package/src/zspec/consts.ts +89 -0
  309. package/src/zspec/enums.ts +22 -0
  310. package/src/zspec/index.ts +3 -0
  311. package/src/zspec/tstypes.ts +18 -0
  312. package/src/zspec/utils.ts +247 -0
  313. package/src/zspec/zcl/buffaloZcl.ts +1073 -0
  314. package/src/zspec/zcl/definition/cluster.ts +7554 -0
  315. package/src/zspec/zcl/definition/clusters-types.ts +8228 -0
  316. package/src/zspec/zcl/definition/consts.ts +24 -0
  317. package/src/zspec/zcl/definition/datatypes.ts +2454 -0
  318. package/src/zspec/zcl/definition/enums.ts +224 -0
  319. package/src/zspec/zcl/definition/foundation.ts +342 -0
  320. package/src/zspec/zcl/definition/manufacturerCode.ts +730 -0
  321. package/src/zspec/zcl/definition/status.ts +69 -0
  322. package/src/zspec/zcl/definition/tstype.ts +432 -0
  323. package/src/zspec/zcl/index.ts +11 -0
  324. package/src/zspec/zcl/utils.ts +504 -0
  325. package/src/zspec/zcl/zclFrame.ts +383 -0
  326. package/src/zspec/zcl/zclHeader.ts +102 -0
  327. package/src/zspec/zcl/zclStatusError.ts +10 -0
  328. package/src/zspec/zdo/buffaloZdo.ts +2336 -0
  329. package/src/zspec/zdo/definition/clusters.ts +722 -0
  330. package/src/zspec/zdo/definition/consts.ts +16 -0
  331. package/src/zspec/zdo/definition/enums.ts +99 -0
  332. package/src/zspec/zdo/definition/status.ts +105 -0
  333. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  334. package/src/zspec/zdo/index.ts +7 -0
  335. package/src/zspec/zdo/utils.ts +76 -0
  336. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  337. package/test/adapter/adapter.test.ts +1276 -0
  338. package/test/adapter/ember/ash.test.ts +337 -0
  339. package/test/adapter/ember/consts.ts +131 -0
  340. package/test/adapter/ember/emberAdapter.test.ts +3447 -0
  341. package/test/adapter/ember/ezsp.test.ts +389 -0
  342. package/test/adapter/ember/ezspBuffalo.test.ts +93 -0
  343. package/test/adapter/ember/ezspError.test.ts +12 -0
  344. package/test/adapter/ember/math.test.ts +190 -0
  345. package/test/adapter/ezsp/frame.test.ts +30 -0
  346. package/test/adapter/ezsp/uart.test.ts +181 -0
  347. package/test/adapter/z-stack/adapter.test.ts +4260 -0
  348. package/test/adapter/z-stack/constants.test.ts +33 -0
  349. package/test/adapter/z-stack/structs.test.ts +115 -0
  350. package/test/adapter/z-stack/unpi.test.ts +213 -0
  351. package/test/adapter/z-stack/znp.test.ts +1288 -0
  352. package/test/adapter/zboss/fixZdoResponse.test.ts +179 -0
  353. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +81 -0
  354. package/test/adapter/zigate/zdo.test.ts +187 -0
  355. package/test/adapter/zoh/utils.test.ts +36 -0
  356. package/test/adapter/zoh/zohAdapter.test.ts +1451 -0
  357. package/test/benchOptions.ts +14 -0
  358. package/test/buffalo.test.ts +431 -0
  359. package/test/controller.bench.ts +215 -0
  360. package/test/controller.test.ts +10038 -0
  361. package/test/data/integrity-code-1166-012B-24031511-upgradeMe-RB 249 T.zigbee +0 -0
  362. package/test/data/manuf-tags-tradfri-cv-cct-unified_release_prod_v587757105_33e34452-9267-4665-bc5a-844c8f61f063.ota +0 -0
  363. package/test/data/padded-tretakt_smart_plug_soc-0x1100-2.4.25-prod.ota.ota.signed +0 -0
  364. package/test/data/telink-aes-A60_RGBW_T-0x00B6-0x03483712-MF_DIS.OTA +0 -0
  365. package/test/data/zbminir2_v1.0.8.ota +0 -0
  366. package/test/device-ota.test.ts +3332 -0
  367. package/test/greenpower.test.ts +1409 -0
  368. package/test/mockAdapters.ts +95 -0
  369. package/test/mockDevices.ts +623 -0
  370. package/test/requests.bench.ts +321 -0
  371. package/test/testUtils.ts +20 -0
  372. package/test/timeService.test.ts +214 -0
  373. package/test/tsconfig.json +9 -0
  374. package/test/utils/math.ts +19 -0
  375. package/test/utils.test.ts +352 -0
  376. package/test/vitest.config.mts +28 -0
  377. package/test/vitest.ts +9 -0
  378. package/test/zcl.test.ts +2887 -0
  379. package/test/zspec/utils.test.ts +68 -0
  380. package/test/zspec/zcl/buffalo.test.ts +1316 -0
  381. package/test/zspec/zcl/frame.test.ts +1056 -0
  382. package/test/zspec/zcl/utils.test.ts +650 -0
  383. package/test/zspec/zdo/buffalo.test.ts +1850 -0
  384. package/test/zspec/zdo/utils.test.ts +241 -0
  385. package/tsconfig.json +8 -10
  386. package/.babelrc.js +0 -6
  387. package/.eslintignore +0 -3
  388. package/dist/adapter/adapter.d.ts +0 -64
  389. package/dist/adapter/adapter.js +0 -157
  390. package/dist/adapter/adapter.js.map +0 -1
  391. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +0 -71
  392. package/dist/adapter/deconz/adapter/deconzAdapter.js +0 -1072
  393. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +0 -1
  394. package/dist/adapter/deconz/adapter/index.d.ts +0 -3
  395. package/dist/adapter/deconz/adapter/index.d.ts.map +0 -1
  396. package/dist/adapter/deconz/adapter/index.js +0 -11
  397. package/dist/adapter/deconz/adapter/index.js.map +0 -1
  398. package/dist/adapter/deconz/driver/constants.d.ts +0 -105
  399. package/dist/adapter/deconz/driver/constants.d.ts.map +0 -1
  400. package/dist/adapter/deconz/driver/constants.js +0 -56
  401. package/dist/adapter/deconz/driver/constants.js.map +0 -1
  402. package/dist/adapter/deconz/driver/driver.d.ts +0 -82
  403. package/dist/adapter/deconz/driver/driver.d.ts.map +0 -1
  404. package/dist/adapter/deconz/driver/driver.js +0 -751
  405. package/dist/adapter/deconz/driver/driver.js.map +0 -1
  406. package/dist/adapter/deconz/driver/frame.d.ts +0 -7
  407. package/dist/adapter/deconz/driver/frame.d.ts.map +0 -1
  408. package/dist/adapter/deconz/driver/frame.js +0 -14
  409. package/dist/adapter/deconz/driver/frame.js.map +0 -1
  410. package/dist/adapter/deconz/driver/frameParser.d.ts +0 -3
  411. package/dist/adapter/deconz/driver/frameParser.d.ts.map +0 -1
  412. package/dist/adapter/deconz/driver/frameParser.js +0 -444
  413. package/dist/adapter/deconz/driver/frameParser.js.map +0 -1
  414. package/dist/adapter/deconz/driver/parser.d.ts +0 -13
  415. package/dist/adapter/deconz/driver/parser.d.ts.map +0 -1
  416. package/dist/adapter/deconz/driver/parser.js +0 -64
  417. package/dist/adapter/deconz/driver/parser.js.map +0 -1
  418. package/dist/adapter/deconz/driver/writer.d.ts +0 -9
  419. package/dist/adapter/deconz/driver/writer.d.ts.map +0 -1
  420. package/dist/adapter/deconz/driver/writer.js +0 -45
  421. package/dist/adapter/deconz/driver/writer.js.map +0 -1
  422. package/dist/adapter/ember/adapter/emberAdapter.d.ts +0 -806
  423. package/dist/adapter/ember/adapter/emberAdapter.js +0 -2942
  424. package/dist/adapter/ember/adapter/emberAdapter.js.map +0 -1
  425. package/dist/adapter/ember/adapter/endpoints.d.ts +0 -27
  426. package/dist/adapter/ember/adapter/endpoints.js +0 -68
  427. package/dist/adapter/ember/adapter/endpoints.js.map +0 -1
  428. package/dist/adapter/ember/adapter/index.d.ts +0 -3
  429. package/dist/adapter/ember/adapter/index.d.ts.map +0 -1
  430. package/dist/adapter/ember/adapter/index.js +0 -6
  431. package/dist/adapter/ember/adapter/index.js.map +0 -1
  432. package/dist/adapter/ember/adapter/oneWaitress.d.ts +0 -108
  433. package/dist/adapter/ember/adapter/oneWaitress.js +0 -241
  434. package/dist/adapter/ember/adapter/oneWaitress.js.map +0 -1
  435. package/dist/adapter/ember/adapter/requestQueue.d.ts +0 -57
  436. package/dist/adapter/ember/adapter/requestQueue.d.ts.map +0 -1
  437. package/dist/adapter/ember/adapter/requestQueue.js +0 -139
  438. package/dist/adapter/ember/adapter/requestQueue.js.map +0 -1
  439. package/dist/adapter/ember/adapter/tokensManager.d.ts +0 -69
  440. package/dist/adapter/ember/adapter/tokensManager.js +0 -688
  441. package/dist/adapter/ember/adapter/tokensManager.js.map +0 -1
  442. package/dist/adapter/ember/consts.d.ts +0 -191
  443. package/dist/adapter/ember/consts.d.ts.map +0 -1
  444. package/dist/adapter/ember/consts.js +0 -246
  445. package/dist/adapter/ember/consts.js.map +0 -1
  446. package/dist/adapter/ember/enums.d.ts +0 -2172
  447. package/dist/adapter/ember/enums.d.ts.map +0 -1
  448. package/dist/adapter/ember/enums.js +0 -2375
  449. package/dist/adapter/ember/enums.js.map +0 -1
  450. package/dist/adapter/ember/ezsp/buffalo.d.ts +0 -156
  451. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +0 -1
  452. package/dist/adapter/ember/ezsp/buffalo.js +0 -1033
  453. package/dist/adapter/ember/ezsp/buffalo.js.map +0 -1
  454. package/dist/adapter/ember/ezsp/consts.d.ts +0 -116
  455. package/dist/adapter/ember/ezsp/consts.d.ts.map +0 -1
  456. package/dist/adapter/ember/ezsp/consts.js +0 -128
  457. package/dist/adapter/ember/ezsp/consts.js.map +0 -1
  458. package/dist/adapter/ember/ezsp/enums.d.ts +0 -879
  459. package/dist/adapter/ember/ezsp/enums.d.ts.map +0 -1
  460. package/dist/adapter/ember/ezsp/enums.js +0 -948
  461. package/dist/adapter/ember/ezsp/enums.js.map +0 -1
  462. package/dist/adapter/ember/ezsp/ezsp.d.ts +0 -2662
  463. package/dist/adapter/ember/ezsp/ezsp.js +0 -6454
  464. package/dist/adapter/ember/ezsp/ezsp.js.map +0 -1
  465. package/dist/adapter/ember/types.d.ts +0 -733
  466. package/dist/adapter/ember/types.d.ts.map +0 -1
  467. package/dist/adapter/ember/types.js +0 -3
  468. package/dist/adapter/ember/types.js.map +0 -1
  469. package/dist/adapter/ember/uart/ash.d.ts +0 -464
  470. package/dist/adapter/ember/uart/ash.d.ts.map +0 -1
  471. package/dist/adapter/ember/uart/ash.js +0 -1633
  472. package/dist/adapter/ember/uart/ash.js.map +0 -1
  473. package/dist/adapter/ember/uart/consts.d.ts +0 -91
  474. package/dist/adapter/ember/uart/consts.d.ts.map +0 -1
  475. package/dist/adapter/ember/uart/consts.js +0 -100
  476. package/dist/adapter/ember/uart/consts.js.map +0 -1
  477. package/dist/adapter/ember/uart/enums.d.ts +0 -191
  478. package/dist/adapter/ember/uart/enums.d.ts.map +0 -1
  479. package/dist/adapter/ember/uart/enums.js +0 -197
  480. package/dist/adapter/ember/uart/enums.js.map +0 -1
  481. package/dist/adapter/ember/uart/parser.d.ts +0 -10
  482. package/dist/adapter/ember/uart/parser.d.ts.map +0 -1
  483. package/dist/adapter/ember/uart/parser.js +0 -37
  484. package/dist/adapter/ember/uart/parser.js.map +0 -1
  485. package/dist/adapter/ember/uart/queues.d.ts +0 -85
  486. package/dist/adapter/ember/uart/queues.d.ts.map +0 -1
  487. package/dist/adapter/ember/uart/queues.js +0 -214
  488. package/dist/adapter/ember/uart/queues.js.map +0 -1
  489. package/dist/adapter/ember/uart/writer.d.ts +0 -15
  490. package/dist/adapter/ember/uart/writer.d.ts.map +0 -1
  491. package/dist/adapter/ember/uart/writer.js +0 -46
  492. package/dist/adapter/ember/uart/writer.js.map +0 -1
  493. package/dist/adapter/ember/utils/initters.d.ts +0 -20
  494. package/dist/adapter/ember/utils/initters.js +0 -58
  495. package/dist/adapter/ember/utils/initters.js.map +0 -1
  496. package/dist/adapter/ember/utils/math.d.ts +0 -51
  497. package/dist/adapter/ember/utils/math.d.ts.map +0 -1
  498. package/dist/adapter/ember/utils/math.js +0 -102
  499. package/dist/adapter/ember/utils/math.js.map +0 -1
  500. package/dist/adapter/ember/zdo.d.ts +0 -925
  501. package/dist/adapter/ember/zdo.d.ts.map +0 -1
  502. package/dist/adapter/ember/zdo.js +0 -723
  503. package/dist/adapter/ember/zdo.js.map +0 -1
  504. package/dist/adapter/events.d.ts +0 -42
  505. package/dist/adapter/events.js +0 -13
  506. package/dist/adapter/events.js.map +0 -1
  507. package/dist/adapter/ezsp/adapter/backup.d.ts +0 -13
  508. package/dist/adapter/ezsp/adapter/backup.js +0 -101
  509. package/dist/adapter/ezsp/adapter/backup.js.map +0 -1
  510. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +0 -65
  511. package/dist/adapter/ezsp/adapter/ezspAdapter.js +0 -634
  512. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +0 -1
  513. package/dist/adapter/ezsp/adapter/index.d.ts +0 -3
  514. package/dist/adapter/ezsp/adapter/index.d.ts.map +0 -1
  515. package/dist/adapter/ezsp/adapter/index.js +0 -11
  516. package/dist/adapter/ezsp/adapter/index.js.map +0 -1
  517. package/dist/adapter/ezsp/driver/commands.d.ts +0 -37
  518. package/dist/adapter/ezsp/driver/commands.d.ts.map +0 -1
  519. package/dist/adapter/ezsp/driver/commands.js +0 -2387
  520. package/dist/adapter/ezsp/driver/commands.js.map +0 -1
  521. package/dist/adapter/ezsp/driver/consts.d.ts +0 -11
  522. package/dist/adapter/ezsp/driver/consts.d.ts.map +0 -1
  523. package/dist/adapter/ezsp/driver/consts.js +0 -14
  524. package/dist/adapter/ezsp/driver/consts.js.map +0 -1
  525. package/dist/adapter/ezsp/driver/driver.d.ts +0 -109
  526. package/dist/adapter/ezsp/driver/driver.js +0 -796
  527. package/dist/adapter/ezsp/driver/driver.js.map +0 -1
  528. package/dist/adapter/ezsp/driver/ezsp.d.ts +0 -106
  529. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +0 -1
  530. package/dist/adapter/ezsp/driver/ezsp.js +0 -664
  531. package/dist/adapter/ezsp/driver/ezsp.js.map +0 -1
  532. package/dist/adapter/ezsp/driver/frame.d.ts +0 -40
  533. package/dist/adapter/ezsp/driver/frame.d.ts.map +0 -1
  534. package/dist/adapter/ezsp/driver/frame.js +0 -101
  535. package/dist/adapter/ezsp/driver/frame.js.map +0 -1
  536. package/dist/adapter/ezsp/driver/index.d.ts +0 -4
  537. package/dist/adapter/ezsp/driver/index.js +0 -9
  538. package/dist/adapter/ezsp/driver/index.js.map +0 -1
  539. package/dist/adapter/ezsp/driver/multicast.d.ts +0 -13
  540. package/dist/adapter/ezsp/driver/multicast.js +0 -74
  541. package/dist/adapter/ezsp/driver/multicast.js.map +0 -1
  542. package/dist/adapter/ezsp/driver/parser.d.ts +0 -12
  543. package/dist/adapter/ezsp/driver/parser.d.ts.map +0 -1
  544. package/dist/adapter/ezsp/driver/parser.js +0 -105
  545. package/dist/adapter/ezsp/driver/parser.js.map +0 -1
  546. package/dist/adapter/ezsp/driver/types/basic.d.ts +0 -63
  547. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +0 -1
  548. package/dist/adapter/ezsp/driver/types/basic.js +0 -209
  549. package/dist/adapter/ezsp/driver/types/basic.js.map +0 -1
  550. package/dist/adapter/ezsp/driver/types/index.d.ts +0 -10
  551. package/dist/adapter/ezsp/driver/types/index.d.ts.map +0 -1
  552. package/dist/adapter/ezsp/driver/types/index.js +0 -139
  553. package/dist/adapter/ezsp/driver/types/index.js.map +0 -1
  554. package/dist/adapter/ezsp/driver/types/named.d.ts +0 -1288
  555. package/dist/adapter/ezsp/driver/types/named.d.ts.map +0 -1
  556. package/dist/adapter/ezsp/driver/types/named.js +0 -2330
  557. package/dist/adapter/ezsp/driver/types/named.js.map +0 -1
  558. package/dist/adapter/ezsp/driver/types/struct.d.ts +0 -271
  559. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +0 -1
  560. package/dist/adapter/ezsp/driver/types/struct.js +0 -804
  561. package/dist/adapter/ezsp/driver/types/struct.js.map +0 -1
  562. package/dist/adapter/ezsp/driver/uart.d.ts +0 -49
  563. package/dist/adapter/ezsp/driver/uart.d.ts.map +0 -1
  564. package/dist/adapter/ezsp/driver/uart.js +0 -383
  565. package/dist/adapter/ezsp/driver/uart.js.map +0 -1
  566. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +0 -3
  567. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +0 -1
  568. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +0 -56
  569. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +0 -1
  570. package/dist/adapter/ezsp/driver/utils/index.d.ts +0 -20
  571. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +0 -1
  572. package/dist/adapter/ezsp/driver/utils/index.js +0 -73
  573. package/dist/adapter/ezsp/driver/utils/index.js.map +0 -1
  574. package/dist/adapter/ezsp/driver/writer.d.ts +0 -14
  575. package/dist/adapter/ezsp/driver/writer.d.ts.map +0 -1
  576. package/dist/adapter/ezsp/driver/writer.js +0 -83
  577. package/dist/adapter/ezsp/driver/writer.js.map +0 -1
  578. package/dist/adapter/index.d.ts +0 -5
  579. package/dist/adapter/index.js +0 -36
  580. package/dist/adapter/index.js.map +0 -1
  581. package/dist/adapter/serialPort.d.ts +0 -14
  582. package/dist/adapter/serialPort.d.ts.map +0 -1
  583. package/dist/adapter/serialPort.js +0 -47
  584. package/dist/adapter/serialPort.js.map +0 -1
  585. package/dist/adapter/serialPortUtils.d.ts +0 -13
  586. package/dist/adapter/serialPortUtils.d.ts.map +0 -1
  587. package/dist/adapter/serialPortUtils.js +0 -19
  588. package/dist/adapter/serialPortUtils.js.map +0 -1
  589. package/dist/adapter/socketPortUtils.d.ts +0 -11
  590. package/dist/adapter/socketPortUtils.d.ts.map +0 -1
  591. package/dist/adapter/socketPortUtils.js +0 -17
  592. package/dist/adapter/socketPortUtils.js.map +0 -1
  593. package/dist/adapter/tstype.d.ts +0 -86
  594. package/dist/adapter/tstype.d.ts.map +0 -1
  595. package/dist/adapter/tstype.js +0 -3
  596. package/dist/adapter/tstype.js.map +0 -1
  597. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -62
  598. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +0 -1
  599. package/dist/adapter/z-stack/adapter/adapter-backup.js +0 -459
  600. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +0 -1
  601. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +0 -151
  602. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +0 -1
  603. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +0 -259
  604. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +0 -1
  605. package/dist/adapter/z-stack/adapter/endpoints.d.ts +0 -12
  606. package/dist/adapter/z-stack/adapter/endpoints.js +0 -74
  607. package/dist/adapter/z-stack/adapter/endpoints.js.map +0 -1
  608. package/dist/adapter/z-stack/adapter/index.d.ts +0 -3
  609. package/dist/adapter/z-stack/adapter/index.d.ts.map +0 -1
  610. package/dist/adapter/z-stack/adapter/index.js +0 -9
  611. package/dist/adapter/z-stack/adapter/index.js.map +0 -1
  612. package/dist/adapter/z-stack/adapter/manager.d.ts +0 -84
  613. package/dist/adapter/z-stack/adapter/manager.js +0 -474
  614. package/dist/adapter/z-stack/adapter/manager.js.map +0 -1
  615. package/dist/adapter/z-stack/adapter/tstype.d.ts +0 -7
  616. package/dist/adapter/z-stack/adapter/tstype.d.ts.map +0 -1
  617. package/dist/adapter/z-stack/adapter/tstype.js +0 -10
  618. package/dist/adapter/z-stack/adapter/tstype.js.map +0 -1
  619. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +0 -86
  620. package/dist/adapter/z-stack/adapter/zStackAdapter.js +0 -912
  621. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +0 -1
  622. package/dist/adapter/z-stack/constants/af.d.ts +0 -24
  623. package/dist/adapter/z-stack/constants/af.d.ts.map +0 -1
  624. package/dist/adapter/z-stack/constants/af.js +0 -28
  625. package/dist/adapter/z-stack/constants/af.js.map +0 -1
  626. package/dist/adapter/z-stack/constants/common.d.ts +0 -279
  627. package/dist/adapter/z-stack/constants/common.d.ts.map +0 -1
  628. package/dist/adapter/z-stack/constants/common.js +0 -293
  629. package/dist/adapter/z-stack/constants/common.js.map +0 -1
  630. package/dist/adapter/z-stack/constants/dbg.d.ts +0 -23
  631. package/dist/adapter/z-stack/constants/dbg.d.ts.map +0 -1
  632. package/dist/adapter/z-stack/constants/dbg.js +0 -25
  633. package/dist/adapter/z-stack/constants/dbg.js.map +0 -1
  634. package/dist/adapter/z-stack/constants/index.d.ts +0 -11
  635. package/dist/adapter/z-stack/constants/index.d.ts.map +0 -1
  636. package/dist/adapter/z-stack/constants/index.js +0 -48
  637. package/dist/adapter/z-stack/constants/index.js.map +0 -1
  638. package/dist/adapter/z-stack/constants/mac.d.ts +0 -128
  639. package/dist/adapter/z-stack/constants/mac.d.ts.map +0 -1
  640. package/dist/adapter/z-stack/constants/mac.js +0 -130
  641. package/dist/adapter/z-stack/constants/mac.js.map +0 -1
  642. package/dist/adapter/z-stack/constants/sapi.d.ts +0 -25
  643. package/dist/adapter/z-stack/constants/sapi.d.ts.map +0 -1
  644. package/dist/adapter/z-stack/constants/sapi.js +0 -27
  645. package/dist/adapter/z-stack/constants/sapi.js.map +0 -1
  646. package/dist/adapter/z-stack/constants/sys.d.ts +0 -72
  647. package/dist/adapter/z-stack/constants/sys.d.ts.map +0 -1
  648. package/dist/adapter/z-stack/constants/sys.js +0 -74
  649. package/dist/adapter/z-stack/constants/sys.js.map +0 -1
  650. package/dist/adapter/z-stack/constants/util.d.ts +0 -82
  651. package/dist/adapter/z-stack/constants/util.d.ts.map +0 -1
  652. package/dist/adapter/z-stack/constants/util.js +0 -84
  653. package/dist/adapter/z-stack/constants/util.js.map +0 -1
  654. package/dist/adapter/z-stack/constants/utils.d.ts +0 -5
  655. package/dist/adapter/z-stack/constants/utils.d.ts.map +0 -1
  656. package/dist/adapter/z-stack/constants/utils.js +0 -15
  657. package/dist/adapter/z-stack/constants/utils.js.map +0 -1
  658. package/dist/adapter/z-stack/constants/zdo.d.ts +0 -103
  659. package/dist/adapter/z-stack/constants/zdo.d.ts.map +0 -1
  660. package/dist/adapter/z-stack/constants/zdo.js +0 -105
  661. package/dist/adapter/z-stack/constants/zdo.js.map +0 -1
  662. package/dist/adapter/z-stack/models/index.d.ts +0 -2
  663. package/dist/adapter/z-stack/models/index.d.ts.map +0 -1
  664. package/dist/adapter/z-stack/models/index.js +0 -18
  665. package/dist/adapter/z-stack/models/index.js.map +0 -1
  666. package/dist/adapter/z-stack/models/startup-options.d.ts +0 -13
  667. package/dist/adapter/z-stack/models/startup-options.js +0 -3
  668. package/dist/adapter/z-stack/models/startup-options.js.map +0 -1
  669. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +0 -24
  670. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +0 -1
  671. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +0 -46
  672. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +0 -1
  673. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +0 -11
  674. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +0 -1
  675. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +0 -23
  676. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +0 -1
  677. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +0 -11
  678. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +0 -1
  679. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +0 -22
  680. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +0 -1
  681. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +0 -11
  682. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +0 -1
  683. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +0 -24
  684. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +0 -1
  685. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +0 -11
  686. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +0 -1
  687. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +0 -25
  688. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +0 -1
  689. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +0 -11
  690. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +0 -1
  691. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +0 -24
  692. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +0 -1
  693. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +0 -9
  694. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +0 -1
  695. package/dist/adapter/z-stack/structs/entries/channel-list.js +0 -16
  696. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +0 -1
  697. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +0 -9
  698. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +0 -1
  699. package/dist/adapter/z-stack/structs/entries/has-configured.js +0 -17
  700. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +0 -1
  701. package/dist/adapter/z-stack/structs/entries/index.d.ts +0 -17
  702. package/dist/adapter/z-stack/structs/entries/index.d.ts.map +0 -1
  703. package/dist/adapter/z-stack/structs/entries/index.js +0 -33
  704. package/dist/adapter/z-stack/structs/entries/index.js.map +0 -1
  705. package/dist/adapter/z-stack/structs/entries/nib.d.ts +0 -11
  706. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +0 -1
  707. package/dist/adapter/z-stack/structs/entries/nib.js +0 -69
  708. package/dist/adapter/z-stack/structs/entries/nib.js.map +0 -1
  709. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +0 -11
  710. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +0 -1
  711. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +0 -19
  712. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +0 -1
  713. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +0 -9
  714. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +0 -1
  715. package/dist/adapter/z-stack/structs/entries/nwk-key.js +0 -16
  716. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +0 -1
  717. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +0 -9
  718. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +0 -1
  719. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +0 -16
  720. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +0 -1
  721. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +0 -14
  722. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +0 -1
  723. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +0 -24
  724. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +0 -1
  725. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +0 -11
  726. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +0 -1
  727. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +0 -23
  728. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +0 -1
  729. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +0 -21
  730. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +0 -1
  731. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +0 -37
  732. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +0 -1
  733. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +0 -11
  734. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +0 -1
  735. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +0 -25
  736. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +0 -1
  737. package/dist/adapter/z-stack/structs/index.d.ts +0 -5
  738. package/dist/adapter/z-stack/structs/index.d.ts.map +0 -1
  739. package/dist/adapter/z-stack/structs/index.js +0 -21
  740. package/dist/adapter/z-stack/structs/index.js.map +0 -1
  741. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +0 -14
  742. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +0 -1
  743. package/dist/adapter/z-stack/structs/serializable-memory-object.js +0 -3
  744. package/dist/adapter/z-stack/structs/serializable-memory-object.js.map +0 -1
  745. package/dist/adapter/z-stack/structs/struct.d.ts +0 -100
  746. package/dist/adapter/z-stack/structs/struct.d.ts.map +0 -1
  747. package/dist/adapter/z-stack/structs/struct.js +0 -297
  748. package/dist/adapter/z-stack/structs/struct.js.map +0 -1
  749. package/dist/adapter/z-stack/structs/table.d.ts +0 -95
  750. package/dist/adapter/z-stack/structs/table.d.ts.map +0 -1
  751. package/dist/adapter/z-stack/structs/table.js +0 -164
  752. package/dist/adapter/z-stack/structs/table.js.map +0 -1
  753. package/dist/adapter/z-stack/unpi/constants.d.ts +0 -29
  754. package/dist/adapter/z-stack/unpi/constants.d.ts.map +0 -1
  755. package/dist/adapter/z-stack/unpi/constants.js +0 -40
  756. package/dist/adapter/z-stack/unpi/constants.js.map +0 -1
  757. package/dist/adapter/z-stack/unpi/frame.d.ts +0 -17
  758. package/dist/adapter/z-stack/unpi/frame.d.ts.map +0 -1
  759. package/dist/adapter/z-stack/unpi/frame.js +0 -55
  760. package/dist/adapter/z-stack/unpi/frame.js.map +0 -1
  761. package/dist/adapter/z-stack/unpi/index.d.ts +0 -6
  762. package/dist/adapter/z-stack/unpi/index.d.ts.map +0 -1
  763. package/dist/adapter/z-stack/unpi/index.js +0 -38
  764. package/dist/adapter/z-stack/unpi/index.js.map +0 -1
  765. package/dist/adapter/z-stack/unpi/parser.d.ts +0 -13
  766. package/dist/adapter/z-stack/unpi/parser.d.ts.map +0 -1
  767. package/dist/adapter/z-stack/unpi/parser.js +0 -86
  768. package/dist/adapter/z-stack/unpi/parser.js.map +0 -1
  769. package/dist/adapter/z-stack/unpi/writer.d.ts +0 -12
  770. package/dist/adapter/z-stack/unpi/writer.d.ts.map +0 -1
  771. package/dist/adapter/z-stack/unpi/writer.js +0 -55
  772. package/dist/adapter/z-stack/unpi/writer.js.map +0 -1
  773. package/dist/adapter/z-stack/utils/channel-list.d.ts +0 -21
  774. package/dist/adapter/z-stack/utils/channel-list.d.ts.map +0 -1
  775. package/dist/adapter/z-stack/utils/channel-list.js +0 -41
  776. package/dist/adapter/z-stack/utils/channel-list.js.map +0 -1
  777. package/dist/adapter/z-stack/utils/index.d.ts +0 -3
  778. package/dist/adapter/z-stack/utils/index.d.ts.map +0 -1
  779. package/dist/adapter/z-stack/utils/index.js +0 -19
  780. package/dist/adapter/z-stack/utils/index.js.map +0 -1
  781. package/dist/adapter/z-stack/utils/network-options.d.ts +0 -9
  782. package/dist/adapter/z-stack/utils/network-options.d.ts.map +0 -1
  783. package/dist/adapter/z-stack/utils/network-options.js +0 -23
  784. package/dist/adapter/z-stack/utils/network-options.js.map +0 -1
  785. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +0 -14
  786. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +0 -1
  787. package/dist/adapter/z-stack/znp/buffaloZnp.js +0 -243
  788. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +0 -1
  789. package/dist/adapter/z-stack/znp/definition.d.ts +0 -6
  790. package/dist/adapter/z-stack/znp/definition.d.ts.map +0 -1
  791. package/dist/adapter/z-stack/znp/definition.js +0 -3052
  792. package/dist/adapter/z-stack/znp/definition.js.map +0 -1
  793. package/dist/adapter/z-stack/znp/index.d.ts +0 -4
  794. package/dist/adapter/z-stack/znp/index.d.ts.map +0 -1
  795. package/dist/adapter/z-stack/znp/index.js +0 -11
  796. package/dist/adapter/z-stack/znp/index.js.map +0 -1
  797. package/dist/adapter/z-stack/znp/parameterType.d.ts +0 -23
  798. package/dist/adapter/z-stack/znp/parameterType.d.ts.map +0 -1
  799. package/dist/adapter/z-stack/znp/parameterType.js +0 -26
  800. package/dist/adapter/z-stack/znp/parameterType.js.map +0 -1
  801. package/dist/adapter/z-stack/znp/tstype.d.ts +0 -23
  802. package/dist/adapter/z-stack/znp/tstype.d.ts.map +0 -1
  803. package/dist/adapter/z-stack/znp/tstype.js +0 -3
  804. package/dist/adapter/z-stack/znp/tstype.js.map +0 -1
  805. package/dist/adapter/z-stack/znp/znp.d.ts +0 -47
  806. package/dist/adapter/z-stack/znp/znp.d.ts.map +0 -1
  807. package/dist/adapter/z-stack/znp/znp.js +0 -322
  808. package/dist/adapter/z-stack/znp/znp.js.map +0 -1
  809. package/dist/adapter/z-stack/znp/zpiObject.d.ts +0 -20
  810. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +0 -1
  811. package/dist/adapter/z-stack/znp/zpiObject.js +0 -103
  812. package/dist/adapter/z-stack/znp/zpiObject.js.map +0 -1
  813. package/dist/adapter/zigate/adapter/index.d.ts +0 -3
  814. package/dist/adapter/zigate/adapter/index.d.ts.map +0 -1
  815. package/dist/adapter/zigate/adapter/index.js +0 -11
  816. package/dist/adapter/zigate/adapter/index.js.map +0 -1
  817. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +0 -72
  818. package/dist/adapter/zigate/adapter/zigateAdapter.js +0 -681
  819. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +0 -1
  820. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +0 -18
  821. package/dist/adapter/zigate/driver/commandType.d.ts +0 -43
  822. package/dist/adapter/zigate/driver/commandType.d.ts.map +0 -1
  823. package/dist/adapter/zigate/driver/commandType.js +0 -390
  824. package/dist/adapter/zigate/driver/commandType.js.map +0 -1
  825. package/dist/adapter/zigate/driver/constants.d.ts +0 -277
  826. package/dist/adapter/zigate/driver/constants.d.ts.map +0 -1
  827. package/dist/adapter/zigate/driver/constants.js +0 -372
  828. package/dist/adapter/zigate/driver/constants.js.map +0 -1
  829. package/dist/adapter/zigate/driver/frame.d.ts +0 -27
  830. package/dist/adapter/zigate/driver/frame.d.ts.map +0 -1
  831. package/dist/adapter/zigate/driver/frame.js +0 -173
  832. package/dist/adapter/zigate/driver/frame.js.map +0 -1
  833. package/dist/adapter/zigate/driver/messageType.d.ts +0 -13
  834. package/dist/adapter/zigate/driver/messageType.d.ts.map +0 -1
  835. package/dist/adapter/zigate/driver/messageType.js +0 -284
  836. package/dist/adapter/zigate/driver/messageType.js.map +0 -1
  837. package/dist/adapter/zigate/driver/parameterType.d.ts +0 -28
  838. package/dist/adapter/zigate/driver/parameterType.d.ts.map +0 -1
  839. package/dist/adapter/zigate/driver/parameterType.js +0 -33
  840. package/dist/adapter/zigate/driver/parameterType.js.map +0 -1
  841. package/dist/adapter/zigate/driver/ziGateObject.d.ts +0 -24
  842. package/dist/adapter/zigate/driver/ziGateObject.js +0 -111
  843. package/dist/adapter/zigate/driver/ziGateObject.js.map +0 -1
  844. package/dist/adapter/zigate/driver/zigate.d.ts +0 -50
  845. package/dist/adapter/zigate/driver/zigate.js +0 -289
  846. package/dist/adapter/zigate/driver/zigate.js.map +0 -1
  847. package/dist/buffalo/buffalo.d.ts +0 -55
  848. package/dist/buffalo/buffalo.d.ts.map +0 -1
  849. package/dist/buffalo/buffalo.js +0 -230
  850. package/dist/buffalo/buffalo.js.map +0 -1
  851. package/dist/buffalo/index.d.ts +0 -3
  852. package/dist/buffalo/index.d.ts.map +0 -1
  853. package/dist/buffalo/index.js +0 -9
  854. package/dist/buffalo/index.js.map +0 -1
  855. package/dist/controller/controller.d.ts +0 -119
  856. package/dist/controller/database.d.ts +0 -20
  857. package/dist/controller/database.js +0 -94
  858. package/dist/controller/database.js.map +0 -1
  859. package/dist/controller/events.d.ts +0 -59
  860. package/dist/controller/greenPower.d.ts +0 -14
  861. package/dist/controller/helpers/index.d.ts +0 -3
  862. package/dist/controller/helpers/index.js +0 -29
  863. package/dist/controller/helpers/index.js.map +0 -1
  864. package/dist/controller/helpers/request.d.ts +0 -22
  865. package/dist/controller/helpers/request.js +0 -78
  866. package/dist/controller/helpers/request.js.map +0 -1
  867. package/dist/controller/helpers/requestQueue.d.ts +0 -13
  868. package/dist/controller/helpers/requestQueue.js +0 -106
  869. package/dist/controller/helpers/requestQueue.js.map +0 -1
  870. package/dist/controller/helpers/zclFrameConverter.d.ts +0 -9
  871. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +0 -6
  872. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +0 -1
  873. package/dist/controller/helpers/zclTransactionSequenceNumber.js +0 -14
  874. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +0 -1
  875. package/dist/controller/index.d.ts +0 -6
  876. package/dist/controller/index.js +0 -9
  877. package/dist/controller/index.js.map +0 -1
  878. package/dist/controller/model/device.d.ts +0 -140
  879. package/dist/controller/model/endpoint.d.ts +0 -134
  880. package/dist/controller/model/entity.d.ts +0 -15
  881. package/dist/controller/model/entity.js +0 -27
  882. package/dist/controller/model/entity.js.map +0 -1
  883. package/dist/controller/model/group.d.ts +0 -39
  884. package/dist/controller/model/index.d.ts +0 -6
  885. package/dist/controller/model/index.js +0 -15
  886. package/dist/controller/model/index.js.map +0 -1
  887. package/dist/controller/model/konnextConfig.d.ts +0 -7
  888. package/dist/controller/model/konnextConfig.d.ts.map +0 -1
  889. package/dist/controller/model/konnextConfig.js +0 -3
  890. package/dist/controller/model/konnextConfig.js.map +0 -1
  891. package/dist/controller/touchlink.d.ts +0 -20
  892. package/dist/controller/touchlink.js +0 -157
  893. package/dist/controller/touchlink.js.map +0 -1
  894. package/dist/controller/tstype.d.ts +0 -21
  895. package/dist/index.d.ts +0 -6
  896. package/dist/index.js +0 -37
  897. package/dist/index.js.map +0 -1
  898. package/dist/models/backup-storage-legacy.d.ts +0 -27
  899. package/dist/models/backup-storage-legacy.d.ts.map +0 -1
  900. package/dist/models/backup-storage-legacy.js +0 -3
  901. package/dist/models/backup-storage-legacy.js.map +0 -1
  902. package/dist/models/backup-storage-unified.d.ts +0 -50
  903. package/dist/models/backup-storage-unified.d.ts.map +0 -1
  904. package/dist/models/backup-storage-unified.js +0 -3
  905. package/dist/models/backup-storage-unified.js.map +0 -1
  906. package/dist/models/backup.d.ts +0 -38
  907. package/dist/models/backup.d.ts.map +0 -1
  908. package/dist/models/backup.js +0 -3
  909. package/dist/models/backup.js.map +0 -1
  910. package/dist/models/index.d.ts +0 -5
  911. package/dist/models/index.d.ts.map +0 -1
  912. package/dist/models/index.js +0 -21
  913. package/dist/models/index.js.map +0 -1
  914. package/dist/models/network-options.d.ts +0 -13
  915. package/dist/models/network-options.d.ts.map +0 -1
  916. package/dist/models/network-options.js +0 -3
  917. package/dist/models/network-options.js.map +0 -1
  918. package/dist/utils/aes.d.ts +0 -40
  919. package/dist/utils/aes.d.ts.map +0 -1
  920. package/dist/utils/aes.js +0 -198
  921. package/dist/utils/aes.js.map +0 -1
  922. package/dist/utils/assertString.d.ts +0 -3
  923. package/dist/utils/assertString.d.ts.map +0 -1
  924. package/dist/utils/assertString.js +0 -9
  925. package/dist/utils/assertString.js.map +0 -1
  926. package/dist/utils/backup.d.ts +0 -21
  927. package/dist/utils/backup.d.ts.map +0 -1
  928. package/dist/utils/backup.js +0 -190
  929. package/dist/utils/backup.js.map +0 -1
  930. package/dist/utils/equalsPartial.d.ts +0 -3
  931. package/dist/utils/equalsPartial.d.ts.map +0 -1
  932. package/dist/utils/equalsPartial.js +0 -12
  933. package/dist/utils/equalsPartial.js.map +0 -1
  934. package/dist/utils/index.d.ts +0 -10
  935. package/dist/utils/index.d.ts.map +0 -1
  936. package/dist/utils/index.js +0 -46
  937. package/dist/utils/index.js.map +0 -1
  938. package/dist/utils/isNumberArray.d.ts +0 -3
  939. package/dist/utils/isNumberArray.d.ts.map +0 -1
  940. package/dist/utils/isNumberArray.js +0 -7
  941. package/dist/utils/isNumberArray.js.map +0 -1
  942. package/dist/utils/logger.d.ts +0 -9
  943. package/dist/utils/logger.d.ts.map +0 -1
  944. package/dist/utils/logger.js +0 -14
  945. package/dist/utils/logger.js.map +0 -1
  946. package/dist/utils/queue.d.ts +0 -12
  947. package/dist/utils/queue.d.ts.map +0 -1
  948. package/dist/utils/queue.js +0 -62
  949. package/dist/utils/queue.js.map +0 -1
  950. package/dist/utils/realpathSync.d.ts +0 -3
  951. package/dist/utils/realpathSync.d.ts.map +0 -1
  952. package/dist/utils/realpathSync.js +0 -13
  953. package/dist/utils/realpathSync.js.map +0 -1
  954. package/dist/utils/wait.d.ts +0 -3
  955. package/dist/utils/wait.d.ts.map +0 -1
  956. package/dist/utils/wait.js +0 -9
  957. package/dist/utils/wait.js.map +0 -1
  958. package/dist/utils/waitress.d.ts +0 -22
  959. package/dist/utils/waitress.d.ts.map +0 -1
  960. package/dist/utils/waitress.js +0 -69
  961. package/dist/utils/waitress.js.map +0 -1
  962. package/dist/zspec/consts.d.ts +0 -60
  963. package/dist/zspec/consts.d.ts.map +0 -1
  964. package/dist/zspec/consts.js +0 -64
  965. package/dist/zspec/consts.js.map +0 -1
  966. package/dist/zspec/enums.d.ts +0 -19
  967. package/dist/zspec/enums.d.ts.map +0 -1
  968. package/dist/zspec/enums.js +0 -28
  969. package/dist/zspec/enums.js.map +0 -1
  970. package/dist/zspec/index.d.ts +0 -4
  971. package/dist/zspec/index.d.ts.map +0 -1
  972. package/dist/zspec/index.js +0 -43
  973. package/dist/zspec/index.js.map +0 -1
  974. package/dist/zspec/tstypes.d.ts +0 -19
  975. package/dist/zspec/tstypes.d.ts.map +0 -1
  976. package/dist/zspec/tstypes.js +0 -3
  977. package/dist/zspec/tstypes.js.map +0 -1
  978. package/dist/zspec/utils.d.ts +0 -14
  979. package/dist/zspec/utils.d.ts.map +0 -1
  980. package/dist/zspec/utils.js +0 -29
  981. package/dist/zspec/utils.js.map +0 -1
  982. package/dist/zspec/zcl/buffaloZcl.d.ts +0 -55
  983. package/dist/zspec/zcl/definition/cluster.d.ts +0 -3
  984. package/dist/zspec/zcl/definition/consts.d.ts +0 -9
  985. package/dist/zspec/zcl/definition/consts.d.ts.map +0 -1
  986. package/dist/zspec/zcl/definition/consts.js +0 -27
  987. package/dist/zspec/zcl/definition/consts.js.map +0 -1
  988. package/dist/zspec/zcl/definition/enums.d.ts +0 -177
  989. package/dist/zspec/zcl/definition/enums.d.ts.map +0 -1
  990. package/dist/zspec/zcl/definition/enums.js +0 -187
  991. package/dist/zspec/zcl/definition/enums.js.map +0 -1
  992. package/dist/zspec/zcl/definition/foundation.d.ts +0 -11
  993. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +0 -727
  994. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +0 -1
  995. package/dist/zspec/zcl/definition/manufacturerCode.js +0 -733
  996. package/dist/zspec/zcl/definition/manufacturerCode.js.map +0 -1
  997. package/dist/zspec/zcl/definition/status.d.ts +0 -69
  998. package/dist/zspec/zcl/definition/status.d.ts.map +0 -1
  999. package/dist/zspec/zcl/definition/status.js +0 -74
  1000. package/dist/zspec/zcl/definition/status.js.map +0 -1
  1001. package/dist/zspec/zcl/index.d.ts +0 -11
  1002. package/dist/zspec/zcl/utils.d.ts +0 -7
  1003. package/dist/zspec/zcl/zclFrame.d.ts +0 -36
  1004. package/dist/zspec/zcl/zclHeader.d.ts +0 -17
  1005. package/dist/zspec/zcl/zclStatusError.d.ts +0 -6
  1006. package/dist/zspec/zcl/zclStatusError.d.ts.map +0 -1
  1007. package/dist/zspec/zcl/zclStatusError.js +0 -13
  1008. package/dist/zspec/zcl/zclStatusError.js.map +0 -1
  1009. package/dist/zspec/zdo/buffaloZdo.d.ts +0 -438
  1010. package/dist/zspec/zdo/buffaloZdo.d.ts.map +0 -1
  1011. package/dist/zspec/zdo/buffaloZdo.js +0 -1892
  1012. package/dist/zspec/zdo/buffaloZdo.js.map +0 -1
  1013. package/dist/zspec/zdo/definition/clusters.d.ts +0 -624
  1014. package/dist/zspec/zdo/definition/clusters.d.ts.map +0 -1
  1015. package/dist/zspec/zdo/definition/clusters.js +0 -687
  1016. package/dist/zspec/zdo/definition/clusters.js.map +0 -1
  1017. package/dist/zspec/zdo/definition/consts.d.ts +0 -13
  1018. package/dist/zspec/zdo/definition/consts.d.ts.map +0 -1
  1019. package/dist/zspec/zdo/definition/consts.js +0 -16
  1020. package/dist/zspec/zdo/definition/consts.js.map +0 -1
  1021. package/dist/zspec/zdo/definition/enums.d.ts +0 -75
  1022. package/dist/zspec/zdo/definition/enums.d.ts.map +0 -1
  1023. package/dist/zspec/zdo/definition/enums.js +0 -97
  1024. package/dist/zspec/zdo/definition/enums.js.map +0 -1
  1025. package/dist/zspec/zdo/definition/status.d.ts +0 -99
  1026. package/dist/zspec/zdo/definition/status.d.ts.map +0 -1
  1027. package/dist/zspec/zdo/definition/status.js +0 -109
  1028. package/dist/zspec/zdo/definition/status.js.map +0 -1
  1029. package/dist/zspec/zdo/definition/tstypes.d.ts +0 -787
  1030. package/dist/zspec/zdo/definition/tstypes.d.ts.map +0 -1
  1031. package/dist/zspec/zdo/definition/tstypes.js +0 -3
  1032. package/dist/zspec/zdo/definition/tstypes.js.map +0 -1
  1033. package/dist/zspec/zdo/index.d.ts +0 -7
  1034. package/dist/zspec/zdo/index.d.ts.map +0 -1
  1035. package/dist/zspec/zdo/index.js +0 -39
  1036. package/dist/zspec/zdo/index.js.map +0 -1
  1037. package/dist/zspec/zdo/utils.d.ts +0 -25
  1038. package/dist/zspec/zdo/utils.d.ts.map +0 -1
  1039. package/dist/zspec/zdo/utils.js +0 -75
  1040. package/dist/zspec/zdo/utils.js.map +0 -1
  1041. package/dist/zspec/zdo/zdoStatusError.d.ts +0 -6
  1042. package/dist/zspec/zdo/zdoStatusError.d.ts.map +0 -1
  1043. package/dist/zspec/zdo/zdoStatusError.js +0 -13
  1044. package/dist/zspec/zdo/zdoStatusError.js.map +0 -1
  1045. package/typedoc-tsconfig.json +0 -44
@@ -15,83 +15,66 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
37
  };
28
38
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const events_1 = __importDefault(require("events"));
30
- const database_1 = __importDefault(require("./database"));
39
+ exports.Controller = void 0;
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const node_events_1 = __importDefault(require("node:events"));
42
+ const node_fs_1 = __importDefault(require("node:fs"));
31
43
  const adapter_1 = require("../adapter");
32
- const model_1 = require("./model");
33
- const helpers_1 = require("./helpers");
34
- const Events = __importStar(require("./events"));
35
- const tstype_1 = require("./tstype");
36
- const fs_1 = __importDefault(require("fs"));
44
+ const utils_1 = require("../utils");
45
+ const logger_1 = require("../utils/logger");
46
+ const utils_2 = require("../utils/utils");
47
+ const ZSpec = __importStar(require("../zspec"));
37
48
  const Zcl = __importStar(require("../zspec/zcl"));
38
- const touchlink_1 = __importDefault(require("./touchlink"));
49
+ const Zdo = __importStar(require("../zspec/zdo"));
50
+ const database_1 = __importDefault(require("./database"));
39
51
  const greenPower_1 = __importDefault(require("./greenPower"));
40
- const utils_1 = require("../utils");
41
- const assert_1 = __importDefault(require("assert"));
42
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
43
- // @ts-ignore
44
- const mixin_deep_1 = __importDefault(require("mixin-deep"));
52
+ const helpers_1 = require("./helpers");
53
+ const installCodes_1 = require("./helpers/installCodes");
54
+ const zclTransactionSequenceNumber_1 = __importDefault(require("./helpers/zclTransactionSequenceNumber"));
55
+ const model_1 = require("./model");
56
+ const device_1 = require("./model/device");
45
57
  const group_1 = __importDefault(require("./model/group"));
46
- const logger_1 = require("../utils/logger");
47
- const NS = 'zh:controller';
48
- async function catcho(func, errorMessage) {
49
- try {
50
- await func();
51
- }
52
- catch (error) {
53
- logger_1.logger.error(`${errorMessage}: ${error}`, NS);
54
- }
55
- }
56
- const DefaultOptions = {
57
- network: {
58
- networkKeyDistribute: false,
59
- networkKey: [0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D],
60
- panID: 0x1a62,
61
- extendedPanID: [0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD],
62
- channelList: [11],
63
- },
64
- serialPort: {},
65
- databasePath: null,
66
- databaseBackupPath: null,
67
- backupPath: null,
68
- adapter: { disableLED: false },
69
- acceptJoiningDeviceHandler: null,
70
- konnextConfig: {
71
- isEncrypted: 0,
72
- },
73
- };
58
+ const touchlink_1 = __importDefault(require("./touchlink"));
59
+ const NS = "zh:controller";
74
60
  /**
75
61
  * @noInheritDoc
76
62
  */
77
- class Controller extends events_1.default.EventEmitter {
63
+ class Controller extends node_events_1.default.EventEmitter {
78
64
  options;
79
65
  database;
80
66
  adapter;
81
- greenPower;
82
- // eslint-disable-next-line
83
- permitJoinNetworkClosedTimer;
84
- // eslint-disable-next-line
85
- permitJoinTimeoutTimer;
86
- permitJoinTimeout;
87
- // eslint-disable-next-line
67
+ #greenPower;
68
+ #touchlink;
69
+ permitJoinTimer;
70
+ permitJoinEnd;
88
71
  backupTimer;
89
- // eslint-disable-next-line
90
72
  databaseSaveTimer;
91
- touchlink;
92
73
  stopping;
93
74
  adapterDisconnected;
94
75
  networkParametersCached;
76
+ /** List of unknown devices detected during a single runtime session. Serves as de-dupe and anti-spam. */
77
+ unknownDevices;
95
78
  /**
96
79
  * Create a controller
97
80
  *
@@ -101,168 +84,227 @@ class Controller extends events_1.default.EventEmitter {
101
84
  super();
102
85
  this.stopping = false;
103
86
  this.adapterDisconnected = true; // set false after adapter.start() is successfully called
104
- this.options = (0, mixin_deep_1.default)(JSON.parse(JSON.stringify(DefaultOptions)), options);
87
+ const { network: networkOpts, serialPort: serialPortOpts, adapter: adapterOpts, konnextConfig: konnextConfigOpts, ...restOpts } = options;
88
+ this.options = {
89
+ network: {
90
+ networkKeyDistribute: false,
91
+ networkKey: [0x01, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0d],
92
+ extendedPanID: [0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd],
93
+ ...networkOpts,
94
+ },
95
+ serialPort: { ...serialPortOpts },
96
+ adapter: {
97
+ ...adapterOpts,
98
+ },
99
+ konnextConfig: {
100
+ // @ts-ignore-next-line we need to set a default value for isEncrypted
101
+ isEncrypted: 0,
102
+ ...konnextConfigOpts,
103
+ },
104
+ ...restOpts,
105
+ };
106
+ this.unknownDevices = new Set();
105
107
  // Validate options
106
108
  for (const channel of this.options.network.channelList) {
107
109
  if (channel < 11 || channel > 26) {
108
110
  throw new Error(`'${channel}' is an invalid channel, use a channel between 11 - 26.`);
109
111
  }
110
112
  }
111
- if (!Array.isArray(this.options.network.networkKey) || this.options.network.networkKey.length !== 16) {
112
- throw new Error(`Network key must be 16 digits long, got ${this.options.network.networkKey.length}.`);
113
+ if (!(0, utils_2.isNumberArrayOfLength)(this.options.network.networkKey, 16)) {
114
+ throw new Error(`Network key must be a 16 digits long array, got ${this.options.network.networkKey}.`);
113
115
  }
114
- if (!Array.isArray(this.options.network.extendedPanID) || this.options.network.extendedPanID.length !== 8) {
115
- throw new Error(`ExtendedPanID must be 8 digits long, got ${this.options.network.extendedPanID.length}.`);
116
+ if (!(0, utils_2.isNumberArrayOfLength)(this.options.network.extendedPanID, 8)) {
117
+ throw new Error(`ExtendedPanID must be an 8 digits long array, got ${this.options.network.extendedPanID}.`);
116
118
  }
117
- if (this.options.network.panID >= 0xFFFF || this.options.network.panID <= 0) {
119
+ if (this.options.network.panID < 1 || this.options.network.panID >= 0xffff) {
118
120
  throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
119
121
  }
120
122
  }
123
+ get greenPower() {
124
+ return this.#greenPower;
125
+ }
126
+ get touchlink() {
127
+ return this.#touchlink;
128
+ }
121
129
  /**
122
130
  * Start the Herdsman controller
123
131
  */
124
- async start() {
132
+ async start(abortSignal) {
125
133
  // Database (create end inject)
126
134
  this.database = database_1.default.open(this.options.databasePath);
127
135
  model_1.Entity.injectDatabase(this.database);
128
136
  // Adapter (create and inject)
129
137
  this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.options.konnextConfig);
130
- logger_1.logger.debug(`Starting with options '${JSON.stringify(this.options)}'`, NS);
138
+ abortSignal?.throwIfAborted();
139
+ const stringifiedOptions = JSON.stringify(this.options).replaceAll(JSON.stringify(this.options.network.networkKey), '"HIDDEN"');
140
+ logger_1.logger.debug(`Starting with options '${stringifiedOptions}'`, NS);
131
141
  const startResult = await this.adapter.start();
132
142
  logger_1.logger.debug(`Started with result '${startResult}'`, NS);
133
143
  this.adapterDisconnected = false;
144
+ abortSignal?.throwIfAborted();
134
145
  // Check if we have to change the channel, only do this when adapter `resumed` because:
135
146
  // - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
136
147
  // - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
137
- if ((startResult === 'resumed') && (await this.adapter.supportsChangeChannel())) {
138
- const netParams = (await this.getNetworkParameters());
139
- if (this.options.network.channelList[0] !== netParams.channel) {
140
- await this.changeChannel();
148
+ if (startResult === "resumed") {
149
+ const netParams = await this.getNetworkParameters();
150
+ const configuredChannel = this.options.network.channelList[0];
151
+ const adapterChannel = netParams.channel;
152
+ const nwkUpdateID = netParams.nwkUpdateID;
153
+ if (configuredChannel !== adapterChannel) {
154
+ logger_1.logger.info(`Configured channel '${configuredChannel}' does not match adapter channel '${adapterChannel}', changing channel`, NS);
155
+ await this.changeChannel(adapterChannel, configuredChannel, nwkUpdateID);
156
+ abortSignal?.throwIfAborted();
141
157
  }
142
158
  }
143
159
  model_1.Entity.injectAdapter(this.database.id, this.adapter);
144
160
  // log injection
145
- logger_1.logger.debug(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`, NS);
146
- this.greenPower = new greenPower_1.default(this.adapter);
147
- this.greenPower.on(tstype_1.GreenPowerEvents.deviceJoined, this.onDeviceJoinedGreenPower.bind(this));
161
+ logger_1.logger.debug(`Injected database: ${this.database !== undefined}, adapter: ${this.adapter !== undefined}`, NS);
162
+ this.#greenPower = new greenPower_1.default(this.adapter, this.database.id);
163
+ this.#greenPower.on("deviceJoined", this.onDeviceJoinedGreenPower.bind(this));
164
+ this.#greenPower.on("deviceLeave", this.onDeviceLeaveGreenPower.bind(this));
148
165
  // Register adapter events
149
- this.adapter.on(adapter_1.Events.Events.deviceJoined, this.onDeviceJoined.bind(this));
150
- this.adapter.on(adapter_1.Events.Events.zclPayload, this.onZclPayload.bind(this));
151
- this.adapter.on(adapter_1.Events.Events.disconnected, this.onAdapterDisconnected.bind(this));
152
- this.adapter.on(adapter_1.Events.Events.deviceAnnounce, this.onDeviceAnnounce.bind(this));
153
- this.adapter.on(adapter_1.Events.Events.deviceLeave, this.onDeviceLeave.bind(this));
154
- this.adapter.on(adapter_1.Events.Events.networkAddress, this.onNetworkAddress.bind(this));
155
- if (startResult === 'reset') {
156
- if (this.options.databaseBackupPath && fs_1.default.existsSync(this.options.databasePath)) {
157
- fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
158
- }
159
- logger_1.logger.debug('Clearing database...', NS);
160
- for (const group of group_1.default.allByDatabaseID(this.database.id)) {
161
- group.removeFromDatabase();
162
- }
163
- for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
164
- device.removeFromDatabase();
166
+ this.adapter.on("deviceJoined", this.onDeviceJoined.bind(this));
167
+ this.adapter.on("zclPayload", this.onZclPayload.bind(this));
168
+ this.adapter.on("zdoResponse", this.onZdoResponse.bind(this));
169
+ this.adapter.on("disconnected", this.onAdapterDisconnected.bind(this));
170
+ this.adapter.on("deviceLeave", this.onDeviceLeave.bind(this));
171
+ if (startResult === "reset") {
172
+ if (this.options.databaseBackupPath && node_fs_1.default.existsSync(this.options.databasePath)) {
173
+ node_fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
165
174
  }
175
+ this.database.clear();
176
+ group_1.default.resetCache();
177
+ model_1.Device.resetCache();
178
+ abortSignal?.throwIfAborted();
166
179
  }
167
- if (startResult === 'reset' || (this.options.backupPath && !fs_1.default.existsSync(this.options.backupPath))) {
180
+ if (startResult === "reset" || (this.options.backupPath && !node_fs_1.default.existsSync(this.options.backupPath))) {
168
181
  await this.backup();
182
+ abortSignal?.throwIfAborted();
169
183
  }
170
184
  // Add coordinator to the database if it is not there yet.
171
- const coordinator = await this.adapter.getCoordinator();
172
- if (model_1.Device.byType('Coordinator', this.database.id).length === 0) {
173
- logger_1.logger.debug('No coordinator in database, querying...', NS);
174
- model_1.Device.create('Coordinator', coordinator.ieeeAddr, coordinator.networkAddress, coordinator.manufacturerID, undefined, undefined, undefined, true, coordinator.endpoints, this.database.id);
185
+ const coordinatorIEEE = await this.adapter.getCoordinatorIEEE();
186
+ if (model_1.Device.byType(this.database.id, "Coordinator").length === 0) {
187
+ logger_1.logger.debug("No coordinator in database, querying...", NS);
188
+ const coordinator = model_1.Device.create("Coordinator", coordinatorIEEE, ZSpec.COORDINATOR_ADDRESS, this.adapter.manufacturerID, undefined, undefined, undefined, device_1.InterviewState.Successful, undefined, this.database.id);
189
+ await coordinator.updateActiveEndpoints();
190
+ abortSignal?.throwIfAborted();
191
+ for (const endpoint of coordinator.endpoints) {
192
+ await endpoint.updateSimpleDescriptor();
193
+ abortSignal?.throwIfAborted();
194
+ }
195
+ coordinator.save();
175
196
  }
176
197
  // Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
177
- const databaseCoordinator = model_1.Device.byType('Coordinator', this.database.id)[0];
178
- if (databaseCoordinator.ieeeAddr !== coordinator.ieeeAddr) {
179
- logger_1.logger.info(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`, NS);
180
- databaseCoordinator.changeIeeeAddress(coordinator.ieeeAddr);
198
+ const databaseCoordinator = model_1.Device.byType(this.database.id, "Coordinator")[0];
199
+ if (databaseCoordinator.ieeeAddr !== coordinatorIEEE) {
200
+ logger_1.logger.info(`Coordinator address changed, updating to '${coordinatorIEEE}'`, NS);
201
+ databaseCoordinator.changeIeeeAddress(coordinatorIEEE);
181
202
  }
182
203
  // Set backup timer to 1 day.
183
204
  this.backupTimer = setInterval(() => this.backup(), 86400000);
184
- // Set database save timer to 1 hour.
185
- this.databaseSaveTimer = setInterval(() => this.databaseSave(), 3600000);
186
- this.touchlink = new touchlink_1.default(this.adapter);
205
+ // Set database save timer to 5 minutes.
206
+ this.databaseSaveTimer = setInterval(() => this.databaseSave(), 300000);
207
+ this.#touchlink = new touchlink_1.default(this.adapter);
187
208
  return startResult;
188
209
  }
189
- async touchlinkIdentify(ieeeAddr, channel) {
190
- await this.touchlink.identify(ieeeAddr, channel);
191
- }
192
- async touchlinkScan() {
193
- return this.touchlink.scan();
194
- }
195
- async touchlinkFactoryReset(ieeeAddr, channel) {
196
- return this.touchlink.factoryReset(ieeeAddr, channel);
197
- }
198
- async touchlinkFactoryResetFirst() {
199
- return this.touchlink.factoryResetFirst();
210
+ /**
211
+ * Send a request according to given payload.
212
+ * @param rawPayload Payload used to determine and build the request
213
+ * @param customClusters Manually passed custom clusters used in ZCL serialization (if any, if matching)
214
+ * @returns A response may or may not be returned depending on given payload (up to caller to verify)
215
+ */
216
+ async sendRaw(rawPayload, customClusters = {}) {
217
+ const { ieeeAddress, networkAddress, groupId, dstEndpoint, srcEndpoint = ZSpec.HA_ENDPOINT, interPan = false, profileId = ZSpec.HA_PROFILE_ID, clusterKey, zdoParams, zcl, disableResponse = false, timeout = 10000, } = rawPayload;
218
+ if (profileId === Zdo.ZDO_PROFILE_ID) {
219
+ (0, node_assert_1.default)(ieeeAddress);
220
+ (0, node_assert_1.default)(networkAddress !== undefined);
221
+ (0, node_assert_1.default)(clusterKey !== undefined && typeof clusterKey === "number");
222
+ // no ZDO request takes 0 params
223
+ (0, node_assert_1.default)(Array.isArray(zdoParams) && zdoParams.length > 0);
224
+ // will fail if args are incorrect for request
225
+ const buf = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterKey, ...zdoParams);
226
+ return (await this.adapter.sendZdo(ieeeAddress, networkAddress, clusterKey, buf, disableResponse));
227
+ }
228
+ (0, node_assert_1.default)(zcl);
229
+ if (interPan) {
230
+ (0, node_assert_1.default)(zcl.commandKey);
231
+ (0, node_assert_1.default)(zcl.payload);
232
+ (0, node_assert_1.default)(zcl.frameType === undefined);
233
+ (0, node_assert_1.default)(zcl.direction === undefined);
234
+ const zclFrame = Zcl.Frame.create(zcl.frameType ?? Zcl.FrameType.SPECIFIC, zcl.direction ?? Zcl.Direction.CLIENT_TO_SERVER, true, zcl.manufacturerCode, 0, zcl.commandKey, clusterKey ?? Zcl.Clusters.touchlink.ID, zcl.payload, customClusters);
235
+ if (ieeeAddress) {
236
+ await this.adapter.sendZclFrameInterPANToIeeeAddr(zclFrame, ieeeAddress);
237
+ return;
238
+ }
239
+ return await this.adapter.sendZclFrameInterPANBroadcast(zclFrame, timeout, disableResponse);
240
+ }
241
+ (0, node_assert_1.default)(clusterKey !== undefined);
242
+ (0, node_assert_1.default)(zcl.frameType !== undefined);
243
+ (0, node_assert_1.default)(zcl.direction !== undefined);
244
+ const zclFrame = Zcl.Frame.create(zcl.frameType, zcl.direction, zcl.disableDefaultResponse ?? false, zcl.manufacturerCode, zcl.tsn ?? zclTransactionSequenceNumber_1.default.next(), zcl.commandKey, clusterKey, zcl.payload, customClusters);
245
+ if (groupId !== undefined) {
246
+ (0, node_assert_1.default)(groupId >= 0x0000 && groupId <= 0xffff);
247
+ await this.adapter.sendZclFrameToGroup(groupId, zclFrame, srcEndpoint, profileId);
248
+ return;
249
+ }
250
+ (0, node_assert_1.default)(dstEndpoint !== undefined && dstEndpoint >= 0x01 && dstEndpoint <= 0xff);
251
+ (0, node_assert_1.default)(srcEndpoint >= 0x01 && srcEndpoint <= 0xff);
252
+ (0, node_assert_1.default)(networkAddress !== undefined && networkAddress >= 0x0000 && networkAddress <= 0xffff);
253
+ if (networkAddress >= ZSpec.BROADCAST_MIN) {
254
+ await this.adapter.sendZclFrameToAll(dstEndpoint, zclFrame, srcEndpoint, networkAddress, profileId);
255
+ return;
256
+ }
257
+ (0, node_assert_1.default)(ieeeAddress);
258
+ return await this.adapter.sendZclFrameToEndpoint(ieeeAddress, networkAddress, dstEndpoint, zclFrame, timeout, disableResponse, false, srcEndpoint, profileId);
200
259
  }
201
260
  async addInstallCode(installCode) {
202
- const aqaraMatch = installCode.match(/^G\$M:.+\$A:(.+)\$I:(.+)$/);
203
- let ieeeAddr, key;
204
- if (aqaraMatch) {
205
- ieeeAddr = aqaraMatch[1];
206
- key = aqaraMatch[2];
261
+ // will throw if code cannot be parsed
262
+ const [ieeeAddr, keyStr] = (0, installCodes_1.parseInstallCode)(installCode);
263
+ // biome-ignore lint/style/noNonNullAssertion: valid from above parsing
264
+ const key = Buffer.from(keyStr.match(/.{1,2}/g).map((d) => Number.parseInt(d, 16)));
265
+ // will throw if code cannot be fixed and is invalid
266
+ const [adjustedKey, adjusted] = (0, installCodes_1.checkInstallCode)(key, true);
267
+ if (adjusted) {
268
+ logger_1.logger.info(`Install code was adjusted for reason '${adjusted}'.`, NS);
269
+ }
270
+ logger_1.logger.info(`Adding install code for ${ieeeAddr}.`, NS);
271
+ await this.adapter.addInstallCode(ieeeAddr, adjustedKey, false);
272
+ if (adjusted === "missing CRC") {
273
+ // in case the CRC was missing, could also be a "already-hashed" key, send both
274
+ // XXX: seems to be the case for old HA1.2 devices
275
+ await this.adapter.addInstallCode(ieeeAddr, key, true);
276
+ }
277
+ }
278
+ async permitJoin(time, device) {
279
+ clearTimeout(this.permitJoinTimer);
280
+ this.permitJoinTimer = undefined;
281
+ this.permitJoinEnd = undefined;
282
+ if (time > 0) {
283
+ // never permit more than uint8, and never permit 255 that is often equal to "forever"
284
+ (0, node_assert_1.default)(time <= 254, "Cannot permit join for more than 254 seconds.");
285
+ await this.adapter.permitJoin(time, device?.networkAddress);
286
+ await this.#greenPower.permitJoin(time, device?.networkAddress);
287
+ const timeMs = time * 1000;
288
+ this.permitJoinEnd = Date.now() + timeMs;
289
+ this.permitJoinTimer = setTimeout(() => {
290
+ this.emit("permitJoinChanged", { permitted: false });
291
+ this.permitJoinTimer = undefined;
292
+ this.permitJoinEnd = undefined;
293
+ }, timeMs);
294
+ this.emit("permitJoinChanged", { permitted: true, time });
207
295
  }
208
296
  else {
209
- (0, assert_1.default)(installCode.length === 95 || installCode.length === 91, `Unsupported install code, got ${installCode.length} chars, expected 95 or 91`);
210
- const keyStart = installCode.length - (installCode.length === 95 ? 36 : 32);
211
- ieeeAddr = installCode.substring(keyStart - 19, keyStart - 3);
212
- key = installCode.substring(keyStart, installCode.length);
213
- }
214
- ieeeAddr = `0x${ieeeAddr}`;
215
- key = Buffer.from(key.match(/.{1,2}/g).map(d => parseInt(d, 16)));
216
- await this.adapter.addInstallCode(ieeeAddr, key);
217
- }
218
- async permitJoin(permit, device, time) {
219
- await this.permitJoinInternal(permit, 'manual', device, time);
220
- }
221
- async permitJoinInternal(permit, reason, device, time) {
222
- clearInterval(this.permitJoinNetworkClosedTimer);
223
- clearInterval(this.permitJoinTimeoutTimer);
224
- this.permitJoinNetworkClosedTimer = null;
225
- this.permitJoinTimeoutTimer = null;
226
- this.permitJoinTimeout = undefined;
227
- if (permit) {
228
- await this.adapter.permitJoin(254, !device ? null : device.networkAddress);
229
- await this.greenPower.permitJoin(254, !device ? null : device.networkAddress);
230
- // Zigbee 3 networks automatically close after max 255 seconds, keep network open.
231
- this.permitJoinNetworkClosedTimer = setInterval(async () => {
232
- await catcho(async () => {
233
- await this.adapter.permitJoin(254, !device ? null : device.networkAddress);
234
- await this.greenPower.permitJoin(254, !device ? null : device.networkAddress);
235
- }, "Failed to keep permit join alive");
236
- }, 200 * 1000);
237
- if (typeof time === 'number') {
238
- this.permitJoinTimeout = time;
239
- this.permitJoinTimeoutTimer = setInterval(async () => {
240
- this.permitJoinTimeout--;
241
- if (this.permitJoinTimeout <= 0) {
242
- await this.permitJoinInternal(false, 'timer_expired');
243
- }
244
- else {
245
- const data = { permitted: true, timeout: this.permitJoinTimeout, reason };
246
- this.emit(Events.Events.permitJoinChanged, data);
247
- }
248
- }, 1000);
249
- }
250
- const data = { permitted: true, reason, timeout: this.permitJoinTimeout };
251
- this.emit(Events.Events.permitJoinChanged, data);
252
- }
253
- else {
254
- logger_1.logger.debug('Disable joining', NS);
255
- await this.greenPower.permitJoin(0, null);
256
- await this.adapter.permitJoin(0, null);
257
- const data = { permitted: false, reason, timeout: this.permitJoinTimeout };
258
- this.emit(Events.Events.permitJoinChanged, data);
297
+ logger_1.logger.debug("Disable joining", NS);
298
+ await this.#greenPower.permitJoin(0);
299
+ await this.adapter.permitJoin(0);
300
+ this.emit("permitJoinChanged", { permitted: false });
259
301
  }
260
302
  }
261
303
  getPermitJoin() {
262
- return this.permitJoinNetworkClosedTimer != null;
304
+ return this.permitJoinTimer !== undefined;
263
305
  }
264
- getPermitJoinTimeout() {
265
- return this.permitJoinTimeout;
306
+ getPermitJoinEnd() {
307
+ return this.permitJoinEnd;
266
308
  }
267
309
  isStopping() {
268
310
  return this.stopping;
@@ -273,61 +315,72 @@ class Controller extends events_1.default.EventEmitter {
273
315
  async stop() {
274
316
  this.stopping = true;
275
317
  // Unregister adapter events
276
- this.adapter.removeAllListeners(adapter_1.Events.Events.deviceJoined);
277
- this.adapter.removeAllListeners(adapter_1.Events.Events.zclPayload);
278
- this.adapter.removeAllListeners(adapter_1.Events.Events.disconnected);
279
- this.adapter.removeAllListeners(adapter_1.Events.Events.deviceAnnounce);
280
- this.adapter.removeAllListeners(adapter_1.Events.Events.deviceLeave);
318
+ this.adapter.removeAllListeners();
281
319
  clearInterval(this.backupTimer);
282
320
  clearInterval(this.databaseSaveTimer);
283
321
  if (this.adapterDisconnected) {
284
322
  this.databaseSave();
285
323
  }
286
324
  else {
287
- await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
325
+ try {
326
+ await this.#touchlink.stop();
327
+ }
328
+ catch (error) {
329
+ logger_1.logger.error(`Failed to stop Touchlink: ${error}`, NS);
330
+ }
331
+ try {
332
+ await this.permitJoin(0);
333
+ }
334
+ catch (error) {
335
+ logger_1.logger.error(`Failed to disable join on stop: ${error}`, NS);
336
+ }
288
337
  await this.backup(); // always calls databaseSave()
289
338
  await this.adapter.stop();
290
339
  this.adapterDisconnected = true;
291
340
  }
341
+ model_1.Device.resetCache();
342
+ group_1.default.resetCache();
343
+ model_1.Entity.removeAdapter(this.database.id);
344
+ model_1.Entity.removeDatabase(this.database.id);
292
345
  }
293
346
  databaseSave() {
294
- for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
347
+ for (const device of model_1.Device.allIterator(this.database.id)) {
295
348
  device.save(false);
296
349
  }
297
- for (const group of group_1.default.allByDatabaseID(this.database.id)) {
350
+ for (const group of group_1.default.allIterator(this.database.id)) {
298
351
  group.save(false);
299
352
  }
300
353
  this.database.write();
301
354
  }
302
355
  async backup() {
303
356
  this.databaseSave();
304
- if (this.options.backupPath && await this.adapter.supportsBackup()) {
305
- logger_1.logger.debug('Creating coordinator backup', NS);
306
- const backup = await this.adapter.backup(model_1.Device.all().map((d) => d.ieeeAddr));
307
- const unifiedBackup = await utils_1.BackupUtils.toUnifiedBackup(backup);
308
- const tmpBackupPath = this.options.backupPath + '.tmp';
309
- fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
310
- fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
357
+ if (this.options.backupPath && (await this.adapter.supportsBackup())) {
358
+ logger_1.logger.debug("Creating coordinator backup", NS);
359
+ const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
360
+ const unifiedBackup = utils_1.BackupUtils.toUnifiedBackup(backup);
361
+ const tmpBackupPath = `${this.options.backupPath}.tmp`;
362
+ node_fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
363
+ node_fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
311
364
  logger_1.logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
312
365
  }
313
366
  }
314
367
  async coordinatorCheck() {
315
368
  if (await this.adapter.supportsBackup()) {
316
- const backup = await this.adapter.backup(model_1.Device.all().map((d) => d.ieeeAddr));
317
- const devicesInBackup = backup.devices.map((d) => `0x${d.ieeeAddress.toString('hex')}`);
318
- const missingRouters = this.getDevices()
319
- .filter((d) => d.type === 'Router' && !devicesInBackup.includes(d.ieeeAddr));
369
+ const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
370
+ const devicesInBackup = backup.devices.map((d) => ZSpec.Utils.eui64BEBufferToHex(d.ieeeAddress));
371
+ const missingRouters = [];
372
+ for (const device of this.getDevicesIterator((d) => d.type === "Router" && !devicesInBackup.includes(d.ieeeAddr))) {
373
+ missingRouters.push(device);
374
+ }
320
375
  return { missingRouters };
321
376
  }
322
- else {
323
- throw new Error("Coordinator does not coordinator check because it doesn't support backups");
324
- }
377
+ throw new Error("Coordinator does not coordinator check because it doesn't support backups");
325
378
  }
326
379
  async reset(type) {
327
380
  await this.adapter.reset(type);
328
381
  }
329
382
  async getCoordinatorVersion() {
330
- return this.adapter.getCoordinatorVersion();
383
+ return await this.adapter.getCoordinatorVersion();
331
384
  }
332
385
  async getNetworkParameters() {
333
386
  // Cache network parameters as they don't change anymore after start.
@@ -336,17 +389,30 @@ class Controller extends events_1.default.EventEmitter {
336
389
  }
337
390
  return this.networkParametersCached;
338
391
  }
392
+ /**
393
+ * Get the database ID for this controller's database.
394
+ */
395
+ getDatabaseId() {
396
+ return this.database.id;
397
+ }
339
398
  /**
340
399
  * Get all devices
400
+ * @deprecated use getDevicesIterator()
341
401
  */
342
402
  getDevices() {
343
403
  return model_1.Device.allByDatabaseID(this.database.id);
344
404
  }
405
+ /**
406
+ * Get iterator for all devices
407
+ */
408
+ getDevicesIterator(predicate) {
409
+ return model_1.Device.allIterator(this.database.id, predicate);
410
+ }
345
411
  /**
346
412
  * Get all devices with a specific type
347
413
  */
348
414
  getDevicesByType(type) {
349
- return model_1.Device.byType(type, this.database.id);
415
+ return model_1.Device.byType(this.database.id, type);
350
416
  }
351
417
  /**
352
418
  * Get device by ieeeAddr
@@ -358,7 +424,17 @@ class Controller extends events_1.default.EventEmitter {
358
424
  * Get device by networkAddress
359
425
  */
360
426
  getDeviceByNetworkAddress(networkAddress) {
361
- return model_1.Device.byNetworkAddress(networkAddress, this.database.id);
427
+ return model_1.Device.byNetworkAddress(this.database.id, networkAddress);
428
+ }
429
+ /**
430
+ * Get IEEE address for all devices
431
+ */
432
+ getDeviceIeeeAddresses() {
433
+ const deviceIeeeAddresses = [];
434
+ for (const device of model_1.Device.allIterator(this.database.id)) {
435
+ deviceIeeeAddresses.push(device.ieeeAddr);
436
+ }
437
+ return deviceIeeeAddresses;
362
438
  }
363
439
  /**
364
440
  * Get group by ID
@@ -368,10 +444,17 @@ class Controller extends events_1.default.EventEmitter {
368
444
  }
369
445
  /**
370
446
  * Get all groups
447
+ * @deprecated use getGroupsIterator()
371
448
  */
372
449
  getGroups() {
373
450
  return group_1.default.allByDatabaseID(this.database.id);
374
451
  }
452
+ /**
453
+ * Get iterator for all groups
454
+ */
455
+ getGroupsIterator(predicate) {
456
+ return group_1.default.allIterator(this.database.id, predicate);
457
+ }
375
458
  /**
376
459
  * Create a Group
377
460
  */
@@ -381,54 +464,99 @@ class Controller extends events_1.default.EventEmitter {
381
464
  /**
382
465
  * Broadcast a network-wide channel change.
383
466
  */
384
- async changeChannel() {
385
- logger_1.logger.info(`Broadcasting change channel to '${this.options.network.channelList[0]}'.`, NS);
386
- await this.adapter.changeChannel(this.options.network.channelList[0]);
387
- this.networkParametersCached = null; // invalidate cache
467
+ async changeChannel(oldChannel, newChannel, nwkUpdateID) {
468
+ logger_1.logger.warning(`Changing channel from '${oldChannel}' to '${newChannel}'`, NS);
469
+ // According to the Zigbee specification:
470
+ // When broadcasting a Mgmt_NWK_Update_req to notify devices of a new channel, the nwkUpdateId parameter should be incremented in the NIB and included in the Mgmt_NWK_Update_req.
471
+ // The valid range of nwkUpdateId is 0x00 to 0xFF, and it should wrap back to 0 if necessary.
472
+ if (++nwkUpdateID > 0xff) {
473
+ nwkUpdateID = 0x00;
474
+ }
475
+ const clusterId = Zdo.ClusterId.NWK_UPDATE_REQUEST;
476
+ const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, [newChannel], 0xfe, undefined, nwkUpdateID, undefined);
477
+ await this.adapter.sendZdo(ZSpec.BLANK_EUI64, ZSpec.BroadcastAddress.SLEEPY, clusterId, zdoPayload, true);
478
+ logger_1.logger.info(`Channel changed to '${newChannel}'`, NS);
479
+ this.networkParametersCached = undefined; // invalidate cache
480
+ // wait for the broadcast to propagate and the adapter to actually change
481
+ // NOTE: observed to ~9sec on `ember` with actual stack event
482
+ await (0, utils_1.wait)(12000);
483
+ }
484
+ async identifyUnknownDevice(nwkAddress) {
485
+ if (this.unknownDevices.has(nwkAddress)) {
486
+ // prevent duplicate triggering
487
+ return;
488
+ }
489
+ logger_1.logger.debug(`Trying to identify unknown device with address '${nwkAddress}'`, NS);
490
+ this.unknownDevices.add(nwkAddress);
491
+ const clusterId = Zdo.ClusterId.IEEE_ADDRESS_REQUEST;
492
+ const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, nwkAddress, false, 0);
493
+ try {
494
+ const response = await this.adapter.sendZdo(ZSpec.BLANK_EUI64, nwkAddress, clusterId, zdoPayload, false);
495
+ if (Zdo.Buffalo.checkStatus(response)) {
496
+ const payload = response[1];
497
+ const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
498
+ if (device) {
499
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
500
+ this.unknownDevices.delete(payload.nwkAddress);
501
+ }
502
+ return device;
503
+ }
504
+ throw new Zdo.StatusError(response[0]);
505
+ }
506
+ catch (error) {
507
+ // Catches 2 types of exception: Zdo.StatusError and no response from `adapter.sendZdo()`.
508
+ logger_1.logger.debug(`Failed to retrieve IEEE address for device '${nwkAddress}': ${error}`, NS);
509
+ }
510
+ // NOTE: by keeping nwkAddress in `this.unknownDevices` on fail, it prevents a non-responding device from potentially spamming identify.
511
+ // This only lasts until next reboot (runtime Set), allowing to 'force' another trigger if necessary.
388
512
  }
389
- /**
390
- * Set transmit power of the adapter
391
- */
392
- async setTransmitPower(value) {
393
- return this.adapter.setTransmitPower(value);
513
+ checkDeviceNetworkAddress(device, ieeeAddress, nwkAddress) {
514
+ if (device.networkAddress !== nwkAddress) {
515
+ logger_1.logger.debug(`Device '${ieeeAddress}' got new networkAddress '${nwkAddress}'`, NS);
516
+ device.networkAddress = nwkAddress;
517
+ device.save();
518
+ this.selfAndDeviceEmit(device, "deviceNetworkAddressChanged", { device });
519
+ }
394
520
  }
395
521
  onNetworkAddress(payload) {
396
- logger_1.logger.debug(`Network address '${payload.ieeeAddr}'`, NS);
397
- const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
522
+ logger_1.logger.debug(`Network address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
523
+ const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
398
524
  if (!device) {
399
- logger_1.logger.debug(`Network address is from unknown device '${payload.ieeeAddr}'`, NS);
525
+ logger_1.logger.debug(`Network address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
400
526
  return;
401
527
  }
402
528
  device.updateLastSeen();
403
- this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'networkAddress' });
404
- if (device.networkAddress !== payload.networkAddress) {
405
- logger_1.logger.debug(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`, NS);
406
- device.networkAddress = payload.networkAddress;
407
- device.save();
408
- const data = { device };
409
- this.selfAndDeviceEmit(device, Events.Events.deviceNetworkAddressChanged, data);
529
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "networkAddress" });
530
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
531
+ }
532
+ onIEEEAddress(payload) {
533
+ logger_1.logger.debug(`IEEE address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
534
+ const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
535
+ if (!device) {
536
+ logger_1.logger.debug(`IEEE address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
537
+ return;
410
538
  }
539
+ device.updateLastSeen();
540
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "networkAddress" });
541
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
411
542
  }
412
543
  onDeviceAnnounce(payload) {
413
- logger_1.logger.debug(`Device announce '${payload.ieeeAddr}'`, NS);
414
- const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
544
+ logger_1.logger.debug(`Device announce from '${payload.eui64}:${payload.nwkAddress}'`, NS);
545
+ const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
415
546
  if (!device) {
416
- logger_1.logger.debug(`Device announce is from unknown device '${payload.ieeeAddr}'`, NS);
547
+ logger_1.logger.debug(`Device announce is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
417
548
  return;
418
549
  }
419
550
  device.updateLastSeen();
420
- this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'deviceAnnounce' });
551
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "deviceAnnounce" });
421
552
  device.implicitCheckin();
422
- if (device.networkAddress !== payload.networkAddress) {
423
- logger_1.logger.debug(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`, NS);
424
- device.networkAddress = payload.networkAddress;
425
- device.save();
426
- }
427
- const data = { device };
428
- this.selfAndDeviceEmit(device, Events.Events.deviceAnnounce, data);
553
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
554
+ this.selfAndDeviceEmit(device, "deviceAnnounce", { device });
429
555
  }
430
556
  onDeviceLeave(payload) {
431
557
  logger_1.logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
558
+ // XXX: seems type is not properly detected?
559
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
432
560
  const device = payload.ieeeAddr ? model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : model_1.Device.byNetworkAddress(this.database.id, payload.networkAddress);
433
561
  if (!device) {
434
562
  logger_1.logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
@@ -436,67 +564,90 @@ class Controller extends events_1.default.EventEmitter {
436
564
  }
437
565
  logger_1.logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
438
566
  device.removeFromDatabase();
439
- const data = { ieeeAddr: device.ieeeAddr };
440
- this.selfAndDeviceEmit(device, Events.Events.deviceLeave, data);
567
+ this.selfAndDeviceEmit(device, "deviceLeave", { ieeeAddr: device.ieeeAddr });
441
568
  }
442
569
  async onAdapterDisconnected() {
443
- logger_1.logger.debug(`Adapter disconnected`, NS);
570
+ logger_1.logger.debug("Adapter disconnected", NS);
444
571
  this.adapterDisconnected = true;
445
- await catcho(() => this.adapter.stop(), 'Failed to stop adapter on disconnect');
446
- this.emit(Events.Events.adapterDisconnected);
572
+ try {
573
+ await this.adapter.stop();
574
+ }
575
+ catch (error) {
576
+ logger_1.logger.error(`Failed to stop adapter on disconnect: ${error}`, NS);
577
+ }
578
+ this.emit("adapterDisconnected");
447
579
  }
448
- async onDeviceJoinedGreenPower(payload) {
449
- logger_1.logger.debug(`Green power device '${JSON.stringify(payload)}' joined`, NS);
580
+ onDeviceJoinedGreenPower(payload) {
581
+ logger_1.logger.debug(() => `Green power device '${JSON.stringify(payload).replaceAll(/\[[\d,]+\]/g, "HIDDEN")}' joined`, NS);
450
582
  // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
451
- let ieeeAddr = payload.sourceID.toString(16);
452
- ieeeAddr = `0x${'0'.repeat(16 - ieeeAddr.length)}${ieeeAddr}`;
583
+ const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(payload.sourceID);
453
584
  // Green power devices dont' have a modelID, create a modelID based on the deviceID (=type)
454
585
  const modelID = `GreenPower_${payload.deviceID}`;
455
586
  let device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr, true);
456
587
  if (!device) {
457
588
  logger_1.logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
458
589
  logger_1.logger.debug(`Creating device '${ieeeAddr}'`, NS);
459
- device = model_1.Device.create('GreenPower', ieeeAddr, payload.networkAddress, null, undefined, undefined, modelID, true, [], this.database.id);
590
+ device = model_1.Device.create("GreenPower", ieeeAddr, payload.networkAddress, undefined, undefined, undefined, modelID, device_1.InterviewState.Successful, payload.securityKey ? Array.from(payload.securityKey) : /* v8 ignore next */ undefined, this.database.id);
460
591
  device.save();
461
- this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
462
- const deviceInterviewPayload = { status: 'successful', device };
463
- this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
592
+ this.selfAndDeviceEmit(device, "deviceJoined", { device });
593
+ this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
464
594
  }
465
595
  else if (device.isDeleted) {
466
596
  logger_1.logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
467
- device.undelete(true);
468
- this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
469
- const deviceInterviewPayload = { status: 'successful', device };
470
- this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
597
+ device.undelete();
598
+ this.selfAndDeviceEmit(device, "deviceJoined", { device });
599
+ this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
600
+ }
601
+ }
602
+ onDeviceLeaveGreenPower(sourceID) {
603
+ logger_1.logger.debug(`Green power device '${sourceID}' left`, NS);
604
+ // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
605
+ const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(sourceID);
606
+ const device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
607
+ if (!device) {
608
+ logger_1.logger.debug(`Green power device leave is from unknown or already deleted device '${ieeeAddr}'`, NS);
609
+ return;
471
610
  }
611
+ logger_1.logger.debug(`Removing green power device from database '${device.ieeeAddr}'`, NS);
612
+ device.removeFromDatabase();
613
+ this.selfAndDeviceEmit(device, "deviceLeave", { ieeeAddr: device.ieeeAddr });
472
614
  }
473
- selfAndDeviceEmit(device, event, data) {
474
- device?.emit(event, data);
475
- this.emit(event, data);
615
+ selfAndDeviceEmit(device, event, ...args) {
616
+ device.emit(event, ...args);
617
+ this.emit(event, ...args);
476
618
  }
477
619
  async onDeviceJoined(payload) {
478
620
  logger_1.logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
479
621
  if (this.options.acceptJoiningDeviceHandler) {
480
622
  if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
481
623
  logger_1.logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
482
- await catcho(() => this.adapter.removeDevice(payload.networkAddress, payload.ieeeAddr), 'Failed to remove rejected device');
624
+ // XXX: GP devices? see Device.removeFromNetwork
625
+ try {
626
+ const clusterId = Zdo.ClusterId.LEAVE_REQUEST;
627
+ const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, payload.ieeeAddr, Zdo.LeaveRequestFlags.WITHOUT_REJOIN);
628
+ const response = await this.adapter.sendZdo(payload.ieeeAddr, payload.networkAddress, clusterId, zdoPayload, false);
629
+ if (!Zdo.Buffalo.checkStatus(response)) {
630
+ throw new Zdo.StatusError(response[0]);
631
+ }
632
+ }
633
+ catch (error) {
634
+ logger_1.logger.error(`Failed to remove rejected device: ${error.message}`, NS);
635
+ }
483
636
  return;
484
637
  }
485
- else {
486
- logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
487
- }
638
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
488
639
  }
489
640
  let device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
490
641
  if (!device) {
491
642
  logger_1.logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
492
643
  logger_1.logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
493
- device = model_1.Device.create('Unknown', payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, false, [], this.database.id);
494
- this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
644
+ device = model_1.Device.create("Unknown", payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, device_1.InterviewState.Pending, undefined, this.database.id);
645
+ this.selfAndDeviceEmit(device, "deviceJoined", { device });
495
646
  }
496
647
  else if (device.isDeleted) {
497
648
  logger_1.logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
498
649
  device.undelete();
499
- this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
650
+ this.selfAndDeviceEmit(device, "deviceJoined", { device });
500
651
  }
501
652
  if (device.networkAddress !== payload.networkAddress) {
502
653
  logger_1.logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
@@ -504,36 +655,56 @@ class Controller extends events_1.default.EventEmitter {
504
655
  device.save();
505
656
  }
506
657
  device.updateLastSeen();
507
- this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'deviceJoined' });
658
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "deviceJoined" });
508
659
  device.implicitCheckin();
509
- if (!device.interviewCompleted && !device.interviewing) {
510
- const payloadStart = { status: 'started', device };
660
+ if (device.interviewState === device_1.InterviewState.Pending || device.interviewState === device_1.InterviewState.Failed) {
511
661
  logger_1.logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
512
- this.selfAndDeviceEmit(device, Events.Events.deviceInterview, payloadStart);
662
+ this.selfAndDeviceEmit(device, "deviceInterview", { status: "started", device });
513
663
  try {
514
664
  await device.interview();
515
665
  logger_1.logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
516
- const event = { status: 'successful', device };
517
- this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
666
+ this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
518
667
  }
519
668
  catch (error) {
520
669
  logger_1.logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
521
- const event = { status: 'failed', device };
522
- this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
670
+ this.selfAndDeviceEmit(device, "deviceInterview", { status: "failed", device });
523
671
  }
524
672
  }
525
673
  else {
526
- logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', in progress '${device.interviewing}'`, NS);
674
+ logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', interviewState=${device.interviewState}'`, NS);
675
+ }
676
+ }
677
+ onZdoResponse(clusterId, response) {
678
+ logger_1.logger.debug(`Received ZDO response: clusterId=${Zdo.ClusterId[clusterId]}, status=${Zdo.Status[response[0]]}, payload=${JSON.stringify(response[1])}`, NS);
679
+ switch (clusterId) {
680
+ case Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE: {
681
+ if (Zdo.Buffalo.checkStatus(response)) {
682
+ this.onNetworkAddress(response[1]);
683
+ }
684
+ break;
685
+ }
686
+ case Zdo.ClusterId.IEEE_ADDRESS_RESPONSE: {
687
+ if (Zdo.Buffalo.checkStatus(response)) {
688
+ this.onIEEEAddress(response[1]);
689
+ }
690
+ break;
691
+ }
692
+ case Zdo.ClusterId.END_DEVICE_ANNOUNCE: {
693
+ if (Zdo.Buffalo.checkStatus(response)) {
694
+ this.onDeviceAnnounce(response[1]);
695
+ }
696
+ break;
697
+ }
527
698
  }
528
699
  }
529
700
  async onZclPayload(payload) {
530
- let frame = undefined;
531
- let device = undefined;
701
+ let frame;
702
+ let device;
532
703
  if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
533
704
  // This is handled by touchlink
534
705
  return;
535
706
  }
536
- else if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
707
+ if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
537
708
  try {
538
709
  // Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
539
710
  frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
@@ -541,37 +712,30 @@ class Controller extends events_1.default.EventEmitter {
541
712
  catch (error) {
542
713
  logger_1.logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
543
714
  return;
544
- // <<<<<<< HEAD
545
- // } else if (dataPayload.frame.Cluster.name === 'greenPower') {
546
- // await this.greenPower.onZclGreenPowerData(dataPayload);
547
- // // lookup encapsulated gpDevice for further processing
548
- // gpDevice = Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
549
- // }
550
- // }
551
- // let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
552
- // ? Device.byIeeeAddr(this.database.id, dataPayload.address)
553
- // : Device.byNetworkAddress(dataPayload.address, this.database.id));
554
- // /**
555
- // * Handling of re-transmitted Xiaomi messages.
556
- // * https://github.com/Koenkk/zigbee2mqtt/issues/1238
557
- // * https://github.com/Koenkk/zigbee2mqtt/issues/3592
558
- // *
559
- // * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
560
- // * The network address of these message is set to the one of the Xiaomi router.
561
- // * Therefore it looks like if the message came from the Xiaomi router, while in
562
- // * fact it came from the end device.
563
- // * Handling these message would result in false state updates.
564
- // * The group ID attribute of these message defines the network address of the end device.
565
- // */
566
- // if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
567
- // debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
568
- // device = Device.byNetworkAddress(dataPayload.groupID, this.database.id);
569
- // }
570
- // =======
571
715
  }
572
- await this.greenPower.onZclGreenPowerData(payload, frame);
573
- // lookup encapsulated gpDevice for further processing
574
- device = model_1.Device.byNetworkAddress(frame.payload.srcID & 0xffff, this.database.id);
716
+ if (frame.payload.commandID === undefined) {
717
+ // can be from gpd or gpp
718
+ // can be:
719
+ // - greenPower.commandsResponse.commissioningMode
720
+ // - Foundation.defaultRsp for greenPower.commandsResponse.pairing with status INVALID_FIELD or INSUFFICIENT_SPACE
721
+ // - ...
722
+ device = model_1.Device.find(this.database.id, payload.address);
723
+ }
724
+ else {
725
+ if (frame.payload.srcID === undefined) {
726
+ logger_1.logger.debug("Data is from unsupported green power device with IEEE addressing, skipping...", NS);
727
+ return;
728
+ }
729
+ const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(frame.payload.srcID);
730
+ device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
731
+ frame = await this.#greenPower.processCommand(payload, frame, device?.gpSecurityKey ? Buffer.from(device.gpSecurityKey) : undefined);
732
+ // lookup encapsulated gpDevice for further processing (re-fetch, may have been created by above call)
733
+ device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
734
+ if (!device) {
735
+ logger_1.logger.debug(`Data is from unknown green power device with address '${ieeeAddr}' (${frame.payload.srcID}), skipping...`, NS);
736
+ return;
737
+ }
738
+ }
575
739
  }
576
740
  else {
577
741
  /**
@@ -587,41 +751,45 @@ class Controller extends events_1.default.EventEmitter {
587
751
  * The group ID attribute of these message defines the network address of the end device.
588
752
  */
589
753
  device = model_1.Device.find(this.database.id, payload.address);
590
- if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && payload.groupID) {
754
+ if (device?.manufacturerName === "LUMI" && device?.type === "Router" && payload.groupID) {
591
755
  logger_1.logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
592
756
  device = model_1.Device.byNetworkAddress(this.database.id, payload.groupID);
593
757
  }
594
758
  try {
595
- frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device?.customClusters);
759
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device ? device.customClusters : {});
596
760
  }
597
761
  catch (error) {
598
762
  logger_1.logger.debug(`Failed to parse frame: ${error}`, NS);
599
763
  }
600
764
  }
601
765
  if (!device) {
602
- logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
603
- return;
766
+ if (typeof payload.address === "number" && !model_1.Device.isDeletedByNetworkAddress(this.database.id, payload.address)) {
767
+ device = await this.identifyUnknownDevice(payload.address);
768
+ }
769
+ if (!device) {
770
+ logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
771
+ return;
772
+ }
604
773
  }
605
- logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, `
606
- + `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, `
607
- + `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
774
+ logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, ` +
775
+ `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, ` +
776
+ `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
608
777
  device.updateLastSeen();
609
778
  //no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
610
- if (!frame?.isCluster("genPollCtrl")) {
779
+ if (frame?.cluster.name !== "genPollCtrl") {
611
780
  device.implicitCheckin();
612
781
  }
613
782
  device.linkquality = payload.linkquality;
614
783
  let endpoint = device.getEndpoint(payload.endpoint);
615
784
  if (!endpoint) {
616
- logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with ` +
617
- `network address '${payload.address}', creating it...`, NS);
785
+ logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with network address '${payload.address}', creating it...`, NS);
618
786
  endpoint = device.createEndpoint(payload.endpoint);
619
787
  }
620
788
  // Parse command for event
621
- let type = undefined;
622
- let data;
623
- let clusterName = undefined;
624
- const meta = {};
789
+ let type;
790
+ let data = {};
791
+ let clusterName;
792
+ const meta = { rawData: payload.data };
625
793
  if (frame) {
626
794
  const command = frame.command;
627
795
  clusterName = frame.cluster.name;
@@ -629,72 +797,78 @@ class Controller extends events_1.default.EventEmitter {
629
797
  meta.manufacturerCode = frame.header.manufacturerCode;
630
798
  meta.frameControl = frame.header.frameControl;
631
799
  if (frame.header.isGlobal) {
632
- if (frame.isCommand('report')) {
633
- type = 'attributeReport';
634
- data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
635
- }
636
- else if (frame.isCommand('read')) {
637
- type = 'read';
638
- data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
639
- }
640
- else if (frame.isCommand('write')) {
641
- type = 'write';
642
- data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
643
- }
644
- else {
645
- /* istanbul ignore else */
646
- if (frame.isCommand('readRsp')) {
647
- type = 'readResponse';
800
+ switch (frame.command.name) {
801
+ case "report": {
802
+ type = "attributeReport";
648
803
  data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
804
+ break;
649
805
  }
650
- }
651
- }
652
- else {
653
- /* istanbul ignore else */
654
- if (frame.header.isSpecific) {
655
- if (Events.CommandsLookup[command.name]) {
656
- type = Events.CommandsLookup[command.name];
657
- data = frame.payload;
806
+ case "read": {
807
+ type = "read";
808
+ data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
809
+ break;
810
+ }
811
+ case "write": {
812
+ type = "write";
813
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
814
+ break;
815
+ }
816
+ case "readRsp": {
817
+ type = "readResponse";
818
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
819
+ break;
658
820
  }
659
- else {
660
- logger_1.logger.debug(`Skipping command '${command.name}' because it is missing from the lookup`, NS);
821
+ case "defaultRsp": {
822
+ if (frame.payload.statusCode !== Zcl.Status.SUCCESS) {
823
+ logger_1.logger.debug(`Failure default response from '${payload.address}': clusterID=${payload.clusterID} cmdId=${frame.payload.cmdId} status=${Zcl.Status[frame.payload.statusCode]}`, NS);
824
+ }
825
+ break;
661
826
  }
662
827
  }
663
- }
664
- if (type === 'readResponse' || type === 'attributeReport') {
665
- // Some device report, e.g. it's modelID through a readResponse or attributeReport
666
- for (const [key, value] of Object.entries(data)) {
667
- const property = model_1.Device.ReportablePropertiesMapping[key];
668
- if (property && !device[property.key]) {
669
- property.set(value, device);
828
+ if (type === "readResponse" || type === "attributeReport") {
829
+ // devices report attributes through readRsp or attributeReport
830
+ if (frame.cluster.name === "genBasic") {
831
+ device.updateGenBasic(data);
670
832
  }
833
+ endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
834
+ }
835
+ }
836
+ else {
837
+ if (frame.header.isSpecific) {
838
+ type = `command${command.name.charAt(0).toUpperCase()}${command.name.slice(1)}`;
839
+ data = frame.payload;
671
840
  }
672
- endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
673
841
  }
674
842
  }
675
843
  else {
676
- type = 'raw';
844
+ type = "raw";
677
845
  data = payload.data;
678
846
  const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
679
847
  clusterName = Number.isNaN(Number(name)) ? name : Number(name);
680
848
  }
681
849
  if (type && data) {
682
- const endpoint = device.getEndpoint(payload.endpoint);
683
850
  const linkquality = payload.linkquality;
684
851
  const groupID = payload.groupID;
685
- const eventData = {
686
- type: type, device, endpoint, data, linkquality, groupID, cluster: clusterName, meta
687
- };
688
- this.selfAndDeviceEmit(device, Events.Events.message, eventData);
689
- this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'messageEmitted' });
852
+ this.selfAndDeviceEmit(device, "message", {
853
+ type,
854
+ device,
855
+ endpoint,
856
+ data,
857
+ linkquality,
858
+ groupID,
859
+ cluster: clusterName,
860
+ meta,
861
+ });
862
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "messageEmitted" });
690
863
  }
691
864
  else {
692
- this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'messageNonEmitted' });
865
+ this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "messageNonEmitted" });
693
866
  }
694
867
  if (frame) {
695
868
  await device.onZclData(payload, frame, endpoint);
696
869
  }
697
870
  }
698
871
  }
872
+ exports.Controller = Controller;
699
873
  exports.default = Controller;
700
874
  //# sourceMappingURL=controller.js.map