@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
@@ -33,9 +33,8 @@ const model_1 = require("./model");
33
33
  const helpers_1 = require("./helpers");
34
34
  const Events = __importStar(require("./events"));
35
35
  const tstype_1 = require("./tstype");
36
- const debug_1 = __importDefault(require("debug"));
37
36
  const fs_1 = __importDefault(require("fs"));
38
- const zcl_1 = require("../zcl");
37
+ const Zcl = __importStar(require("../zspec/zcl"));
39
38
  const touchlink_1 = __importDefault(require("./touchlink"));
40
39
  const greenPower_1 = __importDefault(require("./greenPower"));
41
40
  const utils_1 = require("../utils");
@@ -44,12 +43,14 @@ const assert_1 = __importDefault(require("assert"));
44
43
  // @ts-ignore
45
44
  const mixin_deep_1 = __importDefault(require("mixin-deep"));
46
45
  const group_1 = __importDefault(require("./model/group"));
46
+ const logger_1 = require("../utils/logger");
47
+ const NS = 'zh:controller';
47
48
  async function catcho(func, errorMessage) {
48
49
  try {
49
50
  await func();
50
51
  }
51
52
  catch (error) {
52
- debug.error(`${errorMessage}: ${error}`);
53
+ logger_1.logger.error(`${errorMessage}: ${error}`, NS);
53
54
  }
54
55
  }
55
56
  const DefaultOptions = {
@@ -67,10 +68,6 @@ const DefaultOptions = {
67
68
  adapter: { disableLED: false },
68
69
  acceptJoiningDeviceHandler: null,
69
70
  };
70
- const debug = {
71
- error: (0, debug_1.default)('zigbee-herdsman:controller:error'),
72
- log: (0, debug_1.default)('zigbee-herdsman:controller:log'),
73
- };
74
71
  /**
75
72
  * @noInheritDoc
76
73
  */
@@ -90,18 +87,18 @@ class Controller extends events_1.default.EventEmitter {
90
87
  databaseSaveTimer;
91
88
  touchlink;
92
89
  stopping;
90
+ adapterDisconnected;
93
91
  networkParametersCached;
94
- logger;
95
92
  /**
96
93
  * Create a controller
97
94
  *
98
95
  * To auto detect the port provide `null` for `options.serialPort.path`
99
96
  */
100
- constructor(options, logger) {
97
+ constructor(options) {
101
98
  super();
102
99
  this.stopping = false;
100
+ this.adapterDisconnected = true; // set false after adapter.start() is successfully called
103
101
  this.options = (0, mixin_deep_1.default)(JSON.parse(JSON.stringify(DefaultOptions)), options);
104
- this.logger = logger;
105
102
  // Validate options
106
103
  for (const channel of this.options.network.channelList) {
107
104
  if (channel < 11 || channel > 26) {
@@ -115,8 +112,7 @@ class Controller extends events_1.default.EventEmitter {
115
112
  throw new Error(`ExtendedPanID must be 8 digits long, got ${this.options.network.extendedPanID.length}.`);
116
113
  }
117
114
  if (this.options.network.panID >= 0xFFFF || this.options.network.panID <= 0) {
118
- throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), ` +
119
- `got ${this.options.network.panID}.`);
115
+ throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
120
116
  }
121
117
  }
122
118
  /**
@@ -127,19 +123,28 @@ class Controller extends events_1.default.EventEmitter {
127
123
  this.database = database_1.default.open(this.options.databasePath);
128
124
  model_1.Entity.injectDatabase(this.database);
129
125
  // Adapter (create and inject)
130
- this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.logger);
131
- debug.log(`Starting with options '${JSON.stringify(this.options)}'`);
126
+ this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter);
127
+ logger_1.logger.debug(`Starting with options '${JSON.stringify(this.options)}'`, NS);
132
128
  const startResult = await this.adapter.start();
133
- debug.log(`Started with result '${startResult}'`);
129
+ logger_1.logger.debug(`Started with result '${startResult}'`, NS);
130
+ this.adapterDisconnected = false;
131
+ // Check if we have to change the channel, only do this when adapter `resumed` because:
132
+ // - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
133
+ // - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
134
+ if ((startResult === 'resumed') && (await this.adapter.supportsChangeChannel())) {
135
+ const netParams = (await this.getNetworkParameters());
136
+ if (this.options.network.channelList[0] !== netParams.channel) {
137
+ await this.changeChannel();
138
+ }
139
+ }
134
140
  model_1.Entity.injectAdapter(this.database.id, this.adapter);
135
141
  // log injection
136
- debug.log(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`);
142
+ logger_1.logger.debug(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`, NS);
137
143
  this.greenPower = new greenPower_1.default(this.adapter);
138
144
  this.greenPower.on(tstype_1.GreenPowerEvents.deviceJoined, this.onDeviceJoinedGreenPower.bind(this));
139
145
  // Register adapter events
140
146
  this.adapter.on(adapter_1.Events.Events.deviceJoined, this.onDeviceJoined.bind(this));
141
- this.adapter.on(adapter_1.Events.Events.zclData, (data) => this.onZclOrRawData('zcl', data));
142
- this.adapter.on(adapter_1.Events.Events.rawData, (data) => this.onZclOrRawData('raw', data));
147
+ this.adapter.on(adapter_1.Events.Events.zclPayload, this.onZclPayload.bind(this));
143
148
  this.adapter.on(adapter_1.Events.Events.disconnected, this.onAdapterDisconnected.bind(this));
144
149
  this.adapter.on(adapter_1.Events.Events.deviceAnnounce, this.onDeviceAnnounce.bind(this));
145
150
  this.adapter.on(adapter_1.Events.Events.deviceLeave, this.onDeviceLeave.bind(this));
@@ -148,7 +153,7 @@ class Controller extends events_1.default.EventEmitter {
148
153
  if (this.options.databaseBackupPath && fs_1.default.existsSync(this.options.databasePath)) {
149
154
  fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
150
155
  }
151
- debug.log('Clearing database...');
156
+ logger_1.logger.debug('Clearing database...', NS);
152
157
  for (const group of group_1.default.allByDatabaseID(this.database.id)) {
153
158
  group.removeFromDatabase();
154
159
  }
@@ -162,13 +167,13 @@ class Controller extends events_1.default.EventEmitter {
162
167
  // Add coordinator to the database if it is not there yet.
163
168
  const coordinator = await this.adapter.getCoordinator();
164
169
  if (model_1.Device.byType('Coordinator', this.database.id).length === 0) {
165
- debug.log('No coordinator in database, querying...');
170
+ logger_1.logger.debug('No coordinator in database, querying...', NS);
166
171
  model_1.Device.create('Coordinator', coordinator.ieeeAddr, coordinator.networkAddress, coordinator.manufacturerID, undefined, undefined, undefined, true, coordinator.endpoints, this.database.id);
167
172
  }
168
173
  // Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
169
174
  const databaseCoordinator = model_1.Device.byType('Coordinator', this.database.id)[0];
170
175
  if (databaseCoordinator.ieeeAddr !== coordinator.ieeeAddr) {
171
- debug.log(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`);
176
+ logger_1.logger.info(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`, NS);
172
177
  databaseCoordinator.changeIeeeAddress(coordinator.ieeeAddr);
173
178
  }
174
179
  // Set backup timer to 1 day.
@@ -243,7 +248,7 @@ class Controller extends events_1.default.EventEmitter {
243
248
  this.emit(Events.Events.permitJoinChanged, data);
244
249
  }
245
250
  else {
246
- debug.log('Disable joining');
251
+ logger_1.logger.debug('Disable joining', NS);
247
252
  await this.greenPower.permitJoin(0, null);
248
253
  await this.adapter.permitJoin(0, null);
249
254
  const data = { permitted: false, reason, timeout: this.permitJoinTimeout };
@@ -259,21 +264,28 @@ class Controller extends events_1.default.EventEmitter {
259
264
  isStopping() {
260
265
  return this.stopping;
261
266
  }
267
+ isAdapterDisconnected() {
268
+ return this.adapterDisconnected;
269
+ }
262
270
  async stop() {
263
271
  this.stopping = true;
264
- this.databaseSave();
265
272
  // Unregister adapter events
266
273
  this.adapter.removeAllListeners(adapter_1.Events.Events.deviceJoined);
267
- this.adapter.removeAllListeners(adapter_1.Events.Events.zclData);
268
- this.adapter.removeAllListeners(adapter_1.Events.Events.rawData);
274
+ this.adapter.removeAllListeners(adapter_1.Events.Events.zclPayload);
269
275
  this.adapter.removeAllListeners(adapter_1.Events.Events.disconnected);
270
276
  this.adapter.removeAllListeners(adapter_1.Events.Events.deviceAnnounce);
271
277
  this.adapter.removeAllListeners(adapter_1.Events.Events.deviceLeave);
272
- await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
273
278
  clearInterval(this.backupTimer);
274
279
  clearInterval(this.databaseSaveTimer);
275
- await this.backup();
276
- await this.adapter.stop();
280
+ if (this.adapterDisconnected) {
281
+ this.databaseSave();
282
+ }
283
+ else {
284
+ await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
285
+ await this.backup(); // always calls databaseSave()
286
+ await this.adapter.stop();
287
+ this.adapterDisconnected = true;
288
+ }
277
289
  }
278
290
  databaseSave() {
279
291
  for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
@@ -287,13 +299,13 @@ class Controller extends events_1.default.EventEmitter {
287
299
  async backup() {
288
300
  this.databaseSave();
289
301
  if (this.options.backupPath && await this.adapter.supportsBackup()) {
290
- debug.log('Creating coordinator backup');
302
+ logger_1.logger.debug('Creating coordinator backup', NS);
291
303
  const backup = await this.adapter.backup(model_1.Device.all().map((d) => d.ieeeAddr));
292
304
  const unifiedBackup = await utils_1.BackupUtils.toUnifiedBackup(backup);
293
305
  const tmpBackupPath = this.options.backupPath + '.tmp';
294
306
  fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
295
307
  fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
296
- debug.log(`Wrote coordinator backup to '${this.options.backupPath}'`);
308
+ logger_1.logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
297
309
  }
298
310
  }
299
311
  async coordinatorCheck() {
@@ -363,6 +375,14 @@ class Controller extends events_1.default.EventEmitter {
363
375
  createGroup(groupID) {
364
376
  return group_1.default.create(groupID, this.database.id);
365
377
  }
378
+ /**
379
+ * Broadcast a network-wide channel change.
380
+ */
381
+ async changeChannel() {
382
+ logger_1.logger.info(`Broadcasting change channel to '${this.options.network.channelList[0]}'.`, NS);
383
+ await this.adapter.changeChannel(this.options.network.channelList[0]);
384
+ this.networkParametersCached = null; // invalidate cache
385
+ }
366
386
  /**
367
387
  * Set transmit power of the adapter
368
388
  */
@@ -370,15 +390,16 @@ class Controller extends events_1.default.EventEmitter {
370
390
  return this.adapter.setTransmitPower(value);
371
391
  }
372
392
  onNetworkAddress(payload) {
373
- debug.log(`Network address '${payload.ieeeAddr}'`);
393
+ logger_1.logger.debug(`Network address '${payload.ieeeAddr}'`, NS);
374
394
  const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
375
395
  if (!device) {
376
- debug.log(`Network address is from unknown device '${payload.ieeeAddr}'`);
396
+ logger_1.logger.debug(`Network address is from unknown device '${payload.ieeeAddr}'`, NS);
377
397
  return;
378
398
  }
399
+ device.updateLastSeen();
379
400
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'networkAddress' });
380
401
  if (device.networkAddress !== payload.networkAddress) {
381
- debug.log(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`);
402
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`, NS);
382
403
  device.networkAddress = payload.networkAddress;
383
404
  device.save();
384
405
  const data = { device };
@@ -386,17 +407,17 @@ class Controller extends events_1.default.EventEmitter {
386
407
  }
387
408
  }
388
409
  onDeviceAnnounce(payload) {
389
- debug.log(`Device announce '${payload.ieeeAddr}'`);
410
+ logger_1.logger.debug(`Device announce '${payload.ieeeAddr}'`, NS);
390
411
  const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
391
412
  if (!device) {
392
- debug.log(`Device announce is from unknown device '${payload.ieeeAddr}'`);
413
+ logger_1.logger.debug(`Device announce is from unknown device '${payload.ieeeAddr}'`, NS);
393
414
  return;
394
415
  }
395
416
  device.updateLastSeen();
396
417
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'deviceAnnounce' });
397
418
  device.implicitCheckin();
398
419
  if (device.networkAddress !== payload.networkAddress) {
399
- debug.log(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`);
420
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`, NS);
400
421
  device.networkAddress = payload.networkAddress;
401
422
  device.save();
402
423
  }
@@ -404,22 +425,25 @@ class Controller extends events_1.default.EventEmitter {
404
425
  this.selfAndDeviceEmit(device, Events.Events.deviceAnnounce, data);
405
426
  }
406
427
  onDeviceLeave(payload) {
407
- debug.log(`Device leave '${payload.ieeeAddr}'`);
408
- const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
409
- if (device) {
410
- debug.log(`Removing device from database '${payload.ieeeAddr}'`);
411
- device.removeFromDatabase();
428
+ logger_1.logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
429
+ const device = payload.ieeeAddr ? model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : model_1.Device.byNetworkAddress(this.database.id, payload.networkAddress);
430
+ if (!device) {
431
+ logger_1.logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
432
+ return;
412
433
  }
413
- const data = { ieeeAddr: payload.ieeeAddr };
434
+ logger_1.logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
435
+ device.removeFromDatabase();
436
+ const data = { ieeeAddr: device.ieeeAddr };
414
437
  this.selfAndDeviceEmit(device, Events.Events.deviceLeave, data);
415
438
  }
416
439
  async onAdapterDisconnected() {
417
- debug.log(`Adapter disconnected'`);
440
+ logger_1.logger.debug(`Adapter disconnected`, NS);
441
+ this.adapterDisconnected = true;
418
442
  await catcho(() => this.adapter.stop(), 'Failed to stop adapter on disconnect');
419
443
  this.emit(Events.Events.adapterDisconnected);
420
444
  }
421
445
  async onDeviceJoinedGreenPower(payload) {
422
- debug.log(`Green power device '${JSON.stringify(payload)}' joined`);
446
+ logger_1.logger.debug(`Green power device '${JSON.stringify(payload)}' joined`, NS);
423
447
  // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
424
448
  let ieeeAddr = payload.sourceID.toString(16);
425
449
  ieeeAddr = `0x${'0'.repeat(16 - ieeeAddr.length)}${ieeeAddr}`;
@@ -427,8 +451,8 @@ class Controller extends events_1.default.EventEmitter {
427
451
  const modelID = `GreenPower_${payload.deviceID}`;
428
452
  let device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr, true);
429
453
  if (!device) {
430
- debug.log(`New green power device '${ieeeAddr}' joined`);
431
- debug.log(`Creating device '${ieeeAddr}'`);
454
+ logger_1.logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
455
+ logger_1.logger.debug(`Creating device '${ieeeAddr}'`, NS);
432
456
  device = model_1.Device.create('GreenPower', ieeeAddr, payload.networkAddress, null, undefined, undefined, modelID, true, [], this.database.id);
433
457
  device.save();
434
458
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
@@ -436,7 +460,7 @@ class Controller extends events_1.default.EventEmitter {
436
460
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
437
461
  }
438
462
  else if (device.isDeleted) {
439
- debug.log(`Deleted green power device '${ieeeAddr}' joined`);
463
+ logger_1.logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
440
464
  device.undelete(true);
441
465
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
442
466
  const deviceInterviewPayload = { status: 'successful', device };
@@ -448,32 +472,31 @@ class Controller extends events_1.default.EventEmitter {
448
472
  this.emit(event, data);
449
473
  }
450
474
  async onDeviceJoined(payload) {
451
- debug.log(`Device '${payload.ieeeAddr}' joined`);
475
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
452
476
  if (this.options.acceptJoiningDeviceHandler) {
453
477
  if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
454
- debug.log(`Device '${payload.ieeeAddr}' rejected by handler, removing it`);
478
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
455
479
  await catcho(() => this.adapter.removeDevice(payload.networkAddress, payload.ieeeAddr), 'Failed to remove rejected device');
456
480
  return;
457
481
  }
458
482
  else {
459
- debug.log(`Device '${payload.ieeeAddr}' accepted by handler`);
483
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
460
484
  }
461
485
  }
462
486
  let device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
463
487
  if (!device) {
464
- debug.log(`New device '${payload.ieeeAddr}' joined`);
465
- debug.log(`Creating device '${payload.ieeeAddr}'`);
488
+ logger_1.logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
489
+ logger_1.logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
466
490
  device = model_1.Device.create('Unknown', payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, false, [], this.database.id);
467
491
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
468
492
  }
469
493
  else if (device.isDeleted) {
470
- debug.log(`Delete device '${payload.ieeeAddr}' joined, undeleting`);
494
+ logger_1.logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
471
495
  device.undelete();
472
496
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
473
497
  }
474
498
  if (device.networkAddress !== payload.networkAddress) {
475
- debug.log(`Device '${payload.ieeeAddr}' is already in database with different networkAddress, ` +
476
- `updating networkAddress`);
499
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
477
500
  device.networkAddress = payload.networkAddress;
478
501
  device.save();
479
502
  }
@@ -482,124 +505,156 @@ class Controller extends events_1.default.EventEmitter {
482
505
  device.implicitCheckin();
483
506
  if (!device.interviewCompleted && !device.interviewing) {
484
507
  const payloadStart = { status: 'started', device };
485
- debug.log(`Interview '${device.ieeeAddr}' start`);
508
+ logger_1.logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
486
509
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, payloadStart);
487
510
  try {
488
511
  await device.interview();
489
- debug.log(`Succesfully interviewed '${device.ieeeAddr}'`);
512
+ logger_1.logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
490
513
  const event = { status: 'successful', device };
491
514
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
492
515
  }
493
516
  catch (error) {
494
- debug.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`);
517
+ logger_1.logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
495
518
  const event = { status: 'failed', device };
496
519
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
497
520
  }
498
521
  }
499
522
  else {
500
- debug.log(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', ` +
501
- `in progress '${device.interviewing}'`);
523
+ logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', in progress '${device.interviewing}'`, NS);
502
524
  }
503
525
  }
504
- isZclDataPayload(dataPayload, type) {
505
- return type === 'zcl';
506
- }
507
- async onZclOrRawData(dataType, dataPayload) {
508
- const logDataPayload = JSON.parse(JSON.stringify(dataPayload));
509
- if (dataType === 'zcl') {
510
- delete logDataPayload.frame.Cluster;
526
+ async onZclPayload(payload) {
527
+ let frame = undefined;
528
+ let device = undefined;
529
+ if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
530
+ // This is handled by touchlink
531
+ return;
511
532
  }
512
- debug.log(`Received '${dataType}' data '${JSON.stringify(logDataPayload)}'`);
513
- let gpDevice = null;
514
- if (this.isZclDataPayload(dataPayload, dataType)) {
515
- if (dataPayload.frame.Cluster.name === 'touchlink') {
516
- // This is handled by touchlink
517
- return;
533
+ else if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
534
+ try {
535
+ // Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
536
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
518
537
  }
519
- else if (dataPayload.frame.Cluster.name === 'greenPower') {
520
- await this.greenPower.onZclGreenPowerData(dataPayload);
521
- // lookup encapsulated gpDevice for further processing
522
- gpDevice = model_1.Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
538
+ catch (error) {
539
+ logger_1.logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
540
+ return;
541
+ // <<<<<<< HEAD
542
+ // } else if (dataPayload.frame.Cluster.name === 'greenPower') {
543
+ // await this.greenPower.onZclGreenPowerData(dataPayload);
544
+ // // lookup encapsulated gpDevice for further processing
545
+ // gpDevice = Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
546
+ // }
547
+ // }
548
+ // let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
549
+ // ? Device.byIeeeAddr(this.database.id, dataPayload.address)
550
+ // : Device.byNetworkAddress(dataPayload.address, this.database.id));
551
+ // /**
552
+ // * Handling of re-transmitted Xiaomi messages.
553
+ // * https://github.com/Koenkk/zigbee2mqtt/issues/1238
554
+ // * https://github.com/Koenkk/zigbee2mqtt/issues/3592
555
+ // *
556
+ // * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
557
+ // * The network address of these message is set to the one of the Xiaomi router.
558
+ // * Therefore it looks like if the message came from the Xiaomi router, while in
559
+ // * fact it came from the end device.
560
+ // * Handling these message would result in false state updates.
561
+ // * The group ID attribute of these message defines the network address of the end device.
562
+ // */
563
+ // if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
564
+ // debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
565
+ // device = Device.byNetworkAddress(dataPayload.groupID, this.database.id);
566
+ // }
567
+ // =======
523
568
  }
569
+ await this.greenPower.onZclGreenPowerData(payload, frame);
570
+ // lookup encapsulated gpDevice for further processing
571
+ device = model_1.Device.byNetworkAddress(frame.payload.srcID & 0xffff, this.database.id);
524
572
  }
525
- let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
526
- ? model_1.Device.byIeeeAddr(this.database.id, dataPayload.address)
527
- : model_1.Device.byNetworkAddress(dataPayload.address, this.database.id));
528
- /**
529
- * Handling of re-transmitted Xiaomi messages.
530
- * https://github.com/Koenkk/zigbee2mqtt/issues/1238
531
- * https://github.com/Koenkk/zigbee2mqtt/issues/3592
532
- *
533
- * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
534
- * The network address of these message is set to the one of the Xiaomi router.
535
- * Therefore it looks like if the message came from the Xiaomi router, while in
536
- * fact it came from the end device.
537
- * Handling these message would result in false state updates.
538
- * The group ID attribute of these message defines the network address of the end device.
539
- */
540
- if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
541
- debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
542
- device = model_1.Device.byNetworkAddress(dataPayload.groupID, this.database.id);
573
+ else {
574
+ /**
575
+ * Handling of re-transmitted Xiaomi messages.
576
+ * https://github.com/Koenkk/zigbee2mqtt/issues/1238
577
+ * https://github.com/Koenkk/zigbee2mqtt/issues/3592
578
+ *
579
+ * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
580
+ * The network address of these message is set to the one of the Xiaomi router.
581
+ * Therefore it looks like if the message came from the Xiaomi router, while in
582
+ * fact it came from the end device.
583
+ * Handling these message would result in false state updates.
584
+ * The group ID attribute of these message defines the network address of the end device.
585
+ */
586
+ device = model_1.Device.find(this.database.id, payload.address);
587
+ if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && payload.groupID) {
588
+ logger_1.logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
589
+ device = model_1.Device.byNetworkAddress(this.database.id, payload.groupID);
590
+ }
591
+ try {
592
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device?.customClusters);
593
+ }
594
+ catch (error) {
595
+ logger_1.logger.debug(`Failed to parse frame: ${error}`, NS);
596
+ }
543
597
  }
544
598
  if (!device) {
545
- debug.log(`'${dataType}' data is from unknown device with address '${dataPayload.address}', ` +
546
- `skipping...`);
599
+ logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
547
600
  return;
548
601
  }
602
+ logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, `
603
+ + `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, `
604
+ + `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
549
605
  device.updateLastSeen();
550
606
  //no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
551
- if (!this.isZclDataPayload(dataPayload, dataType) || !dataPayload.frame.isCluster("genPollCtrl")) {
607
+ if (!frame?.isCluster("genPollCtrl")) {
552
608
  device.implicitCheckin();
553
609
  }
554
- device.linkquality = dataPayload.linkquality;
555
- let endpoint = device.getEndpoint(dataPayload.endpoint);
610
+ device.linkquality = payload.linkquality;
611
+ let endpoint = device.getEndpoint(payload.endpoint);
556
612
  if (!endpoint) {
557
- debug.log(`'${dataType}' data is from unknown endpoint '${dataPayload.endpoint}' from device with ` +
558
- `network address '${dataPayload.address}', creating it...`);
559
- endpoint = device.createEndpoint(dataPayload.endpoint);
613
+ logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with ` +
614
+ `network address '${payload.address}', creating it...`, NS);
615
+ endpoint = device.createEndpoint(payload.endpoint);
560
616
  }
561
617
  // Parse command for event
562
618
  let type = undefined;
563
619
  let data;
564
620
  let clusterName = undefined;
565
621
  const meta = {};
566
- if (this.isZclDataPayload(dataPayload, dataType)) {
567
- const frame = dataPayload.frame;
568
- const command = frame.getCommand();
569
- clusterName = frame.Cluster.name;
570
- meta.zclTransactionSequenceNumber = frame.Header.transactionSequenceNumber;
571
- meta.manufacturerCode = frame.Header.manufacturerCode;
572
- meta.frameControl = frame.Header.frameControl;
573
- if (frame.isGlobal()) {
622
+ if (frame) {
623
+ const command = frame.command;
624
+ clusterName = frame.cluster.name;
625
+ meta.zclTransactionSequenceNumber = frame.header.transactionSequenceNumber;
626
+ meta.manufacturerCode = frame.header.manufacturerCode;
627
+ meta.frameControl = frame.header.frameControl;
628
+ if (frame.header.isGlobal) {
574
629
  if (frame.isCommand('report')) {
575
630
  type = 'attributeReport';
576
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
631
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
577
632
  }
578
633
  else if (frame.isCommand('read')) {
579
634
  type = 'read';
580
- data = helpers_1.ZclFrameConverter.attributeList(dataPayload.frame, device.manufacturerID);
635
+ data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
581
636
  }
582
637
  else if (frame.isCommand('write')) {
583
638
  type = 'write';
584
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
639
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
585
640
  }
586
641
  else {
587
642
  /* istanbul ignore else */
588
643
  if (frame.isCommand('readRsp')) {
589
644
  type = 'readResponse';
590
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
645
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
591
646
  }
592
647
  }
593
648
  }
594
649
  else {
595
650
  /* istanbul ignore else */
596
- if (frame.isSpecific()) {
651
+ if (frame.header.isSpecific) {
597
652
  if (Events.CommandsLookup[command.name]) {
598
653
  type = Events.CommandsLookup[command.name];
599
- data = dataPayload.frame.Payload;
654
+ data = frame.payload;
600
655
  }
601
656
  else {
602
- debug.log(`Skipping command '${command.name}' because it is missing from the lookup`);
657
+ logger_1.logger.debug(`Skipping command '${command.name}' because it is missing from the lookup`, NS);
603
658
  }
604
659
  }
605
660
  }
@@ -611,19 +666,19 @@ class Controller extends events_1.default.EventEmitter {
611
666
  property.set(value, device);
612
667
  }
613
668
  }
614
- endpoint.saveClusterAttributeKeyValue(frame.Cluster.ID, data);
669
+ endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
615
670
  }
616
671
  }
617
672
  else {
618
673
  type = 'raw';
619
- data = dataPayload.data;
620
- const name = zcl_1.Utils.getCluster(dataPayload.clusterID).name;
674
+ data = payload.data;
675
+ const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
621
676
  clusterName = Number.isNaN(Number(name)) ? name : Number(name);
622
677
  }
623
678
  if (type && data) {
624
- const endpoint = device.getEndpoint(dataPayload.endpoint);
625
- const linkquality = dataPayload.linkquality;
626
- const groupID = dataPayload.groupID;
679
+ const endpoint = device.getEndpoint(payload.endpoint);
680
+ const linkquality = payload.linkquality;
681
+ const groupID = payload.groupID;
627
682
  const eventData = {
628
683
  type: type, device, endpoint, data, linkquality, groupID, cluster: clusterName, meta
629
684
  };
@@ -633,8 +688,8 @@ class Controller extends events_1.default.EventEmitter {
633
688
  else {
634
689
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'messageNonEmitted' });
635
690
  }
636
- if (this.isZclDataPayload(dataPayload, dataType)) {
637
- await device.onZclData(dataPayload, endpoint);
691
+ if (frame) {
692
+ await device.onZclData(payload, frame, endpoint);
638
693
  }
639
694
  }
640
695
  }