@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
@@ -0,0 +1,1159 @@
1
+ import assert from "node:assert";
2
+ import events from "node:events";
3
+ import fs from "node:fs";
4
+ import {Adapter, type Events as AdapterEvents, type TsType as AdapterTsType} from "../adapter";
5
+ import type {ZclPayload} from "../adapter/events";
6
+ import {BackupUtils, wait} from "../utils";
7
+ import {logger} from "../utils/logger";
8
+ import {isNumberArrayOfLength} from "../utils/utils";
9
+ import * as ZSpec from "../zspec";
10
+ import type {Eui64} from "../zspec/tstypes";
11
+ import * as Zcl from "../zspec/zcl";
12
+ import type {TPartialClusterAttributes} from "../zspec/zcl/definition/clusters-types";
13
+ import type {CustomClusters, FrameControl} from "../zspec/zcl/definition/tstype";
14
+ import * as Zdo from "../zspec/zdo";
15
+ import type * as ZdoTypes from "../zspec/zdo/definition/tstypes";
16
+ import Database from "./database";
17
+ import type * as Events from "./events";
18
+ import GreenPower from "./greenPower";
19
+ import {ZclFrameConverter} from "./helpers";
20
+ import {checkInstallCode, parseInstallCode} from "./helpers/installCodes";
21
+ import zclTransactionSequenceNumber from "./helpers/zclTransactionSequenceNumber";
22
+ import {Device, Entity} from "./model";
23
+ import {InterviewState} from "./model/device";
24
+ import Group from "./model/group";
25
+ import Touchlink from "./touchlink";
26
+ import type {DeviceType, GreenPowerDeviceJoinedPayload, RawPayload} from "./tstype";
27
+ import {KonnextConfig} from "./model/konnextConfig";
28
+
29
+ const NS = "zh:controller";
30
+
31
+ interface Options {
32
+ network: AdapterTsType.NetworkOptions;
33
+ serialPort: AdapterTsType.SerialPortOptions;
34
+ databasePath: string;
35
+ databaseBackupPath: string;
36
+ backupPath: string;
37
+ adapter: AdapterTsType.AdapterOptions;
38
+ konnextConfig: KonnextConfig;
39
+ /**
40
+ * This lambda can be used by an application to explictly reject or accept an incoming device.
41
+ * When false is returned zigbee-herdsman will not start the interview process and immidiately
42
+ * try to remove the device from the network.
43
+ */
44
+ acceptJoiningDeviceHandler: (ieeeAddr: string) => Promise<boolean>;
45
+ }
46
+
47
+ export interface ControllerEventMap {
48
+ message: [data: Events.MessagePayload];
49
+ adapterDisconnected: [];
50
+ deviceJoined: [data: Events.DeviceJoinedPayload];
51
+ deviceInterview: [data: Events.DeviceInterviewPayload];
52
+ deviceAnnounce: [data: Events.DeviceAnnouncePayload];
53
+ deviceNetworkAddressChanged: [data: Events.DeviceNetworkAddressChangedPayload];
54
+ deviceLeave: [data: Events.DeviceLeavePayload];
55
+ permitJoinChanged: [data: Events.PermitJoinChangedPayload];
56
+ lastSeenChanged: [data: Events.LastSeenChangedPayload];
57
+ }
58
+
59
+ /**
60
+ * @noInheritDoc
61
+ */
62
+ export class Controller extends events.EventEmitter<ControllerEventMap> {
63
+ private options: Options;
64
+ private database!: Database;
65
+ private adapter!: Adapter;
66
+ #greenPower!: GreenPower;
67
+ #touchlink!: Touchlink;
68
+
69
+ private permitJoinTimer: NodeJS.Timeout | undefined;
70
+ private permitJoinEnd?: number;
71
+ private backupTimer: NodeJS.Timeout | undefined;
72
+ private databaseSaveTimer: NodeJS.Timeout | undefined;
73
+ private stopping: boolean;
74
+ private adapterDisconnected: boolean;
75
+ private networkParametersCached: AdapterTsType.NetworkParameters | undefined;
76
+ /** List of unknown devices detected during a single runtime session. Serves as de-dupe and anti-spam. */
77
+ private unknownDevices: Set<number>;
78
+
79
+ /**
80
+ * Create a controller
81
+ *
82
+ * To auto detect the port provide `null` for `options.serialPort.path`
83
+ */
84
+ public constructor(options: Options) {
85
+ super();
86
+ this.stopping = false;
87
+ this.adapterDisconnected = true; // set false after adapter.start() is successfully called
88
+ const {network: networkOpts, serialPort: serialPortOpts, adapter: adapterOpts, konnextConfig: konnextConfigOpts, ...restOpts} = options;
89
+ this.options = {
90
+ network: {
91
+ networkKeyDistribute: false,
92
+ networkKey: [0x01, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0d],
93
+ extendedPanID: [0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd],
94
+ ...networkOpts,
95
+ },
96
+ serialPort: {...serialPortOpts},
97
+ adapter: {
98
+ ...adapterOpts,
99
+ },
100
+ konnextConfig: {
101
+ // @ts-ignore-next-line we need to set a default value for isEncrypted
102
+ isEncrypted: 0,
103
+ ...konnextConfigOpts,
104
+ },
105
+ ...restOpts,
106
+ };
107
+ this.unknownDevices = new Set();
108
+
109
+ // Validate options
110
+ for (const channel of this.options.network.channelList) {
111
+ if (channel < 11 || channel > 26) {
112
+ throw new Error(`'${channel}' is an invalid channel, use a channel between 11 - 26.`);
113
+ }
114
+ }
115
+
116
+ if (!isNumberArrayOfLength(this.options.network.networkKey, 16)) {
117
+ throw new Error(`Network key must be a 16 digits long array, got ${this.options.network.networkKey}.`);
118
+ }
119
+
120
+ if (!isNumberArrayOfLength(this.options.network.extendedPanID, 8)) {
121
+ throw new Error(`ExtendedPanID must be an 8 digits long array, got ${this.options.network.extendedPanID}.`);
122
+ }
123
+
124
+ if (this.options.network.panID < 1 || this.options.network.panID >= 0xffff) {
125
+ throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
126
+ }
127
+ }
128
+
129
+ get greenPower() {
130
+ return this.#greenPower;
131
+ }
132
+
133
+ get touchlink() {
134
+ return this.#touchlink;
135
+ }
136
+
137
+ /**
138
+ * Start the Herdsman controller
139
+ */
140
+ public async start(abortSignal?: AbortSignal): Promise<AdapterTsType.StartResult> {
141
+ // Database (create end inject)
142
+ this.database = Database.open(this.options.databasePath);
143
+ Entity.injectDatabase(this.database);
144
+
145
+ // Adapter (create and inject)
146
+ this.adapter = await Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.options.konnextConfig);
147
+
148
+ abortSignal?.throwIfAborted();
149
+
150
+ const stringifiedOptions = JSON.stringify(this.options).replaceAll(JSON.stringify(this.options.network.networkKey), '"HIDDEN"');
151
+ logger.debug(`Starting with options '${stringifiedOptions}'`, NS);
152
+ const startResult = await this.adapter.start();
153
+ logger.debug(`Started with result '${startResult}'`, NS);
154
+ this.adapterDisconnected = false;
155
+
156
+ abortSignal?.throwIfAborted();
157
+
158
+ // Check if we have to change the channel, only do this when adapter `resumed` because:
159
+ // - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
160
+ // - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
161
+ if (startResult === "resumed") {
162
+ const netParams = await this.getNetworkParameters();
163
+ const configuredChannel = this.options.network.channelList[0];
164
+ const adapterChannel = netParams.channel;
165
+ const nwkUpdateID = netParams.nwkUpdateID;
166
+
167
+ if (configuredChannel !== adapterChannel) {
168
+ logger.info(`Configured channel '${configuredChannel}' does not match adapter channel '${adapterChannel}', changing channel`, NS);
169
+ await this.changeChannel(adapterChannel, configuredChannel, nwkUpdateID);
170
+
171
+ abortSignal?.throwIfAborted();
172
+ }
173
+ }
174
+
175
+ Entity.injectAdapter(this.database.id, this.adapter);
176
+
177
+ // log injection
178
+ logger.debug(`Injected database: ${this.database !== undefined}, adapter: ${this.adapter !== undefined}`, NS);
179
+
180
+ this.#greenPower = new GreenPower(this.adapter, this.database.id);
181
+ this.#greenPower.on("deviceJoined", this.onDeviceJoinedGreenPower.bind(this));
182
+ this.#greenPower.on("deviceLeave", this.onDeviceLeaveGreenPower.bind(this));
183
+
184
+ // Register adapter events
185
+ this.adapter.on("deviceJoined", this.onDeviceJoined.bind(this));
186
+ this.adapter.on("zclPayload", this.onZclPayload.bind(this));
187
+ this.adapter.on("zdoResponse", this.onZdoResponse.bind(this));
188
+ this.adapter.on("disconnected", this.onAdapterDisconnected.bind(this));
189
+ this.adapter.on("deviceLeave", this.onDeviceLeave.bind(this));
190
+
191
+ if (startResult === "reset") {
192
+ if (this.options.databaseBackupPath && fs.existsSync(this.options.databasePath)) {
193
+ fs.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
194
+ }
195
+
196
+ this.database.clear();
197
+ Group.resetCache();
198
+ Device.resetCache();
199
+
200
+ abortSignal?.throwIfAborted();
201
+ }
202
+
203
+ if (startResult === "reset" || (this.options.backupPath && !fs.existsSync(this.options.backupPath))) {
204
+ await this.backup();
205
+
206
+ abortSignal?.throwIfAborted();
207
+ }
208
+
209
+ // Add coordinator to the database if it is not there yet.
210
+ const coordinatorIEEE = await this.adapter.getCoordinatorIEEE();
211
+
212
+ if (Device.byType(this.database.id, "Coordinator").length === 0) {
213
+ logger.debug("No coordinator in database, querying...", NS);
214
+ const coordinator = Device.create(
215
+ "Coordinator",
216
+ coordinatorIEEE,
217
+ ZSpec.COORDINATOR_ADDRESS,
218
+ this.adapter.manufacturerID,
219
+ undefined,
220
+ undefined,
221
+ undefined,
222
+ InterviewState.Successful,
223
+ undefined,
224
+ this.database.id,
225
+ );
226
+
227
+ await coordinator.updateActiveEndpoints();
228
+
229
+ abortSignal?.throwIfAborted();
230
+
231
+ for (const endpoint of coordinator.endpoints) {
232
+ await endpoint.updateSimpleDescriptor();
233
+
234
+ abortSignal?.throwIfAborted();
235
+ }
236
+
237
+ coordinator.save();
238
+ }
239
+
240
+ // Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
241
+ const databaseCoordinator = Device.byType(this.database.id, "Coordinator")[0];
242
+ if (databaseCoordinator.ieeeAddr !== coordinatorIEEE) {
243
+ logger.info(`Coordinator address changed, updating to '${coordinatorIEEE}'`, NS);
244
+ databaseCoordinator.changeIeeeAddress(coordinatorIEEE);
245
+ }
246
+
247
+ // Set backup timer to 1 day.
248
+ this.backupTimer = setInterval(() => this.backup(), 86400000);
249
+
250
+ // Set database save timer to 5 minutes.
251
+ this.databaseSaveTimer = setInterval(() => this.databaseSave(), 300000);
252
+
253
+ this.#touchlink = new Touchlink(this.adapter);
254
+
255
+ return startResult;
256
+ }
257
+
258
+ /**
259
+ * Send a request according to given payload.
260
+ * @param rawPayload Payload used to determine and build the request
261
+ * @param customClusters Manually passed custom clusters used in ZCL serialization (if any, if matching)
262
+ * @returns A response may or may not be returned depending on given payload (up to caller to verify)
263
+ */
264
+ public async sendRaw(rawPayload: RawPayload, customClusters: CustomClusters = {}): Promise<ZdoTypes.GenericZdoResponse | ZclPayload | undefined> {
265
+ const {
266
+ ieeeAddress,
267
+ networkAddress,
268
+ groupId,
269
+ dstEndpoint,
270
+ srcEndpoint = ZSpec.HA_ENDPOINT,
271
+ interPan = false,
272
+ profileId = ZSpec.HA_PROFILE_ID,
273
+ clusterKey,
274
+ zdoParams,
275
+ zcl,
276
+ disableResponse = false,
277
+ timeout = 10000,
278
+ } = rawPayload;
279
+
280
+ if (profileId === Zdo.ZDO_PROFILE_ID) {
281
+ assert(ieeeAddress);
282
+ assert(networkAddress !== undefined);
283
+ assert(clusterKey !== undefined && typeof clusterKey === "number");
284
+ // no ZDO request takes 0 params
285
+ assert(Array.isArray(zdoParams) && zdoParams.length > 0);
286
+
287
+ // will fail if args are incorrect for request
288
+ const buf = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterKey, ...zdoParams);
289
+
290
+ return (await this.adapter.sendZdo(ieeeAddress, networkAddress, clusterKey, buf, disableResponse)) as ZdoTypes.GenericZdoResponse;
291
+ }
292
+
293
+ assert(zcl);
294
+
295
+ if (interPan) {
296
+ assert(zcl.commandKey);
297
+ assert(zcl.payload);
298
+ assert(zcl.frameType === undefined);
299
+ assert(zcl.direction === undefined);
300
+
301
+ const zclFrame = Zcl.Frame.create(
302
+ zcl.frameType ?? Zcl.FrameType.SPECIFIC,
303
+ zcl.direction ?? Zcl.Direction.CLIENT_TO_SERVER,
304
+ true,
305
+ zcl.manufacturerCode,
306
+ 0,
307
+ zcl.commandKey,
308
+ clusterKey ?? Zcl.Clusters.touchlink.ID,
309
+ zcl.payload,
310
+ customClusters,
311
+ );
312
+
313
+ if (ieeeAddress) {
314
+ await this.adapter.sendZclFrameInterPANToIeeeAddr(zclFrame, ieeeAddress);
315
+ return;
316
+ }
317
+
318
+ return await this.adapter.sendZclFrameInterPANBroadcast(zclFrame, timeout, disableResponse);
319
+ }
320
+
321
+ assert(clusterKey !== undefined);
322
+ assert(zcl.frameType !== undefined);
323
+ assert(zcl.direction !== undefined);
324
+
325
+ const zclFrame = Zcl.Frame.create(
326
+ zcl.frameType,
327
+ zcl.direction,
328
+ zcl.disableDefaultResponse ?? false,
329
+ zcl.manufacturerCode,
330
+ zcl.tsn ?? zclTransactionSequenceNumber.next(),
331
+ zcl.commandKey,
332
+ clusterKey,
333
+ zcl.payload,
334
+ customClusters,
335
+ );
336
+
337
+ if (groupId !== undefined) {
338
+ assert(groupId >= 0x0000 && groupId <= 0xffff);
339
+
340
+ await this.adapter.sendZclFrameToGroup(groupId, zclFrame, srcEndpoint, profileId);
341
+ return;
342
+ }
343
+
344
+ assert(dstEndpoint !== undefined && dstEndpoint >= 0x01 && dstEndpoint <= 0xff);
345
+ assert(srcEndpoint >= 0x01 && srcEndpoint <= 0xff);
346
+ assert(networkAddress !== undefined && networkAddress >= 0x0000 && networkAddress <= 0xffff);
347
+
348
+ if (networkAddress >= ZSpec.BROADCAST_MIN) {
349
+ await this.adapter.sendZclFrameToAll(dstEndpoint, zclFrame, srcEndpoint, networkAddress, profileId);
350
+ return;
351
+ }
352
+
353
+ assert(ieeeAddress);
354
+
355
+ return await this.adapter.sendZclFrameToEndpoint(
356
+ ieeeAddress,
357
+ networkAddress,
358
+ dstEndpoint,
359
+ zclFrame,
360
+ timeout,
361
+ disableResponse,
362
+ false,
363
+ srcEndpoint,
364
+ profileId,
365
+ );
366
+ }
367
+
368
+ public async addInstallCode(installCode: string): Promise<void> {
369
+ // will throw if code cannot be parsed
370
+ const [ieeeAddr, keyStr] = parseInstallCode(installCode);
371
+ // biome-ignore lint/style/noNonNullAssertion: valid from above parsing
372
+ const key = Buffer.from(keyStr.match(/.{1,2}/g)!.map((d) => Number.parseInt(d, 16)));
373
+ // will throw if code cannot be fixed and is invalid
374
+ const [adjustedKey, adjusted] = checkInstallCode(key, true);
375
+
376
+ if (adjusted) {
377
+ logger.info(`Install code was adjusted for reason '${adjusted}'.`, NS);
378
+ }
379
+
380
+ logger.info(`Adding install code for ${ieeeAddr}.`, NS);
381
+
382
+ await this.adapter.addInstallCode(ieeeAddr, adjustedKey, false);
383
+
384
+ if (adjusted === "missing CRC") {
385
+ // in case the CRC was missing, could also be a "already-hashed" key, send both
386
+ // XXX: seems to be the case for old HA1.2 devices
387
+ await this.adapter.addInstallCode(ieeeAddr, key, true);
388
+ }
389
+ }
390
+
391
+ public async permitJoin(time: number, device?: Device): Promise<void> {
392
+ clearTimeout(this.permitJoinTimer);
393
+ this.permitJoinTimer = undefined;
394
+ this.permitJoinEnd = undefined;
395
+
396
+ if (time > 0) {
397
+ // never permit more than uint8, and never permit 255 that is often equal to "forever"
398
+ assert(time <= 254, "Cannot permit join for more than 254 seconds.");
399
+
400
+ await this.adapter.permitJoin(time, device?.networkAddress);
401
+ await this.#greenPower.permitJoin(time, device?.networkAddress);
402
+
403
+ const timeMs = time * 1000;
404
+ this.permitJoinEnd = Date.now() + timeMs;
405
+ this.permitJoinTimer = setTimeout((): void => {
406
+ this.emit("permitJoinChanged", {permitted: false});
407
+
408
+ this.permitJoinTimer = undefined;
409
+ this.permitJoinEnd = undefined;
410
+ }, timeMs);
411
+
412
+ this.emit("permitJoinChanged", {permitted: true, time});
413
+ } else {
414
+ logger.debug("Disable joining", NS);
415
+
416
+ await this.#greenPower.permitJoin(0);
417
+ await this.adapter.permitJoin(0);
418
+
419
+ this.emit("permitJoinChanged", {permitted: false});
420
+ }
421
+ }
422
+
423
+ public getPermitJoin(): boolean {
424
+ return this.permitJoinTimer !== undefined;
425
+ }
426
+
427
+ public getPermitJoinEnd(): number | undefined {
428
+ return this.permitJoinEnd;
429
+ }
430
+
431
+ public isStopping(): boolean {
432
+ return this.stopping;
433
+ }
434
+
435
+ public isAdapterDisconnected(): boolean {
436
+ return this.adapterDisconnected;
437
+ }
438
+
439
+ public async stop(): Promise<void> {
440
+ this.stopping = true;
441
+
442
+ // Unregister adapter events
443
+ this.adapter.removeAllListeners();
444
+
445
+ clearInterval(this.backupTimer);
446
+ clearInterval(this.databaseSaveTimer);
447
+
448
+ if (this.adapterDisconnected) {
449
+ this.databaseSave();
450
+ } else {
451
+ try {
452
+ await this.#touchlink.stop();
453
+ } catch (error) {
454
+ logger.error(`Failed to stop Touchlink: ${error}`, NS);
455
+ }
456
+
457
+ try {
458
+ await this.permitJoin(0);
459
+ } catch (error) {
460
+ logger.error(`Failed to disable join on stop: ${error}`, NS);
461
+ }
462
+
463
+ await this.backup(); // always calls databaseSave()
464
+ await this.adapter.stop();
465
+
466
+ this.adapterDisconnected = true;
467
+ }
468
+
469
+ Device.resetCache();
470
+ Group.resetCache();
471
+ Entity.removeAdapter(this.database.id);
472
+ Entity.removeDatabase(this.database.id);
473
+ }
474
+
475
+ private databaseSave(): void {
476
+ for (const device of Device.allIterator(this.database.id)) {
477
+ device.save(false);
478
+ }
479
+
480
+ for (const group of Group.allIterator(this.database.id)) {
481
+ group.save(false);
482
+ }
483
+
484
+ this.database.write();
485
+ }
486
+
487
+ public async backup(): Promise<void> {
488
+ this.databaseSave();
489
+ if (this.options.backupPath && (await this.adapter.supportsBackup())) {
490
+ logger.debug("Creating coordinator backup", NS);
491
+ const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
492
+ const unifiedBackup = BackupUtils.toUnifiedBackup(backup);
493
+ const tmpBackupPath = `${this.options.backupPath}.tmp`;
494
+ fs.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
495
+ fs.renameSync(tmpBackupPath, this.options.backupPath);
496
+ logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
497
+ }
498
+ }
499
+
500
+ public async coordinatorCheck(): Promise<{missingRouters: Device[]}> {
501
+ if (await this.adapter.supportsBackup()) {
502
+ const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
503
+ const devicesInBackup = backup.devices.map((d) => ZSpec.Utils.eui64BEBufferToHex(d.ieeeAddress));
504
+ const missingRouters = [];
505
+
506
+ for (const device of this.getDevicesIterator((d) => d.type === "Router" && !devicesInBackup.includes(d.ieeeAddr as Eui64))) {
507
+ missingRouters.push(device);
508
+ }
509
+
510
+ return {missingRouters};
511
+ }
512
+
513
+ throw new Error("Coordinator does not coordinator check because it doesn't support backups");
514
+ }
515
+
516
+ public async reset(type: "soft" | "hard"): Promise<void> {
517
+ await this.adapter.reset(type);
518
+ }
519
+
520
+ public async getCoordinatorVersion(): Promise<AdapterTsType.CoordinatorVersion> {
521
+ return await this.adapter.getCoordinatorVersion();
522
+ }
523
+
524
+ public async getNetworkParameters(): Promise<AdapterTsType.NetworkParameters> {
525
+ // Cache network parameters as they don't change anymore after start.
526
+ if (!this.networkParametersCached) {
527
+ this.networkParametersCached = await this.adapter.getNetworkParameters();
528
+ }
529
+
530
+ return this.networkParametersCached;
531
+ }
532
+
533
+ /**
534
+ * Get the database ID for this controller's database.
535
+ */
536
+ public getDatabaseId(): number {
537
+ return this.database.id;
538
+ }
539
+
540
+ /**
541
+ * Get all devices
542
+ * @deprecated use getDevicesIterator()
543
+ */
544
+ public getDevices(): Device[] {
545
+ return Device.allByDatabaseID(this.database.id);
546
+ }
547
+
548
+ /**
549
+ * Get iterator for all devices
550
+ */
551
+ public getDevicesIterator(predicate?: (value: Device) => boolean): Generator<Device> {
552
+ return Device.allIterator(this.database.id, predicate);
553
+ }
554
+
555
+ /**
556
+ * Get all devices with a specific type
557
+ */
558
+ public getDevicesByType(type: DeviceType): Device[] {
559
+ return Device.byType(this.database.id, type);
560
+ }
561
+
562
+ /**
563
+ * Get device by ieeeAddr
564
+ */
565
+ public getDeviceByIeeeAddr(ieeeAddr: string): Device | undefined {
566
+ return Device.byIeeeAddr(this.database.id, ieeeAddr);
567
+ }
568
+
569
+ /**
570
+ * Get device by networkAddress
571
+ */
572
+ public getDeviceByNetworkAddress(networkAddress: number): Device | undefined {
573
+ return Device.byNetworkAddress(this.database.id, networkAddress);
574
+ }
575
+
576
+ /**
577
+ * Get IEEE address for all devices
578
+ */
579
+ public getDeviceIeeeAddresses(): string[] {
580
+ const deviceIeeeAddresses = [];
581
+
582
+ for (const device of Device.allIterator(this.database.id)) {
583
+ deviceIeeeAddresses.push(device.ieeeAddr);
584
+ }
585
+
586
+ return deviceIeeeAddresses;
587
+ }
588
+
589
+ /**
590
+ * Get group by ID
591
+ */
592
+ public getGroupByID(groupID: number): Group | undefined {
593
+ return Group.byGroupID(groupID, this.database.id);
594
+ }
595
+
596
+ /**
597
+ * Get all groups
598
+ * @deprecated use getGroupsIterator()
599
+ */
600
+ public getGroups(): Group[] {
601
+ return Group.allByDatabaseID(this.database.id);
602
+ }
603
+
604
+ /**
605
+ * Get iterator for all groups
606
+ */
607
+ public getGroupsIterator(predicate?: (value: Group) => boolean): Generator<Group> {
608
+ return Group.allIterator(this.database.id, predicate);
609
+ }
610
+
611
+ /**
612
+ * Create a Group
613
+ */
614
+ public createGroup(groupID: number): Group {
615
+ return Group.create(groupID, this.database.id);
616
+ }
617
+
618
+ /**
619
+ * Broadcast a network-wide channel change.
620
+ */
621
+ private async changeChannel(oldChannel: number, newChannel: number, nwkUpdateID: number): Promise<void> {
622
+ logger.warning(`Changing channel from '${oldChannel}' to '${newChannel}'`, NS);
623
+
624
+ // According to the Zigbee specification:
625
+ // 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.
626
+ // The valid range of nwkUpdateId is 0x00 to 0xFF, and it should wrap back to 0 if necessary.
627
+ if (++nwkUpdateID > 0xff) {
628
+ nwkUpdateID = 0x00;
629
+ }
630
+
631
+ const clusterId = Zdo.ClusterId.NWK_UPDATE_REQUEST;
632
+ const zdoPayload = Zdo.Buffalo.buildRequest(
633
+ this.adapter.hasZdoMessageOverhead,
634
+ clusterId,
635
+ [newChannel],
636
+ 0xfe,
637
+ undefined,
638
+ nwkUpdateID,
639
+ undefined,
640
+ );
641
+
642
+ await this.adapter.sendZdo(ZSpec.BLANK_EUI64, ZSpec.BroadcastAddress.SLEEPY, clusterId, zdoPayload, true);
643
+ logger.info(`Channel changed to '${newChannel}'`, NS);
644
+
645
+ this.networkParametersCached = undefined; // invalidate cache
646
+ // wait for the broadcast to propagate and the adapter to actually change
647
+ // NOTE: observed to ~9sec on `ember` with actual stack event
648
+ await wait(12000);
649
+ }
650
+
651
+ public async identifyUnknownDevice(nwkAddress: number): Promise<Device | undefined> {
652
+ if (this.unknownDevices.has(nwkAddress)) {
653
+ // prevent duplicate triggering
654
+ return;
655
+ }
656
+
657
+ logger.debug(`Trying to identify unknown device with address '${nwkAddress}'`, NS);
658
+ this.unknownDevices.add(nwkAddress);
659
+ const clusterId = Zdo.ClusterId.IEEE_ADDRESS_REQUEST;
660
+ const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, nwkAddress, false, 0);
661
+
662
+ try {
663
+ const response = await this.adapter.sendZdo(ZSpec.BLANK_EUI64, nwkAddress, clusterId, zdoPayload, false);
664
+
665
+ if (Zdo.Buffalo.checkStatus<Zdo.ClusterId.IEEE_ADDRESS_RESPONSE>(response)) {
666
+ const payload = response[1];
667
+ const device = Device.byIeeeAddr(this.database.id, payload.eui64);
668
+
669
+ if (device) {
670
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
671
+ this.unknownDevices.delete(payload.nwkAddress);
672
+ }
673
+
674
+ return device;
675
+ }
676
+
677
+ throw new Zdo.StatusError(response[0]);
678
+ } catch (error) {
679
+ // Catches 2 types of exception: Zdo.StatusError and no response from `adapter.sendZdo()`.
680
+ logger.debug(`Failed to retrieve IEEE address for device '${nwkAddress}': ${error}`, NS);
681
+ }
682
+
683
+ // NOTE: by keeping nwkAddress in `this.unknownDevices` on fail, it prevents a non-responding device from potentially spamming identify.
684
+ // This only lasts until next reboot (runtime Set), allowing to 'force' another trigger if necessary.
685
+ }
686
+
687
+ private checkDeviceNetworkAddress(device: Device, ieeeAddress: string, nwkAddress: number): void {
688
+ if (device.networkAddress !== nwkAddress) {
689
+ logger.debug(`Device '${ieeeAddress}' got new networkAddress '${nwkAddress}'`, NS);
690
+ device.networkAddress = nwkAddress;
691
+ device.save();
692
+
693
+ this.selfAndDeviceEmit(device, "deviceNetworkAddressChanged", {device});
694
+ }
695
+ }
696
+
697
+ private onNetworkAddress(payload: ZdoTypes.NetworkAddressResponse): void {
698
+ logger.debug(`Network address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
699
+ const device = Device.byIeeeAddr(this.database.id, payload.eui64);
700
+
701
+ if (!device) {
702
+ logger.debug(`Network address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
703
+ return;
704
+ }
705
+
706
+ device.updateLastSeen();
707
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "networkAddress"});
708
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
709
+ }
710
+
711
+ private onIEEEAddress(payload: ZdoTypes.IEEEAddressResponse): void {
712
+ logger.debug(`IEEE address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
713
+ const device = Device.byIeeeAddr(this.database.id, payload.eui64);
714
+
715
+ if (!device) {
716
+ logger.debug(`IEEE address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
717
+ return;
718
+ }
719
+
720
+ device.updateLastSeen();
721
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "networkAddress"});
722
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
723
+ }
724
+
725
+ private onDeviceAnnounce(payload: ZdoTypes.EndDeviceAnnounce): void {
726
+ logger.debug(`Device announce from '${payload.eui64}:${payload.nwkAddress}'`, NS);
727
+ const device = Device.byIeeeAddr(this.database.id, payload.eui64);
728
+
729
+ if (!device) {
730
+ logger.debug(`Device announce is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
731
+ return;
732
+ }
733
+
734
+ device.updateLastSeen();
735
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "deviceAnnounce"});
736
+ device.implicitCheckin();
737
+ this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
738
+ this.selfAndDeviceEmit(device, "deviceAnnounce", {device});
739
+ }
740
+
741
+ private onDeviceLeave(payload: AdapterEvents.DeviceLeavePayload): void {
742
+ logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
743
+
744
+ // XXX: seems type is not properly detected?
745
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
746
+ const device = payload.ieeeAddr ? Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : Device.byNetworkAddress(this.database.id, payload.networkAddress!);
747
+
748
+ if (!device) {
749
+ logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
750
+ return;
751
+ }
752
+
753
+ logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
754
+ device.removeFromDatabase();
755
+
756
+ this.selfAndDeviceEmit(device, "deviceLeave", {ieeeAddr: device.ieeeAddr});
757
+ }
758
+
759
+ private async onAdapterDisconnected(): Promise<void> {
760
+ logger.debug("Adapter disconnected", NS);
761
+
762
+ this.adapterDisconnected = true;
763
+
764
+ try {
765
+ await this.adapter.stop();
766
+ } catch (error) {
767
+ logger.error(`Failed to stop adapter on disconnect: ${error}`, NS);
768
+ }
769
+
770
+ this.emit("adapterDisconnected");
771
+ }
772
+
773
+ private onDeviceJoinedGreenPower(payload: GreenPowerDeviceJoinedPayload): void {
774
+ logger.debug(() => `Green power device '${JSON.stringify(payload).replaceAll(/\[[\d,]+\]/g, "HIDDEN")}' joined`, NS);
775
+
776
+ // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
777
+ const ieeeAddr = GreenPower.sourceIdToIeeeAddress(payload.sourceID);
778
+ // Green power devices dont' have a modelID, create a modelID based on the deviceID (=type)
779
+ const modelID = `GreenPower_${payload.deviceID}`;
780
+ let device = Device.byIeeeAddr(this.database.id, ieeeAddr, true);
781
+
782
+ if (!device) {
783
+ logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
784
+ logger.debug(`Creating device '${ieeeAddr}'`, NS);
785
+ device = Device.create(
786
+ "GreenPower",
787
+ ieeeAddr,
788
+ payload.networkAddress,
789
+ undefined,
790
+ undefined,
791
+ undefined,
792
+ modelID,
793
+ InterviewState.Successful,
794
+ payload.securityKey ? Array.from(payload.securityKey) : /* v8 ignore next */ undefined,
795
+ this.database.id,
796
+ );
797
+
798
+ device.save();
799
+
800
+ this.selfAndDeviceEmit(device, "deviceJoined", {device});
801
+ this.selfAndDeviceEmit(device, "deviceInterview", {status: "successful", device});
802
+ } else if (device.isDeleted) {
803
+ logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
804
+
805
+ device.undelete();
806
+
807
+ this.selfAndDeviceEmit(device, "deviceJoined", {device});
808
+ this.selfAndDeviceEmit(device, "deviceInterview", {status: "successful", device});
809
+ }
810
+ }
811
+
812
+ private onDeviceLeaveGreenPower(sourceID: number): void {
813
+ logger.debug(`Green power device '${sourceID}' left`, NS);
814
+
815
+ // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
816
+ const ieeeAddr = GreenPower.sourceIdToIeeeAddress(sourceID);
817
+ const device = Device.byIeeeAddr(this.database.id, ieeeAddr);
818
+
819
+ if (!device) {
820
+ logger.debug(`Green power device leave is from unknown or already deleted device '${ieeeAddr}'`, NS);
821
+ return;
822
+ }
823
+
824
+ logger.debug(`Removing green power device from database '${device.ieeeAddr}'`, NS);
825
+ device.removeFromDatabase();
826
+
827
+ this.selfAndDeviceEmit(device, "deviceLeave", {ieeeAddr: device.ieeeAddr});
828
+ }
829
+
830
+ private selfAndDeviceEmit<K extends keyof ControllerEventMap>(
831
+ device: Device,
832
+ event: K,
833
+ ...args: K extends keyof ControllerEventMap ? ControllerEventMap[K] : never
834
+ ): void {
835
+ device.emit(event, ...args);
836
+ this.emit(event, ...args);
837
+ }
838
+
839
+ private async onDeviceJoined(payload: AdapterEvents.DeviceJoinedPayload): Promise<void> {
840
+ logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
841
+
842
+ if (this.options.acceptJoiningDeviceHandler) {
843
+ if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
844
+ logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
845
+
846
+ // XXX: GP devices? see Device.removeFromNetwork
847
+ try {
848
+ const clusterId = Zdo.ClusterId.LEAVE_REQUEST;
849
+ const zdoPayload = Zdo.Buffalo.buildRequest(
850
+ this.adapter.hasZdoMessageOverhead,
851
+ clusterId,
852
+ payload.ieeeAddr as Eui64,
853
+ Zdo.LeaveRequestFlags.WITHOUT_REJOIN,
854
+ );
855
+ const response = await this.adapter.sendZdo(payload.ieeeAddr, payload.networkAddress, clusterId, zdoPayload, false);
856
+
857
+ if (!Zdo.Buffalo.checkStatus<Zdo.ClusterId.LEAVE_RESPONSE>(response)) {
858
+ throw new Zdo.StatusError(response[0]);
859
+ }
860
+ } catch (error) {
861
+ logger.error(`Failed to remove rejected device: ${(error as Error).message}`, NS);
862
+ }
863
+
864
+ return;
865
+ }
866
+
867
+ logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
868
+ }
869
+
870
+ let device = Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
871
+ if (!device) {
872
+ logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
873
+ logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
874
+ device = Device.create(
875
+ "Unknown",
876
+ payload.ieeeAddr,
877
+ payload.networkAddress,
878
+ undefined,
879
+ undefined,
880
+ undefined,
881
+ undefined,
882
+ InterviewState.Pending,
883
+ undefined,
884
+ this.database.id,
885
+ );
886
+ this.selfAndDeviceEmit(device, "deviceJoined", {device});
887
+ } else if (device.isDeleted) {
888
+ logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
889
+ device.undelete();
890
+ this.selfAndDeviceEmit(device, "deviceJoined", {device});
891
+ }
892
+
893
+ if (device.networkAddress !== payload.networkAddress) {
894
+ logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
895
+ device.networkAddress = payload.networkAddress;
896
+ device.save();
897
+ }
898
+
899
+ device.updateLastSeen();
900
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "deviceJoined"});
901
+ device.implicitCheckin();
902
+
903
+ if (device.interviewState === InterviewState.Pending || device.interviewState === InterviewState.Failed) {
904
+ logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
905
+ this.selfAndDeviceEmit(device, "deviceInterview", {status: "started", device});
906
+
907
+ try {
908
+ await device.interview();
909
+ logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
910
+ this.selfAndDeviceEmit(device, "deviceInterview", {status: "successful", device});
911
+ } catch (error) {
912
+ logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
913
+ this.selfAndDeviceEmit(device, "deviceInterview", {status: "failed", device});
914
+ }
915
+ } else {
916
+ logger.debug(`Not interviewing '${payload.ieeeAddr}', interviewState=${device.interviewState}'`, NS);
917
+ }
918
+ }
919
+
920
+ private onZdoResponse(clusterId: Zdo.ClusterId, response: ZdoTypes.GenericZdoResponse): void {
921
+ logger.debug(
922
+ `Received ZDO response: clusterId=${Zdo.ClusterId[clusterId]}, status=${Zdo.Status[response[0]]}, payload=${JSON.stringify(response[1])}`,
923
+ NS,
924
+ );
925
+
926
+ switch (clusterId) {
927
+ case Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE: {
928
+ if (Zdo.Buffalo.checkStatus<typeof clusterId>(response)) {
929
+ this.onNetworkAddress(response[1]);
930
+ }
931
+ break;
932
+ }
933
+
934
+ case Zdo.ClusterId.IEEE_ADDRESS_RESPONSE: {
935
+ if (Zdo.Buffalo.checkStatus<typeof clusterId>(response)) {
936
+ this.onIEEEAddress(response[1]);
937
+ }
938
+ break;
939
+ }
940
+
941
+ case Zdo.ClusterId.END_DEVICE_ANNOUNCE: {
942
+ if (Zdo.Buffalo.checkStatus<typeof clusterId>(response)) {
943
+ this.onDeviceAnnounce(response[1]);
944
+ }
945
+ break;
946
+ }
947
+ }
948
+ }
949
+
950
+ private async onZclPayload(payload: AdapterEvents.ZclPayload): Promise<void> {
951
+ let frame: Zcl.Frame | undefined;
952
+ let device: Device | undefined;
953
+
954
+ if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
955
+ // This is handled by touchlink
956
+ return;
957
+ }
958
+
959
+ if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
960
+ try {
961
+ // Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
962
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
963
+ } catch (error) {
964
+ logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
965
+ return;
966
+ }
967
+
968
+ if (frame.payload.commandID === undefined) {
969
+ // can be from gpd or gpp
970
+ // can be:
971
+ // - greenPower.commandsResponse.commissioningMode
972
+ // - Foundation.defaultRsp for greenPower.commandsResponse.pairing with status INVALID_FIELD or INSUFFICIENT_SPACE
973
+ // - ...
974
+ device = Device.find(this.database.id, payload.address);
975
+ } else {
976
+ if (frame.payload.srcID === undefined) {
977
+ logger.debug("Data is from unsupported green power device with IEEE addressing, skipping...", NS);
978
+ return;
979
+ }
980
+
981
+ const ieeeAddr = GreenPower.sourceIdToIeeeAddress(frame.payload.srcID);
982
+ device = Device.byIeeeAddr(this.database.id, ieeeAddr);
983
+ frame = await this.#greenPower.processCommand(payload, frame, device?.gpSecurityKey ? Buffer.from(device.gpSecurityKey) : undefined);
984
+
985
+ // lookup encapsulated gpDevice for further processing (re-fetch, may have been created by above call)
986
+ device = Device.byIeeeAddr(this.database.id, ieeeAddr);
987
+
988
+ if (!device) {
989
+ logger.debug(`Data is from unknown green power device with address '${ieeeAddr}' (${frame.payload.srcID}), skipping...`, NS);
990
+ return;
991
+ }
992
+ }
993
+ } else {
994
+ /**
995
+ * Handling of re-transmitted Xiaomi messages.
996
+ * https://github.com/Koenkk/zigbee2mqtt/issues/1238
997
+ * https://github.com/Koenkk/zigbee2mqtt/issues/3592
998
+ *
999
+ * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
1000
+ * The network address of these message is set to the one of the Xiaomi router.
1001
+ * Therefore it looks like if the message came from the Xiaomi router, while in
1002
+ * fact it came from the end device.
1003
+ * Handling these message would result in false state updates.
1004
+ * The group ID attribute of these message defines the network address of the end device.
1005
+ */
1006
+ device = Device.find(this.database.id, payload.address);
1007
+
1008
+ if (device?.manufacturerName === "LUMI" && device?.type === "Router" && payload.groupID) {
1009
+ logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
1010
+ device = Device.byNetworkAddress(this.database.id, payload.groupID);
1011
+ }
1012
+
1013
+ try {
1014
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device ? device.customClusters : {});
1015
+ } catch (error) {
1016
+ logger.debug(`Failed to parse frame: ${error}`, NS);
1017
+ }
1018
+ }
1019
+
1020
+ if (!device) {
1021
+ if (typeof payload.address === "number" && !Device.isDeletedByNetworkAddress(this.database.id, payload.address)) {
1022
+ device = await this.identifyUnknownDevice(payload.address);
1023
+ }
1024
+
1025
+ if (!device) {
1026
+ logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
1027
+ return;
1028
+ }
1029
+ }
1030
+
1031
+ logger.debug(
1032
+ `Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, ` +
1033
+ `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, ` +
1034
+ `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`,
1035
+ NS,
1036
+ );
1037
+
1038
+ device.updateLastSeen();
1039
+
1040
+ //no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
1041
+ if (frame?.cluster.name !== "genPollCtrl") {
1042
+ device.implicitCheckin();
1043
+ }
1044
+
1045
+ device.linkquality = payload.linkquality;
1046
+ let endpoint = device.getEndpoint(payload.endpoint);
1047
+
1048
+ if (!endpoint) {
1049
+ logger.debug(
1050
+ `Data is from unknown endpoint '${payload.endpoint}' from device with network address '${payload.address}', creating it...`,
1051
+ NS,
1052
+ );
1053
+
1054
+ endpoint = device.createEndpoint(payload.endpoint);
1055
+ }
1056
+
1057
+ // Parse command for event
1058
+ let type: Events.MessagePayload["type"] | undefined;
1059
+ let data: Events.MessagePayload["data"] = {};
1060
+ let clusterName: Events.MessagePayload["cluster"];
1061
+ const meta: {
1062
+ zclTransactionSequenceNumber?: number;
1063
+ manufacturerCode?: number;
1064
+ frameControl?: FrameControl;
1065
+ rawData: Buffer;
1066
+ } = {rawData: payload.data};
1067
+
1068
+ if (frame) {
1069
+ const command = frame.command;
1070
+ clusterName = frame.cluster.name;
1071
+ meta.zclTransactionSequenceNumber = frame.header.transactionSequenceNumber;
1072
+ meta.manufacturerCode = frame.header.manufacturerCode;
1073
+ meta.frameControl = frame.header.frameControl;
1074
+
1075
+ if (frame.header.isGlobal) {
1076
+ switch (frame.command.name) {
1077
+ case "report": {
1078
+ type = "attributeReport";
1079
+ data = ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
1080
+ break;
1081
+ }
1082
+
1083
+ case "read": {
1084
+ type = "read";
1085
+ data = ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
1086
+ break;
1087
+ }
1088
+
1089
+ case "write": {
1090
+ type = "write";
1091
+ data = ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
1092
+ break;
1093
+ }
1094
+
1095
+ case "readRsp": {
1096
+ type = "readResponse";
1097
+ data = ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
1098
+ break;
1099
+ }
1100
+
1101
+ case "defaultRsp": {
1102
+ if (frame.payload.statusCode !== Zcl.Status.SUCCESS) {
1103
+ logger.debug(
1104
+ `Failure default response from '${payload.address}': clusterID=${payload.clusterID} cmdId=${frame.payload.cmdId} status=${Zcl.Status[frame.payload.statusCode]}`,
1105
+ NS,
1106
+ );
1107
+ }
1108
+
1109
+ break;
1110
+ }
1111
+ }
1112
+
1113
+ if (type === "readResponse" || type === "attributeReport") {
1114
+ // devices report attributes through readRsp or attributeReport
1115
+ if (frame.cluster.name === "genBasic") {
1116
+ device.updateGenBasic(data as TPartialClusterAttributes<"genBasic">);
1117
+ }
1118
+
1119
+ endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
1120
+ }
1121
+ } else {
1122
+ if (frame.header.isSpecific) {
1123
+ type = `command${command.name.charAt(0).toUpperCase()}${command.name.slice(1)}`;
1124
+ data = frame.payload;
1125
+ }
1126
+ }
1127
+ } else {
1128
+ type = "raw";
1129
+ data = payload.data;
1130
+ const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
1131
+ clusterName = Number.isNaN(Number(name)) ? name : Number(name);
1132
+ }
1133
+
1134
+ if (type && data) {
1135
+ const linkquality = payload.linkquality;
1136
+ const groupID = payload.groupID;
1137
+
1138
+ this.selfAndDeviceEmit(device, "message", {
1139
+ type,
1140
+ device,
1141
+ endpoint,
1142
+ data,
1143
+ linkquality,
1144
+ groupID,
1145
+ cluster: clusterName,
1146
+ meta,
1147
+ });
1148
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "messageEmitted"});
1149
+ } else {
1150
+ this.selfAndDeviceEmit(device, "lastSeenChanged", {device, reason: "messageNonEmitted"});
1151
+ }
1152
+
1153
+ if (frame) {
1154
+ await device.onZclData(payload, frame, endpoint);
1155
+ }
1156
+ }
1157
+ }
1158
+
1159
+ export default Controller;