@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,1235 @@
1
+ import assert from "node:assert";
2
+ import type {Events as AdapterEvents} from "../../adapter";
3
+ import {logger} from "../../utils/logger";
4
+ import * as ZSpec from "../../zspec";
5
+ import {BroadcastAddress} from "../../zspec/enums";
6
+ import type {Eui64} from "../../zspec/tstypes";
7
+ import * as Zcl from "../../zspec/zcl";
8
+ import type {TFoundation} from "../../zspec/zcl/definition/clusters-types";
9
+ import type * as ZclTypes from "../../zspec/zcl/definition/tstype";
10
+ import * as Zdo from "../../zspec/zdo";
11
+ import Request from "../helpers/request";
12
+ import RequestQueue from "../helpers/requestQueue";
13
+ import * as ZclFrameConverter from "../helpers/zclFrameConverter";
14
+ import zclTransactionSequenceNumber from "../helpers/zclTransactionSequenceNumber";
15
+ import type {
16
+ ClusterOrRawAttributeKeys,
17
+ ClusterOrRawAttributes,
18
+ ClusterOrRawPayload,
19
+ ClusterOrRawWriteAttributes,
20
+ FoundationOrRawPayload,
21
+ KeyValue,
22
+ PartialClusterOrRawWriteAttributes,
23
+ SendPolicy,
24
+ TCustomCluster,
25
+ } from "../tstype";
26
+ import Device from "./device";
27
+ import Entity from "./entity";
28
+ import Group from "./group";
29
+ import {ZigbeeEntity} from "./zigbeeEntity";
30
+
31
+ const NS = "zh:controller:endpoint";
32
+
33
+ export interface ConfigureReportingItem<Cl extends string | number, Custom extends TCustomCluster | undefined = undefined> {
34
+ attribute: ClusterOrRawAttributeKeys<Cl, Custom>[number] | {ID: number; type: number};
35
+ minimumReportInterval: number;
36
+ maximumReportInterval: number;
37
+ reportableChange?: number;
38
+ }
39
+
40
+ export interface ReadReportConfigItem<Cl extends string | number, Custom extends TCustomCluster | undefined = undefined> {
41
+ direction?: Zcl.Direction;
42
+ attribute: ClusterOrRawAttributeKeys<Cl, Custom>[number] | {ID: number};
43
+ }
44
+
45
+ interface Options {
46
+ manufacturerCode?: number;
47
+ disableDefaultResponse?: boolean;
48
+ disableResponse?: boolean;
49
+ timeout?: number;
50
+ direction?: Zcl.Direction;
51
+ srcEndpoint?: number;
52
+ profileId?: number;
53
+ reservedBits?: number;
54
+ transactionSequenceNumber?: number;
55
+ disableRecovery?: boolean;
56
+ writeUndiv?: boolean;
57
+ sendPolicy?: SendPolicy;
58
+ }
59
+
60
+ interface OptionsWithDefaults extends Options {
61
+ disableDefaultResponse: boolean;
62
+ disableResponse: boolean;
63
+ timeout: number;
64
+ direction: Zcl.Direction;
65
+ reservedBits: number;
66
+ disableRecovery: boolean;
67
+ writeUndiv: boolean;
68
+ }
69
+
70
+ interface Clusters {
71
+ [cluster: string]: {
72
+ attributes: {[attribute: string]: number | string};
73
+ };
74
+ }
75
+
76
+ export interface BindInternal {
77
+ cluster: number;
78
+ type: "endpoint" | "group";
79
+ deviceIeeeAddress?: string;
80
+ endpointID?: number;
81
+ groupID?: number;
82
+ }
83
+
84
+ interface Bind {
85
+ cluster: ZclTypes.Cluster;
86
+ target: Endpoint | Group;
87
+ }
88
+
89
+ interface ConfiguredReportingInternal {
90
+ cluster: number;
91
+ attrId: number;
92
+ minRepIntval: number;
93
+ maxRepIntval: number;
94
+ repChange: number;
95
+ manufacturerCode?: number | undefined;
96
+ }
97
+
98
+ interface ConfiguredReporting {
99
+ cluster: ZclTypes.Cluster;
100
+ attribute: ZclTypes.Attribute;
101
+ minimumReportInterval: number;
102
+ maximumReportInterval: number;
103
+ reportableChange: number;
104
+ }
105
+
106
+ export class Endpoint extends ZigbeeEntity {
107
+ private databaseID: number;
108
+ public deviceID?: number;
109
+ public inputClusters: number[];
110
+ public outputClusters: number[];
111
+ public profileID?: number;
112
+ // biome-ignore lint/style/useNamingConvention: cross-repo impact
113
+ public readonly ID: number;
114
+ public readonly clusters: Clusters;
115
+ public deviceIeeeAddress: string;
116
+ public deviceNetworkAddress: number;
117
+ private _binds: BindInternal[];
118
+ private _configuredReportings: ConfiguredReportingInternal[];
119
+ public meta: KeyValue;
120
+ private pendingRequests: RequestQueue;
121
+
122
+ // Getters/setters
123
+ get binds(): Bind[] {
124
+ const binds: Bind[] = [];
125
+
126
+ for (const bind of this._binds) {
127
+ // XXX: properties assumed valid when associated to `type`
128
+ const target: Group | Endpoint | undefined =
129
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
130
+ bind.type === "endpoint" ? Device.byIeeeAddr(this.databaseID, bind.deviceIeeeAddress!)?.getEndpoint(bind.endpointID!) : Group.byGroupID(bind.groupID!, this.databaseID);
131
+
132
+ if (target) {
133
+ binds.push({target, cluster: this.getCluster(bind.cluster)});
134
+ }
135
+ }
136
+
137
+ return binds;
138
+ }
139
+
140
+ get configuredReportings(): ConfiguredReporting[] {
141
+ const device = this.getDevice();
142
+
143
+ return this._configuredReportings.map((entry, index) => {
144
+ const cluster = Zcl.Utils.getCluster(entry.cluster, entry.manufacturerCode, device.customClusters);
145
+ const attribute: ZclTypes.Attribute = cluster.getAttribute(entry.attrId) ?? {
146
+ ID: entry.attrId,
147
+ name: `attr${index}`,
148
+ type: Zcl.DataType.UNKNOWN,
149
+ manufacturerCode: undefined,
150
+ };
151
+
152
+ return {
153
+ cluster,
154
+ attribute,
155
+ minimumReportInterval: entry.minRepIntval,
156
+ maximumReportInterval: entry.maxRepIntval,
157
+ reportableChange: entry.repChange,
158
+ };
159
+ });
160
+ }
161
+
162
+ private constructor(
163
+ databaseID: number,
164
+ id: number,
165
+ profileID: number | undefined,
166
+ deviceID: number | undefined,
167
+ inputClusters: number[],
168
+ outputClusters: number[],
169
+ deviceNetworkAddress: number,
170
+ deviceIeeeAddress: string,
171
+ clusters: Clusters,
172
+ binds: BindInternal[],
173
+ configuredReportings: ConfiguredReportingInternal[],
174
+ meta: KeyValue,
175
+ ) {
176
+ super();
177
+ this.databaseID = databaseID;
178
+ this.ID = id;
179
+ this.profileID = profileID;
180
+ this.deviceID = deviceID;
181
+ this.inputClusters = inputClusters;
182
+ this.outputClusters = outputClusters;
183
+ this.deviceNetworkAddress = deviceNetworkAddress;
184
+ this.deviceIeeeAddress = deviceIeeeAddress;
185
+ this.clusters = clusters;
186
+ this._binds = binds;
187
+ this._configuredReportings = configuredReportings;
188
+ this.meta = meta;
189
+ this.pendingRequests = new RequestQueue(this);
190
+ }
191
+
192
+ /**
193
+ * Get device of this endpoint
194
+ */
195
+ public getDevice(): Device {
196
+ const device = Device.byIeeeAddr(this.databaseID, this.deviceIeeeAddress);
197
+
198
+ if (!device) {
199
+ logger.error(`Tried to get unknown/deleted device ${this.deviceIeeeAddress} from endpoint ${this.ID}.`, NS);
200
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
201
+ logger.debug(new Error().stack!, NS);
202
+ }
203
+
204
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
205
+ return device!;
206
+ }
207
+
208
+ /**
209
+ * @param {number|string} clusterKey
210
+ * @returns {boolean}
211
+ */
212
+ public supportsInputCluster(clusterKey: number | string): boolean {
213
+ const cluster = this.getCluster(clusterKey);
214
+ return this.inputClusters.includes(cluster.ID);
215
+ }
216
+
217
+ /**
218
+ * @param {number|string} clusterKey
219
+ * @returns {boolean}
220
+ */
221
+ public supportsOutputCluster(clusterKey: number | string): boolean {
222
+ const cluster = this.getCluster(clusterKey);
223
+ return this.outputClusters.includes(cluster.ID);
224
+ }
225
+
226
+ /**
227
+ * @returns {ZclTypes.Cluster[]}
228
+ */
229
+ public getInputClusters(): ZclTypes.Cluster[] {
230
+ return this.clusterNumbersToClusters(this.inputClusters);
231
+ }
232
+
233
+ /**
234
+ * @returns {ZclTypes.Cluster[]}
235
+ */
236
+ public getOutputClusters(): ZclTypes.Cluster[] {
237
+ return this.clusterNumbersToClusters(this.outputClusters);
238
+ }
239
+
240
+ private clusterNumbersToClusters(clusterNumbers: number[]): ZclTypes.Cluster[] {
241
+ return clusterNumbers.map((c) => this.getCluster(c));
242
+ }
243
+
244
+ /*
245
+ * CRUD
246
+ */
247
+
248
+ public static fromDatabaseRecord(record: KeyValue, deviceNetworkAddress: number, deviceIeeeAddress: string, databaseID: number): Endpoint {
249
+ // Migrate attrs to attributes
250
+ for (const entryKey in record.clusters) {
251
+ const entry = record.clusters[entryKey];
252
+
253
+ if (entry.attrs != null) {
254
+ entry.attributes = entry.attrs;
255
+ delete entry.attrs;
256
+ }
257
+ }
258
+
259
+ // Migrate cluster renames from https://github.com/Koenkk/zigbee-herdsman/pull/1503 @deprecated 3.0
260
+ /* v8 ignore start */
261
+ if (record.clusters.piRetailTunnel) {
262
+ record.clusters.retailTunnel = record.clusters.piRetailTunnel;
263
+ delete record.clusters.piRetailTunnel;
264
+ }
265
+ if (record.clusters.tunneling) {
266
+ record.clusters.seTunneling = record.clusters.tunneling;
267
+ delete record.clusters.tunneling;
268
+ }
269
+ if (record.clusters.haMeterIdentification) {
270
+ record.clusters.seMeterIdentification = record.clusters.haMeterIdentification;
271
+ delete record.clusters.haMeterIdentification;
272
+ }
273
+ /* v8 ignore stop */
274
+
275
+ return new Endpoint(
276
+ databaseID,
277
+ record.epId,
278
+ record.profId,
279
+ record.devId,
280
+ record.inClusterList,
281
+ record.outClusterList,
282
+ deviceNetworkAddress,
283
+ deviceIeeeAddress,
284
+ record.clusters,
285
+ record.binds || [],
286
+ record.configuredReportings || [],
287
+ record.meta || {},
288
+ );
289
+ }
290
+
291
+ public toDatabaseRecord(): KeyValue {
292
+ return {
293
+ profId: this.profileID,
294
+ epId: this.ID,
295
+ devId: this.deviceID,
296
+ inClusterList: this.inputClusters,
297
+ outClusterList: this.outputClusters,
298
+ clusters: this.clusters,
299
+ binds: this._binds,
300
+ configuredReportings: this._configuredReportings,
301
+ meta: this.meta,
302
+ };
303
+ }
304
+
305
+ public static create(
306
+ databaseID: number,
307
+ id: number,
308
+ profileID: number | undefined,
309
+ deviceID: number | undefined,
310
+ inputClusters: number[],
311
+ outputClusters: number[],
312
+ deviceNetworkAddress: number,
313
+ deviceIeeeAddress: string,
314
+ ): Endpoint {
315
+ return new Endpoint(databaseID, id, profileID, deviceID, inputClusters, outputClusters, deviceNetworkAddress, deviceIeeeAddress, {}, [], [], {});
316
+ }
317
+
318
+ public saveClusterAttributeKeyValue(clusterKey: number | string, list: KeyValue): void {
319
+ const cluster = this.getCluster(clusterKey);
320
+
321
+ if (!this.clusters[cluster.name]) {
322
+ this.clusters[cluster.name] = {attributes: {}};
323
+ }
324
+
325
+ for (const attribute in list) {
326
+ this.clusters[cluster.name].attributes[attribute] = list[attribute];
327
+ }
328
+ }
329
+
330
+ public getClusterAttributeValue(clusterKey: number | string, attributeKey: number | string): number | string | undefined {
331
+ const cluster = this.getCluster(clusterKey);
332
+
333
+ if (this.clusters[cluster.name] && this.clusters[cluster.name].attributes) {
334
+ // XXX: used to throw (behavior changed in #1455)
335
+ const attribute = cluster.getAttribute(attributeKey);
336
+
337
+ if (attribute) {
338
+ return this.clusters[cluster.name].attributes[attribute.name];
339
+ }
340
+ }
341
+
342
+ return undefined;
343
+ }
344
+
345
+ public saveClusterAttributeReportConfig(
346
+ clusterId: number,
347
+ manufacturerCode: Zcl.ManufacturerCode | undefined,
348
+ reportConfigs: TFoundation["readReportConfigRsp"],
349
+ ): void {
350
+ for (const entry of reportConfigs) {
351
+ if (entry.direction === Zcl.Direction.SERVER_TO_CLIENT) {
352
+ continue;
353
+ }
354
+
355
+ const existingConfigIdx = this._configuredReportings.findIndex(
356
+ (r) =>
357
+ r.cluster === clusterId &&
358
+ r.attrId === entry.attrId &&
359
+ (manufacturerCode === undefined || manufacturerCode === r.manufacturerCode),
360
+ );
361
+
362
+ if (entry.status === Zcl.Status.SUCCESS) {
363
+ if (existingConfigIdx > -1) {
364
+ this._configuredReportings[existingConfigIdx].minRepIntval = entry.minRepIntval as number;
365
+ this._configuredReportings[existingConfigIdx].maxRepIntval = entry.maxRepIntval as number;
366
+ this._configuredReportings[existingConfigIdx].repChange = entry.repChange as number;
367
+ } else {
368
+ this._configuredReportings.push({
369
+ cluster: clusterId,
370
+ attrId: entry.attrId,
371
+ minRepIntval: entry.minRepIntval as number,
372
+ maxRepIntval: entry.maxRepIntval as number,
373
+ repChange: entry.repChange as number,
374
+ manufacturerCode,
375
+ });
376
+ }
377
+ } else {
378
+ // UNSUPPORTED_ATTRIBUTE, UNREPORTABLE_ATTRIBUTE, NOT_FOUND
379
+ if (existingConfigIdx > -1) {
380
+ this._configuredReportings.splice(existingConfigIdx, 1);
381
+ }
382
+ }
383
+ }
384
+
385
+ this.save();
386
+ }
387
+
388
+ public saveBindings(binds: BindInternal[]): void {
389
+ this._binds = binds;
390
+
391
+ this.save();
392
+ }
393
+
394
+ public clearBindings(): void {
395
+ this._binds.length = 0;
396
+
397
+ this.save();
398
+ }
399
+
400
+ public hasPendingRequests(): boolean {
401
+ return this.pendingRequests.size > 0;
402
+ }
403
+
404
+ public async sendPendingRequests(fastPolling: boolean): Promise<void> {
405
+ return await this.pendingRequests.send(fastPolling);
406
+ }
407
+
408
+ private async sendRequest(frame: Zcl.Frame, options: OptionsWithDefaults): Promise<AdapterEvents.ZclPayload>;
409
+ private async sendRequest<Type>(frame: Zcl.Frame, options: OptionsWithDefaults, func: () => Promise<Type>): Promise<Type>;
410
+ private async sendRequest<Type>(
411
+ frame: Zcl.Frame,
412
+ options: OptionsWithDefaults,
413
+ func: () => Promise<Type> = (): Promise<Type> => {
414
+ return Entity.getAdapterByID(this.databaseID)?.sendZclFrameToEndpoint(
415
+ this.deviceIeeeAddress,
416
+ this.deviceNetworkAddress,
417
+ this.ID,
418
+ frame,
419
+ options.timeout,
420
+ options.disableResponse,
421
+ options.disableRecovery,
422
+ options.srcEndpoint,
423
+ options.profileId,
424
+ ) as Promise<Type>;
425
+ },
426
+ ): Promise<Type> {
427
+ const logPrefix = `Request Queue (${this.deviceIeeeAddress}/${this.ID}): `;
428
+ const device = this.getDevice();
429
+ const request = new Request(func, frame, device.pendingRequestTimeout, options.sendPolicy);
430
+
431
+ if (request.sendPolicy !== "bulk") {
432
+ // Check if such a request is already in the queue and remove the old one(s) if necessary
433
+ this.pendingRequests.filter(request);
434
+ }
435
+
436
+ // send without queueing if sendPolicy is 'immediate' or if the device has no timeout set
437
+ if (request.sendPolicy === "immediate" || !device.pendingRequestTimeout) {
438
+ if (device.pendingRequestTimeout > 0) {
439
+ logger.debug(`${logPrefix}send ${frame.command.name} request immediately (sendPolicy=${options.sendPolicy})`, NS);
440
+ }
441
+ return await request.send();
442
+ }
443
+ // If this is a bulk message, we queue directly.
444
+ if (request.sendPolicy === "bulk") {
445
+ logger.debug(`${logPrefix}queue request (${this.pendingRequests.size})`, NS);
446
+ return await this.pendingRequests.queue(request);
447
+ }
448
+
449
+ try {
450
+ logger.debug(`${logPrefix}send request`, NS);
451
+ return await request.send();
452
+ } catch (error) {
453
+ // If we got a failed transaction, the device is likely sleeping.
454
+ // Queue for transmission later.
455
+ logger.debug(`${logPrefix}queue request (transaction failed) (${error})`, NS);
456
+ return await this.pendingRequests.queue(request);
457
+ }
458
+ }
459
+
460
+ /*
461
+ * Zigbee functions
462
+ */
463
+ private checkStatus(payload: [{status: Zcl.Status}] | {cmdId: number; statusCode: number}): void {
464
+ const codes = Array.isArray(payload) ? payload.map((i) => i.status) : [payload.statusCode];
465
+ const invalid = codes.find((c) => c !== Zcl.Status.SUCCESS);
466
+ if (invalid) throw new Zcl.StatusError(invalid);
467
+ }
468
+
469
+ public async report<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
470
+ clusterKey: Cl,
471
+ attributes: PartialClusterOrRawWriteAttributes<Cl, Custom>,
472
+ options?: Options,
473
+ ): Promise<void> {
474
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
475
+ const payload: TFoundation["report"] = [];
476
+
477
+ // TODO: handle `attr.report !== true`
478
+
479
+ for (const nameOrID in attributes) {
480
+ const attribute = cluster.getAttribute(nameOrID);
481
+
482
+ if (attribute) {
483
+ payload.push({attrId: attribute.ID, attrData: attributes[nameOrID], dataType: attribute.type});
484
+ } else if (!Number.isNaN(Number(nameOrID))) {
485
+ const value = attributes[nameOrID];
486
+
487
+ payload.push({attrId: Number(nameOrID), attrData: value.value, dataType: value.type});
488
+ } else {
489
+ throw new Error(`Unknown attribute '${nameOrID}', specify either an existing attribute or a number`);
490
+ }
491
+ }
492
+
493
+ await this.zclCommand(cluster, "report", payload, options, attributes);
494
+ }
495
+
496
+ public async write<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
497
+ clusterKey: Cl,
498
+ attributes: PartialClusterOrRawWriteAttributes<Cl, Custom>,
499
+ options?: Options,
500
+ ): Promise<void> {
501
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
502
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
503
+ optionsWithDefaults.manufacturerCode = this.ensureManufacturerCodeIsUniqueAndGet<Cl, Custom>(
504
+ cluster,
505
+ Object.keys(attributes),
506
+ optionsWithDefaults.manufacturerCode,
507
+ "write",
508
+ );
509
+ const payload: TFoundation["write"] = [];
510
+
511
+ for (const nameOrID in attributes) {
512
+ const attribute = cluster.getAttribute(nameOrID);
513
+
514
+ if (attribute) {
515
+ // TODO: handle `attr.writeOptional !== true`
516
+ const attrData = Zcl.Utils.processAttributeWrite(attribute, attributes[nameOrID]);
517
+
518
+ payload.push({attrId: attribute.ID, attrData, dataType: attribute.type});
519
+ } else if (!Number.isNaN(Number(nameOrID))) {
520
+ const value = attributes[nameOrID];
521
+
522
+ payload.push({attrId: Number(nameOrID), attrData: value.value, dataType: value.type});
523
+ } else {
524
+ throw new Error(`Unknown attribute '${nameOrID}', specify either an existing attribute or a number`);
525
+ }
526
+ }
527
+
528
+ await this.zclCommand(cluster, optionsWithDefaults.writeUndiv ? "writeUndiv" : "write", payload, optionsWithDefaults, attributes, true);
529
+ }
530
+
531
+ public async writeResponse<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
532
+ clusterKey: Cl,
533
+ transactionSequenceNumber: number,
534
+ attributes: Partial<Record<ClusterOrRawAttributeKeys<Cl, Custom>[number], TFoundation["writeRsp"][number]>> &
535
+ Record<number, TFoundation["writeRsp"][number]>,
536
+ options?: Options,
537
+ ): Promise<void> {
538
+ assert(options?.transactionSequenceNumber === undefined, "Use parameter");
539
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
540
+ const payload: TFoundation["writeRsp"] = [];
541
+
542
+ for (const nameOrID in attributes) {
543
+ // biome-ignore lint/style/noNonNullAssertion: from loop
544
+ const value = attributes[nameOrID]!;
545
+
546
+ if (value.status !== undefined) {
547
+ const attribute = cluster.getAttribute(nameOrID);
548
+
549
+ if (attribute) {
550
+ payload.push({attrId: attribute.ID, status: value.status});
551
+ } else if (!Number.isNaN(Number(nameOrID))) {
552
+ payload.push({attrId: Number(nameOrID), status: value.status});
553
+ } else {
554
+ throw new Error(`Unknown attribute '${nameOrID}', specify either an existing attribute or a number`);
555
+ }
556
+ } else {
557
+ throw new Error(`Missing attribute 'status'`);
558
+ }
559
+ }
560
+
561
+ await this.zclCommand(
562
+ cluster,
563
+ "writeRsp",
564
+ payload,
565
+ {direction: Zcl.Direction.SERVER_TO_CLIENT, ...options, transactionSequenceNumber},
566
+ attributes,
567
+ );
568
+ }
569
+
570
+ // XXX: ideally, the return type should limit to the contents of the `attributes` param
571
+ public async read<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
572
+ clusterKey: Cl,
573
+ attributes: ClusterOrRawAttributeKeys<Cl, Custom>,
574
+ options?: Options,
575
+ ): Promise<ClusterOrRawAttributes<Cl, Custom>> {
576
+ const device = this.getDevice();
577
+ const cluster = this.getCluster(clusterKey, device, options?.manufacturerCode);
578
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
579
+ optionsWithDefaults.manufacturerCode = this.ensureManufacturerCodeIsUniqueAndGet<Cl, Custom>(
580
+ cluster,
581
+ attributes,
582
+ optionsWithDefaults.manufacturerCode,
583
+ "read",
584
+ );
585
+ const payload: TFoundation["read"] = [];
586
+
587
+ // TODO: handle `attr.required !== true` => should not throw
588
+
589
+ for (const attribute of attributes) {
590
+ if (typeof attribute === "number") {
591
+ payload.push({attrId: attribute});
592
+ } else {
593
+ const attr = cluster.getAttribute(attribute);
594
+
595
+ if (attr) {
596
+ Zcl.Utils.processAttributePreRead(attr);
597
+ payload.push({attrId: attr.ID});
598
+ } else {
599
+ logger.warning(`Ignoring unknown attribute ${attribute} in cluster ${cluster.name}`, NS);
600
+ }
601
+ }
602
+ }
603
+
604
+ // TODO: could be sending empty array payload
605
+ const resultFrame = await this.zclCommand(cluster, "read", payload, optionsWithDefaults, attributes, true);
606
+
607
+ return resultFrame
608
+ ? ZclFrameConverter.attributeKeyValue<Cl, Custom>(resultFrame, device.manufacturerID, device.customClusters)
609
+ : ({} as ClusterOrRawWriteAttributes<Cl, Custom>);
610
+ }
611
+
612
+ public async readResponse<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
613
+ clusterKey: Cl,
614
+ transactionSequenceNumber: number,
615
+ attributes: PartialClusterOrRawWriteAttributes<Cl, Custom>,
616
+ options?: Options,
617
+ ): Promise<void> {
618
+ assert(options?.transactionSequenceNumber === undefined, "Use parameter");
619
+
620
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
621
+ const payload: TFoundation["readRsp"] = [];
622
+
623
+ for (const nameOrID in attributes) {
624
+ const attribute = cluster.getAttribute(nameOrID);
625
+
626
+ if (attribute) {
627
+ payload.push({attrId: attribute.ID, attrData: attributes[nameOrID], dataType: attribute.type, status: 0});
628
+ } else if (!Number.isNaN(Number(nameOrID))) {
629
+ const value = attributes[nameOrID];
630
+
631
+ payload.push({attrId: Number(nameOrID), attrData: value.value, dataType: value.type, status: 0});
632
+ } else {
633
+ throw new Error(`Unknown attribute '${nameOrID}', specify either an existing attribute or a number`);
634
+ }
635
+ }
636
+
637
+ await this.zclCommand(
638
+ cluster,
639
+ "readRsp",
640
+ payload,
641
+ {direction: Zcl.Direction.SERVER_TO_CLIENT, ...options, transactionSequenceNumber},
642
+ attributes,
643
+ );
644
+ }
645
+
646
+ public async updateSimpleDescriptor(): Promise<void> {
647
+ const clusterId = Zdo.ClusterId.SIMPLE_DESCRIPTOR_REQUEST;
648
+ const adapter = Entity.getAdapterByID(this.databaseID);
649
+ if (!adapter) {
650
+ throw new Error(`No adapter found for database ID ${this.databaseID}`);
651
+ }
652
+ const zdoPayload = Zdo.Buffalo.buildRequest(adapter.hasZdoMessageOverhead ?? false, clusterId, this.deviceNetworkAddress, this.ID);
653
+ const response = await adapter.sendZdo(this.deviceIeeeAddress, this.deviceNetworkAddress, clusterId, zdoPayload, false);
654
+
655
+ if (!Zdo.Buffalo.checkStatus<Zdo.ClusterId.SIMPLE_DESCRIPTOR_RESPONSE>(response)) {
656
+ throw new Zdo.StatusError(response[0]);
657
+ }
658
+
659
+ const simpleDescriptor = response[1];
660
+
661
+ this.profileID = simpleDescriptor.profileId;
662
+ this.deviceID = simpleDescriptor.deviceId;
663
+ this.inputClusters = simpleDescriptor.inClusterList;
664
+ this.outputClusters = simpleDescriptor.outClusterList;
665
+ }
666
+
667
+ public hasBind(clusterId: number, target: Endpoint | Group): boolean {
668
+ return this.getBindIndex(clusterId, target) !== -1;
669
+ }
670
+
671
+ public getBindIndex(clusterId: number, target: Endpoint | Group): number {
672
+ return this.binds.findIndex((b) => b.cluster.ID === clusterId && b.target === target);
673
+ }
674
+
675
+ public addBinding(clusterKey: number | string, target: Endpoint | Group | number): void {
676
+ const cluster = this.getCluster(clusterKey);
677
+
678
+ if (typeof target === "number") {
679
+ target = Group.byGroupID(target, this.databaseID) || Group.create(target, this.databaseID);
680
+ }
681
+
682
+ this.addBindingInternal(cluster, target);
683
+ }
684
+
685
+ private addBindingInternal(cluster: ZclTypes.Cluster, target: Endpoint | Group): void {
686
+ if (!this.hasBind(cluster.ID, target)) {
687
+ if (target instanceof Group) {
688
+ this._binds.push({cluster: cluster.ID, groupID: target.groupID, type: "group"});
689
+ } else {
690
+ this._binds.push({
691
+ cluster: cluster.ID,
692
+ type: "endpoint",
693
+ deviceIeeeAddress: target.deviceIeeeAddress,
694
+ endpointID: target.ID,
695
+ });
696
+ }
697
+
698
+ this.save();
699
+ }
700
+ }
701
+
702
+ public async bind(clusterKey: number | string, target: Endpoint | Group | number): Promise<void> {
703
+ const cluster = this.getCluster(clusterKey);
704
+
705
+ if (typeof target === "number") {
706
+ target = Group.byGroupID(target, this.databaseID) || Group.create(target, this.databaseID);
707
+ }
708
+
709
+ const destinationAddress = target instanceof Endpoint ? target.deviceIeeeAddress : target.groupID;
710
+
711
+ const log = `Bind ${this.deviceIeeeAddress}/${this.ID} ${cluster.name} from '${target instanceof Endpoint ? `${destinationAddress}/${target.ID}` : destinationAddress}'`;
712
+ logger.debug(log, NS);
713
+
714
+ try {
715
+ const zdoClusterId = Zdo.ClusterId.BIND_REQUEST;
716
+ const zdoPayload = Zdo.Buffalo.buildRequest(
717
+ Entity.getAdapterByID(this.databaseID)?.hasZdoMessageOverhead ?? false,
718
+ zdoClusterId,
719
+ this.deviceIeeeAddress as Eui64,
720
+ this.ID,
721
+ cluster.ID,
722
+ target instanceof Endpoint ? Zdo.UNICAST_BINDING : Zdo.MULTICAST_BINDING,
723
+ target instanceof Endpoint ? (target.deviceIeeeAddress as Eui64) : ZSpec.BLANK_EUI64,
724
+ target instanceof Group ? target.groupID : 0,
725
+ target instanceof Endpoint ? target.ID : 0xff,
726
+ );
727
+ const adapter = Entity.getAdapterByID(this.databaseID);
728
+ if (!adapter) {
729
+ throw new Error(`No adapter found for database ID ${this.databaseID}`);
730
+ }
731
+ const response = await adapter.sendZdo(this.deviceIeeeAddress, this.deviceNetworkAddress, zdoClusterId, zdoPayload, false);
732
+
733
+ if (!Zdo.Buffalo.checkStatus<Zdo.ClusterId.BIND_RESPONSE>(response)) {
734
+ throw new Zdo.StatusError(response[0]);
735
+ }
736
+
737
+ this.addBindingInternal(cluster, target);
738
+ } catch (error) {
739
+ const err = error as Error;
740
+ err.message = `${log} failed (${err.message})`;
741
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
742
+ logger.debug(err.stack!, NS);
743
+ throw error;
744
+ }
745
+ }
746
+
747
+ public save(): void {
748
+ this.getDevice().save();
749
+ }
750
+
751
+ public async unbind(clusterKey: number | string, target: Endpoint | Group | number, force = false): Promise<void> {
752
+ // When force is true the unbind is done even when the bind is not in the bind list, additionally when the target is a number
753
+ // it will not check if the group exists.
754
+ const cluster = this.getCluster(clusterKey);
755
+ const action = `Unbind ${this.deviceIeeeAddress}/${this.ID} ${cluster.name}`;
756
+
757
+ if (typeof target === "number") {
758
+ const groupTarget = Group.byGroupID(target, this.databaseID);
759
+ if (groupTarget) {
760
+ target = groupTarget;
761
+ } else if (!force) {
762
+ throw new Error(`${action} invalid target '${target}' (no group with this ID exists).`);
763
+ }
764
+ }
765
+
766
+ const destinationAddress = target instanceof Endpoint ? target.deviceIeeeAddress : target instanceof Group ? target.groupID : target;
767
+ const log = `${action} from '${target instanceof Endpoint ? `${destinationAddress}/${target.ID}` : destinationAddress}'`;
768
+ const index = target instanceof Endpoint || target instanceof Group ? this.getBindIndex(cluster.ID, target) : -1;
769
+
770
+ if (index === -1 && !force) {
771
+ logger.debug(`${log} no bind present, skipping.`, NS);
772
+ return;
773
+ }
774
+
775
+ logger.debug(log, NS);
776
+
777
+ try {
778
+ const zdoClusterId = Zdo.ClusterId.UNBIND_REQUEST;
779
+ const adapter = Entity.getAdapterByID(this.databaseID);
780
+ if (!adapter) {
781
+ throw new Error(`No adapter found for database ID ${this.databaseID}`);
782
+ }
783
+ const zdoPayload = Zdo.Buffalo.buildRequest(
784
+ adapter.hasZdoMessageOverhead,
785
+ zdoClusterId,
786
+ this.deviceIeeeAddress as Eui64,
787
+ this.ID,
788
+ cluster.ID,
789
+ target instanceof Endpoint ? Zdo.UNICAST_BINDING : Zdo.MULTICAST_BINDING,
790
+ target instanceof Endpoint ? (target.deviceIeeeAddress as Eui64) : ZSpec.BLANK_EUI64,
791
+ target instanceof Group ? target.groupID : typeof target === "number" ? target : 0,
792
+ target instanceof Endpoint ? target.ID : 0xff,
793
+ );
794
+
795
+ const response = await adapter.sendZdo(this.deviceIeeeAddress, this.deviceNetworkAddress, zdoClusterId, zdoPayload, false);
796
+
797
+ if (!Zdo.Buffalo.checkStatus<Zdo.ClusterId.UNBIND_RESPONSE>(response)) {
798
+ if (response[0] === Zdo.Status.NO_ENTRY) {
799
+ logger.debug(`${log} no entry on device, removing entry from database.`, NS);
800
+ } else {
801
+ throw new Zdo.StatusError(response[0]);
802
+ }
803
+ }
804
+
805
+ if (index !== -1) {
806
+ this._binds.splice(index, 1);
807
+ this.save();
808
+ }
809
+ } catch (error) {
810
+ const err = error as Error;
811
+ err.message = `${log} failed (${err.message})`;
812
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
813
+ logger.debug(err.stack!, NS);
814
+ throw error;
815
+ }
816
+ }
817
+
818
+ public async defaultResponse(
819
+ commandID: number,
820
+ status: number,
821
+ clusterID: number,
822
+ transactionSequenceNumber: number,
823
+ options?: Options,
824
+ ): Promise<void> {
825
+ assert(options?.transactionSequenceNumber === undefined, "Use parameter");
826
+ const payload = {cmdId: commandID, statusCode: status};
827
+ await this.zclCommand(clusterID, "defaultRsp", payload, {direction: Zcl.Direction.SERVER_TO_CLIENT, ...options, transactionSequenceNumber});
828
+ }
829
+
830
+ public async configureReporting<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
831
+ clusterKey: Cl,
832
+ items: ConfigureReportingItem<Cl, Custom>[],
833
+ options?: Options,
834
+ ): Promise<void> {
835
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
836
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
837
+ optionsWithDefaults.manufacturerCode = this.ensureManufacturerCodeIsUniqueAndGet<Cl, Custom>(
838
+ cluster,
839
+ items,
840
+ optionsWithDefaults.manufacturerCode,
841
+ "configureReporting",
842
+ );
843
+
844
+ const payload = items.map((item): TFoundation["configReport"][number] => {
845
+ let dataType: number;
846
+ let attrId: number;
847
+
848
+ if (typeof item.attribute === "object") {
849
+ dataType = item.attribute.type;
850
+ attrId = item.attribute.ID;
851
+ } else {
852
+ const attribute = cluster.getAttribute(item.attribute);
853
+
854
+ if (attribute) {
855
+ dataType = attribute.type;
856
+ attrId = attribute.ID;
857
+ } else {
858
+ throw new Error(`Invalid attribute '${item.attribute}' for cluster '${clusterKey}'`);
859
+ }
860
+ }
861
+
862
+ return {
863
+ direction: Zcl.Direction.CLIENT_TO_SERVER,
864
+ attrId,
865
+ dataType,
866
+ minRepIntval: item.minimumReportInterval,
867
+ maxRepIntval: item.maximumReportInterval,
868
+ repChange: item.reportableChange,
869
+ };
870
+ });
871
+
872
+ await this.zclCommand(cluster, "configReport", payload, optionsWithDefaults, items, true);
873
+
874
+ for (const e of payload) {
875
+ this._configuredReportings = this._configuredReportings.filter(
876
+ (c) =>
877
+ !(
878
+ c.attrId === e.attrId &&
879
+ c.cluster === cluster.ID &&
880
+ (!("manufacturerCode" in c) || c.manufacturerCode === optionsWithDefaults.manufacturerCode)
881
+ ),
882
+ );
883
+ }
884
+
885
+ for (const entry of payload) {
886
+ if (entry.maxRepIntval !== 0xffff) {
887
+ this._configuredReportings.push({
888
+ cluster: cluster.ID,
889
+ attrId: entry.attrId,
890
+ minRepIntval: entry.minRepIntval as number,
891
+ maxRepIntval: entry.maxRepIntval as number,
892
+ // expects items[].attribute to always point to a number DataType
893
+ repChange: entry.repChange as number,
894
+ manufacturerCode: optionsWithDefaults.manufacturerCode,
895
+ });
896
+ }
897
+ }
898
+
899
+ this.save();
900
+ }
901
+
902
+ public async readReportingConfig<Cl extends number | string, Custom extends TCustomCluster | undefined = undefined>(
903
+ clusterKey: Cl,
904
+ items: ReadReportConfigItem<Cl, Custom>[],
905
+ options?: Options,
906
+ ): Promise<TFoundation["readReportConfigRsp"]> {
907
+ const cluster = this.getCluster(clusterKey, undefined, options?.manufacturerCode);
908
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
909
+ optionsWithDefaults.manufacturerCode = this.ensureManufacturerCodeIsUniqueAndGet<Cl, Custom>(
910
+ cluster,
911
+ items,
912
+ optionsWithDefaults.manufacturerCode,
913
+ "readReportingConfig",
914
+ );
915
+
916
+ const payload: TFoundation["readReportConfig"] = [];
917
+
918
+ for (const item of items) {
919
+ if (typeof item.attribute === "object") {
920
+ payload.push({direction: item.direction ?? Zcl.Direction.CLIENT_TO_SERVER, attrId: item.attribute.ID});
921
+ } else {
922
+ const attribute = cluster.getAttribute(item.attribute);
923
+
924
+ if (attribute) {
925
+ payload.push({direction: item.direction ?? Zcl.Direction.CLIENT_TO_SERVER, attrId: attribute.ID});
926
+ } else {
927
+ logger.warning(`Ignoring unknown attribute ${item.attribute} in cluster ${cluster.name}`, NS);
928
+ }
929
+ }
930
+ }
931
+
932
+ // TODO: could be sending empty array payload
933
+ // don't check status otherwise whole command fails (we want to cherry-pick here)
934
+ const response = await this.zclCommand(cluster, "readReportConfig", payload, optionsWithDefaults, items, false);
935
+
936
+ if (response) {
937
+ this.saveClusterAttributeReportConfig(response.cluster.ID, optionsWithDefaults.manufacturerCode, response.payload);
938
+
939
+ return response.payload;
940
+ }
941
+
942
+ throw new Error("No response received");
943
+ }
944
+
945
+ public async writeStructured<Cl extends number | string>(
946
+ clusterKey: Cl,
947
+ payload: TFoundation["writeStructured"],
948
+ options?: Options,
949
+ ): Promise<void> {
950
+ await this.zclCommand(clusterKey, "writeStructured", payload, options);
951
+ // TODO: support `writeStructuredResponse`
952
+ }
953
+
954
+ public async command<Cl extends number | string, Co extends number | string, Custom extends TCustomCluster | undefined = undefined>(
955
+ clusterKey: Cl,
956
+ commandKey: Co,
957
+ payload: ClusterOrRawPayload<Cl, Co, Custom>,
958
+ options?: Options,
959
+ ): Promise<undefined | KeyValue> {
960
+ const frame = await this.zclCommand(clusterKey, commandKey, payload, options, undefined, false, Zcl.FrameType.SPECIFIC);
961
+ if (frame) {
962
+ return frame.payload;
963
+ }
964
+ }
965
+
966
+ public async commandResponse<Cl extends number | string, Co extends number | string, Custom extends TCustomCluster | undefined = undefined>(
967
+ clusterKey: Cl,
968
+ commandKey: Co,
969
+ payload: ClusterOrRawPayload<Cl, Co, Custom>,
970
+ options?: Options,
971
+ transactionSequenceNumber?: number,
972
+ ): Promise<void> {
973
+ assert(options?.transactionSequenceNumber === undefined, "Use parameter");
974
+
975
+ const device = this.getDevice();
976
+ const cluster = this.getCluster(clusterKey, device, options?.manufacturerCode);
977
+ const command = cluster.getCommandResponse(commandKey);
978
+ transactionSequenceNumber = transactionSequenceNumber ?? zclTransactionSequenceNumber.next();
979
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.SERVER_TO_CLIENT, cluster.manufacturerCode);
980
+
981
+ const frame = Zcl.Frame.create(
982
+ Zcl.FrameType.SPECIFIC,
983
+ optionsWithDefaults.direction,
984
+ optionsWithDefaults.disableDefaultResponse,
985
+ optionsWithDefaults.manufacturerCode,
986
+ transactionSequenceNumber,
987
+ command,
988
+ cluster,
989
+ payload,
990
+ device.customClusters,
991
+ optionsWithDefaults.reservedBits,
992
+ );
993
+
994
+ const createLogMessage = (): string =>
995
+ `CommandResponse ${this.deviceIeeeAddress}/${this.ID} ` +
996
+ `${cluster.name}.${command.name}(${JSON.stringify(payload)}, ${JSON.stringify(optionsWithDefaults)})`;
997
+ logger.debug(createLogMessage, NS);
998
+
999
+ try {
1000
+ // Broadcast Green Power responses
1001
+ if (this.ID === 242) {
1002
+ await this.sendRequest(frame, optionsWithDefaults, async () => {
1003
+ await Entity.getAdapterByID(this.databaseID)?.sendZclFrameToAll(242, frame, 242, BroadcastAddress.RX_ON_WHEN_IDLE);
1004
+ });
1005
+ } else {
1006
+ await this.sendRequest(frame, optionsWithDefaults);
1007
+ }
1008
+ } catch (error) {
1009
+ const err = error as Error;
1010
+ err.message = `${createLogMessage()} failed (${err.message})`;
1011
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
1012
+ logger.debug(err.stack!, NS);
1013
+ throw error;
1014
+ }
1015
+ }
1016
+
1017
+ private getOptionsWithDefaults(
1018
+ options: Options | undefined,
1019
+ disableDefaultResponse: boolean,
1020
+ direction: Zcl.Direction,
1021
+ manufacturerCode: number | undefined,
1022
+ ): OptionsWithDefaults {
1023
+ return {
1024
+ timeout: 10000,
1025
+ disableResponse: false,
1026
+ disableRecovery: false,
1027
+ disableDefaultResponse,
1028
+ direction,
1029
+ srcEndpoint: undefined,
1030
+ reservedBits: 0,
1031
+ manufacturerCode,
1032
+ transactionSequenceNumber: undefined,
1033
+ writeUndiv: false,
1034
+ ...(options || {}),
1035
+ };
1036
+ }
1037
+
1038
+ private ensureManufacturerCodeIsUniqueAndGet<Cl extends string | number, Custom extends TCustomCluster | undefined = undefined>(
1039
+ cluster: ZclTypes.Cluster,
1040
+ attributes: (string | number)[] | ConfigureReportingItem<Cl, Custom>[] | ReadReportConfigItem<Cl, Custom>[],
1041
+ fallbackManufacturerCode: number | undefined, // XXX: problematic undefined for a "fallback"?
1042
+ caller: string,
1043
+ ): number | undefined {
1044
+ let firstManufacturerCode: number | undefined;
1045
+ let codeSet = false;
1046
+
1047
+ for (const nameOrID of attributes) {
1048
+ let attributeID: number | string;
1049
+
1050
+ if (typeof nameOrID === "object") {
1051
+ // ConfigureReportingItem
1052
+ if (typeof nameOrID.attribute !== "object") {
1053
+ attributeID = nameOrID.attribute;
1054
+ } else {
1055
+ if (!codeSet) {
1056
+ firstManufacturerCode = fallbackManufacturerCode;
1057
+ codeSet = true;
1058
+ } else if (firstManufacturerCode !== fallbackManufacturerCode) {
1059
+ throw new Error(`Cannot have attributes with different manufacturerCode in single '${caller}' call`);
1060
+ }
1061
+
1062
+ continue;
1063
+ }
1064
+ } else {
1065
+ // string || number
1066
+ attributeID = nameOrID;
1067
+ }
1068
+
1069
+ // we fall back to caller|cluster provided manufacturerCode
1070
+ const attribute = cluster.getAttribute(attributeID);
1071
+ const manufacturerCode = attribute
1072
+ ? attribute.manufacturerCode === undefined
1073
+ ? fallbackManufacturerCode
1074
+ : attribute.manufacturerCode
1075
+ : fallbackManufacturerCode;
1076
+
1077
+ if (!codeSet) {
1078
+ firstManufacturerCode = manufacturerCode;
1079
+ codeSet = true;
1080
+ } else if (firstManufacturerCode !== manufacturerCode) {
1081
+ throw new Error(`Cannot have attributes with different manufacturerCode in single '${caller}' call`);
1082
+ }
1083
+ }
1084
+
1085
+ return firstManufacturerCode;
1086
+ }
1087
+
1088
+ public async addToGroup(group: Group): Promise<void> {
1089
+ await this.zclCommand("genGroups", "add", {groupid: group.groupID, groupname: ""}, undefined, undefined, true, Zcl.FrameType.SPECIFIC);
1090
+ group.addMember(this);
1091
+ }
1092
+
1093
+ private getCluster(
1094
+ clusterKey: number | string,
1095
+ device: Device | undefined = undefined,
1096
+ manufacturerCode: number | undefined = undefined,
1097
+ ): ZclTypes.Cluster {
1098
+ if (!device) {
1099
+ device = this.getDevice();
1100
+ }
1101
+
1102
+ return Zcl.Utils.getCluster(clusterKey, manufacturerCode ?? device.manufacturerID, device.customClusters);
1103
+ }
1104
+
1105
+ /**
1106
+ * Remove endpoint from a group, accepts both a Group and number as parameter.
1107
+ * The number parameter type should only be used when removing from a group which is not known
1108
+ * to zigbee-herdsman.
1109
+ */
1110
+ public async removeFromGroup(group: Group | number): Promise<void> {
1111
+ await this.zclCommand(
1112
+ "genGroups",
1113
+ "remove",
1114
+ {groupid: group instanceof Group ? group.groupID : group},
1115
+ undefined,
1116
+ undefined,
1117
+ true,
1118
+ Zcl.FrameType.SPECIFIC,
1119
+ );
1120
+
1121
+ if (group instanceof Group) {
1122
+ group.removeMember(this);
1123
+ }
1124
+ }
1125
+
1126
+ public async removeFromAllGroups(): Promise<void> {
1127
+ await this.zclCommand("genGroups", "removeAll", {}, {disableDefaultResponse: true}, undefined, false, Zcl.FrameType.SPECIFIC);
1128
+ this.removeFromAllGroupsDatabase();
1129
+ }
1130
+
1131
+ public removeFromAllGroupsDatabase(): void {
1132
+ for (const group of Group.allByDatabaseID(this.databaseID)) {
1133
+ if (group.hasMember(this)) {
1134
+ group.removeMember(this);
1135
+ }
1136
+ }
1137
+ }
1138
+
1139
+ public async zclCommand<Cl extends number | string, Co extends number | string, Custom extends TCustomCluster | undefined = undefined>(
1140
+ clusterKey: Cl | ZclTypes.Cluster,
1141
+ commandKey: Co | ZclTypes.Command,
1142
+ payload: ClusterOrRawPayload<Cl, Co, Custom> | FoundationOrRawPayload<Co>,
1143
+ options?: Options,
1144
+ logPayload?: KeyValue,
1145
+ checkStatus = false,
1146
+ frameType: Zcl.FrameType = Zcl.FrameType.GLOBAL,
1147
+ ): Promise<undefined | Zcl.Frame> {
1148
+ const device = this.getDevice();
1149
+ const cluster = typeof clusterKey === "object" ? clusterKey : this.getCluster(clusterKey, device, options?.manufacturerCode);
1150
+ const command =
1151
+ typeof commandKey === "object"
1152
+ ? commandKey
1153
+ : frameType === Zcl.FrameType.GLOBAL
1154
+ ? Zcl.Utils.getGlobalCommand(commandKey)
1155
+ : cluster.getCommand(commandKey);
1156
+ const hasResponse = frameType === Zcl.FrameType.GLOBAL ? true : command.response !== undefined;
1157
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, hasResponse, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
1158
+
1159
+ const frame = Zcl.Frame.create(
1160
+ frameType,
1161
+ optionsWithDefaults.direction,
1162
+ optionsWithDefaults.disableDefaultResponse,
1163
+ optionsWithDefaults.manufacturerCode,
1164
+ optionsWithDefaults.transactionSequenceNumber ?? zclTransactionSequenceNumber.next(),
1165
+ command,
1166
+ cluster,
1167
+ payload,
1168
+ device.customClusters,
1169
+ optionsWithDefaults.reservedBits,
1170
+ );
1171
+
1172
+ const createLogMessage = (): string =>
1173
+ `ZCL command ${this.deviceIeeeAddress}/${this.ID} ` +
1174
+ `${cluster.name}.${command.name}(${JSON.stringify(logPayload ? logPayload : payload)}, ${JSON.stringify(optionsWithDefaults)})`;
1175
+ logger.debug(createLogMessage, NS);
1176
+
1177
+ try {
1178
+ const result = await this.sendRequest(frame, optionsWithDefaults);
1179
+
1180
+ if (result) {
1181
+ const resultFrame = Zcl.Frame.fromBuffer(result.clusterID, result.header, result.data, device.customClusters);
1182
+ if (checkStatus && !optionsWithDefaults.disableResponse) {
1183
+ this.checkStatus(resultFrame.payload);
1184
+ }
1185
+ return resultFrame;
1186
+ }
1187
+ } catch (error) {
1188
+ const err = error as Error;
1189
+ err.message = `${createLogMessage()} failed (${err.message})`;
1190
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
1191
+ logger.debug(err.stack!, NS);
1192
+ throw error;
1193
+ }
1194
+ }
1195
+
1196
+ public async zclCommandBroadcast<Cl extends number | string, Co extends number | string, Custom extends TCustomCluster | undefined = undefined>(
1197
+ endpoint: number,
1198
+ destination: BroadcastAddress,
1199
+ clusterKey: Cl,
1200
+ commandKey: Co,
1201
+ payload: ClusterOrRawPayload<Cl, Co, Custom> | FoundationOrRawPayload<Co>,
1202
+ options?: Options,
1203
+ ): Promise<void> {
1204
+ const device = this.getDevice();
1205
+ const cluster = this.getCluster(clusterKey, device, options?.manufacturerCode);
1206
+ const command = cluster.getCommand(commandKey);
1207
+ const optionsWithDefaults = this.getOptionsWithDefaults(options, true, Zcl.Direction.CLIENT_TO_SERVER, cluster.manufacturerCode);
1208
+ const sourceEndpoint = optionsWithDefaults.srcEndpoint ?? this.ID;
1209
+
1210
+ const frame = Zcl.Frame.create(
1211
+ Zcl.FrameType.SPECIFIC,
1212
+ optionsWithDefaults.direction,
1213
+ true,
1214
+ optionsWithDefaults.manufacturerCode,
1215
+ optionsWithDefaults.transactionSequenceNumber ?? zclTransactionSequenceNumber.next(),
1216
+ command,
1217
+ cluster,
1218
+ payload,
1219
+ device.customClusters,
1220
+ optionsWithDefaults.reservedBits,
1221
+ );
1222
+
1223
+ logger.debug(
1224
+ () =>
1225
+ `ZCL command broadcast ${this.deviceIeeeAddress}/${sourceEndpoint} to ${destination}/${endpoint} ` +
1226
+ `${cluster.name}.${command.name}(${JSON.stringify({payload, optionsWithDefaults})})`,
1227
+ NS,
1228
+ );
1229
+
1230
+ // if endpoint===0xFF ("broadcast endpoint"), deliver to all endpoints supporting cluster, should be avoided whenever possible
1231
+ await Entity.getAdapterByID(this.databaseID)?.sendZclFrameToAll(endpoint, frame, sourceEndpoint, destination);
1232
+ }
1233
+ }
1234
+
1235
+ export default Endpoint;