@willieee802/zigbee-herdsman 0.48.2 → 0.49.0

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 (1025) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  2. package/.github/copilot-instructions.md +689 -0
  3. package/.github/dependabot.yml +22 -0
  4. package/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +294 -0
  5. package/.github/prompts/create-agentsmd.prompt.md +249 -0
  6. package/.github/prompts/create-specification.prompt.md +127 -0
  7. package/.github/prompts/review-and-refactor.prompt.md +15 -0
  8. package/.github/prompts/update-specification.prompt.md +127 -0
  9. package/.github/workflows/ci.yml +70 -0
  10. package/.github/workflows/release-please.yml +18 -0
  11. package/.github/workflows/stale.yml +20 -0
  12. package/.github/workflows/typedoc.yaml +47 -0
  13. package/.release-please-manifest.json +2 -2
  14. package/.vscode/extensions.json +3 -0
  15. package/.vscode/settings.json +11 -0
  16. package/AGENTS.md +441 -0
  17. package/CHANGELOG.md +1245 -0
  18. package/README.md +2 -2
  19. package/biome.json +103 -0
  20. package/examples/join-and-log.js +18 -18
  21. package/package.json +83 -70
  22. package/release-please-config.json +8 -8
  23. package/scripts/check-clusters-changes.ts +328 -0
  24. package/scripts/clusters-changes.log +584 -0
  25. package/scripts/clusters-typegen.ts +608 -0
  26. package/scripts/utils.ts +88 -0
  27. package/scripts/zap-update-clusters-report.json +303 -0
  28. package/scripts/zap-update-clusters.ts +1520 -0
  29. package/scripts/zap-update-types.ts +707 -0
  30. package/scripts/zap-xml-clusters-overrides-data.ts +52 -0
  31. package/scripts/zap-xml-clusters-overrides.ts +400 -0
  32. package/scripts/zap-xml-types.ts +146 -0
  33. package/src/adapter/adapter.ts +210 -0
  34. package/src/adapter/adapterDiscovery.ts +736 -0
  35. package/src/adapter/const.ts +12 -0
  36. package/src/adapter/deconz/adapter/deconzAdapter.ts +888 -0
  37. package/src/adapter/deconz/driver/constants.ts +246 -0
  38. package/src/adapter/deconz/driver/driver.ts +1528 -0
  39. package/src/adapter/deconz/driver/frame.ts +11 -0
  40. package/src/adapter/deconz/driver/frameParser.ts +766 -0
  41. package/src/adapter/deconz/driver/parser.ts +45 -0
  42. package/src/adapter/deconz/driver/writer.ts +22 -0
  43. package/src/adapter/deconz/types.d.ts +13 -0
  44. package/src/adapter/ember/adapter/emberAdapter.ts +2262 -0
  45. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  46. package/src/adapter/ember/adapter/oneWaitress.ts +324 -0
  47. package/src/adapter/ember/adapter/tokensManager.ts +780 -0
  48. package/src/adapter/ember/consts.ts +178 -0
  49. package/src/adapter/ember/enums.ts +1746 -0
  50. package/src/adapter/ember/ezsp/buffalo.ts +1392 -0
  51. package/src/adapter/ember/ezsp/consts.ts +148 -0
  52. package/src/adapter/ember/ezsp/enums.ts +1114 -0
  53. package/src/adapter/ember/ezsp/ezsp.ts +9073 -0
  54. package/src/adapter/ember/ezspError.ts +10 -0
  55. package/src/adapter/ember/types.ts +866 -0
  56. package/src/adapter/ember/uart/ash.ts +1933 -0
  57. package/src/adapter/ember/uart/consts.ts +109 -0
  58. package/src/adapter/ember/uart/enums.ts +192 -0
  59. package/src/adapter/ember/uart/parser.ts +42 -0
  60. package/src/adapter/ember/uart/queues.ts +247 -0
  61. package/src/adapter/ember/uart/writer.ts +50 -0
  62. package/src/adapter/ember/utils/initters.ts +58 -0
  63. package/src/adapter/ember/utils/math.ts +71 -0
  64. package/src/adapter/events.ts +21 -0
  65. package/src/adapter/ezsp/adapter/backup.ts +100 -0
  66. package/src/adapter/ezsp/adapter/ezspAdapter.ts +632 -0
  67. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  68. package/src/adapter/ezsp/driver/consts.ts +11 -0
  69. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  70. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  71. package/src/adapter/ezsp/driver/frame.ts +101 -0
  72. package/src/adapter/ezsp/driver/index.ts +4 -0
  73. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  74. package/src/adapter/ezsp/driver/parser.ts +81 -0
  75. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  76. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  77. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  78. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  79. package/src/adapter/ezsp/driver/uart.ts +460 -0
  80. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  81. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  82. package/src/adapter/ezsp/driver/writer.ts +64 -0
  83. package/src/adapter/index.ts +3 -0
  84. package/src/adapter/serialPort.ts +58 -0
  85. package/src/adapter/tstype.ts +57 -0
  86. package/src/adapter/utils.ts +41 -0
  87. package/src/adapter/z-stack/adapter/adapter-backup.ts +509 -0
  88. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  89. package/src/adapter/z-stack/adapter/endpoints.ts +60 -0
  90. package/src/adapter/z-stack/adapter/manager.ts +543 -0
  91. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  92. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1350 -0
  93. package/src/adapter/z-stack/constants/af.ts +27 -0
  94. package/src/adapter/z-stack/constants/common.ts +285 -0
  95. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  96. package/src/adapter/z-stack/constants/index.ts +11 -0
  97. package/src/adapter/z-stack/constants/mac.ts +128 -0
  98. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  99. package/src/adapter/z-stack/constants/sys.ts +72 -0
  100. package/src/adapter/z-stack/constants/util.ts +82 -0
  101. package/src/adapter/z-stack/constants/utils.ts +14 -0
  102. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  103. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  104. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  105. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  106. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  107. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  108. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  109. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  110. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  111. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  112. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  113. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  114. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  115. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  116. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  117. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  118. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  119. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  120. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  121. package/src/adapter/z-stack/structs/index.ts +4 -0
  122. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  123. package/src/adapter/z-stack/structs/struct.ts +367 -0
  124. package/src/adapter/z-stack/structs/table.ts +198 -0
  125. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  126. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  127. package/src/adapter/z-stack/unpi/index.ts +4 -0
  128. package/src/adapter/z-stack/unpi/parser.ts +67 -0
  129. package/src/adapter/z-stack/unpi/writer.ts +37 -0
  130. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  131. package/src/adapter/z-stack/utils/index.ts +2 -0
  132. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  133. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  134. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  135. package/src/adapter/z-stack/znp/index.ts +2 -0
  136. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  137. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  138. package/src/adapter/z-stack/znp/utils.ts +10 -0
  139. package/src/adapter/z-stack/znp/znp.ts +345 -0
  140. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  141. package/src/adapter/zboss/adapter/zbossAdapter.ts +535 -0
  142. package/src/adapter/zboss/commands.ts +1184 -0
  143. package/src/adapter/zboss/consts.ts +9 -0
  144. package/src/adapter/zboss/driver.ts +422 -0
  145. package/src/adapter/zboss/enums.ts +360 -0
  146. package/src/adapter/zboss/frame.ts +227 -0
  147. package/src/adapter/zboss/reader.ts +65 -0
  148. package/src/adapter/zboss/types.ts +0 -0
  149. package/src/adapter/zboss/uart.ts +428 -0
  150. package/src/adapter/zboss/utils.ts +58 -0
  151. package/src/adapter/zboss/writer.ts +49 -0
  152. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +25 -0
  153. package/src/adapter/zigate/adapter/zigateAdapter.ts +633 -0
  154. package/src/adapter/zigate/driver/LICENSE +17 -0
  155. package/src/adapter/zigate/driver/buffaloZiGate.ts +210 -0
  156. package/src/adapter/zigate/driver/commandType.ts +418 -0
  157. package/src/adapter/zigate/driver/constants.ts +150 -0
  158. package/src/adapter/zigate/driver/frame.ts +197 -0
  159. package/src/adapter/zigate/driver/messageType.ts +287 -0
  160. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  161. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  162. package/src/adapter/zigate/driver/zigate.ts +422 -0
  163. package/src/adapter/zoh/adapter/utils.ts +27 -0
  164. package/src/adapter/zoh/adapter/zohAdapter.ts +931 -0
  165. package/src/buffalo/buffalo.ts +336 -0
  166. package/src/buffalo/index.ts +1 -0
  167. package/src/controller/controller.ts +1159 -0
  168. package/src/controller/database.ts +148 -0
  169. package/src/controller/events.ts +52 -0
  170. package/src/controller/greenPower.ts +613 -0
  171. package/src/controller/helpers/index.ts +1 -0
  172. package/src/controller/helpers/installCodes.ts +107 -0
  173. package/src/controller/helpers/ota.ts +575 -0
  174. package/src/controller/helpers/request.ts +96 -0
  175. package/src/controller/helpers/requestQueue.ts +126 -0
  176. package/src/controller/helpers/zclFrameConverter.ts +64 -0
  177. package/src/controller/helpers/zclTransactionSequenceNumber.ts +15 -0
  178. package/src/controller/index.ts +6 -0
  179. package/src/controller/model/device.ts +1791 -0
  180. package/src/controller/model/endpoint.ts +1235 -0
  181. package/src/controller/model/entity.ts +43 -0
  182. package/src/controller/model/group.ts +446 -0
  183. package/src/controller/model/index.ts +5 -0
  184. package/src/controller/model/konnextConfig.ts +6 -0
  185. package/src/controller/model/zigbeeEntity.ts +30 -0
  186. package/src/controller/touchlink.ts +195 -0
  187. package/src/controller/tstype.ts +374 -0
  188. package/src/index.ts +14 -0
  189. package/src/models/backup-storage-legacy.ts +48 -0
  190. package/src/models/backup-storage-unified.ts +47 -0
  191. package/src/models/backup.ts +37 -0
  192. package/src/models/index.ts +5 -0
  193. package/src/models/network-options.ts +11 -0
  194. package/src/utils/aes.ts +218 -0
  195. package/src/utils/async-mutex.ts +31 -0
  196. package/src/utils/backup.ts +152 -0
  197. package/src/utils/index.ts +5 -0
  198. package/src/utils/logger.ts +20 -0
  199. package/src/utils/patchBigIntSerialization.ts +8 -0
  200. package/src/utils/queue.ts +79 -0
  201. package/src/utils/timeService.ts +139 -0
  202. package/src/utils/utils.ts +19 -0
  203. package/src/utils/wait.ts +5 -0
  204. package/src/utils/waitress.ts +96 -0
  205. package/src/zspec/consts.ts +89 -0
  206. package/src/zspec/enums.ts +22 -0
  207. package/src/zspec/index.ts +3 -0
  208. package/src/zspec/tstypes.ts +18 -0
  209. package/src/zspec/utils.ts +247 -0
  210. package/src/zspec/zcl/buffaloZcl.ts +1073 -0
  211. package/src/zspec/zcl/definition/cluster.ts +7845 -0
  212. package/src/zspec/zcl/definition/clusters-types.ts +8577 -0
  213. package/src/zspec/zcl/definition/consts.ts +24 -0
  214. package/src/zspec/zcl/definition/datatypes.ts +2454 -0
  215. package/src/zspec/zcl/definition/enums.ts +224 -0
  216. package/src/zspec/zcl/definition/foundation.ts +342 -0
  217. package/src/zspec/zcl/definition/manufacturerCode.ts +730 -0
  218. package/src/zspec/zcl/definition/status.ts +69 -0
  219. package/src/zspec/zcl/definition/tstype.ts +446 -0
  220. package/src/zspec/zcl/index.ts +11 -0
  221. package/src/zspec/zcl/utils.ts +521 -0
  222. package/src/zspec/zcl/zclFrame.ts +383 -0
  223. package/src/zspec/zcl/zclHeader.ts +102 -0
  224. package/src/zspec/zcl/zclStatusError.ts +10 -0
  225. package/src/zspec/zdo/buffaloZdo.ts +2336 -0
  226. package/src/zspec/zdo/definition/clusters.ts +722 -0
  227. package/src/zspec/zdo/definition/consts.ts +16 -0
  228. package/src/zspec/zdo/definition/enums.ts +99 -0
  229. package/src/zspec/zdo/definition/status.ts +105 -0
  230. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  231. package/src/zspec/zdo/index.ts +7 -0
  232. package/src/zspec/zdo/utils.ts +76 -0
  233. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  234. package/test/adapter/adapter.test.ts +1276 -0
  235. package/test/adapter/ember/ash.test.ts +337 -0
  236. package/test/adapter/ember/consts.ts +131 -0
  237. package/test/adapter/ember/emberAdapter.test.ts +3447 -0
  238. package/test/adapter/ember/ezsp.test.ts +389 -0
  239. package/test/adapter/ember/ezspBuffalo.test.ts +93 -0
  240. package/test/adapter/ember/ezspError.test.ts +12 -0
  241. package/test/adapter/ember/math.test.ts +190 -0
  242. package/test/adapter/ezsp/frame.test.ts +30 -0
  243. package/test/adapter/ezsp/uart.test.ts +181 -0
  244. package/test/adapter/z-stack/adapter.test.ts +4260 -0
  245. package/test/adapter/z-stack/constants.test.ts +33 -0
  246. package/test/adapter/z-stack/structs.test.ts +115 -0
  247. package/test/adapter/z-stack/unpi.test.ts +213 -0
  248. package/test/adapter/z-stack/znp.test.ts +1288 -0
  249. package/test/adapter/zboss/fixZdoResponse.test.ts +179 -0
  250. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +81 -0
  251. package/test/adapter/zigate/zdo.test.ts +187 -0
  252. package/test/adapter/zoh/utils.test.ts +36 -0
  253. package/test/adapter/zoh/zohAdapter.test.ts +1451 -0
  254. package/test/benchOptions.ts +14 -0
  255. package/test/buffalo.test.ts +431 -0
  256. package/test/controller.bench.ts +215 -0
  257. package/test/controller.test.ts +10030 -0
  258. package/test/data/integrity-code-1166-012B-24031511-upgradeMe-RB 249 T.zigbee +0 -0
  259. package/test/data/manuf-tags-tradfri-cv-cct-unified_release_prod_v587757105_33e34452-9267-4665-bc5a-844c8f61f063.ota +0 -0
  260. package/test/data/padded-tretakt_smart_plug_soc-0x1100-2.4.25-prod.ota.ota.signed +0 -0
  261. package/test/data/telink-aes-A60_RGBW_T-0x00B6-0x03483712-MF_DIS.OTA +0 -0
  262. package/test/data/zbminir2_v1.0.8.ota +0 -0
  263. package/test/device-ota.test.ts +3332 -0
  264. package/test/greenpower.test.ts +1409 -0
  265. package/test/mockAdapters.ts +95 -0
  266. package/test/mockDevices.ts +623 -0
  267. package/test/requests.bench.ts +321 -0
  268. package/test/testUtils.ts +20 -0
  269. package/test/timeService.test.ts +214 -0
  270. package/test/tsconfig.json +9 -0
  271. package/test/utils/math.ts +19 -0
  272. package/test/utils.test.ts +352 -0
  273. package/test/vitest.config.mts +28 -0
  274. package/test/vitest.ts +9 -0
  275. package/test/zcl.test.ts +2858 -0
  276. package/test/zspec/utils.test.ts +68 -0
  277. package/test/zspec/zcl/buffalo.test.ts +1316 -0
  278. package/test/zspec/zcl/frame.test.ts +1056 -0
  279. package/test/zspec/zcl/utils.test.ts +650 -0
  280. package/test/zspec/zdo/buffalo.test.ts +1850 -0
  281. package/test/zspec/zdo/utils.test.ts +241 -0
  282. package/tsconfig.json +8 -10
  283. package/.babelrc.js +0 -6
  284. package/.eslintignore +0 -3
  285. package/dist/adapter/adapter.d.ts +0 -64
  286. package/dist/adapter/adapter.d.ts.map +0 -1
  287. package/dist/adapter/adapter.js +0 -157
  288. package/dist/adapter/adapter.js.map +0 -1
  289. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +0 -71
  290. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +0 -1
  291. package/dist/adapter/deconz/adapter/deconzAdapter.js +0 -1072
  292. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +0 -1
  293. package/dist/adapter/deconz/adapter/index.d.ts +0 -3
  294. package/dist/adapter/deconz/adapter/index.d.ts.map +0 -1
  295. package/dist/adapter/deconz/adapter/index.js +0 -11
  296. package/dist/adapter/deconz/adapter/index.js.map +0 -1
  297. package/dist/adapter/deconz/driver/constants.d.ts +0 -105
  298. package/dist/adapter/deconz/driver/constants.d.ts.map +0 -1
  299. package/dist/adapter/deconz/driver/constants.js +0 -56
  300. package/dist/adapter/deconz/driver/constants.js.map +0 -1
  301. package/dist/adapter/deconz/driver/driver.d.ts +0 -82
  302. package/dist/adapter/deconz/driver/driver.d.ts.map +0 -1
  303. package/dist/adapter/deconz/driver/driver.js +0 -751
  304. package/dist/adapter/deconz/driver/driver.js.map +0 -1
  305. package/dist/adapter/deconz/driver/frame.d.ts +0 -7
  306. package/dist/adapter/deconz/driver/frame.d.ts.map +0 -1
  307. package/dist/adapter/deconz/driver/frame.js +0 -14
  308. package/dist/adapter/deconz/driver/frame.js.map +0 -1
  309. package/dist/adapter/deconz/driver/frameParser.d.ts +0 -3
  310. package/dist/adapter/deconz/driver/frameParser.d.ts.map +0 -1
  311. package/dist/adapter/deconz/driver/frameParser.js +0 -444
  312. package/dist/adapter/deconz/driver/frameParser.js.map +0 -1
  313. package/dist/adapter/deconz/driver/parser.d.ts +0 -13
  314. package/dist/adapter/deconz/driver/parser.d.ts.map +0 -1
  315. package/dist/adapter/deconz/driver/parser.js +0 -64
  316. package/dist/adapter/deconz/driver/parser.js.map +0 -1
  317. package/dist/adapter/deconz/driver/writer.d.ts +0 -9
  318. package/dist/adapter/deconz/driver/writer.d.ts.map +0 -1
  319. package/dist/adapter/deconz/driver/writer.js +0 -45
  320. package/dist/adapter/deconz/driver/writer.js.map +0 -1
  321. package/dist/adapter/ember/adapter/emberAdapter.d.ts +0 -806
  322. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +0 -1
  323. package/dist/adapter/ember/adapter/emberAdapter.js +0 -2942
  324. package/dist/adapter/ember/adapter/emberAdapter.js.map +0 -1
  325. package/dist/adapter/ember/adapter/endpoints.d.ts +0 -27
  326. package/dist/adapter/ember/adapter/endpoints.d.ts.map +0 -1
  327. package/dist/adapter/ember/adapter/endpoints.js +0 -68
  328. package/dist/adapter/ember/adapter/endpoints.js.map +0 -1
  329. package/dist/adapter/ember/adapter/index.d.ts +0 -3
  330. package/dist/adapter/ember/adapter/index.d.ts.map +0 -1
  331. package/dist/adapter/ember/adapter/index.js +0 -6
  332. package/dist/adapter/ember/adapter/index.js.map +0 -1
  333. package/dist/adapter/ember/adapter/oneWaitress.d.ts +0 -108
  334. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +0 -1
  335. package/dist/adapter/ember/adapter/oneWaitress.js +0 -241
  336. package/dist/adapter/ember/adapter/oneWaitress.js.map +0 -1
  337. package/dist/adapter/ember/adapter/requestQueue.d.ts +0 -57
  338. package/dist/adapter/ember/adapter/requestQueue.d.ts.map +0 -1
  339. package/dist/adapter/ember/adapter/requestQueue.js +0 -139
  340. package/dist/adapter/ember/adapter/requestQueue.js.map +0 -1
  341. package/dist/adapter/ember/adapter/tokensManager.d.ts +0 -69
  342. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +0 -1
  343. package/dist/adapter/ember/adapter/tokensManager.js +0 -688
  344. package/dist/adapter/ember/adapter/tokensManager.js.map +0 -1
  345. package/dist/adapter/ember/consts.d.ts +0 -191
  346. package/dist/adapter/ember/consts.d.ts.map +0 -1
  347. package/dist/adapter/ember/consts.js +0 -246
  348. package/dist/adapter/ember/consts.js.map +0 -1
  349. package/dist/adapter/ember/enums.d.ts +0 -2172
  350. package/dist/adapter/ember/enums.d.ts.map +0 -1
  351. package/dist/adapter/ember/enums.js +0 -2375
  352. package/dist/adapter/ember/enums.js.map +0 -1
  353. package/dist/adapter/ember/ezsp/buffalo.d.ts +0 -156
  354. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +0 -1
  355. package/dist/adapter/ember/ezsp/buffalo.js +0 -1033
  356. package/dist/adapter/ember/ezsp/buffalo.js.map +0 -1
  357. package/dist/adapter/ember/ezsp/consts.d.ts +0 -116
  358. package/dist/adapter/ember/ezsp/consts.d.ts.map +0 -1
  359. package/dist/adapter/ember/ezsp/consts.js +0 -128
  360. package/dist/adapter/ember/ezsp/consts.js.map +0 -1
  361. package/dist/adapter/ember/ezsp/enums.d.ts +0 -879
  362. package/dist/adapter/ember/ezsp/enums.d.ts.map +0 -1
  363. package/dist/adapter/ember/ezsp/enums.js +0 -948
  364. package/dist/adapter/ember/ezsp/enums.js.map +0 -1
  365. package/dist/adapter/ember/ezsp/ezsp.d.ts +0 -2662
  366. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +0 -1
  367. package/dist/adapter/ember/ezsp/ezsp.js +0 -6454
  368. package/dist/adapter/ember/ezsp/ezsp.js.map +0 -1
  369. package/dist/adapter/ember/types.d.ts +0 -733
  370. package/dist/adapter/ember/types.d.ts.map +0 -1
  371. package/dist/adapter/ember/types.js +0 -3
  372. package/dist/adapter/ember/types.js.map +0 -1
  373. package/dist/adapter/ember/uart/ash.d.ts +0 -464
  374. package/dist/adapter/ember/uart/ash.d.ts.map +0 -1
  375. package/dist/adapter/ember/uart/ash.js +0 -1633
  376. package/dist/adapter/ember/uart/ash.js.map +0 -1
  377. package/dist/adapter/ember/uart/consts.d.ts +0 -91
  378. package/dist/adapter/ember/uart/consts.d.ts.map +0 -1
  379. package/dist/adapter/ember/uart/consts.js +0 -100
  380. package/dist/adapter/ember/uart/consts.js.map +0 -1
  381. package/dist/adapter/ember/uart/enums.d.ts +0 -191
  382. package/dist/adapter/ember/uart/enums.d.ts.map +0 -1
  383. package/dist/adapter/ember/uart/enums.js +0 -197
  384. package/dist/adapter/ember/uart/enums.js.map +0 -1
  385. package/dist/adapter/ember/uart/parser.d.ts +0 -10
  386. package/dist/adapter/ember/uart/parser.d.ts.map +0 -1
  387. package/dist/adapter/ember/uart/parser.js +0 -37
  388. package/dist/adapter/ember/uart/parser.js.map +0 -1
  389. package/dist/adapter/ember/uart/queues.d.ts +0 -85
  390. package/dist/adapter/ember/uart/queues.d.ts.map +0 -1
  391. package/dist/adapter/ember/uart/queues.js +0 -214
  392. package/dist/adapter/ember/uart/queues.js.map +0 -1
  393. package/dist/adapter/ember/uart/writer.d.ts +0 -15
  394. package/dist/adapter/ember/uart/writer.d.ts.map +0 -1
  395. package/dist/adapter/ember/uart/writer.js +0 -46
  396. package/dist/adapter/ember/uart/writer.js.map +0 -1
  397. package/dist/adapter/ember/utils/initters.d.ts +0 -20
  398. package/dist/adapter/ember/utils/initters.d.ts.map +0 -1
  399. package/dist/adapter/ember/utils/initters.js +0 -58
  400. package/dist/adapter/ember/utils/initters.js.map +0 -1
  401. package/dist/adapter/ember/utils/math.d.ts +0 -51
  402. package/dist/adapter/ember/utils/math.d.ts.map +0 -1
  403. package/dist/adapter/ember/utils/math.js +0 -102
  404. package/dist/adapter/ember/utils/math.js.map +0 -1
  405. package/dist/adapter/ember/zdo.d.ts +0 -925
  406. package/dist/adapter/ember/zdo.d.ts.map +0 -1
  407. package/dist/adapter/ember/zdo.js +0 -723
  408. package/dist/adapter/ember/zdo.js.map +0 -1
  409. package/dist/adapter/events.d.ts +0 -42
  410. package/dist/adapter/events.d.ts.map +0 -1
  411. package/dist/adapter/events.js +0 -13
  412. package/dist/adapter/events.js.map +0 -1
  413. package/dist/adapter/ezsp/adapter/backup.d.ts +0 -13
  414. package/dist/adapter/ezsp/adapter/backup.d.ts.map +0 -1
  415. package/dist/adapter/ezsp/adapter/backup.js +0 -101
  416. package/dist/adapter/ezsp/adapter/backup.js.map +0 -1
  417. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +0 -65
  418. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +0 -1
  419. package/dist/adapter/ezsp/adapter/ezspAdapter.js +0 -634
  420. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +0 -1
  421. package/dist/adapter/ezsp/adapter/index.d.ts +0 -3
  422. package/dist/adapter/ezsp/adapter/index.d.ts.map +0 -1
  423. package/dist/adapter/ezsp/adapter/index.js +0 -11
  424. package/dist/adapter/ezsp/adapter/index.js.map +0 -1
  425. package/dist/adapter/ezsp/driver/commands.d.ts +0 -37
  426. package/dist/adapter/ezsp/driver/commands.d.ts.map +0 -1
  427. package/dist/adapter/ezsp/driver/commands.js +0 -2387
  428. package/dist/adapter/ezsp/driver/commands.js.map +0 -1
  429. package/dist/adapter/ezsp/driver/consts.d.ts +0 -11
  430. package/dist/adapter/ezsp/driver/consts.d.ts.map +0 -1
  431. package/dist/adapter/ezsp/driver/consts.js +0 -14
  432. package/dist/adapter/ezsp/driver/consts.js.map +0 -1
  433. package/dist/adapter/ezsp/driver/driver.d.ts +0 -109
  434. package/dist/adapter/ezsp/driver/driver.d.ts.map +0 -1
  435. package/dist/adapter/ezsp/driver/driver.js +0 -796
  436. package/dist/adapter/ezsp/driver/driver.js.map +0 -1
  437. package/dist/adapter/ezsp/driver/ezsp.d.ts +0 -106
  438. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +0 -1
  439. package/dist/adapter/ezsp/driver/ezsp.js +0 -664
  440. package/dist/adapter/ezsp/driver/ezsp.js.map +0 -1
  441. package/dist/adapter/ezsp/driver/frame.d.ts +0 -40
  442. package/dist/adapter/ezsp/driver/frame.d.ts.map +0 -1
  443. package/dist/adapter/ezsp/driver/frame.js +0 -101
  444. package/dist/adapter/ezsp/driver/frame.js.map +0 -1
  445. package/dist/adapter/ezsp/driver/index.d.ts +0 -4
  446. package/dist/adapter/ezsp/driver/index.d.ts.map +0 -1
  447. package/dist/adapter/ezsp/driver/index.js +0 -9
  448. package/dist/adapter/ezsp/driver/index.js.map +0 -1
  449. package/dist/adapter/ezsp/driver/multicast.d.ts +0 -13
  450. package/dist/adapter/ezsp/driver/multicast.d.ts.map +0 -1
  451. package/dist/adapter/ezsp/driver/multicast.js +0 -74
  452. package/dist/adapter/ezsp/driver/multicast.js.map +0 -1
  453. package/dist/adapter/ezsp/driver/parser.d.ts +0 -12
  454. package/dist/adapter/ezsp/driver/parser.d.ts.map +0 -1
  455. package/dist/adapter/ezsp/driver/parser.js +0 -105
  456. package/dist/adapter/ezsp/driver/parser.js.map +0 -1
  457. package/dist/adapter/ezsp/driver/types/basic.d.ts +0 -63
  458. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +0 -1
  459. package/dist/adapter/ezsp/driver/types/basic.js +0 -209
  460. package/dist/adapter/ezsp/driver/types/basic.js.map +0 -1
  461. package/dist/adapter/ezsp/driver/types/index.d.ts +0 -10
  462. package/dist/adapter/ezsp/driver/types/index.d.ts.map +0 -1
  463. package/dist/adapter/ezsp/driver/types/index.js +0 -139
  464. package/dist/adapter/ezsp/driver/types/index.js.map +0 -1
  465. package/dist/adapter/ezsp/driver/types/named.d.ts +0 -1288
  466. package/dist/adapter/ezsp/driver/types/named.d.ts.map +0 -1
  467. package/dist/adapter/ezsp/driver/types/named.js +0 -2330
  468. package/dist/adapter/ezsp/driver/types/named.js.map +0 -1
  469. package/dist/adapter/ezsp/driver/types/struct.d.ts +0 -271
  470. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +0 -1
  471. package/dist/adapter/ezsp/driver/types/struct.js +0 -804
  472. package/dist/adapter/ezsp/driver/types/struct.js.map +0 -1
  473. package/dist/adapter/ezsp/driver/uart.d.ts +0 -49
  474. package/dist/adapter/ezsp/driver/uart.d.ts.map +0 -1
  475. package/dist/adapter/ezsp/driver/uart.js +0 -383
  476. package/dist/adapter/ezsp/driver/uart.js.map +0 -1
  477. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +0 -3
  478. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +0 -1
  479. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +0 -56
  480. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +0 -1
  481. package/dist/adapter/ezsp/driver/utils/index.d.ts +0 -20
  482. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +0 -1
  483. package/dist/adapter/ezsp/driver/utils/index.js +0 -73
  484. package/dist/adapter/ezsp/driver/utils/index.js.map +0 -1
  485. package/dist/adapter/ezsp/driver/writer.d.ts +0 -14
  486. package/dist/adapter/ezsp/driver/writer.d.ts.map +0 -1
  487. package/dist/adapter/ezsp/driver/writer.js +0 -83
  488. package/dist/adapter/ezsp/driver/writer.js.map +0 -1
  489. package/dist/adapter/index.d.ts +0 -5
  490. package/dist/adapter/index.d.ts.map +0 -1
  491. package/dist/adapter/index.js +0 -36
  492. package/dist/adapter/index.js.map +0 -1
  493. package/dist/adapter/serialPort.d.ts +0 -14
  494. package/dist/adapter/serialPort.d.ts.map +0 -1
  495. package/dist/adapter/serialPort.js +0 -47
  496. package/dist/adapter/serialPort.js.map +0 -1
  497. package/dist/adapter/serialPortUtils.d.ts +0 -13
  498. package/dist/adapter/serialPortUtils.d.ts.map +0 -1
  499. package/dist/adapter/serialPortUtils.js +0 -19
  500. package/dist/adapter/serialPortUtils.js.map +0 -1
  501. package/dist/adapter/socketPortUtils.d.ts +0 -11
  502. package/dist/adapter/socketPortUtils.d.ts.map +0 -1
  503. package/dist/adapter/socketPortUtils.js +0 -17
  504. package/dist/adapter/socketPortUtils.js.map +0 -1
  505. package/dist/adapter/tstype.d.ts +0 -86
  506. package/dist/adapter/tstype.d.ts.map +0 -1
  507. package/dist/adapter/tstype.js +0 -3
  508. package/dist/adapter/tstype.js.map +0 -1
  509. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -62
  510. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +0 -1
  511. package/dist/adapter/z-stack/adapter/adapter-backup.js +0 -459
  512. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +0 -1
  513. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +0 -151
  514. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +0 -1
  515. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +0 -259
  516. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +0 -1
  517. package/dist/adapter/z-stack/adapter/endpoints.d.ts +0 -12
  518. package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +0 -1
  519. package/dist/adapter/z-stack/adapter/endpoints.js +0 -74
  520. package/dist/adapter/z-stack/adapter/endpoints.js.map +0 -1
  521. package/dist/adapter/z-stack/adapter/index.d.ts +0 -3
  522. package/dist/adapter/z-stack/adapter/index.d.ts.map +0 -1
  523. package/dist/adapter/z-stack/adapter/index.js +0 -9
  524. package/dist/adapter/z-stack/adapter/index.js.map +0 -1
  525. package/dist/adapter/z-stack/adapter/manager.d.ts +0 -84
  526. package/dist/adapter/z-stack/adapter/manager.d.ts.map +0 -1
  527. package/dist/adapter/z-stack/adapter/manager.js +0 -474
  528. package/dist/adapter/z-stack/adapter/manager.js.map +0 -1
  529. package/dist/adapter/z-stack/adapter/tstype.d.ts +0 -7
  530. package/dist/adapter/z-stack/adapter/tstype.d.ts.map +0 -1
  531. package/dist/adapter/z-stack/adapter/tstype.js +0 -10
  532. package/dist/adapter/z-stack/adapter/tstype.js.map +0 -1
  533. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +0 -86
  534. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +0 -1
  535. package/dist/adapter/z-stack/adapter/zStackAdapter.js +0 -912
  536. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +0 -1
  537. package/dist/adapter/z-stack/constants/af.d.ts +0 -24
  538. package/dist/adapter/z-stack/constants/af.d.ts.map +0 -1
  539. package/dist/adapter/z-stack/constants/af.js +0 -28
  540. package/dist/adapter/z-stack/constants/af.js.map +0 -1
  541. package/dist/adapter/z-stack/constants/common.d.ts +0 -279
  542. package/dist/adapter/z-stack/constants/common.d.ts.map +0 -1
  543. package/dist/adapter/z-stack/constants/common.js +0 -293
  544. package/dist/adapter/z-stack/constants/common.js.map +0 -1
  545. package/dist/adapter/z-stack/constants/dbg.d.ts +0 -23
  546. package/dist/adapter/z-stack/constants/dbg.d.ts.map +0 -1
  547. package/dist/adapter/z-stack/constants/dbg.js +0 -25
  548. package/dist/adapter/z-stack/constants/dbg.js.map +0 -1
  549. package/dist/adapter/z-stack/constants/index.d.ts +0 -11
  550. package/dist/adapter/z-stack/constants/index.d.ts.map +0 -1
  551. package/dist/adapter/z-stack/constants/index.js +0 -48
  552. package/dist/adapter/z-stack/constants/index.js.map +0 -1
  553. package/dist/adapter/z-stack/constants/mac.d.ts +0 -128
  554. package/dist/adapter/z-stack/constants/mac.d.ts.map +0 -1
  555. package/dist/adapter/z-stack/constants/mac.js +0 -130
  556. package/dist/adapter/z-stack/constants/mac.js.map +0 -1
  557. package/dist/adapter/z-stack/constants/sapi.d.ts +0 -25
  558. package/dist/adapter/z-stack/constants/sapi.d.ts.map +0 -1
  559. package/dist/adapter/z-stack/constants/sapi.js +0 -27
  560. package/dist/adapter/z-stack/constants/sapi.js.map +0 -1
  561. package/dist/adapter/z-stack/constants/sys.d.ts +0 -72
  562. package/dist/adapter/z-stack/constants/sys.d.ts.map +0 -1
  563. package/dist/adapter/z-stack/constants/sys.js +0 -74
  564. package/dist/adapter/z-stack/constants/sys.js.map +0 -1
  565. package/dist/adapter/z-stack/constants/util.d.ts +0 -82
  566. package/dist/adapter/z-stack/constants/util.d.ts.map +0 -1
  567. package/dist/adapter/z-stack/constants/util.js +0 -84
  568. package/dist/adapter/z-stack/constants/util.js.map +0 -1
  569. package/dist/adapter/z-stack/constants/utils.d.ts +0 -5
  570. package/dist/adapter/z-stack/constants/utils.d.ts.map +0 -1
  571. package/dist/adapter/z-stack/constants/utils.js +0 -15
  572. package/dist/adapter/z-stack/constants/utils.js.map +0 -1
  573. package/dist/adapter/z-stack/constants/zdo.d.ts +0 -103
  574. package/dist/adapter/z-stack/constants/zdo.d.ts.map +0 -1
  575. package/dist/adapter/z-stack/constants/zdo.js +0 -105
  576. package/dist/adapter/z-stack/constants/zdo.js.map +0 -1
  577. package/dist/adapter/z-stack/models/index.d.ts +0 -2
  578. package/dist/adapter/z-stack/models/index.d.ts.map +0 -1
  579. package/dist/adapter/z-stack/models/index.js +0 -18
  580. package/dist/adapter/z-stack/models/index.js.map +0 -1
  581. package/dist/adapter/z-stack/models/startup-options.d.ts +0 -13
  582. package/dist/adapter/z-stack/models/startup-options.d.ts.map +0 -1
  583. package/dist/adapter/z-stack/models/startup-options.js +0 -3
  584. package/dist/adapter/z-stack/models/startup-options.js.map +0 -1
  585. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +0 -24
  586. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +0 -1
  587. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +0 -46
  588. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +0 -1
  589. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +0 -11
  590. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +0 -1
  591. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +0 -23
  592. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +0 -1
  593. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +0 -11
  594. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +0 -1
  595. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +0 -22
  596. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +0 -1
  597. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +0 -11
  598. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +0 -1
  599. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +0 -24
  600. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +0 -1
  601. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +0 -11
  602. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +0 -1
  603. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +0 -25
  604. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +0 -1
  605. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +0 -11
  606. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +0 -1
  607. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +0 -24
  608. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +0 -1
  609. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +0 -9
  610. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +0 -1
  611. package/dist/adapter/z-stack/structs/entries/channel-list.js +0 -16
  612. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +0 -1
  613. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +0 -9
  614. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +0 -1
  615. package/dist/adapter/z-stack/structs/entries/has-configured.js +0 -17
  616. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +0 -1
  617. package/dist/adapter/z-stack/structs/entries/index.d.ts +0 -17
  618. package/dist/adapter/z-stack/structs/entries/index.d.ts.map +0 -1
  619. package/dist/adapter/z-stack/structs/entries/index.js +0 -33
  620. package/dist/adapter/z-stack/structs/entries/index.js.map +0 -1
  621. package/dist/adapter/z-stack/structs/entries/nib.d.ts +0 -11
  622. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +0 -1
  623. package/dist/adapter/z-stack/structs/entries/nib.js +0 -69
  624. package/dist/adapter/z-stack/structs/entries/nib.js.map +0 -1
  625. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +0 -11
  626. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +0 -1
  627. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +0 -19
  628. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +0 -1
  629. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +0 -9
  630. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +0 -1
  631. package/dist/adapter/z-stack/structs/entries/nwk-key.js +0 -16
  632. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +0 -1
  633. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +0 -9
  634. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +0 -1
  635. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +0 -16
  636. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +0 -1
  637. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +0 -14
  638. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +0 -1
  639. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +0 -24
  640. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +0 -1
  641. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +0 -11
  642. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +0 -1
  643. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +0 -23
  644. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +0 -1
  645. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +0 -21
  646. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +0 -1
  647. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +0 -37
  648. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +0 -1
  649. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +0 -11
  650. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +0 -1
  651. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +0 -25
  652. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +0 -1
  653. package/dist/adapter/z-stack/structs/index.d.ts +0 -5
  654. package/dist/adapter/z-stack/structs/index.d.ts.map +0 -1
  655. package/dist/adapter/z-stack/structs/index.js +0 -21
  656. package/dist/adapter/z-stack/structs/index.js.map +0 -1
  657. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +0 -14
  658. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +0 -1
  659. package/dist/adapter/z-stack/structs/serializable-memory-object.js +0 -3
  660. package/dist/adapter/z-stack/structs/serializable-memory-object.js.map +0 -1
  661. package/dist/adapter/z-stack/structs/struct.d.ts +0 -100
  662. package/dist/adapter/z-stack/structs/struct.d.ts.map +0 -1
  663. package/dist/adapter/z-stack/structs/struct.js +0 -297
  664. package/dist/adapter/z-stack/structs/struct.js.map +0 -1
  665. package/dist/adapter/z-stack/structs/table.d.ts +0 -95
  666. package/dist/adapter/z-stack/structs/table.d.ts.map +0 -1
  667. package/dist/adapter/z-stack/structs/table.js +0 -164
  668. package/dist/adapter/z-stack/structs/table.js.map +0 -1
  669. package/dist/adapter/z-stack/unpi/constants.d.ts +0 -29
  670. package/dist/adapter/z-stack/unpi/constants.d.ts.map +0 -1
  671. package/dist/adapter/z-stack/unpi/constants.js +0 -40
  672. package/dist/adapter/z-stack/unpi/constants.js.map +0 -1
  673. package/dist/adapter/z-stack/unpi/frame.d.ts +0 -17
  674. package/dist/adapter/z-stack/unpi/frame.d.ts.map +0 -1
  675. package/dist/adapter/z-stack/unpi/frame.js +0 -55
  676. package/dist/adapter/z-stack/unpi/frame.js.map +0 -1
  677. package/dist/adapter/z-stack/unpi/index.d.ts +0 -6
  678. package/dist/adapter/z-stack/unpi/index.d.ts.map +0 -1
  679. package/dist/adapter/z-stack/unpi/index.js +0 -38
  680. package/dist/adapter/z-stack/unpi/index.js.map +0 -1
  681. package/dist/adapter/z-stack/unpi/parser.d.ts +0 -13
  682. package/dist/adapter/z-stack/unpi/parser.d.ts.map +0 -1
  683. package/dist/adapter/z-stack/unpi/parser.js +0 -86
  684. package/dist/adapter/z-stack/unpi/parser.js.map +0 -1
  685. package/dist/adapter/z-stack/unpi/writer.d.ts +0 -12
  686. package/dist/adapter/z-stack/unpi/writer.d.ts.map +0 -1
  687. package/dist/adapter/z-stack/unpi/writer.js +0 -55
  688. package/dist/adapter/z-stack/unpi/writer.js.map +0 -1
  689. package/dist/adapter/z-stack/utils/channel-list.d.ts +0 -21
  690. package/dist/adapter/z-stack/utils/channel-list.d.ts.map +0 -1
  691. package/dist/adapter/z-stack/utils/channel-list.js +0 -41
  692. package/dist/adapter/z-stack/utils/channel-list.js.map +0 -1
  693. package/dist/adapter/z-stack/utils/index.d.ts +0 -3
  694. package/dist/adapter/z-stack/utils/index.d.ts.map +0 -1
  695. package/dist/adapter/z-stack/utils/index.js +0 -19
  696. package/dist/adapter/z-stack/utils/index.js.map +0 -1
  697. package/dist/adapter/z-stack/utils/network-options.d.ts +0 -9
  698. package/dist/adapter/z-stack/utils/network-options.d.ts.map +0 -1
  699. package/dist/adapter/z-stack/utils/network-options.js +0 -23
  700. package/dist/adapter/z-stack/utils/network-options.js.map +0 -1
  701. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +0 -14
  702. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +0 -1
  703. package/dist/adapter/z-stack/znp/buffaloZnp.js +0 -243
  704. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +0 -1
  705. package/dist/adapter/z-stack/znp/definition.d.ts +0 -6
  706. package/dist/adapter/z-stack/znp/definition.d.ts.map +0 -1
  707. package/dist/adapter/z-stack/znp/definition.js +0 -3052
  708. package/dist/adapter/z-stack/znp/definition.js.map +0 -1
  709. package/dist/adapter/z-stack/znp/index.d.ts +0 -4
  710. package/dist/adapter/z-stack/znp/index.d.ts.map +0 -1
  711. package/dist/adapter/z-stack/znp/index.js +0 -11
  712. package/dist/adapter/z-stack/znp/index.js.map +0 -1
  713. package/dist/adapter/z-stack/znp/parameterType.d.ts +0 -23
  714. package/dist/adapter/z-stack/znp/parameterType.d.ts.map +0 -1
  715. package/dist/adapter/z-stack/znp/parameterType.js +0 -26
  716. package/dist/adapter/z-stack/znp/parameterType.js.map +0 -1
  717. package/dist/adapter/z-stack/znp/tstype.d.ts +0 -23
  718. package/dist/adapter/z-stack/znp/tstype.d.ts.map +0 -1
  719. package/dist/adapter/z-stack/znp/tstype.js +0 -3
  720. package/dist/adapter/z-stack/znp/tstype.js.map +0 -1
  721. package/dist/adapter/z-stack/znp/znp.d.ts +0 -47
  722. package/dist/adapter/z-stack/znp/znp.d.ts.map +0 -1
  723. package/dist/adapter/z-stack/znp/znp.js +0 -322
  724. package/dist/adapter/z-stack/znp/znp.js.map +0 -1
  725. package/dist/adapter/z-stack/znp/zpiObject.d.ts +0 -20
  726. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +0 -1
  727. package/dist/adapter/z-stack/znp/zpiObject.js +0 -103
  728. package/dist/adapter/z-stack/znp/zpiObject.js.map +0 -1
  729. package/dist/adapter/zigate/adapter/index.d.ts +0 -3
  730. package/dist/adapter/zigate/adapter/index.d.ts.map +0 -1
  731. package/dist/adapter/zigate/adapter/index.js +0 -11
  732. package/dist/adapter/zigate/adapter/index.js.map +0 -1
  733. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +0 -72
  734. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +0 -1
  735. package/dist/adapter/zigate/adapter/zigateAdapter.js +0 -681
  736. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +0 -1
  737. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +0 -18
  738. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +0 -1
  739. package/dist/adapter/zigate/driver/buffaloZiGate.js +0 -190
  740. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +0 -1
  741. package/dist/adapter/zigate/driver/commandType.d.ts +0 -43
  742. package/dist/adapter/zigate/driver/commandType.d.ts.map +0 -1
  743. package/dist/adapter/zigate/driver/commandType.js +0 -390
  744. package/dist/adapter/zigate/driver/commandType.js.map +0 -1
  745. package/dist/adapter/zigate/driver/constants.d.ts +0 -277
  746. package/dist/adapter/zigate/driver/constants.d.ts.map +0 -1
  747. package/dist/adapter/zigate/driver/constants.js +0 -372
  748. package/dist/adapter/zigate/driver/constants.js.map +0 -1
  749. package/dist/adapter/zigate/driver/frame.d.ts +0 -27
  750. package/dist/adapter/zigate/driver/frame.d.ts.map +0 -1
  751. package/dist/adapter/zigate/driver/frame.js +0 -173
  752. package/dist/adapter/zigate/driver/frame.js.map +0 -1
  753. package/dist/adapter/zigate/driver/messageType.d.ts +0 -13
  754. package/dist/adapter/zigate/driver/messageType.d.ts.map +0 -1
  755. package/dist/adapter/zigate/driver/messageType.js +0 -284
  756. package/dist/adapter/zigate/driver/messageType.js.map +0 -1
  757. package/dist/adapter/zigate/driver/parameterType.d.ts +0 -28
  758. package/dist/adapter/zigate/driver/parameterType.d.ts.map +0 -1
  759. package/dist/adapter/zigate/driver/parameterType.js +0 -33
  760. package/dist/adapter/zigate/driver/parameterType.js.map +0 -1
  761. package/dist/adapter/zigate/driver/ziGateObject.d.ts +0 -24
  762. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +0 -1
  763. package/dist/adapter/zigate/driver/ziGateObject.js +0 -111
  764. package/dist/adapter/zigate/driver/ziGateObject.js.map +0 -1
  765. package/dist/adapter/zigate/driver/zigate.d.ts +0 -50
  766. package/dist/adapter/zigate/driver/zigate.d.ts.map +0 -1
  767. package/dist/adapter/zigate/driver/zigate.js +0 -289
  768. package/dist/adapter/zigate/driver/zigate.js.map +0 -1
  769. package/dist/buffalo/buffalo.d.ts +0 -55
  770. package/dist/buffalo/buffalo.d.ts.map +0 -1
  771. package/dist/buffalo/buffalo.js +0 -230
  772. package/dist/buffalo/buffalo.js.map +0 -1
  773. package/dist/buffalo/index.d.ts +0 -3
  774. package/dist/buffalo/index.d.ts.map +0 -1
  775. package/dist/buffalo/index.js +0 -9
  776. package/dist/buffalo/index.js.map +0 -1
  777. package/dist/controller/controller.d.ts +0 -119
  778. package/dist/controller/controller.d.ts.map +0 -1
  779. package/dist/controller/controller.js +0 -700
  780. package/dist/controller/controller.js.map +0 -1
  781. package/dist/controller/database.d.ts +0 -20
  782. package/dist/controller/database.d.ts.map +0 -1
  783. package/dist/controller/database.js +0 -94
  784. package/dist/controller/database.js.map +0 -1
  785. package/dist/controller/events.d.ts +0 -59
  786. package/dist/controller/events.d.ts.map +0 -1
  787. package/dist/controller/events.js +0 -113
  788. package/dist/controller/events.js.map +0 -1
  789. package/dist/controller/greenPower.d.ts +0 -14
  790. package/dist/controller/greenPower.d.ts.map +0 -1
  791. package/dist/controller/greenPower.js +0 -216
  792. package/dist/controller/greenPower.js.map +0 -1
  793. package/dist/controller/helpers/index.d.ts +0 -3
  794. package/dist/controller/helpers/index.d.ts.map +0 -1
  795. package/dist/controller/helpers/index.js +0 -29
  796. package/dist/controller/helpers/index.js.map +0 -1
  797. package/dist/controller/helpers/request.d.ts +0 -22
  798. package/dist/controller/helpers/request.d.ts.map +0 -1
  799. package/dist/controller/helpers/request.js +0 -78
  800. package/dist/controller/helpers/request.js.map +0 -1
  801. package/dist/controller/helpers/requestQueue.d.ts +0 -13
  802. package/dist/controller/helpers/requestQueue.d.ts.map +0 -1
  803. package/dist/controller/helpers/requestQueue.js +0 -106
  804. package/dist/controller/helpers/requestQueue.js.map +0 -1
  805. package/dist/controller/helpers/zclFrameConverter.d.ts +0 -9
  806. package/dist/controller/helpers/zclFrameConverter.d.ts.map +0 -1
  807. package/dist/controller/helpers/zclFrameConverter.js +0 -70
  808. package/dist/controller/helpers/zclFrameConverter.js.map +0 -1
  809. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +0 -6
  810. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +0 -1
  811. package/dist/controller/helpers/zclTransactionSequenceNumber.js +0 -14
  812. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +0 -1
  813. package/dist/controller/index.d.ts +0 -6
  814. package/dist/controller/index.d.ts.map +0 -1
  815. package/dist/controller/index.js +0 -9
  816. package/dist/controller/index.js.map +0 -1
  817. package/dist/controller/model/device.d.ts +0 -140
  818. package/dist/controller/model/device.d.ts.map +0 -1
  819. package/dist/controller/model/device.js +0 -746
  820. package/dist/controller/model/device.js.map +0 -1
  821. package/dist/controller/model/endpoint.d.ts +0 -134
  822. package/dist/controller/model/endpoint.d.ts.map +0 -1
  823. package/dist/controller/model/endpoint.js +0 -667
  824. package/dist/controller/model/endpoint.js.map +0 -1
  825. package/dist/controller/model/entity.d.ts +0 -15
  826. package/dist/controller/model/entity.d.ts.map +0 -1
  827. package/dist/controller/model/entity.js +0 -27
  828. package/dist/controller/model/entity.js.map +0 -1
  829. package/dist/controller/model/group.d.ts +0 -39
  830. package/dist/controller/model/group.d.ts.map +0 -1
  831. package/dist/controller/model/group.js +0 -226
  832. package/dist/controller/model/group.js.map +0 -1
  833. package/dist/controller/model/index.d.ts +0 -6
  834. package/dist/controller/model/index.d.ts.map +0 -1
  835. package/dist/controller/model/index.js +0 -15
  836. package/dist/controller/model/index.js.map +0 -1
  837. package/dist/controller/model/konnextConfig.d.ts +0 -7
  838. package/dist/controller/model/konnextConfig.d.ts.map +0 -1
  839. package/dist/controller/model/konnextConfig.js +0 -3
  840. package/dist/controller/model/konnextConfig.js.map +0 -1
  841. package/dist/controller/touchlink.d.ts +0 -20
  842. package/dist/controller/touchlink.d.ts.map +0 -1
  843. package/dist/controller/touchlink.js +0 -157
  844. package/dist/controller/touchlink.js.map +0 -1
  845. package/dist/controller/tstype.d.ts +0 -21
  846. package/dist/controller/tstype.d.ts.map +0 -1
  847. package/dist/controller/tstype.js +0 -9
  848. package/dist/controller/tstype.js.map +0 -1
  849. package/dist/index.d.ts +0 -6
  850. package/dist/index.d.ts.map +0 -1
  851. package/dist/index.js +0 -37
  852. package/dist/index.js.map +0 -1
  853. package/dist/models/backup-storage-legacy.d.ts +0 -27
  854. package/dist/models/backup-storage-legacy.d.ts.map +0 -1
  855. package/dist/models/backup-storage-legacy.js +0 -3
  856. package/dist/models/backup-storage-legacy.js.map +0 -1
  857. package/dist/models/backup-storage-unified.d.ts +0 -50
  858. package/dist/models/backup-storage-unified.d.ts.map +0 -1
  859. package/dist/models/backup-storage-unified.js +0 -3
  860. package/dist/models/backup-storage-unified.js.map +0 -1
  861. package/dist/models/backup.d.ts +0 -38
  862. package/dist/models/backup.d.ts.map +0 -1
  863. package/dist/models/backup.js +0 -3
  864. package/dist/models/backup.js.map +0 -1
  865. package/dist/models/index.d.ts +0 -5
  866. package/dist/models/index.d.ts.map +0 -1
  867. package/dist/models/index.js +0 -21
  868. package/dist/models/index.js.map +0 -1
  869. package/dist/models/network-options.d.ts +0 -13
  870. package/dist/models/network-options.d.ts.map +0 -1
  871. package/dist/models/network-options.js +0 -3
  872. package/dist/models/network-options.js.map +0 -1
  873. package/dist/utils/aes.d.ts +0 -40
  874. package/dist/utils/aes.d.ts.map +0 -1
  875. package/dist/utils/aes.js +0 -198
  876. package/dist/utils/aes.js.map +0 -1
  877. package/dist/utils/assertString.d.ts +0 -3
  878. package/dist/utils/assertString.d.ts.map +0 -1
  879. package/dist/utils/assertString.js +0 -9
  880. package/dist/utils/assertString.js.map +0 -1
  881. package/dist/utils/backup.d.ts +0 -21
  882. package/dist/utils/backup.d.ts.map +0 -1
  883. package/dist/utils/backup.js +0 -190
  884. package/dist/utils/backup.js.map +0 -1
  885. package/dist/utils/equalsPartial.d.ts +0 -3
  886. package/dist/utils/equalsPartial.d.ts.map +0 -1
  887. package/dist/utils/equalsPartial.js +0 -12
  888. package/dist/utils/equalsPartial.js.map +0 -1
  889. package/dist/utils/index.d.ts +0 -10
  890. package/dist/utils/index.d.ts.map +0 -1
  891. package/dist/utils/index.js +0 -46
  892. package/dist/utils/index.js.map +0 -1
  893. package/dist/utils/isNumberArray.d.ts +0 -3
  894. package/dist/utils/isNumberArray.d.ts.map +0 -1
  895. package/dist/utils/isNumberArray.js +0 -7
  896. package/dist/utils/isNumberArray.js.map +0 -1
  897. package/dist/utils/logger.d.ts +0 -9
  898. package/dist/utils/logger.d.ts.map +0 -1
  899. package/dist/utils/logger.js +0 -14
  900. package/dist/utils/logger.js.map +0 -1
  901. package/dist/utils/queue.d.ts +0 -12
  902. package/dist/utils/queue.d.ts.map +0 -1
  903. package/dist/utils/queue.js +0 -62
  904. package/dist/utils/queue.js.map +0 -1
  905. package/dist/utils/realpathSync.d.ts +0 -3
  906. package/dist/utils/realpathSync.d.ts.map +0 -1
  907. package/dist/utils/realpathSync.js +0 -13
  908. package/dist/utils/realpathSync.js.map +0 -1
  909. package/dist/utils/wait.d.ts +0 -3
  910. package/dist/utils/wait.d.ts.map +0 -1
  911. package/dist/utils/wait.js +0 -9
  912. package/dist/utils/wait.js.map +0 -1
  913. package/dist/utils/waitress.d.ts +0 -22
  914. package/dist/utils/waitress.d.ts.map +0 -1
  915. package/dist/utils/waitress.js +0 -69
  916. package/dist/utils/waitress.js.map +0 -1
  917. package/dist/zspec/consts.d.ts +0 -60
  918. package/dist/zspec/consts.d.ts.map +0 -1
  919. package/dist/zspec/consts.js +0 -64
  920. package/dist/zspec/consts.js.map +0 -1
  921. package/dist/zspec/enums.d.ts +0 -19
  922. package/dist/zspec/enums.d.ts.map +0 -1
  923. package/dist/zspec/enums.js +0 -28
  924. package/dist/zspec/enums.js.map +0 -1
  925. package/dist/zspec/index.d.ts +0 -4
  926. package/dist/zspec/index.d.ts.map +0 -1
  927. package/dist/zspec/index.js +0 -43
  928. package/dist/zspec/index.js.map +0 -1
  929. package/dist/zspec/tstypes.d.ts +0 -19
  930. package/dist/zspec/tstypes.d.ts.map +0 -1
  931. package/dist/zspec/tstypes.js +0 -3
  932. package/dist/zspec/tstypes.js.map +0 -1
  933. package/dist/zspec/utils.d.ts +0 -14
  934. package/dist/zspec/utils.d.ts.map +0 -1
  935. package/dist/zspec/utils.js +0 -29
  936. package/dist/zspec/utils.js.map +0 -1
  937. package/dist/zspec/zcl/buffaloZcl.d.ts +0 -55
  938. package/dist/zspec/zcl/buffaloZcl.d.ts.map +0 -1
  939. package/dist/zspec/zcl/buffaloZcl.js +0 -929
  940. package/dist/zspec/zcl/buffaloZcl.js.map +0 -1
  941. package/dist/zspec/zcl/definition/cluster.d.ts +0 -3
  942. package/dist/zspec/zcl/definition/cluster.d.ts.map +0 -1
  943. package/dist/zspec/zcl/definition/cluster.js +0 -5500
  944. package/dist/zspec/zcl/definition/cluster.js.map +0 -1
  945. package/dist/zspec/zcl/definition/consts.d.ts +0 -9
  946. package/dist/zspec/zcl/definition/consts.d.ts.map +0 -1
  947. package/dist/zspec/zcl/definition/consts.js +0 -27
  948. package/dist/zspec/zcl/definition/consts.js.map +0 -1
  949. package/dist/zspec/zcl/definition/enums.d.ts +0 -177
  950. package/dist/zspec/zcl/definition/enums.d.ts.map +0 -1
  951. package/dist/zspec/zcl/definition/enums.js +0 -187
  952. package/dist/zspec/zcl/definition/enums.js.map +0 -1
  953. package/dist/zspec/zcl/definition/foundation.d.ts +0 -11
  954. package/dist/zspec/zcl/definition/foundation.d.ts.map +0 -1
  955. package/dist/zspec/zcl/definition/foundation.js +0 -241
  956. package/dist/zspec/zcl/definition/foundation.js.map +0 -1
  957. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +0 -727
  958. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +0 -1
  959. package/dist/zspec/zcl/definition/manufacturerCode.js +0 -733
  960. package/dist/zspec/zcl/definition/manufacturerCode.js.map +0 -1
  961. package/dist/zspec/zcl/definition/status.d.ts +0 -69
  962. package/dist/zspec/zcl/definition/status.d.ts.map +0 -1
  963. package/dist/zspec/zcl/definition/status.js +0 -74
  964. package/dist/zspec/zcl/definition/status.js.map +0 -1
  965. package/dist/zspec/zcl/definition/tstype.d.ts +0 -114
  966. package/dist/zspec/zcl/definition/tstype.d.ts.map +0 -1
  967. package/dist/zspec/zcl/definition/tstype.js +0 -4
  968. package/dist/zspec/zcl/definition/tstype.js.map +0 -1
  969. package/dist/zspec/zcl/index.d.ts +0 -11
  970. package/dist/zspec/zcl/index.d.ts.map +0 -1
  971. package/dist/zspec/zcl/index.js +0 -47
  972. package/dist/zspec/zcl/index.js.map +0 -1
  973. package/dist/zspec/zcl/utils.d.ts +0 -7
  974. package/dist/zspec/zcl/utils.d.ts.map +0 -1
  975. package/dist/zspec/zcl/utils.js +0 -234
  976. package/dist/zspec/zcl/utils.js.map +0 -1
  977. package/dist/zspec/zcl/zclFrame.d.ts +0 -36
  978. package/dist/zspec/zcl/zclFrame.d.ts.map +0 -1
  979. package/dist/zspec/zcl/zclFrame.js +0 -304
  980. package/dist/zspec/zcl/zclFrame.js.map +0 -1
  981. package/dist/zspec/zcl/zclHeader.d.ts +0 -17
  982. package/dist/zspec/zcl/zclHeader.d.ts.map +0 -1
  983. package/dist/zspec/zcl/zclHeader.js +0 -88
  984. package/dist/zspec/zcl/zclHeader.js.map +0 -1
  985. package/dist/zspec/zcl/zclStatusError.d.ts +0 -6
  986. package/dist/zspec/zcl/zclStatusError.d.ts.map +0 -1
  987. package/dist/zspec/zcl/zclStatusError.js +0 -13
  988. package/dist/zspec/zcl/zclStatusError.js.map +0 -1
  989. package/dist/zspec/zdo/buffaloZdo.d.ts +0 -438
  990. package/dist/zspec/zdo/buffaloZdo.d.ts.map +0 -1
  991. package/dist/zspec/zdo/buffaloZdo.js +0 -1892
  992. package/dist/zspec/zdo/buffaloZdo.js.map +0 -1
  993. package/dist/zspec/zdo/definition/clusters.d.ts +0 -624
  994. package/dist/zspec/zdo/definition/clusters.d.ts.map +0 -1
  995. package/dist/zspec/zdo/definition/clusters.js +0 -687
  996. package/dist/zspec/zdo/definition/clusters.js.map +0 -1
  997. package/dist/zspec/zdo/definition/consts.d.ts +0 -13
  998. package/dist/zspec/zdo/definition/consts.d.ts.map +0 -1
  999. package/dist/zspec/zdo/definition/consts.js +0 -16
  1000. package/dist/zspec/zdo/definition/consts.js.map +0 -1
  1001. package/dist/zspec/zdo/definition/enums.d.ts +0 -75
  1002. package/dist/zspec/zdo/definition/enums.d.ts.map +0 -1
  1003. package/dist/zspec/zdo/definition/enums.js +0 -97
  1004. package/dist/zspec/zdo/definition/enums.js.map +0 -1
  1005. package/dist/zspec/zdo/definition/status.d.ts +0 -99
  1006. package/dist/zspec/zdo/definition/status.d.ts.map +0 -1
  1007. package/dist/zspec/zdo/definition/status.js +0 -109
  1008. package/dist/zspec/zdo/definition/status.js.map +0 -1
  1009. package/dist/zspec/zdo/definition/tstypes.d.ts +0 -787
  1010. package/dist/zspec/zdo/definition/tstypes.d.ts.map +0 -1
  1011. package/dist/zspec/zdo/definition/tstypes.js +0 -3
  1012. package/dist/zspec/zdo/definition/tstypes.js.map +0 -1
  1013. package/dist/zspec/zdo/index.d.ts +0 -7
  1014. package/dist/zspec/zdo/index.d.ts.map +0 -1
  1015. package/dist/zspec/zdo/index.js +0 -39
  1016. package/dist/zspec/zdo/index.js.map +0 -1
  1017. package/dist/zspec/zdo/utils.d.ts +0 -25
  1018. package/dist/zspec/zdo/utils.d.ts.map +0 -1
  1019. package/dist/zspec/zdo/utils.js +0 -75
  1020. package/dist/zspec/zdo/utils.js.map +0 -1
  1021. package/dist/zspec/zdo/zdoStatusError.d.ts +0 -6
  1022. package/dist/zspec/zdo/zdoStatusError.d.ts.map +0 -1
  1023. package/dist/zspec/zdo/zdoStatusError.js +0 -13
  1024. package/dist/zspec/zdo/zdoStatusError.js.map +0 -1
  1025. package/typedoc-tsconfig.json +0 -44
@@ -1,2942 +0,0 @@
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
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.EmberAdapter = void 0;
30
- /* istanbul ignore file */
31
- const es6_1 = __importDefault(require("fast-deep-equal/es6"));
32
- const mz_1 = require("mz");
33
- const serialPortUtils_1 = __importDefault(require("../../serialPortUtils"));
34
- const socketPortUtils_1 = __importDefault(require("../../socketPortUtils"));
35
- const utils_1 = require("../../../utils");
36
- const __1 = require("../..");
37
- const Zcl = __importStar(require("../../../zspec/zcl"));
38
- const events_1 = require("../../events");
39
- const math_1 = require("../utils/math");
40
- const ezsp_1 = require("../ezsp/ezsp");
41
- const consts_1 = require("../ezsp/consts");
42
- const enums_1 = require("../ezsp/enums");
43
- const buffalo_1 = require("../ezsp/buffalo");
44
- const enums_2 = require("../enums");
45
- const zdo_1 = require("../zdo");
46
- const consts_2 = require("../consts");
47
- const requestQueue_1 = require("./requestQueue");
48
- const endpoints_1 = require("./endpoints");
49
- const initters_1 = require("../utils/initters");
50
- const crypto_1 = require("crypto");
51
- const oneWaitress_1 = require("./oneWaitress");
52
- const logger_1 = require("../../../utils/logger");
53
- // import {EmberTokensManager} from "./tokensManager";
54
- const NS = 'zh:ember';
55
- /** Enum to pass strings from numbers up to Z2M. */
56
- var RoutingTableStatus;
57
- (function (RoutingTableStatus) {
58
- RoutingTableStatus[RoutingTableStatus["ACTIVE"] = 0] = "ACTIVE";
59
- RoutingTableStatus[RoutingTableStatus["DISCOVERY_UNDERWAY"] = 1] = "DISCOVERY_UNDERWAY";
60
- RoutingTableStatus[RoutingTableStatus["DISCOVERY_FAILED"] = 2] = "DISCOVERY_FAILED";
61
- RoutingTableStatus[RoutingTableStatus["INACTIVE"] = 3] = "INACTIVE";
62
- RoutingTableStatus[RoutingTableStatus["VALIDATION_UNDERWAY"] = 4] = "VALIDATION_UNDERWAY";
63
- RoutingTableStatus[RoutingTableStatus["RESERVED1"] = 5] = "RESERVED1";
64
- RoutingTableStatus[RoutingTableStatus["RESERVED2"] = 6] = "RESERVED2";
65
- RoutingTableStatus[RoutingTableStatus["RESERVED3"] = 7] = "RESERVED3";
66
- })(RoutingTableStatus || (RoutingTableStatus = {}));
67
- ;
68
- var NetworkInitAction;
69
- (function (NetworkInitAction) {
70
- /** Ain't that nice! */
71
- NetworkInitAction[NetworkInitAction["DONE"] = 0] = "DONE";
72
- /** Config mismatch, must leave network. */
73
- NetworkInitAction[NetworkInitAction["LEAVE"] = 1] = "LEAVE";
74
- /** Config mismatched, left network. Will evaluate forming from backup or config next. */
75
- NetworkInitAction[NetworkInitAction["LEFT"] = 2] = "LEFT";
76
- /** Form the network using config. No backup, or backup mismatch. */
77
- NetworkInitAction[NetworkInitAction["FORM_CONFIG"] = 3] = "FORM_CONFIG";
78
- /** Re-form the network using full backed-up data. */
79
- NetworkInitAction[NetworkInitAction["FORM_BACKUP"] = 4] = "FORM_BACKUP";
80
- })(NetworkInitAction || (NetworkInitAction = {}));
81
- ;
82
- /** NOTE: Drivers can override `manufacturer`. Verify logic doesn't work in most cases anyway. */
83
- const autoDetectDefinitions = [
84
- /** NOTE: Manuf code "0x1321" for "Shenzhen Sonoff Technologies Co., Ltd." */
85
- { manufacturer: 'ITEAD', vendorId: '1a86', productId: '55d4' }, // Sonoff ZBDongle-E
86
- /** NOTE: Manuf code "0x134B" for "Nabu Casa, Inc." */
87
- { manufacturer: 'Nabu Casa', vendorId: '10c4', productId: 'ea60' }, // Home Assistant SkyConnect
88
- ];
89
- /**
90
- * Config for EMBER_LOW_RAM_CONCENTRATOR type concentrator.
91
- *
92
- * Based on ZigbeeMinimalHost/zigpc
93
- */
94
- const LOW_RAM_CONCENTRATOR_CONFIG = {
95
- minTime: 5, // zigpc: 10
96
- maxTime: 60, // zigpc: 60
97
- routeErrorThreshold: 3, // zigpc: 3
98
- deliveryFailureThreshold: 1, // zigpc: 1, ZigbeeMinimalHost: 3
99
- mapHops: 0, // zigpc: 0
100
- };
101
- /**
102
- * Config for EMBER_HIGH_RAM_CONCENTRATOR type concentrator.
103
- *
104
- * XXX: For now, same as low, until proper values can be determined.
105
- */
106
- const HIGH_RAM_CONCENTRATOR_CONFIG = {
107
- minTime: 5,
108
- maxTime: 60,
109
- routeErrorThreshold: 3,
110
- deliveryFailureThreshold: 1,
111
- mapHops: 0,
112
- };
113
- /**
114
- * Application generated ZDO messages use sequence numbers 0-127, and the stack
115
- * uses sequence numbers 128-255. This simplifies life by eliminating the need
116
- * for coordination between the two entities, and allows both to send ZDO
117
- * messages with non-conflicting sequence numbers.
118
- */
119
- const APPLICATION_ZDO_SEQUENCE_MASK = 0x7F;
120
- /** Current revision of the spec by zigbee alliance. XXX: what are `Zigbee Pro 2023` devices reporting?? */
121
- const CURRENT_ZIGBEE_SPEC_REVISION = 23;
122
- /** Each scan period is 15.36ms. Scan for at least 200ms (2^4 + 1 periods) to pick up WiFi beacon frames. */
123
- const ENERGY_SCAN_DURATION = 4;
124
- /** Oldest supported EZSP version for backups. Don't take the risk to restore a broken network until older backup versions can be investigated. */
125
- const BACKUP_OLDEST_SUPPORTED_EZSP_VERSION = 12;
126
- /**
127
- * 9sec is minimum recommended for `ezspBroadcastNextNetworkKey` to have propagated throughout network.
128
- * NOTE: This is blocking the request queue, so we shouldn't go crazy high.
129
- */
130
- const BROADCAST_NETWORK_KEY_SWITCH_WAIT_TIME = 15000;
131
- /**
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
137
- */
138
- const STACK_CONFIGS = {
139
- "default": {
140
- /** <1-250> (Default: 2) @see EzspConfigId.ADDRESS_TABLE_SIZE */
141
- ADDRESS_TABLE_SIZE: 16, // zigpc: 32, darkxst: 16, nabucasa: 16
142
- /** <0-4> (Default: 2) @see EzspConfigId.TRUST_CENTER_ADDRESS_CACHE_SIZE */
143
- TRUST_CENTER_ADDRESS_CACHE_SIZE: 2,
144
- /** (Default: USE_TOKEN) @see EzspConfigId.TX_POWER_MODE */
145
- TX_POWER_MODE: enums_2.EmberTXPowerMode.USE_TOKEN,
146
- /** <-> (Default: 1) @see EzspConfigId.SUPPORTED_NETWORKS */
147
- SUPPORTED_NETWORKS: 1,
148
- /** <-> (Default: ) @see EzspConfigId.STACK_PROFILE */
149
- STACK_PROFILE: consts_2.STACK_PROFILE_ZIGBEE_PRO,
150
- /** <-> (Default: ) @see EzspConfigId.SECURITY_LEVEL */
151
- SECURITY_LEVEL: consts_2.SECURITY_LEVEL_Z3,
152
- /** (Default: KEEP_ALIVE_SUPPORT_ALL) @see EzspValueId.END_DEVICE_KEEP_ALIVE_SUPPORT_MODE */
153
- END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL,
154
- /** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE */
155
- MAXIMUM_INCOMING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
156
- /** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE */
157
- MAXIMUM_OUTGOING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
158
- /** <-> (Default: 10000) @see EzspValueId.TRANSIENT_DEVICE_TIMEOUT */
159
- TRANSIENT_DEVICE_TIMEOUT: 10000,
160
- /** <0-127> (Default: 2) @see EzspConfigId.BINDING_TABLE_SIZE */
161
- BINDING_TABLE_SIZE: 32, // zigpc: 2, Z3GatewayGPCombo: 5, nabucasa: 32
162
- /** <0-127> (Default: 0) @see EzspConfigId.KEY_TABLE_SIZE */
163
- KEY_TABLE_SIZE: 0, // zigpc: 4
164
- /** <6-64> (Default: 6) @see EzspConfigId.MAX_END_DEVICE_CHILDREN */
165
- MAX_END_DEVICE_CHILDREN: 32, // zigpc: 6, nabucasa: 32, Dongle-E (Sonoff firmware): 32
166
- /** <1-255> (Default: 10) @see EzspConfigId.APS_UNICAST_MESSAGE_COUNT */
167
- APS_UNICAST_MESSAGE_COUNT: 32, // zigpc: 10, darkxst: 20, nabucasa: 20
168
- /** <15-254> (Default: 15) @see EzspConfigId.BROADCAST_TABLE_SIZE */
169
- BROADCAST_TABLE_SIZE: 15, // zigpc: 15, Z3GatewayGPCombo: 35 - NOTE: Sonoff Dongle-E fails at 35
170
- /** [1, 16, 26] (Default: 16). @see EzspConfigId.NEIGHBOR_TABLE_SIZE */
171
- NEIGHBOR_TABLE_SIZE: 26, // zigpc: 16, darkxst: 26, nabucasa: 26
172
- /** (Default: 8) @see EzspConfigId.END_DEVICE_POLL_TIMEOUT */
173
- END_DEVICE_POLL_TIMEOUT: 8, // zigpc: 8
174
- /** <0-65535> (Default: 300) @see EzspConfigId.TRANSIENT_KEY_TIMEOUT_S */
175
- TRANSIENT_KEY_TIMEOUT_S: 300, // zigpc: 65535
176
- /** <-> (Default: 16) @see EzspConfigId.RETRY_QUEUE_SIZE */
177
- RETRY_QUEUE_SIZE: 16, // nabucasa: 16
178
- /** <0-255> (Default: 0) @see EzspConfigId.SOURCE_ROUTE_TABLE_SIZE */
179
- SOURCE_ROUTE_TABLE_SIZE: 200, // Z3GatewayGPCombo: 100, darkxst: 200, nabucasa: 200
180
- /** <1-250> (Default: 8) @see EzspConfigId.MULTICAST_TABLE_SIZE */
181
- MULTICAST_TABLE_SIZE: 16, // darkxst: 16, nabucasa: 16 - NOTE: should always be at least enough to register FIXED_ENDPOINTS multicastIds
182
- },
183
- "zigbeed": {
184
- ADDRESS_TABLE_SIZE: 128,
185
- TRUST_CENTER_ADDRESS_CACHE_SIZE: 2,
186
- TX_POWER_MODE: enums_2.EmberTXPowerMode.USE_TOKEN,
187
- SUPPORTED_NETWORKS: 1,
188
- STACK_PROFILE: consts_2.STACK_PROFILE_ZIGBEE_PRO,
189
- SECURITY_LEVEL: consts_2.SECURITY_LEVEL_Z3,
190
- END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL,
191
- MAXIMUM_INCOMING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
192
- MAXIMUM_OUTGOING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
193
- TRANSIENT_DEVICE_TIMEOUT: 10000,
194
- BINDING_TABLE_SIZE: 128,
195
- KEY_TABLE_SIZE: 0, // zigbeed 128
196
- MAX_END_DEVICE_CHILDREN: 64,
197
- APS_UNICAST_MESSAGE_COUNT: 32,
198
- BROADCAST_TABLE_SIZE: 15,
199
- NEIGHBOR_TABLE_SIZE: 26,
200
- END_DEVICE_POLL_TIMEOUT: 8,
201
- TRANSIENT_KEY_TIMEOUT_S: 300,
202
- RETRY_QUEUE_SIZE: 16,
203
- SOURCE_ROUTE_TABLE_SIZE: 254,
204
- MULTICAST_TABLE_SIZE: 128,
205
- },
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);
216
- /**
217
- * Enabling this allows to immediately reject requests that won't be able to get to their destination.
218
- * However, it causes more NCP calls, notably to get the source route overhead.
219
- * XXX: Needs further testing before enabling
220
- */
221
- const CHECK_APS_PAYLOAD_LENGTH = false;
222
- /** Time for a ZDO request to get a callback response. ASH is 2400*6 for ACK timeout. */
223
- const DEFAULT_ZDO_REQUEST_TIMEOUT = 15000; // msec
224
- /** Time for a ZCL request to get a callback response. ASH is 2400*6 for ACK timeout. */
225
- const DEFAULT_ZCL_REQUEST_TIMEOUT = 15000; //msec
226
- /** Time for a network-related request to get a response (usually via event). */
227
- const DEFAULT_NETWORK_REQUEST_TIMEOUT = 10000; // nothing on the network to bother requests, should be much faster than this
228
- /** Time between watchdog counters reading/clearing */
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
- };
241
- /**
242
- * Relay calls between Z2M and EZSP-layer and handle any error that might occur via queue & waitress.
243
- *
244
- * Anything post `start` that requests anything from the EZSP layer must run through the request queue for proper execution flow.
245
- */
246
- class EmberAdapter extends __1.Adapter {
247
- /** Current manufacturer code assigned to the coordinator. Used for join workarounds... */
248
- manufacturerCode;
249
- /** Key in STACK_CONFIGS */
250
- stackConfig;
251
- /** EMBER_LOW_RAM_CONCENTRATOR or EMBER_HIGH_RAM_CONCENTRATOR. */
252
- concentratorType;
253
- ezsp;
254
- version;
255
- requestQueue;
256
- oneWaitress;
257
- /** Periodically retrieve counters then clear them. */
258
- watchdogCountersHandle;
259
- /** Hold ZDO request in process. */
260
- zdoRequestBuffalo;
261
- /** Sequence number used for ZDO requests. static uint8_t */
262
- zdoRequestSequence;
263
- /** Default radius used for broadcast ZDO requests. uint8_t */
264
- zdoRequestRadius;
265
- interpanLock;
266
- /**
267
- * Cached network params to avoid NCP calls. Prevents frequent EZSP transactions.
268
- * NOTE: Do not use directly, use getter functions for it that check if valid or need retrieval from NCP.
269
- */
270
- networkCache;
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';
276
- // TODO config
277
- this.concentratorType = consts_2.EMBER_HIGH_RAM_CONCENTRATOR;
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);
280
- this.requestQueue = new requestQueue_1.EmberRequestQueue(delay);
281
- this.oneWaitress = new oneWaitress_1.EmberOneWaitress();
282
- this.zdoRequestBuffalo = new buffalo_1.EzspBuffalo(Buffer.alloc(consts_1.EZSP_MAX_FRAME_LENGTH));
283
- this.ezsp = new ezsp_1.Ezsp(delay, serialPortOptions);
284
- this.ezsp.on(ezsp_1.EzspEvents.STACK_STATUS, this.onStackStatus.bind(this));
285
- this.ezsp.on(ezsp_1.EzspEvents.MESSAGE_SENT_DELIVERY_FAILED, this.onMessageSentDeliveryFailed.bind(this));
286
- this.ezsp.on(ezsp_1.EzspEvents.ZDO_RESPONSE, this.onZDOResponse.bind(this));
287
- this.ezsp.on(ezsp_1.EzspEvents.END_DEVICE_ANNOUNCE, this.onEndDeviceAnnounce.bind(this));
288
- this.ezsp.on(ezsp_1.EzspEvents.INCOMING_MESSAGE, this.onIncomingMessage.bind(this));
289
- this.ezsp.on(ezsp_1.EzspEvents.TOUCHLINK_MESSAGE, this.onTouchlinkMessage.bind(this));
290
- this.ezsp.on(ezsp_1.EzspEvents.GREENPOWER_MESSAGE, this.onGreenpowerMessage.bind(this));
291
- this.ezsp.on(ezsp_1.EzspEvents.TRUST_CENTER_JOIN, this.onTrustCenterJoin.bind(this));
292
- }
293
- /**
294
- * Emitted from @see Ezsp.ezspStackStatusHandler
295
- * @param status
296
- */
297
- async onStackStatus(status) {
298
- // to be extra careful, should clear network cache upon receiving this.
299
- this.clearNetworkCache();
300
- switch (status) {
301
- case enums_2.EmberStatus.NETWORK_UP: {
302
- this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP);
303
- logger_1.logger.info(`[STACK STATUS] Network up.`, NS);
304
- break;
305
- }
306
- case enums_2.EmberStatus.NETWORK_DOWN: {
307
- this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN);
308
- logger_1.logger.info(`[STACK STATUS] Network down.`, NS);
309
- break;
310
- }
311
- case enums_2.EmberStatus.NETWORK_OPENED: {
312
- this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_OPENED);
313
- logger_1.logger.info(`[STACK STATUS] Network opened.`, NS);
314
- break;
315
- }
316
- case enums_2.EmberStatus.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);
326
- break;
327
- }
328
- default: {
329
- logger_1.logger.debug(`[STACK STATUS] ${enums_2.EmberStatus[status]}.`, NS);
330
- break;
331
- }
332
- }
333
- }
334
- /**
335
- * Emitted from @see Ezsp.ezspMessageSentHandler
336
- * WARNING: Cannot rely on `ezspMessageSentHandler` > `ezspIncomingMessageHandler` order, some devices mix it up!
337
- *
338
- * @param type
339
- * @param indexOrDestination
340
- * @param apsFrame
341
- * @param messageTag
342
- */
343
- async onMessageSentDeliveryFailed(type, indexOrDestination, apsFrame, messageTag) {
344
- switch (type) {
345
- case enums_2.EmberOutgoingMessageType.BROADCAST:
346
- case enums_2.EmberOutgoingMessageType.BROADCAST_WITH_ALIAS:
347
- case enums_2.EmberOutgoingMessageType.MULTICAST:
348
- case enums_2.EmberOutgoingMessageType.MULTICAST_WITH_ALIAS: {
349
- // BC/MC not checking for message sent, avoid unnecessary waitress lookups
350
- logger_1.logger.error(`Delivery of ${enums_2.EmberOutgoingMessageType[type]} failed for "${indexOrDestination}" `
351
- + `[apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
352
- break;
353
- }
354
- default: {
355
- // reject any waitress early (don't wait for timeout if we know we're gonna get there eventually)
356
- this.oneWaitress.deliveryFailedFor(indexOrDestination, apsFrame);
357
- break;
358
- }
359
- }
360
- }
361
- /**
362
- * Emitted from @see Ezsp.ezspIncomingMessageHandler
363
- *
364
- * @param clusterId The ZDO response cluster ID.
365
- * @param sender The sender of the response. Should match `payload.nodeId` in many responses.
366
- * @param payload If null, the response indicated a failure.
367
- */
368
- async onZDOResponse(status, sender, apsFrame, payload) {
369
- this.oneWaitress.resolveZDO(status, sender, apsFrame, payload);
370
- }
371
- /**
372
- * Emitted from @see Ezsp.ezspIncomingMessageHandler
373
- *
374
- * @param sender
375
- * @param nodeId
376
- * @param eui64
377
- * @param macCapFlags
378
- */
379
- async onEndDeviceAnnounce(sender, apsFrame, payload) {
380
- // reduced function device
381
- // if ((payload.capabilities.deviceType === 0)) {
382
- // }
383
- this.emit(events_1.Events.deviceAnnounce, { networkAddress: payload.nodeId, ieeeAddr: payload.eui64 });
384
- }
385
- /**
386
- * Emitted from @see Ezsp.ezspIncomingMessageHandler
387
- *
388
- * @param type
389
- * @param apsFrame
390
- * @param lastHopLqi
391
- * @param sender
392
- * @param messageContents
393
- */
394
- async onIncomingMessage(type, apsFrame, lastHopLqi, sender, messageContents) {
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);
408
- }
409
- /**
410
- * Emitted from @see Ezsp.ezspMacFilterMatchMessageHandler when the message is a valid InterPAN touchlink message.
411
- *
412
- * @param sourcePanId
413
- * @param sourceAddress
414
- * @param groupId
415
- * @param lastHopLqi
416
- * @param messageContents
417
- */
418
- async onTouchlinkMessage(sourcePanId, sourceAddress, groupId, lastHopLqi, messageContents) {
419
- const payload = {
420
- clusterID: Zcl.Clusters.touchlink.ID,
421
- data: messageContents,
422
- header: Zcl.Header.fromBuffer(messageContents),
423
- address: sourceAddress,
424
- endpoint: 1, // arbitrary since not sent over-the-air
425
- linkquality: lastHopLqi,
426
- groupID: groupId,
427
- wasBroadcast: true, // XXX: since always sent broadcast atm...
428
- destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
429
- };
430
- this.oneWaitress.resolveZCL(payload);
431
- this.emit(events_1.Events.zclPayload, payload);
432
- }
433
- /**
434
- * Emitted from @see Ezsp.ezspGpepIncomingMessageHandler
435
- *
436
- * @param sequenceNumber
437
- * @param commandIdentifier
438
- * @param sourceId
439
- * @param frameCounter
440
- * @param gpdCommandId
441
- * @param gpdCommandPayload
442
- * @param gpdLink
443
- */
444
- async onGreenpowerMessage(sequenceNumber, commandIdentifier, sourceId, frameCounter, gpdCommandId, gpdCommandPayload, gpdLink) {
445
- try {
446
- const gpdHeader = Buffer.alloc(15);
447
- gpdHeader.writeUInt8(0b00000001, 0); // frameControl: FrameType.SPECIFIC + Direction.CLIENT_TO_SERVER + disableDefaultResponse=false
448
- gpdHeader.writeUInt8(sequenceNumber, 1); // transactionSequenceNumber
449
- gpdHeader.writeUInt8(commandIdentifier, 2); // commandIdentifier
450
- gpdHeader.writeUInt16LE(0, 3); // options XXX: bypassed, same as deconz https://github.com/Koenkk/zigbee-herdsman/pull/536
451
- gpdHeader.writeUInt32LE(sourceId, 5); // srcID
452
- // omitted: gpdIEEEAddr ieeeAddr
453
- // omitted: gpdEndpoint uint8
454
- gpdHeader.writeUInt32LE(frameCounter, 9); // frameCounter
455
- gpdHeader.writeUInt8(gpdCommandId, 13); // commandID
456
- gpdHeader.writeUInt8(gpdCommandPayload.length, 14); // payloadSize
457
- const data = Buffer.concat([gpdHeader, gpdCommandPayload]);
458
- const payload = {
459
- header: Zcl.Header.fromBuffer(data),
460
- data,
461
- clusterID: Zcl.Clusters.greenPower.ID,
462
- address: sourceId,
463
- endpoint: consts_2.GP_ENDPOINT,
464
- linkquality: gpdLink,
465
- groupID: this.greenPowerGroup,
466
- wasBroadcast: true,
467
- destinationEndpoint: consts_2.GP_ENDPOINT,
468
- };
469
- this.oneWaitress.resolveZCL(payload);
470
- this.emit(events_1.Events.zclPayload, payload);
471
- }
472
- catch (err) {
473
- logger_1.logger.error(`<~x~ [GP] Failed creating ZCL payload. Skipping. ${err}`, NS);
474
- return;
475
- }
476
- }
477
- /**
478
- * Emitted from @see Ezsp.ezspTrustCenterJoinHandler
479
- * Also from @see Ezsp.ezspIdConflictHandler as a DEVICE_LEFT
480
- *
481
- * @param newNodeId
482
- * @param newNodeEui64
483
- * @param status
484
- * @param policyDecision
485
- * @param parentOfNewNodeId
486
- */
487
- async onTrustCenterJoin(newNodeId, newNodeEui64, status, policyDecision, parentOfNewNodeId) {
488
- if (status === enums_2.EmberDeviceUpdate.DEVICE_LEFT) {
489
- const payload = {
490
- networkAddress: newNodeId,
491
- ieeeAddr: newNodeEui64,
492
- };
493
- this.emit(events_1.Events.deviceLeave, payload);
494
- }
495
- else {
496
- if (policyDecision !== enums_2.EmberJoinDecision.DENY_JOIN) {
497
- const payload = {
498
- networkAddress: newNodeId,
499
- ieeeAddr: newNodeEui64,
500
- };
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
- }
518
- }
519
- else {
520
- logger_1.logger.warning(`[TRUST CENTER] Device ${newNodeId}:${newNodeEui64} was denied joining via ${parentOfNewNodeId}.`, NS);
521
- }
522
- }
523
- }
524
- async watchdogCounters() {
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
- });
536
- }
537
- initVariables() {
538
- this.ezsp.removeAllListeners(ezsp_1.EzspEvents.ncpNeedsResetAndInit);
539
- clearInterval(this.watchdogCountersHandle);
540
- this.zdoRequestBuffalo.setPosition(0);
541
- this.zdoRequestSequence = 0; // start at 1
542
- this.zdoRequestRadius = 255;
543
- this.interpanLock = false;
544
- this.networkCache = (0, initters_1.initNetworkCache)();
545
- this.manufacturerCode = DEFAULT_MANUFACTURER_CODE; // will be set in NCP in initEzsp
546
- this.ezsp.once(ezsp_1.EzspEvents.ncpNeedsResetAndInit, this.onNcpNeedsResetAndInit.bind(this));
547
- }
548
- /**
549
- * Proceed to execute the long list of commands required to setup comms between Host<>NCP.
550
- * This is called by start and on internal reset.
551
- */
552
- async initEzsp() {
553
- let result = "resumed";
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]}.`);
558
- }
559
- // call before any other command, else fails
560
- await this.emberVersion();
561
- await this.initNCPPreConfiguration();
562
- await this.initNCPAddressTable();
563
- await this.initNCPConfiguration();
564
- // WARNING: From here on EZSP commands that affect memory allocation on the NCP should no longer be called (like resizing tables)
565
- await this.registerFixedEndpoints();
566
- this.clearNetworkCache();
567
- result = (await this.initTrustCenter());
568
- // after network UP, as per SDK, ensures clean slate
569
- await this.initNCPConcentrator();
570
- // await (this.emberStartEnergyScan());// TODO: via config of some kind, better off waiting for UI supports though
571
- // populate network cache info
572
- const [status, , parameters] = (await this.ezsp.ezspGetNetworkParameters());
573
- if (status !== enums_2.EmberStatus.SUCCESS) {
574
- throw new Error(`Failed to get network parameters with status=${enums_2.EmberStatus[status]}.`);
575
- }
576
- this.networkCache.parameters = parameters;
577
- this.networkCache.status = (await this.ezsp.ezspNetworkState());
578
- this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
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();
582
- return result;
583
- }
584
- /**
585
- * NCP Config init. Should always be called first in the init stack (after version cmd).
586
- * @returns
587
- */
588
- async initNCPPreConfiguration() {
589
- // this can only decrease, not increase, NCP-side value
590
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.ADDRESS_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].ADDRESS_TABLE_SIZE);
591
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.TRUST_CENTER_ADDRESS_CACHE_SIZE, STACK_CONFIGS[this.stackConfig].TRUST_CENTER_ADDRESS_CACHE_SIZE);
592
- if (STACK_CONFIGS[this.stackConfig].STACK_PROFILE === consts_2.STACK_PROFILE_ZIGBEE_PRO) {
593
- // BUG 14222: If stack profile is 2 (ZigBee Pro), we need to enforce
594
- // the standard stack configuration values for that feature set.
595
- /** MAC indirect timeout should be 7.68 secs */
596
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.INDIRECT_TRANSMISSION_TIMEOUT, 7680);
597
- /** Max hops should be 2 * nwkMaxDepth, where nwkMaxDepth is 15 */
598
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.MAX_HOPS, 30);
599
- }
600
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.TX_POWER_MODE, STACK_CONFIGS[this.stackConfig].TX_POWER_MODE);
601
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.SUPPORTED_NETWORKS, STACK_CONFIGS[this.stackConfig].SUPPORTED_NETWORKS);
602
- await this.emberSetEzspValue(enums_1.EzspValueId.END_DEVICE_KEEP_ALIVE_SUPPORT_MODE, 1, [STACK_CONFIGS[this.stackConfig].END_DEVICE_KEEP_ALIVE_SUPPORT_MODE]);
603
- // allow other devices to modify the binding table
604
- await this.emberSetEzspPolicy(enums_1.EzspPolicyId.BINDING_MODIFICATION_POLICY, enums_1.EzspDecisionId.CHECK_BINDING_MODIFICATIONS_ARE_VALID_ENDPOINT_CLUSTERS);
605
- // return message tag and message contents in ezspMessageSentHandler()
606
- await this.emberSetEzspPolicy(enums_1.EzspPolicyId.MESSAGE_CONTENTS_IN_CALLBACK_POLICY, enums_1.EzspDecisionId.MESSAGE_TAG_AND_CONTENTS_IN_CALLBACK);
607
- await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_INCOMING_TRANSFER_SIZE));
608
- await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_OUTGOING_TRANSFER_SIZE));
609
- await this.emberSetEzspValue(enums_1.EzspValueId.TRANSIENT_DEVICE_TIMEOUT, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].TRANSIENT_DEVICE_TIMEOUT));
610
- await this.ezsp.ezspSetManufacturerCode(this.manufacturerCode);
611
- // network security init
612
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.STACK_PROFILE, STACK_CONFIGS[this.stackConfig].STACK_PROFILE);
613
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.SECURITY_LEVEL, STACK_CONFIGS[this.stackConfig].SECURITY_LEVEL);
614
- }
615
- /**
616
- * NCP Address table init.
617
- * @returns
618
- */
619
- async initNCPAddressTable() {
620
- const desiredTableSize = STACK_CONFIGS[this.stackConfig].ADDRESS_TABLE_SIZE;
621
- // If the host and the ncp disagree on the address table size, explode.
622
- const [status, addressTableSize] = (await this.ezsp.ezspGetConfigurationValue(enums_1.EzspConfigId.ADDRESS_TABLE_SIZE));
623
- // After the change of ncp memory model in UC, we can not increase the default NCP table sizes anymore.
624
- // Therefore, checking for desiredTableSize == (ncp)addressTableSize might not be always true anymore
625
- // assert(desiredTableSize <= addressTableSize);
626
- if ((status !== enums_2.EzspStatus.SUCCESS) || (addressTableSize > desiredTableSize)) {
627
- throw new Error(`[INIT] NCP (${addressTableSize}) disagrees with Host (min ${desiredTableSize}) on table size. status=${enums_2.EzspStatus[status]}`);
628
- }
629
- }
630
- /**
631
- * NCP configuration init
632
- */
633
- async initNCPConfiguration() {
634
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.BINDING_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].BINDING_TABLE_SIZE);
635
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.KEY_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].KEY_TABLE_SIZE);
636
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.MAX_END_DEVICE_CHILDREN, STACK_CONFIGS[this.stackConfig].MAX_END_DEVICE_CHILDREN);
637
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.APS_UNICAST_MESSAGE_COUNT, STACK_CONFIGS[this.stackConfig].APS_UNICAST_MESSAGE_COUNT);
638
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.BROADCAST_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].BROADCAST_TABLE_SIZE);
639
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.NEIGHBOR_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].NEIGHBOR_TABLE_SIZE);
640
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.END_DEVICE_POLL_TIMEOUT, STACK_CONFIGS[this.stackConfig].END_DEVICE_POLL_TIMEOUT);
641
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.TRANSIENT_KEY_TIMEOUT_S, STACK_CONFIGS[this.stackConfig].TRANSIENT_KEY_TIMEOUT_S);
642
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.RETRY_QUEUE_SIZE, STACK_CONFIGS[this.stackConfig].RETRY_QUEUE_SIZE);
643
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.SOURCE_ROUTE_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].SOURCE_ROUTE_TABLE_SIZE);
644
- await this.emberSetEzspConfigValue(enums_1.EzspConfigId.MULTICAST_TABLE_SIZE, STACK_CONFIGS[this.stackConfig].MULTICAST_TABLE_SIZE);
645
- }
646
- /**
647
- * NCP concentrator init. Also enables source route discovery mode with RESCHEDULE.
648
- *
649
- * From AN1233:
650
- * To function correctly in a Zigbee PRO network, a trust center also requires that:
651
- *
652
- * 1. The trust center application must act as a concentrator (either high or low RAM).
653
- * 2. The trust center application must have support for source routing.
654
- * It must record the source routes and properly handle requests by the stack for a particular source route.
655
- * 3. The trust center application must use an address cache for security, in order to maintain a mapping of IEEE address to short ID.
656
- *
657
- * Failure to satisfy all of the above requirements may result in failures when joining/rejoining devices to the network across multiple hops
658
- * (through a target node that is neither the trust center nor one of its neighboring routers.)
659
- */
660
- async initNCPConcentrator() {
661
- const config = (this.concentratorType === consts_2.EMBER_HIGH_RAM_CONCENTRATOR) ? HIGH_RAM_CONCENTRATOR_CONFIG : LOW_RAM_CONCENTRATOR_CONFIG;
662
- const status = (await this.ezsp.ezspSetConcentrator(true, this.concentratorType, config.minTime, config.maxTime, config.routeErrorThreshold, config.deliveryFailureThreshold, config.mapHops));
663
- if (status !== enums_2.EmberStatus.SUCCESS) {
664
- throw new Error(`[CONCENTRATOR] Failed to set concentrator with status=${status}.`);
665
- }
666
- const remainTilMTORR = (await this.ezsp.ezspSetSourceRouteDiscoveryMode(enums_2.EmberSourceRouteDiscoveryMode.RESCHEDULE));
667
- logger_1.logger.info(`[CONCENTRATOR] Started source route discovery. ${remainTilMTORR}ms until next broadcast.`, NS);
668
- }
669
- /**
670
- * Register fixed endpoints and set any related multicast entries that need to be.
671
- */
672
- async registerFixedEndpoints() {
673
- let mcTableIdx = 0;
674
- for (const ep of endpoints_1.FIXED_ENDPOINTS) {
675
- if (ep.networkIndex !== 0x00) {
676
- logger_1.logger.debug(`Multi-network not currently supported. Skipping endpoint ${JSON.stringify(ep)}.`, NS);
677
- continue;
678
- }
679
- const [epStatus,] = (await this.ezsp.ezspGetEndpointFlags(ep.endpoint));
680
- // endpoint not already registered
681
- if (epStatus !== enums_2.EzspStatus.SUCCESS) {
682
- // check to see if ezspAddEndpoint needs to be called
683
- // if ezspInit is called without NCP reset, ezspAddEndpoint is not necessary and will return an error
684
- const status = (await this.ezsp.ezspAddEndpoint(ep.endpoint, ep.profileId, ep.deviceId, ep.deviceVersion, ep.inClusterList.slice(), // copy
685
- ep.outClusterList.slice()));
686
- if (status === enums_2.EzspStatus.SUCCESS) {
687
- logger_1.logger.debug(`Registered endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`, NS);
688
- }
689
- else {
690
- throw new Error(`Failed to register endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`);
691
- }
692
- }
693
- else {
694
- logger_1.logger.debug(`Endpoint "${ep.endpoint}" already registered.`, NS);
695
- }
696
- for (const multicastId of ep.multicastIds) {
697
- const multicastEntry = {
698
- multicastId,
699
- endpoint: ep.endpoint,
700
- networkIndex: ep.networkIndex,
701
- };
702
- const status = (await this.ezsp.ezspSetMulticastTableEntry(mcTableIdx++, multicastEntry));
703
- if (status !== enums_2.EmberStatus.SUCCESS) {
704
- throw new Error(`Failed to register group "${multicastId}" in multicast table with status=${enums_2.EmberStatus[status]}.`);
705
- }
706
- logger_1.logger.debug(`Registered multicast table entry: ${JSON.stringify(multicastEntry)}.`, NS);
707
- }
708
- }
709
- }
710
- /**
711
- *
712
- * @returns True if the network needed to be formed.
713
- */
714
- async initTrustCenter() {
715
- // init TC policies
716
- {
717
- let status = (await this.emberSetEzspPolicy(enums_1.EzspPolicyId.TC_KEY_REQUEST_POLICY, enums_1.EzspDecisionId.ALLOW_TC_KEY_REQUESTS_AND_SEND_CURRENT_KEY));
718
- if (status !== enums_2.EzspStatus.SUCCESS) {
719
- throw new Error(`[INIT TC] Failed to set EzspPolicyId TC_KEY_REQUEST_POLICY to ALLOW_TC_KEY_REQUESTS_AND_SEND_CURRENT_KEY `
720
- + `with status=${enums_2.EzspStatus[status]}.`);
721
- }
722
- const appKeyPolicy = STACK_CONFIGS[this.stackConfig].KEY_TABLE_SIZE
723
- ? enums_1.EzspDecisionId.ALLOW_APP_KEY_REQUESTS : enums_1.EzspDecisionId.DENY_APP_KEY_REQUESTS;
724
- status = (await this.emberSetEzspPolicy(enums_1.EzspPolicyId.APP_KEY_REQUEST_POLICY, appKeyPolicy));
725
- if (status !== enums_2.EzspStatus.SUCCESS) {
726
- throw new Error(`[INIT TC] Failed to set EzspPolicyId APP_KEY_REQUEST_POLICY to ${enums_1.EzspDecisionId[appKeyPolicy]} `
727
- + `with status=${enums_2.EzspStatus[status]}.`);
728
- }
729
- status = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY));
730
- if (status !== enums_2.EzspStatus.SUCCESS) {
731
- throw new Error(`[INIT TC] Failed to set join policy to USE_PRECONFIGURED_KEY with status=${enums_2.EzspStatus[status]}.`);
732
- }
733
- }
734
- const configNetworkKey = Buffer.from(this.networkOptions.networkKey);
735
- const networkInitStruct = {
736
- bitmask: (enums_2.EmberNetworkInitBitmask.PARENT_INFO_IN_TOKEN | enums_2.EmberNetworkInitBitmask.END_DEVICE_REJOIN_ON_REBOOT)
737
- };
738
- const initStatus = (await this.ezsp.ezspNetworkInit(networkInitStruct));
739
- logger_1.logger.debug(`[INIT TC] Network init status=${enums_2.EmberStatus[initStatus]}.`, NS);
740
- if ((initStatus !== enums_2.EmberStatus.SUCCESS) && (initStatus !== enums_2.EmberStatus.NOT_JOINED)) {
741
- throw new Error(`[INIT TC] Failed network init request with status=${enums_2.EmberStatus[initStatus]}.`);
742
- }
743
- let action = NetworkInitAction.DONE;
744
- if (initStatus === enums_2.EmberStatus.SUCCESS) {
745
- // network
746
- await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Network init');
747
- const [npStatus, nodeType, netParams] = (await this.ezsp.ezspGetNetworkParameters());
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);
750
- if ((npStatus === enums_2.EmberStatus.SUCCESS) && (nodeType === enums_2.EmberNodeType.COORDINATOR) && (this.networkOptions.panID === netParams.panId)
751
- && ((0, es6_1.default)(this.networkOptions.extendedPanID, netParams.extendedPanId))) {
752
- // config matches adapter so far, no error, we can check the network key
753
- const context = (0, initters_1.initSecurityManagerContext)();
754
- context.coreKeyType = enums_2.SecManKeyType.NETWORK;
755
- context.keyIndex = 0;
756
- const [networkKey, nkStatus] = (await this.ezsp.ezspExportKey(context));
757
- if (nkStatus !== enums_2.SLStatus.OK) {
758
- throw new Error(`[BACKUP] Failed to export Network Key with status=${enums_2.SLStatus[nkStatus]}.`);
759
- }
760
- logger_1.logger.debug(`[INIT TC] Current NCP network: networkKey=${networkKey.contents.toString('hex')}`, NS);
761
- // config doesn't match adapter anymore
762
- if (!networkKey.contents.equals(configNetworkKey)) {
763
- action = NetworkInitAction.LEAVE;
764
- }
765
- }
766
- else {
767
- // config doesn't match adapter
768
- action = NetworkInitAction.LEAVE;
769
- }
770
- if (action === NetworkInitAction.LEAVE) {
771
- logger_1.logger.info(`[INIT TC] NCP network does not match config. Leaving network...`, NS);
772
- const leaveStatus = (await this.ezsp.ezspLeaveNetwork());
773
- if (leaveStatus !== enums_2.EmberStatus.SUCCESS) {
774
- throw new Error(`[INIT TC] Failed leave network request with status=${enums_2.EmberStatus[leaveStatus]}.`);
775
- }
776
- await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Leave network');
777
- await (0, utils_1.Wait)(200); // settle down
778
- action = NetworkInitAction.LEFT;
779
- }
780
- }
781
- const backup = (await this.getStoredBackup());
782
- if ((initStatus === enums_2.EmberStatus.NOT_JOINED) || (action === NetworkInitAction.LEFT)) {
783
- // no network
784
- if (backup != null) {
785
- if ((this.networkOptions.panID === backup.networkOptions.panId)
786
- && (Buffer.from(this.networkOptions.extendedPanID).equals(backup.networkOptions.extendedPanId))
787
- && (this.networkOptions.channelList.includes(backup.logicalChannel))
788
- && (configNetworkKey.equals(backup.networkOptions.networkKey))) {
789
- // config matches backup
790
- action = NetworkInitAction.FORM_BACKUP;
791
- }
792
- else {
793
- // config doesn't match backup
794
- logger_1.logger.info(`[INIT TC] Config does not match backup.`, NS);
795
- action = NetworkInitAction.FORM_CONFIG;
796
- }
797
- }
798
- else {
799
- // no backup
800
- logger_1.logger.info(`[INIT TC] No valid backup found.`, NS);
801
- action = NetworkInitAction.FORM_CONFIG;
802
- }
803
- }
804
- //---- from here on, we assume everything is in place for whatever decision was taken above
805
- let result = 'resumed';
806
- switch (action) {
807
- case NetworkInitAction.FORM_BACKUP: {
808
- logger_1.logger.info(`[INIT TC] Forming from backup.`, NS);
809
- const keyList = backup.devices.map((device) => {
810
- const octets = Array.from(device.ieeeAddress.reverse());
811
- const deviceEui64 = '0x' + octets.map(octet => octet.toString(16).padStart(2, '0')).join("");
812
- const key = {
813
- deviceEui64,
814
- key: { contents: device.linkKey.key },
815
- outgoingFrameCounter: device.linkKey.txCounter,
816
- incomingFrameCounter: device.linkKey.rxCounter,
817
- };
818
- return key;
819
- });
820
- // before forming
821
- await this.importLinkKeys(keyList);
822
- await this.formNetwork(true, /*from backup*/ backup.networkOptions.networkKey, backup.networkKeyInfo.sequenceNumber, backup.networkOptions.panId, Array.from(backup.networkOptions.extendedPanId), backup.logicalChannel, backup.ezsp.hashed_tclk);
823
- result = 'restored';
824
- break;
825
- }
826
- case NetworkInitAction.FORM_CONFIG: {
827
- logger_1.logger.info(`[INIT TC] Forming from config.`, NS);
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));
829
- result = 'reset';
830
- break;
831
- }
832
- case NetworkInitAction.DONE: {
833
- logger_1.logger.info(`[INIT TC] NCP network matches config.`, NS);
834
- break;
835
- }
836
- default: {
837
- throw new Error(`[INIT TC] Invalid action "${NetworkInitAction[action]}" for final stage.`);
838
- }
839
- }
840
- // can't let frame counter wrap to zero (uint32_t), will force a broadcast after init if getting too close
841
- if (backup != null && (backup.networkKeyInfo.frameCounter > 0xFEEEEEEE)) {
842
- // XXX: while this remains a pretty low occurrence in most (small) networks,
843
- // currently Z2M won't support the key update because of one-way config...
844
- // need to investigate handling this properly
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);
847
- // // XXX: no idea here on the proper timer value, but this will block the network for several seconds on exec
848
- // // (probably have to take the behavior of sleepy-end devices into account to improve chances of reaching everyone right away?)
849
- // setTimeout(async () => {
850
- // this.requestQueue.enqueue(async (): Promise<EmberStatus> => {
851
- // await this.broadcastNetworkKeyUpdate();
852
- // return EmberStatus.SUCCESS;
853
- // }, logger.error, true);// no reject just log error if any, will retry next start, & prioritize so we know it'll run when expected
854
- // }, 300000);
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);
856
- }
857
- return result;
858
- }
859
- /**
860
- * Form a network using given parameters.
861
- */
862
- async formNetwork(fromBackup, networkKey, networkKeySequenceNumber, panId, extendedPanId, radioChannel, tcLinkKey) {
863
- const state = {
864
- bitmask: (enums_2.EmberInitialSecurityBitmask.TRUST_CENTER_GLOBAL_LINK_KEY | enums_2.EmberInitialSecurityBitmask.HAVE_PRECONFIGURED_KEY
865
- | enums_2.EmberInitialSecurityBitmask.HAVE_NETWORK_KEY | enums_2.EmberInitialSecurityBitmask.TRUST_CENTER_USES_HASHED_LINK_KEY
866
- | enums_2.EmberInitialSecurityBitmask.REQUIRE_ENCRYPTED_KEY),
867
- preconfiguredKey: { contents: tcLinkKey },
868
- networkKey: { contents: networkKey },
869
- networkKeySequenceNumber: networkKeySequenceNumber,
870
- preconfiguredTrustCenterEui64: consts_2.BLANK_EUI64,
871
- };
872
- if (fromBackup) {
873
- state.bitmask |= enums_2.EmberInitialSecurityBitmask.NO_FRAME_COUNTER_RESET;
874
- }
875
- let emberStatus = (await this.ezsp.ezspSetInitialSecurityState(state));
876
- if (emberStatus !== enums_2.EmberStatus.SUCCESS) {
877
- throw new Error(`[INIT FORM] Failed to set initial security state with status=${enums_2.EmberStatus[emberStatus]}.`);
878
- }
879
- const extended = (enums_2.EmberExtendedSecurityBitmask.JOINER_GLOBAL_LINK_KEY | enums_2.EmberExtendedSecurityBitmask.NWK_LEAVE_REQUEST_NOT_ALLOWED);
880
- const extSecStatus = (await this.ezsp.ezspSetExtendedSecurityBitmask(extended));
881
- if (extSecStatus !== enums_2.EzspStatus.SUCCESS) {
882
- throw new Error(`[INIT FORM] Failed to set extended security bitmask to ${extended} with status=${enums_2.EzspStatus[extSecStatus]}.`);
883
- }
884
- if (!fromBackup && STACK_CONFIGS[this.stackConfig].KEY_TABLE_SIZE) {
885
- emberStatus = await this.ezsp.ezspClearKeyTable();
886
- if (emberStatus !== enums_2.EmberStatus.SUCCESS) {
887
- throw new Error(`[INIT FORM] Failed to clear key table with status=${enums_2.EmberStatus[emberStatus]}.`);
888
- }
889
- }
890
- const netParams = {
891
- panId,
892
- extendedPanId,
893
- radioTxPower: 5,
894
- radioChannel,
895
- joinMethod: enums_2.EmberJoinMethod.MAC_ASSOCIATION,
896
- nwkManagerId: consts_2.ZIGBEE_COORDINATOR_ADDRESS,
897
- nwkUpdateId: 0,
898
- channels: consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK,
899
- };
900
- logger_1.logger.info(`[INIT FORM] Forming new network with: ${JSON.stringify(netParams)}`, NS);
901
- emberStatus = (await this.ezsp.ezspFormNetwork(netParams));
902
- if (emberStatus !== enums_2.EmberStatus.SUCCESS) {
903
- throw new Error(`[INIT FORM] Failed form network request with status=${enums_2.EmberStatus[emberStatus]}.`);
904
- }
905
- await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT FORM] Form network');
906
- const stStatus = await this.ezsp.ezspStartWritingStackTokens();
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);
909
- }
910
- /**
911
- * Loads currently stored backup and returns it in internal backup model.
912
- */
913
- async getStoredBackup() {
914
- try {
915
- await mz_1.fs.access(this.backupPath);
916
- }
917
- catch (error) {
918
- return null;
919
- }
920
- let data;
921
- try {
922
- data = JSON.parse((await mz_1.fs.readFile(this.backupPath)).toString());
923
- }
924
- catch (error) {
925
- throw new Error(`[BACKUP] Coordinator backup is corrupted.`);
926
- }
927
- if (data.metadata?.format === "zigpy/open-coordinator-backup" && data.metadata?.version) {
928
- if (data.metadata?.version !== 1) {
929
- throw new Error(`[BACKUP] Unsupported open coordinator backup version (version=${data.metadata?.version}).`);
930
- }
931
- if (!data.stack_specific?.ezsp || !data.metadata.internal.ezspVersion) {
932
- throw new Error(`[BACKUP] Current backup file is not for EmberZNet stack.`);
933
- }
934
- if (data.metadata.internal.ezspVersion < 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}).`);
936
- }
937
- return utils_1.BackupUtils.fromUnifiedBackup(data);
938
- }
939
- else {
940
- throw new Error(`[BACKUP] Unknown backup format.`);
941
- }
942
- }
943
- /**
944
- * Export link keys for backup.
945
- *
946
- * @return List of keys data with AES hashed keys
947
- */
948
- async exportLinkKeys() {
949
- const [confStatus, keyTableSize] = (await this.ezsp.ezspGetConfigurationValue(enums_1.EzspConfigId.KEY_TABLE_SIZE));
950
- if (confStatus !== enums_2.EzspStatus.SUCCESS) {
951
- throw new Error(`[BACKUP] Failed to retrieve key table size from NCP with status=${enums_2.EzspStatus[confStatus]}.`);
952
- }
953
- let deviceEui64;
954
- let plaintextKey;
955
- let apsKeyMeta;
956
- let status;
957
- const keyList = [];
958
- for (let i = 0; i < keyTableSize; i++) {
959
- [deviceEui64, plaintextKey, apsKeyMeta, status] = (await this.ezsp.ezspExportLinkKeyByIndex(i));
960
- logger_1.logger.debug(`[BACKUP] Export link key at index ${i}, status=${enums_2.SLStatus[status]}.`, NS);
961
- // only include key if we could retrieve one at index and hash it properly
962
- if (status === enums_2.SLStatus.OK) {
963
- // Rather than give the real link key, the backup contains a hashed version of the key.
964
- // This is done to prevent a compromise of the backup data from compromising the current link keys.
965
- // This is per the Smart Energy spec.
966
- const [hashStatus, hashedKey] = (await this.emberAesHashSimple(plaintextKey.contents));
967
- if (hashStatus === enums_2.EmberStatus.SUCCESS) {
968
- keyList.push({
969
- deviceEui64,
970
- key: { contents: hashedKey },
971
- outgoingFrameCounter: apsKeyMeta.outgoingFrameCounter,
972
- incomingFrameCounter: apsKeyMeta.incomingFrameCounter,
973
- });
974
- }
975
- else {
976
- // this should never happen?
977
- logger_1.logger.error(`[BACKUP] Failed to hash link key at index ${i} with status=${enums_2.EmberStatus[hashStatus]}. Omitting from backup.`, NS);
978
- }
979
- }
980
- }
981
- logger_1.logger.info(`[BACKUP] Retrieved ${keyList.length} link keys.`, NS);
982
- return keyList;
983
- }
984
- /**
985
- * Import link keys from backup.
986
- *
987
- * @param backupData
988
- */
989
- async importLinkKeys(backupData) {
990
- if (!backupData?.length) {
991
- return;
992
- }
993
- const [confStatus, keyTableSize] = (await this.ezsp.ezspGetConfigurationValue(enums_1.EzspConfigId.KEY_TABLE_SIZE));
994
- if (confStatus !== enums_2.EzspStatus.SUCCESS) {
995
- throw new Error(`[BACKUP] Failed to retrieve key table size from NCP with status=${enums_2.EzspStatus[confStatus]}.`);
996
- }
997
- if (backupData.length > keyTableSize) {
998
- throw new Error(`[BACKUP] Current key table of ${keyTableSize} is too small to import backup of ${backupData.length}!`);
999
- }
1000
- const networkStatus = (await this.emberNetworkState());
1001
- if (networkStatus !== enums_2.EmberNetworkStatus.NO_NETWORK) {
1002
- throw new Error(`[BACKUP] Cannot import TC data while network is up, networkStatus=${enums_2.EmberNetworkStatus[networkStatus]}.`);
1003
- }
1004
- let status;
1005
- for (let i = 0; i < keyTableSize; i++) {
1006
- if (i >= backupData.length) {
1007
- // erase any key index not present in backup but available on the NCP
1008
- status = (await this.ezsp.ezspEraseKeyTableEntry(i));
1009
- }
1010
- else {
1011
- const importStatus = (await this.ezsp.ezspImportLinkKey(i, backupData[i].deviceEui64, backupData[i].key));
1012
- status = ((importStatus === enums_2.SLStatus.OK) ? enums_2.EmberStatus.SUCCESS : enums_2.EmberStatus.KEY_TABLE_INVALID_ADDRESS);
1013
- }
1014
- if (status !== enums_2.EmberStatus.SUCCESS) {
1015
- throw new Error(`[BACKUP] Failed to ${((i >= backupData.length) ? "erase" : "set")} key table entry at index ${i} `
1016
- + `with status=${enums_2.EmberStatus[status]}`);
1017
- }
1018
- }
1019
- logger_1.logger.info(`[BACKUP] Imported ${backupData.length} keys.`, NS);
1020
- }
1021
- /**
1022
- * Routine to update the network key and broadcast the update to the network after a set time.
1023
- * NOTE: This should run at a large interval, but before the uint32_t of the frame counter is able to reach all Fs (can't wrap to 0).
1024
- * This may disrupt sleepy end devices that miss the update, but they should be able to TC rejoin (in most cases...).
1025
- * On the other hand, the more often this runs, the more secure the network is...
1026
- */
1027
- async broadcastNetworkKeyUpdate() {
1028
- return new Promise((resolve, reject) => {
1029
- this.requestQueue.enqueue(async () => {
1030
- logger_1.logger.warning(`[TRUST CENTER] Performing a network key update. This might take a while and disrupt normal operation.`, NS);
1031
- // zero-filled = let stack generate new random network key
1032
- let status = await this.ezsp.ezspBroadcastNextNetworkKey({ contents: Buffer.alloc(consts_1.EMBER_ENCRYPTION_KEY_SIZE) });
1033
- if (status !== enums_2.EmberStatus.SUCCESS) {
1034
- logger_1.logger.error(`[TRUST CENTER] Failed to broadcast next network key with status=${enums_2.EmberStatus[status]}.`, NS);
1035
- return status;
1036
- }
1037
- // XXX: this will block other requests for a while, but should ensure the key propagates without interference?
1038
- // could also stop dispatching entirely and do this outside the queue if necessary/better
1039
- await (0, utils_1.Wait)(BROADCAST_NETWORK_KEY_SWITCH_WAIT_TIME);
1040
- status = (await this.ezsp.ezspBroadcastNetworkKeySwitch());
1041
- if (status !== enums_2.EmberStatus.SUCCESS) {
1042
- // XXX: Not sure how likely this is, but this is bad, probably should hard fail?
1043
- logger_1.logger.error(`[TRUST CENTER] Failed to broadcast network key switch with status=${enums_2.EmberStatus[status]}.`, NS);
1044
- return status;
1045
- }
1046
- resolve();
1047
- return status;
1048
- }, reject);
1049
- });
1050
- }
1051
- /**
1052
- * Received when EZSP layer alerts of a problem that needs the NCP to be reset.
1053
- * @param status
1054
- */
1055
- async onNcpNeedsResetAndInit(status) {
1056
- logger_1.logger.error(`!!! NCP FATAL ERROR reason=${enums_2.EzspStatus[status]}. ATTEMPTING RESET... !!!`, NS);
1057
- try {
1058
- await this.stop();
1059
- await (0, utils_1.Wait)(500); // just because
1060
- await this.start();
1061
- }
1062
- catch (err) {
1063
- logger_1.logger.error(`Failed to reset and init NCP. ${err}`, NS);
1064
- this.emit(events_1.Events.disconnected);
1065
- }
1066
- }
1067
- //---- START Events
1068
- //---- END Events
1069
- //---- START Cache-enabled EZSP wrappers
1070
- /**
1071
- * Clear the cached network values (set to invalid values).
1072
- */
1073
- clearNetworkCache() {
1074
- this.networkCache = (0, initters_1.initNetworkCache)();
1075
- }
1076
- /**
1077
- * Return the current network state.
1078
- * This call caches the results on the host to prevent frequent EZSP transactions.
1079
- * Check against UNKNOWN_NETWORK_STATE for validity.
1080
- */
1081
- async emberNetworkState() {
1082
- if (this.networkCache.status === consts_2.UNKNOWN_NETWORK_STATE) {
1083
- const networkStatus = (await this.ezsp.ezspNetworkState());
1084
- this.networkCache.status = networkStatus;
1085
- }
1086
- return this.networkCache.status;
1087
- }
1088
- /**
1089
- * Return the EUI 64 of the local node
1090
- * This call caches the results on the host to prevent frequent EZSP transactions.
1091
- * Check against BLANK_EUI64 for validity.
1092
- */
1093
- async emberGetEui64() {
1094
- if (this.networkCache.eui64 === consts_2.BLANK_EUI64) {
1095
- this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
1096
- }
1097
- return this.networkCache.eui64;
1098
- }
1099
- /**
1100
- * Return the PAN ID of the local node.
1101
- * This call caches the results on the host to prevent frequent EZSP transactions.
1102
- * Check against INVALID_PAN_ID for validity.
1103
- */
1104
- async emberGetPanId() {
1105
- if (this.networkCache.parameters.panId === consts_2.INVALID_PAN_ID) {
1106
- const [status, , parameters] = (await this.ezsp.ezspGetNetworkParameters());
1107
- if (status === enums_2.EmberStatus.SUCCESS) {
1108
- this.networkCache.parameters = parameters;
1109
- }
1110
- else {
1111
- logger_1.logger.error(`Failed to get PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1112
- }
1113
- }
1114
- return this.networkCache.parameters.panId;
1115
- }
1116
- /**
1117
- * Return the Extended PAN ID of the local node.
1118
- * This call caches the results on the host to prevent frequent EZSP transactions.
1119
- * Check against BLANK_EXTENDED_PAN_ID for validity.
1120
- */
1121
- async emberGetExtendedPanId() {
1122
- if ((0, es6_1.default)(this.networkCache.parameters.extendedPanId, consts_2.BLANK_EXTENDED_PAN_ID)) {
1123
- const [status, , parameters] = (await this.ezsp.ezspGetNetworkParameters());
1124
- if (status === enums_2.EmberStatus.SUCCESS) {
1125
- this.networkCache.parameters = parameters;
1126
- }
1127
- else {
1128
- logger_1.logger.error(`Failed to get Extended PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1129
- }
1130
- }
1131
- return this.networkCache.parameters.extendedPanId;
1132
- }
1133
- /**
1134
- * Return the radio channel (uint8_t) of the current network.
1135
- * This call caches the results on the host to prevent frequent EZSP transactions.
1136
- * Check against INVALID_RADIO_CHANNEL for validity.
1137
- */
1138
- async emberGetRadioChannel() {
1139
- if (this.networkCache.parameters.radioChannel === consts_2.INVALID_RADIO_CHANNEL) {
1140
- const [status, , parameters] = (await this.ezsp.ezspGetNetworkParameters());
1141
- if (status === enums_2.EmberStatus.SUCCESS) {
1142
- this.networkCache.parameters = parameters;
1143
- }
1144
- else {
1145
- logger_1.logger.error(`Failed to get radio channel (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
1146
- }
1147
- }
1148
- return this.networkCache.parameters.radioChannel;
1149
- }
1150
- // queued
1151
- async emberStartEnergyScan() {
1152
- return new Promise((resolve, reject) => {
1153
- this.requestQueue.enqueue(async () => {
1154
- const status = (await this.ezsp.ezspStartScan(enums_2.EzspNetworkScanType.ENERGY_SCAN, consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK, ENERGY_SCAN_DURATION));
1155
- if (status !== enums_2.SLStatus.OK) {
1156
- logger_1.logger.error(`Failed energy scan request with status=${enums_2.SLStatus[status]}.`, NS);
1157
- return enums_2.EmberStatus.ERR_FATAL;
1158
- }
1159
- // TODO: result in logs only atm, since UI doesn't support it
1160
- resolve();
1161
- return enums_2.EmberStatus.SUCCESS;
1162
- }, reject);
1163
- });
1164
- }
1165
- //---- END Cache-enabled EZSP wrappers
1166
- //---- START EZSP wrappers
1167
- /**
1168
- * Ensure the Host & NCP are aligned on protocols using version.
1169
- * Cache the retrieved information.
1170
- *
1171
- * NOTE: currently throws on mismatch until support for lower versions is implemented (not planned atm)
1172
- *
1173
- * Does nothing if ncpNeedsResetAndInit == true.
1174
- */
1175
- async emberVersion() {
1176
- // Note that NCP == Network Co-Processor
1177
- // the EZSP protocol version that the Host is running, we are the host so we set this value
1178
- const hostEzspProtocolVer = consts_1.EZSP_PROTOCOL_VERSION;
1179
- // send the Host version number to the NCP.
1180
- // The NCP returns the EZSP version that the NCP is running along with the stackType and stackVersion
1181
- const [ncpEzspProtocolVer, ncpStackType, ncpStackVer] = (await this.ezsp.ezspVersion(hostEzspProtocolVer));
1182
- // verify that the stack type is what is expected
1183
- if (ncpStackType !== consts_1.EZSP_STACK_TYPE_MESH) {
1184
- throw new Error(`Stack type ${ncpStackType} is not expected!`);
1185
- }
1186
- // verify that the NCP EZSP Protocol version is what is expected
1187
- if (ncpEzspProtocolVer !== consts_1.EZSP_PROTOCOL_VERSION) {
1188
- throw new Error(`NCP EZSP protocol version of ${ncpEzspProtocolVer} does not match Host version ${hostEzspProtocolVer}`);
1189
- }
1190
- logger_1.logger.debug(`NCP info: EZSPVersion=${ncpEzspProtocolVer} StackType=${ncpStackType} StackVersion=${ncpStackVer}`, NS);
1191
- const [status, versionStruct] = (await this.ezsp.ezspGetVersionStruct());
1192
- if (status !== enums_2.EzspStatus.SUCCESS) {
1193
- // Should never happen with support of only EZSP v13+
1194
- throw new Error(`NCP has old-style version number. Not supported.`);
1195
- }
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);
1203
- }
1204
- logger_1.logger.debug(`NCP version info: ${JSON.stringify(this.version)}`, NS);
1205
- }
1206
- /**
1207
- * This function sets an EZSP config value.
1208
- * WARNING: Do not call for values that cannot be set after init without first resetting NCP (like table sizes).
1209
- * To avoid an extra NCP call, this does not check for it.
1210
- * @param configId
1211
- * @param value uint16_t
1212
- * @returns
1213
- */
1214
- async emberSetEzspConfigValue(configId, value) {
1215
- const status = (await this.ezsp.ezspSetConfigurationValue(configId, value));
1216
- logger_1.logger.debug(`[EzspConfigId] SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
1217
- if (status === enums_2.EzspStatus.ERROR_INVALID_ID) {
1218
- // can be ZLL where not all NCPs need or support it.
1219
- logger_1.logger.warning(`[EzspConfigId] Unsupported configuration ID ${enums_1.EzspConfigId[configId]} by NCP.`, NS);
1220
- }
1221
- else if (status !== enums_2.EzspStatus.SUCCESS) {
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);
1224
- }
1225
- return status;
1226
- }
1227
- /**
1228
- * This function sets an EZSP value.
1229
- * @param valueId
1230
- * @param valueLength uint8_t
1231
- * @param value uint8_t *
1232
- * @returns
1233
- */
1234
- async emberSetEzspValue(valueId, valueLength, value) {
1235
- const status = (await this.ezsp.ezspSetValue(valueId, valueLength, value));
1236
- logger_1.logger.debug(`[EzspValueId] SET "${enums_1.EzspValueId[valueId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
1237
- return status;
1238
- }
1239
- /**
1240
- * This function sets an EZSP policy.
1241
- * @param policyId
1242
- * @param decisionId Can be bitop
1243
- * @returns
1244
- */
1245
- async emberSetEzspPolicy(policyId, decisionId) {
1246
- const status = (await this.ezsp.ezspSetPolicy(policyId, decisionId));
1247
- logger_1.logger.debug(`[EzspPolicyId] SET "${enums_1.EzspPolicyId[policyId]}" TO "${decisionId}" with status=${enums_2.EzspStatus[status]}.`, NS);
1248
- return status;
1249
- }
1250
- /**
1251
- * Here we convert the normal Ember AES hash call to the specialized EZSP call.
1252
- * This came about because we cannot pass a block of data that is
1253
- * both input and output into EZSP. The block must be broken up into two
1254
- * elements. We unify the two pieces here to make it invisible to the users.
1255
- * @param context EmberAesMmoHashContext *
1256
- * @param finalize
1257
- * @param data uint8_t * Expected of valid length (as in, not larger alloc)
1258
- * @returns status
1259
- * @returns result context or null
1260
- */
1261
- async aesMmoHash(context, finalize, data) {
1262
- if (data.length > 255) {
1263
- throw new Error(enums_2.EzspStatus[enums_2.EzspStatus.ERROR_INVALID_CALL]);
1264
- }
1265
- const [status, reContext] = (await this.ezsp.ezspAesMmoHash(context, finalize, data));
1266
- return [status, reContext];
1267
- }
1268
- /**
1269
- * This routine processes the passed chunk of data and updates
1270
- * the hash calculation based on it. The data passed in MUST
1271
- * have a length that is a multiple of 16.
1272
- *
1273
- * @param context EmberAesMmoHashContext* A pointer to the location of the hash context to update.
1274
- * @param data const uint8_t* A pointer to the location of the data to hash.
1275
- *
1276
- * @returns An ::EmberStatus value indicating EMBER_SUCCESS if the hash was
1277
- * calculated successfully. EMBER_INVALID_CALL if the block size is not a
1278
- * multiple of 16 bytes, and EMBER_INDEX_OUT_OF_RANGE is returned when the
1279
- * data exceeds the maximum limits of the hash function.
1280
- * @returns result context or null
1281
- */
1282
- async emberAesMmoHashUpdate(context, data) {
1283
- return this.aesMmoHash(context, false /*finalize?*/, data);
1284
- }
1285
- /**
1286
- * This routine processes the passed chunk of data (if non-NULL)
1287
- * and update the hash context that is passed in. In then performs
1288
- * the final calculations on the hash and returns the final answer
1289
- * in the result parameter of the ::EmberAesMmoHashContext structure.
1290
- * The length of the data passed in may be any value, it does not have
1291
- * to be a multiple of 16.
1292
- *
1293
- * @param context EmberAesMmoHashContext * A pointer to the location of the hash context to finalize.
1294
- * @param data uint8_t * A pointer to the location of data to hash. May be NULL.
1295
- *
1296
- * @returns An ::EmberStatus value indicating EMBER_SUCCESS if the hash was
1297
- * calculated successfully. EMBER_INVALID_CALL if the block size is not a
1298
- * multiple of 16 bytes, and EMBER_INDEX_OUT_OF_RANGE is returned when the
1299
- * data exceeds the maximum limits of the hash function.
1300
- * @returns result context or null
1301
- */
1302
- async emberAesMmoHashFinal(context, data) {
1303
- return this.aesMmoHash(context, true /*finalize?*/, data);
1304
- }
1305
- /**
1306
- * This is a convenience method when the hash data is less than 255
1307
- * bytes. It inits, updates, and finalizes the hash in one function call.
1308
- *
1309
- * @param data const uint8_t* The data to hash. Expected of valid length (as in, not larger alloc)
1310
- *
1311
- * @returns An ::EmberStatus value indicating EMBER_SUCCESS if the hash was
1312
- * calculated successfully. EMBER_INVALID_CALL if the block size is not a
1313
- * multiple of 16 bytes, and EMBER_INDEX_OUT_OF_RANGE is returned when the
1314
- * data exceeds the maximum limits of the hash function.
1315
- * @returns result uint8_t* The location where the result of the hash will be written.
1316
- */
1317
- async emberAesHashSimple(data) {
1318
- const context = (0, initters_1.aesMmoHashInit)();
1319
- const [status, reContext] = (await this.emberAesMmoHashFinal(context, data));
1320
- return [status, reContext?.result];
1321
- }
1322
- /**
1323
- * Enable local permit join and optionally broadcast the ZDO Mgmt_Permit_Join_req message.
1324
- * This API can be called from any device type and still return EMBER_SUCCESS.
1325
- * If the API is called from an end device, the permit association bit will just be left off.
1326
- *
1327
- * @param duration uint8_t The duration that the permit join bit will remain on
1328
- * and other devices will be able to join the current network.
1329
- * @param broadcastMgmtPermitJoin whether or not to broadcast the ZDO Mgmt_Permit_Join_req message.
1330
- *
1331
- * @returns status of whether or not permit join was enabled.
1332
- * @returns apsFrame Will be null if not broadcasting.
1333
- * @returns messageTag The tag passed to ezspSend${x} function.
1334
- */
1335
- async emberPermitJoining(duration, broadcastMgmtPermitJoin) {
1336
- let status = (await this.ezsp.ezspPermitJoining(duration));
1337
- let apsFrame = null;
1338
- let messageTag = null;
1339
- logger_1.logger.debug(`Permit joining for ${duration} sec. status=${[status]}`, NS);
1340
- if (broadcastMgmtPermitJoin) {
1341
- // `authentication`: TC significance always 1 (zb specs)
1342
- [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(consts_2.EMBER_BROADCAST_ADDRESS, duration, 1, DEFAULT_APS_OPTIONS));
1343
- }
1344
- return [status, apsFrame, messageTag];
1345
- }
1346
- /**
1347
- * Set the trust center policy bitmask using decision.
1348
- * @param decision
1349
- * @returns
1350
- */
1351
- async emberSetJoinPolicy(decision) {
1352
- let policy = enums_1.EzspDecisionBitmask.DEFAULT_CONFIGURATION;
1353
- if (decision == enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY) {
1354
- policy = (enums_1.EzspDecisionBitmask.ALLOW_JOINS | enums_1.EzspDecisionBitmask.ALLOW_UNSECURED_REJOINS);
1355
- }
1356
- else if (decision == enums_2.EmberJoinDecision.SEND_KEY_IN_THE_CLEAR) {
1357
- policy = (enums_1.EzspDecisionBitmask.ALLOW_JOINS | enums_1.EzspDecisionBitmask.ALLOW_UNSECURED_REJOINS | enums_1.EzspDecisionBitmask.SEND_KEY_IN_CLEAR);
1358
- }
1359
- else if (decision == enums_2.EmberJoinDecision.ALLOW_REJOINS_ONLY) {
1360
- policy = enums_1.EzspDecisionBitmask.ALLOW_UNSECURED_REJOINS;
1361
- }
1362
- return this.emberSetEzspPolicy(enums_1.EzspPolicyId.TRUST_CENTER_POLICY, policy);
1363
- }
1364
- /**
1365
- * Get Source Route Overhead
1366
- *
1367
- * Returns the number of bytes needed in a packet for source routing.
1368
- * Since each hop consumes 2 bytes in the packet, this routine calculates the
1369
- * total number of bytes needed based on number of hops to reach the destination.
1370
- *
1371
- * This function is called by the framework to determine the overhead required
1372
- * in the network frame for source routing to a particular destination.
1373
- *
1374
- * @param destination The node id of the destination Ver.: always
1375
- * @returns int8u The number of bytes needed for source routing in a packet.
1376
- */
1377
- async emberGetSourceRouteOverhead(destination) {
1378
- const [status, value] = (await this.ezsp.ezspGetSourceRouteOverhead(destination));
1379
- if (status === enums_2.EzspStatus.SUCCESS) {
1380
- return value;
1381
- }
1382
- else {
1383
- logger_1.logger.debug(`Failed to get source route overhead (via extended value), status=${enums_2.EzspStatus[status]}.`, NS);
1384
- }
1385
- return 0;
1386
- }
1387
- /**
1388
- * Return the maximum size of the payload that the Application Support sub-layer will accept for
1389
- * the given message type, destination, and APS frame.
1390
- *
1391
- * The size depends on multiple factors, including the security level in use and additional information
1392
- * added to the message to support the various options.
1393
- *
1394
- * @param type The outgoing message type.
1395
- * @param indexOrDestination uint16_t Depending on the message type, this is either the
1396
- * EmberNodeId of the destination, an index into the address table, an index
1397
- * into the binding table, the multicast identifier, or a broadcast address.
1398
- * @param apsFrame EmberApsFrame *The APS frame for the message.
1399
- * @return uint8_t The maximum APS payload length for the given message.
1400
- */
1401
- async maximumApsPayloadLength(type, indexOrDestination, apsFrame) {
1402
- let destination = consts_2.EMBER_UNKNOWN_NODE_ID;
1403
- let max = consts_2.MAXIMUM_APS_PAYLOAD_LENGTH; // uint8_t
1404
- if ((apsFrame.options & enums_2.EmberApsOption.ENCRYPTION) !== 0) {
1405
- max -= consts_2.APS_ENCRYPTION_OVERHEAD;
1406
- }
1407
- if ((apsFrame.options & enums_2.EmberApsOption.SOURCE_EUI64) !== 0) {
1408
- max -= consts_1.EUI64_SIZE;
1409
- }
1410
- if ((apsFrame.options & enums_2.EmberApsOption.DESTINATION_EUI64) !== 0) {
1411
- max -= consts_1.EUI64_SIZE;
1412
- }
1413
- if ((apsFrame.options & enums_2.EmberApsOption.FRAGMENT) !== 0) {
1414
- max -= consts_2.APS_FRAGMENTATION_OVERHEAD;
1415
- }
1416
- switch (type) {
1417
- case enums_2.EmberOutgoingMessageType.DIRECT:
1418
- destination = indexOrDestination;
1419
- break;
1420
- case enums_2.EmberOutgoingMessageType.VIA_ADDRESS_TABLE:
1421
- destination = (await this.ezsp.ezspGetAddressTableRemoteNodeId(indexOrDestination));
1422
- break;
1423
- case enums_2.EmberOutgoingMessageType.VIA_BINDING:
1424
- destination = (await this.ezsp.ezspGetBindingRemoteNodeId(indexOrDestination));
1425
- break;
1426
- case enums_2.EmberOutgoingMessageType.MULTICAST:
1427
- // APS multicast messages include the two-byte group id and exclude the one-byte destination endpoint,
1428
- // for a net loss of an extra byte.
1429
- max--;
1430
- break;
1431
- case enums_2.EmberOutgoingMessageType.BROADCAST:
1432
- break;
1433
- default:
1434
- break;
1435
- }
1436
- max -= (await this.emberGetSourceRouteOverhead(destination));
1437
- return max;
1438
- }
1439
- //---- END EZSP wrappers
1440
- //---- START Ember ZDO
1441
- /**
1442
- * ZDO
1443
- * Change the default radius for broadcast ZDO requests
1444
- *
1445
- * @param radius uint8_t The radius to be used for future ZDO request broadcasts.
1446
- */
1447
- setZDORequestRadius(radius) {
1448
- this.zdoRequestRadius = radius;
1449
- }
1450
- /**
1451
- * ZDO
1452
- * Retrieve the default radius for broadcast ZDO requests
1453
- *
1454
- * @return uint8_t The radius to be used for future ZDO request broadcasts.
1455
- */
1456
- getZDORequestRadius() {
1457
- return this.zdoRequestRadius;
1458
- }
1459
- /**
1460
- * ZDO
1461
- * Get the next device request sequence number.
1462
- *
1463
- * Requests have sequence numbers so that they can be matched up with the
1464
- * responses. To avoid complexities, the library uses numbers with the high
1465
- * bit clear and the stack uses numbers with the high bit set.
1466
- *
1467
- * @return uint8_t The next device request sequence number
1468
- */
1469
- nextZDORequestSequence() {
1470
- return (this.zdoRequestSequence = ((++this.zdoRequestSequence) & APPLICATION_ZDO_SEQUENCE_MASK));
1471
- }
1472
- /**
1473
- * ZDO
1474
- *
1475
- * @param destination
1476
- * @param clusterId uint16_t
1477
- * @param options
1478
- * @param length uint8_t
1479
- * @returns status Indicates success or failure (with reason) of send
1480
- * @returns apsFrame The APS Frame resulting of the request being built and sent (`sequence` set from stack-given value).
1481
- * @returns messageTag The tag passed to ezspSend${x} function.
1482
- */
1483
- async sendZDORequestBuffer(destination, clusterId, options) {
1484
- if (this.zdoRequestBuffalo.getPosition() > consts_1.EZSP_MAX_FRAME_LENGTH) {
1485
- return [enums_2.EmberStatus.MESSAGE_TOO_LONG, null, null];
1486
- }
1487
- const messageTag = this.nextZDORequestSequence();
1488
- this.zdoRequestBuffalo.setCommandByte(0, messageTag);
1489
- const apsFrame = {
1490
- profileId: zdo_1.ZDO_PROFILE_ID,
1491
- clusterId: clusterId,
1492
- sourceEndpoint: zdo_1.ZDO_ENDPOINT,
1493
- destinationEndpoint: zdo_1.ZDO_ENDPOINT,
1494
- options: options,
1495
- groupId: 0,
1496
- sequence: 0, // set by stack
1497
- };
1498
- const messageContents = this.zdoRequestBuffalo.getWritten();
1499
- if (destination === consts_2.EMBER_BROADCAST_ADDRESS || destination === consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS
1500
- || destination === consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS) {
1501
- logger_1.logger.debug(`~~~> [ZDO BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
1502
- const [status, apsSequence] = (await this.ezsp.ezspSendBroadcast(destination, apsFrame, this.getZDORequestRadius(), messageTag, messageContents));
1503
- apsFrame.sequence = apsSequence;
1504
- logger_1.logger.debug(`~~~> [SENT ZDO type=BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
1505
- return [status, apsFrame, messageTag];
1506
- }
1507
- else {
1508
- logger_1.logger.debug(`~~~> [ZDO UNICAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
1509
- const [status, apsSequence] = (await this.ezsp.ezspSendUnicast(enums_2.EmberOutgoingMessageType.DIRECT, destination, apsFrame, messageTag, messageContents));
1510
- apsFrame.sequence = apsSequence;
1511
- logger_1.logger.debug(`~~~> [SENT ZDO type=DIRECT apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
1512
- return [status, apsFrame, messageTag];
1513
- }
1514
- }
1515
- /**
1516
- * ZDO
1517
- * Service Discovery Functions
1518
- * Request the specified node to send a list of its endpoints that
1519
- * match the specified application profile and, optionally, lists of input
1520
- * and/or output clusters.
1521
- * @param target The node whose matching endpoints are desired. The request can
1522
- * be sent unicast or broadcast ONLY to the "RX-on-when-idle-address" (0xFFFD)
1523
- * If sent as a broadcast, any node that has matching endpoints will send a
1524
- * response.
1525
- * @param profile uint16_t The application profile to match.
1526
- * @param inCount uint8_t The number of input clusters. To not match any input
1527
- * clusters, set this value to 0.
1528
- * @param outCount uint8_t The number of output clusters. To not match any output
1529
- * clusters, set this value to 0.
1530
- * @param inClusters uint16_t * The list of input clusters.
1531
- * @param outClusters uint16_t * The list of output clusters.
1532
- * @param options The options to use when sending the unicast request. See
1533
- * emberSendUnicast() for a description. This parameter is ignored if the target
1534
- * is a broadcast address.
1535
- * @returns An EmberStatus value. EMBER_SUCCESS, MESSAGE_TOO_LONG,
1536
- * EMBER_NETWORK_DOWN or EMBER_NETWORK_BUSY.
1537
- */
1538
- async emberMatchDescriptorsRequest(target, profile, inClusters, outClusters, options) {
1539
- // 2 bytes for NWK Address + 2 bytes for Profile Id + 1 byte for in Cluster Count
1540
- // + in times 2 for 2 byte Clusters + out Cluster Count + out times 2 for 2 byte Clusters
1541
- const length = (zdo_1.ZDO_MESSAGE_OVERHEAD + 2 + 2 + 1 + (inClusters.length * 2) + 1 + (outClusters.length * 2));
1542
- // sanity check
1543
- if (length > consts_1.EZSP_MAX_FRAME_LENGTH) {
1544
- return [enums_2.EmberStatus.MESSAGE_TOO_LONG, null, null];
1545
- }
1546
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1547
- this.zdoRequestBuffalo.writeUInt16(target);
1548
- this.zdoRequestBuffalo.writeUInt16(profile);
1549
- this.zdoRequestBuffalo.writeUInt8(inClusters.length);
1550
- this.zdoRequestBuffalo.writeListUInt16(inClusters);
1551
- this.zdoRequestBuffalo.writeUInt8(outClusters.length);
1552
- this.zdoRequestBuffalo.writeListUInt16(outClusters);
1553
- logger_1.logger.debug(`~~~> [ZDO MATCH_DESCRIPTORS_REQUEST target=${target} profile=${profile} inClusters=${inClusters} outClusters=${outClusters}]`, NS);
1554
- return this.sendZDORequestBuffer(target, zdo_1.MATCH_DESCRIPTORS_REQUEST, options);
1555
- }
1556
- /**
1557
- * ZDO
1558
- * Device Discovery Functions
1559
- * Request the 16 bit network address of a node whose EUI64 is known.
1560
- *
1561
- * @param target The EUI64 of the node.
1562
- * @param reportKids true to request that the target list their children
1563
- * in the response.
1564
- * @param childStartIndex uint8_t The index of the first child to list in the response.
1565
- * Ignored if @c reportKids is false.
1566
- *
1567
- * @return An ::EmberStatus value.
1568
- * - ::EMBER_SUCCESS - The request was transmitted successfully.
1569
- * - ::EMBER_NO_BUFFERS - Insufficient message buffers were available to construct the request.
1570
- * - ::EMBER_NETWORK_DOWN - The node is not part of a network.
1571
- * - ::EMBER_NETWORK_BUSY - Transmission of the request failed.
1572
- */
1573
- async emberNetworkAddressRequest(target, reportKids, childStartIndex) {
1574
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1575
- this.zdoRequestBuffalo.writeIeeeAddr(target);
1576
- this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1577
- this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1578
- logger_1.logger.debug(`~~~> [ZDO NETWORK_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1579
- return this.sendZDORequestBuffer(consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS, zdo_1.NETWORK_ADDRESS_REQUEST, enums_2.EmberApsOption.SOURCE_EUI64);
1580
- }
1581
- /**
1582
- * ZDO
1583
- * Device Discovery Functions
1584
- * @brief Request the EUI64 of a node whose 16 bit network address is known.
1585
- *
1586
- * @param target uint16_t The network address of the node.
1587
- * @param reportKids uint8_t true to request that the target list their children
1588
- * in the response.
1589
- * @param childStartIndex uint8_t The index of the first child to list in the response.
1590
- * Ignored if reportKids is false.
1591
- * @param options The options to use when sending the request. See ::emberSendUnicast() for a description.
1592
- *
1593
- * @return An ::EmberStatus value.
1594
- * - ::EMBER_SUCCESS
1595
- * - ::EMBER_NO_BUFFERS
1596
- * - ::EMBER_NETWORK_DOWN
1597
- * - ::EMBER_NETWORK_BUSY
1598
- */
1599
- async emberIeeeAddressRequest(target, reportKids, childStartIndex, options) {
1600
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1601
- this.zdoRequestBuffalo.writeUInt16(target);
1602
- this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1603
- this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1604
- logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1605
- return this.sendZDORequestBuffer(target, zdo_1.IEEE_ADDRESS_REQUEST, options);
1606
- }
1607
- /**
1608
- * ZDO
1609
- * @param discoveryNodeId uint16_t
1610
- * @param reportKids uint8_t
1611
- * @param childStartIndex uint8_t
1612
- * @param options
1613
- * @param targetNodeIdOfRequest
1614
- */
1615
- async emberIeeeAddressRequestToTarget(discoveryNodeId, reportKids, childStartIndex, options, targetNodeIdOfRequest) {
1616
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1617
- this.zdoRequestBuffalo.writeUInt16(discoveryNodeId);
1618
- this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
1619
- this.zdoRequestBuffalo.writeUInt8(childStartIndex);
1620
- logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST targetNodeIdOfRequest=${targetNodeIdOfRequest} discoveryNodeId=${discoveryNodeId} `
1621
- + `reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
1622
- return this.sendZDORequestBuffer(targetNodeIdOfRequest, zdo_1.IEEE_ADDRESS_REQUEST, options);
1623
- }
1624
- /**
1625
- * ZDO
1626
- *
1627
- * @param target uint16_t
1628
- * @param clusterId uint16_t
1629
- * @param options
1630
- * @returns
1631
- */
1632
- async emberSendZigDevRequestTarget(target, clusterId, options) {
1633
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1634
- this.zdoRequestBuffalo.writeUInt16(target);
1635
- return this.sendZDORequestBuffer(target, clusterId, options);
1636
- }
1637
- /**
1638
- * ZDO
1639
- * @brief Request the specified node to send the simple descriptor for
1640
- * the specified endpoint.
1641
- * The simple descriptor contains information specific
1642
- * to a single endpoint. It describes the application profile identifier,
1643
- * application device identifier, application device version, application flags,
1644
- * application input clusters and application output clusters. It is defined in
1645
- * the ZigBee Application Framework Specification.
1646
- *
1647
- * @param target uint16_t The node of interest.
1648
- * @param targetEndpoint uint8_t The endpoint on the target node whose simple
1649
- * descriptor is desired.
1650
- * @param options The options to use when sending the request. See
1651
- * emberSendUnicast() for a description.
1652
- *
1653
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1654
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1655
- */
1656
- async emberSimpleDescriptorRequest(target, targetEndpoint, options) {
1657
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1658
- this.zdoRequestBuffalo.writeUInt16(target);
1659
- this.zdoRequestBuffalo.writeUInt8(targetEndpoint);
1660
- logger_1.logger.debug(`~~~> [ZDO SIMPLE_DESCRIPTOR_REQUEST target=${target} targetEndpoint=${targetEndpoint}]`, NS);
1661
- return this.sendZDORequestBuffer(target, zdo_1.SIMPLE_DESCRIPTOR_REQUEST, options);
1662
- }
1663
- /**
1664
- * ZDO
1665
- * Common logic used by `emberBindRequest` & `emberUnbindRequest`.
1666
- *
1667
- * @param target
1668
- * @param bindClusterId
1669
- * @param source
1670
- * @param sourceEndpoint
1671
- * @param clusterId
1672
- * @param type
1673
- * @param destination
1674
- * @param groupAddress
1675
- * @param destinationEndpoint
1676
- * @param options
1677
- *
1678
- * @returns An ::EmberStatus value.
1679
- * - ::EMBER_SUCCESS
1680
- * - ::EMBER_NO_BUFFERS
1681
- * - ::EMBER_NETWORK_DOWN
1682
- * - ::EMBER_NETWORK_BUSY
1683
- * @returns APS frame created for the request
1684
- * @returns The tag used on the message.
1685
- */
1686
- async emberSendZigDevBindRequest(target, bindClusterId, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
1687
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1688
- this.zdoRequestBuffalo.writeIeeeAddr(source);
1689
- this.zdoRequestBuffalo.writeUInt8(sourceEndpoint);
1690
- this.zdoRequestBuffalo.writeUInt16(clusterId);
1691
- this.zdoRequestBuffalo.writeUInt8(type);
1692
- switch (type) {
1693
- case zdo_1.UNICAST_BINDING:
1694
- this.zdoRequestBuffalo.writeIeeeAddr(destination);
1695
- this.zdoRequestBuffalo.writeUInt8(destinationEndpoint);
1696
- break;
1697
- case zdo_1.MULTICAST_BINDING:
1698
- this.zdoRequestBuffalo.writeUInt16(groupAddress);
1699
- break;
1700
- default:
1701
- return [enums_2.EmberStatus.ERR_FATAL, null, null];
1702
- }
1703
- return this.sendZDORequestBuffer(target, bindClusterId, options);
1704
- }
1705
- /**
1706
- * ZDO
1707
- * Send a request to create a binding entry with the specified
1708
- * contents on the specified node.
1709
- *
1710
- * @param target The node on which the binding will be created.
1711
- * @param source The source EUI64 in the binding entry.
1712
- * @param sourceEndpoint The source endpoint in the binding entry.
1713
- * @param clusterId The cluster ID in the binding entry.
1714
- * @param type The type of binding, either ::UNICAST_BINDING,
1715
- * ::MULTICAST_BINDING, or ::UNICAST_MANY_TO_ONE_BINDING.
1716
- * ::UNICAST_MANY_TO_ONE_BINDING is an Ember-specific extension
1717
- * and should be used only when the target is an Ember device.
1718
- * @param destination The destination EUI64 in the binding entry for
1719
- * ::UNICAST_BINDING or ::UNICAST_MANY_TO_ONE_BINDING.
1720
- * @param groupAddress The group address for the ::MULTICAST_BINDING.
1721
- * @param destinationEndpoint The destination endpoint in the binding entry for
1722
- * the ::UNICAST_BINDING or ::UNICAST_MANY_TO_ONE_BINDING.
1723
- * @param options The options to use when sending the request. See
1724
- * emberSendUnicast() for a description.
1725
- *
1726
- * @returns An ::EmberStatus value.
1727
- * - ::EMBER_SUCCESS
1728
- * - ::EMBER_NO_BUFFERS
1729
- * - ::EMBER_NETWORK_DOWN
1730
- * - ::EMBER_NETWORK_BUSY
1731
- * @returns APS frame created for the request
1732
- * @returns The tag used on the message.
1733
- */
1734
- async emberBindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
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);
1737
- return this.emberSendZigDevBindRequest(target, zdo_1.BIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
1738
- }
1739
- /**
1740
- * ZDO
1741
- * Send a request to remove a binding entry with the specified
1742
- * contents from the specified node.
1743
- *
1744
- * @param target The node on which the binding will be removed.
1745
- * @param source The source EUI64 in the binding entry.
1746
- * @param sourceEndpoint uint8_t The source endpoint in the binding entry.
1747
- * @param clusterId uint16_t The cluster ID in the binding entry.
1748
- * @param type uint8_t The type of binding, either ::UNICAST_BINDING,
1749
- * ::MULTICAST_BINDING, or ::UNICAST_MANY_TO_ONE_BINDING.
1750
- * ::UNICAST_MANY_TO_ONE_BINDING is an Ember-specific extension
1751
- * and should be used only when the target is an Ember device.
1752
- * @param destination The destination EUI64 in the binding entry for the
1753
- * ::UNICAST_BINDING or ::UNICAST_MANY_TO_ONE_BINDING.
1754
- * @param groupAddress The group address for the ::MULTICAST_BINDING.
1755
- * @param destinationEndpoint uint8_t The destination endpoint in the binding entry for
1756
- * the ::UNICAST_BINDING or ::UNICAST_MANY_TO_ONE_BINDING.
1757
- * @param options The options to use when sending the request. See
1758
- * emberSendUnicast() for a description.
1759
- *
1760
- * @returns An ::EmberStatus value.
1761
- * - ::EMBER_SUCCESS
1762
- * - ::EMBER_NO_BUFFERS
1763
- * - ::EMBER_NETWORK_DOWN
1764
- * - ::EMBER_NETWORK_BUSY
1765
- * @returns APS frame created for the request
1766
- * @returns The tag used on the message.
1767
- */
1768
- async emberUnbindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
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);
1771
- return this.emberSendZigDevBindRequest(target, zdo_1.UNBIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
1772
- }
1773
- /**
1774
- * ZDO
1775
- * Request the specified node to send a list of its active
1776
- * endpoints. An active endpoint is one for which a simple descriptor is
1777
- * available.
1778
- *
1779
- * @param target The node whose active endpoints are desired.
1780
- * @param options The options to use when sending the request. See
1781
- * emberSendUnicast() for a description.
1782
- *
1783
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1784
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1785
- */
1786
- async emberActiveEndpointsRequest(target, options) {
1787
- logger_1.logger.debug(`~~~> [ZDO ACTIVE_ENDPOINTS_REQUEST target=${target}]`, NS);
1788
- return this.emberSendZigDevRequestTarget(target, zdo_1.ACTIVE_ENDPOINTS_REQUEST, options);
1789
- }
1790
- /**
1791
- * ZDO
1792
- * Request the specified node to send its power descriptor.
1793
- * The power descriptor gives a dynamic indication of the power
1794
- * status of the node. It describes current power mode,
1795
- * available power sources, current power source and
1796
- * current power source level. It is defined in the ZigBee
1797
- * Application Framework Specification.
1798
- *
1799
- * @param target The node whose power descriptor is desired.
1800
- * @param options The options to use when sending the request. See
1801
- * emberSendUnicast() for a description.
1802
- *
1803
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1804
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1805
- */
1806
- async emberPowerDescriptorRequest(target, options) {
1807
- logger_1.logger.debug(`~~~> [ZDO POWER_DESCRIPTOR_REQUEST target=${target}]`, NS);
1808
- return this.emberSendZigDevRequestTarget(target, zdo_1.POWER_DESCRIPTOR_REQUEST, options);
1809
- }
1810
- /**
1811
- * ZDO
1812
- * Request the specified node to send its node descriptor.
1813
- * The node descriptor contains information about the capabilities of the ZigBee
1814
- * node. It describes logical type, APS flags, frequency band, MAC capabilities
1815
- * flags, manufacturer code and maximum buffer size. It is defined in the ZigBee
1816
- * Application Framework Specification.
1817
- *
1818
- * @param target The node whose node descriptor is desired.
1819
- * @param options The options to use when sending the request. See
1820
- * emberSendUnicast() for a description.
1821
- *
1822
- * @return An ::EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1823
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1824
- */
1825
- async emberNodeDescriptorRequest(target, options) {
1826
- logger_1.logger.debug(`~~~> [ZDO NODE_DESCRIPTOR_REQUEST target=${target}]`, NS);
1827
- return this.emberSendZigDevRequestTarget(target, zdo_1.NODE_DESCRIPTOR_REQUEST, options);
1828
- }
1829
- /**
1830
- * ZDO
1831
- * Request the specified node to send its LQI (neighbor) table.
1832
- * The response gives PAN ID, EUI64, node ID and cost for each neighbor. The
1833
- * EUI64 is only available if security is enabled. The other fields in the
1834
- * response are set to zero. The response format is defined in the ZigBee Device
1835
- * Profile Specification.
1836
- *
1837
- * @param target The node whose LQI table is desired.
1838
- * @param startIndex uint8_t The index of the first neighbor to include in the
1839
- * response.
1840
- * @param options The options to use when sending the request. See
1841
- * emberSendUnicast() for a description.
1842
- *
1843
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1844
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1845
- */
1846
- async emberLqiTableRequest(target, startIndex, options) {
1847
- logger_1.logger.debug(`~~~> [ZDO LQI_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1848
- return this.emberTableRequest(zdo_1.LQI_TABLE_REQUEST, target, startIndex, options);
1849
- }
1850
- /**
1851
- * ZDO
1852
- * Request the specified node to send its routing table.
1853
- * The response gives destination node ID, status and many-to-one flags,
1854
- * and the next hop node ID.
1855
- * The response format is defined in the ZigBee Device
1856
- * Profile Specification.
1857
- *
1858
- * @param target The node whose routing table is desired.
1859
- * @param startIndex uint8_t The index of the first route entry to include in the
1860
- * response.
1861
- * @param options The options to use when sending the request. See
1862
- * emberSendUnicast() for a description.
1863
- *
1864
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1865
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1866
- */
1867
- async emberRoutingTableRequest(target, startIndex, options) {
1868
- logger_1.logger.debug(`~~~> [ZDO ROUTING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1869
- return this.emberTableRequest(zdo_1.ROUTING_TABLE_REQUEST, target, startIndex, options);
1870
- }
1871
- /**
1872
- * ZDO
1873
- * Request the specified node to send its nonvolatile bindings.
1874
- * The response gives source address, source endpoint, cluster ID, destination
1875
- * address and destination endpoint for each binding entry. The response format
1876
- * is defined in the ZigBee Device Profile Specification.
1877
- * Note that bindings that have the Ember-specific ::UNICAST_MANY_TO_ONE_BINDING
1878
- * type are reported as having the standard ::UNICAST_BINDING type.
1879
- *
1880
- * @param target The node whose binding table is desired.
1881
- * @param startIndex uint8_t The index of the first binding entry to include in the
1882
- * response.
1883
- * @param options The options to use when sending the request. See
1884
- * emberSendUnicast() for a description.
1885
- *
1886
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1887
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1888
- */
1889
- async emberBindingTableRequest(target, startIndex, options) {
1890
- logger_1.logger.debug(`~~~> [ZDO BINDING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
1891
- return this.emberTableRequest(zdo_1.BINDING_TABLE_REQUEST, target, startIndex, options);
1892
- }
1893
- /**
1894
- * ZDO
1895
- *
1896
- * @param clusterId uint16_t
1897
- * @param target
1898
- * @param startIndex uint8_t
1899
- * @param options
1900
- * @returns
1901
- */
1902
- async emberTableRequest(clusterId, target, startIndex, options) {
1903
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1904
- this.zdoRequestBuffalo.writeUInt8(startIndex);
1905
- return this.sendZDORequestBuffer(target, clusterId, options);
1906
- }
1907
- /**
1908
- * ZDO
1909
- * Request the specified node to remove the specified device from
1910
- * the network. The device to be removed must be the node to which the request
1911
- * is sent or one of its children.
1912
- *
1913
- * @param target The node which will remove the device.
1914
- * @param deviceAddress All zeros if the target is to remove itself from
1915
- * the network or the EUI64 of a child of the target device to remove
1916
- * that child.
1917
- * @param leaveRequestFlags uint8_t A bitmask of leave options.
1918
- * Include ::AND_REJOIN if the target is to rejoin the network immediately after leaving.
1919
- * @param options The options to use when sending the request. See
1920
- * emberSendUnicast() for a description.
1921
- *
1922
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1923
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1924
- */
1925
- async emberLeaveRequest(target, deviceAddress, leaveRequestFlags, options) {
1926
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1927
- this.zdoRequestBuffalo.writeIeeeAddr(deviceAddress);
1928
- this.zdoRequestBuffalo.writeUInt8(leaveRequestFlags);
1929
- logger_1.logger.debug(`~~~> [ZDO LEAVE_REQUEST target=${target} deviceAddress=${deviceAddress} leaveRequestFlags=${leaveRequestFlags}]`, NS);
1930
- return this.sendZDORequestBuffer(target, zdo_1.LEAVE_REQUEST, options);
1931
- }
1932
- /**
1933
- * ZDO
1934
- * Request the specified node to allow or disallow association.
1935
- *
1936
- * @param target The node which will allow or disallow association. The request
1937
- * can be broadcast by using a broadcast address (0xFFFC/0xFFFD/0xFFFF). No
1938
- * response is sent if the request is broadcast.
1939
- * @param duration uint8_t A value of 0x00 disables joining. A value of 0xFF enables
1940
- * joining. Any other value enables joining for that number of seconds.
1941
- * @param authentication uint8_t Controls Trust Center authentication behavior.
1942
- * @param options The options to use when sending the request. See
1943
- * emberSendUnicast() for a description. This parameter is ignored if the target
1944
- * is a broadcast address.
1945
- *
1946
- * @return An EmberStatus value. ::EMBER_SUCCESS, ::EMBER_NO_BUFFERS,
1947
- * ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
1948
- */
1949
- async emberPermitJoiningRequest(target, duration, authentication, options) {
1950
- this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
1951
- this.zdoRequestBuffalo.writeUInt8(duration);
1952
- this.zdoRequestBuffalo.writeUInt8(authentication);
1953
- logger_1.logger.debug(`~~~> [ZDO PERMIT_JOINING_REQUEST target=${target} duration=${duration} authentication=${authentication}]`, NS);
1954
- return this.sendZDORequestBuffer(target, zdo_1.PERMIT_JOINING_REQUEST, options);
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
- }
1989
- //---- END Ember ZDO
1990
- //-- START Adapter implementation
1991
- static async isValidPath(path) {
1992
- // For TCP paths we cannot get device information, therefore we cannot validate it.
1993
- if (socketPortUtils_1.default.isTcpPath(path)) {
1994
- return false;
1995
- }
1996
- try {
1997
- return serialPortUtils_1.default.is((0, utils_1.RealpathSync)(path), autoDetectDefinitions);
1998
- }
1999
- catch (error) {
2000
- logger_1.logger.debug(`Failed to determine if path is valid: '${error}'`, NS);
2001
- return false;
2002
- }
2003
- }
2004
- static async autoDetectPath() {
2005
- const paths = await serialPortUtils_1.default.find(autoDetectDefinitions);
2006
- paths.sort((a, b) => (a < b) ? -1 : 1);
2007
- return paths.length > 0 ? paths[0] : null;
2008
- }
2009
- async start() {
2010
- logger_1.logger.info(`======== Ember Adapter Starting ========`, NS);
2011
- this.initVariables();
2012
- logger_1.logger.debug(`Starting EZSP with stack configuration: "${this.stackConfig}".`, NS);
2013
- const result = await this.initEzsp();
2014
- return result;
2015
- }
2016
- async stop() {
2017
- this.requestQueue.stopDispatching();
2018
- await this.ezsp.stop();
2019
- this.initVariables();
2020
- logger_1.logger.info(`======== Ember Adapter Stopped ========`, NS);
2021
- }
2022
- // queued, non-InterPAN
2023
- async getCoordinator() {
2024
- return new Promise((resolve, reject) => {
2025
- this.requestQueue.enqueue(async () => {
2026
- this.checkInterpanLock();
2027
- // in all likelihood this will be retrieved from cache
2028
- const ieeeAddr = (await this.emberGetEui64());
2029
- resolve({
2030
- ieeeAddr,
2031
- networkAddress: consts_2.ZIGBEE_COORDINATOR_ADDRESS,
2032
- manufacturerID: DEFAULT_MANUFACTURER_CODE,
2033
- endpoints: endpoints_1.FIXED_ENDPOINTS.map((ep) => {
2034
- return {
2035
- profileID: ep.profileId,
2036
- ID: ep.endpoint,
2037
- deviceID: ep.deviceId,
2038
- inputClusters: ep.inClusterList.slice(), // copy
2039
- outputClusters: ep.outClusterList.slice(), // copy
2040
- };
2041
- }),
2042
- });
2043
- return enums_2.EmberStatus.SUCCESS;
2044
- }, reject);
2045
- });
2046
- }
2047
- async getCoordinatorVersion() {
2048
- return { type: `EmberZNet`, meta: this.version };
2049
- }
2050
- // queued
2051
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2052
- async reset(type) {
2053
- return Promise.reject(new Error("Not supported"));
2054
- // NOTE: although this function is legacy atm, a couple of new untested EZSP functions that could also prove useful:
2055
- // this.ezsp.ezspTokenFactoryReset(true/*excludeOutgoingFC*/, true/*excludeBootCounter*/);
2056
- // this.ezsp.ezspResetNode()
2057
- }
2058
- async supportsBackup() {
2059
- return true;
2060
- }
2061
- // queued
2062
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2063
- async backup(ieeeAddressesInDatabase) {
2064
- return new Promise((resolve, reject) => {
2065
- this.requestQueue.enqueue(async () => {
2066
- // grab fresh version here, bypass cache
2067
- const [netStatus, , netParams] = (await this.ezsp.ezspGetNetworkParameters());
2068
- if (netStatus !== enums_2.EmberStatus.SUCCESS) {
2069
- logger_1.logger.error(`[BACKUP] Failed to get network parameters.`, NS);
2070
- return netStatus;
2071
- }
2072
- // update cache
2073
- this.networkCache.parameters = netParams;
2074
- this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
2075
- const [netKeyStatus, netKeyInfo] = (await this.ezsp.ezspGetNetworkKeyInfo());
2076
- if (netKeyStatus !== enums_2.SLStatus.OK) {
2077
- logger_1.logger.error(`[BACKUP] Failed to get network keys info.`, NS);
2078
- return ((netKeyStatus === enums_2.SLStatus.BUSY) || (netKeyStatus === enums_2.SLStatus.NOT_READY))
2079
- ? enums_2.EmberStatus.NETWORK_BUSY : enums_2.EmberStatus.ERR_FATAL; // allow retry on statuses that should be temporary
2080
- }
2081
- if (!netKeyInfo.networkKeySet) {
2082
- throw new Error(`[BACKUP] No network key set.`);
2083
- }
2084
- let keyList = [];
2085
- if (STACK_CONFIGS[this.stackConfig].KEY_TABLE_SIZE) {
2086
- keyList = (await this.exportLinkKeys());
2087
- }
2088
- // XXX: this only makes sense on stop (if that), not hourly/on start, plus network needs to be at near-standstill @see AN1387
2089
- // const tokensBuf = (await EmberTokensManager.saveTokens(
2090
- // this.ezsp,
2091
- // Buffer.from(this.networkCache.eui64.substring(2/*0x*/), 'hex').reverse()
2092
- // ));
2093
- let context = (0, initters_1.initSecurityManagerContext)();
2094
- context.coreKeyType = enums_2.SecManKeyType.TC_LINK;
2095
- const [tcLinkKey, tclkStatus] = (await this.ezsp.ezspExportKey(context));
2096
- if (tclkStatus !== enums_2.SLStatus.OK) {
2097
- throw new Error(`[BACKUP] Failed to export TC Link Key with status=${enums_2.SLStatus[tclkStatus]}.`);
2098
- }
2099
- context = (0, initters_1.initSecurityManagerContext)(); // make sure it's back to zeroes
2100
- context.coreKeyType = enums_2.SecManKeyType.NETWORK;
2101
- context.keyIndex = 0;
2102
- const [networkKey, nkStatus] = (await this.ezsp.ezspExportKey(context));
2103
- if (nkStatus !== enums_2.SLStatus.OK) {
2104
- throw new Error(`[BACKUP] Failed to export Network Key with status=${enums_2.SLStatus[nkStatus]}.`);
2105
- }
2106
- const zbChannels = Array.from(Array(consts_2.EMBER_NUM_802_15_4_CHANNELS), (e, i) => i + consts_2.EMBER_MIN_802_15_4_CHANNEL_NUMBER);
2107
- resolve({
2108
- networkOptions: {
2109
- panId: netParams.panId, // uint16_t
2110
- extendedPanId: Buffer.from(netParams.extendedPanId),
2111
- channelList: zbChannels.map((c) => ((2 ** c) & netParams.channels) ? c : null).filter((x) => x),
2112
- networkKey: networkKey.contents,
2113
- networkKeyDistribute: false,
2114
- },
2115
- logicalChannel: netParams.radioChannel,
2116
- networkKeyInfo: {
2117
- sequenceNumber: netKeyInfo.networkKeySequenceNumber,
2118
- frameCounter: netKeyInfo.networkKeyFrameCounter,
2119
- },
2120
- securityLevel: STACK_CONFIGS[this.stackConfig].SECURITY_LEVEL,
2121
- networkUpdateId: netParams.nwkUpdateId,
2122
- coordinatorIeeeAddress: Buffer.from(this.networkCache.eui64.substring(2) /*take out 0x*/, 'hex').reverse(),
2123
- devices: keyList.map((key) => ({
2124
- networkAddress: null, // not used for restore, no reason to make NCP calls for nothing
2125
- ieeeAddress: Buffer.from(key.deviceEui64.substring(2) /*take out 0x*/, 'hex').reverse(),
2126
- isDirectChild: false, // not used
2127
- linkKey: {
2128
- key: key.key.contents,
2129
- rxCounter: key.incomingFrameCounter,
2130
- txCounter: key.outgoingFrameCounter,
2131
- },
2132
- })),
2133
- ezsp: {
2134
- version: this.version.ezsp,
2135
- hashed_tclk: tcLinkKey.contents,
2136
- // tokens: tokensBuf.toString('hex'),
2137
- // altNetworkKey: altNetworkKey.contents,
2138
- }
2139
- });
2140
- return enums_2.EmberStatus.SUCCESS;
2141
- }, reject, true);
2142
- });
2143
- }
2144
- // queued, non-InterPAN
2145
- async getNetworkParameters() {
2146
- return new Promise((resolve, reject) => {
2147
- this.requestQueue.enqueue(async () => {
2148
- this.checkInterpanLock();
2149
- // first call will cache for the others, but in all likelihood, it will all be from freshly cached after init
2150
- // since Controller caches this also.
2151
- const channel = (await this.emberGetRadioChannel());
2152
- const panID = (await this.emberGetPanId());
2153
- const extendedPanID = (await this.emberGetExtendedPanId());
2154
- resolve({
2155
- panID,
2156
- extendedPanID: parseInt(Buffer.from(extendedPanID).toString('hex'), 16),
2157
- channel,
2158
- });
2159
- return enums_2.EmberStatus.SUCCESS;
2160
- }, reject);
2161
- });
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
- }
2184
- // queued
2185
- async setTransmitPower(value) {
2186
- if (typeof value !== 'number') {
2187
- logger_1.logger.error(`Tried to set transmit power to non-number. Value ${value} of type ${typeof value}.`, NS);
2188
- return;
2189
- }
2190
- return new Promise((resolve, reject) => {
2191
- this.requestQueue.enqueue(async () => {
2192
- const status = await this.ezsp.ezspSetRadioPower(value);
2193
- if (status !== enums_2.EmberStatus.SUCCESS) {
2194
- logger_1.logger.error(`Failed to set transmit power to ${value} status=${enums_2.EmberStatus[status]}.`, NS);
2195
- return status;
2196
- }
2197
- resolve();
2198
- return enums_2.EmberStatus.SUCCESS;
2199
- }, reject);
2200
- });
2201
- }
2202
- // queued
2203
- async addInstallCode(ieeeAddress, key) {
2204
- if (!key) {
2205
- throw new Error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}'; no code given.`);
2206
- }
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
- }
2227
- }
2228
- return new Promise((resolve, reject) => {
2229
- this.requestQueue.enqueue(async () => {
2230
- // Compute the key from the install code and CRC.
2231
- const [aesStatus, keyContents] = (await this.emberAesHashSimple(key));
2232
- if (aesStatus !== enums_2.EmberStatus.SUCCESS) {
2233
- logger_1.logger.error(`[ADD INSTALL CODE] Failed AES hash for '${ieeeAddress}' with status=${enums_2.EmberStatus[aesStatus]}.`, NS);
2234
- return aesStatus;
2235
- }
2236
- // Add the key to the transient key table.
2237
- // This will be used while the DUT joins.
2238
- const impStatus = (await this.ezsp.ezspImportTransientKey(ieeeAddress, { contents: keyContents }, enums_2.SecManFlag.NONE));
2239
- if (impStatus == enums_2.SLStatus.OK) {
2240
- logger_1.logger.debug(`[ADD INSTALL CODE] Success for '${ieeeAddress}'.`, NS);
2241
- }
2242
- else {
2243
- logger_1.logger.error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}' with status=${enums_2.SLStatus[impStatus]}.`, NS);
2244
- return enums_2.EmberStatus.ERR_FATAL;
2245
- }
2246
- resolve();
2247
- return enums_2.EmberStatus.SUCCESS;
2248
- }, reject);
2249
- });
2250
- }
2251
- /** WARNING: Adapter impl. Starts timer immediately upon returning */
2252
- waitFor(networkAddress, endpoint, frameType, direction, transactionSequenceNumber, clusterID, commandIdentifier, timeout) {
2253
- const sourceEndpointInfo = endpoints_1.FIXED_ENDPOINTS[0];
2254
- const waiter = this.oneWaitress.waitFor({
2255
- target: networkAddress,
2256
- apsFrame: {
2257
- clusterId: clusterID,
2258
- profileId: sourceEndpointInfo.profileId, // XXX: only used by OTA upstream
2259
- sequence: 0, // set by stack
2260
- sourceEndpoint: sourceEndpointInfo.endpoint,
2261
- destinationEndpoint: endpoint,
2262
- groupId: 0,
2263
- options: enums_2.EmberApsOption.NONE,
2264
- },
2265
- zclSequence: transactionSequenceNumber,
2266
- commandIdentifier,
2267
- }, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT * 3); // XXX: since this is used by OTA...
2268
- return {
2269
- cancel: () => this.oneWaitress.remove(waiter.id),
2270
- promise: waiter.start().promise,
2271
- };
2272
- }
2273
- //---- ZDO
2274
- // queued, non-InterPAN
2275
- async permitJoin(seconds, networkAddress) {
2276
- const preJoining = async () => {
2277
- if (seconds) {
2278
- const plaintextKey = { contents: Buffer.from(consts_2.ZIGBEE_PROFILE_INTEROPERABILITY_LINK_KEY) };
2279
- const impKeyStatus = (await this.ezsp.ezspImportTransientKey(consts_2.BLANK_EUI64, plaintextKey, enums_2.SecManFlag.NONE));
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;
2290
- }
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
- }
2297
- await this.ezsp.ezspClearTransientLinkKeys();
2298
- const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.ALLOW_REJOINS_ONLY));
2299
- if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
2300
- logger_1.logger.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`, NS);
2301
- return enums_2.EmberStatus.ERR_FATAL;
2302
- }
2303
- return enums_2.EmberStatus.SUCCESS;
2304
- }
2305
- };
2306
- if (networkAddress) {
2307
- // specific device that is not `Coordinator`
2308
- return new Promise((resolve, reject) => {
2309
- this.requestQueue.enqueue(async () => {
2310
- this.checkInterpanLock();
2311
- const pjStatus = (await preJoining());
2312
- if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
2313
- logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
2314
- return pjStatus;
2315
- }
2316
- // `authentication`: TC significance always 1 (zb specs)
2317
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2318
- const [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(networkAddress, seconds, 1, 0));
2319
- if (status !== enums_2.EmberStatus.SUCCESS) {
2320
- logger_1.logger.error(`[ZDO] Failed permit joining request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2321
- return status;
2322
- }
2323
- (await this.oneWaitress.startWaitingFor({
2324
- target: networkAddress,
2325
- apsFrame,
2326
- responseClusterId: zdo_1.PERMIT_JOINING_RESPONSE,
2327
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2328
- resolve();
2329
- return enums_2.EmberStatus.SUCCESS;
2330
- }, reject);
2331
- });
2332
- }
2333
- else {
2334
- // coordinator-only, or all
2335
- return new Promise((resolve, reject) => {
2336
- this.requestQueue.enqueue(async () => {
2337
- this.checkInterpanLock();
2338
- const pjStatus = (await preJoining());
2339
- if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
2340
- logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
2341
- return pjStatus;
2342
- }
2343
- // local permit join if `Coordinator`-only requested, else local + broadcast
2344
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2345
- const [status, apsFrame, messageTag] = (await this.emberPermitJoining(seconds, (networkAddress === consts_2.ZIGBEE_COORDINATOR_ADDRESS) ? false : true));
2346
- if (status !== enums_2.EmberStatus.SUCCESS) {
2347
- logger_1.logger.error(`[ZDO] Failed permit joining request with status=${enums_2.EmberStatus[status]}.`, NS);
2348
- return status;
2349
- }
2350
- // NOTE: because Z2M is refreshing the permit join duration early to prevent it from closing
2351
- // (every 200sec, even if only opened for 254sec), we can't wait for the stack opened status,
2352
- // as it won't trigger again if already opened... so instead we assume it worked
2353
- // NOTE2: with EZSP, 255=forever, and 254=max, but since upstream logic uses fixed 254 with interval refresh,
2354
- // we can't simply bypass upstream calls if called for "forever" to prevent useless NCP calls (3-4 each time),
2355
- // until called with 0 (disable), since we don't know if it was requested for forever or not...
2356
- // TLDR: upstream logic change required to allow this
2357
- // if (seconds) {
2358
- // await this.oneWaitress.startWaitingForEvent(
2359
- // {eventName: OneWaitressEvents.STACK_STATUS_NETWORK_OPENED},
2360
- // DEFAULT_ZCL_REQUEST_TIMEOUT,
2361
- // '[ZDO] Permit Joining',
2362
- // );
2363
- // } else {
2364
- // // NOTE: CLOSED stack status is not triggered if the network was not OPENED in the first place, so don't wait for it
2365
- // // same kind of problem as described above (upstream always tries to close after start, but EZSP already is)
2366
- // }
2367
- resolve();
2368
- return enums_2.EmberStatus.SUCCESS;
2369
- }, reject);
2370
- });
2371
- }
2372
- }
2373
- // queued, non-InterPAN
2374
- async lqi(networkAddress) {
2375
- const neighbors = [];
2376
- const request = async (startIndex) => {
2377
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2378
- const [reqStatus, apsFrame, messageTag] = (await this.emberLqiTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
2379
- if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
2380
- logger_1.logger.error(`[ZDO] Failed LQI request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
2381
- return [reqStatus, null, null];
2382
- }
2383
- const result = (await this.oneWaitress.startWaitingFor({
2384
- target: networkAddress,
2385
- apsFrame,
2386
- responseClusterId: zdo_1.LQI_TABLE_RESPONSE,
2387
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2388
- for (const entry of result.entryList) {
2389
- neighbors.push({
2390
- ieeeAddr: entry.eui64,
2391
- networkAddress: entry.nodeId,
2392
- linkquality: entry.lqi,
2393
- relationship: entry.relationship,
2394
- depth: entry.depth,
2395
- });
2396
- }
2397
- return [enums_2.EmberStatus.SUCCESS, result.neighborTableEntries, result.entryList.length];
2398
- };
2399
- return new Promise((resolve, reject) => {
2400
- this.requestQueue.enqueue(async () => {
2401
- this.checkInterpanLock();
2402
- let [status, tableEntries, entryCount] = (await request(0));
2403
- if (status !== enums_2.EmberStatus.SUCCESS) {
2404
- return status;
2405
- }
2406
- const size = tableEntries;
2407
- let nextStartIndex = entryCount;
2408
- while (neighbors.length < size) {
2409
- [status, tableEntries, entryCount] = (await request(nextStartIndex));
2410
- if (status !== enums_2.EmberStatus.SUCCESS) {
2411
- return status;
2412
- }
2413
- nextStartIndex += entryCount;
2414
- }
2415
- resolve({ neighbors });
2416
- return status;
2417
- }, reject);
2418
- });
2419
- }
2420
- // queued, non-InterPAN
2421
- async routingTable(networkAddress) {
2422
- const table = [];
2423
- const request = async (startIndex) => {
2424
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2425
- const [reqStatus, apsFrame, messageTag] = (await this.emberRoutingTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
2426
- if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
2427
- logger_1.logger.error(`[ZDO] Failed routing table request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
2428
- return [reqStatus, null, null];
2429
- }
2430
- const result = (await this.oneWaitress.startWaitingFor({
2431
- target: networkAddress,
2432
- apsFrame,
2433
- responseClusterId: zdo_1.ROUTING_TABLE_RESPONSE,
2434
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2435
- for (const entry of result.entryList) {
2436
- table.push({
2437
- destinationAddress: entry.destinationAddress,
2438
- status: RoutingTableStatus[entry.status], // get str value from enum to satisfy upstream's needs
2439
- nextHop: entry.nextHopAddress,
2440
- });
2441
- }
2442
- return [enums_2.EmberStatus.SUCCESS, result.routingTableEntries, result.entryList.length];
2443
- };
2444
- return new Promise((resolve, reject) => {
2445
- this.requestQueue.enqueue(async () => {
2446
- this.checkInterpanLock();
2447
- let [status, tableEntries, entryCount] = (await request(0));
2448
- if (status !== enums_2.EmberStatus.SUCCESS) {
2449
- return status;
2450
- }
2451
- const size = tableEntries;
2452
- let nextStartIndex = entryCount;
2453
- while (table.length < size) {
2454
- [status, tableEntries, entryCount] = (await request(nextStartIndex));
2455
- if (status !== enums_2.EmberStatus.SUCCESS) {
2456
- return status;
2457
- }
2458
- nextStartIndex += entryCount;
2459
- }
2460
- resolve({ table });
2461
- return enums_2.EmberStatus.SUCCESS;
2462
- }, reject);
2463
- });
2464
- }
2465
- // queued, non-InterPAN
2466
- async nodeDescriptor(networkAddress) {
2467
- return new Promise((resolve, reject) => {
2468
- this.requestQueue.enqueue(async () => {
2469
- this.checkInterpanLock();
2470
- /* eslint-disable @typescript-eslint/no-unused-vars */
2471
- const [status, apsFrame, messageTag] = (await this.emberNodeDescriptorRequest(networkAddress, DEFAULT_APS_OPTIONS));
2472
- if (status !== enums_2.EmberStatus.SUCCESS) {
2473
- logger_1.logger.error(`[ZDO] Failed node descriptor for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2474
- return status;
2475
- }
2476
- const result = (await this.oneWaitress.startWaitingFor({
2477
- target: networkAddress,
2478
- apsFrame,
2479
- responseClusterId: zdo_1.NODE_DESCRIPTOR_RESPONSE,
2480
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2481
- let type = 'Unknown';
2482
- switch (result.logicalType) {
2483
- case 0x0:
2484
- type = 'Coordinator';
2485
- break;
2486
- case 0x1:
2487
- type = 'Router';
2488
- break;
2489
- case 0x2:
2490
- type = 'EndDevice';
2491
- break;
2492
- }
2493
- // always 0 before rev. 21 where field was added
2494
- if (result.stackRevision < CURRENT_ZIGBEE_SPEC_REVISION) {
2495
- logger_1.logger.warning(`[ZDO] Node descriptor for "${networkAddress}" reports device is only compliant to revision `
2496
- + `"${(result.stackRevision < 21) ? 'pre-21' : result.stackRevision}" of the ZigBee specification `
2497
- + `(current revision: ${CURRENT_ZIGBEE_SPEC_REVISION}).`, NS);
2498
- }
2499
- resolve({ type, manufacturerCode: result.manufacturerCode });
2500
- return enums_2.EmberStatus.SUCCESS;
2501
- }, reject);
2502
- });
2503
- }
2504
- // queued, non-InterPAN
2505
- async activeEndpoints(networkAddress) {
2506
- return new Promise((resolve, reject) => {
2507
- this.requestQueue.enqueue(async () => {
2508
- this.checkInterpanLock();
2509
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2510
- const [status, apsFrame, messageTag] = (await this.emberActiveEndpointsRequest(networkAddress, DEFAULT_APS_OPTIONS));
2511
- if (status !== enums_2.EmberStatus.SUCCESS) {
2512
- logger_1.logger.error(`[ZDO] Failed active endpoints request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
2513
- return status;
2514
- }
2515
- const result = (await this.oneWaitress.startWaitingFor({
2516
- target: networkAddress,
2517
- apsFrame,
2518
- responseClusterId: zdo_1.ACTIVE_ENDPOINTS_RESPONSE,
2519
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2520
- resolve({ endpoints: result.endpointList });
2521
- return enums_2.EmberStatus.SUCCESS;
2522
- }, reject);
2523
- });
2524
- }
2525
- // queued, non-InterPAN
2526
- async simpleDescriptor(networkAddress, endpointID) {
2527
- return new Promise((resolve, reject) => {
2528
- this.requestQueue.enqueue(async () => {
2529
- this.checkInterpanLock();
2530
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2531
- const [status, apsFrame, messageTag] = (await this.emberSimpleDescriptorRequest(networkAddress, endpointID, DEFAULT_APS_OPTIONS));
2532
- if (status !== enums_2.EmberStatus.SUCCESS) {
2533
- logger_1.logger.error(`[ZDO] Failed simple descriptor request for "${networkAddress}" endpoint "${endpointID}" `
2534
- + `with status=${enums_2.EmberStatus[status]}.`, NS);
2535
- return status;
2536
- }
2537
- const result = (await this.oneWaitress.startWaitingFor({
2538
- target: networkAddress,
2539
- apsFrame,
2540
- responseClusterId: zdo_1.SIMPLE_DESCRIPTOR_RESPONSE,
2541
- }, DEFAULT_ZDO_REQUEST_TIMEOUT));
2542
- resolve({
2543
- profileID: result.profileId,
2544
- endpointID: result.endpoint,
2545
- deviceID: result.deviceId,
2546
- inputClusters: result.inClusterList,
2547
- outputClusters: result.outClusterList,
2548
- });
2549
- return enums_2.EmberStatus.SUCCESS;
2550
- }, reject);
2551
- });
2552
- }
2553
- // queued, non-InterPAN
2554
- async bind(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, destinationAddressOrGroup, type, destinationEndpoint) {
2555
- if (typeof destinationAddressOrGroup === 'string' && type === 'endpoint') {
2556
- // dest address is EUI64 (str), so type should always be endpoint (unicast)
2557
- return new Promise((resolve, reject) => {
2558
- this.requestQueue.enqueue(async () => {
2559
- this.checkInterpanLock();
2560
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2561
- const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
2562
- destinationEndpoint, DEFAULT_APS_OPTIONS));
2563
- if (status !== enums_2.EmberStatus.SUCCESS) {
2564
- logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2565
- + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
2566
- return status;
2567
- }
2568
- await this.oneWaitress.startWaitingFor({
2569
- target: destinationNetworkAddress,
2570
- apsFrame,
2571
- responseClusterId: zdo_1.BIND_RESPONSE,
2572
- }, DEFAULT_ZDO_REQUEST_TIMEOUT);
2573
- resolve();
2574
- return enums_2.EmberStatus.SUCCESS;
2575
- }, reject);
2576
- });
2577
- }
2578
- else if (typeof destinationAddressOrGroup === 'number' && type === 'group') {
2579
- // dest is group num, so type should always be group (multicast)
2580
- return new Promise((resolve, reject) => {
2581
- this.requestQueue.enqueue(async () => {
2582
- this.checkInterpanLock();
2583
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2584
- const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
2585
- destinationAddressOrGroup, destinationEndpoint, // doesn't matter
2586
- DEFAULT_APS_OPTIONS));
2587
- if (status !== enums_2.EmberStatus.SUCCESS) {
2588
- logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2589
- + `with status=${enums_2.EmberStatus[status]}.`, NS);
2590
- return status;
2591
- }
2592
- await this.oneWaitress.startWaitingFor({
2593
- target: destinationNetworkAddress,
2594
- apsFrame,
2595
- responseClusterId: zdo_1.BIND_RESPONSE,
2596
- }, DEFAULT_ZDO_REQUEST_TIMEOUT);
2597
- resolve();
2598
- return enums_2.EmberStatus.SUCCESS;
2599
- }, reject);
2600
- });
2601
- }
2602
- }
2603
- // queued, non-InterPAN
2604
- async unbind(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, destinationAddressOrGroup, type, destinationEndpoint) {
2605
- if (typeof destinationAddressOrGroup === 'string' && type === 'endpoint') {
2606
- // dest address is EUI64 (str), so type should always be endpoint (unicast)
2607
- return new Promise((resolve, reject) => {
2608
- this.requestQueue.enqueue(async () => {
2609
- this.checkInterpanLock();
2610
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2611
- const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
2612
- destinationEndpoint, DEFAULT_APS_OPTIONS));
2613
- if (status !== enums_2.EmberStatus.SUCCESS) {
2614
- logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
2615
- + `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
2616
- return status;
2617
- }
2618
- await this.oneWaitress.startWaitingFor({
2619
- target: destinationNetworkAddress,
2620
- apsFrame,
2621
- responseClusterId: zdo_1.UNBIND_RESPONSE,
2622
- }, DEFAULT_ZDO_REQUEST_TIMEOUT);
2623
- resolve();
2624
- return enums_2.EmberStatus.SUCCESS;
2625
- }, reject);
2626
- });
2627
- }
2628
- else if (typeof destinationAddressOrGroup === 'number' && type === 'group') {
2629
- // dest is group num, so type should always be group (multicast)
2630
- return new Promise((resolve, reject) => {
2631
- this.requestQueue.enqueue(async () => {
2632
- this.checkInterpanLock();
2633
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2634
- const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
2635
- destinationAddressOrGroup, destinationEndpoint, // doesn't matter
2636
- DEFAULT_APS_OPTIONS));
2637
- if (status !== enums_2.EmberStatus.SUCCESS) {
2638
- logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
2639
- + `with status=${enums_2.EmberStatus[status]}.`, NS);
2640
- return status;
2641
- }
2642
- await this.oneWaitress.startWaitingFor({
2643
- target: destinationNetworkAddress,
2644
- apsFrame,
2645
- responseClusterId: zdo_1.UNBIND_RESPONSE,
2646
- }, DEFAULT_ZDO_REQUEST_TIMEOUT);
2647
- resolve();
2648
- return enums_2.EmberStatus.SUCCESS;
2649
- }, reject);
2650
- });
2651
- }
2652
- }
2653
- // queued, non-InterPAN
2654
- async removeDevice(networkAddress, ieeeAddr) {
2655
- return new Promise((resolve, reject) => {
2656
- this.requestQueue.enqueue(async () => {
2657
- this.checkInterpanLock();
2658
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2659
- const [status, apsFrame, messageTag] = (await this.emberLeaveRequest(networkAddress, ieeeAddr, enums_2.EmberLeaveRequestFlags.WITHOUT_REJOIN, DEFAULT_APS_OPTIONS));
2660
- if (status !== enums_2.EmberStatus.SUCCESS) {
2661
- logger_1.logger.error(`[ZDO] Failed remove device request for "${networkAddress}" target "${ieeeAddr}" `
2662
- + `with status=${enums_2.EmberStatus[status]}.`, NS);
2663
- return status;
2664
- }
2665
- await this.oneWaitress.startWaitingFor({
2666
- target: networkAddress,
2667
- apsFrame,
2668
- responseClusterId: zdo_1.LEAVE_RESPONSE,
2669
- }, DEFAULT_ZDO_REQUEST_TIMEOUT);
2670
- resolve();
2671
- return enums_2.EmberStatus.SUCCESS;
2672
- }, reject);
2673
- });
2674
- }
2675
- //---- ZCL
2676
- // queued, non-InterPAN
2677
- async sendZclFrameToEndpoint(ieeeAddr, networkAddress, endpoint, zclFrame, timeout, disableResponse, disableRecovery, sourceEndpoint) {
2678
- const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
2679
- endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2680
- const command = zclFrame.command;
2681
- let commandResponseId = null;
2682
- if (command.hasOwnProperty('response') && disableResponse === false) {
2683
- commandResponseId = command.response;
2684
- }
2685
- else if (!zclFrame.header.frameControl.disableDefaultResponse) {
2686
- commandResponseId = Zcl.Foundation.defaultRsp.ID;
2687
- }
2688
- const apsFrame = {
2689
- profileId: sourceEndpointInfo.profileId,
2690
- clusterId: zclFrame.cluster.ID,
2691
- sourceEndpoint: sourceEndpointInfo.endpoint,
2692
- destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2693
- options: DEFAULT_APS_OPTIONS,
2694
- groupId: 0,
2695
- sequence: 0, // set by stack
2696
- };
2697
- // don't RETRY if no response expected
2698
- if (commandResponseId == null) {
2699
- apsFrame.options &= ~enums_2.EmberApsOption.RETRY;
2700
- }
2701
- const data = zclFrame.toBuffer();
2702
- return new Promise((resolve, reject) => {
2703
- this.requestQueue.enqueue(async () => {
2704
- this.checkInterpanLock();
2705
- if (CHECK_APS_PAYLOAD_LENGTH) {
2706
- const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.DIRECT, networkAddress, apsFrame));
2707
- if (data.length > maxPayloadLength) {
2708
- return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2709
- }
2710
- }
2711
- logger_1.logger.debug(`~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2712
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2713
- const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.DIRECT, networkAddress, apsFrame, data, 0, // alias
2714
- 0));
2715
- if (status !== enums_2.EmberStatus.SUCCESS) {
2716
- logger_1.logger.error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_2.EmberStatus[status]}.`, NS);
2717
- return status; // let queue handle retry based on status
2718
- }
2719
- if (commandResponseId != null) {
2720
- // NOTE: aps sequence number will have been set by send function
2721
- const result = (await this.oneWaitress.startWaitingFor({
2722
- target: networkAddress,
2723
- apsFrame,
2724
- zclSequence: zclFrame.header.transactionSequenceNumber,
2725
- commandIdentifier: commandResponseId,
2726
- }, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT));
2727
- resolve(result);
2728
- }
2729
- else {
2730
- resolve(null); // don't expect a response
2731
- return enums_2.EmberStatus.SUCCESS;
2732
- }
2733
- }, reject);
2734
- });
2735
- }
2736
- // queued, non-InterPAN
2737
- async sendZclFrameToGroup(groupID, zclFrame, sourceEndpoint) {
2738
- const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
2739
- endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2740
- const apsFrame = {
2741
- profileId: sourceEndpointInfo.profileId,
2742
- clusterId: zclFrame.cluster.ID,
2743
- sourceEndpoint: sourceEndpointInfo.endpoint,
2744
- destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2745
- options: DEFAULT_APS_OPTIONS,
2746
- groupId: groupID,
2747
- sequence: 0, // set by stack
2748
- };
2749
- const data = zclFrame.toBuffer();
2750
- return new Promise((resolve, reject) => {
2751
- this.requestQueue.enqueue(async () => {
2752
- this.checkInterpanLock();
2753
- if (CHECK_APS_PAYLOAD_LENGTH) {
2754
- const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.MULTICAST, groupID, apsFrame));
2755
- if (data.length > maxPayloadLength) {
2756
- return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2757
- }
2758
- }
2759
- logger_1.logger.debug(`~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2760
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2761
- const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.MULTICAST, apsFrame.groupId, // not used for MC
2762
- apsFrame, data, 0, // alias
2763
- 0));
2764
- if (status !== enums_2.EmberStatus.SUCCESS) {
2765
- logger_1.logger.error(`~x~> [ZCL GROUP] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2766
- return status; // let queue handle retry based on status
2767
- }
2768
- // NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
2769
- resolve();
2770
- return enums_2.EmberStatus.SUCCESS;
2771
- }, reject);
2772
- });
2773
- }
2774
- // queued, non-InterPAN
2775
- async sendZclFrameToAll(endpoint, zclFrame, sourceEndpoint, destination) {
2776
- const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
2777
- endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
2778
- const apsFrame = {
2779
- profileId: sourceEndpointInfo.profileId,
2780
- clusterId: zclFrame.cluster.ID,
2781
- sourceEndpoint: sourceEndpointInfo.endpoint,
2782
- destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
2783
- options: DEFAULT_APS_OPTIONS,
2784
- groupId: destination,
2785
- sequence: 0, // set by stack
2786
- };
2787
- const data = zclFrame.toBuffer();
2788
- return new Promise((resolve, reject) => {
2789
- this.requestQueue.enqueue(async () => {
2790
- this.checkInterpanLock();
2791
- if (CHECK_APS_PAYLOAD_LENGTH) {
2792
- const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame));
2793
- if (data.length > maxPayloadLength) {
2794
- return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
2795
- }
2796
- }
2797
- logger_1.logger.debug(`~~~> [ZCL BROADCAST apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
2798
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2799
- const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame, data, 0, // alias
2800
- 0));
2801
- if (status !== enums_2.EmberStatus.SUCCESS) {
2802
- logger_1.logger.error(`~x~> [ZCL BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2803
- return status; // let queue handle retry based on status
2804
- }
2805
- // NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
2806
- resolve();
2807
- return enums_2.EmberStatus.SUCCESS;
2808
- }, reject);
2809
- });
2810
- }
2811
- //---- InterPAN for Touchlink
2812
- // XXX: There might be a better way to handle touchlink with ZLL ezsp functions, but I don't have any device to test so, didn't look into it...
2813
- // TODO: check all this touchlink/interpan stuff
2814
- // queued
2815
- async setChannelInterPAN(channel) {
2816
- if (typeof channel !== 'number') {
2817
- logger_1.logger.error(`Tried to set channel InterPAN to non-number. Channel ${channel} of type ${typeof channel}.`, NS);
2818
- return;
2819
- }
2820
- return new Promise((resolve, reject) => {
2821
- this.requestQueue.enqueue(async () => {
2822
- this.interpanLock = true;
2823
- const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(channel));
2824
- if (status !== enums_2.EmberStatus.SUCCESS) {
2825
- this.interpanLock = false; // XXX: ok?
2826
- logger_1.logger.error(`Failed to set InterPAN channel to ${channel} with status=${enums_2.EmberStatus[status]}.`, NS);
2827
- return status;
2828
- }
2829
- resolve();
2830
- return status;
2831
- }, reject);
2832
- });
2833
- }
2834
- // queued
2835
- async sendZclFrameInterPANToIeeeAddr(zclFrame, ieeeAddress) {
2836
- return new Promise((resolve, reject) => {
2837
- this.requestQueue.enqueue(async () => {
2838
- const msgBuffalo = new buffalo_1.EzspBuffalo(Buffer.alloc(consts_2.MAXIMUM_INTERPAN_LENGTH));
2839
- // cache-enabled getters
2840
- const sourcePanId = (await this.emberGetPanId());
2841
- const sourceEui64 = (await this.emberGetEui64());
2842
- msgBuffalo.writeUInt16((consts_2.LONG_DEST_FRAME_CONTROL | consts_2.MAC_ACK_REQUIRED)); // macFrameControl
2843
- msgBuffalo.writeUInt8(0); // sequence Skip Sequence number, stack sets the sequence number.
2844
- msgBuffalo.writeUInt16(consts_2.INVALID_PAN_ID); // destPanId
2845
- msgBuffalo.writeIeeeAddr(ieeeAddress); // destAddress (longAddress)
2846
- msgBuffalo.writeUInt16(sourcePanId); // sourcePanId
2847
- msgBuffalo.writeIeeeAddr(sourceEui64); // sourceAddress
2848
- msgBuffalo.writeUInt16(consts_2.STUB_NWK_FRAME_CONTROL); // nwkFrameControl
2849
- msgBuffalo.writeUInt8((enums_2.EmberInterpanMessageType.UNICAST | consts_2.INTERPAN_APS_FRAME_TYPE)); // apsFrameControl
2850
- msgBuffalo.writeUInt16(zclFrame.cluster.ID);
2851
- msgBuffalo.writeUInt16(consts_2.TOUCHLINK_PROFILE_ID);
2852
- logger_1.logger.debug(`~~~> [ZCL TOUCHLINK to=${ieeeAddress} header=${JSON.stringify(zclFrame.header)}]`, NS);
2853
- const status = (await this.ezsp.ezspSendRawMessage(Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()])));
2854
- if (status !== enums_2.EmberStatus.SUCCESS) {
2855
- logger_1.logger.error(`~x~> [ZCL TOUCHLINK to=${ieeeAddress}] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2856
- return status;
2857
- }
2858
- // NOTE: can use ezspRawTransmitCompleteHandler if needed here
2859
- resolve();
2860
- return status;
2861
- }, reject);
2862
- });
2863
- }
2864
- // queued
2865
- async sendZclFrameInterPANBroadcast(zclFrame, timeout) {
2866
- const command = zclFrame.command;
2867
- if (!command.hasOwnProperty('response')) {
2868
- throw new Error(`Command '${command.name}' has no response, cannot wait for response.`);
2869
- }
2870
- // just for waitress
2871
- const apsFrame = {
2872
- profileId: consts_2.TOUCHLINK_PROFILE_ID,
2873
- clusterId: zclFrame.cluster.ID,
2874
- sourceEndpoint: 0,
2875
- destinationEndpoint: 0,
2876
- options: enums_2.EmberApsOption.NONE,
2877
- groupId: consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS,
2878
- sequence: 0, // set by stack
2879
- };
2880
- return new Promise((resolve, reject) => {
2881
- this.requestQueue.enqueue(async () => {
2882
- const msgBuffalo = new buffalo_1.EzspBuffalo(Buffer.alloc(consts_2.MAXIMUM_INTERPAN_LENGTH));
2883
- // cache-enabled getters
2884
- const sourcePanId = (await this.emberGetPanId());
2885
- const sourceEui64 = (await this.emberGetEui64());
2886
- msgBuffalo.writeUInt16(consts_2.SHORT_DEST_FRAME_CONTROL); // macFrameControl
2887
- msgBuffalo.writeUInt8(0); // sequence Skip Sequence number, stack sets the sequence number.
2888
- msgBuffalo.writeUInt16(consts_2.INVALID_PAN_ID); // destPanId
2889
- msgBuffalo.writeUInt16(apsFrame.groupId); // destAddress (longAddress)
2890
- msgBuffalo.writeUInt16(sourcePanId); // sourcePanId
2891
- msgBuffalo.writeIeeeAddr(sourceEui64); // sourceAddress
2892
- msgBuffalo.writeUInt16(consts_2.STUB_NWK_FRAME_CONTROL); // nwkFrameControl
2893
- msgBuffalo.writeUInt8((enums_2.EmberInterpanMessageType.BROADCAST | consts_2.INTERPAN_APS_FRAME_TYPE)); // apsFrameControl
2894
- msgBuffalo.writeUInt16(apsFrame.clusterId);
2895
- msgBuffalo.writeUInt16(apsFrame.profileId);
2896
- const data = Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()]);
2897
- logger_1.logger.debug(`~~~> [ZCL TOUCHLINK BROADCAST header=${JSON.stringify(zclFrame.header)}]`, NS);
2898
- const status = (await this.ezsp.ezspSendRawMessage(data));
2899
- if (status !== enums_2.EmberStatus.SUCCESS) {
2900
- logger_1.logger.error(`~x~> [ZCL TOUCHLINK BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
2901
- return status;
2902
- }
2903
- // NOTE: can use ezspRawTransmitCompleteHandler if needed here
2904
- const result = (await this.oneWaitress.startWaitingFor({
2905
- target: null,
2906
- apsFrame: apsFrame,
2907
- zclSequence: zclFrame.header.transactionSequenceNumber,
2908
- commandIdentifier: command.response,
2909
- }, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT * 2)); // XXX: touchlink timeout?
2910
- resolve(result);
2911
- return enums_2.EmberStatus.SUCCESS;
2912
- }, reject);
2913
- });
2914
- }
2915
- // queued
2916
- async restoreChannelInterPAN() {
2917
- return new Promise((resolve, reject) => {
2918
- this.requestQueue.enqueue(async () => {
2919
- const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(this.networkOptions.channelList[0]));
2920
- if (status !== enums_2.EmberStatus.SUCCESS) {
2921
- logger_1.logger.error(`Failed to restore InterPAN channel to ${this.networkOptions.channelList[0]} with status=${enums_2.EmberStatus[status]}.`, NS);
2922
- return status;
2923
- }
2924
- // let adapter settle down
2925
- await (0, utils_1.Wait)(3000);
2926
- this.interpanLock = false;
2927
- resolve();
2928
- return status;
2929
- }, reject);
2930
- });
2931
- }
2932
- //-- END Adapter implementation
2933
- checkInterpanLock() {
2934
- if (this.interpanLock) {
2935
- logger_1.logger.error(`[INTERPAN MODE] Cannot execute non-InterPAN commands.`, NS);
2936
- // will be caught by request queue and rejected internally.
2937
- throw new Error(enums_2.EzspStatus[enums_2.EzspStatus.ERROR_INVALID_CALL]);
2938
- }
2939
- }
2940
- }
2941
- exports.EmberAdapter = EmberAdapter;
2942
- //# sourceMappingURL=emberAdapter.js.map