@willieee802/zigbee-herdsman 0.36.0 → 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 (428) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +317 -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 +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/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 +0 -1
  79. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  80. package/dist/adapter/ezsp/adapter/backup.js +3 -7
  81. package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
  82. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +13 -10
  83. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  84. package/dist/adapter/ezsp/adapter/ezspAdapter.js +79 -72
  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 +1 -4
  90. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  91. package/dist/adapter/ezsp/driver/driver.js +101 -122
  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 +61 -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.js +2 -2
  106. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  107. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  108. package/dist/adapter/ezsp/driver/uart.js +46 -46
  109. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  110. package/dist/adapter/ezsp/driver/writer.js +3 -6
  111. package/dist/adapter/ezsp/driver/writer.js.map +1 -1
  112. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -1
  113. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
  114. package/dist/adapter/z-stack/adapter/adapter-backup.js +25 -29
  115. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
  116. package/dist/adapter/z-stack/adapter/endpoints.js +4 -4
  117. package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -1
  118. package/dist/adapter/z-stack/adapter/manager.d.ts +1 -4
  119. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  120. package/dist/adapter/z-stack/adapter/manager.js +52 -61
  121. package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
  122. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +12 -10
  123. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  124. package/dist/adapter/z-stack/adapter/zStackAdapter.js +92 -68
  125. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
  126. package/dist/adapter/z-stack/unpi/parser.js +6 -6
  127. package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
  128. package/dist/adapter/z-stack/unpi/writer.js +4 -7
  129. package/dist/adapter/z-stack/unpi/writer.js.map +1 -1
  130. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +4 -2
  131. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
  132. package/dist/adapter/z-stack/znp/buffaloZnp.js +154 -25
  133. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
  134. package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
  135. package/dist/adapter/z-stack/znp/definition.js +2 -1
  136. package/dist/adapter/z-stack/znp/definition.js.map +1 -1
  137. package/dist/adapter/z-stack/znp/tstype.d.ts +4 -3
  138. package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
  139. package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
  140. package/dist/adapter/z-stack/znp/znp.js +18 -25
  141. package/dist/adapter/z-stack/znp/znp.js.map +1 -1
  142. package/dist/adapter/z-stack/znp/zpiObject.js +2 -2
  143. package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
  144. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +13 -12
  145. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  146. package/dist/adapter/zigate/adapter/zigateAdapter.js +81 -90
  147. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
  148. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +7 -8
  149. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  150. package/dist/adapter/zigate/driver/buffaloZiGate.js +150 -100
  151. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  152. package/dist/adapter/zigate/driver/commandType.d.ts +2 -1
  153. package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
  154. package/dist/adapter/zigate/driver/commandType.js +56 -52
  155. package/dist/adapter/zigate/driver/commandType.js.map +1 -1
  156. package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
  157. package/dist/adapter/zigate/driver/frame.js +8 -8
  158. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  159. package/dist/adapter/zigate/driver/messageType.d.ts +2 -1
  160. package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -1
  161. package/dist/adapter/zigate/driver/messageType.js +113 -108
  162. package/dist/adapter/zigate/driver/messageType.js.map +1 -1
  163. package/dist/adapter/zigate/driver/parameterType.d.ts +8 -1
  164. package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -1
  165. package/dist/adapter/zigate/driver/parameterType.js +9 -0
  166. package/dist/adapter/zigate/driver/parameterType.js.map +1 -1
  167. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  168. package/dist/adapter/zigate/driver/ziGateObject.js +9 -9
  169. package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
  170. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  171. package/dist/adapter/zigate/driver/zigate.js +23 -31
  172. package/dist/adapter/zigate/driver/zigate.js.map +1 -1
  173. package/dist/buffalo/buffalo.d.ts +23 -19
  174. package/dist/buffalo/buffalo.d.ts.map +1 -1
  175. package/dist/buffalo/buffalo.js +74 -169
  176. package/dist/buffalo/buffalo.js.map +1 -1
  177. package/dist/buffalo/index.d.ts +1 -2
  178. package/dist/buffalo/index.d.ts.map +1 -1
  179. package/dist/buffalo/index.js +1 -26
  180. package/dist/buffalo/index.js.map +1 -1
  181. package/dist/controller/controller.d.ts +8 -5
  182. package/dist/controller/controller.d.ts.map +1 -1
  183. package/dist/controller/controller.js +181 -126
  184. package/dist/controller/controller.js.map +1 -1
  185. package/dist/controller/database.d.ts +1 -0
  186. package/dist/controller/database.d.ts.map +1 -1
  187. package/dist/controller/database.js +7 -10
  188. package/dist/controller/database.js.map +1 -1
  189. package/dist/controller/events.d.ts +2 -2
  190. package/dist/controller/events.d.ts.map +1 -1
  191. package/dist/controller/events.js +4 -0
  192. package/dist/controller/events.js.map +1 -1
  193. package/dist/controller/greenPower.d.ts +2 -1
  194. package/dist/controller/greenPower.d.ts.map +1 -1
  195. package/dist/controller/greenPower.js +51 -57
  196. package/dist/controller/greenPower.js.map +1 -1
  197. package/dist/controller/helpers/request.d.ts +3 -3
  198. package/dist/controller/helpers/request.d.ts.map +1 -1
  199. package/dist/controller/helpers/request.js +2 -2
  200. package/dist/controller/helpers/request.js.map +1 -1
  201. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  202. package/dist/controller/helpers/requestQueue.js +26 -36
  203. package/dist/controller/helpers/requestQueue.js.map +1 -1
  204. package/dist/controller/helpers/zclFrameConverter.d.ts +4 -3
  205. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  206. package/dist/controller/helpers/zclFrameConverter.js +33 -14
  207. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  208. package/dist/controller/model/device.d.ts +12 -5
  209. package/dist/controller/model/device.d.ts.map +1 -1
  210. package/dist/controller/model/device.js +105 -86
  211. package/dist/controller/model/device.js.map +1 -1
  212. package/dist/controller/model/endpoint.d.ts +22 -17
  213. package/dist/controller/model/endpoint.d.ts.map +1 -1
  214. package/dist/controller/model/endpoint.js +139 -228
  215. package/dist/controller/model/endpoint.js.map +1 -1
  216. package/dist/controller/model/group.d.ts +1 -1
  217. package/dist/controller/model/group.d.ts.map +1 -1
  218. package/dist/controller/model/group.js +18 -18
  219. package/dist/controller/model/group.js.map +1 -1
  220. package/dist/controller/touchlink.js +25 -28
  221. package/dist/controller/touchlink.js.map +1 -1
  222. package/dist/index.d.ts +5 -3
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +8 -5
  225. package/dist/index.js.map +1 -1
  226. package/dist/utils/logger.d.ts +9 -0
  227. package/dist/utils/logger.d.ts.map +1 -0
  228. package/dist/utils/logger.js +14 -0
  229. package/dist/utils/logger.js.map +1 -0
  230. package/dist/zspec/consts.d.ts +60 -0
  231. package/dist/zspec/consts.d.ts.map +1 -0
  232. package/dist/zspec/consts.js +64 -0
  233. package/dist/zspec/consts.js.map +1 -0
  234. package/dist/zspec/enums.d.ts +19 -0
  235. package/dist/zspec/enums.d.ts.map +1 -0
  236. package/dist/zspec/enums.js +28 -0
  237. package/dist/zspec/enums.js.map +1 -0
  238. package/dist/zspec/index.d.ts +4 -0
  239. package/dist/zspec/index.d.ts.map +1 -0
  240. package/dist/zspec/index.js +43 -0
  241. package/dist/zspec/index.js.map +1 -0
  242. package/dist/zspec/tstypes.d.ts +19 -0
  243. package/dist/zspec/tstypes.d.ts.map +1 -0
  244. package/dist/{buffalo/tstype.js → zspec/tstypes.js} +1 -1
  245. package/dist/zspec/tstypes.js.map +1 -0
  246. package/dist/zspec/utils.d.ts +14 -0
  247. package/dist/zspec/utils.d.ts.map +1 -0
  248. package/dist/zspec/utils.js +29 -0
  249. package/dist/zspec/utils.js.map +1 -0
  250. package/dist/zspec/zcl/buffaloZcl.d.ts +55 -0
  251. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
  252. package/dist/zspec/zcl/buffaloZcl.js +929 -0
  253. package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
  254. package/dist/zspec/zcl/definition/cluster.d.ts +3 -0
  255. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
  256. package/dist/zspec/zcl/definition/cluster.js +5500 -0
  257. package/dist/zspec/zcl/definition/cluster.js.map +1 -0
  258. package/dist/zspec/zcl/definition/consts.d.ts +9 -0
  259. package/dist/zspec/zcl/definition/consts.d.ts.map +1 -0
  260. package/dist/zspec/zcl/definition/consts.js +27 -0
  261. package/dist/zspec/zcl/definition/consts.js.map +1 -0
  262. package/dist/zspec/zcl/definition/enums.d.ts +177 -0
  263. package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
  264. package/dist/zspec/zcl/definition/enums.js +187 -0
  265. package/dist/zspec/zcl/definition/enums.js.map +1 -0
  266. package/dist/zspec/zcl/definition/foundation.d.ts +11 -0
  267. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
  268. package/dist/zspec/zcl/definition/foundation.js +241 -0
  269. package/dist/zspec/zcl/definition/foundation.js.map +1 -0
  270. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +727 -0
  271. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
  272. package/dist/zspec/zcl/definition/manufacturerCode.js +733 -0
  273. package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -0
  274. package/dist/zspec/zcl/definition/status.d.ts +69 -0
  275. package/dist/zspec/zcl/definition/status.d.ts.map +1 -0
  276. package/dist/zspec/zcl/definition/status.js +74 -0
  277. package/dist/zspec/zcl/definition/status.js.map +1 -0
  278. package/dist/zspec/zcl/definition/tstype.d.ts +114 -0
  279. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
  280. package/dist/{zcl/zclHeader.js → zspec/zcl/definition/tstype.js} +2 -1
  281. package/dist/zspec/zcl/definition/tstype.js.map +1 -0
  282. package/dist/zspec/zcl/index.d.ts +11 -0
  283. package/dist/zspec/zcl/index.d.ts.map +1 -0
  284. package/dist/zspec/zcl/index.js +47 -0
  285. package/dist/zspec/zcl/index.js.map +1 -0
  286. package/dist/zspec/zcl/utils.d.ts +7 -0
  287. package/dist/zspec/zcl/utils.d.ts.map +1 -0
  288. package/dist/zspec/zcl/utils.js +234 -0
  289. package/dist/zspec/zcl/utils.js.map +1 -0
  290. package/dist/zspec/zcl/zclFrame.d.ts +36 -0
  291. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
  292. package/dist/zspec/zcl/zclFrame.js +304 -0
  293. package/dist/zspec/zcl/zclFrame.js.map +1 -0
  294. package/dist/zspec/zcl/zclHeader.d.ts +17 -0
  295. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
  296. package/dist/zspec/zcl/zclHeader.js +88 -0
  297. package/dist/zspec/zcl/zclHeader.js.map +1 -0
  298. package/dist/zspec/zcl/zclStatusError.d.ts +6 -0
  299. package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -0
  300. package/dist/zspec/zcl/zclStatusError.js +13 -0
  301. package/dist/zspec/zcl/zclStatusError.js.map +1 -0
  302. package/dist/zspec/zdo/buffaloZdo.d.ts +438 -0
  303. package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
  304. package/dist/zspec/zdo/buffaloZdo.js +1892 -0
  305. package/dist/zspec/zdo/buffaloZdo.js.map +1 -0
  306. package/dist/zspec/zdo/definition/clusters.d.ts +624 -0
  307. package/dist/zspec/zdo/definition/clusters.d.ts.map +1 -0
  308. package/dist/zspec/zdo/definition/clusters.js +687 -0
  309. package/dist/zspec/zdo/definition/clusters.js.map +1 -0
  310. package/dist/zspec/zdo/definition/consts.d.ts +13 -0
  311. package/dist/zspec/zdo/definition/consts.d.ts.map +1 -0
  312. package/dist/zspec/zdo/definition/consts.js +16 -0
  313. package/dist/zspec/zdo/definition/consts.js.map +1 -0
  314. package/dist/zspec/zdo/definition/enums.d.ts +75 -0
  315. package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
  316. package/dist/zspec/zdo/definition/enums.js +97 -0
  317. package/dist/zspec/zdo/definition/enums.js.map +1 -0
  318. package/dist/zspec/zdo/definition/status.d.ts +99 -0
  319. package/dist/zspec/zdo/definition/status.d.ts.map +1 -0
  320. package/dist/zspec/zdo/definition/status.js +109 -0
  321. package/dist/zspec/zdo/definition/status.js.map +1 -0
  322. package/dist/zspec/zdo/definition/tstypes.d.ts +787 -0
  323. package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
  324. package/dist/{zcl/definition/tstype.js → zspec/zdo/definition/tstypes.js} +1 -1
  325. package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
  326. package/dist/zspec/zdo/index.d.ts +7 -0
  327. package/dist/zspec/zdo/index.d.ts.map +1 -0
  328. package/dist/zspec/zdo/index.js +39 -0
  329. package/dist/zspec/zdo/index.js.map +1 -0
  330. package/dist/zspec/zdo/utils.d.ts +25 -0
  331. package/dist/zspec/zdo/utils.d.ts.map +1 -0
  332. package/dist/zspec/zdo/utils.js +75 -0
  333. package/dist/zspec/zdo/utils.js.map +1 -0
  334. package/dist/zspec/zdo/zdoStatusError.d.ts +6 -0
  335. package/dist/zspec/zdo/zdoStatusError.d.ts.map +1 -0
  336. package/dist/zspec/zdo/zdoStatusError.js +13 -0
  337. package/dist/zspec/zdo/zdoStatusError.js.map +1 -0
  338. package/examples/join-and-log.js +7 -12
  339. package/package.json +5 -5
  340. package/dist/adapter/zigate/debug.d.ts +0 -8
  341. package/dist/adapter/zigate/debug.d.ts.map +0 -1
  342. package/dist/adapter/zigate/debug.js +0 -20
  343. package/dist/adapter/zigate/debug.js.map +0 -1
  344. package/dist/buffalo/tstype.d.ts +0 -9
  345. package/dist/buffalo/tstype.d.ts.map +0 -1
  346. package/dist/buffalo/tstype.js.map +0 -1
  347. package/dist/controller/logger-stub.d.ts +0 -7
  348. package/dist/controller/logger-stub.d.ts.map +0 -1
  349. package/dist/controller/logger-stub.js +0 -3
  350. package/dist/controller/logger-stub.js.map +0 -1
  351. package/dist/zcl/buffaloZcl.d.ts +0 -42
  352. package/dist/zcl/buffaloZcl.d.ts.map +0 -1
  353. package/dist/zcl/buffaloZcl.js +0 -595
  354. package/dist/zcl/buffaloZcl.js.map +0 -1
  355. package/dist/zcl/definition/buffaloZclDataType.d.ts +0 -18
  356. package/dist/zcl/definition/buffaloZclDataType.d.ts.map +0 -1
  357. package/dist/zcl/definition/buffaloZclDataType.js +0 -21
  358. package/dist/zcl/definition/buffaloZclDataType.js.map +0 -1
  359. package/dist/zcl/definition/cluster.d.ts +0 -30
  360. package/dist/zcl/definition/cluster.d.ts.map +0 -1
  361. package/dist/zcl/definition/cluster.js +0 -5531
  362. package/dist/zcl/definition/cluster.js.map +0 -1
  363. package/dist/zcl/definition/dataType.d.ts +0 -60
  364. package/dist/zcl/definition/dataType.d.ts.map +0 -1
  365. package/dist/zcl/definition/dataType.js +0 -65
  366. package/dist/zcl/definition/dataType.js.map +0 -1
  367. package/dist/zcl/definition/direction.d.ts +0 -6
  368. package/dist/zcl/definition/direction.d.ts.map +0 -1
  369. package/dist/zcl/definition/direction.js +0 -9
  370. package/dist/zcl/definition/direction.js.map +0 -1
  371. package/dist/zcl/definition/endpointDeviceType.d.ts +0 -5
  372. package/dist/zcl/definition/endpointDeviceType.d.ts.map +0 -1
  373. package/dist/zcl/definition/endpointDeviceType.js +0 -16
  374. package/dist/zcl/definition/endpointDeviceType.js.map +0 -1
  375. package/dist/zcl/definition/foundation.d.ts +0 -12
  376. package/dist/zcl/definition/foundation.d.ts.map +0 -1
  377. package/dist/zcl/definition/foundation.js +0 -168
  378. package/dist/zcl/definition/foundation.js.map +0 -1
  379. package/dist/zcl/definition/frameControl.d.ts +0 -11
  380. package/dist/zcl/definition/frameControl.d.ts.map +0 -1
  381. package/dist/zcl/definition/frameControl.js +0 -3
  382. package/dist/zcl/definition/frameControl.js.map +0 -1
  383. package/dist/zcl/definition/frameType.d.ts +0 -6
  384. package/dist/zcl/definition/frameType.d.ts.map +0 -1
  385. package/dist/zcl/definition/frameType.js +0 -9
  386. package/dist/zcl/definition/frameType.js.map +0 -1
  387. package/dist/zcl/definition/index.d.ts +0 -14
  388. package/dist/zcl/definition/index.d.ts.map +0 -1
  389. package/dist/zcl/definition/index.js +0 -52
  390. package/dist/zcl/definition/index.js.map +0 -1
  391. package/dist/zcl/definition/manufacturerCode.d.ts +0 -1078
  392. package/dist/zcl/definition/manufacturerCode.d.ts.map +0 -1
  393. package/dist/zcl/definition/manufacturerCode.js +0 -1083
  394. package/dist/zcl/definition/manufacturerCode.js.map +0 -1
  395. package/dist/zcl/definition/powerSource.d.ts +0 -5
  396. package/dist/zcl/definition/powerSource.d.ts.map +0 -1
  397. package/dist/zcl/definition/powerSource.js +0 -13
  398. package/dist/zcl/definition/powerSource.js.map +0 -1
  399. package/dist/zcl/definition/status.d.ts +0 -39
  400. package/dist/zcl/definition/status.d.ts.map +0 -1
  401. package/dist/zcl/definition/status.js +0 -42
  402. package/dist/zcl/definition/status.js.map +0 -1
  403. package/dist/zcl/definition/tstype.d.ts +0 -17
  404. package/dist/zcl/definition/tstype.d.ts.map +0 -1
  405. package/dist/zcl/definition/tstype.js.map +0 -1
  406. package/dist/zcl/index.d.ts +0 -17
  407. package/dist/zcl/index.d.ts.map +0 -1
  408. package/dist/zcl/index.js +0 -56
  409. package/dist/zcl/index.js.map +0 -1
  410. package/dist/zcl/tstype.d.ts +0 -57
  411. package/dist/zcl/tstype.d.ts.map +0 -1
  412. package/dist/zcl/tstype.js +0 -10
  413. package/dist/zcl/tstype.js.map +0 -1
  414. package/dist/zcl/utils.d.ts +0 -7
  415. package/dist/zcl/utils.d.ts.map +0 -1
  416. package/dist/zcl/utils.js +0 -165
  417. package/dist/zcl/utils.js.map +0 -1
  418. package/dist/zcl/zclFrame.d.ts +0 -41
  419. package/dist/zcl/zclFrame.d.ts.map +0 -1
  420. package/dist/zcl/zclFrame.js +0 -352
  421. package/dist/zcl/zclFrame.js.map +0 -1
  422. package/dist/zcl/zclHeader.d.ts +0 -9
  423. package/dist/zcl/zclHeader.d.ts.map +0 -1
  424. package/dist/zcl/zclHeader.js.map +0 -1
  425. package/dist/zcl/zclStatusError.d.ts +0 -6
  426. package/dist/zcl/zclStatusError.d.ts.map +0 -1
  427. package/dist/zcl/zclStatusError.js +0 -15
  428. package/dist/zcl/zclStatusError.js.map +0 -1
@@ -1,19 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.EmberAdapter = void 0;
7
30
  /* istanbul ignore file */
8
- const debug_1 = __importDefault(require("debug"));
9
31
  const es6_1 = __importDefault(require("fast-deep-equal/es6"));
10
32
  const mz_1 = require("mz");
11
33
  const serialPortUtils_1 = __importDefault(require("../../serialPortUtils"));
12
34
  const socketPortUtils_1 = __importDefault(require("../../socketPortUtils"));
13
35
  const utils_1 = require("../../../utils");
14
36
  const __1 = require("../..");
15
- const zcl_1 = require("../../../zcl");
16
- const cluster_1 = __importDefault(require("../../../zcl/definition/cluster"));
37
+ const Zcl = __importStar(require("../../../zspec/zcl"));
17
38
  const events_1 = require("../../events");
18
39
  const math_1 = require("../utils/math");
19
40
  const ezsp_1 = require("../ezsp/ezsp");
@@ -28,7 +49,9 @@ const endpoints_1 = require("./endpoints");
28
49
  const initters_1 = require("../utils/initters");
29
50
  const crypto_1 = require("crypto");
30
51
  const oneWaitress_1 = require("./oneWaitress");
31
- const debug = (0, debug_1.default)('zigbee-herdsman:adapter:ember:adapter');
52
+ const logger_1 = require("../../../utils/logger");
53
+ // import {EmberTokensManager} from "./tokensManager";
54
+ const NS = 'zh:ember';
32
55
  /** Enum to pass strings from numbers up to Z2M. */
33
56
  var RoutingTableStatus;
34
57
  (function (RoutingTableStatus) {
@@ -42,15 +65,6 @@ var RoutingTableStatus;
42
65
  RoutingTableStatus[RoutingTableStatus["RESERVED3"] = 7] = "RESERVED3";
43
66
  })(RoutingTableStatus || (RoutingTableStatus = {}));
44
67
  ;
45
- /** Events specific to OneWaitress usage. */
46
- var OneWaitressEvents;
47
- (function (OneWaitressEvents) {
48
- OneWaitressEvents["STACK_STATUS_NETWORK_UP"] = "STACK_STATUS_NETWORK_UP";
49
- OneWaitressEvents["STACK_STATUS_NETWORK_DOWN"] = "STACK_STATUS_NETWORK_DOWN";
50
- OneWaitressEvents["STACK_STATUS_NETWORK_OPENED"] = "STACK_STATUS_NETWORK_OPENED";
51
- OneWaitressEvents["STACK_STATUS_NETWORK_CLOSED"] = "STACK_STATUS_NETWORK_CLOSED";
52
- })(OneWaitressEvents || (OneWaitressEvents = {}));
53
- ;
54
68
  var NetworkInitAction;
55
69
  (function (NetworkInitAction) {
56
70
  /** Ain't that nice! */
@@ -116,11 +130,15 @@ const BACKUP_OLDEST_SUPPORTED_EZSP_VERSION = 12;
116
130
  const BROADCAST_NETWORK_KEY_SWITCH_WAIT_TIME = 15000;
117
131
  /**
118
132
  * Stack configuration values for various supported stacks.
133
+ *
134
+ * https://github.com/darkxst/silabs-firmware-builder/tree/main/manifests
135
+ * https://github.com/NabuCasa/silabs-firmware/wiki/Zigbee-EmberZNet-NCP-firmware-configuration#skyconnect
136
+ * https://github.com/SiliconLabs/UnifySDK/blob/main/applications/zigbeed/project_files/zigbeed.slcp
119
137
  */
120
138
  const STACK_CONFIGS = {
121
139
  "default": {
122
140
  /** <1-250> (Default: 2) @see EzspConfigId.ADDRESS_TABLE_SIZE */
123
- ADDRESS_TABLE_SIZE: 16, // zigpc: 32, darkxst: 16
141
+ ADDRESS_TABLE_SIZE: 16, // zigpc: 32, darkxst: 16, nabucasa: 16
124
142
  /** <0-4> (Default: 2) @see EzspConfigId.TRUST_CENTER_ADDRESS_CACHE_SIZE */
125
143
  TRUST_CENTER_ADDRESS_CACHE_SIZE: 2,
126
144
  /** (Default: USE_TOKEN) @see EzspConfigId.TX_POWER_MODE */
@@ -132,7 +150,7 @@ const STACK_CONFIGS = {
132
150
  /** <-> (Default: ) @see EzspConfigId.SECURITY_LEVEL */
133
151
  SECURITY_LEVEL: consts_2.SECURITY_LEVEL_Z3,
134
152
  /** (Default: KEEP_ALIVE_SUPPORT_ALL) @see EzspValueId.END_DEVICE_KEEP_ALIVE_SUPPORT_MODE */
135
- END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL, // zigpc: KEEP_ALIVE_SUPPORT_ALL
153
+ END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL,
136
154
  /** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE */
137
155
  MAXIMUM_INCOMING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
138
156
  /** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE */
@@ -140,27 +158,27 @@ const STACK_CONFIGS = {
140
158
  /** <-> (Default: 10000) @see EzspValueId.TRANSIENT_DEVICE_TIMEOUT */
141
159
  TRANSIENT_DEVICE_TIMEOUT: 10000,
142
160
  /** <0-127> (Default: 2) @see EzspConfigId.BINDING_TABLE_SIZE */
143
- BINDING_TABLE_SIZE: 5, // zigpc: 2, Z3GatewayGPCombo: 5
161
+ BINDING_TABLE_SIZE: 32, // zigpc: 2, Z3GatewayGPCombo: 5, nabucasa: 32
144
162
  /** <0-127> (Default: 0) @see EzspConfigId.KEY_TABLE_SIZE */
145
163
  KEY_TABLE_SIZE: 0, // zigpc: 4
146
164
  /** <6-64> (Default: 6) @see EzspConfigId.MAX_END_DEVICE_CHILDREN */
147
- MAX_END_DEVICE_CHILDREN: 6, // zigpc: 6
165
+ MAX_END_DEVICE_CHILDREN: 32, // zigpc: 6, nabucasa: 32, Dongle-E (Sonoff firmware): 32
148
166
  /** <1-255> (Default: 10) @see EzspConfigId.APS_UNICAST_MESSAGE_COUNT */
149
- APS_UNICAST_MESSAGE_COUNT: 20, // zigpc: 10, darkxst: 20
167
+ APS_UNICAST_MESSAGE_COUNT: 32, // zigpc: 10, darkxst: 20, nabucasa: 20
150
168
  /** <15-254> (Default: 15) @see EzspConfigId.BROADCAST_TABLE_SIZE */
151
169
  BROADCAST_TABLE_SIZE: 15, // zigpc: 15, Z3GatewayGPCombo: 35 - NOTE: Sonoff Dongle-E fails at 35
152
170
  /** [1, 16, 26] (Default: 16). @see EzspConfigId.NEIGHBOR_TABLE_SIZE */
153
- NEIGHBOR_TABLE_SIZE: 26, // zigpc: 16, darkxst: 26
171
+ NEIGHBOR_TABLE_SIZE: 26, // zigpc: 16, darkxst: 26, nabucasa: 26
154
172
  /** (Default: 8) @see EzspConfigId.END_DEVICE_POLL_TIMEOUT */
155
173
  END_DEVICE_POLL_TIMEOUT: 8, // zigpc: 8
156
174
  /** <0-65535> (Default: 300) @see EzspConfigId.TRANSIENT_KEY_TIMEOUT_S */
157
175
  TRANSIENT_KEY_TIMEOUT_S: 300, // zigpc: 65535
158
176
  /** <-> (Default: 16) @see EzspConfigId.RETRY_QUEUE_SIZE */
159
- RETRY_QUEUE_SIZE: 16,
177
+ RETRY_QUEUE_SIZE: 16, // nabucasa: 16
160
178
  /** <0-255> (Default: 0) @see EzspConfigId.SOURCE_ROUTE_TABLE_SIZE */
161
- SOURCE_ROUTE_TABLE_SIZE: 200, // Z3GatewayGPCombo: 100, darkxst: 200
179
+ SOURCE_ROUTE_TABLE_SIZE: 200, // Z3GatewayGPCombo: 100, darkxst: 200, nabucasa: 200
162
180
  /** <1-250> (Default: 8) @see EzspConfigId.MULTICAST_TABLE_SIZE */
163
- MULTICAST_TABLE_SIZE: 16, // darkxst: 16
181
+ MULTICAST_TABLE_SIZE: 16, // darkxst: 16, nabucasa: 16 - NOTE: should always be at least enough to register FIXED_ENDPOINTS multicastIds
164
182
  },
165
183
  "zigbeed": {
166
184
  ADDRESS_TABLE_SIZE: 128,
@@ -184,18 +202,17 @@ const STACK_CONFIGS = {
184
202
  RETRY_QUEUE_SIZE: 16,
185
203
  SOURCE_ROUTE_TABLE_SIZE: 254,
186
204
  MULTICAST_TABLE_SIZE: 128,
187
- /*
188
- ROUTE_TABLE_SIZE: 254,
189
- DISCOVERY_TABLE_SIZE: 64,
190
- PACKET_BUFFER_COUNT: 255,
191
- CUSTOM_MAC_FILTER_TABLE_SIZE: 64,
192
- MAC_FILTER_TABLE_SIZE: 32,
193
- CHILD_TABLE_SIZE: 64,
194
- PLUGIN_ZIGBEE_PRO_STACK_CHILD_TABLE_SIZE: 64,
195
- APS_MESSAGE_COUNT: 64,
196
- */
197
205
  },
198
206
  };
207
+ /**
208
+ * NOTE: This from SDK is currently ignored here because of issues in below links:
209
+ * - BUGZID 12261: Concentrators use MTORRs for route discovery and should not enable route discovery in the APS options.
210
+ * - https://community.silabs.com/s/question/0D58Y00008DRfDCSA1/coordinator-cant-send-unicast-to-sleepy-node-after-reboot
211
+ * - https://community.silabs.com/s/question/0D58Y0000B4nTb7SQE/largedense-network-communication-problem-source-route-table-not-big-enough
212
+ *
213
+ * Removing `ENABLE_ROUTE_DISCOVERY` leads to devices that won't reconnect/go offline, and various other issues. Keeping it for now.
214
+ */
215
+ const DEFAULT_APS_OPTIONS = (enums_2.EmberApsOption.RETRY | enums_2.EmberApsOption.ENABLE_ROUTE_DISCOVERY | enums_2.EmberApsOption.ENABLE_ADDRESS_DISCOVERY);
199
216
  /**
200
217
  * Enabling this allows to immediately reject requests that won't be able to get to their destination.
201
218
  * However, it causes more NCP calls, notably to get the source route overhead.
@@ -210,12 +227,25 @@ const DEFAULT_ZCL_REQUEST_TIMEOUT = 15000; //msec
210
227
  const DEFAULT_NETWORK_REQUEST_TIMEOUT = 10000; // nothing on the network to bother requests, should be much faster than this
211
228
  /** Time between watchdog counters reading/clearing */
212
229
  const WATCHDOG_COUNTERS_FEED_INTERVAL = 3600000; // every hour...
230
+ /** Default manufacturer code reported by coordinator. */
231
+ const DEFAULT_MANUFACTURER_CODE = Zcl.ManufacturerCode.SILICON_LABORATORIES;
232
+ /**
233
+ * Workaround for devices that require a specific manufacturer code to be reported by coordinator while interviewing...
234
+ * - Lumi/Aqara devices do not work properly otherwise (missing features): https://github.com/Koenkk/zigbee2mqtt/issues/9274
235
+ */
236
+ const WORKAROUND_JOIN_MANUF_IEEE_PREFIX_TO_CODE = {
237
+ // NOTE: Lumi has a new prefix registered since 2021, in case they start using that one with new devices, it might need to be added here too...
238
+ // "0x18c23c" https://maclookup.app/vendors/lumi-united-technology-co-ltd
239
+ "0x54ef44": Zcl.ManufacturerCode.LUMI_UNITED_TECHOLOGY_LTD_SHENZHEN,
240
+ };
213
241
  /**
214
242
  * Relay calls between Z2M and EZSP-layer and handle any error that might occur via queue & waitress.
215
243
  *
216
244
  * Anything post `start` that requests anything from the EZSP layer must run through the request queue for proper execution flow.
217
245
  */
218
246
  class EmberAdapter extends __1.Adapter {
247
+ /** Current manufacturer code assigned to the coordinator. Used for join workarounds... */
248
+ manufacturerCode;
219
249
  /** Key in STACK_CONFIGS */
220
250
  stackConfig;
221
251
  /** EMBER_LOW_RAM_CONCENTRATOR or EMBER_HIGH_RAM_CONCENTRATOR. */
@@ -238,19 +268,15 @@ class EmberAdapter extends __1.Adapter {
238
268
  * NOTE: Do not use directly, use getter functions for it that check if valid or need retrieval from NCP.
239
269
  */
240
270
  networkCache;
241
- defaultApsOptions;
242
- /**
243
- * Mirrors the NCP multicast table. null === not in use.
244
- * Index 0 is Green Power and must always remain there.
245
- */
246
- multicastTable;
247
- constructor(networkOptions, serialPortOptions, backupPath, adapterOptions, logger) {
248
- super(networkOptions, serialPortOptions, backupPath, adapterOptions, logger);
249
- // TODO config, should be fine like this for now?
250
- this.stackConfig = socketPortUtils_1.default.isTcpPath(serialPortOptions.path) ? 'zigbeed' : 'default';
271
+ constructor(networkOptions, serialPortOptions, backupPath, adapterOptions) {
272
+ super(networkOptions, serialPortOptions, backupPath, adapterOptions);
273
+ // TODO config
274
+ // XXX: 'zigbeed': 4.4.x/7.4.x not supported by multiprotocol at the moment, will need refactoring when/if support is added
275
+ this.stackConfig = 'default';
251
276
  // TODO config
252
277
  this.concentratorType = consts_2.EMBER_HIGH_RAM_CONCENTRATOR;
253
278
  const delay = (typeof this.adapterOptions.delay === 'number') ? Math.min(Math.max(this.adapterOptions.delay, 5), 60) : 5;
279
+ logger_1.logger.debug(`Using delay=${delay}.`, NS);
254
280
  this.requestQueue = new requestQueue_1.EmberRequestQueue(delay);
255
281
  this.oneWaitress = new oneWaitress_1.EmberOneWaitress();
256
282
  this.zdoRequestBuffalo = new buffalo_1.EzspBuffalo(Buffer.alloc(consts_1.EZSP_MAX_FRAME_LENGTH));
@@ -273,36 +299,34 @@ class EmberAdapter extends __1.Adapter {
273
299
  this.clearNetworkCache();
274
300
  switch (status) {
275
301
  case enums_2.EmberStatus.NETWORK_UP: {
276
- this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_UP);
277
- console.log(`[STACK STATUS] Network up.`);
302
+ this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP);
303
+ logger_1.logger.info(`[STACK STATUS] Network up.`, NS);
278
304
  break;
279
305
  }
280
306
  case enums_2.EmberStatus.NETWORK_DOWN: {
281
- this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_DOWN);
282
- console.log(`[STACK STATUS] Network down.`);
307
+ this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN);
308
+ logger_1.logger.info(`[STACK STATUS] Network down.`, NS);
283
309
  break;
284
310
  }
285
311
  case enums_2.EmberStatus.NETWORK_OPENED: {
286
- this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_OPENED);
287
- this.requestQueue.enqueue(async () => {
288
- const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY));
289
- if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
290
- console.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`);
291
- return enums_2.EmberStatus.ERR_FATAL;
292
- }
293
- return enums_2.EmberStatus.SUCCESS;
294
- }, console.error, // no reject, just log error if any
295
- true);
296
- console.log(`[STACK STATUS] Network opened.`);
312
+ this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_OPENED);
313
+ logger_1.logger.info(`[STACK STATUS] Network opened.`, NS);
297
314
  break;
298
315
  }
299
316
  case enums_2.EmberStatus.NETWORK_CLOSED: {
300
- this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_CLOSED);
301
- console.log(`[STACK STATUS] Network closed.`);
317
+ this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_CLOSED);
318
+ logger_1.logger.info(`[STACK STATUS] Network closed.`, NS);
319
+ break;
320
+ }
321
+ case enums_2.EmberStatus.CHANNEL_CHANGED: {
322
+ this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED);
323
+ // invalidate cache
324
+ this.networkCache.parameters.radioChannel = consts_2.INVALID_RADIO_CHANNEL;
325
+ logger_1.logger.info(`[STACK STATUS] Channel changed.`, NS);
302
326
  break;
303
327
  }
304
328
  default: {
305
- debug(`[STACK STATUS] ${enums_2.EmberStatus[status]}.`);
329
+ logger_1.logger.debug(`[STACK STATUS] ${enums_2.EmberStatus[status]}.`, NS);
306
330
  break;
307
331
  }
308
332
  }
@@ -323,8 +347,8 @@ class EmberAdapter extends __1.Adapter {
323
347
  case enums_2.EmberOutgoingMessageType.MULTICAST:
324
348
  case enums_2.EmberOutgoingMessageType.MULTICAST_WITH_ALIAS: {
325
349
  // BC/MC not checking for message sent, avoid unnecessary waitress lookups
326
- console.error(`Delivery of ${enums_2.EmberOutgoingMessageType[type]} failed for "${indexOrDestination}" `
327
- + `[apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`);
350
+ logger_1.logger.error(`Delivery of ${enums_2.EmberOutgoingMessageType[type]} failed for "${indexOrDestination}" `
351
+ + `[apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
328
352
  break;
329
353
  }
330
354
  default: {
@@ -368,32 +392,19 @@ class EmberAdapter extends __1.Adapter {
368
392
  * @param messageContents
369
393
  */
370
394
  async onIncomingMessage(type, apsFrame, lastHopLqi, sender, messageContents) {
371
- try {
372
- const payload = {
373
- address: sender,
374
- frame: zcl_1.ZclFrame.fromBuffer(apsFrame.clusterId, messageContents),
375
- endpoint: apsFrame.sourceEndpoint,
376
- linkquality: lastHopLqi,
377
- groupID: apsFrame.groupId,
378
- wasBroadcast: ((type === enums_2.EmberIncomingMessageType.BROADCAST) || (type === enums_2.EmberIncomingMessageType.BROADCAST_LOOPBACK)),
379
- destinationEndpoint: apsFrame.destinationEndpoint,
380
- };
381
- this.oneWaitress.resolveZCL(payload);
382
- this.emit(events_1.Events.zclData, payload);
383
- }
384
- catch (error) {
385
- const payload = {
386
- clusterID: apsFrame.clusterId,
387
- address: sender,
388
- data: messageContents,
389
- endpoint: apsFrame.sourceEndpoint,
390
- linkquality: lastHopLqi,
391
- groupID: apsFrame.groupId,
392
- wasBroadcast: ((type === enums_2.EmberIncomingMessageType.BROADCAST) || (type === enums_2.EmberIncomingMessageType.BROADCAST_LOOPBACK)),
393
- destinationEndpoint: apsFrame.destinationEndpoint,
394
- };
395
- this.emit(events_1.Events.rawData, payload);
396
- }
395
+ const payload = {
396
+ clusterID: apsFrame.clusterId,
397
+ header: Zcl.Header.fromBuffer(messageContents),
398
+ address: sender,
399
+ data: messageContents,
400
+ endpoint: apsFrame.sourceEndpoint,
401
+ linkquality: lastHopLqi,
402
+ groupID: apsFrame.groupId,
403
+ wasBroadcast: ((type === enums_2.EmberIncomingMessageType.BROADCAST) || (type === enums_2.EmberIncomingMessageType.BROADCAST_LOOPBACK)),
404
+ destinationEndpoint: apsFrame.destinationEndpoint,
405
+ };
406
+ this.oneWaitress.resolveZCL(payload);
407
+ this.emit(events_1.Events.zclPayload, payload);
397
408
  }
398
409
  /**
399
410
  * Emitted from @see Ezsp.ezspMacFilterMatchMessageHandler when the message is a valid InterPAN touchlink message.
@@ -406,7 +417,9 @@ class EmberAdapter extends __1.Adapter {
406
417
  */
407
418
  async onTouchlinkMessage(sourcePanId, sourceAddress, groupId, lastHopLqi, messageContents) {
408
419
  const payload = {
409
- frame: zcl_1.ZclFrame.fromBuffer(cluster_1.default.touchlink.ID, messageContents),
420
+ clusterID: Zcl.Clusters.touchlink.ID,
421
+ data: messageContents,
422
+ header: Zcl.Header.fromBuffer(messageContents),
410
423
  address: sourceAddress,
411
424
  endpoint: 1, // arbitrary since not sent over-the-air
412
425
  linkquality: lastHopLqi,
@@ -415,7 +428,7 @@ class EmberAdapter extends __1.Adapter {
415
428
  destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
416
429
  };
417
430
  this.oneWaitress.resolveZCL(payload);
418
- this.emit(events_1.Events.zclData, payload);
431
+ this.emit(events_1.Events.zclPayload, payload);
419
432
  }
420
433
  /**
421
434
  * Emitted from @see Ezsp.ezspGpepIncomingMessageHandler
@@ -441,27 +454,29 @@ class EmberAdapter extends __1.Adapter {
441
454
  gpdHeader.writeUInt32LE(frameCounter, 9); // frameCounter
442
455
  gpdHeader.writeUInt8(gpdCommandId, 13); // commandID
443
456
  gpdHeader.writeUInt8(gpdCommandPayload.length, 14); // payloadSize
444
- const gpFrame = zcl_1.ZclFrame.fromBuffer(cluster_1.default.greenPower.ID, Buffer.concat([gpdHeader, gpdCommandPayload]));
457
+ const data = Buffer.concat([gpdHeader, gpdCommandPayload]);
445
458
  const payload = {
446
- frame: gpFrame,
459
+ header: Zcl.Header.fromBuffer(data),
460
+ data,
461
+ clusterID: Zcl.Clusters.greenPower.ID,
447
462
  address: sourceId,
448
463
  endpoint: consts_2.GP_ENDPOINT,
449
464
  linkquality: gpdLink,
450
465
  groupID: this.greenPowerGroup,
451
- // XXX: upstream sends to `gppNwkAddr` if `wasBroadcast` is false, even if `gppNwkAddr` is null
452
- wasBroadcast: (gpFrame.Payload.gppNwkAddr != null) ? false : true,
466
+ wasBroadcast: true,
453
467
  destinationEndpoint: consts_2.GP_ENDPOINT,
454
468
  };
455
469
  this.oneWaitress.resolveZCL(payload);
456
- this.emit(events_1.Events.zclData, payload);
470
+ this.emit(events_1.Events.zclPayload, payload);
457
471
  }
458
472
  catch (err) {
459
- console.error(`<~x~ [GP] Failed creating ZCL payload. Skipping. ${err}`);
473
+ logger_1.logger.error(`<~x~ [GP] Failed creating ZCL payload. Skipping. ${err}`, NS);
460
474
  return;
461
475
  }
462
476
  }
463
477
  /**
464
478
  * Emitted from @see Ezsp.ezspTrustCenterJoinHandler
479
+ * Also from @see Ezsp.ezspIdConflictHandler as a DEVICE_LEFT
465
480
  *
466
481
  * @param newNodeId
467
482
  * @param newNodeEui64
@@ -471,7 +486,6 @@ class EmberAdapter extends __1.Adapter {
471
486
  */
472
487
  async onTrustCenterJoin(newNodeId, newNodeEui64, status, policyDecision, parentOfNewNodeId) {
473
488
  if (status === enums_2.EmberDeviceUpdate.DEVICE_LEFT) {
474
- // NOTE: `policyDecision` here is NO_ACTION and `parentOfNewNodeId` is 65535
475
489
  const payload = {
476
490
  networkAddress: newNodeId,
477
491
  ieeeAddr: newNodeEui64,
@@ -484,24 +498,41 @@ class EmberAdapter extends __1.Adapter {
484
498
  networkAddress: newNodeId,
485
499
  ieeeAddr: newNodeEui64,
486
500
  };
487
- this.emit(events_1.Events.deviceJoined, payload);
501
+ // set workaround manuf code if necessary, or revert to default if previous joined device required workaround and new one does not
502
+ const joinManufCode = WORKAROUND_JOIN_MANUF_IEEE_PREFIX_TO_CODE[newNodeEui64.substring(0, 8)] ?? DEFAULT_MANUFACTURER_CODE;
503
+ if (this.manufacturerCode !== joinManufCode) {
504
+ await new Promise((resolve, reject) => {
505
+ this.requestQueue.enqueue(async () => {
506
+ logger_1.logger.debug(`[WORKAROUND] Setting coordinator manufacturer code to ${Zcl.ManufacturerCode[joinManufCode]}.`, NS);
507
+ await this.ezsp.ezspSetManufacturerCode(joinManufCode);
508
+ this.manufacturerCode = joinManufCode;
509
+ this.emit(events_1.Events.deviceJoined, payload);
510
+ resolve();
511
+ return enums_2.EmberStatus.SUCCESS;
512
+ }, reject, true);
513
+ });
514
+ }
515
+ else {
516
+ this.emit(events_1.Events.deviceJoined, payload);
517
+ }
488
518
  }
489
519
  else {
490
- console.log(`[TRUST CENTER] Device ${newNodeId}:${newNodeEui64} was denied joining via ${parentOfNewNodeId}.`);
520
+ logger_1.logger.warning(`[TRUST CENTER] Device ${newNodeId}:${newNodeEui64} was denied joining via ${parentOfNewNodeId}.`, NS);
491
521
  }
492
522
  }
493
523
  }
494
524
  async watchdogCounters() {
495
- this.requestQueue.enqueue(async () => {
496
- // listed as per EmberCounterType
497
- const counters = (await this.ezsp.ezspReadAndClearCounters());
498
- let countersLogString = "[NCP COUNTERS] ";
499
- for (let i = 0; i < enums_2.EmberCounterType.COUNT; i++) {
500
- countersLogString += `${enums_2.EmberCounterType[i]}: ${counters[i]} | `;
501
- }
502
- console.log(countersLogString);
503
- return enums_2.EmberStatus.SUCCESS;
504
- }, console.error);
525
+ await new Promise((resolve, reject) => {
526
+ this.requestQueue.enqueue(async () => {
527
+ // listed as per EmberCounterType
528
+ const ncpCounters = (await this.ezsp.ezspReadAndClearCounters());
529
+ logger_1.logger.info(`[NCP COUNTERS] ${ncpCounters.join(',')}`, NS);
530
+ const ashCounters = this.ezsp.ash.readAndClearCounters();
531
+ logger_1.logger.info(`[ASH COUNTERS] ${ashCounters.join(',')}`, NS);
532
+ resolve();
533
+ return enums_2.EmberStatus.SUCCESS;
534
+ }, reject);
535
+ });
505
536
  }
506
537
  initVariables() {
507
538
  this.ezsp.removeAllListeners(ezsp_1.EzspEvents.ncpNeedsResetAndInit);
@@ -511,9 +542,7 @@ class EmberAdapter extends __1.Adapter {
511
542
  this.zdoRequestRadius = 255;
512
543
  this.interpanLock = false;
513
544
  this.networkCache = (0, initters_1.initNetworkCache)();
514
- this.defaultApsOptions = (enums_2.EmberApsOption.RETRY | enums_2.EmberApsOption.ENABLE_ROUTE_DISCOVERY | enums_2.EmberApsOption.ENABLE_ADDRESS_DISCOVERY);
515
- // always at least length==1 because of allowed MULTICAST_TABLE_SIZE range
516
- this.multicastTable = new Array(STACK_CONFIGS[this.stackConfig].MULTICAST_TABLE_SIZE).fill(null);
545
+ this.manufacturerCode = DEFAULT_MANUFACTURER_CODE; // will be set in NCP in initEzsp
517
546
  this.ezsp.once(ezsp_1.EzspEvents.ncpNeedsResetAndInit, this.onNcpNeedsResetAndInit.bind(this));
518
547
  }
519
548
  /**
@@ -522,16 +551,10 @@ class EmberAdapter extends __1.Adapter {
522
551
  */
523
552
  async initEzsp() {
524
553
  let result = "resumed";
525
- await this.onNCPPreReset();
526
- try {
527
- // NOTE: something deep in this call can throw too
528
- const result = (await this.ezsp.start());
529
- if (result !== enums_2.EzspStatus.SUCCESS) {
530
- throw new Error(`Failed to start EZSP layer with status=${enums_2.EzspStatus[result]}.`);
531
- }
532
- }
533
- catch (err) {
534
- throw err;
554
+ // NOTE: something deep in this call can throw too
555
+ const startResult = (await this.ezsp.start());
556
+ if (startResult !== enums_2.EzspStatus.SUCCESS) {
557
+ throw new Error(`Failed to start EZSP layer with status=${enums_2.EzspStatus[startResult]}.`);
535
558
  }
536
559
  // call before any other command, else fails
537
560
  await this.emberVersion();
@@ -539,7 +562,6 @@ class EmberAdapter extends __1.Adapter {
539
562
  await this.initNCPAddressTable();
540
563
  await this.initNCPConfiguration();
541
564
  // WARNING: From here on EZSP commands that affect memory allocation on the NCP should no longer be called (like resizing tables)
542
- await this.onNCPPostReset();
543
565
  await this.registerFixedEndpoints();
544
566
  this.clearNetworkCache();
545
567
  result = (await this.initTrustCenter());
@@ -554,7 +576,9 @@ class EmberAdapter extends __1.Adapter {
554
576
  this.networkCache.parameters = parameters;
555
577
  this.networkCache.status = (await this.ezsp.ezspNetworkState());
556
578
  this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
557
- debug(`[INIT] Network Ready! ${JSON.stringify(this.networkCache)}`);
579
+ logger_1.logger.debug(`[INIT] Network Ready! ${JSON.stringify(this.networkCache)}`, NS);
580
+ this.watchdogCountersHandle = setInterval(this.watchdogCounters.bind(this), WATCHDOG_COUNTERS_FEED_INTERVAL);
581
+ this.requestQueue.startDispatching();
558
582
  return result;
559
583
  }
560
584
  /**
@@ -583,9 +607,7 @@ class EmberAdapter extends __1.Adapter {
583
607
  await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_INCOMING_TRANSFER_SIZE));
584
608
  await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_OUTGOING_TRANSFER_SIZE));
585
609
  await this.emberSetEzspValue(enums_1.EzspValueId.TRANSIENT_DEVICE_TIMEOUT, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].TRANSIENT_DEVICE_TIMEOUT));
586
- // Set the manufacturing code. This is defined by ZigBee document 053874r10
587
- // Ember's ID is 0x1002 and is the default, but this can be overridden in App Builder.
588
- await this.ezsp.ezspSetManufacturerCode(consts_2.MANUFACTURER_CODE);
610
+ await this.ezsp.ezspSetManufacturerCode(this.manufacturerCode);
589
611
  // network security init
590
612
  await this.emberSetEzspConfigValue(enums_1.EzspConfigId.STACK_PROFILE, STACK_CONFIGS[this.stackConfig].STACK_PROFILE);
591
613
  await this.emberSetEzspConfigValue(enums_1.EzspConfigId.SECURITY_LEVEL, STACK_CONFIGS[this.stackConfig].SECURITY_LEVEL);
@@ -642,15 +664,16 @@ class EmberAdapter extends __1.Adapter {
642
664
  throw new Error(`[CONCENTRATOR] Failed to set concentrator with status=${status}.`);
643
665
  }
644
666
  const remainTilMTORR = (await this.ezsp.ezspSetSourceRouteDiscoveryMode(enums_2.EmberSourceRouteDiscoveryMode.RESCHEDULE));
645
- console.log(`[CONCENTRATOR] Started source route discovery. ${remainTilMTORR}ms until next broadcast.`);
667
+ logger_1.logger.info(`[CONCENTRATOR] Started source route discovery. ${remainTilMTORR}ms until next broadcast.`, NS);
646
668
  }
647
669
  /**
648
670
  * Register fixed endpoints and set any related multicast entries that need to be.
649
671
  */
650
672
  async registerFixedEndpoints() {
673
+ let mcTableIdx = 0;
651
674
  for (const ep of endpoints_1.FIXED_ENDPOINTS) {
652
675
  if (ep.networkIndex !== 0x00) {
653
- debug(`Multi-network not currently supported. Skipping endpoint ${JSON.stringify(ep)}.`);
676
+ logger_1.logger.debug(`Multi-network not currently supported. Skipping endpoint ${JSON.stringify(ep)}.`, NS);
654
677
  continue;
655
678
  }
656
679
  const [epStatus,] = (await this.ezsp.ezspGetEndpointFlags(ep.endpoint));
@@ -658,30 +681,29 @@ class EmberAdapter extends __1.Adapter {
658
681
  if (epStatus !== enums_2.EzspStatus.SUCCESS) {
659
682
  // check to see if ezspAddEndpoint needs to be called
660
683
  // if ezspInit is called without NCP reset, ezspAddEndpoint is not necessary and will return an error
661
- const status = (await this.ezsp.ezspAddEndpoint(ep.endpoint, ep.profileId, ep.deviceId, ep.deviceVersion, ep.inClusterList, ep.outClusterList));
684
+ const status = (await this.ezsp.ezspAddEndpoint(ep.endpoint, ep.profileId, ep.deviceId, ep.deviceVersion, ep.inClusterList.slice(), // copy
685
+ ep.outClusterList.slice()));
662
686
  if (status === enums_2.EzspStatus.SUCCESS) {
663
- debug(`Registered endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`);
687
+ logger_1.logger.debug(`Registered endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`, NS);
664
688
  }
665
689
  else {
666
690
  throw new Error(`Failed to register endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`);
667
691
  }
668
692
  }
669
693
  else {
670
- debug(`Endpoint "${ep.endpoint}" already registered.`);
694
+ logger_1.logger.debug(`Endpoint "${ep.endpoint}" already registered.`, NS);
671
695
  }
672
- if (ep.endpoint === consts_2.GP_ENDPOINT) {
673
- const gpMulticastEntry = {
674
- multicastId: this.greenPowerGroup,
696
+ for (const multicastId of ep.multicastIds) {
697
+ const multicastEntry = {
698
+ multicastId,
675
699
  endpoint: ep.endpoint,
676
700
  networkIndex: ep.networkIndex,
677
701
  };
678
- const status = (await this.ezsp.ezspSetMulticastTableEntry(0, gpMulticastEntry));
702
+ const status = (await this.ezsp.ezspSetMulticastTableEntry(mcTableIdx++, multicastEntry));
679
703
  if (status !== enums_2.EmberStatus.SUCCESS) {
680
- throw new Error(`Failed to register group "Green Power" in multicast table with status=${enums_2.EmberStatus[status]}.`);
704
+ throw new Error(`Failed to register group "${multicastId}" in multicast table with status=${enums_2.EmberStatus[status]}.`);
681
705
  }
682
- // NOTE: ensure GP is always added first in the table
683
- this.multicastTable[0] = gpMulticastEntry;
684
- debug(`Registered multicast table entry: ${JSON.stringify(gpMulticastEntry)}.`);
706
+ logger_1.logger.debug(`Registered multicast table entry: ${JSON.stringify(multicastEntry)}.`, NS);
685
707
  }
686
708
  }
687
709
  }
@@ -714,21 +736,19 @@ class EmberAdapter extends __1.Adapter {
714
736
  bitmask: (enums_2.EmberNetworkInitBitmask.PARENT_INFO_IN_TOKEN | enums_2.EmberNetworkInitBitmask.END_DEVICE_REJOIN_ON_REBOOT)
715
737
  };
716
738
  const initStatus = (await this.ezsp.ezspNetworkInit(networkInitStruct));
717
- debug(`[INIT TC] Network init status=${enums_2.EmberStatus[initStatus]}.`);
739
+ logger_1.logger.debug(`[INIT TC] Network init status=${enums_2.EmberStatus[initStatus]}.`, NS);
718
740
  if ((initStatus !== enums_2.EmberStatus.SUCCESS) && (initStatus !== enums_2.EmberStatus.NOT_JOINED)) {
719
741
  throw new Error(`[INIT TC] Failed network init request with status=${enums_2.EmberStatus[initStatus]}.`);
720
742
  }
721
743
  let action = NetworkInitAction.DONE;
722
744
  if (initStatus === enums_2.EmberStatus.SUCCESS) {
723
745
  // network
724
- await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Network init');
746
+ await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Network init');
725
747
  const [npStatus, nodeType, netParams] = (await this.ezsp.ezspGetNetworkParameters());
726
- debug(`[INIT TC] Current network config=${JSON.stringify(this.networkOptions)}`);
727
- debug(`[INIT TC] Current NCP network: nodeType=${enums_2.EmberNodeType[nodeType]} params=${JSON.stringify(netParams)}`);
728
- // XXX: should not force a form when it's only a channel change, just change the channel, wait a sec, then continue the logic
748
+ logger_1.logger.debug(`[INIT TC] Current network config=${JSON.stringify(this.networkOptions)}`, NS);
749
+ logger_1.logger.debug(`[INIT TC] Current NCP network: nodeType=${enums_2.EmberNodeType[nodeType]} params=${JSON.stringify(netParams)}`, NS);
729
750
  if ((npStatus === enums_2.EmberStatus.SUCCESS) && (nodeType === enums_2.EmberNodeType.COORDINATOR) && (this.networkOptions.panID === netParams.panId)
730
- && ((0, es6_1.default)(this.networkOptions.extendedPanID, netParams.extendedPanId))
731
- && (this.networkOptions.channelList.includes(netParams.radioChannel))) {
751
+ && ((0, es6_1.default)(this.networkOptions.extendedPanID, netParams.extendedPanId))) {
732
752
  // config matches adapter so far, no error, we can check the network key
733
753
  const context = (0, initters_1.initSecurityManagerContext)();
734
754
  context.coreKeyType = enums_2.SecManKeyType.NETWORK;
@@ -737,7 +757,7 @@ class EmberAdapter extends __1.Adapter {
737
757
  if (nkStatus !== enums_2.SLStatus.OK) {
738
758
  throw new Error(`[BACKUP] Failed to export Network Key with status=${enums_2.SLStatus[nkStatus]}.`);
739
759
  }
740
- debug(`[INIT TC] Current NCP network: networkKey=${networkKey.contents.toString('hex')}`);
760
+ logger_1.logger.debug(`[INIT TC] Current NCP network: networkKey=${networkKey.contents.toString('hex')}`, NS);
741
761
  // config doesn't match adapter anymore
742
762
  if (!networkKey.contents.equals(configNetworkKey)) {
743
763
  action = NetworkInitAction.LEAVE;
@@ -748,12 +768,12 @@ class EmberAdapter extends __1.Adapter {
748
768
  action = NetworkInitAction.LEAVE;
749
769
  }
750
770
  if (action === NetworkInitAction.LEAVE) {
751
- console.log(`[INIT TC] NCP network does not match config. Leaving network...`);
771
+ logger_1.logger.info(`[INIT TC] NCP network does not match config. Leaving network...`, NS);
752
772
  const leaveStatus = (await this.ezsp.ezspLeaveNetwork());
753
773
  if (leaveStatus !== enums_2.EmberStatus.SUCCESS) {
754
774
  throw new Error(`[INIT TC] Failed leave network request with status=${enums_2.EmberStatus[leaveStatus]}.`);
755
775
  }
756
- await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_DOWN }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Leave network');
776
+ await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Leave network');
757
777
  await (0, utils_1.Wait)(200); // settle down
758
778
  action = NetworkInitAction.LEFT;
759
779
  }
@@ -771,24 +791,21 @@ class EmberAdapter extends __1.Adapter {
771
791
  }
772
792
  else {
773
793
  // config doesn't match backup
774
- console.log(`[INIT TC] Config does not match backup.`);
794
+ logger_1.logger.info(`[INIT TC] Config does not match backup.`, NS);
775
795
  action = NetworkInitAction.FORM_CONFIG;
776
796
  }
777
797
  }
778
798
  else {
779
799
  // no backup
780
- console.log(`[INIT TC] No valid backup found.`);
800
+ logger_1.logger.info(`[INIT TC] No valid backup found.`, NS);
781
801
  action = NetworkInitAction.FORM_CONFIG;
782
802
  }
783
803
  }
784
- else {
785
- action = NetworkInitAction.DONE; // just to be clear
786
- }
787
804
  //---- from here on, we assume everything is in place for whatever decision was taken above
788
805
  let result = 'resumed';
789
806
  switch (action) {
790
807
  case NetworkInitAction.FORM_BACKUP: {
791
- console.log(`[INIT TC] Forming from backup.`);
808
+ logger_1.logger.info(`[INIT TC] Forming from backup.`, NS);
792
809
  const keyList = backup.devices.map((device) => {
793
810
  const octets = Array.from(device.ieeeAddress.reverse());
794
811
  const deviceEui64 = '0x' + octets.map(octet => octet.toString(16).padStart(2, '0')).join("");
@@ -807,13 +824,13 @@ class EmberAdapter extends __1.Adapter {
807
824
  break;
808
825
  }
809
826
  case NetworkInitAction.FORM_CONFIG: {
810
- console.log(`[INIT TC] Forming from config.`);
827
+ logger_1.logger.info(`[INIT TC] Forming from config.`, NS);
811
828
  await this.formNetwork(false, /*from config*/ configNetworkKey, 0, this.networkOptions.panID, this.networkOptions.extendedPanID, this.networkOptions.channelList[0], (0, crypto_1.randomBytes)(consts_1.EMBER_ENCRYPTION_KEY_SIZE));
812
829
  result = 'reset';
813
830
  break;
814
831
  }
815
832
  case NetworkInitAction.DONE: {
816
- console.log(`[INIT TC] NCP network matches config.`);
833
+ logger_1.logger.info(`[INIT TC] NCP network matches config.`, NS);
817
834
  break;
818
835
  }
819
836
  default: {
@@ -825,17 +842,17 @@ class EmberAdapter extends __1.Adapter {
825
842
  // XXX: while this remains a pretty low occurrence in most (small) networks,
826
843
  // currently Z2M won't support the key update because of one-way config...
827
844
  // need to investigate handling this properly
828
- // console.warn(`[INIT TC] Network key frame counter is reaching its limit. Scheduling broadcast to update network key. `
829
- // + `This may result in some devices (especially battery-powered) temporarily losing connection.`);
845
+ // logger.warning(`[INIT TC] Network key frame counter is reaching its limit. Scheduling broadcast to update network key. `
846
+ // + `This may result in some devices (especially battery-powered) temporarily losing connection.`, NS);
830
847
  // // XXX: no idea here on the proper timer value, but this will block the network for several seconds on exec
831
848
  // // (probably have to take the behavior of sleepy-end devices into account to improve chances of reaching everyone right away?)
832
849
  // setTimeout(async () => {
833
850
  // this.requestQueue.enqueue(async (): Promise<EmberStatus> => {
834
851
  // await this.broadcastNetworkKeyUpdate();
835
852
  // return EmberStatus.SUCCESS;
836
- // }, console.error, true);// no reject just log error if any, will retry next start, & prioritize so we know it'll run when expected
853
+ // }, logger.error, true);// no reject just log error if any, will retry next start, & prioritize so we know it'll run when expected
837
854
  // }, 300000);
838
- console.warn(`[INIT TC] Network key frame counter is reaching its limit. A new network key will have to be instaured soon.`);
855
+ logger_1.logger.warning(`[INIT TC] Network key frame counter is reaching its limit. A new network key will have to be instaured soon.`, NS);
839
856
  }
840
857
  return result;
841
858
  }
@@ -880,15 +897,15 @@ class EmberAdapter extends __1.Adapter {
880
897
  nwkUpdateId: 0,
881
898
  channels: consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK,
882
899
  };
883
- console.log(`[INIT FORM] Forming new network with: ${JSON.stringify(netParams)}`);
900
+ logger_1.logger.info(`[INIT FORM] Forming new network with: ${JSON.stringify(netParams)}`, NS);
884
901
  emberStatus = (await this.ezsp.ezspFormNetwork(netParams));
885
902
  if (emberStatus !== enums_2.EmberStatus.SUCCESS) {
886
903
  throw new Error(`[INIT FORM] Failed form network request with status=${enums_2.EmberStatus[emberStatus]}.`);
887
904
  }
888
- await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT FORM] Form network');
905
+ await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT FORM] Form network');
889
906
  const stStatus = await this.ezsp.ezspStartWritingStackTokens();
890
- debug(`[INIT FORM] Start writing stack tokens status=${enums_2.EzspStatus[stStatus]}.`);
891
- console.log(`[INIT FORM] New network formed!`);
907
+ logger_1.logger.debug(`[INIT FORM] Start writing stack tokens status=${enums_2.EzspStatus[stStatus]}.`, NS);
908
+ logger_1.logger.info(`[INIT FORM] New network formed!`, NS);
892
909
  }
893
910
  /**
894
911
  * Loads currently stored backup and returns it in internal backup model.
@@ -912,10 +929,10 @@ class EmberAdapter extends __1.Adapter {
912
929
  throw new Error(`[BACKUP] Unsupported open coordinator backup version (version=${data.metadata?.version}).`);
913
930
  }
914
931
  if (!data.stack_specific?.ezsp || !data.metadata.internal.ezspVersion) {
915
- throw new Error(`[BACKUP] Specified backup is not EZSP.`);
932
+ throw new Error(`[BACKUP] Current backup file is not for EmberZNet stack.`);
916
933
  }
917
934
  if (data.metadata.internal.ezspVersion < BACKUP_OLDEST_SUPPORTED_EZSP_VERSION) {
918
- throw new Error(`[BACKUP] Specified backup is not a supported EZSP version (min: ${BACKUP_OLDEST_SUPPORTED_EZSP_VERSION}).`);
935
+ throw new Error(`[BACKUP] Current backup file is from an unsupported EZSP version (min: ${BACKUP_OLDEST_SUPPORTED_EZSP_VERSION}).`);
919
936
  }
920
937
  return utils_1.BackupUtils.fromUnifiedBackup(data);
921
938
  }
@@ -940,7 +957,7 @@ class EmberAdapter extends __1.Adapter {
940
957
  const keyList = [];
941
958
  for (let i = 0; i < keyTableSize; i++) {
942
959
  [deviceEui64, plaintextKey, apsKeyMeta, status] = (await this.ezsp.ezspExportLinkKeyByIndex(i));
943
- debug(`[BACKUP] Export link key at index ${i}, status=${enums_2.SLStatus[status]}.`);
960
+ logger_1.logger.debug(`[BACKUP] Export link key at index ${i}, status=${enums_2.SLStatus[status]}.`, NS);
944
961
  // only include key if we could retrieve one at index and hash it properly
945
962
  if (status === enums_2.SLStatus.OK) {
946
963
  // Rather than give the real link key, the backup contains a hashed version of the key.
@@ -957,11 +974,11 @@ class EmberAdapter extends __1.Adapter {
957
974
  }
958
975
  else {
959
976
  // this should never happen?
960
- console.error(`[BACKUP] Failed to hash link key at index ${i} with status=${enums_2.EmberStatus[hashStatus]}. Omitting from backup.`);
977
+ logger_1.logger.error(`[BACKUP] Failed to hash link key at index ${i} with status=${enums_2.EmberStatus[hashStatus]}. Omitting from backup.`, NS);
961
978
  }
962
979
  }
963
980
  }
964
- console.log(`[BACKUP] Retrieved ${keyList.length} link keys.`);
981
+ logger_1.logger.info(`[BACKUP] Retrieved ${keyList.length} link keys.`, NS);
965
982
  return keyList;
966
983
  }
967
984
  /**
@@ -999,7 +1016,7 @@ class EmberAdapter extends __1.Adapter {
999
1016
  + `with status=${enums_2.EmberStatus[status]}`);
1000
1017
  }
1001
1018
  }
1002
- debug(`[BACKUP] Imported ${backupData.length} keys.`);
1019
+ logger_1.logger.info(`[BACKUP] Imported ${backupData.length} keys.`, NS);
1003
1020
  }
1004
1021
  /**
1005
1022
  * Routine to update the network key and broadcast the update to the network after a set time.
@@ -1010,11 +1027,11 @@ class EmberAdapter extends __1.Adapter {
1010
1027
  async broadcastNetworkKeyUpdate() {
1011
1028
  return new Promise((resolve, reject) => {
1012
1029
  this.requestQueue.enqueue(async () => {
1013
- console.warn(`[TRUST CENTER] Performing a network key update. This might take a while and disrupt normal operation.`);
1030
+ logger_1.logger.warning(`[TRUST CENTER] Performing a network key update. This might take a while and disrupt normal operation.`, NS);
1014
1031
  // zero-filled = let stack generate new random network key
1015
1032
  let status = await this.ezsp.ezspBroadcastNextNetworkKey({ contents: Buffer.alloc(consts_1.EMBER_ENCRYPTION_KEY_SIZE) });
1016
1033
  if (status !== enums_2.EmberStatus.SUCCESS) {
1017
- console.error(`[TRUST CENTER] Failed to broadcast next network key with status=${enums_2.EmberStatus[status]}.`);
1034
+ logger_1.logger.error(`[TRUST CENTER] Failed to broadcast next network key with status=${enums_2.EmberStatus[status]}.`, NS);
1018
1035
  return status;
1019
1036
  }
1020
1037
  // XXX: this will block other requests for a while, but should ensure the key propagates without interference?
@@ -1023,7 +1040,7 @@ class EmberAdapter extends __1.Adapter {
1023
1040
  status = (await this.ezsp.ezspBroadcastNetworkKeySwitch());
1024
1041
  if (status !== enums_2.EmberStatus.SUCCESS) {
1025
1042
  // XXX: Not sure how likely this is, but this is bad, probably should hard fail?
1026
- console.error(`[TRUST CENTER] Failed to broadcast network key switch with status=${enums_2.EmberStatus[status]}.`);
1043
+ logger_1.logger.error(`[TRUST CENTER] Failed to broadcast network key switch with status=${enums_2.EmberStatus[status]}.`, NS);
1027
1044
  return status;
1028
1045
  }
1029
1046
  resolve();
@@ -1036,117 +1053,17 @@ class EmberAdapter extends __1.Adapter {
1036
1053
  * @param status
1037
1054
  */
1038
1055
  async onNcpNeedsResetAndInit(status) {
1039
- console.error(`!!! NCP FATAL ERROR reason=${enums_2.EzspStatus[status]}. ATTEMPTING RESET... !!!`);
1056
+ logger_1.logger.error(`!!! NCP FATAL ERROR reason=${enums_2.EzspStatus[status]}. ATTEMPTING RESET... !!!`, NS);
1040
1057
  try {
1041
1058
  await this.stop();
1042
1059
  await (0, utils_1.Wait)(500); // just because
1043
1060
  await this.start();
1044
1061
  }
1045
1062
  catch (err) {
1046
- console.error(`Failed to reset and init NCP. ${err}`);
1063
+ logger_1.logger.error(`Failed to reset and init NCP. ${err}`, NS);
1047
1064
  this.emit(events_1.Events.disconnected);
1048
1065
  }
1049
1066
  }
1050
- /**
1051
- * Called right before a NCP reset.
1052
- */
1053
- async onNCPPreReset() {
1054
- this.requestQueue.stopDispatching();
1055
- }
1056
- /**
1057
- * Called right after a NCP reset, right before the creation of endpoints.
1058
- */
1059
- async onNCPPostReset() {
1060
- this.requestQueue.startDispatching();
1061
- this.watchdogCountersHandle = setInterval(this.watchdogCounters.bind(this), WATCHDOG_COUNTERS_FEED_INTERVAL);
1062
- }
1063
- /**
1064
- * Handle changes in groups that needs to be propagated to the NCP multicast table.
1065
- *
1066
- * XXX: Since Z2M doesn't explicitly check-in downstream when groups are created/removed, we look at outgoing genGroups commands.
1067
- * If the NCP doesn't know about groups, it can miss messages from some devices (remotes for example), so we add it...
1068
- *
1069
- * @param commandId
1070
- * @param groupId
1071
- */
1072
- async onGroupChange(commandId, groupId) {
1073
- switch (commandId) {
1074
- case cluster_1.default.genGroups.commands.add.ID: {
1075
- // check if group already in multicast table, should not happen...
1076
- const existingIndex = this.multicastTable.findIndex((e) => ((e != null) && (e.multicastId === groupId)));
1077
- if (existingIndex == -1) {
1078
- // find first unused index
1079
- const newEntryIndex = this.multicastTable.findIndex((e) => (!e));
1080
- if (newEntryIndex != -1) {
1081
- const newEntry = {
1082
- multicastId: groupId,
1083
- endpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
1084
- networkIndex: endpoints_1.FIXED_ENDPOINTS[0].networkIndex,
1085
- };
1086
- const status = (await this.ezsp.ezspSetMulticastTableEntry(newEntryIndex, newEntry));
1087
- if (status !== enums_2.EmberStatus.SUCCESS) {
1088
- console.error(`Failed to register group "${groupId}" in multicast table at index "${newEntryIndex}" with status=${enums_2.EmberStatus[status]}.`);
1089
- }
1090
- else {
1091
- debug(`Registered multicast table entry: ${JSON.stringify(newEntry)}.`);
1092
- }
1093
- // always assume "it worked" to keep sync with Z2M first, NCP second, otherwise trouble might arise... should always work anyway
1094
- this.multicastTable[newEntryIndex] = newEntry;
1095
- }
1096
- else {
1097
- console.warn(`Coordinator multicast table is full (max: ${STACK_CONFIGS[this.stackConfig].MULTICAST_TABLE_SIZE}). `
1098
- + `Some devices in new groups may not work properly, including in group "${groupId}". `
1099
- + `If that happens, please remove groups to be below the limit. `
1100
- + `Removed groups are only removed from coordinator after a Zigbee2MQTT restart.`);
1101
- }
1102
- }
1103
- else {
1104
- debug(`Added group "${groupId}", but local table says it is already registered at index "${existingIndex}". Skipping.`);
1105
- }
1106
- break;
1107
- }
1108
- // NOTE: Can't remove groups, since we watch from command exec to group members, that would trigger from any removed member,
1109
- // even though the group might still exist...
1110
- // Leaving this here (since it's done...), just in case we get better notifications for groups from upstream.
1111
- // case Cluster.genGroups.commands.remove.ID: {
1112
- // const entryIndex = this.multicastTable.findIndex((e) => ((e != null) && (e.multicastId === groupId)));
1113
- // // just in case, never remove GP at i zero, should never be the case...
1114
- // if (entryIndex > 0) {
1115
- // const entry = this.multicastTable[entryIndex];
1116
- // entry.endpoint = 0;// signals "not in use" in the stack
1117
- // const status = (await this.ezsp.ezspSetMulticastTableEntry(entryIndex, entry));
1118
- // if (status !== EmberStatus.SUCCESS) {
1119
- // console.error(`Failed to remove multicast table entry at index "${entryIndex}" for group "${groupId}".`);
1120
- // } else {
1121
- // debug(`Removed multicast table entry at index "${entryIndex}".`);
1122
- // }
1123
- // // always assume "it worked" to keep sync with Z2M first, NCP second, otherwise trouble might arise... should always work anyway
1124
- // this.multicastTable[entryIndex] = null;
1125
- // } else {
1126
- // debug(`Removed group "${groupId}", but local table did not have a reference to it.`);
1127
- // }
1128
- // break;
1129
- // }
1130
- // case Cluster.genGroups.commands.removeAll.ID: {
1131
- // // this can create quite a few NCP calls, but hopefully shouldn't happen often
1132
- // // always skip green power at i==0
1133
- // for (let i = 1; i < this.multicastTable.length; i++) {
1134
- // const entry = this.multicastTable[i];
1135
- // if (entry != null) {
1136
- // entry.endpoint = 0;// signals "not in use" in the stack
1137
- // const status = (await this.ezsp.ezspSetMulticastTableEntry(i, entry));
1138
- // if (status !== EmberStatus.SUCCESS) {
1139
- // console.error(`Failed to remove multicast entry at index "${i}" with status=${EmberStatus[status]}.`);
1140
- // } else {
1141
- // debug(`Removed multicast table entry at index "${i}".`);
1142
- // }
1143
- // }
1144
- // this.multicastTable[i] = null;
1145
- // }
1146
- // break;
1147
- // }
1148
- }
1149
- }
1150
1067
  //---- START Events
1151
1068
  //---- END Events
1152
1069
  //---- START Cache-enabled EZSP wrappers
@@ -1191,7 +1108,7 @@ class EmberAdapter extends __1.Adapter {
1191
1108
  this.networkCache.parameters = parameters;
1192
1109
  }
1193
1110
  else {
1194
- console.error(`Failed to get PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`);
1111
+ logger_1.logger.error(`Failed to get PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1195
1112
  }
1196
1113
  }
1197
1114
  return this.networkCache.parameters.panId;
@@ -1208,7 +1125,7 @@ class EmberAdapter extends __1.Adapter {
1208
1125
  this.networkCache.parameters = parameters;
1209
1126
  }
1210
1127
  else {
1211
- console.error(`Failed to get Extended PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`);
1128
+ logger_1.logger.error(`Failed to get Extended PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1212
1129
  }
1213
1130
  }
1214
1131
  return this.networkCache.parameters.extendedPanId;
@@ -1225,7 +1142,7 @@ class EmberAdapter extends __1.Adapter {
1225
1142
  this.networkCache.parameters = parameters;
1226
1143
  }
1227
1144
  else {
1228
- console.error(`Failed to get radio channel (via network parameters) with status=${enums_2.EmberStatus[status]}.`);
1145
+ logger_1.logger.error(`Failed to get radio channel (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1229
1146
  }
1230
1147
  }
1231
1148
  return this.networkCache.parameters.radioChannel;
@@ -1236,7 +1153,7 @@ class EmberAdapter extends __1.Adapter {
1236
1153
  this.requestQueue.enqueue(async () => {
1237
1154
  const status = (await this.ezsp.ezspStartScan(enums_2.EzspNetworkScanType.ENERGY_SCAN, consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK, ENERGY_SCAN_DURATION));
1238
1155
  if (status !== enums_2.SLStatus.OK) {
1239
- console.error(`Failed energy scan request with status=${enums_2.SLStatus[status]}.`);
1156
+ logger_1.logger.error(`Failed energy scan request with status=${enums_2.SLStatus[status]}.`, NS);
1240
1157
  return enums_2.EmberStatus.ERR_FATAL;
1241
1158
  }
1242
1159
  // TODO: result in logs only atm, since UI doesn't support it
@@ -1270,34 +1187,21 @@ class EmberAdapter extends __1.Adapter {
1270
1187
  if (ncpEzspProtocolVer !== consts_1.EZSP_PROTOCOL_VERSION) {
1271
1188
  throw new Error(`NCP EZSP protocol version of ${ncpEzspProtocolVer} does not match Host version ${hostEzspProtocolVer}`);
1272
1189
  }
1273
- debug(`NCP info: EZSPVersion=${ncpEzspProtocolVer} StackType=${ncpStackType} StackVersion=${ncpStackVer}`);
1190
+ logger_1.logger.debug(`NCP info: EZSPVersion=${ncpEzspProtocolVer} StackType=${ncpStackType} StackVersion=${ncpStackVer}`, NS);
1274
1191
  const [status, versionStruct] = (await this.ezsp.ezspGetVersionStruct());
1275
1192
  if (status !== enums_2.EzspStatus.SUCCESS) {
1276
- // NCP has old style version number
1277
- debug(`NCP has old-style version number.`);
1278
- this.version = {
1279
- ezsp: ncpEzspProtocolVer,
1280
- revision: `${ncpStackVer}`,
1281
- major: ncpStackVer,
1282
- minor: 0,
1283
- patch: 0,
1284
- special: 0,
1285
- build: 0,
1286
- type: enums_2.EmberVersionType.GA, // default...
1287
- };
1193
+ // Should never happen with support of only EZSP v13+
1194
+ throw new Error(`NCP has old-style version number. Not supported.`);
1288
1195
  }
1289
- else {
1290
- // NCP has new style version number
1291
- this.version = {
1292
- ezsp: ncpEzspProtocolVer,
1293
- revision: `${versionStruct.major}.${versionStruct.minor}.${versionStruct.patch} [${enums_2.EmberVersionType[versionStruct.type]}]`,
1294
- ...versionStruct,
1295
- };
1296
- if (versionStruct.type !== enums_2.EmberVersionType.GA) {
1297
- console.warn(`NCP is running a non-GA version (${enums_2.EmberVersionType[versionStruct.type]}).`);
1298
- }
1196
+ this.version = {
1197
+ ezsp: ncpEzspProtocolVer,
1198
+ revision: `${versionStruct.major}.${versionStruct.minor}.${versionStruct.patch} [${enums_2.EmberVersionType[versionStruct.type]}]`,
1199
+ ...versionStruct,
1200
+ };
1201
+ if (versionStruct.type !== enums_2.EmberVersionType.GA) {
1202
+ logger_1.logger.warning(`NCP is running a non-GA version (${enums_2.EmberVersionType[versionStruct.type]}).`, NS);
1299
1203
  }
1300
- debug(`NCP version info: ${JSON.stringify(this.version)}`);
1204
+ logger_1.logger.debug(`NCP version info: ${JSON.stringify(this.version)}`, NS);
1301
1205
  }
1302
1206
  /**
1303
1207
  * This function sets an EZSP config value.
@@ -1309,14 +1213,14 @@ class EmberAdapter extends __1.Adapter {
1309
1213
  */
1310
1214
  async emberSetEzspConfigValue(configId, value) {
1311
1215
  const status = (await this.ezsp.ezspSetConfigurationValue(configId, value));
1312
- debug(`[EzspConfigId] SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`);
1216
+ logger_1.logger.debug(`[EzspConfigId] SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
1313
1217
  if (status === enums_2.EzspStatus.ERROR_INVALID_ID) {
1314
1218
  // can be ZLL where not all NCPs need or support it.
1315
- console.warn(`[EzspConfigId] Unsupported configuration ID ${enums_1.EzspConfigId[configId]} by NCP.`);
1219
+ logger_1.logger.warning(`[EzspConfigId] Unsupported configuration ID ${enums_1.EzspConfigId[configId]} by NCP.`, NS);
1316
1220
  }
1317
1221
  else if (status !== enums_2.EzspStatus.SUCCESS) {
1318
- // don't fail in case a set value gets called "out of time"
1319
- console.error(`[EzspConfigId] Failed to SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`);
1222
+ logger_1.logger.warning(`[EzspConfigId] Failed to SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}. `
1223
+ + `Firmware value will be used instead.`, NS);
1320
1224
  }
1321
1225
  return status;
1322
1226
  }
@@ -1329,7 +1233,7 @@ class EmberAdapter extends __1.Adapter {
1329
1233
  */
1330
1234
  async emberSetEzspValue(valueId, valueLength, value) {
1331
1235
  const status = (await this.ezsp.ezspSetValue(valueId, valueLength, value));
1332
- debug(`[EzspValueId] SET "${enums_1.EzspValueId[valueId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`);
1236
+ logger_1.logger.debug(`[EzspValueId] SET "${enums_1.EzspValueId[valueId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
1333
1237
  return status;
1334
1238
  }
1335
1239
  /**
@@ -1340,7 +1244,7 @@ class EmberAdapter extends __1.Adapter {
1340
1244
  */
1341
1245
  async emberSetEzspPolicy(policyId, decisionId) {
1342
1246
  const status = (await this.ezsp.ezspSetPolicy(policyId, decisionId));
1343
- debug(`[EzspPolicyId] SET "${enums_1.EzspPolicyId[policyId]}" TO "${decisionId}" with status=${enums_2.EzspStatus[status]}.`);
1247
+ logger_1.logger.debug(`[EzspPolicyId] SET "${enums_1.EzspPolicyId[policyId]}" TO "${decisionId}" with status=${enums_2.EzspStatus[status]}.`, NS);
1344
1248
  return status;
1345
1249
  }
1346
1250
  /**
@@ -1432,10 +1336,10 @@ class EmberAdapter extends __1.Adapter {
1432
1336
  let status = (await this.ezsp.ezspPermitJoining(duration));
1433
1337
  let apsFrame = null;
1434
1338
  let messageTag = null;
1435
- debug(`Permit joining for ${duration} sec. status=${[status]}`);
1339
+ logger_1.logger.debug(`Permit joining for ${duration} sec. status=${[status]}`, NS);
1436
1340
  if (broadcastMgmtPermitJoin) {
1437
1341
  // `authentication`: TC significance always 1 (zb specs)
1438
- [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(consts_2.EMBER_BROADCAST_ADDRESS, duration, 1, this.defaultApsOptions));
1342
+ [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(consts_2.EMBER_BROADCAST_ADDRESS, duration, 1, DEFAULT_APS_OPTIONS));
1439
1343
  }
1440
1344
  return [status, apsFrame, messageTag];
1441
1345
  }
@@ -1476,7 +1380,7 @@ class EmberAdapter extends __1.Adapter {
1476
1380
  return value;
1477
1381
  }
1478
1382
  else {
1479
- debug(`Failed to get source route overhead (via extended value), status=${enums_2.EzspStatus[status]}.`);
1383
+ logger_1.logger.debug(`Failed to get source route overhead (via extended value), status=${enums_2.EzspStatus[status]}.`, NS);
1480
1384
  }
1481
1385
  return 0;
1482
1386
  }
@@ -1594,17 +1498,17 @@ class EmberAdapter extends __1.Adapter {
1594
1498
  const messageContents = this.zdoRequestBuffalo.getWritten();
1595
1499
  if (destination === consts_2.EMBER_BROADCAST_ADDRESS || destination === consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS
1596
1500
  || destination === consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS) {
1597
- debug(`~~~> [ZDO BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`);
1501
+ logger_1.logger.debug(`~~~> [ZDO BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
1598
1502
  const [status, apsSequence] = (await this.ezsp.ezspSendBroadcast(destination, apsFrame, this.getZDORequestRadius(), messageTag, messageContents));
1599
1503
  apsFrame.sequence = apsSequence;
1600
- debug(`~~~> [SENT ZDO type=BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`);
1504
+ logger_1.logger.debug(`~~~> [SENT ZDO type=BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
1601
1505
  return [status, apsFrame, messageTag];
1602
1506
  }
1603
1507
  else {
1604
- debug(`~~~> [ZDO UNICAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`);
1508
+ logger_1.logger.debug(`~~~> [ZDO UNICAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
1605
1509
  const [status, apsSequence] = (await this.ezsp.ezspSendUnicast(enums_2.EmberOutgoingMessageType.DIRECT, destination, apsFrame, messageTag, messageContents));
1606
1510
  apsFrame.sequence = apsSequence;
1607
- debug(`~~~> [SENT ZDO type=DIRECT apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`);
1511
+ logger_1.logger.debug(`~~~> [SENT ZDO type=DIRECT apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
1608
1512
  return [status, apsFrame, messageTag];
1609
1513
  }
1610
1514
  }
@@ -1646,7 +1550,7 @@ class EmberAdapter extends __1.Adapter {
1646
1550
  this.zdoRequestBuffalo.writeListUInt16(inClusters);
1647
1551
  this.zdoRequestBuffalo.writeUInt8(outClusters.length);
1648
1552
  this.zdoRequestBuffalo.writeListUInt16(outClusters);
1649
- debug(`~~~> [ZDO MATCH DESCRIPTOR target=${target} profile=${profile} inClusters=${inClusters} outClusters=${outClusters}]`);
1553
+ logger_1.logger.debug(`~~~> [ZDO MATCH_DESCRIPTORS_REQUEST target=${target} profile=${profile} inClusters=${inClusters} outClusters=${outClusters}]`, NS);
1650
1554
  return this.sendZDORequestBuffer(target, zdo_1.MATCH_DESCRIPTORS_REQUEST, options);
1651
1555
  }
1652
1556
  /**
@@ -1671,7 +1575,7 @@ class EmberAdapter extends __1.Adapter {
1671
1575
  this.zdoRequestBuffalo.writeIeeeAddr(target);
1672
1576
  this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1673
1577
  this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1674
- debug(`~~~> [ZDO NETWORK ADDRESS target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`);
1578
+ logger_1.logger.debug(`~~~> [ZDO NETWORK_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1675
1579
  return this.sendZDORequestBuffer(consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS, zdo_1.NETWORK_ADDRESS_REQUEST, enums_2.EmberApsOption.SOURCE_EUI64);
1676
1580
  }
1677
1581
  /**
@@ -1697,7 +1601,7 @@ class EmberAdapter extends __1.Adapter {
1697
1601
  this.zdoRequestBuffalo.writeUInt16(target);
1698
1602
  this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1699
1603
  this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1700
- debug(`~~~> [ZDO IEEE ADDRESS target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`);
1604
+ logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1701
1605
  return this.sendZDORequestBuffer(target, zdo_1.IEEE_ADDRESS_REQUEST, options);
1702
1606
  }
1703
1607
  /**
@@ -1713,8 +1617,8 @@ class EmberAdapter extends __1.Adapter {
1713
1617
  this.zdoRequestBuffalo.writeUInt16(discoveryNodeId);
1714
1618
  this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1715
1619
  this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1716
- debug(`~~~> [ZDO IEEE ADDRESS targetNodeIdOfRequest=${targetNodeIdOfRequest} discoveryNodeId=${discoveryNodeId} `
1717
- + `reportKids=${reportKids} childStartIndex=${childStartIndex}]`);
1620
+ logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST targetNodeIdOfRequest=${targetNodeIdOfRequest} discoveryNodeId=${discoveryNodeId} `
1621
+ + `reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1718
1622
  return this.sendZDORequestBuffer(targetNodeIdOfRequest, zdo_1.IEEE_ADDRESS_REQUEST, options);
1719
1623
  }
1720
1624
  /**
@@ -1753,7 +1657,7 @@ class EmberAdapter extends __1.Adapter {
1753
1657
  this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1754
1658
  this.zdoRequestBuffalo.writeUInt16(target);
1755
1659
  this.zdoRequestBuffalo.writeUInt8(targetEndpoint);
1756
- debug(`~~~> [ZDO SIMPLE DESCRIPTOR target=${target} targetEndpoint=${targetEndpoint}]`);
1660
+ logger_1.logger.debug(`~~~> [ZDO SIMPLE_DESCRIPTOR_REQUEST target=${target} targetEndpoint=${targetEndpoint}]`, NS);
1757
1661
  return this.sendZDORequestBuffer(target, zdo_1.SIMPLE_DESCRIPTOR_REQUEST, options);
1758
1662
  }
1759
1663
  /**
@@ -1828,8 +1732,8 @@ class EmberAdapter extends __1.Adapter {
1828
1732
  * @returns The tag used on the message.
1829
1733
  */
1830
1734
  async emberBindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
1831
- debug(`~~~> [ZDO BIND target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
1832
- + `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`);
1735
+ logger_1.logger.debug(`~~~> [ZDO BIND_REQUEST target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
1736
+ + `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`, NS);
1833
1737
  return this.emberSendZigDevBindRequest(target, zdo_1.BIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
1834
1738
  }
1835
1739
  /**
@@ -1862,8 +1766,8 @@ class EmberAdapter extends __1.Adapter {
1862
1766
  * @returns The tag used on the message.
1863
1767
  */
1864
1768
  async emberUnbindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
1865
- debug(`~~~> [ZDO UNBIND target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
1866
- + `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`);
1769
+ logger_1.logger.debug(`~~~> [ZDO UNBIND_REQUEST target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
1770
+ + `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`, NS);
1867
1771
  return this.emberSendZigDevBindRequest(target, zdo_1.UNBIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
1868
1772
  }
1869
1773
  /**
@@ -1880,7 +1784,7 @@ class EmberAdapter extends __1.Adapter {
1880
1784
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1881
1785
  */
1882
1786
  async emberActiveEndpointsRequest(target, options) {
1883
- debug(`~~~> [ZDO ACTIVE ENDPOINTS target=${target}]`);
1787
+ logger_1.logger.debug(`~~~> [ZDO ACTIVE_ENDPOINTS_REQUEST target=${target}]`, NS);
1884
1788
  return this.emberSendZigDevRequestTarget(target, zdo_1.ACTIVE_ENDPOINTS_REQUEST, options);
1885
1789
  }
1886
1790
  /**
@@ -1900,7 +1804,7 @@ class EmberAdapter extends __1.Adapter {
1900
1804
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1901
1805
  */
1902
1806
  async emberPowerDescriptorRequest(target, options) {
1903
- debug(`~~~> [ZDO POWER DESCRIPTOR target=${target}]`);
1807
+ logger_1.logger.debug(`~~~> [ZDO POWER_DESCRIPTOR_REQUEST target=${target}]`, NS);
1904
1808
  return this.emberSendZigDevRequestTarget(target, zdo_1.POWER_DESCRIPTOR_REQUEST, options);
1905
1809
  }
1906
1810
  /**
@@ -1919,7 +1823,7 @@ class EmberAdapter extends __1.Adapter {
1919
1823
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1920
1824
  */
1921
1825
  async emberNodeDescriptorRequest(target, options) {
1922
- debug(`~~~> [ZDO NODE DESCRIPTOR target=${target}]`);
1826
+ logger_1.logger.debug(`~~~> [ZDO NODE_DESCRIPTOR_REQUEST target=${target}]`, NS);
1923
1827
  return this.emberSendZigDevRequestTarget(target, zdo_1.NODE_DESCRIPTOR_REQUEST, options);
1924
1828
  }
1925
1829
  /**
@@ -1940,7 +1844,7 @@ class EmberAdapter extends __1.Adapter {
1940
1844
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1941
1845
  */
1942
1846
  async emberLqiTableRequest(target, startIndex, options) {
1943
- debug(`~~~> [ZDO LQI TABLE target=${target} startIndex=${startIndex}]`);
1847
+ logger_1.logger.debug(`~~~> [ZDO LQI_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1944
1848
  return this.emberTableRequest(zdo_1.LQI_TABLE_REQUEST, target, startIndex, options);
1945
1849
  }
1946
1850
  /**
@@ -1961,7 +1865,7 @@ class EmberAdapter extends __1.Adapter {
1961
1865
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1962
1866
  */
1963
1867
  async emberRoutingTableRequest(target, startIndex, options) {
1964
- debug(`~~~> [ZDO ROUTING TABLE target=${target} startIndex=${startIndex}]`);
1868
+ logger_1.logger.debug(`~~~> [ZDO ROUTING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1965
1869
  return this.emberTableRequest(zdo_1.ROUTING_TABLE_REQUEST, target, startIndex, options);
1966
1870
  }
1967
1871
  /**
@@ -1983,7 +1887,7 @@ class EmberAdapter extends __1.Adapter {
1983
1887
  * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1984
1888
  */
1985
1889
  async emberBindingTableRequest(target, startIndex, options) {
1986
- debug(`~~~> [ZDO BINDING TABLE target=${target} startIndex=${startIndex}]`);
1890
+ logger_1.logger.debug(`~~~> [ZDO BINDING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1987
1891
  return this.emberTableRequest(zdo_1.BINDING_TABLE_REQUEST, target, startIndex, options);
1988
1892
  }
1989
1893
  /**
@@ -2022,7 +1926,7 @@ class EmberAdapter extends __1.Adapter {
2022
1926
  this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
2023
1927
  this.zdoRequestBuffalo.writeIeeeAddr(deviceAddress);
2024
1928
  this.zdoRequestBuffalo.writeUInt8(leaveRequestFlags);
2025
- debug(`~~~> [ZDO LEAVE target=${target} deviceAddress=${deviceAddress} leaveRequestFlags=${leaveRequestFlags}]`);
1929
+ logger_1.logger.debug(`~~~> [ZDO LEAVE_REQUEST target=${target} deviceAddress=${deviceAddress} leaveRequestFlags=${leaveRequestFlags}]`, NS);
2026
1930
  return this.sendZDORequestBuffer(target, zdo_1.LEAVE_REQUEST, options);
2027
1931
  }
2028
1932
  /**
@@ -2046,9 +1950,42 @@ class EmberAdapter extends __1.Adapter {
2046
1950
  this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
2047
1951
  this.zdoRequestBuffalo.writeUInt8(duration);
2048
1952
  this.zdoRequestBuffalo.writeUInt8(authentication);
2049
- debug(`~~~> [ZDO PERMIT JOINING target=${target} duration=${duration} authentication=${authentication}]`);
1953
+ logger_1.logger.debug(`~~~> [ZDO PERMIT_JOINING_REQUEST target=${target} duration=${duration} authentication=${authentication}]`, NS);
2050
1954
  return this.sendZDORequestBuffer(target, zdo_1.PERMIT_JOINING_REQUEST, options);
2051
1955
  }
1956
+ /**
1957
+ * ZDO
1958
+ *
1959
+ * @see NWK_UPDATE_REQUEST
1960
+ *
1961
+ * @param target
1962
+ * @param scanChannels uint8_t[]
1963
+ * @param duration uint8_t
1964
+ * @param count uint8_t
1965
+ * @param manager
1966
+ */
1967
+ async emberNetworkUpdateRequest(target, scanChannels, duration, count, manager, options) {
1968
+ this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1969
+ this.zdoRequestBuffalo.writeUInt32(scanChannels.reduce((a, c) => a + (1 << c), 0)); // to uint32_t
1970
+ this.zdoRequestBuffalo.writeUInt8(duration);
1971
+ if (count != null) {
1972
+ this.zdoRequestBuffalo.writeUInt8(count);
1973
+ }
1974
+ if (manager != null) {
1975
+ this.zdoRequestBuffalo.writeUInt16(manager);
1976
+ }
1977
+ logger_1.logger.debug(`~~~> [ZDO NWK_UPDATE_REQUEST target=${target} scanChannels=${scanChannels} duration=${duration} count=${count} manager=${manager}]`, NS);
1978
+ return this.sendZDORequestBuffer(target, zdo_1.NWK_UPDATE_REQUEST, options);
1979
+ }
1980
+ async emberScanChannelsRequest(target, scanChannels, duration, count, options) {
1981
+ return this.emberNetworkUpdateRequest(target, scanChannels, duration, count, null, options);
1982
+ }
1983
+ async emberChannelChangeRequest(target, channel, options) {
1984
+ return this.emberNetworkUpdateRequest(target, [channel], 0xFE, null, null, options);
1985
+ }
1986
+ async emberSetActiveChannelsAndNwkManagerIdRequest(target, scanChannels, manager, options) {
1987
+ return this.emberNetworkUpdateRequest(target, scanChannels, 0xFF, null, manager, options);
1988
+ }
2052
1989
  //---- END Ember ZDO
2053
1990
  //-- START Adapter implementation
2054
1991
  static async isValidPath(path) {
@@ -2060,7 +1997,7 @@ class EmberAdapter extends __1.Adapter {
2060
1997
  return serialPortUtils_1.default.is((0, utils_1.RealpathSync)(path), autoDetectDefinitions);
2061
1998
  }
2062
1999
  catch (error) {
2063
- debug(`Failed to determine if path is valid: '${error}'`);
2000
+ logger_1.logger.debug(`Failed to determine if path is valid: '${error}'`, NS);
2064
2001
  return false;
2065
2002
  }
2066
2003
  }
@@ -2070,16 +2007,17 @@ class EmberAdapter extends __1.Adapter {
2070
2007
  return paths.length > 0 ? paths[0] : null;
2071
2008
  }
2072
2009
  async start() {
2073
- console.log(`======== Ember Adapter Starting ========`);
2010
+ logger_1.logger.info(`======== Ember Adapter Starting ========`, NS);
2074
2011
  this.initVariables();
2075
- debug(`Starting EZSP with stack configuration: "${this.stackConfig}".`);
2012
+ logger_1.logger.debug(`Starting EZSP with stack configuration: "${this.stackConfig}".`, NS);
2076
2013
  const result = await this.initEzsp();
2077
2014
  return result;
2078
2015
  }
2079
2016
  async stop() {
2017
+ this.requestQueue.stopDispatching();
2080
2018
  await this.ezsp.stop();
2081
2019
  this.initVariables();
2082
- console.log(`======== Ember Adapter Stopped ========`);
2020
+ logger_1.logger.info(`======== Ember Adapter Stopped ========`, NS);
2083
2021
  }
2084
2022
  // queued, non-InterPAN
2085
2023
  async getCoordinator() {
@@ -2091,14 +2029,14 @@ class EmberAdapter extends __1.Adapter {
2091
2029
  resolve({
2092
2030
  ieeeAddr,
2093
2031
  networkAddress: consts_2.ZIGBEE_COORDINATOR_ADDRESS,
2094
- manufacturerID: consts_2.MANUFACTURER_CODE,
2032
+ manufacturerID: DEFAULT_MANUFACTURER_CODE,
2095
2033
  endpoints: endpoints_1.FIXED_ENDPOINTS.map((ep) => {
2096
2034
  return {
2097
2035
  profileID: ep.profileId,
2098
2036
  ID: ep.endpoint,
2099
2037
  deviceID: ep.deviceId,
2100
- inputClusters: ep.inClusterList,
2101
- outputClusters: ep.outClusterList,
2038
+ inputClusters: ep.inClusterList.slice(), // copy
2039
+ outputClusters: ep.outClusterList.slice(), // copy
2102
2040
  };
2103
2041
  }),
2104
2042
  });
@@ -2107,7 +2045,7 @@ class EmberAdapter extends __1.Adapter {
2107
2045
  });
2108
2046
  }
2109
2047
  async getCoordinatorVersion() {
2110
- return { type: `EZSP v${this.version.ezsp}`, meta: this.version };
2048
+ return { type: `EmberZNet`, meta: this.version };
2111
2049
  }
2112
2050
  // queued
2113
2051
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -2128,7 +2066,7 @@ class EmberAdapter extends __1.Adapter {
2128
2066
  // grab fresh version here, bypass cache
2129
2067
  const [netStatus, , netParams] = (await this.ezsp.ezspGetNetworkParameters());
2130
2068
  if (netStatus !== enums_2.EmberStatus.SUCCESS) {
2131
- console.error(`[BACKUP] Failed to get network parameters.`);
2069
+ logger_1.logger.error(`[BACKUP] Failed to get network parameters.`, NS);
2132
2070
  return netStatus;
2133
2071
  }
2134
2072
  // update cache
@@ -2136,7 +2074,7 @@ class EmberAdapter extends __1.Adapter {
2136
2074
  this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
2137
2075
  const [netKeyStatus, netKeyInfo] = (await this.ezsp.ezspGetNetworkKeyInfo());
2138
2076
  if (netKeyStatus !== enums_2.SLStatus.OK) {
2139
- console.error(`[BACKUP] Failed to get network keys info.`);
2077
+ logger_1.logger.error(`[BACKUP] Failed to get network keys info.`, NS);
2140
2078
  return ((netKeyStatus === enums_2.SLStatus.BUSY) || (netKeyStatus === enums_2.SLStatus.NOT_READY))
2141
2079
  ? enums_2.EmberStatus.NETWORK_BUSY : enums_2.EmberStatus.ERR_FATAL; // allow retry on statuses that should be temporary
2142
2080
  }
@@ -2152,7 +2090,6 @@ class EmberAdapter extends __1.Adapter {
2152
2090
  // this.ezsp,
2153
2091
  // Buffer.from(this.networkCache.eui64.substring(2/*0x*/), 'hex').reverse()
2154
2092
  // ));
2155
- // console.log(tokensBuf.toString('hex'));
2156
2093
  let context = (0, initters_1.initSecurityManagerContext)();
2157
2094
  context.coreKeyType = enums_2.SecManKeyType.TC_LINK;
2158
2095
  const [tcLinkKey, tclkStatus] = (await this.ezsp.ezspExportKey(context));
@@ -2211,29 +2148,50 @@ class EmberAdapter extends __1.Adapter {
2211
2148
  this.checkInterpanLock();
2212
2149
  // first call will cache for the others, but in all likelihood, it will all be from freshly cached after init
2213
2150
  // since Controller caches this also.
2151
+ const channel = (await this.emberGetRadioChannel());
2214
2152
  const panID = (await this.emberGetPanId());
2215
2153
  const extendedPanID = (await this.emberGetExtendedPanId());
2216
- const channel = (await this.emberGetRadioChannel());
2217
2154
  resolve({
2218
- panID: panID,
2155
+ panID,
2219
2156
  extendedPanID: parseInt(Buffer.from(extendedPanID).toString('hex'), 16),
2220
- channel: channel,
2157
+ channel,
2221
2158
  });
2222
2159
  return enums_2.EmberStatus.SUCCESS;
2223
2160
  }, reject);
2224
2161
  });
2225
2162
  }
2163
+ async supportsChangeChannel() {
2164
+ return true;
2165
+ }
2166
+ // queued
2167
+ async changeChannel(newChannel) {
2168
+ return new Promise((resolve, reject) => {
2169
+ this.requestQueue.enqueue(async () => {
2170
+ this.checkInterpanLock();
2171
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2172
+ const [status, apsFrame, messageTag] = (await this.emberChannelChangeRequest(consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS, newChannel, DEFAULT_APS_OPTIONS));
2173
+ if (status !== enums_2.EmberStatus.SUCCESS) {
2174
+ logger_1.logger.error(`[ZDO] Failed broadcast channel change to "${newChannel}" with status=${enums_2.EmberStatus[status]}.`, NS);
2175
+ return status;
2176
+ }
2177
+ await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED }, DEFAULT_NETWORK_REQUEST_TIMEOUT * 2, // observed to ~9sec
2178
+ '[ZDO] Change Channel');
2179
+ resolve();
2180
+ return enums_2.EmberStatus.SUCCESS;
2181
+ }, reject);
2182
+ });
2183
+ }
2226
2184
  // queued
2227
2185
  async setTransmitPower(value) {
2228
2186
  if (typeof value !== 'number') {
2229
- console.error(`Tried to set transmit power to non-number. Value ${value} of type ${typeof value}.`);
2187
+ logger_1.logger.error(`Tried to set transmit power to non-number. Value ${value} of type ${typeof value}.`, NS);
2230
2188
  return;
2231
2189
  }
2232
2190
  return new Promise((resolve, reject) => {
2233
2191
  this.requestQueue.enqueue(async () => {
2234
2192
  const status = await this.ezsp.ezspSetRadioPower(value);
2235
2193
  if (status !== enums_2.EmberStatus.SUCCESS) {
2236
- console.error(`Failed to set transmit power to ${value} status=${enums_2.EmberStatus[status]}.`);
2194
+ logger_1.logger.error(`Failed to set transmit power to ${value} status=${enums_2.EmberStatus[status]}.`, NS);
2237
2195
  return status;
2238
2196
  }
2239
2197
  resolve();
@@ -2244,41 +2202,45 @@ class EmberAdapter extends __1.Adapter {
2244
2202
  // queued
2245
2203
  async addInstallCode(ieeeAddress, key) {
2246
2204
  if (!key) {
2247
- throw new Error(`[ADD INSTALL CODE] Failed for "${ieeeAddress}"; no code given.`);
2248
- }
2249
- if (consts_2.EMBER_INSTALL_CODE_SIZES.indexOf(key.length) === -1) {
2250
- throw new Error(`[ADD INSTALL CODE] Failed for "${ieeeAddress}"; invalid code size.`);
2205
+ throw new Error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}'; no code given.`);
2251
2206
  }
2252
- // Reverse the bits in a byte (uint8_t)
2253
- const reverse = (b) => {
2254
- return (((b * 0x0802 & 0x22110) | (b * 0x8020 & 0x88440)) * 0x10101 >> 16) & 0xFF;
2255
- };
2256
- let crc = 0xFFFF; // uint16_t
2257
- // Compute the CRC and verify that it matches.
2258
- // The bit reversals, byte swap, and ones' complement are due to differences between halCommonCrc16 and the Smart Energy version.
2259
- for (let index = 0; index < (key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE); index++) {
2260
- crc = (0, math_1.halCommonCrc16)(reverse(key[index]), crc);
2261
- }
2262
- crc = (~(0, math_1.highLowToInt)(reverse((0, math_1.lowByte)(crc)), reverse((0, math_1.highByte)(crc)))) & 0xFFFF;
2263
- if (key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE] !== (0, math_1.lowByte)(crc) || key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE + 1] !== (0, math_1.highByte)(crc)) {
2264
- throw new Error(`[ADD INSTALL CODE] Failed for "${ieeeAddress}"; invalid code CRC.`);
2207
+ // codes with CRC, check CRC before sending to NCP, otherwise let NCP handle
2208
+ if (consts_2.EMBER_INSTALL_CODE_SIZES.indexOf(key.length) !== -1) {
2209
+ // Reverse the bits in a byte (uint8_t)
2210
+ const reverse = (b) => {
2211
+ return (((b * 0x0802 & 0x22110) | (b * 0x8020 & 0x88440)) * 0x10101 >> 16) & 0xFF;
2212
+ };
2213
+ let crc = 0xFFFF; // uint16_t
2214
+ // Compute the CRC and verify that it matches.
2215
+ // The bit reversals, byte swap, and ones' complement are due to differences between halCommonCrc16 and the Smart Energy version.
2216
+ for (let index = 0; index < (key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE); index++) {
2217
+ crc = (0, math_1.halCommonCrc16)(reverse(key[index]), crc);
2218
+ }
2219
+ crc = (~(0, math_1.highLowToInt)(reverse((0, math_1.lowByte)(crc)), reverse((0, math_1.highByte)(crc)))) & 0xFFFF;
2220
+ if (key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE] !== (0, math_1.lowByte)(crc)
2221
+ || key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE + 1] !== (0, math_1.highByte)(crc)) {
2222
+ throw new Error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}'; invalid code CRC.`);
2223
+ }
2224
+ else {
2225
+ logger_1.logger.debug(`[ADD INSTALL CODE] CRC validated for '${ieeeAddress}'.`, NS);
2226
+ }
2265
2227
  }
2266
2228
  return new Promise((resolve, reject) => {
2267
2229
  this.requestQueue.enqueue(async () => {
2268
2230
  // Compute the key from the install code and CRC.
2269
2231
  const [aesStatus, keyContents] = (await this.emberAesHashSimple(key));
2270
2232
  if (aesStatus !== enums_2.EmberStatus.SUCCESS) {
2271
- console.error(`[ADD INSTALL CODE] Failed AES hash for "${ieeeAddress}" with status=${enums_2.EmberStatus[aesStatus]}.`);
2233
+ logger_1.logger.error(`[ADD INSTALL CODE] Failed AES hash for '${ieeeAddress}' with status=${enums_2.EmberStatus[aesStatus]}.`, NS);
2272
2234
  return aesStatus;
2273
2235
  }
2274
2236
  // Add the key to the transient key table.
2275
2237
  // This will be used while the DUT joins.
2276
2238
  const impStatus = (await this.ezsp.ezspImportTransientKey(ieeeAddress, { contents: keyContents }, enums_2.SecManFlag.NONE));
2277
2239
  if (impStatus == enums_2.SLStatus.OK) {
2278
- debug(`[ADD INSTALL CODE] Success for "${ieeeAddress}".`);
2240
+ logger_1.logger.debug(`[ADD INSTALL CODE] Success for '${ieeeAddress}'.`, NS);
2279
2241
  }
2280
2242
  else {
2281
- console.error(`[ADD INSTALL CODE] Failed for "${ieeeAddress}" with status=${enums_2.SLStatus[impStatus]}.`);
2243
+ logger_1.logger.error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}' with status=${enums_2.SLStatus[impStatus]}.`, NS);
2282
2244
  return enums_2.EmberStatus.ERR_FATAL;
2283
2245
  }
2284
2246
  resolve();
@@ -2315,34 +2277,47 @@ class EmberAdapter extends __1.Adapter {
2315
2277
  if (seconds) {
2316
2278
  const plaintextKey = { contents: Buffer.from(consts_2.ZIGBEE_PROFILE_INTEROPERABILITY_LINK_KEY) };
2317
2279
  const impKeyStatus = (await this.ezsp.ezspImportTransientKey(consts_2.BLANK_EUI64, plaintextKey, enums_2.SecManFlag.NONE));
2318
- debug(`[ZDO] Pre joining import transient key status=${enums_2.SLStatus[impKeyStatus]}.`);
2319
- return impKeyStatus === enums_2.SLStatus.OK ? enums_2.EmberStatus.SUCCESS : enums_2.EmberStatus.ERR_FATAL;
2280
+ if (impKeyStatus !== enums_2.SLStatus.OK) {
2281
+ logger_1.logger.error(`[ZDO] Failed import transient key with status=${enums_2.SLStatus[impKeyStatus]}.`, NS);
2282
+ return enums_2.EmberStatus.ERR_FATAL;
2283
+ }
2284
+ const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY));
2285
+ if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
2286
+ logger_1.logger.error(`[ZDO] Failed set join policy with status=${enums_2.EzspStatus[setJPstatus]}.`, NS);
2287
+ return enums_2.EmberStatus.ERR_FATAL;
2288
+ }
2289
+ return enums_2.EmberStatus.SUCCESS;
2320
2290
  }
2321
2291
  else {
2292
+ if (this.manufacturerCode !== DEFAULT_MANUFACTURER_CODE) {
2293
+ logger_1.logger.debug(`[WORKAROUND] Reverting coordinator manufacturer code to default.`, NS);
2294
+ await this.ezsp.ezspSetManufacturerCode(DEFAULT_MANUFACTURER_CODE);
2295
+ this.manufacturerCode = DEFAULT_MANUFACTURER_CODE;
2296
+ }
2322
2297
  await this.ezsp.ezspClearTransientLinkKeys();
2323
2298
  const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.ALLOW_REJOINS_ONLY));
2324
2299
  if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
2325
- console.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`);
2300
+ logger_1.logger.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`, NS);
2326
2301
  return enums_2.EmberStatus.ERR_FATAL;
2327
2302
  }
2328
2303
  return enums_2.EmberStatus.SUCCESS;
2329
2304
  }
2330
2305
  };
2331
- // NOTE: can't ZDO PJ on coordinator, so if network address is null or zero (coordinator), using local permit join
2332
2306
  if (networkAddress) {
2307
+ // specific device that is not `Coordinator`
2333
2308
  return new Promise((resolve, reject) => {
2334
2309
  this.requestQueue.enqueue(async () => {
2335
2310
  this.checkInterpanLock();
2336
2311
  const pjStatus = (await preJoining());
2337
2312
  if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
2338
- console.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`);
2313
+ logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
2339
2314
  return pjStatus;
2340
2315
  }
2341
2316
  // `authentication`: TC significance always 1 (zb specs)
2342
2317
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2343
2318
  const [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(networkAddress, seconds, 1, 0));
2344
2319
  if (status !== enums_2.EmberStatus.SUCCESS) {
2345
- console.error(`[ZDO] Failed permit joining request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`);
2320
+ logger_1.logger.error(`[ZDO] Failed permit joining request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2346
2321
  return status;
2347
2322
  }
2348
2323
  (await this.oneWaitress.startWaitingFor({
@@ -2356,19 +2331,20 @@ class EmberAdapter extends __1.Adapter {
2356
2331
  });
2357
2332
  }
2358
2333
  else {
2359
- // no device specified to open, open coordinator + broadcast
2334
+ // coordinator-only, or all
2360
2335
  return new Promise((resolve, reject) => {
2361
2336
  this.requestQueue.enqueue(async () => {
2362
2337
  this.checkInterpanLock();
2363
2338
  const pjStatus = (await preJoining());
2364
2339
  if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
2365
- console.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`);
2340
+ logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
2366
2341
  return pjStatus;
2367
2342
  }
2343
+ // local permit join if `Coordinator`-only requested, else local + broadcast
2368
2344
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2369
- const [status, apsFrame, messageTag] = (await this.emberPermitJoining(seconds, true /*broadcast*/));
2345
+ const [status, apsFrame, messageTag] = (await this.emberPermitJoining(seconds, (networkAddress === consts_2.ZIGBEE_COORDINATOR_ADDRESS) ? false : true));
2370
2346
  if (status !== enums_2.EmberStatus.SUCCESS) {
2371
- console.error(`[ZDO] Failed permit joining request with status=${enums_2.EmberStatus[status]}.`);
2347
+ logger_1.logger.error(`[ZDO] Failed permit joining request with status=${enums_2.EmberStatus[status]}.`, NS);
2372
2348
  return status;
2373
2349
  }
2374
2350
  // NOTE: because Z2M is refreshing the permit join duration early to prevent it from closing
@@ -2399,9 +2375,9 @@ class EmberAdapter extends __1.Adapter {
2399
2375
  const neighbors = [];
2400
2376
  const request = async (startIndex) => {
2401
2377
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2402
- const [reqStatus, apsFrame, messageTag] = (await this.emberLqiTableRequest(networkAddress, startIndex, this.defaultApsOptions));
2378
+ const [reqStatus, apsFrame, messageTag] = (await this.emberLqiTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
2403
2379
  if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
2404
- console.error(`[ZDO] Failed LQI request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`);
2380
+ logger_1.logger.error(`[ZDO] Failed LQI request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
2405
2381
  return [reqStatus, null, null];
2406
2382
  }
2407
2383
  const result = (await this.oneWaitress.startWaitingFor({
@@ -2446,9 +2422,9 @@ class EmberAdapter extends __1.Adapter {
2446
2422
  const table = [];
2447
2423
  const request = async (startIndex) => {
2448
2424
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2449
- const [reqStatus, apsFrame, messageTag] = (await this.emberRoutingTableRequest(networkAddress, startIndex, this.defaultApsOptions));
2425
+ const [reqStatus, apsFrame, messageTag] = (await this.emberRoutingTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
2450
2426
  if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
2451
- console.error(`[ZDO] Failed routing table request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`);
2427
+ logger_1.logger.error(`[ZDO] Failed routing table request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
2452
2428
  return [reqStatus, null, null];
2453
2429
  }
2454
2430
  const result = (await this.oneWaitress.startWaitingFor({
@@ -2492,9 +2468,9 @@ class EmberAdapter extends __1.Adapter {
2492
2468
  this.requestQueue.enqueue(async () => {
2493
2469
  this.checkInterpanLock();
2494
2470
  /* eslint-disable @typescript-eslint/no-unused-vars */
2495
- const [status, apsFrame, messageTag] = (await this.emberNodeDescriptorRequest(networkAddress, this.defaultApsOptions));
2471
+ const [status, apsFrame, messageTag] = (await this.emberNodeDescriptorRequest(networkAddress, DEFAULT_APS_OPTIONS));
2496
2472
  if (status !== enums_2.EmberStatus.SUCCESS) {
2497
- console.error(`[ZDO] Failed node descriptor for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`);
2473
+ logger_1.logger.error(`[ZDO] Failed node descriptor for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2498
2474
  return status;
2499
2475
  }
2500
2476
  const result = (await this.oneWaitress.startWaitingFor({
@@ -2516,9 +2492,9 @@ class EmberAdapter extends __1.Adapter {
2516
2492
  }
2517
2493
  // always 0 before rev. 21 where field was added
2518
2494
  if (result.stackRevision < CURRENT_ZIGBEE_SPEC_REVISION) {
2519
- console.warn(`[ZDO] Node descriptor for "${networkAddress}" reports device is only compliant to revision `
2495
+ logger_1.logger.warning(`[ZDO] Node descriptor for "${networkAddress}" reports device is only compliant to revision `
2520
2496
  + `"${(result.stackRevision < 21) ? 'pre-21' : result.stackRevision}" of the ZigBee specification `
2521
- + `(current revision: ${CURRENT_ZIGBEE_SPEC_REVISION}).`);
2497
+ + `(current revision: ${CURRENT_ZIGBEE_SPEC_REVISION}).`, NS);
2522
2498
  }
2523
2499
  resolve({ type, manufacturerCode: result.manufacturerCode });
2524
2500
  return enums_2.EmberStatus.SUCCESS;
@@ -2531,9 +2507,9 @@ class EmberAdapter extends __1.Adapter {
2531
2507
  this.requestQueue.enqueue(async () => {
2532
2508
  this.checkInterpanLock();
2533
2509
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2534
- const [status, apsFrame, messageTag] = (await this.emberActiveEndpointsRequest(networkAddress, this.defaultApsOptions));
2510
+ const [status, apsFrame, messageTag] = (await this.emberActiveEndpointsRequest(networkAddress, DEFAULT_APS_OPTIONS));
2535
2511
  if (status !== enums_2.EmberStatus.SUCCESS) {
2536
- console.error(`[ZDO] Failed active endpoints request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`);
2512
+ logger_1.logger.error(`[ZDO] Failed active endpoints request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2537
2513
  return status;
2538
2514
  }
2539
2515
  const result = (await this.oneWaitress.startWaitingFor({
@@ -2552,10 +2528,10 @@ class EmberAdapter extends __1.Adapter {
2552
2528
  this.requestQueue.enqueue(async () => {
2553
2529
  this.checkInterpanLock();
2554
2530
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2555
- const [status, apsFrame, messageTag] = (await this.emberSimpleDescriptorRequest(networkAddress, endpointID, this.defaultApsOptions));
2531
+ const [status, apsFrame, messageTag] = (await this.emberSimpleDescriptorRequest(networkAddress, endpointID, DEFAULT_APS_OPTIONS));
2556
2532
  if (status !== enums_2.EmberStatus.SUCCESS) {
2557
- console.error(`[ZDO] Failed simple descriptor request for "${networkAddress}" endpoint "${endpointID}" `
2558
- + `with status=${enums_2.EmberStatus[status]}.`);
2533
+ logger_1.logger.error(`[ZDO] Failed simple descriptor request for "${networkAddress}" endpoint "${endpointID}" `
2534
+ + `with status=${enums_2.EmberStatus[status]}.`, NS);
2559
2535
  return status;
2560
2536
  }
2561
2537
  const result = (await this.oneWaitress.startWaitingFor({
@@ -2583,10 +2559,10 @@ class EmberAdapter extends __1.Adapter {
2583
2559
  this.checkInterpanLock();
2584
2560
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2585
2561
  const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
2586
- destinationEndpoint, this.defaultApsOptions));
2562
+ destinationEndpoint, DEFAULT_APS_OPTIONS));
2587
2563
  if (status !== enums_2.EmberStatus.SUCCESS) {
2588
- console.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2589
- + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`);
2564
+ logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2565
+ + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
2590
2566
  return status;
2591
2567
  }
2592
2568
  await this.oneWaitress.startWaitingFor({
@@ -2607,10 +2583,10 @@ class EmberAdapter extends __1.Adapter {
2607
2583
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2608
2584
  const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
2609
2585
  destinationAddressOrGroup, destinationEndpoint, // doesn't matter
2610
- this.defaultApsOptions));
2586
+ DEFAULT_APS_OPTIONS));
2611
2587
  if (status !== enums_2.EmberStatus.SUCCESS) {
2612
- console.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2613
- + `with status=${enums_2.EmberStatus[status]}.`);
2588
+ logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2589
+ + `with status=${enums_2.EmberStatus[status]}.`, NS);
2614
2590
  return status;
2615
2591
  }
2616
2592
  await this.oneWaitress.startWaitingFor({
@@ -2633,10 +2609,10 @@ class EmberAdapter extends __1.Adapter {
2633
2609
  this.checkInterpanLock();
2634
2610
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2635
2611
  const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
2636
- destinationEndpoint, this.defaultApsOptions));
2612
+ destinationEndpoint, DEFAULT_APS_OPTIONS));
2637
2613
  if (status !== enums_2.EmberStatus.SUCCESS) {
2638
- console.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2639
- + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`);
2614
+ logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2615
+ + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
2640
2616
  return status;
2641
2617
  }
2642
2618
  await this.oneWaitress.startWaitingFor({
@@ -2657,10 +2633,10 @@ class EmberAdapter extends __1.Adapter {
2657
2633
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2658
2634
  const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
2659
2635
  destinationAddressOrGroup, destinationEndpoint, // doesn't matter
2660
- this.defaultApsOptions));
2636
+ DEFAULT_APS_OPTIONS));
2661
2637
  if (status !== enums_2.EmberStatus.SUCCESS) {
2662
- console.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2663
- + `with status=${enums_2.EmberStatus[status]}.`);
2638
+ logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2639
+ + `with status=${enums_2.EmberStatus[status]}.`, NS);
2664
2640
  return status;
2665
2641
  }
2666
2642
  await this.oneWaitress.startWaitingFor({
@@ -2680,10 +2656,10 @@ class EmberAdapter extends __1.Adapter {
2680
2656
  this.requestQueue.enqueue(async () => {
2681
2657
  this.checkInterpanLock();
2682
2658
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2683
- const [status, apsFrame, messageTag] = (await this.emberLeaveRequest(networkAddress, ieeeAddr, enums_2.EmberLeaveRequestFlags.WITHOUT_REJOIN, this.defaultApsOptions));
2659
+ const [status, apsFrame, messageTag] = (await this.emberLeaveRequest(networkAddress, ieeeAddr, enums_2.EmberLeaveRequestFlags.WITHOUT_REJOIN, DEFAULT_APS_OPTIONS));
2684
2660
  if (status !== enums_2.EmberStatus.SUCCESS) {
2685
- console.error(`[ZDO] Failed remove device request for "${networkAddress}" target "${ieeeAddr}" `
2686
- + `with status=${enums_2.EmberStatus[status]}.`);
2661
+ logger_1.logger.error(`[ZDO] Failed remove device request for "${networkAddress}" target "${ieeeAddr}" `
2662
+ + `with status=${enums_2.EmberStatus[status]}.`, NS);
2687
2663
  return status;
2688
2664
  }
2689
2665
  await this.oneWaitress.startWaitingFor({
@@ -2701,20 +2677,20 @@ class EmberAdapter extends __1.Adapter {
2701
2677
  async sendZclFrameToEndpoint(ieeeAddr, networkAddress, endpoint, zclFrame, timeout, disableResponse, disableRecovery, sourceEndpoint) {
2702
2678
  const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
2703
2679
  endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2704
- const command = zclFrame.getCommand();
2680
+ const command = zclFrame.command;
2705
2681
  let commandResponseId = null;
2706
2682
  if (command.hasOwnProperty('response') && disableResponse === false) {
2707
2683
  commandResponseId = command.response;
2708
2684
  }
2709
- else if (!zclFrame.Header.frameControl.disableDefaultResponse) {
2710
- commandResponseId = zcl_1.Foundation.defaultRsp.ID;
2685
+ else if (!zclFrame.header.frameControl.disableDefaultResponse) {
2686
+ commandResponseId = Zcl.Foundation.defaultRsp.ID;
2711
2687
  }
2712
2688
  const apsFrame = {
2713
2689
  profileId: sourceEndpointInfo.profileId,
2714
- clusterId: zclFrame.Cluster.ID,
2690
+ clusterId: zclFrame.cluster.ID,
2715
2691
  sourceEndpoint: sourceEndpointInfo.endpoint,
2716
2692
  destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2717
- options: this.defaultApsOptions,
2693
+ options: DEFAULT_APS_OPTIONS,
2718
2694
  groupId: 0,
2719
2695
  sequence: 0, // set by stack
2720
2696
  };
@@ -2732,16 +2708,12 @@ class EmberAdapter extends __1.Adapter {
2732
2708
  return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2733
2709
  }
2734
2710
  }
2735
- // track group changes in NCP multicast table
2736
- if (apsFrame.clusterId === cluster_1.default.genGroups.ID) {
2737
- await this.onGroupChange(command.ID, zclFrame.Payload.groupid);
2738
- }
2739
- debug(`~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.Header)}]`);
2711
+ logger_1.logger.debug(`~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2740
2712
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2741
2713
  const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.DIRECT, networkAddress, apsFrame, data, 0, // alias
2742
2714
  0));
2743
2715
  if (status !== enums_2.EmberStatus.SUCCESS) {
2744
- console.error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_2.EmberStatus[status]}.`);
2716
+ logger_1.logger.error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_2.EmberStatus[status]}.`, NS);
2745
2717
  return status; // let queue handle retry based on status
2746
2718
  }
2747
2719
  if (commandResponseId != null) {
@@ -2749,7 +2721,7 @@ class EmberAdapter extends __1.Adapter {
2749
2721
  const result = (await this.oneWaitress.startWaitingFor({
2750
2722
  target: networkAddress,
2751
2723
  apsFrame,
2752
- zclSequence: zclFrame.Header.transactionSequenceNumber,
2724
+ zclSequence: zclFrame.header.transactionSequenceNumber,
2753
2725
  commandIdentifier: commandResponseId,
2754
2726
  }, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT));
2755
2727
  resolve(result);
@@ -2767,10 +2739,10 @@ class EmberAdapter extends __1.Adapter {
2767
2739
  endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2768
2740
  const apsFrame = {
2769
2741
  profileId: sourceEndpointInfo.profileId,
2770
- clusterId: zclFrame.Cluster.ID,
2742
+ clusterId: zclFrame.cluster.ID,
2771
2743
  sourceEndpoint: sourceEndpointInfo.endpoint,
2772
2744
  destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2773
- options: this.defaultApsOptions,
2745
+ options: DEFAULT_APS_OPTIONS,
2774
2746
  groupId: groupID,
2775
2747
  sequence: 0, // set by stack
2776
2748
  };
@@ -2784,13 +2756,13 @@ class EmberAdapter extends __1.Adapter {
2784
2756
  return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2785
2757
  }
2786
2758
  }
2787
- debug(`~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.Header)}]`);
2759
+ logger_1.logger.debug(`~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2788
2760
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2789
2761
  const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.MULTICAST, apsFrame.groupId, // not used for MC
2790
2762
  apsFrame, data, 0, // alias
2791
2763
  0));
2792
2764
  if (status !== enums_2.EmberStatus.SUCCESS) {
2793
- console.error(`~x~> [ZCL GROUP] Failed to send with status=${enums_2.EmberStatus[status]}.`);
2765
+ logger_1.logger.error(`~x~> [ZCL GROUP] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2794
2766
  return status; // let queue handle retry based on status
2795
2767
  }
2796
2768
  // NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
@@ -2800,16 +2772,16 @@ class EmberAdapter extends __1.Adapter {
2800
2772
  });
2801
2773
  }
2802
2774
  // queued, non-InterPAN
2803
- async sendZclFrameToAll(endpoint, zclFrame, sourceEndpoint) {
2775
+ async sendZclFrameToAll(endpoint, zclFrame, sourceEndpoint, destination) {
2804
2776
  const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
2805
2777
  endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2806
2778
  const apsFrame = {
2807
2779
  profileId: sourceEndpointInfo.profileId,
2808
- clusterId: zclFrame.Cluster.ID,
2780
+ clusterId: zclFrame.cluster.ID,
2809
2781
  sourceEndpoint: sourceEndpointInfo.endpoint,
2810
2782
  destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2811
- options: this.defaultApsOptions,
2812
- groupId: consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS,
2783
+ options: DEFAULT_APS_OPTIONS,
2784
+ groupId: destination,
2813
2785
  sequence: 0, // set by stack
2814
2786
  };
2815
2787
  const data = zclFrame.toBuffer();
@@ -2817,17 +2789,17 @@ class EmberAdapter extends __1.Adapter {
2817
2789
  this.requestQueue.enqueue(async () => {
2818
2790
  this.checkInterpanLock();
2819
2791
  if (CHECK_APS_PAYLOAD_LENGTH) {
2820
- const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.BROADCAST, consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS, apsFrame));
2792
+ const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame));
2821
2793
  if (data.length > maxPayloadLength) {
2822
2794
  return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2823
2795
  }
2824
2796
  }
2825
- debug(`~~~> [ZCL BROADCAST apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.Header)}]`);
2797
+ logger_1.logger.debug(`~~~> [ZCL BROADCAST apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2826
2798
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2827
- const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.BROADCAST, consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS, apsFrame, data, 0, // alias
2799
+ const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame, data, 0, // alias
2828
2800
  0));
2829
2801
  if (status !== enums_2.EmberStatus.SUCCESS) {
2830
- console.error(`~x~> [ZCL BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`);
2802
+ logger_1.logger.error(`~x~> [ZCL BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2831
2803
  return status; // let queue handle retry based on status
2832
2804
  }
2833
2805
  // NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
@@ -2842,7 +2814,7 @@ class EmberAdapter extends __1.Adapter {
2842
2814
  // queued
2843
2815
  async setChannelInterPAN(channel) {
2844
2816
  if (typeof channel !== 'number') {
2845
- console.error(`Tried to set channel InterPAN to non-number. Channel ${channel} of type ${typeof channel}.`);
2817
+ logger_1.logger.error(`Tried to set channel InterPAN to non-number. Channel ${channel} of type ${typeof channel}.`, NS);
2846
2818
  return;
2847
2819
  }
2848
2820
  return new Promise((resolve, reject) => {
@@ -2851,7 +2823,7 @@ class EmberAdapter extends __1.Adapter {
2851
2823
  const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(channel));
2852
2824
  if (status !== enums_2.EmberStatus.SUCCESS) {
2853
2825
  this.interpanLock = false; // XXX: ok?
2854
- console.error(`Failed to set InterPAN channel to ${channel} with status=${enums_2.EmberStatus[status]}.`);
2826
+ logger_1.logger.error(`Failed to set InterPAN channel to ${channel} with status=${enums_2.EmberStatus[status]}.`, NS);
2855
2827
  return status;
2856
2828
  }
2857
2829
  resolve();
@@ -2875,12 +2847,12 @@ class EmberAdapter extends __1.Adapter {
2875
2847
  msgBuffalo.writeIeeeAddr(sourceEui64); // sourceAddress
2876
2848
  msgBuffalo.writeUInt16(consts_2.STUB_NWK_FRAME_CONTROL); // nwkFrameControl
2877
2849
  msgBuffalo.writeUInt8((enums_2.EmberInterpanMessageType.UNICAST | consts_2.INTERPAN_APS_FRAME_TYPE)); // apsFrameControl
2878
- msgBuffalo.writeUInt16(zclFrame.Cluster.ID);
2850
+ msgBuffalo.writeUInt16(zclFrame.cluster.ID);
2879
2851
  msgBuffalo.writeUInt16(consts_2.TOUCHLINK_PROFILE_ID);
2880
- debug(`~~~> [ZCL TOUCHLINK to=${ieeeAddress} header=${JSON.stringify(zclFrame.Header)}]`);
2852
+ logger_1.logger.debug(`~~~> [ZCL TOUCHLINK to=${ieeeAddress} header=${JSON.stringify(zclFrame.header)}]`, NS);
2881
2853
  const status = (await this.ezsp.ezspSendRawMessage(Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()])));
2882
2854
  if (status !== enums_2.EmberStatus.SUCCESS) {
2883
- console.error(`~x~> [ZCL TOUCHLINK to=${ieeeAddress}] Failed to send with status=${enums_2.EmberStatus[status]}.`);
2855
+ logger_1.logger.error(`~x~> [ZCL TOUCHLINK to=${ieeeAddress}] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2884
2856
  return status;
2885
2857
  }
2886
2858
  // NOTE: can use ezspRawTransmitCompleteHandler if needed here
@@ -2891,14 +2863,14 @@ class EmberAdapter extends __1.Adapter {
2891
2863
  }
2892
2864
  // queued
2893
2865
  async sendZclFrameInterPANBroadcast(zclFrame, timeout) {
2894
- const command = zclFrame.getCommand();
2866
+ const command = zclFrame.command;
2895
2867
  if (!command.hasOwnProperty('response')) {
2896
2868
  throw new Error(`Command '${command.name}' has no response, cannot wait for response.`);
2897
2869
  }
2898
2870
  // just for waitress
2899
2871
  const apsFrame = {
2900
2872
  profileId: consts_2.TOUCHLINK_PROFILE_ID,
2901
- clusterId: zclFrame.Cluster.ID,
2873
+ clusterId: zclFrame.cluster.ID,
2902
2874
  sourceEndpoint: 0,
2903
2875
  destinationEndpoint: 0,
2904
2876
  options: enums_2.EmberApsOption.NONE,
@@ -2922,17 +2894,17 @@ class EmberAdapter extends __1.Adapter {
2922
2894
  msgBuffalo.writeUInt16(apsFrame.clusterId);
2923
2895
  msgBuffalo.writeUInt16(apsFrame.profileId);
2924
2896
  const data = Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()]);
2925
- debug(`~~~> [ZCL TOUCHLINK BROADCAST header=${JSON.stringify(zclFrame.Header)}]`);
2897
+ logger_1.logger.debug(`~~~> [ZCL TOUCHLINK BROADCAST header=${JSON.stringify(zclFrame.header)}]`, NS);
2926
2898
  const status = (await this.ezsp.ezspSendRawMessage(data));
2927
2899
  if (status !== enums_2.EmberStatus.SUCCESS) {
2928
- console.error(`~x~> [ZCL TOUCHLINK BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`);
2900
+ logger_1.logger.error(`~x~> [ZCL TOUCHLINK BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2929
2901
  return status;
2930
2902
  }
2931
2903
  // NOTE: can use ezspRawTransmitCompleteHandler if needed here
2932
2904
  const result = (await this.oneWaitress.startWaitingFor({
2933
2905
  target: null,
2934
2906
  apsFrame: apsFrame,
2935
- zclSequence: zclFrame.Header.transactionSequenceNumber,
2907
+ zclSequence: zclFrame.header.transactionSequenceNumber,
2936
2908
  commandIdentifier: command.response,
2937
2909
  }, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT * 2)); // XXX: touchlink timeout?
2938
2910
  resolve(result);
@@ -2946,7 +2918,7 @@ class EmberAdapter extends __1.Adapter {
2946
2918
  this.requestQueue.enqueue(async () => {
2947
2919
  const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(this.networkOptions.channelList[0]));
2948
2920
  if (status !== enums_2.EmberStatus.SUCCESS) {
2949
- console.error(`Failed to restore InterPAN channel to ${this.networkOptions.channelList[0]} with status=${enums_2.EmberStatus[status]}.`);
2921
+ logger_1.logger.error(`Failed to restore InterPAN channel to ${this.networkOptions.channelList[0]} with status=${enums_2.EmberStatus[status]}.`, NS);
2950
2922
  return status;
2951
2923
  }
2952
2924
  // let adapter settle down
@@ -2960,7 +2932,7 @@ class EmberAdapter extends __1.Adapter {
2960
2932
  //-- END Adapter implementation
2961
2933
  checkInterpanLock() {
2962
2934
  if (this.interpanLock) {
2963
- console.error(`[INTERPAN MODE] Cannot execute non-InterPAN commands.`);
2935
+ logger_1.logger.error(`[INTERPAN MODE] Cannot execute non-InterPAN commands.`, NS);
2964
2936
  // will be caught by request queue and rejected internally.
2965
2937
  throw new Error(enums_2.EzspStatus[enums_2.EzspStatus.ERROR_INVALID_CALL]);
2966
2938
  }