@willieee802/zigbee-herdsman 0.36.0 → 0.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +317 -0
  3. package/dist/adapter/adapter.d.ts +15 -13
  4. package/dist/adapter/adapter.d.ts.map +1 -1
  5. package/dist/adapter/adapter.js +15 -17
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +14 -12
  8. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  9. package/dist/adapter/deconz/adapter/deconzAdapter.js +118 -128
  10. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  11. package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
  12. package/dist/adapter/deconz/driver/driver.js +44 -44
  13. package/dist/adapter/deconz/driver/driver.js.map +1 -1
  14. package/dist/adapter/deconz/driver/frameParser.js +43 -43
  15. package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
  16. package/dist/adapter/deconz/driver/parser.js +6 -6
  17. package/dist/adapter/deconz/driver/parser.js.map +1 -1
  18. package/dist/adapter/deconz/driver/writer.js +3 -3
  19. package/dist/adapter/deconz/driver/writer.js.map +1 -1
  20. package/dist/adapter/ember/adapter/emberAdapter.d.ts +32 -36
  21. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  22. package/dist/adapter/ember/adapter/emberAdapter.js +418 -446
  23. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  24. package/dist/adapter/ember/adapter/endpoints.d.ts +5 -3
  25. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  26. package/dist/adapter/ember/adapter/endpoints.js +33 -31
  27. package/dist/adapter/ember/adapter/endpoints.js.map +1 -1
  28. package/dist/adapter/ember/adapter/oneWaitress.d.ts +10 -2
  29. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  30. package/dist/adapter/ember/adapter/oneWaitress.js +19 -5
  31. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  32. package/dist/adapter/ember/adapter/requestQueue.d.ts +2 -4
  33. package/dist/adapter/ember/adapter/requestQueue.d.ts.map +1 -1
  34. package/dist/adapter/ember/adapter/requestQueue.js +16 -21
  35. package/dist/adapter/ember/adapter/requestQueue.js.map +1 -1
  36. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  37. package/dist/adapter/ember/adapter/tokensManager.js +23 -20
  38. package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
  39. package/dist/adapter/ember/consts.d.ts +0 -7
  40. package/dist/adapter/ember/consts.d.ts.map +1 -1
  41. package/dist/adapter/ember/consts.js +2 -9
  42. package/dist/adapter/ember/consts.js.map +1 -1
  43. package/dist/adapter/ember/enums.d.ts +12 -14
  44. package/dist/adapter/ember/enums.d.ts.map +1 -1
  45. package/dist/adapter/ember/enums.js +12 -14
  46. package/dist/adapter/ember/enums.js.map +1 -1
  47. package/dist/adapter/ember/ezsp/buffalo.js +4 -4
  48. package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
  49. package/dist/adapter/ember/ezsp/ezsp.d.ts +1 -2
  50. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  51. package/dist/adapter/ember/ezsp/ezsp.js +218 -199
  52. package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
  53. package/dist/adapter/ember/types.d.ts +9 -9
  54. package/dist/adapter/ember/types.d.ts.map +1 -1
  55. package/dist/adapter/ember/uart/ash.d.ts +11 -5
  56. package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
  57. package/dist/adapter/ember/uart/ash.js +125 -93
  58. package/dist/adapter/ember/uart/ash.js.map +1 -1
  59. package/dist/adapter/ember/uart/consts.d.ts +1 -1
  60. package/dist/adapter/ember/uart/consts.js +1 -1
  61. package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
  62. package/dist/adapter/ember/uart/parser.js +5 -9
  63. package/dist/adapter/ember/uart/parser.js.map +1 -1
  64. package/dist/adapter/ember/uart/queues.d.ts.map +1 -1
  65. package/dist/adapter/ember/uart/queues.js +3 -1
  66. package/dist/adapter/ember/uart/queues.js.map +1 -1
  67. package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
  68. package/dist/adapter/ember/uart/writer.js +4 -6
  69. package/dist/adapter/ember/uart/writer.js.map +1 -1
  70. package/dist/adapter/ember/utils/math.d.ts.map +1 -1
  71. package/dist/adapter/ember/zdo.d.ts +6 -2
  72. package/dist/adapter/ember/zdo.d.ts.map +1 -1
  73. package/dist/adapter/ember/zdo.js +2 -2
  74. package/dist/adapter/ember/zdo.js.map +1 -1
  75. package/dist/adapter/events.d.ts +17 -23
  76. package/dist/adapter/events.d.ts.map +1 -1
  77. package/dist/adapter/events.js +1 -2
  78. package/dist/adapter/events.js.map +1 -1
  79. package/dist/adapter/ezsp/adapter/backup.d.ts +0 -1
  80. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  81. package/dist/adapter/ezsp/adapter/backup.js +3 -7
  82. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  83. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +13 -10
  84. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  85. package/dist/adapter/ezsp/adapter/ezspAdapter.js +79 -72
  86. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  87. package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -1
  88. package/dist/adapter/ezsp/driver/commands.js +3 -5
  89. package/dist/adapter/ezsp/driver/commands.js.map +1 -1
  90. package/dist/adapter/ezsp/driver/driver.d.ts +1 -4
  91. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  92. package/dist/adapter/ezsp/driver/driver.js +101 -122
  93. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  94. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  95. package/dist/adapter/ezsp/driver/ezsp.js +61 -50
  96. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  97. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  98. package/dist/adapter/ezsp/driver/multicast.js +8 -12
  99. package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
  100. package/dist/adapter/ezsp/driver/parser.js +5 -5
  101. package/dist/adapter/ezsp/driver/parser.js.map +1 -1
  102. package/dist/adapter/ezsp/driver/types/basic.js +1 -1
  103. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  104. package/dist/adapter/ezsp/driver/types/named.js +2 -2
  105. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  106. package/dist/adapter/ezsp/driver/types/struct.js +2 -2
  107. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  108. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  109. package/dist/adapter/ezsp/driver/uart.js +46 -46
  110. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  111. package/dist/adapter/ezsp/driver/writer.js +3 -6
  112. package/dist/adapter/ezsp/driver/writer.js.map +1 -1
  113. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -1
  114. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  115. package/dist/adapter/z-stack/adapter/adapter-backup.js +25 -29
  116. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  117. package/dist/adapter/z-stack/adapter/endpoints.js +4 -4
  118. package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -1
  119. package/dist/adapter/z-stack/adapter/manager.d.ts +1 -4
  120. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  121. package/dist/adapter/z-stack/adapter/manager.js +52 -61
  122. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  123. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +14 -10
  124. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  125. package/dist/adapter/z-stack/adapter/zStackAdapter.js +95 -69
  126. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  127. package/dist/adapter/z-stack/unpi/parser.d.ts +3 -1
  128. package/dist/adapter/z-stack/unpi/parser.d.ts.map +1 -1
  129. package/dist/adapter/z-stack/unpi/parser.js +18 -8
  130. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  131. package/dist/adapter/z-stack/unpi/writer.d.ts +3 -2
  132. package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
  133. package/dist/adapter/z-stack/unpi/writer.js +21 -11
  134. package/dist/adapter/z-stack/unpi/writer.js.map +1 -1
  135. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +4 -2
  136. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  137. package/dist/adapter/z-stack/znp/buffaloZnp.js +154 -25
  138. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  139. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  140. package/dist/adapter/z-stack/znp/definition.js +2 -1
  141. package/dist/adapter/z-stack/znp/definition.js.map +1 -1
  142. package/dist/adapter/z-stack/znp/tstype.d.ts +4 -3
  143. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  144. package/dist/adapter/z-stack/znp/znp.d.ts +3 -1
  145. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  146. package/dist/adapter/z-stack/znp/znp.js +27 -32
  147. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  148. package/dist/adapter/z-stack/znp/zpiObject.js +2 -2
  149. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  150. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +13 -12
  151. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  152. package/dist/adapter/zigate/adapter/zigateAdapter.js +81 -90
  153. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  154. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +7 -8
  155. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  156. package/dist/adapter/zigate/driver/buffaloZiGate.js +150 -100
  157. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  158. package/dist/adapter/zigate/driver/commandType.d.ts +2 -1
  159. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  160. package/dist/adapter/zigate/driver/commandType.js +56 -52
  161. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  162. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  163. package/dist/adapter/zigate/driver/frame.js +8 -8
  164. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  165. package/dist/adapter/zigate/driver/messageType.d.ts +2 -1
  166. package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -1
  167. package/dist/adapter/zigate/driver/messageType.js +113 -108
  168. package/dist/adapter/zigate/driver/messageType.js.map +1 -1
  169. package/dist/adapter/zigate/driver/parameterType.d.ts +8 -1
  170. package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -1
  171. package/dist/adapter/zigate/driver/parameterType.js +9 -0
  172. package/dist/adapter/zigate/driver/parameterType.js.map +1 -1
  173. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  174. package/dist/adapter/zigate/driver/ziGateObject.js +9 -9
  175. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  176. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  177. package/dist/adapter/zigate/driver/zigate.js +23 -31
  178. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  179. package/dist/buffalo/buffalo.d.ts +23 -19
  180. package/dist/buffalo/buffalo.d.ts.map +1 -1
  181. package/dist/buffalo/buffalo.js +74 -169
  182. package/dist/buffalo/buffalo.js.map +1 -1
  183. package/dist/buffalo/index.d.ts +1 -2
  184. package/dist/buffalo/index.d.ts.map +1 -1
  185. package/dist/buffalo/index.js +1 -26
  186. package/dist/buffalo/index.js.map +1 -1
  187. package/dist/controller/controller.d.ts +10 -5
  188. package/dist/controller/controller.d.ts.map +1 -1
  189. package/dist/controller/controller.js +184 -126
  190. package/dist/controller/controller.js.map +1 -1
  191. package/dist/controller/database.d.ts +1 -0
  192. package/dist/controller/database.d.ts.map +1 -1
  193. package/dist/controller/database.js +7 -10
  194. package/dist/controller/database.js.map +1 -1
  195. package/dist/controller/events.d.ts +2 -2
  196. package/dist/controller/events.d.ts.map +1 -1
  197. package/dist/controller/events.js +4 -0
  198. package/dist/controller/events.js.map +1 -1
  199. package/dist/controller/greenPower.d.ts +2 -1
  200. package/dist/controller/greenPower.d.ts.map +1 -1
  201. package/dist/controller/greenPower.js +51 -57
  202. package/dist/controller/greenPower.js.map +1 -1
  203. package/dist/controller/helpers/request.d.ts +3 -3
  204. package/dist/controller/helpers/request.d.ts.map +1 -1
  205. package/dist/controller/helpers/request.js +2 -2
  206. package/dist/controller/helpers/request.js.map +1 -1
  207. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  208. package/dist/controller/helpers/requestQueue.js +26 -36
  209. package/dist/controller/helpers/requestQueue.js.map +1 -1
  210. package/dist/controller/helpers/zclFrameConverter.d.ts +4 -3
  211. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  212. package/dist/controller/helpers/zclFrameConverter.js +33 -14
  213. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  214. package/dist/controller/model/device.d.ts +12 -5
  215. package/dist/controller/model/device.d.ts.map +1 -1
  216. package/dist/controller/model/device.js +105 -86
  217. package/dist/controller/model/device.js.map +1 -1
  218. package/dist/controller/model/endpoint.d.ts +22 -17
  219. package/dist/controller/model/endpoint.d.ts.map +1 -1
  220. package/dist/controller/model/endpoint.js +139 -228
  221. package/dist/controller/model/endpoint.js.map +1 -1
  222. package/dist/controller/model/group.d.ts +1 -1
  223. package/dist/controller/model/group.d.ts.map +1 -1
  224. package/dist/controller/model/group.js +18 -18
  225. package/dist/controller/model/group.js.map +1 -1
  226. package/dist/controller/model/konnextConfig.d.ts +7 -0
  227. package/dist/controller/model/konnextConfig.d.ts.map +1 -0
  228. package/dist/controller/{logger-stub.js → model/konnextConfig.js} +1 -1
  229. package/dist/controller/model/konnextConfig.js.map +1 -0
  230. package/dist/controller/touchlink.js +25 -28
  231. package/dist/controller/touchlink.js.map +1 -1
  232. package/dist/index.d.ts +5 -3
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +8 -5
  235. package/dist/index.js.map +1 -1
  236. package/dist/utils/aes.d.ts +40 -0
  237. package/dist/utils/aes.d.ts.map +1 -0
  238. package/dist/utils/aes.js +198 -0
  239. package/dist/utils/aes.js.map +1 -0
  240. package/dist/utils/logger.d.ts +9 -0
  241. package/dist/utils/logger.d.ts.map +1 -0
  242. package/dist/utils/logger.js +14 -0
  243. package/dist/utils/logger.js.map +1 -0
  244. package/dist/zspec/consts.d.ts +60 -0
  245. package/dist/zspec/consts.d.ts.map +1 -0
  246. package/dist/zspec/consts.js +64 -0
  247. package/dist/zspec/consts.js.map +1 -0
  248. package/dist/zspec/enums.d.ts +19 -0
  249. package/dist/zspec/enums.d.ts.map +1 -0
  250. package/dist/zspec/enums.js +28 -0
  251. package/dist/zspec/enums.js.map +1 -0
  252. package/dist/zspec/index.d.ts +4 -0
  253. package/dist/zspec/index.d.ts.map +1 -0
  254. package/dist/zspec/index.js +43 -0
  255. package/dist/zspec/index.js.map +1 -0
  256. package/dist/zspec/tstypes.d.ts +19 -0
  257. package/dist/zspec/tstypes.d.ts.map +1 -0
  258. package/dist/{buffalo/tstype.js → zspec/tstypes.js} +1 -1
  259. package/dist/zspec/tstypes.js.map +1 -0
  260. package/dist/zspec/utils.d.ts +14 -0
  261. package/dist/zspec/utils.d.ts.map +1 -0
  262. package/dist/zspec/utils.js +29 -0
  263. package/dist/zspec/utils.js.map +1 -0
  264. package/dist/zspec/zcl/buffaloZcl.d.ts +55 -0
  265. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
  266. package/dist/zspec/zcl/buffaloZcl.js +929 -0
  267. package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
  268. package/dist/zspec/zcl/definition/cluster.d.ts +3 -0
  269. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
  270. package/dist/zspec/zcl/definition/cluster.js +5500 -0
  271. package/dist/zspec/zcl/definition/cluster.js.map +1 -0
  272. package/dist/zspec/zcl/definition/consts.d.ts +9 -0
  273. package/dist/zspec/zcl/definition/consts.d.ts.map +1 -0
  274. package/dist/zspec/zcl/definition/consts.js +27 -0
  275. package/dist/zspec/zcl/definition/consts.js.map +1 -0
  276. package/dist/zspec/zcl/definition/enums.d.ts +177 -0
  277. package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
  278. package/dist/zspec/zcl/definition/enums.js +187 -0
  279. package/dist/zspec/zcl/definition/enums.js.map +1 -0
  280. package/dist/zspec/zcl/definition/foundation.d.ts +11 -0
  281. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
  282. package/dist/zspec/zcl/definition/foundation.js +241 -0
  283. package/dist/zspec/zcl/definition/foundation.js.map +1 -0
  284. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +727 -0
  285. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
  286. package/dist/zspec/zcl/definition/manufacturerCode.js +733 -0
  287. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -0
  288. package/dist/zspec/zcl/definition/status.d.ts +69 -0
  289. package/dist/zspec/zcl/definition/status.d.ts.map +1 -0
  290. package/dist/zspec/zcl/definition/status.js +74 -0
  291. package/dist/zspec/zcl/definition/status.js.map +1 -0
  292. package/dist/zspec/zcl/definition/tstype.d.ts +114 -0
  293. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
  294. package/dist/{zcl/zclHeader.js → zspec/zcl/definition/tstype.js} +2 -1
  295. package/dist/zspec/zcl/definition/tstype.js.map +1 -0
  296. package/dist/zspec/zcl/index.d.ts +11 -0
  297. package/dist/zspec/zcl/index.d.ts.map +1 -0
  298. package/dist/zspec/zcl/index.js +47 -0
  299. package/dist/zspec/zcl/index.js.map +1 -0
  300. package/dist/zspec/zcl/utils.d.ts +7 -0
  301. package/dist/zspec/zcl/utils.d.ts.map +1 -0
  302. package/dist/zspec/zcl/utils.js +234 -0
  303. package/dist/zspec/zcl/utils.js.map +1 -0
  304. package/dist/zspec/zcl/zclFrame.d.ts +36 -0
  305. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
  306. package/dist/zspec/zcl/zclFrame.js +304 -0
  307. package/dist/zspec/zcl/zclFrame.js.map +1 -0
  308. package/dist/zspec/zcl/zclHeader.d.ts +17 -0
  309. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
  310. package/dist/zspec/zcl/zclHeader.js +88 -0
  311. package/dist/zspec/zcl/zclHeader.js.map +1 -0
  312. package/dist/zspec/zcl/zclStatusError.d.ts +6 -0
  313. package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -0
  314. package/dist/zspec/zcl/zclStatusError.js +13 -0
  315. package/dist/zspec/zcl/zclStatusError.js.map +1 -0
  316. package/dist/zspec/zdo/buffaloZdo.d.ts +438 -0
  317. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
  318. package/dist/zspec/zdo/buffaloZdo.js +1892 -0
  319. package/dist/zspec/zdo/buffaloZdo.js.map +1 -0
  320. package/dist/zspec/zdo/definition/clusters.d.ts +624 -0
  321. package/dist/zspec/zdo/definition/clusters.d.ts.map +1 -0
  322. package/dist/zspec/zdo/definition/clusters.js +687 -0
  323. package/dist/zspec/zdo/definition/clusters.js.map +1 -0
  324. package/dist/zspec/zdo/definition/consts.d.ts +13 -0
  325. package/dist/zspec/zdo/definition/consts.d.ts.map +1 -0
  326. package/dist/zspec/zdo/definition/consts.js +16 -0
  327. package/dist/zspec/zdo/definition/consts.js.map +1 -0
  328. package/dist/zspec/zdo/definition/enums.d.ts +75 -0
  329. package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
  330. package/dist/zspec/zdo/definition/enums.js +97 -0
  331. package/dist/zspec/zdo/definition/enums.js.map +1 -0
  332. package/dist/zspec/zdo/definition/status.d.ts +99 -0
  333. package/dist/zspec/zdo/definition/status.d.ts.map +1 -0
  334. package/dist/zspec/zdo/definition/status.js +109 -0
  335. package/dist/zspec/zdo/definition/status.js.map +1 -0
  336. package/dist/zspec/zdo/definition/tstypes.d.ts +787 -0
  337. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
  338. package/dist/{zcl/definition/tstype.js → zspec/zdo/definition/tstypes.js} +1 -1
  339. package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
  340. package/dist/zspec/zdo/index.d.ts +7 -0
  341. package/dist/zspec/zdo/index.d.ts.map +1 -0
  342. package/dist/zspec/zdo/index.js +39 -0
  343. package/dist/zspec/zdo/index.js.map +1 -0
  344. package/dist/zspec/zdo/utils.d.ts +25 -0
  345. package/dist/zspec/zdo/utils.d.ts.map +1 -0
  346. package/dist/zspec/zdo/utils.js +75 -0
  347. package/dist/zspec/zdo/utils.js.map +1 -0
  348. package/dist/zspec/zdo/zdoStatusError.d.ts +6 -0
  349. package/dist/zspec/zdo/zdoStatusError.d.ts.map +1 -0
  350. package/dist/zspec/zdo/zdoStatusError.js +13 -0
  351. package/dist/zspec/zdo/zdoStatusError.js.map +1 -0
  352. package/examples/join-and-log.js +7 -12
  353. package/package.json +6 -6
  354. package/dist/adapter/zigate/debug.d.ts +0 -8
  355. package/dist/adapter/zigate/debug.d.ts.map +0 -1
  356. package/dist/adapter/zigate/debug.js +0 -20
  357. package/dist/adapter/zigate/debug.js.map +0 -1
  358. package/dist/buffalo/tstype.d.ts +0 -9
  359. package/dist/buffalo/tstype.d.ts.map +0 -1
  360. package/dist/buffalo/tstype.js.map +0 -1
  361. package/dist/controller/logger-stub.d.ts +0 -7
  362. package/dist/controller/logger-stub.d.ts.map +0 -1
  363. package/dist/controller/logger-stub.js.map +0 -1
  364. package/dist/zcl/buffaloZcl.d.ts +0 -42
  365. package/dist/zcl/buffaloZcl.d.ts.map +0 -1
  366. package/dist/zcl/buffaloZcl.js +0 -595
  367. package/dist/zcl/buffaloZcl.js.map +0 -1
  368. package/dist/zcl/definition/buffaloZclDataType.d.ts +0 -18
  369. package/dist/zcl/definition/buffaloZclDataType.d.ts.map +0 -1
  370. package/dist/zcl/definition/buffaloZclDataType.js +0 -21
  371. package/dist/zcl/definition/buffaloZclDataType.js.map +0 -1
  372. package/dist/zcl/definition/cluster.d.ts +0 -30
  373. package/dist/zcl/definition/cluster.d.ts.map +0 -1
  374. package/dist/zcl/definition/cluster.js +0 -5531
  375. package/dist/zcl/definition/cluster.js.map +0 -1
  376. package/dist/zcl/definition/dataType.d.ts +0 -60
  377. package/dist/zcl/definition/dataType.d.ts.map +0 -1
  378. package/dist/zcl/definition/dataType.js +0 -65
  379. package/dist/zcl/definition/dataType.js.map +0 -1
  380. package/dist/zcl/definition/direction.d.ts +0 -6
  381. package/dist/zcl/definition/direction.d.ts.map +0 -1
  382. package/dist/zcl/definition/direction.js +0 -9
  383. package/dist/zcl/definition/direction.js.map +0 -1
  384. package/dist/zcl/definition/endpointDeviceType.d.ts +0 -5
  385. package/dist/zcl/definition/endpointDeviceType.d.ts.map +0 -1
  386. package/dist/zcl/definition/endpointDeviceType.js +0 -16
  387. package/dist/zcl/definition/endpointDeviceType.js.map +0 -1
  388. package/dist/zcl/definition/foundation.d.ts +0 -12
  389. package/dist/zcl/definition/foundation.d.ts.map +0 -1
  390. package/dist/zcl/definition/foundation.js +0 -168
  391. package/dist/zcl/definition/foundation.js.map +0 -1
  392. package/dist/zcl/definition/frameControl.d.ts +0 -11
  393. package/dist/zcl/definition/frameControl.d.ts.map +0 -1
  394. package/dist/zcl/definition/frameControl.js +0 -3
  395. package/dist/zcl/definition/frameControl.js.map +0 -1
  396. package/dist/zcl/definition/frameType.d.ts +0 -6
  397. package/dist/zcl/definition/frameType.d.ts.map +0 -1
  398. package/dist/zcl/definition/frameType.js +0 -9
  399. package/dist/zcl/definition/frameType.js.map +0 -1
  400. package/dist/zcl/definition/index.d.ts +0 -14
  401. package/dist/zcl/definition/index.d.ts.map +0 -1
  402. package/dist/zcl/definition/index.js +0 -52
  403. package/dist/zcl/definition/index.js.map +0 -1
  404. package/dist/zcl/definition/manufacturerCode.d.ts +0 -1078
  405. package/dist/zcl/definition/manufacturerCode.d.ts.map +0 -1
  406. package/dist/zcl/definition/manufacturerCode.js +0 -1083
  407. package/dist/zcl/definition/manufacturerCode.js.map +0 -1
  408. package/dist/zcl/definition/powerSource.d.ts +0 -5
  409. package/dist/zcl/definition/powerSource.d.ts.map +0 -1
  410. package/dist/zcl/definition/powerSource.js +0 -13
  411. package/dist/zcl/definition/powerSource.js.map +0 -1
  412. package/dist/zcl/definition/status.d.ts +0 -39
  413. package/dist/zcl/definition/status.d.ts.map +0 -1
  414. package/dist/zcl/definition/status.js +0 -42
  415. package/dist/zcl/definition/status.js.map +0 -1
  416. package/dist/zcl/definition/tstype.d.ts +0 -17
  417. package/dist/zcl/definition/tstype.d.ts.map +0 -1
  418. package/dist/zcl/definition/tstype.js.map +0 -1
  419. package/dist/zcl/index.d.ts +0 -17
  420. package/dist/zcl/index.d.ts.map +0 -1
  421. package/dist/zcl/index.js +0 -56
  422. package/dist/zcl/index.js.map +0 -1
  423. package/dist/zcl/tstype.d.ts +0 -57
  424. package/dist/zcl/tstype.d.ts.map +0 -1
  425. package/dist/zcl/tstype.js +0 -10
  426. package/dist/zcl/tstype.js.map +0 -1
  427. package/dist/zcl/utils.d.ts +0 -7
  428. package/dist/zcl/utils.d.ts.map +0 -1
  429. package/dist/zcl/utils.js +0 -165
  430. package/dist/zcl/utils.js.map +0 -1
  431. package/dist/zcl/zclFrame.d.ts +0 -41
  432. package/dist/zcl/zclFrame.d.ts.map +0 -1
  433. package/dist/zcl/zclFrame.js +0 -352
  434. package/dist/zcl/zclFrame.js.map +0 -1
  435. package/dist/zcl/zclHeader.d.ts +0 -9
  436. package/dist/zcl/zclHeader.d.ts.map +0 -1
  437. package/dist/zcl/zclHeader.js.map +0 -1
  438. package/dist/zcl/zclStatusError.d.ts +0 -6
  439. package/dist/zcl/zclStatusError.d.ts.map +0 -1
  440. package/dist/zcl/zclStatusError.js +0 -15
  441. package/dist/zcl/zclStatusError.js.map +0 -1
@@ -30,18 +30,16 @@ const zclTransactionSequenceNumber_1 = __importDefault(require("../helpers/zclTr
30
30
  const endpoint_1 = __importDefault(require("./endpoint"));
31
31
  const entity_1 = __importDefault(require("./entity"));
32
32
  const utils_1 = require("../../utils");
33
- const debug_1 = __importDefault(require("debug"));
34
- const Zcl = __importStar(require("../../zcl"));
33
+ const Zcl = __importStar(require("../../zspec/zcl"));
35
34
  const assert_1 = __importDefault(require("assert"));
36
35
  const helpers_1 = require("../helpers");
36
+ const logger_1 = require("../../utils/logger");
37
+ const enums_1 = require("../../zspec/enums");
37
38
  /**
38
39
  * @ignore
39
40
  */
40
41
  const OneJanuary2000 = new Date('January 01, 2000 00:00:00 UTC+00:00').getTime();
41
- const debug = {
42
- error: (0, debug_1.default)('zigbee-herdsman:controller:device:error'),
43
- log: (0, debug_1.default)('zigbee-herdsman:controller:device:log'),
44
- };
42
+ const NS = 'zh:controller:device';
45
43
  class Device extends entity_1.default {
46
44
  databaseID;
47
45
  ID;
@@ -64,11 +62,12 @@ class Device extends entity_1.default {
64
62
  _zclVersion;
65
63
  _linkquality;
66
64
  _skipDefaultResponse;
67
- _skipTimeResponse;
65
+ _customReadResponse;
68
66
  _deleted;
69
67
  _lastDefaultResponseSequenceNumber;
70
68
  _checkinInterval;
71
69
  _pendingRequestTimeout;
70
+ _customClusters = {};
72
71
  // Getters/setters
73
72
  get ieeeAddr() { return this._ieeeAddr; }
74
73
  set ieeeAddr(ieeeAddr) { this._ieeeAddr = ieeeAddr; }
@@ -99,7 +98,7 @@ class Device extends entity_1.default {
99
98
  }
100
99
  get powerSource() { return this._powerSource; }
101
100
  set powerSource(powerSource) {
102
- this._powerSource = typeof powerSource === 'number' ? Zcl.PowerSource[powerSource & ~(1 << 7)] : powerSource;
101
+ this._powerSource = typeof powerSource === 'number' ? Zcl.POWER_SOURCES[powerSource & ~(1 << 7)] : powerSource;
103
102
  }
104
103
  get softwareBuildID() { return this._softwareBuildID; }
105
104
  set softwareBuildID(softwareBuildID) { this._softwareBuildID = softwareBuildID; }
@@ -111,8 +110,8 @@ class Device extends entity_1.default {
111
110
  set linkquality(linkquality) { this._linkquality = linkquality; }
112
111
  get skipDefaultResponse() { return this._skipDefaultResponse; }
113
112
  set skipDefaultResponse(skipDefaultResponse) { this._skipDefaultResponse = skipDefaultResponse; }
114
- get skipTimeResponse() { return this._skipTimeResponse; }
115
- set skipTimeResponse(skipTimeResponse) { this._skipTimeResponse = skipTimeResponse; }
113
+ get customReadResponse() { return this._customReadResponse; }
114
+ set customReadResponse(customReadResponse) { this._customReadResponse = customReadResponse; }
116
115
  get checkinInterval() { return this._checkinInterval; }
117
116
  set checkinInterval(checkinInterval) {
118
117
  this._checkinInterval = checkinInterval;
@@ -120,6 +119,7 @@ class Device extends entity_1.default {
120
119
  }
121
120
  get pendingRequestTimeout() { return this._pendingRequestTimeout; }
122
121
  set pendingRequestTimeout(pendingRequestTimeout) { this._pendingRequestTimeout = pendingRequestTimeout; }
122
+ get customClusters() { return this._customClusters; }
123
123
  meta;
124
124
  // This lookup contains all devices that are queried from the database, this is to ensure that always
125
125
  // the same instance is returned.
@@ -156,7 +156,6 @@ class Device extends entity_1.default {
156
156
  this._interviewCompleted = interviewCompleted;
157
157
  this._interviewing = false;
158
158
  this._skipDefaultResponse = false;
159
- this._skipTimeResponse = false;
160
159
  this.meta = meta;
161
160
  this._lastSeen = lastSeen;
162
161
  this._checkinInterval = checkinInterval;
@@ -183,7 +182,7 @@ class Device extends entity_1.default {
183
182
  }
184
183
  // There might be multiple endpoints with same DeviceId but it is not supported and first endpoint is returned
185
184
  getEndpointByDeviceType(deviceType) {
186
- const deviceID = Zcl.EndpointDeviceType[deviceType];
185
+ const deviceID = Zcl.ENDPOINT_DEVICE_TYPE[deviceType];
187
186
  return this.endpoints.find((d) => d.deviceID === deviceID);
188
187
  }
189
188
  implicitCheckin() {
@@ -200,112 +199,113 @@ class Device extends entity_1.default {
200
199
  hasPendingRequests() {
201
200
  return this.endpoints.find(e => e.hasPendingRequests()) !== undefined;
202
201
  }
203
- async onZclData(dataPayload, endpoint) {
204
- const frame = dataPayload.frame;
202
+ async onZclData(dataPayload, frame, endpoint) {
205
203
  // Update reportable properties
206
204
  if (frame.isCluster('genBasic') && (frame.isCommand('readRsp') || frame.isCommand('report'))) {
207
- for (const [key, val] of Object.entries(helpers_1.ZclFrameConverter.attributeKeyValue(frame, this.manufacturerID))) {
205
+ for (const [key, val] of Object.entries(helpers_1.ZclFrameConverter.attributeKeyValue(frame, this.manufacturerID, this.customClusters))) {
208
206
  Device.ReportablePropertiesMapping[key]?.set(val, this);
209
207
  }
210
208
  }
211
209
  // Respond to enroll requests
212
- if (frame.isSpecific() && frame.isCluster('ssIasZone') && frame.isCommand('enrollReq')) {
213
- debug.log(`IAS - '${this.ieeeAddr}' responding to enroll response`);
210
+ if (frame.header.isSpecific && frame.isCluster('ssIasZone') && frame.isCommand('enrollReq')) {
211
+ logger_1.logger.debug(`IAS - '${this.ieeeAddr}' responding to enroll response`, NS);
214
212
  const payload = { enrollrspcode: 0, zoneid: 23 };
215
213
  await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true });
216
214
  }
217
215
  // Reponse to read requests
218
- if (frame.isGlobal() && frame.isCommand('read')) {
216
+ if (frame.header.isGlobal && frame.isCommand('read') && !(this._customReadResponse?.(frame, endpoint))) {
219
217
  const time = Math.round(((new Date()).getTime() - OneJanuary2000) / 1000);
220
218
  const attributes = {
221
219
  ...endpoint.clusters,
222
- genTime: { attributes: {
220
+ genTime: {
221
+ attributes: {
223
222
  timeStatus: 3, // Time-master + synchronised
224
223
  time: time,
225
224
  timeZone: ((new Date()).getTimezoneOffset() * -1) * 60,
226
225
  localTime: time - (new Date()).getTimezoneOffset() * 60,
227
226
  lastSetTime: time,
228
227
  validUntilTime: time + (24 * 60 * 60), // valid for 24 hours
229
- } },
228
+ },
229
+ },
230
230
  };
231
- if (frame.Cluster.name in attributes && (frame.Cluster.name !== 'genTime' || !this._skipTimeResponse)) {
231
+ if (frame.cluster.name in attributes) {
232
232
  const response = {};
233
- for (const entry of frame.Payload) {
234
- if (frame.Cluster.hasAttribute(entry.attrId)) {
235
- const name = frame.Cluster.getAttribute(entry.attrId).name;
236
- if (name in attributes[frame.Cluster.name].attributes) {
237
- response[name] = attributes[frame.Cluster.name].attributes[name];
233
+ for (const entry of frame.payload) {
234
+ if (frame.cluster.hasAttribute(entry.attrId)) {
235
+ const name = frame.cluster.getAttribute(entry.attrId).name;
236
+ if (name in attributes[frame.cluster.name].attributes) {
237
+ response[name] = attributes[frame.cluster.name].attributes[name];
238
238
  }
239
239
  }
240
240
  }
241
241
  try {
242
- await endpoint.readResponse(frame.Cluster.ID, frame.Header.transactionSequenceNumber, response, { srcEndpoint: dataPayload.destinationEndpoint });
242
+ await endpoint.readResponse(frame.cluster.ID, frame.header.transactionSequenceNumber, response, { srcEndpoint: dataPayload.destinationEndpoint });
243
243
  }
244
244
  catch (error) {
245
- debug.error(`Read response to ${this.ieeeAddr} failed`);
245
+ logger_1.logger.error(`Read response to ${this.ieeeAddr} failed`, NS);
246
246
  }
247
247
  }
248
248
  }
249
249
  // Handle check-in from sleeping end devices
250
- if (frame.isSpecific() && frame.isCluster("genPollCtrl") && frame.isCommand("checkin")) {
250
+ if (frame.header.isSpecific && frame.isCluster("genPollCtrl") && frame.isCommand("checkin")) {
251
251
  try {
252
252
  if (this.hasPendingRequests() || (this._checkinInterval === undefined)) {
253
253
  const payload = {
254
254
  startFastPolling: true,
255
255
  fastPollTimeout: 0,
256
256
  };
257
- debug.log(`check-in from ${this.ieeeAddr}: accepting fast-poll`);
258
- await endpoint.command(frame.Cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
257
+ logger_1.logger.debug(`check-in from ${this.ieeeAddr}: accepting fast-poll`, NS);
258
+ await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
259
259
  // This is a good time to read the checkin interval if we haven't stored it previously
260
260
  if (this._checkinInterval === undefined) {
261
261
  const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
262
262
  this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
263
263
  this.resetPendingRequestTimeout();
264
- debug.log(`Request Queue (${this.ieeeAddr}): default expiration timeout set to ${this.pendingRequestTimeout}`);
264
+ logger_1.logger.debug(`Request Queue (${this.ieeeAddr}): default expiration timeout set to ${this.pendingRequestTimeout}`, NS);
265
265
  }
266
266
  await Promise.all(this.endpoints.map(async (e) => e.sendPendingRequests(true)));
267
267
  // We *must* end fast-poll when we're done sending things. Otherwise
268
268
  // we cause undue power-drain.
269
- debug.log(`check-in from ${this.ieeeAddr}: stopping fast-poll`);
270
- await endpoint.command(frame.Cluster.ID, 'fastPollStop', {}, { sendPolicy: 'immediate' });
269
+ logger_1.logger.debug(`check-in from ${this.ieeeAddr}: stopping fast-poll`, NS);
270
+ await endpoint.command(frame.cluster.ID, 'fastPollStop', {}, { sendPolicy: 'immediate' });
271
271
  }
272
272
  else {
273
273
  const payload = {
274
274
  startFastPolling: false,
275
275
  fastPollTimeout: 0,
276
276
  };
277
- debug.log(`check-in from ${this.ieeeAddr}: declining fast-poll`);
278
- await endpoint.command(frame.Cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
277
+ logger_1.logger.debug(`check-in from ${this.ieeeAddr}: declining fast-poll`, NS);
278
+ await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
279
279
  }
280
280
  }
281
281
  catch (error) {
282
282
  /* istanbul ignore next */
283
- debug.error(`Handling of poll check-in form ${this.ieeeAddr} failed`);
283
+ logger_1.logger.error(`Handling of poll check-in from ${this.ieeeAddr} failed`, NS);
284
284
  }
285
285
  }
286
286
  // Send a default response if necessary.
287
- const isDefaultResponse = frame.isGlobal() && frame.getCommand().name === 'defaultRsp';
288
- const commandHasResponse = frame.getCommand().hasOwnProperty('response');
289
- const disableDefaultResponse = frame.Header.frameControl.disableDefaultResponse;
287
+ const isDefaultResponse = frame.header.isGlobal && frame.command.name === 'defaultRsp';
288
+ const commandHasResponse = frame.command.hasOwnProperty('response');
289
+ const disableDefaultResponse = frame.header.frameControl.disableDefaultResponse;
290
290
  /* istanbul ignore next */
291
291
  const disableTuyaDefaultResponse = endpoint.getDevice().manufacturerName?.startsWith('_TZ') && process.env['DISABLE_TUYA_DEFAULT_RESPONSE'];
292
292
  // Sometimes messages are received twice, prevent responding twice
293
- const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.Header.transactionSequenceNumber;
293
+ const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.header.transactionSequenceNumber;
294
294
  if (this.type !== 'GreenPower' && !dataPayload.wasBroadcast && !disableDefaultResponse && !isDefaultResponse &&
295
295
  !commandHasResponse && !this._skipDefaultResponse && !alreadyResponded && !disableTuyaDefaultResponse) {
296
296
  try {
297
- this._lastDefaultResponseSequenceNumber = frame.Header.transactionSequenceNumber;
297
+ this._lastDefaultResponseSequenceNumber = frame.header.transactionSequenceNumber;
298
298
  // In the ZCL it is not documented what the direction of the default response should be
299
299
  // In https://github.com/Koenkk/zigbee2mqtt/issues/18096 a commandResponse (SERVER_TO_CLIENT)
300
300
  // is send and the device expects a CLIENT_TO_SERVER back.
301
301
  // Previously SERVER_TO_CLIENT was always used.
302
302
  // Therefore for non-global commands we inverse the direction.
303
- const direction = frame.isGlobal() ? Zcl.Direction.SERVER_TO_CLIENT : (frame.Header.frameControl.direction === Zcl.Direction.CLIENT_TO_SERVER
303
+ const direction = frame.header.isGlobal ? Zcl.Direction.SERVER_TO_CLIENT : (frame.header.frameControl.direction === Zcl.Direction.CLIENT_TO_SERVER
304
304
  ? Zcl.Direction.SERVER_TO_CLIENT : Zcl.Direction.CLIENT_TO_SERVER);
305
- await endpoint.defaultResponse(frame.getCommand().ID, 0, frame.Cluster.ID, frame.Header.transactionSequenceNumber, { direction });
305
+ await endpoint.defaultResponse(frame.command.ID, 0, frame.cluster.ID, frame.header.transactionSequenceNumber, { direction });
306
306
  }
307
307
  catch (error) {
308
- debug.error(`Default response to ${this.ieeeAddr} failed`);
308
+ logger_1.logger.error(`Default response to ${this.ieeeAddr} failed`, NS);
309
309
  }
310
310
  }
311
311
  }
@@ -324,7 +324,7 @@ class Device extends entity_1.default {
324
324
  }
325
325
  // default: no timeout (messages expire immediately after first send attempt)
326
326
  let pendingRequestTimeout = 0;
327
- if ((endpoints.filter((e) => e.supportsInputCluster('genPollCtrl'))).length > 0) {
327
+ if ((endpoints.filter((e) => e.inputClusters.includes(Zcl.Clusters.genPollCtrl.ID))).length > 0) {
328
328
  // default for devices that support genPollCtrl cluster (RX off when idle): 1 day
329
329
  pendingRequestTimeout = 86400000;
330
330
  /* istanbul ignore else */
@@ -333,7 +333,7 @@ class Device extends entity_1.default {
333
333
  pendingRequestTimeout = entry.checkinInterval * 1000; // milliseconds
334
334
  }
335
335
  }
336
- debug.log(`Request Queue (${ieeeAddr}): default expiration timeout set to ${pendingRequestTimeout}`);
336
+ logger_1.logger.debug(`Request Queue (${ieeeAddr}): default expiration timeout set to ${pendingRequestTimeout}`, NS);
337
337
  return new Device(databaseID, entry.id, entry.type, ieeeAddr, networkAddress, entry.manufId, endpoints, entry.manufName, entry.powerSource, entry.modelId, entry.appVersion, entry.stackVersion, entry.zclVersion, entry.hwVersion, entry.dateCode, entry.swBuildId, entry.interviewCompleted, meta, entry.lastSeen || null, entry.checkinInterval, pendingRequestTimeout);
338
338
  }
339
339
  toDatabaseEntry() {
@@ -366,13 +366,18 @@ class Device extends entity_1.default {
366
366
  }
367
367
  });
368
368
  }
369
+ static find(databaseID, ieeeOrNwkAddress, includeDeleted = false) {
370
+ return typeof ieeeOrNwkAddress === 'string' ? Device.byIeeeAddr(databaseID, ieeeOrNwkAddress, includeDeleted)
371
+ : Device.byNetworkAddress(ieeeOrNwkAddress, databaseID, includeDeleted);
372
+ }
369
373
  static byIeeeAddr(databaseID, ieeeAddr, includeDeleted = false) {
370
374
  Device.loadFromDatabaseIfNecessary();
371
375
  const device = Device.devices.get(databaseID)[ieeeAddr];
372
376
  return device?._deleted && !includeDeleted ? undefined : device;
373
377
  }
374
- static byNetworkAddress(networkAddress, databaseID) {
375
- return Device.allByDatabaseID(databaseID).find(d => d.networkAddress === networkAddress);
378
+ static byNetworkAddress(networkAddress, databaseID, includeDeleted = false) {
379
+ Device.loadFromDatabaseIfNecessary();
380
+ return Object.values(Device.allByDatabaseID(databaseID)).find(d => (includeDeleted || !d._deleted) && d.networkAddress === networkAddress);
376
381
  }
377
382
  static byType(type, databaseID) {
378
383
  return Device.allByDatabaseID(databaseID).filter(d => d.type === type);
@@ -416,23 +421,23 @@ class Device extends entity_1.default {
416
421
  async interview() {
417
422
  if (this.interviewing) {
418
423
  const message = `Interview - interview already in progress for '${this.ieeeAddr}'`;
419
- debug.log(message);
424
+ logger_1.logger.debug(message, NS);
420
425
  throw new Error(message);
421
426
  }
422
427
  let error;
423
428
  this._interviewing = true;
424
- debug.log(`Interview - start device '${this.ieeeAddr}'`);
429
+ logger_1.logger.debug(`Interview - start device '${this.ieeeAddr}'`, NS);
425
430
  try {
426
431
  await this.interviewInternal();
427
- debug.log(`Interview - completed for device '${this.ieeeAddr}'`);
432
+ logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}'`, NS);
428
433
  this._interviewCompleted = true;
429
434
  }
430
435
  catch (e) {
431
436
  if (this.interviewQuirks()) {
432
- debug.log(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${e}')`);
437
+ logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${e}')`, NS);
433
438
  }
434
439
  else {
435
- debug.log(`Interview - failed for device '${this.ieeeAddr}' with error '${e.stack}'`);
440
+ logger_1.logger.debug(`Interview - failed for device '${this.ieeeAddr}' with error '${e.stack}'`, NS);
436
441
  error = e;
437
442
  }
438
443
  }
@@ -445,7 +450,7 @@ class Device extends entity_1.default {
445
450
  }
446
451
  }
447
452
  interviewQuirks() {
448
- debug.log(`Interview - quirks check for '${this.modelID}'-'${this.manufacturerName}'-'${this.type}'`);
453
+ logger_1.logger.debug(`Interview - quirks check for '${this.modelID}'-'${this.manufacturerName}'-'${this.type}'`, NS);
449
454
  // TuYa devices are typically hard to interview. They also don't require a full interview to work correctly
450
455
  // e.g. no ias enrolling is required for the devices to work.
451
456
  // Assume that in case we got both the manufacturerName and modelID the device works correctly.
@@ -459,7 +464,7 @@ class Device extends entity_1.default {
459
464
  this._powerSource = this._powerSource || 'Battery';
460
465
  this._interviewing = false;
461
466
  this._interviewCompleted = true;
462
- debug.log(`Interview - quirks matched for TuYa end device`);
467
+ logger_1.logger.debug(`Interview - quirks matched for TuYa end device`, NS);
463
468
  return true;
464
469
  }
465
470
  // Some devices, e.g. Xiaomi end devices have a different interview procedure, after pairing they
@@ -482,18 +487,18 @@ class Device extends entity_1.default {
482
487
  const match = Object.keys(lookup).find((key) => this.modelID && this.modelID.match(key));
483
488
  if (match) {
484
489
  const info = lookup[match];
485
- debug.log(`Interview procedure failed but got modelID matching '${match}', assuming interview succeeded`);
490
+ logger_1.logger.debug(`Interview procedure failed but got modelID matching '${match}', assuming interview succeeded`, NS);
486
491
  this._type = this._type === 'Unknown' ? info.type : this._type;
487
492
  this._manufacturerID = this._manufacturerID || info.manufacturerID;
488
493
  this._manufacturerName = this._manufacturerName || info.manufacturerName;
489
494
  this._powerSource = this._powerSource || info.powerSource;
490
495
  this._interviewing = false;
491
496
  this._interviewCompleted = true;
492
- debug.log(`Interview - quirks matched on '${match}'`);
497
+ logger_1.logger.debug(`Interview - quirks matched on '${match}'`, NS);
493
498
  return true;
494
499
  }
495
500
  else {
496
- debug.log('Interview - quirks did not match');
501
+ logger_1.logger.debug('Interview - quirks did not match', NS);
497
502
  return false;
498
503
  }
499
504
  }
@@ -502,7 +507,7 @@ class Device extends entity_1.default {
502
507
  const nodeDescriptor = await entity_1.default.getAdapterByID(this.databaseID).nodeDescriptor(this.networkAddress);
503
508
  this._manufacturerID = nodeDescriptor.manufacturerCode;
504
509
  this._type = nodeDescriptor.type;
505
- debug.log(`Interview - got node descriptor for device '${this.ieeeAddr}'`);
510
+ logger_1.logger.debug(`Interview - got node descriptor for device '${this.ieeeAddr}'`, NS);
506
511
  };
507
512
  const hasNodeDescriptor = () => this._manufacturerID != null && this._type != null;
508
513
  if (!hasNodeDescriptor()) {
@@ -513,18 +518,18 @@ class Device extends entity_1.default {
513
518
  }
514
519
  catch (error) {
515
520
  if (this.interviewQuirks()) {
516
- debug.log(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`);
521
+ logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`, NS);
517
522
  return;
518
523
  }
519
524
  else {
520
525
  // Most of the times the first node descriptor query fails and the seconds one succeeds.
521
- debug.log(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`);
526
+ logger_1.logger.debug(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
522
527
  }
523
528
  }
524
529
  }
525
530
  }
526
531
  else {
527
- debug.log(`Interview - skip node descriptor request for '${this.ieeeAddr}', already got it`);
532
+ logger_1.logger.debug(`Interview - skip node descriptor request for '${this.ieeeAddr}', already got it`, NS);
528
533
  }
529
534
  if (!hasNodeDescriptor()) {
530
535
  throw new Error(`Interview failed because can not get node descriptor ('${this.ieeeAddr}')`);
@@ -532,7 +537,7 @@ class Device extends entity_1.default {
532
537
  if (this.manufacturerID === 4619 && this._type === 'EndDevice') {
533
538
  // Give TuYa end device some time to pair. Otherwise they leave immediately.
534
539
  // https://github.com/Koenkk/zigbee2mqtt/issues/5814
535
- debug.log("Interview - Detected TuYa end device, waiting 10 seconds...");
540
+ logger_1.logger.debug("Interview - Detected TuYa end device, waiting 10 seconds...", NS);
536
541
  await (0, utils_1.Wait)(10000);
537
542
  }
538
543
  else if ([0, 4098].includes(this.manufacturerID)) {
@@ -540,7 +545,7 @@ class Device extends entity_1.default {
540
545
  // In case the device responds, the endoint and modelID/manufacturerName are set
541
546
  // in controller.onZclOrRawData()
542
547
  // https://github.com/Koenkk/zigbee2mqtt/issues/7553
543
- debug.log("Interview - Detected potential TuYa end device, reading modelID and manufacturerName...");
548
+ logger_1.logger.debug("Interview - Detected potential TuYa end device, reading modelID and manufacturerName...", NS);
544
549
  try {
545
550
  const endpoint = endpoint_1.default.create(this.databaseID, 1, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
546
551
  const result = await endpoint.read('genBasic', ['modelId', 'manufacturerName'], { sendPolicy: 'immediate' });
@@ -549,7 +554,7 @@ class Device extends entity_1.default {
549
554
  }
550
555
  catch (error) {
551
556
  /* istanbul ignore next */
552
- debug.log(`Interview - TuYa read modelID and manufacturerName failed (${error})`);
557
+ logger_1.logger.debug(`Interview - TuYa read modelID and manufacturerName failed (${error})`, NS);
553
558
  }
554
559
  }
555
560
  // e.g. Xiaomi Aqara Opple devices fail to respond to the first active endpoints request, therefore try 2 times
@@ -562,7 +567,7 @@ class Device extends entity_1.default {
562
567
  break;
563
568
  }
564
569
  catch (error) {
565
- debug.log(`Interview - active endpoints request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`);
570
+ logger_1.logger.debug(`Interview - active endpoints request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
566
571
  }
567
572
  }
568
573
  if (!activeEndpoints) {
@@ -574,7 +579,7 @@ class Device extends entity_1.default {
574
579
  // This is not a valid endpoint number according to the ZCL, requesting a simple descriptor will result
575
580
  // into an error. Therefore we filter it, more info: https://github.com/Koenkk/zigbee-herdsman/issues/82
576
581
  activeEndpoints.endpoints.filter((e) => e !== 0 && !this.getEndpoint(e)).forEach((e) => this._endpoints.push(endpoint_1.default.create(this.databaseID, e, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr)));
577
- debug.log(`Interview - got active endpoints for device '${this.ieeeAddr}'`);
582
+ logger_1.logger.debug(`Interview - got active endpoints for device '${this.ieeeAddr}'`, NS);
578
583
  for (const endpointID of activeEndpoints.endpoints.filter((e) => e !== 0)) {
579
584
  const endpoint = this.getEndpoint(endpointID);
580
585
  const simpleDescriptor = await adapter.simpleDescriptor(this.networkAddress, endpoint.ID);
@@ -582,7 +587,7 @@ class Device extends entity_1.default {
582
587
  endpoint.deviceID = simpleDescriptor.deviceID;
583
588
  endpoint.inputClusters = simpleDescriptor.inputClusters;
584
589
  endpoint.outputClusters = simpleDescriptor.outputClusters;
585
- debug.log(`Interview - got simple descriptor for endpoint '${endpoint.ID}' device '${this.ieeeAddr}'`);
590
+ logger_1.logger.debug(`Interview - got simple descriptor for endpoint '${endpoint.ID}' device '${this.ieeeAddr}'`, NS);
586
591
  // Read attributes, nice to have but not required for succesfull pairing as most of the attributes
587
592
  // are not mandatory in ZCL specification.
588
593
  if (endpoint.supportsInputCluster('genBasic')) {
@@ -599,8 +604,7 @@ class Device extends entity_1.default {
599
604
  // https://github.com/Koenkk/zigbee-herdsman-converters/issues/2485.
600
605
  // The modelID and manufacturerName are crucial for device identification, so retry.
601
606
  if (item.key === 'modelID' || item.key === 'manufacturerName') {
602
- debug.log(`Interview - first ${item.key} retrieval attempt failed, ` +
603
- `retrying after 10 seconds...`);
607
+ logger_1.logger.debug(`Interview - first ${item.key} retrieval attempt failed, retrying after 10 seconds...`, NS);
604
608
  await (0, utils_1.Wait)(10000);
605
609
  result = await endpoint.read('genBasic', [key], { sendPolicy: 'immediate' });
606
610
  }
@@ -609,11 +613,10 @@ class Device extends entity_1.default {
609
613
  }
610
614
  }
611
615
  item.set(result[key], this);
612
- debug.log(`Interview - got '${item.key}' for device '${this.ieeeAddr}'`);
616
+ logger_1.logger.debug(`Interview - got '${item.key}' for device '${this.ieeeAddr}'`, NS);
613
617
  }
614
618
  catch (error) {
615
- debug.log(`Interview - failed to read attribute '${item.key}' from ` +
616
- `endpoint '${endpoint.ID}' (${error})`);
619
+ logger_1.logger.debug(`Interview - failed to read attribute '${item.key}' from endpoint '${endpoint.ID}' (${error})`, NS);
617
620
  }
618
621
  }
619
622
  }
@@ -622,14 +625,14 @@ class Device extends entity_1.default {
622
625
  const coordinator = Device.byType('Coordinator', this.databaseID)[0];
623
626
  // Enroll IAS device
624
627
  for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('ssIasZone'))) {
625
- debug.log(`Interview - IAS - enrolling '${this.ieeeAddr}' endpoint '${endpoint.ID}'`);
628
+ logger_1.logger.debug(`Interview - IAS - enrolling '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
626
629
  const stateBefore = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
627
- debug.log(`Interview - IAS - before enrolling state: '${JSON.stringify(stateBefore)}'`);
630
+ logger_1.logger.debug(`Interview - IAS - before enrolling state: '${JSON.stringify(stateBefore)}'`, NS);
628
631
  // Do not enroll when device has already been enrolled
629
632
  if (stateBefore.zoneState !== 1 || stateBefore.iasCieAddr !== coordinator.ieeeAddr) {
630
- debug.log(`Interview - IAS - not enrolled, enrolling`);
633
+ logger_1.logger.debug(`Interview - IAS - not enrolled, enrolling`, NS);
631
634
  await endpoint.write('ssIasZone', { 'iasCieAddr': coordinator.ieeeAddr }, { sendPolicy: 'immediate' });
632
- debug.log(`Interview - IAS - wrote iasCieAddr`);
635
+ logger_1.logger.debug(`Interview - IAS - wrote iasCieAddr`, NS);
633
636
  // There are 2 enrollment procedures:
634
637
  // - Auto enroll: coordinator has to send enrollResponse without receiving an enroll request
635
638
  // this case is handled below.
@@ -637,34 +640,34 @@ class Device extends entity_1.default {
637
640
  // this case in hanled in onZclData().
638
641
  // https://github.com/Koenkk/zigbee2mqtt/issues/4569#issuecomment-706075676
639
642
  await (0, utils_1.Wait)(500);
640
- debug.log(`IAS - '${this.ieeeAddr}' sending enroll response (auto enroll)`);
643
+ logger_1.logger.debug(`IAS - '${this.ieeeAddr}' sending enroll response (auto enroll)`, NS);
641
644
  const payload = { enrollrspcode: 0, zoneid: 23 };
642
645
  await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true, sendPolicy: 'immediate' });
643
646
  let enrolled = false;
644
647
  for (let attempt = 0; attempt < 20; attempt++) {
645
648
  await (0, utils_1.Wait)(500);
646
649
  const stateAfter = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
647
- debug.log(`Interview - IAS - after enrolling state (${attempt}): '${JSON.stringify(stateAfter)}'`);
650
+ logger_1.logger.debug(`Interview - IAS - after enrolling state (${attempt}): '${JSON.stringify(stateAfter)}'`, NS);
648
651
  if (stateAfter.zoneState === 1) {
649
652
  enrolled = true;
650
653
  break;
651
654
  }
652
655
  }
653
656
  if (enrolled) {
654
- debug.log(`Interview - IAS successfully enrolled '${this.ieeeAddr}' endpoint '${endpoint.ID}'`);
657
+ logger_1.logger.debug(`Interview - IAS successfully enrolled '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
655
658
  }
656
659
  else {
657
660
  throw new Error(`Interview failed because of failed IAS enroll (zoneState didn't change ('${this.ieeeAddr}')`);
658
661
  }
659
662
  }
660
663
  else {
661
- debug.log(`Interview - IAS - already enrolled, skipping enroll`);
664
+ logger_1.logger.debug(`Interview - IAS - already enrolled, skipping enroll`, NS);
662
665
  }
663
666
  }
664
667
  // Bind poll control
665
668
  try {
666
669
  for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('genPollCtrl'))) {
667
- debug.log(`Interview - Poll control - binding '${this.ieeeAddr}' endpoint '${endpoint.ID}'`);
670
+ logger_1.logger.debug(`Interview - Poll control - binding '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
668
671
  await endpoint.bind('genPollCtrl', coordinator.endpoints[0]);
669
672
  const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
670
673
  this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
@@ -673,7 +676,7 @@ class Device extends entity_1.default {
673
676
  }
674
677
  catch (error) {
675
678
  /* istanbul ignore next */
676
- debug.log(`Interview - failed to bind genPollCtrl (${error})`);
679
+ logger_1.logger.debug(`Interview - failed to bind genPollCtrl (${error})`, NS);
677
680
  }
678
681
  }
679
682
  async removeFromNetwork() {
@@ -682,8 +685,8 @@ class Device extends entity_1.default {
682
685
  options: 0x002550,
683
686
  srcID: Number(this.ieeeAddr),
684
687
  };
685
- const frame = Zcl.ZclFrame.create(Zcl.FrameType.SPECIFIC, Zcl.Direction.SERVER_TO_CLIENT, true, null, zclTransactionSequenceNumber_1.default.next(), 'pairing', 33, payload);
686
- await entity_1.default.getAdapterByID(this.databaseID).sendZclFrameToAll(242, frame, 242);
688
+ const frame = Zcl.Frame.create(Zcl.FrameType.SPECIFIC, Zcl.Direction.SERVER_TO_CLIENT, true, null, zclTransactionSequenceNumber_1.default.next(), 'pairing', 33, payload, this.customClusters);
689
+ await entity_1.default.getAdapterByID(this.databaseID).sendZclFrameToAll(242, frame, 242, enums_1.BroadcastAddress.RX_ON_WHEN_IDLE);
687
690
  }
688
691
  else
689
692
  await entity_1.default.getAdapterByID(this.databaseID).removeDevice(this.networkAddress, this.ieeeAddr);
@@ -722,6 +725,22 @@ class Device extends entity_1.default {
722
725
  const endpoint = this.endpoints.find((ep) => ep.inputClusters.includes(0)) ?? this.endpoints[0];
723
726
  await endpoint.read('genBasic', ['zclVersion'], { disableRecovery });
724
727
  }
728
+ addCustomCluster(name, cluster) {
729
+ (0, assert_1.default)(!([Zcl.Clusters.touchlink.ID, Zcl.Clusters.greenPower.ID].includes(cluster.ID)), 'Overriding of greenPower or touchlink cluster is not supported');
730
+ if (Zcl.Utils.isClusterName(name)) {
731
+ const existingCluster = Zcl.Clusters[name];
732
+ // Extend existing cluster
733
+ (0, assert_1.default)(existingCluster.ID === cluster.ID, `Custom cluster ID (${cluster.ID}) should match existing cluster ID (${existingCluster.ID})`);
734
+ cluster = {
735
+ ID: cluster.ID,
736
+ manufacturerCode: cluster.manufacturerCode,
737
+ attributes: { ...existingCluster.attributes, ...cluster.attributes },
738
+ commands: { ...existingCluster.commands, ...cluster.commands },
739
+ commandsResponse: { ...existingCluster.commandsResponse, ...cluster.commandsResponse },
740
+ };
741
+ }
742
+ this._customClusters[name] = cluster;
743
+ }
725
744
  }
726
745
  exports.default = Device;
727
746
  //# sourceMappingURL=device.js.map