@willieee802/zigbee-herdsman 0.36.0 → 0.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +317 -0
  3. package/dist/adapter/adapter.d.ts +15 -13
  4. package/dist/adapter/adapter.d.ts.map +1 -1
  5. package/dist/adapter/adapter.js +15 -17
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +14 -12
  8. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  9. package/dist/adapter/deconz/adapter/deconzAdapter.js +118 -128
  10. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  11. package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
  12. package/dist/adapter/deconz/driver/driver.js +44 -44
  13. package/dist/adapter/deconz/driver/driver.js.map +1 -1
  14. package/dist/adapter/deconz/driver/frameParser.js +43 -43
  15. package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
  16. package/dist/adapter/deconz/driver/parser.js +6 -6
  17. package/dist/adapter/deconz/driver/parser.js.map +1 -1
  18. package/dist/adapter/deconz/driver/writer.js +3 -3
  19. package/dist/adapter/deconz/driver/writer.js.map +1 -1
  20. package/dist/adapter/ember/adapter/emberAdapter.d.ts +32 -36
  21. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  22. package/dist/adapter/ember/adapter/emberAdapter.js +418 -446
  23. package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
  24. package/dist/adapter/ember/adapter/endpoints.d.ts +5 -3
  25. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  26. package/dist/adapter/ember/adapter/endpoints.js +33 -31
  27. package/dist/adapter/ember/adapter/endpoints.js.map +1 -1
  28. package/dist/adapter/ember/adapter/oneWaitress.d.ts +10 -2
  29. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  30. package/dist/adapter/ember/adapter/oneWaitress.js +19 -5
  31. package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
  32. package/dist/adapter/ember/adapter/requestQueue.d.ts +2 -4
  33. package/dist/adapter/ember/adapter/requestQueue.d.ts.map +1 -1
  34. package/dist/adapter/ember/adapter/requestQueue.js +16 -21
  35. package/dist/adapter/ember/adapter/requestQueue.js.map +1 -1
  36. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  37. package/dist/adapter/ember/adapter/tokensManager.js +23 -20
  38. package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
  39. package/dist/adapter/ember/consts.d.ts +0 -7
  40. package/dist/adapter/ember/consts.d.ts.map +1 -1
  41. package/dist/adapter/ember/consts.js +2 -9
  42. package/dist/adapter/ember/consts.js.map +1 -1
  43. package/dist/adapter/ember/enums.d.ts +12 -14
  44. package/dist/adapter/ember/enums.d.ts.map +1 -1
  45. package/dist/adapter/ember/enums.js +12 -14
  46. package/dist/adapter/ember/enums.js.map +1 -1
  47. package/dist/adapter/ember/ezsp/buffalo.js +4 -4
  48. package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
  49. package/dist/adapter/ember/ezsp/ezsp.d.ts +1 -2
  50. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  51. package/dist/adapter/ember/ezsp/ezsp.js +218 -199
  52. package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
  53. package/dist/adapter/ember/types.d.ts +9 -9
  54. package/dist/adapter/ember/types.d.ts.map +1 -1
  55. package/dist/adapter/ember/uart/ash.d.ts +11 -5
  56. package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
  57. package/dist/adapter/ember/uart/ash.js +125 -93
  58. package/dist/adapter/ember/uart/ash.js.map +1 -1
  59. package/dist/adapter/ember/uart/consts.d.ts +1 -1
  60. package/dist/adapter/ember/uart/consts.js +1 -1
  61. package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
  62. package/dist/adapter/ember/uart/parser.js +5 -9
  63. package/dist/adapter/ember/uart/parser.js.map +1 -1
  64. package/dist/adapter/ember/uart/queues.d.ts.map +1 -1
  65. package/dist/adapter/ember/uart/queues.js +3 -1
  66. package/dist/adapter/ember/uart/queues.js.map +1 -1
  67. package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
  68. package/dist/adapter/ember/uart/writer.js +4 -6
  69. package/dist/adapter/ember/uart/writer.js.map +1 -1
  70. package/dist/adapter/ember/utils/math.d.ts.map +1 -1
  71. package/dist/adapter/ember/zdo.d.ts +6 -2
  72. package/dist/adapter/ember/zdo.d.ts.map +1 -1
  73. package/dist/adapter/ember/zdo.js +2 -2
  74. package/dist/adapter/ember/zdo.js.map +1 -1
  75. package/dist/adapter/events.d.ts +17 -23
  76. package/dist/adapter/events.d.ts.map +1 -1
  77. package/dist/adapter/events.js +1 -2
  78. package/dist/adapter/events.js.map +1 -1
  79. package/dist/adapter/ezsp/adapter/backup.d.ts +0 -1
  80. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  81. package/dist/adapter/ezsp/adapter/backup.js +3 -7
  82. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  83. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +13 -10
  84. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  85. package/dist/adapter/ezsp/adapter/ezspAdapter.js +79 -72
  86. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
  87. package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -1
  88. package/dist/adapter/ezsp/driver/commands.js +3 -5
  89. package/dist/adapter/ezsp/driver/commands.js.map +1 -1
  90. package/dist/adapter/ezsp/driver/driver.d.ts +1 -4
  91. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  92. package/dist/adapter/ezsp/driver/driver.js +101 -122
  93. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  94. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  95. package/dist/adapter/ezsp/driver/ezsp.js +61 -50
  96. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  97. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  98. package/dist/adapter/ezsp/driver/multicast.js +8 -12
  99. package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
  100. package/dist/adapter/ezsp/driver/parser.js +5 -5
  101. package/dist/adapter/ezsp/driver/parser.js.map +1 -1
  102. package/dist/adapter/ezsp/driver/types/basic.js +1 -1
  103. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  104. package/dist/adapter/ezsp/driver/types/named.js +2 -2
  105. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  106. package/dist/adapter/ezsp/driver/types/struct.js +2 -2
  107. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  108. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  109. package/dist/adapter/ezsp/driver/uart.js +46 -46
  110. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  111. package/dist/adapter/ezsp/driver/writer.js +3 -6
  112. package/dist/adapter/ezsp/driver/writer.js.map +1 -1
  113. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -1
  114. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  115. package/dist/adapter/z-stack/adapter/adapter-backup.js +25 -29
  116. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  117. package/dist/adapter/z-stack/adapter/endpoints.js +4 -4
  118. package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -1
  119. package/dist/adapter/z-stack/adapter/manager.d.ts +1 -4
  120. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  121. package/dist/adapter/z-stack/adapter/manager.js +52 -61
  122. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  123. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +14 -10
  124. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  125. package/dist/adapter/z-stack/adapter/zStackAdapter.js +95 -69
  126. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  127. package/dist/adapter/z-stack/unpi/parser.d.ts +3 -1
  128. package/dist/adapter/z-stack/unpi/parser.d.ts.map +1 -1
  129. package/dist/adapter/z-stack/unpi/parser.js +18 -8
  130. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  131. package/dist/adapter/z-stack/unpi/writer.d.ts +3 -2
  132. package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
  133. package/dist/adapter/z-stack/unpi/writer.js +21 -11
  134. package/dist/adapter/z-stack/unpi/writer.js.map +1 -1
  135. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +4 -2
  136. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  137. package/dist/adapter/z-stack/znp/buffaloZnp.js +154 -25
  138. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  139. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  140. package/dist/adapter/z-stack/znp/definition.js +2 -1
  141. package/dist/adapter/z-stack/znp/definition.js.map +1 -1
  142. package/dist/adapter/z-stack/znp/tstype.d.ts +4 -3
  143. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  144. package/dist/adapter/z-stack/znp/znp.d.ts +3 -1
  145. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  146. package/dist/adapter/z-stack/znp/znp.js +27 -32
  147. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  148. package/dist/adapter/z-stack/znp/zpiObject.js +2 -2
  149. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  150. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +13 -12
  151. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  152. package/dist/adapter/zigate/adapter/zigateAdapter.js +81 -90
  153. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  154. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +7 -8
  155. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  156. package/dist/adapter/zigate/driver/buffaloZiGate.js +150 -100
  157. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  158. package/dist/adapter/zigate/driver/commandType.d.ts +2 -1
  159. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  160. package/dist/adapter/zigate/driver/commandType.js +56 -52
  161. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  162. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  163. package/dist/adapter/zigate/driver/frame.js +8 -8
  164. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  165. package/dist/adapter/zigate/driver/messageType.d.ts +2 -1
  166. package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -1
  167. package/dist/adapter/zigate/driver/messageType.js +113 -108
  168. package/dist/adapter/zigate/driver/messageType.js.map +1 -1
  169. package/dist/adapter/zigate/driver/parameterType.d.ts +8 -1
  170. package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -1
  171. package/dist/adapter/zigate/driver/parameterType.js +9 -0
  172. package/dist/adapter/zigate/driver/parameterType.js.map +1 -1
  173. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  174. package/dist/adapter/zigate/driver/ziGateObject.js +9 -9
  175. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  176. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  177. package/dist/adapter/zigate/driver/zigate.js +23 -31
  178. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  179. package/dist/buffalo/buffalo.d.ts +23 -19
  180. package/dist/buffalo/buffalo.d.ts.map +1 -1
  181. package/dist/buffalo/buffalo.js +74 -169
  182. package/dist/buffalo/buffalo.js.map +1 -1
  183. package/dist/buffalo/index.d.ts +1 -2
  184. package/dist/buffalo/index.d.ts.map +1 -1
  185. package/dist/buffalo/index.js +1 -26
  186. package/dist/buffalo/index.js.map +1 -1
  187. package/dist/controller/controller.d.ts +10 -5
  188. package/dist/controller/controller.d.ts.map +1 -1
  189. package/dist/controller/controller.js +184 -126
  190. package/dist/controller/controller.js.map +1 -1
  191. package/dist/controller/database.d.ts +1 -0
  192. package/dist/controller/database.d.ts.map +1 -1
  193. package/dist/controller/database.js +7 -10
  194. package/dist/controller/database.js.map +1 -1
  195. package/dist/controller/events.d.ts +2 -2
  196. package/dist/controller/events.d.ts.map +1 -1
  197. package/dist/controller/events.js +4 -0
  198. package/dist/controller/events.js.map +1 -1
  199. package/dist/controller/greenPower.d.ts +2 -1
  200. package/dist/controller/greenPower.d.ts.map +1 -1
  201. package/dist/controller/greenPower.js +51 -57
  202. package/dist/controller/greenPower.js.map +1 -1
  203. package/dist/controller/helpers/request.d.ts +3 -3
  204. package/dist/controller/helpers/request.d.ts.map +1 -1
  205. package/dist/controller/helpers/request.js +2 -2
  206. package/dist/controller/helpers/request.js.map +1 -1
  207. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  208. package/dist/controller/helpers/requestQueue.js +26 -36
  209. package/dist/controller/helpers/requestQueue.js.map +1 -1
  210. package/dist/controller/helpers/zclFrameConverter.d.ts +4 -3
  211. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  212. package/dist/controller/helpers/zclFrameConverter.js +33 -14
  213. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  214. package/dist/controller/model/device.d.ts +12 -5
  215. package/dist/controller/model/device.d.ts.map +1 -1
  216. package/dist/controller/model/device.js +105 -86
  217. package/dist/controller/model/device.js.map +1 -1
  218. package/dist/controller/model/endpoint.d.ts +22 -17
  219. package/dist/controller/model/endpoint.d.ts.map +1 -1
  220. package/dist/controller/model/endpoint.js +139 -228
  221. package/dist/controller/model/endpoint.js.map +1 -1
  222. package/dist/controller/model/group.d.ts +1 -1
  223. package/dist/controller/model/group.d.ts.map +1 -1
  224. package/dist/controller/model/group.js +18 -18
  225. package/dist/controller/model/group.js.map +1 -1
  226. package/dist/controller/model/konnextConfig.d.ts +7 -0
  227. package/dist/controller/model/konnextConfig.d.ts.map +1 -0
  228. package/dist/controller/{logger-stub.js → model/konnextConfig.js} +1 -1
  229. package/dist/controller/model/konnextConfig.js.map +1 -0
  230. package/dist/controller/touchlink.js +25 -28
  231. package/dist/controller/touchlink.js.map +1 -1
  232. package/dist/index.d.ts +5 -3
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +8 -5
  235. package/dist/index.js.map +1 -1
  236. package/dist/utils/aes.d.ts +40 -0
  237. package/dist/utils/aes.d.ts.map +1 -0
  238. package/dist/utils/aes.js +198 -0
  239. package/dist/utils/aes.js.map +1 -0
  240. package/dist/utils/logger.d.ts +9 -0
  241. package/dist/utils/logger.d.ts.map +1 -0
  242. package/dist/utils/logger.js +14 -0
  243. package/dist/utils/logger.js.map +1 -0
  244. package/dist/zspec/consts.d.ts +60 -0
  245. package/dist/zspec/consts.d.ts.map +1 -0
  246. package/dist/zspec/consts.js +64 -0
  247. package/dist/zspec/consts.js.map +1 -0
  248. package/dist/zspec/enums.d.ts +19 -0
  249. package/dist/zspec/enums.d.ts.map +1 -0
  250. package/dist/zspec/enums.js +28 -0
  251. package/dist/zspec/enums.js.map +1 -0
  252. package/dist/zspec/index.d.ts +4 -0
  253. package/dist/zspec/index.d.ts.map +1 -0
  254. package/dist/zspec/index.js +43 -0
  255. package/dist/zspec/index.js.map +1 -0
  256. package/dist/zspec/tstypes.d.ts +19 -0
  257. package/dist/zspec/tstypes.d.ts.map +1 -0
  258. package/dist/{buffalo/tstype.js → zspec/tstypes.js} +1 -1
  259. package/dist/zspec/tstypes.js.map +1 -0
  260. package/dist/zspec/utils.d.ts +14 -0
  261. package/dist/zspec/utils.d.ts.map +1 -0
  262. package/dist/zspec/utils.js +29 -0
  263. package/dist/zspec/utils.js.map +1 -0
  264. package/dist/zspec/zcl/buffaloZcl.d.ts +55 -0
  265. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
  266. package/dist/zspec/zcl/buffaloZcl.js +929 -0
  267. package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
  268. package/dist/zspec/zcl/definition/cluster.d.ts +3 -0
  269. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
  270. package/dist/zspec/zcl/definition/cluster.js +5500 -0
  271. package/dist/zspec/zcl/definition/cluster.js.map +1 -0
  272. package/dist/zspec/zcl/definition/consts.d.ts +9 -0
  273. package/dist/zspec/zcl/definition/consts.d.ts.map +1 -0
  274. package/dist/zspec/zcl/definition/consts.js +27 -0
  275. package/dist/zspec/zcl/definition/consts.js.map +1 -0
  276. package/dist/zspec/zcl/definition/enums.d.ts +177 -0
  277. package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
  278. package/dist/zspec/zcl/definition/enums.js +187 -0
  279. package/dist/zspec/zcl/definition/enums.js.map +1 -0
  280. package/dist/zspec/zcl/definition/foundation.d.ts +11 -0
  281. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
  282. package/dist/zspec/zcl/definition/foundation.js +241 -0
  283. package/dist/zspec/zcl/definition/foundation.js.map +1 -0
  284. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +727 -0
  285. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
  286. package/dist/zspec/zcl/definition/manufacturerCode.js +733 -0
  287. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -0
  288. package/dist/zspec/zcl/definition/status.d.ts +69 -0
  289. package/dist/zspec/zcl/definition/status.d.ts.map +1 -0
  290. package/dist/zspec/zcl/definition/status.js +74 -0
  291. package/dist/zspec/zcl/definition/status.js.map +1 -0
  292. package/dist/zspec/zcl/definition/tstype.d.ts +114 -0
  293. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
  294. package/dist/{zcl/zclHeader.js → zspec/zcl/definition/tstype.js} +2 -1
  295. package/dist/zspec/zcl/definition/tstype.js.map +1 -0
  296. package/dist/zspec/zcl/index.d.ts +11 -0
  297. package/dist/zspec/zcl/index.d.ts.map +1 -0
  298. package/dist/zspec/zcl/index.js +47 -0
  299. package/dist/zspec/zcl/index.js.map +1 -0
  300. package/dist/zspec/zcl/utils.d.ts +7 -0
  301. package/dist/zspec/zcl/utils.d.ts.map +1 -0
  302. package/dist/zspec/zcl/utils.js +234 -0
  303. package/dist/zspec/zcl/utils.js.map +1 -0
  304. package/dist/zspec/zcl/zclFrame.d.ts +36 -0
  305. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
  306. package/dist/zspec/zcl/zclFrame.js +304 -0
  307. package/dist/zspec/zcl/zclFrame.js.map +1 -0
  308. package/dist/zspec/zcl/zclHeader.d.ts +17 -0
  309. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
  310. package/dist/zspec/zcl/zclHeader.js +88 -0
  311. package/dist/zspec/zcl/zclHeader.js.map +1 -0
  312. package/dist/zspec/zcl/zclStatusError.d.ts +6 -0
  313. package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -0
  314. package/dist/zspec/zcl/zclStatusError.js +13 -0
  315. package/dist/zspec/zcl/zclStatusError.js.map +1 -0
  316. package/dist/zspec/zdo/buffaloZdo.d.ts +438 -0
  317. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
  318. package/dist/zspec/zdo/buffaloZdo.js +1892 -0
  319. package/dist/zspec/zdo/buffaloZdo.js.map +1 -0
  320. package/dist/zspec/zdo/definition/clusters.d.ts +624 -0
  321. package/dist/zspec/zdo/definition/clusters.d.ts.map +1 -0
  322. package/dist/zspec/zdo/definition/clusters.js +687 -0
  323. package/dist/zspec/zdo/definition/clusters.js.map +1 -0
  324. package/dist/zspec/zdo/definition/consts.d.ts +13 -0
  325. package/dist/zspec/zdo/definition/consts.d.ts.map +1 -0
  326. package/dist/zspec/zdo/definition/consts.js +16 -0
  327. package/dist/zspec/zdo/definition/consts.js.map +1 -0
  328. package/dist/zspec/zdo/definition/enums.d.ts +75 -0
  329. package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
  330. package/dist/zspec/zdo/definition/enums.js +97 -0
  331. package/dist/zspec/zdo/definition/enums.js.map +1 -0
  332. package/dist/zspec/zdo/definition/status.d.ts +99 -0
  333. package/dist/zspec/zdo/definition/status.d.ts.map +1 -0
  334. package/dist/zspec/zdo/definition/status.js +109 -0
  335. package/dist/zspec/zdo/definition/status.js.map +1 -0
  336. package/dist/zspec/zdo/definition/tstypes.d.ts +787 -0
  337. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
  338. package/dist/{zcl/definition/tstype.js → zspec/zdo/definition/tstypes.js} +1 -1
  339. package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
  340. package/dist/zspec/zdo/index.d.ts +7 -0
  341. package/dist/zspec/zdo/index.d.ts.map +1 -0
  342. package/dist/zspec/zdo/index.js +39 -0
  343. package/dist/zspec/zdo/index.js.map +1 -0
  344. package/dist/zspec/zdo/utils.d.ts +25 -0
  345. package/dist/zspec/zdo/utils.d.ts.map +1 -0
  346. package/dist/zspec/zdo/utils.js +75 -0
  347. package/dist/zspec/zdo/utils.js.map +1 -0
  348. package/dist/zspec/zdo/zdoStatusError.d.ts +6 -0
  349. package/dist/zspec/zdo/zdoStatusError.d.ts.map +1 -0
  350. package/dist/zspec/zdo/zdoStatusError.js +13 -0
  351. package/dist/zspec/zdo/zdoStatusError.js.map +1 -0
  352. package/examples/join-and-log.js +7 -12
  353. package/package.json +6 -6
  354. package/dist/adapter/zigate/debug.d.ts +0 -8
  355. package/dist/adapter/zigate/debug.d.ts.map +0 -1
  356. package/dist/adapter/zigate/debug.js +0 -20
  357. package/dist/adapter/zigate/debug.js.map +0 -1
  358. package/dist/buffalo/tstype.d.ts +0 -9
  359. package/dist/buffalo/tstype.d.ts.map +0 -1
  360. package/dist/buffalo/tstype.js.map +0 -1
  361. package/dist/controller/logger-stub.d.ts +0 -7
  362. package/dist/controller/logger-stub.d.ts.map +0 -1
  363. package/dist/controller/logger-stub.js.map +0 -1
  364. package/dist/zcl/buffaloZcl.d.ts +0 -42
  365. package/dist/zcl/buffaloZcl.d.ts.map +0 -1
  366. package/dist/zcl/buffaloZcl.js +0 -595
  367. package/dist/zcl/buffaloZcl.js.map +0 -1
  368. package/dist/zcl/definition/buffaloZclDataType.d.ts +0 -18
  369. package/dist/zcl/definition/buffaloZclDataType.d.ts.map +0 -1
  370. package/dist/zcl/definition/buffaloZclDataType.js +0 -21
  371. package/dist/zcl/definition/buffaloZclDataType.js.map +0 -1
  372. package/dist/zcl/definition/cluster.d.ts +0 -30
  373. package/dist/zcl/definition/cluster.d.ts.map +0 -1
  374. package/dist/zcl/definition/cluster.js +0 -5531
  375. package/dist/zcl/definition/cluster.js.map +0 -1
  376. package/dist/zcl/definition/dataType.d.ts +0 -60
  377. package/dist/zcl/definition/dataType.d.ts.map +0 -1
  378. package/dist/zcl/definition/dataType.js +0 -65
  379. package/dist/zcl/definition/dataType.js.map +0 -1
  380. package/dist/zcl/definition/direction.d.ts +0 -6
  381. package/dist/zcl/definition/direction.d.ts.map +0 -1
  382. package/dist/zcl/definition/direction.js +0 -9
  383. package/dist/zcl/definition/direction.js.map +0 -1
  384. package/dist/zcl/definition/endpointDeviceType.d.ts +0 -5
  385. package/dist/zcl/definition/endpointDeviceType.d.ts.map +0 -1
  386. package/dist/zcl/definition/endpointDeviceType.js +0 -16
  387. package/dist/zcl/definition/endpointDeviceType.js.map +0 -1
  388. package/dist/zcl/definition/foundation.d.ts +0 -12
  389. package/dist/zcl/definition/foundation.d.ts.map +0 -1
  390. package/dist/zcl/definition/foundation.js +0 -168
  391. package/dist/zcl/definition/foundation.js.map +0 -1
  392. package/dist/zcl/definition/frameControl.d.ts +0 -11
  393. package/dist/zcl/definition/frameControl.d.ts.map +0 -1
  394. package/dist/zcl/definition/frameControl.js +0 -3
  395. package/dist/zcl/definition/frameControl.js.map +0 -1
  396. package/dist/zcl/definition/frameType.d.ts +0 -6
  397. package/dist/zcl/definition/frameType.d.ts.map +0 -1
  398. package/dist/zcl/definition/frameType.js +0 -9
  399. package/dist/zcl/definition/frameType.js.map +0 -1
  400. package/dist/zcl/definition/index.d.ts +0 -14
  401. package/dist/zcl/definition/index.d.ts.map +0 -1
  402. package/dist/zcl/definition/index.js +0 -52
  403. package/dist/zcl/definition/index.js.map +0 -1
  404. package/dist/zcl/definition/manufacturerCode.d.ts +0 -1078
  405. package/dist/zcl/definition/manufacturerCode.d.ts.map +0 -1
  406. package/dist/zcl/definition/manufacturerCode.js +0 -1083
  407. package/dist/zcl/definition/manufacturerCode.js.map +0 -1
  408. package/dist/zcl/definition/powerSource.d.ts +0 -5
  409. package/dist/zcl/definition/powerSource.d.ts.map +0 -1
  410. package/dist/zcl/definition/powerSource.js +0 -13
  411. package/dist/zcl/definition/powerSource.js.map +0 -1
  412. package/dist/zcl/definition/status.d.ts +0 -39
  413. package/dist/zcl/definition/status.d.ts.map +0 -1
  414. package/dist/zcl/definition/status.js +0 -42
  415. package/dist/zcl/definition/status.js.map +0 -1
  416. package/dist/zcl/definition/tstype.d.ts +0 -17
  417. package/dist/zcl/definition/tstype.d.ts.map +0 -1
  418. package/dist/zcl/definition/tstype.js.map +0 -1
  419. package/dist/zcl/index.d.ts +0 -17
  420. package/dist/zcl/index.d.ts.map +0 -1
  421. package/dist/zcl/index.js +0 -56
  422. package/dist/zcl/index.js.map +0 -1
  423. package/dist/zcl/tstype.d.ts +0 -57
  424. package/dist/zcl/tstype.d.ts.map +0 -1
  425. package/dist/zcl/tstype.js +0 -10
  426. package/dist/zcl/tstype.js.map +0 -1
  427. package/dist/zcl/utils.d.ts +0 -7
  428. package/dist/zcl/utils.d.ts.map +0 -1
  429. package/dist/zcl/utils.js +0 -165
  430. package/dist/zcl/utils.js.map +0 -1
  431. package/dist/zcl/zclFrame.d.ts +0 -41
  432. package/dist/zcl/zclFrame.d.ts.map +0 -1
  433. package/dist/zcl/zclFrame.js +0 -352
  434. package/dist/zcl/zclFrame.js.map +0 -1
  435. package/dist/zcl/zclHeader.d.ts +0 -9
  436. package/dist/zcl/zclHeader.d.ts.map +0 -1
  437. package/dist/zcl/zclHeader.js.map +0 -1
  438. package/dist/zcl/zclStatusError.d.ts +0 -6
  439. package/dist/zcl/zclStatusError.d.ts.map +0 -1
  440. package/dist/zcl/zclStatusError.js +0 -15
  441. package/dist/zcl/zclStatusError.js.map +0 -1
@@ -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 = {
@@ -66,10 +67,9 @@ const DefaultOptions = {
66
67
  backupPath: null,
67
68
  adapter: { disableLED: false },
68
69
  acceptJoiningDeviceHandler: null,
69
- };
70
- const debug = {
71
- error: (0, debug_1.default)('zigbee-herdsman:controller:error'),
72
- log: (0, debug_1.default)('zigbee-herdsman:controller:log'),
70
+ konnextConfig: {
71
+ isEncrypted: 0,
72
+ },
73
73
  };
74
74
  /**
75
75
  * @noInheritDoc
@@ -90,18 +90,18 @@ class Controller extends events_1.default.EventEmitter {
90
90
  databaseSaveTimer;
91
91
  touchlink;
92
92
  stopping;
93
+ adapterDisconnected;
93
94
  networkParametersCached;
94
- logger;
95
95
  /**
96
96
  * Create a controller
97
97
  *
98
98
  * To auto detect the port provide `null` for `options.serialPort.path`
99
99
  */
100
- constructor(options, logger) {
100
+ constructor(options) {
101
101
  super();
102
102
  this.stopping = false;
103
+ this.adapterDisconnected = true; // set false after adapter.start() is successfully called
103
104
  this.options = (0, mixin_deep_1.default)(JSON.parse(JSON.stringify(DefaultOptions)), options);
104
- this.logger = logger;
105
105
  // Validate options
106
106
  for (const channel of this.options.network.channelList) {
107
107
  if (channel < 11 || channel > 26) {
@@ -115,8 +115,7 @@ class Controller extends events_1.default.EventEmitter {
115
115
  throw new Error(`ExtendedPanID must be 8 digits long, got ${this.options.network.extendedPanID.length}.`);
116
116
  }
117
117
  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}.`);
118
+ throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
120
119
  }
121
120
  }
122
121
  /**
@@ -127,19 +126,28 @@ class Controller extends events_1.default.EventEmitter {
127
126
  this.database = database_1.default.open(this.options.databasePath);
128
127
  model_1.Entity.injectDatabase(this.database);
129
128
  // 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)}'`);
129
+ this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.options.konnextConfig);
130
+ logger_1.logger.debug(`Starting with options '${JSON.stringify(this.options)}'`, NS);
132
131
  const startResult = await this.adapter.start();
133
- debug.log(`Started with result '${startResult}'`);
132
+ logger_1.logger.debug(`Started with result '${startResult}'`, NS);
133
+ this.adapterDisconnected = false;
134
+ // Check if we have to change the channel, only do this when adapter `resumed` because:
135
+ // - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
136
+ // - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
137
+ if ((startResult === 'resumed') && (await this.adapter.supportsChangeChannel())) {
138
+ const netParams = (await this.getNetworkParameters());
139
+ if (this.options.network.channelList[0] !== netParams.channel) {
140
+ await this.changeChannel();
141
+ }
142
+ }
134
143
  model_1.Entity.injectAdapter(this.database.id, this.adapter);
135
144
  // log injection
136
- debug.log(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`);
145
+ logger_1.logger.debug(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`, NS);
137
146
  this.greenPower = new greenPower_1.default(this.adapter);
138
147
  this.greenPower.on(tstype_1.GreenPowerEvents.deviceJoined, this.onDeviceJoinedGreenPower.bind(this));
139
148
  // Register adapter events
140
149
  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));
150
+ this.adapter.on(adapter_1.Events.Events.zclPayload, this.onZclPayload.bind(this));
143
151
  this.adapter.on(adapter_1.Events.Events.disconnected, this.onAdapterDisconnected.bind(this));
144
152
  this.adapter.on(adapter_1.Events.Events.deviceAnnounce, this.onDeviceAnnounce.bind(this));
145
153
  this.adapter.on(adapter_1.Events.Events.deviceLeave, this.onDeviceLeave.bind(this));
@@ -148,7 +156,7 @@ class Controller extends events_1.default.EventEmitter {
148
156
  if (this.options.databaseBackupPath && fs_1.default.existsSync(this.options.databasePath)) {
149
157
  fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
150
158
  }
151
- debug.log('Clearing database...');
159
+ logger_1.logger.debug('Clearing database...', NS);
152
160
  for (const group of group_1.default.allByDatabaseID(this.database.id)) {
153
161
  group.removeFromDatabase();
154
162
  }
@@ -162,13 +170,13 @@ class Controller extends events_1.default.EventEmitter {
162
170
  // Add coordinator to the database if it is not there yet.
163
171
  const coordinator = await this.adapter.getCoordinator();
164
172
  if (model_1.Device.byType('Coordinator', this.database.id).length === 0) {
165
- debug.log('No coordinator in database, querying...');
173
+ logger_1.logger.debug('No coordinator in database, querying...', NS);
166
174
  model_1.Device.create('Coordinator', coordinator.ieeeAddr, coordinator.networkAddress, coordinator.manufacturerID, undefined, undefined, undefined, true, coordinator.endpoints, this.database.id);
167
175
  }
168
176
  // Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
169
177
  const databaseCoordinator = model_1.Device.byType('Coordinator', this.database.id)[0];
170
178
  if (databaseCoordinator.ieeeAddr !== coordinator.ieeeAddr) {
171
- debug.log(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`);
179
+ logger_1.logger.info(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`, NS);
172
180
  databaseCoordinator.changeIeeeAddress(coordinator.ieeeAddr);
173
181
  }
174
182
  // Set backup timer to 1 day.
@@ -243,7 +251,7 @@ class Controller extends events_1.default.EventEmitter {
243
251
  this.emit(Events.Events.permitJoinChanged, data);
244
252
  }
245
253
  else {
246
- debug.log('Disable joining');
254
+ logger_1.logger.debug('Disable joining', NS);
247
255
  await this.greenPower.permitJoin(0, null);
248
256
  await this.adapter.permitJoin(0, null);
249
257
  const data = { permitted: false, reason, timeout: this.permitJoinTimeout };
@@ -259,21 +267,28 @@ class Controller extends events_1.default.EventEmitter {
259
267
  isStopping() {
260
268
  return this.stopping;
261
269
  }
270
+ isAdapterDisconnected() {
271
+ return this.adapterDisconnected;
272
+ }
262
273
  async stop() {
263
274
  this.stopping = true;
264
- this.databaseSave();
265
275
  // Unregister adapter events
266
276
  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);
277
+ this.adapter.removeAllListeners(adapter_1.Events.Events.zclPayload);
269
278
  this.adapter.removeAllListeners(adapter_1.Events.Events.disconnected);
270
279
  this.adapter.removeAllListeners(adapter_1.Events.Events.deviceAnnounce);
271
280
  this.adapter.removeAllListeners(adapter_1.Events.Events.deviceLeave);
272
- await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
273
281
  clearInterval(this.backupTimer);
274
282
  clearInterval(this.databaseSaveTimer);
275
- await this.backup();
276
- await this.adapter.stop();
283
+ if (this.adapterDisconnected) {
284
+ this.databaseSave();
285
+ }
286
+ else {
287
+ await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
288
+ await this.backup(); // always calls databaseSave()
289
+ await this.adapter.stop();
290
+ this.adapterDisconnected = true;
291
+ }
277
292
  }
278
293
  databaseSave() {
279
294
  for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
@@ -287,13 +302,13 @@ class Controller extends events_1.default.EventEmitter {
287
302
  async backup() {
288
303
  this.databaseSave();
289
304
  if (this.options.backupPath && await this.adapter.supportsBackup()) {
290
- debug.log('Creating coordinator backup');
305
+ logger_1.logger.debug('Creating coordinator backup', NS);
291
306
  const backup = await this.adapter.backup(model_1.Device.all().map((d) => d.ieeeAddr));
292
307
  const unifiedBackup = await utils_1.BackupUtils.toUnifiedBackup(backup);
293
308
  const tmpBackupPath = this.options.backupPath + '.tmp';
294
309
  fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
295
310
  fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
296
- debug.log(`Wrote coordinator backup to '${this.options.backupPath}'`);
311
+ logger_1.logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
297
312
  }
298
313
  }
299
314
  async coordinatorCheck() {
@@ -363,6 +378,14 @@ class Controller extends events_1.default.EventEmitter {
363
378
  createGroup(groupID) {
364
379
  return group_1.default.create(groupID, this.database.id);
365
380
  }
381
+ /**
382
+ * Broadcast a network-wide channel change.
383
+ */
384
+ async changeChannel() {
385
+ logger_1.logger.info(`Broadcasting change channel to '${this.options.network.channelList[0]}'.`, NS);
386
+ await this.adapter.changeChannel(this.options.network.channelList[0]);
387
+ this.networkParametersCached = null; // invalidate cache
388
+ }
366
389
  /**
367
390
  * Set transmit power of the adapter
368
391
  */
@@ -370,15 +393,16 @@ class Controller extends events_1.default.EventEmitter {
370
393
  return this.adapter.setTransmitPower(value);
371
394
  }
372
395
  onNetworkAddress(payload) {
373
- debug.log(`Network address '${payload.ieeeAddr}'`);
396
+ logger_1.logger.debug(`Network address '${payload.ieeeAddr}'`, NS);
374
397
  const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
375
398
  if (!device) {
376
- debug.log(`Network address is from unknown device '${payload.ieeeAddr}'`);
399
+ logger_1.logger.debug(`Network address is from unknown device '${payload.ieeeAddr}'`, NS);
377
400
  return;
378
401
  }
402
+ device.updateLastSeen();
379
403
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'networkAddress' });
380
404
  if (device.networkAddress !== payload.networkAddress) {
381
- debug.log(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`);
405
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`, NS);
382
406
  device.networkAddress = payload.networkAddress;
383
407
  device.save();
384
408
  const data = { device };
@@ -386,17 +410,17 @@ class Controller extends events_1.default.EventEmitter {
386
410
  }
387
411
  }
388
412
  onDeviceAnnounce(payload) {
389
- debug.log(`Device announce '${payload.ieeeAddr}'`);
413
+ logger_1.logger.debug(`Device announce '${payload.ieeeAddr}'`, NS);
390
414
  const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
391
415
  if (!device) {
392
- debug.log(`Device announce is from unknown device '${payload.ieeeAddr}'`);
416
+ logger_1.logger.debug(`Device announce is from unknown device '${payload.ieeeAddr}'`, NS);
393
417
  return;
394
418
  }
395
419
  device.updateLastSeen();
396
420
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'deviceAnnounce' });
397
421
  device.implicitCheckin();
398
422
  if (device.networkAddress !== payload.networkAddress) {
399
- debug.log(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`);
423
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`, NS);
400
424
  device.networkAddress = payload.networkAddress;
401
425
  device.save();
402
426
  }
@@ -404,22 +428,25 @@ class Controller extends events_1.default.EventEmitter {
404
428
  this.selfAndDeviceEmit(device, Events.Events.deviceAnnounce, data);
405
429
  }
406
430
  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();
431
+ logger_1.logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
432
+ const device = payload.ieeeAddr ? model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : model_1.Device.byNetworkAddress(this.database.id, payload.networkAddress);
433
+ if (!device) {
434
+ logger_1.logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
435
+ return;
412
436
  }
413
- const data = { ieeeAddr: payload.ieeeAddr };
437
+ logger_1.logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
438
+ device.removeFromDatabase();
439
+ const data = { ieeeAddr: device.ieeeAddr };
414
440
  this.selfAndDeviceEmit(device, Events.Events.deviceLeave, data);
415
441
  }
416
442
  async onAdapterDisconnected() {
417
- debug.log(`Adapter disconnected'`);
443
+ logger_1.logger.debug(`Adapter disconnected`, NS);
444
+ this.adapterDisconnected = true;
418
445
  await catcho(() => this.adapter.stop(), 'Failed to stop adapter on disconnect');
419
446
  this.emit(Events.Events.adapterDisconnected);
420
447
  }
421
448
  async onDeviceJoinedGreenPower(payload) {
422
- debug.log(`Green power device '${JSON.stringify(payload)}' joined`);
449
+ logger_1.logger.debug(`Green power device '${JSON.stringify(payload)}' joined`, NS);
423
450
  // Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
424
451
  let ieeeAddr = payload.sourceID.toString(16);
425
452
  ieeeAddr = `0x${'0'.repeat(16 - ieeeAddr.length)}${ieeeAddr}`;
@@ -427,8 +454,8 @@ class Controller extends events_1.default.EventEmitter {
427
454
  const modelID = `GreenPower_${payload.deviceID}`;
428
455
  let device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr, true);
429
456
  if (!device) {
430
- debug.log(`New green power device '${ieeeAddr}' joined`);
431
- debug.log(`Creating device '${ieeeAddr}'`);
457
+ logger_1.logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
458
+ logger_1.logger.debug(`Creating device '${ieeeAddr}'`, NS);
432
459
  device = model_1.Device.create('GreenPower', ieeeAddr, payload.networkAddress, null, undefined, undefined, modelID, true, [], this.database.id);
433
460
  device.save();
434
461
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
@@ -436,7 +463,7 @@ class Controller extends events_1.default.EventEmitter {
436
463
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
437
464
  }
438
465
  else if (device.isDeleted) {
439
- debug.log(`Deleted green power device '${ieeeAddr}' joined`);
466
+ logger_1.logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
440
467
  device.undelete(true);
441
468
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
442
469
  const deviceInterviewPayload = { status: 'successful', device };
@@ -448,32 +475,31 @@ class Controller extends events_1.default.EventEmitter {
448
475
  this.emit(event, data);
449
476
  }
450
477
  async onDeviceJoined(payload) {
451
- debug.log(`Device '${payload.ieeeAddr}' joined`);
478
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
452
479
  if (this.options.acceptJoiningDeviceHandler) {
453
480
  if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
454
- debug.log(`Device '${payload.ieeeAddr}' rejected by handler, removing it`);
481
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
455
482
  await catcho(() => this.adapter.removeDevice(payload.networkAddress, payload.ieeeAddr), 'Failed to remove rejected device');
456
483
  return;
457
484
  }
458
485
  else {
459
- debug.log(`Device '${payload.ieeeAddr}' accepted by handler`);
486
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
460
487
  }
461
488
  }
462
489
  let device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
463
490
  if (!device) {
464
- debug.log(`New device '${payload.ieeeAddr}' joined`);
465
- debug.log(`Creating device '${payload.ieeeAddr}'`);
491
+ logger_1.logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
492
+ logger_1.logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
466
493
  device = model_1.Device.create('Unknown', payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, false, [], this.database.id);
467
494
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
468
495
  }
469
496
  else if (device.isDeleted) {
470
- debug.log(`Delete device '${payload.ieeeAddr}' joined, undeleting`);
497
+ logger_1.logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
471
498
  device.undelete();
472
499
  this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
473
500
  }
474
501
  if (device.networkAddress !== payload.networkAddress) {
475
- debug.log(`Device '${payload.ieeeAddr}' is already in database with different networkAddress, ` +
476
- `updating networkAddress`);
502
+ logger_1.logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
477
503
  device.networkAddress = payload.networkAddress;
478
504
  device.save();
479
505
  }
@@ -482,124 +508,156 @@ class Controller extends events_1.default.EventEmitter {
482
508
  device.implicitCheckin();
483
509
  if (!device.interviewCompleted && !device.interviewing) {
484
510
  const payloadStart = { status: 'started', device };
485
- debug.log(`Interview '${device.ieeeAddr}' start`);
511
+ logger_1.logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
486
512
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, payloadStart);
487
513
  try {
488
514
  await device.interview();
489
- debug.log(`Succesfully interviewed '${device.ieeeAddr}'`);
515
+ logger_1.logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
490
516
  const event = { status: 'successful', device };
491
517
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
492
518
  }
493
519
  catch (error) {
494
- debug.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`);
520
+ logger_1.logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
495
521
  const event = { status: 'failed', device };
496
522
  this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
497
523
  }
498
524
  }
499
525
  else {
500
- debug.log(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', ` +
501
- `in progress '${device.interviewing}'`);
526
+ logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', in progress '${device.interviewing}'`, NS);
502
527
  }
503
528
  }
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;
529
+ async onZclPayload(payload) {
530
+ let frame = undefined;
531
+ let device = undefined;
532
+ if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
533
+ // This is handled by touchlink
534
+ return;
511
535
  }
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;
536
+ else if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
537
+ try {
538
+ // Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
539
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
518
540
  }
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);
541
+ catch (error) {
542
+ logger_1.logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
543
+ return;
544
+ // <<<<<<< HEAD
545
+ // } else if (dataPayload.frame.Cluster.name === 'greenPower') {
546
+ // await this.greenPower.onZclGreenPowerData(dataPayload);
547
+ // // lookup encapsulated gpDevice for further processing
548
+ // gpDevice = Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
549
+ // }
550
+ // }
551
+ // let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
552
+ // ? Device.byIeeeAddr(this.database.id, dataPayload.address)
553
+ // : Device.byNetworkAddress(dataPayload.address, this.database.id));
554
+ // /**
555
+ // * Handling of re-transmitted Xiaomi messages.
556
+ // * https://github.com/Koenkk/zigbee2mqtt/issues/1238
557
+ // * https://github.com/Koenkk/zigbee2mqtt/issues/3592
558
+ // *
559
+ // * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
560
+ // * The network address of these message is set to the one of the Xiaomi router.
561
+ // * Therefore it looks like if the message came from the Xiaomi router, while in
562
+ // * fact it came from the end device.
563
+ // * Handling these message would result in false state updates.
564
+ // * The group ID attribute of these message defines the network address of the end device.
565
+ // */
566
+ // if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
567
+ // debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
568
+ // device = Device.byNetworkAddress(dataPayload.groupID, this.database.id);
569
+ // }
570
+ // =======
523
571
  }
572
+ await this.greenPower.onZclGreenPowerData(payload, frame);
573
+ // lookup encapsulated gpDevice for further processing
574
+ device = model_1.Device.byNetworkAddress(frame.payload.srcID & 0xffff, this.database.id);
524
575
  }
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);
576
+ else {
577
+ /**
578
+ * Handling of re-transmitted Xiaomi messages.
579
+ * https://github.com/Koenkk/zigbee2mqtt/issues/1238
580
+ * https://github.com/Koenkk/zigbee2mqtt/issues/3592
581
+ *
582
+ * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
583
+ * The network address of these message is set to the one of the Xiaomi router.
584
+ * Therefore it looks like if the message came from the Xiaomi router, while in
585
+ * fact it came from the end device.
586
+ * Handling these message would result in false state updates.
587
+ * The group ID attribute of these message defines the network address of the end device.
588
+ */
589
+ device = model_1.Device.find(this.database.id, payload.address);
590
+ if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && payload.groupID) {
591
+ logger_1.logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
592
+ device = model_1.Device.byNetworkAddress(this.database.id, payload.groupID);
593
+ }
594
+ try {
595
+ frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device?.customClusters);
596
+ }
597
+ catch (error) {
598
+ logger_1.logger.debug(`Failed to parse frame: ${error}`, NS);
599
+ }
543
600
  }
544
601
  if (!device) {
545
- debug.log(`'${dataType}' data is from unknown device with address '${dataPayload.address}', ` +
546
- `skipping...`);
602
+ logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
547
603
  return;
548
604
  }
605
+ logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, `
606
+ + `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, `
607
+ + `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
549
608
  device.updateLastSeen();
550
609
  //no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
551
- if (!this.isZclDataPayload(dataPayload, dataType) || !dataPayload.frame.isCluster("genPollCtrl")) {
610
+ if (!frame?.isCluster("genPollCtrl")) {
552
611
  device.implicitCheckin();
553
612
  }
554
- device.linkquality = dataPayload.linkquality;
555
- let endpoint = device.getEndpoint(dataPayload.endpoint);
613
+ device.linkquality = payload.linkquality;
614
+ let endpoint = device.getEndpoint(payload.endpoint);
556
615
  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);
616
+ logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with ` +
617
+ `network address '${payload.address}', creating it...`, NS);
618
+ endpoint = device.createEndpoint(payload.endpoint);
560
619
  }
561
620
  // Parse command for event
562
621
  let type = undefined;
563
622
  let data;
564
623
  let clusterName = undefined;
565
624
  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()) {
625
+ if (frame) {
626
+ const command = frame.command;
627
+ clusterName = frame.cluster.name;
628
+ meta.zclTransactionSequenceNumber = frame.header.transactionSequenceNumber;
629
+ meta.manufacturerCode = frame.header.manufacturerCode;
630
+ meta.frameControl = frame.header.frameControl;
631
+ if (frame.header.isGlobal) {
574
632
  if (frame.isCommand('report')) {
575
633
  type = 'attributeReport';
576
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
634
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
577
635
  }
578
636
  else if (frame.isCommand('read')) {
579
637
  type = 'read';
580
- data = helpers_1.ZclFrameConverter.attributeList(dataPayload.frame, device.manufacturerID);
638
+ data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
581
639
  }
582
640
  else if (frame.isCommand('write')) {
583
641
  type = 'write';
584
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
642
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
585
643
  }
586
644
  else {
587
645
  /* istanbul ignore else */
588
646
  if (frame.isCommand('readRsp')) {
589
647
  type = 'readResponse';
590
- data = helpers_1.ZclFrameConverter.attributeKeyValue(dataPayload.frame, device.manufacturerID);
648
+ data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
591
649
  }
592
650
  }
593
651
  }
594
652
  else {
595
653
  /* istanbul ignore else */
596
- if (frame.isSpecific()) {
654
+ if (frame.header.isSpecific) {
597
655
  if (Events.CommandsLookup[command.name]) {
598
656
  type = Events.CommandsLookup[command.name];
599
- data = dataPayload.frame.Payload;
657
+ data = frame.payload;
600
658
  }
601
659
  else {
602
- debug.log(`Skipping command '${command.name}' because it is missing from the lookup`);
660
+ logger_1.logger.debug(`Skipping command '${command.name}' because it is missing from the lookup`, NS);
603
661
  }
604
662
  }
605
663
  }
@@ -611,19 +669,19 @@ class Controller extends events_1.default.EventEmitter {
611
669
  property.set(value, device);
612
670
  }
613
671
  }
614
- endpoint.saveClusterAttributeKeyValue(frame.Cluster.ID, data);
672
+ endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
615
673
  }
616
674
  }
617
675
  else {
618
676
  type = 'raw';
619
- data = dataPayload.data;
620
- const name = zcl_1.Utils.getCluster(dataPayload.clusterID).name;
677
+ data = payload.data;
678
+ const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
621
679
  clusterName = Number.isNaN(Number(name)) ? name : Number(name);
622
680
  }
623
681
  if (type && data) {
624
- const endpoint = device.getEndpoint(dataPayload.endpoint);
625
- const linkquality = dataPayload.linkquality;
626
- const groupID = dataPayload.groupID;
682
+ const endpoint = device.getEndpoint(payload.endpoint);
683
+ const linkquality = payload.linkquality;
684
+ const groupID = payload.groupID;
627
685
  const eventData = {
628
686
  type: type, device, endpoint, data, linkquality, groupID, cluster: clusterName, meta
629
687
  };
@@ -633,8 +691,8 @@ class Controller extends events_1.default.EventEmitter {
633
691
  else {
634
692
  this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'messageNonEmitted' });
635
693
  }
636
- if (this.isZclDataPayload(dataPayload, dataType)) {
637
- await device.onZclData(dataPayload, endpoint);
694
+ if (frame) {
695
+ await device.onZclData(payload, frame, endpoint);
638
696
  }
639
697
  }
640
698
  }