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