@willieee802/zigbee-herdsman 0.14.112 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/.release-please-manifest.json +4 -0
  2. package/CHANGELOG.md +27 -0
  3. package/dist/adapter/adapter.d.ts +61 -61
  4. package/dist/adapter/adapter.d.ts.map +1 -1
  5. package/dist/adapter/adapter.js +146 -100
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +68 -68
  8. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  9. package/dist/adapter/deconz/adapter/deconzAdapter.js +1060 -1063
  10. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
  11. package/dist/adapter/deconz/adapter/index.d.ts +2 -2
  12. package/dist/adapter/deconz/adapter/index.js +10 -10
  13. package/dist/adapter/deconz/driver/constants.d.ts +104 -104
  14. package/dist/adapter/deconz/driver/constants.js +55 -55
  15. package/dist/adapter/deconz/driver/driver.d.ts +81 -81
  16. package/dist/adapter/deconz/driver/driver.js +732 -732
  17. package/dist/adapter/deconz/driver/frame.d.ts +6 -6
  18. package/dist/adapter/deconz/driver/frame.js +13 -13
  19. package/dist/adapter/deconz/driver/frameParser.d.ts +2 -2
  20. package/dist/adapter/deconz/driver/frameParser.js +443 -443
  21. package/dist/adapter/deconz/driver/parser.d.ts +12 -12
  22. package/dist/adapter/deconz/driver/parser.js +61 -61
  23. package/dist/adapter/deconz/driver/writer.d.ts +8 -8
  24. package/dist/adapter/deconz/driver/writer.js +44 -44
  25. package/dist/adapter/events.d.ts +47 -47
  26. package/dist/adapter/events.js +14 -14
  27. package/dist/adapter/ezsp/adapter/backup.d.ts +9 -9
  28. package/dist/adapter/ezsp/adapter/backup.js +53 -53
  29. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +59 -59
  30. package/dist/adapter/ezsp/adapter/ezspAdapter.js +585 -585
  31. package/dist/adapter/ezsp/adapter/index.d.ts +2 -2
  32. package/dist/adapter/ezsp/adapter/index.js +10 -10
  33. package/dist/adapter/ezsp/driver/commands.d.ts +36 -34
  34. package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -1
  35. package/dist/adapter/ezsp/driver/commands.js +2359 -2357
  36. package/dist/adapter/ezsp/driver/commands.js.map +1 -1
  37. package/dist/adapter/ezsp/driver/consts.d.ts +10 -10
  38. package/dist/adapter/ezsp/driver/consts.js +13 -13
  39. package/dist/adapter/ezsp/driver/driver.d.ts +103 -103
  40. package/dist/adapter/ezsp/driver/driver.js +639 -639
  41. package/dist/adapter/ezsp/driver/driver.js.map +1 -1
  42. package/dist/adapter/ezsp/driver/ezsp.d.ts +96 -96
  43. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
  44. package/dist/adapter/ezsp/driver/ezsp.js +586 -577
  45. package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
  46. package/dist/adapter/ezsp/driver/index.d.ts +3 -3
  47. package/dist/adapter/ezsp/driver/index.js +8 -8
  48. package/dist/adapter/ezsp/driver/multicast.d.ts +12 -12
  49. package/dist/adapter/ezsp/driver/multicast.js +74 -74
  50. package/dist/adapter/ezsp/driver/parser.d.ts +12 -12
  51. package/dist/adapter/ezsp/driver/parser.js +111 -111
  52. package/dist/adapter/ezsp/driver/types/basic.d.ts +62 -62
  53. package/dist/adapter/ezsp/driver/types/basic.js +208 -208
  54. package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
  55. package/dist/adapter/ezsp/driver/types/index.d.ts +9 -9
  56. package/dist/adapter/ezsp/driver/types/index.js +133 -133
  57. package/dist/adapter/ezsp/driver/types/named.d.ts +697 -697
  58. package/dist/adapter/ezsp/driver/types/named.js +1726 -1726
  59. package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
  60. package/dist/adapter/ezsp/driver/types/struct.d.ts +251 -251
  61. package/dist/adapter/ezsp/driver/types/struct.js +708 -708
  62. package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
  63. package/dist/adapter/ezsp/driver/uart.d.ts +44 -44
  64. package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
  65. package/dist/adapter/ezsp/driver/uart.js +368 -366
  66. package/dist/adapter/ezsp/driver/uart.js.map +1 -1
  67. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +2 -2
  68. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +55 -55
  69. package/dist/adapter/ezsp/driver/utils/index.d.ts +18 -18
  70. package/dist/adapter/ezsp/driver/utils/index.js +67 -67
  71. package/dist/adapter/ezsp/driver/writer.d.ts +13 -13
  72. package/dist/adapter/ezsp/driver/writer.js +88 -88
  73. package/dist/adapter/index.d.ts +4 -4
  74. package/dist/adapter/index.js +35 -35
  75. package/dist/adapter/serialPort.d.ts +8 -8
  76. package/dist/adapter/serialPort.js +22 -22
  77. package/dist/adapter/serialPort.js.map +1 -1
  78. package/dist/adapter/serialPortUtils.d.ts +12 -12
  79. package/dist/adapter/serialPortUtils.js +18 -18
  80. package/dist/adapter/socketPortUtils.d.ts +10 -10
  81. package/dist/adapter/socketPortUtils.js +16 -16
  82. package/dist/adapter/tstype.d.ts +85 -85
  83. package/dist/adapter/tstype.js +2 -2
  84. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +62 -62
  85. package/dist/adapter/z-stack/adapter/adapter-backup.js +441 -441
  86. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +150 -150
  87. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +258 -258
  88. package/dist/adapter/z-stack/adapter/endpoints.d.ts +11 -11
  89. package/dist/adapter/z-stack/adapter/endpoints.js +73 -73
  90. package/dist/adapter/z-stack/adapter/index.d.ts +2 -2
  91. package/dist/adapter/z-stack/adapter/index.js +8 -8
  92. package/dist/adapter/z-stack/adapter/manager.d.ts +86 -86
  93. package/dist/adapter/z-stack/adapter/manager.js +476 -476
  94. package/dist/adapter/z-stack/adapter/tstype.d.ts +6 -6
  95. package/dist/adapter/z-stack/adapter/tstype.js +10 -10
  96. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +81 -81
  97. package/dist/adapter/z-stack/adapter/zStackAdapter.js +868 -868
  98. package/dist/adapter/z-stack/constants/af.d.ts +23 -23
  99. package/dist/adapter/z-stack/constants/af.js +27 -27
  100. package/dist/adapter/z-stack/constants/common.d.ts +278 -278
  101. package/dist/adapter/z-stack/constants/common.js +289 -289
  102. package/dist/adapter/z-stack/constants/dbg.d.ts +22 -22
  103. package/dist/adapter/z-stack/constants/dbg.js +24 -24
  104. package/dist/adapter/z-stack/constants/index.d.ts +10 -10
  105. package/dist/adapter/z-stack/constants/index.js +47 -47
  106. package/dist/adapter/z-stack/constants/mac.d.ts +127 -127
  107. package/dist/adapter/z-stack/constants/mac.js +129 -129
  108. package/dist/adapter/z-stack/constants/sapi.d.ts +24 -24
  109. package/dist/adapter/z-stack/constants/sapi.js +26 -26
  110. package/dist/adapter/z-stack/constants/sys.d.ts +71 -71
  111. package/dist/adapter/z-stack/constants/sys.js +73 -73
  112. package/dist/adapter/z-stack/constants/util.d.ts +81 -81
  113. package/dist/adapter/z-stack/constants/util.js +83 -83
  114. package/dist/adapter/z-stack/constants/utils.d.ts +4 -4
  115. package/dist/adapter/z-stack/constants/utils.js +14 -14
  116. package/dist/adapter/z-stack/constants/zdo.d.ts +102 -102
  117. package/dist/adapter/z-stack/constants/zdo.js +104 -104
  118. package/dist/adapter/z-stack/models/index.d.ts +1 -1
  119. package/dist/adapter/z-stack/models/index.js +17 -17
  120. package/dist/adapter/z-stack/models/startup-options.d.ts +12 -12
  121. package/dist/adapter/z-stack/models/startup-options.js +2 -2
  122. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +23 -23
  123. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +45 -45
  124. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +10 -10
  125. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +22 -22
  126. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +10 -10
  127. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +21 -21
  128. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +10 -10
  129. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +23 -23
  130. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +10 -10
  131. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +24 -24
  132. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +10 -10
  133. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +23 -23
  134. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +8 -8
  135. package/dist/adapter/z-stack/structs/entries/channel-list.js +15 -15
  136. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +8 -8
  137. package/dist/adapter/z-stack/structs/entries/has-configured.js +16 -16
  138. package/dist/adapter/z-stack/structs/entries/index.d.ts +16 -16
  139. package/dist/adapter/z-stack/structs/entries/index.js +32 -32
  140. package/dist/adapter/z-stack/structs/entries/nib.d.ts +10 -10
  141. package/dist/adapter/z-stack/structs/entries/nib.js +68 -68
  142. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +10 -10
  143. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +18 -18
  144. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +8 -8
  145. package/dist/adapter/z-stack/structs/entries/nwk-key.js +15 -15
  146. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +8 -8
  147. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +15 -15
  148. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +13 -13
  149. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +23 -23
  150. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +10 -10
  151. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +22 -22
  152. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +20 -20
  153. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +36 -36
  154. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +10 -10
  155. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +24 -24
  156. package/dist/adapter/z-stack/structs/index.d.ts +4 -4
  157. package/dist/adapter/z-stack/structs/index.js +20 -20
  158. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +13 -13
  159. package/dist/adapter/z-stack/structs/serializable-memory-object.js +2 -2
  160. package/dist/adapter/z-stack/structs/struct.d.ts +99 -99
  161. package/dist/adapter/z-stack/structs/struct.js +295 -295
  162. package/dist/adapter/z-stack/structs/table.d.ts +94 -94
  163. package/dist/adapter/z-stack/structs/table.js +161 -161
  164. package/dist/adapter/z-stack/unpi/constants.d.ts +28 -28
  165. package/dist/adapter/z-stack/unpi/constants.js +41 -41
  166. package/dist/adapter/z-stack/unpi/frame.d.ts +16 -16
  167. package/dist/adapter/z-stack/unpi/frame.js +48 -48
  168. package/dist/adapter/z-stack/unpi/index.d.ts +5 -5
  169. package/dist/adapter/z-stack/unpi/index.js +37 -37
  170. package/dist/adapter/z-stack/unpi/parser.d.ts +10 -10
  171. package/dist/adapter/z-stack/unpi/parser.js +74 -74
  172. package/dist/adapter/z-stack/unpi/writer.d.ts +10 -10
  173. package/dist/adapter/z-stack/unpi/writer.js +44 -44
  174. package/dist/adapter/z-stack/utils/channel-list.d.ts +20 -20
  175. package/dist/adapter/z-stack/utils/channel-list.js +40 -40
  176. package/dist/adapter/z-stack/utils/index.d.ts +2 -2
  177. package/dist/adapter/z-stack/utils/index.js +18 -18
  178. package/dist/adapter/z-stack/utils/network-options.d.ts +8 -8
  179. package/dist/adapter/z-stack/utils/network-options.js +22 -22
  180. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +11 -11
  181. package/dist/adapter/z-stack/znp/buffaloZnp.js +113 -113
  182. package/dist/adapter/z-stack/znp/definition.d.ts +5 -5
  183. package/dist/adapter/z-stack/znp/definition.js +3050 -3050
  184. package/dist/adapter/z-stack/znp/index.d.ts +3 -3
  185. package/dist/adapter/z-stack/znp/index.js +10 -10
  186. package/dist/adapter/z-stack/znp/parameterType.d.ts +22 -22
  187. package/dist/adapter/z-stack/znp/parameterType.js +25 -25
  188. package/dist/adapter/z-stack/znp/tstype.d.ts +21 -21
  189. package/dist/adapter/z-stack/znp/tstype.js +2 -2
  190. package/dist/adapter/z-stack/znp/znp.d.ts +43 -43
  191. package/dist/adapter/z-stack/znp/znp.js +325 -325
  192. package/dist/adapter/z-stack/znp/zpiObject.d.ts +19 -19
  193. package/dist/adapter/z-stack/znp/zpiObject.js +96 -96
  194. package/dist/adapter/zigate/adapter/index.d.ts +2 -2
  195. package/dist/adapter/zigate/adapter/index.js +10 -10
  196. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +69 -69
  197. package/dist/adapter/zigate/adapter/zigateAdapter.js +678 -678
  198. package/dist/adapter/zigate/debug.d.ts +7 -7
  199. package/dist/adapter/zigate/debug.js +22 -22
  200. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +18 -18
  201. package/dist/adapter/zigate/driver/buffaloZiGate.js +139 -139
  202. package/dist/adapter/zigate/driver/commandType.d.ts +41 -41
  203. package/dist/adapter/zigate/driver/commandType.js +385 -385
  204. package/dist/adapter/zigate/driver/constants.d.ts +276 -276
  205. package/dist/adapter/zigate/driver/constants.js +371 -371
  206. package/dist/adapter/zigate/driver/frame.d.ts +26 -26
  207. package/dist/adapter/zigate/driver/frame.js +172 -172
  208. package/dist/adapter/zigate/driver/frame.js.map +1 -1
  209. package/dist/adapter/zigate/driver/messageType.d.ts +11 -11
  210. package/dist/adapter/zigate/driver/messageType.js +278 -278
  211. package/dist/adapter/zigate/driver/parameterType.d.ts +20 -20
  212. package/dist/adapter/zigate/driver/parameterType.js +23 -23
  213. package/dist/adapter/zigate/driver/ziGateObject.d.ts +23 -23
  214. package/dist/adapter/zigate/driver/ziGateObject.js +106 -106
  215. package/dist/adapter/zigate/driver/zigate.d.ts +49 -49
  216. package/dist/adapter/zigate/driver/zigate.js +303 -303
  217. package/dist/buffalo/buffalo.d.ts +50 -48
  218. package/dist/buffalo/buffalo.d.ts.map +1 -1
  219. package/dist/buffalo/buffalo.js +322 -307
  220. package/dist/buffalo/buffalo.js.map +1 -1
  221. package/dist/buffalo/index.d.ts +3 -3
  222. package/dist/buffalo/index.js +33 -33
  223. package/dist/buffalo/tstype.d.ts +8 -8
  224. package/dist/buffalo/tstype.js +2 -2
  225. package/dist/controller/controller.d.ts +110 -110
  226. package/dist/controller/controller.js +607 -607
  227. package/dist/controller/database.d.ts +18 -18
  228. package/dist/controller/database.js +93 -93
  229. package/dist/controller/events.d.ts +55 -55
  230. package/dist/controller/events.d.ts.map +1 -1
  231. package/dist/controller/events.js +101 -99
  232. package/dist/controller/events.js.map +1 -1
  233. package/dist/controller/greenPower.d.ts +12 -12
  234. package/dist/controller/greenPower.js +220 -220
  235. package/dist/controller/helpers/index.d.ts +2 -2
  236. package/dist/controller/helpers/index.js +28 -28
  237. package/dist/controller/helpers/request.d.ts +23 -0
  238. package/dist/controller/helpers/request.d.ts.map +1 -0
  239. package/dist/controller/helpers/request.js +72 -0
  240. package/dist/controller/helpers/request.js.map +1 -0
  241. package/dist/controller/helpers/zclFrameConverter.d.ts +7 -7
  242. package/dist/controller/helpers/zclFrameConverter.js +31 -31
  243. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +5 -5
  244. package/dist/controller/helpers/zclTransactionSequenceNumber.js +13 -13
  245. package/dist/controller/index.d.ts +5 -5
  246. package/dist/controller/index.js +8 -8
  247. package/dist/controller/logger-stub.d.ts +6 -6
  248. package/dist/controller/logger-stub.js +2 -2
  249. package/dist/controller/model/device.d.ts +132 -127
  250. package/dist/controller/model/device.d.ts.map +1 -1
  251. package/dist/controller/model/device.js +708 -681
  252. package/dist/controller/model/device.js.map +1 -1
  253. package/dist/controller/model/endpoint.d.ts +131 -128
  254. package/dist/controller/model/endpoint.d.ts.map +1 -1
  255. package/dist/controller/model/endpoint.js +817 -665
  256. package/dist/controller/model/endpoint.js.map +1 -1
  257. package/dist/controller/model/entity.d.ts +14 -14
  258. package/dist/controller/model/entity.js +26 -26
  259. package/dist/controller/model/group.d.ts +39 -39
  260. package/dist/controller/model/group.js +221 -221
  261. package/dist/controller/model/index.d.ts +5 -5
  262. package/dist/controller/model/index.js +14 -14
  263. package/dist/controller/touchlink.d.ts +19 -19
  264. package/dist/controller/touchlink.js +157 -157
  265. package/dist/controller/tstype.d.ts +21 -20
  266. package/dist/controller/tstype.d.ts.map +1 -1
  267. package/dist/controller/tstype.js +9 -9
  268. package/dist/controller/tstype.js.map +1 -1
  269. package/dist/index.d.ts +3 -3
  270. package/dist/index.js +33 -33
  271. package/dist/models/backup-storage-legacy.d.ts +26 -26
  272. package/dist/models/backup-storage-legacy.js +2 -2
  273. package/dist/models/backup-storage-unified.d.ts +49 -49
  274. package/dist/models/backup-storage-unified.js +2 -2
  275. package/dist/models/backup.d.ts +37 -37
  276. package/dist/models/backup.js +2 -2
  277. package/dist/models/index.d.ts +4 -4
  278. package/dist/models/index.js +20 -20
  279. package/dist/models/network-options.d.ts +12 -12
  280. package/dist/models/network-options.js +2 -2
  281. package/dist/utils/assertString.d.ts +2 -2
  282. package/dist/utils/assertString.js +8 -8
  283. package/dist/utils/backup.d.ts +20 -20
  284. package/dist/utils/backup.js +187 -187
  285. package/dist/utils/equalsPartial.d.ts +2 -2
  286. package/dist/utils/equalsPartial.js +11 -11
  287. package/dist/utils/index.d.ts +9 -9
  288. package/dist/utils/index.js +45 -45
  289. package/dist/utils/isNumberArray.d.ts +2 -2
  290. package/dist/utils/isNumberArray.js +6 -6
  291. package/dist/utils/queue.d.ts +11 -11
  292. package/dist/utils/queue.js +50 -50
  293. package/dist/utils/realpathSync.d.ts +2 -2
  294. package/dist/utils/realpathSync.js +12 -12
  295. package/dist/utils/wait.d.ts +2 -2
  296. package/dist/utils/wait.js +8 -8
  297. package/dist/utils/waitress.d.ts +21 -21
  298. package/dist/utils/waitress.js +61 -61
  299. package/dist/zcl/buffaloZcl.d.ts +41 -41
  300. package/dist/zcl/buffaloZcl.js +591 -591
  301. package/dist/zcl/definition/buffaloZclDataType.d.ts +17 -17
  302. package/dist/zcl/definition/buffaloZclDataType.js +20 -20
  303. package/dist/zcl/definition/cluster.d.ts +29 -29
  304. package/dist/zcl/definition/cluster.d.ts.map +1 -1
  305. package/dist/zcl/definition/cluster.js +5335 -5215
  306. package/dist/zcl/definition/cluster.js.map +1 -1
  307. package/dist/zcl/definition/dataType.d.ts +59 -59
  308. package/dist/zcl/definition/dataType.d.ts.map +1 -1
  309. package/dist/zcl/definition/dataType.js +64 -64
  310. package/dist/zcl/definition/dataType.js.map +1 -1
  311. package/dist/zcl/definition/direction.d.ts +5 -5
  312. package/dist/zcl/definition/direction.js +8 -8
  313. package/dist/zcl/definition/endpointDeviceType.d.ts +4 -4
  314. package/dist/zcl/definition/endpointDeviceType.js +15 -15
  315. package/dist/zcl/definition/foundation.d.ts +11 -11
  316. package/dist/zcl/definition/foundation.js +167 -167
  317. package/dist/zcl/definition/frameControl.d.ts +10 -10
  318. package/dist/zcl/definition/frameControl.js +2 -2
  319. package/dist/zcl/definition/frameType.d.ts +5 -5
  320. package/dist/zcl/definition/frameType.js +8 -8
  321. package/dist/zcl/definition/index.d.ts +13 -13
  322. package/dist/zcl/definition/index.js +51 -51
  323. package/dist/zcl/definition/manufacturerCode.d.ts +1074 -1074
  324. package/dist/zcl/definition/manufacturerCode.js +1079 -1079
  325. package/dist/zcl/definition/powerSource.d.ts +4 -4
  326. package/dist/zcl/definition/powerSource.js +12 -12
  327. package/dist/zcl/definition/status.d.ts +38 -38
  328. package/dist/zcl/definition/status.js +41 -41
  329. package/dist/zcl/definition/tstype.d.ts +16 -16
  330. package/dist/zcl/definition/tstype.js +2 -2
  331. package/dist/zcl/index.d.ts +15 -15
  332. package/dist/zcl/index.js +55 -55
  333. package/dist/zcl/tstype.d.ts +56 -56
  334. package/dist/zcl/tstype.js +10 -10
  335. package/dist/zcl/utils.d.ts +6 -6
  336. package/dist/zcl/utils.js +165 -165
  337. package/dist/zcl/zclFrame.d.ts +45 -45
  338. package/dist/zcl/zclFrame.js +347 -347
  339. package/dist/zcl/zclStatusError.d.ts +5 -5
  340. package/dist/zcl/zclStatusError.js +13 -13
  341. package/package.json +6 -5
  342. package/release-please-config.json +13 -0
  343. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  344. package/.github/dependabot.yml +0 -6
  345. package/.github/workflows/ci.yml +0 -31
  346. package/.github/workflows/release.yml +0 -56
  347. package/.github/workflows/stale.yml +0 -19
  348. package/.github/workflows/update_deps.yml +0 -24
@@ -1,442 +1,442 @@
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.AdapterBackup = void 0;
30
- /* eslint-disable max-len */
31
- const debug_1 = __importDefault(require("debug"));
32
- const Structs = __importStar(require("../structs"));
33
- const Utils = __importStar(require("../utils"));
34
- const utils_1 = require("../../../utils");
35
- const mz_1 = require("mz");
36
- const common_1 = require("../constants/common");
37
- const constants_1 = require("../unpi/constants");
38
- const tstype_1 = require("./tstype");
39
- const structs_1 = require("../structs");
40
- /**
41
- * Class providing ZNP adapter backup and restore procedures based mostly on NV memory manipulation.
42
- */
43
- class AdapterBackup {
44
- constructor(znp, nv, path) {
45
- this.debug = (0, debug_1.default)("zigbee-herdsman:adapter:zStack:startup:backup");
46
- this.znp = znp;
47
- this.nv = nv;
48
- this.defaultPath = path;
49
- }
50
- /**
51
- * Loads currently stored backup and returns it in internal backup model.
52
- */
53
- async getStoredBackup() {
54
- var _a, _b, _c, _d;
55
- try {
56
- await mz_1.fs.access(this.defaultPath);
57
- }
58
- catch (error) {
59
- return null;
60
- }
61
- let data;
62
- try {
63
- data = JSON.parse((await mz_1.fs.readFile(this.defaultPath)).toString());
64
- }
65
- catch (error) {
66
- throw new Error('Coordinator backup is corrupted');
67
- }
68
- if (((_a = data.metadata) === null || _a === void 0 ? void 0 : _a.format) === "zigpy/open-coordinator-backup" && ((_b = data.metadata) === null || _b === void 0 ? void 0 : _b.version)) {
69
- if (((_c = data.metadata) === null || _c === void 0 ? void 0 : _c.version) !== 1) {
70
- throw new Error(`Unsupported open coordinator backup version (version=${(_d = data.metadata) === null || _d === void 0 ? void 0 : _d.version})`);
71
- }
72
- return utils_1.BackupUtils.fromUnifiedBackup(data);
73
- }
74
- else if (data.adapterType === "zStack") {
75
- return utils_1.BackupUtils.fromLegacyBackup(data);
76
- }
77
- else {
78
- throw new Error("Unknown backup format");
79
- }
80
- }
81
- /**
82
- * Creates a new backup from connected ZNP adapter and returns it in internal backup model format.
83
- */
84
- async createBackup() {
85
- this.debug("creating backup");
86
- const version = await this.getAdapterVersion();
87
- /* get adapter ieee address */
88
- const ieeeAddressResponse = await this.znp.request(constants_1.Subsystem.SYS, "getExtAddr", {});
89
- if (!ieeeAddressResponse || !ieeeAddressResponse.payload.extaddress || !ieeeAddressResponse.payload.extaddress.startsWith("0x")) {
90
- throw new Error("Failed to read adapter IEEE address");
91
- }
92
- const ieeeAddress = Buffer.from(ieeeAddressResponse.payload.extaddress.split("0x")[1], "hex");
93
- this.debug("fetched adapter ieee address");
94
- /* get adapter nib */
95
- const nib = await this.nv.readItem(common_1.NvItemsIds.NIB, 0, Structs.nib);
96
- if (!nib) {
97
- throw new Error("Cannot backup - adapter not commissioned");
98
- }
99
- this.debug("fetched adapter nib");
100
- /* get adapter active key information */
101
- let activeKeyInfo;
102
- if (version === tstype_1.ZnpVersion.zStack12) {
103
- const key = Structs.nwkKey((await this.znp.request(constants_1.Subsystem.SAPI, "readConfiguration", { configid: common_1.NvItemsIds.PRECFGKEY })).payload.value);
104
- activeKeyInfo = Structs.nwkKeyDescriptor();
105
- activeKeyInfo.key = key.key;
106
- }
107
- else {
108
- activeKeyInfo = await this.nv.readItem(common_1.NvItemsIds.NWK_ACTIVE_KEY_INFO, 0, Structs.nwkKeyDescriptor);
109
- }
110
- if (!activeKeyInfo) {
111
- throw new Error("Cannot backup - missing active key info");
112
- }
113
- this.debug("fetched adapter active key information");
114
- /* get adapter security data */
115
- const preconfiguredKeyEnabled = await this.nv.readItem(common_1.NvItemsIds.PRECFGKEYS_ENABLE, 0);
116
- this.debug("fetched adapter pre-configured key");
117
- const addressManagerTable = await this.getAddressManagerTable(version);
118
- this.debug(`fetched adapter address manager table (capacity=${(addressManagerTable === null || addressManagerTable === void 0 ? void 0 : addressManagerTable.capacity) || 0}, used=${(addressManagerTable === null || addressManagerTable === void 0 ? void 0 : addressManagerTable.usedCount) || 0})`);
119
- const securityManagerTable = await this.getSecurityManagerTable();
120
- this.debug(`fetched adapter security manager table (capacity=${(securityManagerTable === null || securityManagerTable === void 0 ? void 0 : securityManagerTable.usedCount) || 0}, used=${(securityManagerTable === null || securityManagerTable === void 0 ? void 0 : securityManagerTable.usedCount) || 0})`);
121
- const apsLinkKeyDataTable = await this.getApsLinkKeyDataTable(version);
122
- this.debug(`fetched adapter aps link key data table (capacity=${(apsLinkKeyDataTable === null || apsLinkKeyDataTable === void 0 ? void 0 : apsLinkKeyDataTable.usedCount) || 0}, used=${(apsLinkKeyDataTable === null || apsLinkKeyDataTable === void 0 ? void 0 : apsLinkKeyDataTable.usedCount) || 0})`);
123
- const tclkSeed = version === tstype_1.ZnpVersion.zStack12 ? null : await this.nv.readItem(common_1.NvItemsIds.TCLK_SEED, 0, Structs.nwkKey);
124
- this.debug("fetched adapter tclk seed");
125
- const tclkTable = await this.getTclkTable(version);
126
- this.debug(`fetched adapter tclk table (capacity=${(tclkTable === null || tclkTable === void 0 ? void 0 : tclkTable.usedCount) || 0}, used=${(tclkTable === null || tclkTable === void 0 ? void 0 : tclkTable.usedCount) || 0})`);
127
- const secMaterialTable = await this.getNetworkSecurityMaterialTable(version);
128
- this.debug(`fetched adapter network security material table (capacity=${(secMaterialTable === null || secMaterialTable === void 0 ? void 0 : secMaterialTable.usedCount) || 0}, used=${(secMaterialTable === null || secMaterialTable === void 0 ? void 0 : secMaterialTable.usedCount) || 0})`);
129
- /* examine network security material table */
130
- const genericExtendedPanId = Buffer.alloc(8, 0xff);
131
- let secMaterialDescriptor = null;
132
- /* istanbul ignore next */
133
- for (const entry of secMaterialTable.used) {
134
- if (entry.extendedPanID.equals(nib.extendedPANID)) {
135
- secMaterialDescriptor = entry;
136
- break;
137
- }
138
- else if (!secMaterialDescriptor && entry.extendedPanID.equals(genericExtendedPanId)) {
139
- secMaterialDescriptor = entry;
140
- }
141
- }
142
- if (!secMaterialDescriptor) {
143
- secMaterialDescriptor = Structs.nwkSecMaterialDescriptorEntry();
144
- secMaterialDescriptor.extendedPanID = nib.extendedPANID;
145
- secMaterialDescriptor.FrameCounter = version === tstype_1.ZnpVersion.zStack12 ? 0 : 1250;
146
- }
147
- /* return backup structure */
148
- /* istanbul ignore next */
149
- return {
150
- znp: {
151
- version: version,
152
- trustCenterLinkKeySeed: (tclkSeed === null || tclkSeed === void 0 ? void 0 : tclkSeed.key) || undefined
153
- },
154
- networkOptions: {
155
- panId: nib.nwkPanId,
156
- extendedPanId: nib.extendedPANID,
157
- channelList: Utils.unpackChannelList(nib.channelList),
158
- networkKey: activeKeyInfo.key,
159
- networkKeyDistribute: preconfiguredKeyEnabled && preconfiguredKeyEnabled[0] === 0x01
160
- },
161
- logicalChannel: nib.nwkLogicalChannel,
162
- networkKeyInfo: {
163
- sequenceNumber: activeKeyInfo.keySeqNum,
164
- frameCounter: secMaterialDescriptor.FrameCounter
165
- },
166
- securityLevel: nib.SecurityLevel,
167
- networkUpdateId: nib.nwkUpdateId,
168
- coordinatorIeeeAddress: ieeeAddress,
169
- devices: addressManagerTable && addressManagerTable.used.map((ame, ami) => {
170
- /* take all entries of assoc and/or security type */
171
- if (!ame.isSet() || (ame.user & (structs_1.AddressManagerUser.Assoc | structs_1.AddressManagerUser.Security)) === 0) {
172
- /* istanbul ignore next */
173
- return null;
174
- }
175
- let linkKeyInfo = null;
176
- const sme = securityManagerTable.used.find(e => e.ami === ami);
177
- if (sme) {
178
- const apsKeyDataIndex = version === tstype_1.ZnpVersion.zStack30x ? sme.keyNvId - common_1.NvItemsIds.APS_LINK_KEY_DATA_START : sme.keyNvId;
179
- const apsKeyData = apsLinkKeyDataTable.used[apsKeyDataIndex] || null;
180
- if (apsKeyData) {
181
- linkKeyInfo = {
182
- key: apsKeyData.key,
183
- rxCounter: apsKeyData.rxFrmCntr,
184
- txCounter: apsKeyData.txFrmCntr
185
- };
186
- }
187
- }
188
- else {
189
- const tclkTableEntry = tclkTable.used.find(e => e.extAddr.equals(ame.extAddr));
190
- if (tclkTableEntry) {
191
- const rotatedSeed = Buffer.concat([tclkSeed.key.slice(tclkTableEntry.SeedShift_IcIndex), tclkSeed.key.slice(0, tclkTableEntry.SeedShift_IcIndex)]);
192
- const extAddrReversed = Buffer.from(ame.extAddr).reverse();
193
- const extAddrRepeated = Buffer.concat([extAddrReversed, extAddrReversed]);
194
- const derivedKey = Buffer.alloc(16);
195
- for (let i = 0; i < 16; i++) {
196
- derivedKey[i] = rotatedSeed[i] ^ extAddrRepeated[i];
197
- }
198
- linkKeyInfo = {
199
- key: derivedKey,
200
- rxCounter: tclkTableEntry.rxFrmCntr,
201
- txCounter: tclkTableEntry.txFrmCntr
202
- };
203
- }
204
- }
205
- return {
206
- networkAddress: ame.nwkAddr,
207
- ieeeAddress: ame.extAddr,
208
- isDirectChild: (ame.user & structs_1.AddressManagerUser.Assoc) > 0,
209
- linkKey: !linkKeyInfo ? undefined : linkKeyInfo
210
- };
211
- }).filter(e => e) || []
212
- };
213
- }
214
- /**
215
- * Restores a structure in internal backup format to connected ZNP adapter.
216
- *
217
- * @param backup Backup to restore to connected adapter.
218
- */
219
- async restoreBackup(backup) {
220
- var _a, _b;
221
- this.debug("restoring backup");
222
- const version = await this.getAdapterVersion();
223
- /* istanbul ignore next */
224
- if (version === tstype_1.ZnpVersion.zStack12) {
225
- throw new Error("backup cannot be restored on Z-Stack 1.2 adapter");
226
- }
227
- /* fetch provisional NIB */
228
- const nib = await this.nv.readItem(common_1.NvItemsIds.NIB, 0, Structs.nib);
229
- /* update NIB with desired nwk config */
230
- nib.nwkPanId = backup.networkOptions.panId;
231
- nib.channelList = Utils.packChannelList(backup.networkOptions.channelList);
232
- nib.nwkLogicalChannel = backup.networkOptions.channelList[0];
233
- nib.extendedPANID = backup.networkOptions.extendedPanId;
234
- nib.SecurityLevel = backup.securityLevel;
235
- nib.nwkUpdateId = backup.networkUpdateId;
236
- /* prepare key info */
237
- const keyDescriptor = Structs.nwkKeyDescriptor();
238
- keyDescriptor.keySeqNum = backup.networkKeyInfo.sequenceNumber || 0;
239
- keyDescriptor.key = backup.networkOptions.networkKey;
240
- /* determine table sizes */
241
- const currentAddressManagerTable = await this.getAddressManagerTable(version);
242
- const currentSecurityManagerTable = await this.getSecurityManagerTable();
243
- const currentApsLinkKeyDataTable = await this.getApsLinkKeyDataTable(version);
244
- const currentTclkTable = await this.getTclkTable(version);
245
- const currentNwkSecMaterialTable = await this.getNetworkSecurityMaterialTable(version);
246
- this.debug(`got target adapter table sizes:`);
247
- this.debug(` - address manager table: ${currentAddressManagerTable.capacity}`);
248
- this.debug(` - security manager table: ${currentSecurityManagerTable.capacity}`);
249
- this.debug(` - aps link key data table: ${currentApsLinkKeyDataTable.capacity}`);
250
- this.debug(` - tclk table: ${currentTclkTable.capacity}`);
251
- this.debug(` - network security material table: ${currentNwkSecMaterialTable.capacity}`);
252
- /* prepare table structures */
253
- const addressManagerTable = Structs.addressManagerTable(currentAddressManagerTable.capacity);
254
- const securityManagerTable = Structs.securityManagerTable(currentSecurityManagerTable.capacity);
255
- const apsLinkKeyDataTable = Structs.apsLinkKeyDataTable(currentApsLinkKeyDataTable.capacity);
256
- const tclkTable = Structs.apsTcLinkKeyTable(currentTclkTable.capacity);
257
- const nwkSecurityMaterialTable = Structs.nwkSecMaterialDescriptorTable(currentNwkSecMaterialTable.capacity);
258
- /* prepare security material table (nwk frame counters) */
259
- const mwkSecMaterialEntry = nwkSecurityMaterialTable.entries[0];
260
- mwkSecMaterialEntry.extendedPanID = backup.networkOptions.extendedPanId;
261
- mwkSecMaterialEntry.FrameCounter = backup.networkKeyInfo.frameCounter + 2500;
262
- const genericNwkSecMaterialEntry = nwkSecurityMaterialTable.entries[nwkSecurityMaterialTable.capacity - 1];
263
- genericNwkSecMaterialEntry.extendedPanID = Buffer.alloc(8, 0xff);
264
- genericNwkSecMaterialEntry.FrameCounter = backup.networkKeyInfo.frameCounter + 2500;
265
- /* populate device & security tables and write them */
266
- for (const device of backup.devices) {
267
- const ame = addressManagerTable.getNextFree();
268
- ame.nwkAddr = device.networkAddress;
269
- ame.extAddr = device.ieeeAddress;
270
- ame.user = device.isDirectChild ? structs_1.AddressManagerUser.Assoc : structs_1.AddressManagerUser.Default;
271
- if (device.linkKey) {
272
- let linkKeyProcessed = false;
273
- /* attempt to recover tclk seed parameters (if available) */
274
- if ((_a = backup.znp) === null || _a === void 0 ? void 0 : _a.trustCenterLinkKeySeed) {
275
- const tclkSeed = backup.znp.trustCenterLinkKeySeed;
276
- const extAddrReversed = Buffer.from(ame.extAddr).reverse();
277
- const extAddrRepeated = Buffer.concat([extAddrReversed, extAddrReversed]);
278
- const recoveredKey = Buffer.alloc(16);
279
- for (let i = 0; i < 16; i++) {
280
- recoveredKey[i] = device.linkKey.key[i] ^ extAddrRepeated[i];
281
- }
282
- let recoveredSeedShift = null;
283
- for (let i = 0; i < 16; i++) {
284
- const rotated = Buffer.concat([recoveredKey.slice(recoveredKey.length - i, recoveredKey.length), recoveredKey.slice(0, recoveredKey.length - i)]);
285
- if (rotated.equals(tclkSeed)) {
286
- recoveredSeedShift = i;
287
- break;
288
- }
289
- }
290
- if (recoveredSeedShift !== null) {
291
- ame.user |= structs_1.AddressManagerUser.Security;
292
- const tclkEntry = tclkTable.getNextFree();
293
- if (!tclkEntry) {
294
- throw new Error(`target adapter tclk table size insufficient (size=${tclkTable.capacity})`);
295
- }
296
- tclkEntry.extAddr = ame.extAddr;
297
- tclkEntry.SeedShift_IcIndex = recoveredSeedShift;
298
- tclkEntry.keyAttributes = 2;
299
- tclkEntry.keyType = 0;
300
- tclkEntry.rxFrmCntr = device.linkKey.rxCounter;
301
- tclkEntry.txFrmCntr = device.linkKey.txCounter + 2500;
302
- linkKeyProcessed = true;
303
- this.debug(`successfully recovered link key for ${device.ieeeAddress.toString("hex")} using tclk seed (shift=${recoveredSeedShift})`);
304
- }
305
- }
306
- /* attempt to create aps link key data entry */
307
- if (!linkKeyProcessed) {
308
- ame.user |= structs_1.AddressManagerUser.Security;
309
- const apsKeyDataEntry = apsLinkKeyDataTable.getNextFree();
310
- if (!apsKeyDataEntry) {
311
- throw new Error(`target adapter aps link key data table size insufficient (size=${apsLinkKeyDataTable.capacity})`);
312
- }
313
- apsKeyDataEntry.key = device.linkKey.key;
314
- apsKeyDataEntry.rxFrmCntr = device.linkKey.rxCounter;
315
- apsKeyDataEntry.txFrmCntr = device.linkKey.txCounter + 2500;
316
- const sme = securityManagerTable.getNextFree();
317
- if (!sme) {
318
- throw new Error(`target adapter security manager table size insufficient (size=${securityManagerTable.capacity})`);
319
- }
320
- sme.ami = addressManagerTable.indexOf(ame);
321
- sme.keyNvId = version === tstype_1.ZnpVersion.zStack3x0 ? apsLinkKeyDataTable.indexOf(apsKeyDataEntry) : common_1.NvItemsIds.APS_LINK_KEY_DATA_START + apsLinkKeyDataTable.indexOf(apsKeyDataEntry);
322
- sme.authenticationOption = structs_1.SecurityManagerAuthenticationOption.AuthenticatedCBCK;
323
- linkKeyProcessed = true;
324
- this.debug(`successfully recovered link key for ${device.ieeeAddress.toString("hex")} using aps key data table`);
325
- }
326
- }
327
- }
328
- /* recover coordinator ieee address */
329
- const reversedAdapterIeee = Buffer.from(backup.coordinatorIeeeAddress).reverse();
330
- await this.nv.writeItem(common_1.NvItemsIds.EXTADDR, reversedAdapterIeee);
331
- /* write updated nib */
332
- await this.nv.writeItem(common_1.NvItemsIds.NIB, nib);
333
- /* write network key info */
334
- await this.nv.updateItem(common_1.NvItemsIds.NWK_ACTIVE_KEY_INFO, keyDescriptor.serialize());
335
- await this.nv.updateItem(common_1.NvItemsIds.NWK_ALTERN_KEY_INFO, keyDescriptor.serialize());
336
- /* write tclk seed if present */
337
- if ((_b = backup.znp) === null || _b === void 0 ? void 0 : _b.trustCenterLinkKeySeed) {
338
- await this.nv.writeItem(common_1.NvItemsIds.TCLK_SEED, backup.znp.trustCenterLinkKeySeed);
339
- }
340
- /* write network security material table (nwk frame counters) */
341
- if (version === tstype_1.ZnpVersion.zStack3x0) {
342
- await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_NWK_SEC_MATERIAL_TABLE, nwkSecurityMaterialTable);
343
- }
344
- else {
345
- await this.nv.writeTable("legacy", common_1.NvItemsIds.LEGACY_NWK_SEC_MATERIAL_TABLE_START, nwkSecurityMaterialTable);
346
- }
347
- /* write address manager table */
348
- if (version === tstype_1.ZnpVersion.zStack3x0) {
349
- await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_ADDRMGR, addressManagerTable);
350
- }
351
- else {
352
- await this.nv.writeItem(common_1.NvItemsIds.ADDRMGR, addressManagerTable);
353
- }
354
- /* write security manager table */
355
- await this.nv.writeItem(common_1.NvItemsIds.APS_LINK_KEY_TABLE, securityManagerTable);
356
- /* write aps link key data table */
357
- if (version === tstype_1.ZnpVersion.zStack3x0) {
358
- await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_APS_KEY_DATA_TABLE, apsLinkKeyDataTable);
359
- }
360
- else {
361
- await this.nv.writeTable("legacy", common_1.NvItemsIds.APS_LINK_KEY_DATA_START, apsLinkKeyDataTable);
362
- }
363
- /* write tclk table */
364
- if (version === tstype_1.ZnpVersion.zStack3x0) {
365
- await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_TCLK_TABLE, tclkTable);
366
- }
367
- else {
368
- await this.nv.writeTable("legacy", common_1.NvItemsIds.LEGACY_TCLK_TABLE_START, tclkTable);
369
- }
370
- }
371
- /**
372
- * Acquires ZNP version internal to `zigbee-herdsman` from controller.
373
- *
374
- * *If Z-Stack 1.2 controller is detected an error is thrown, since Z-Stack 1.2 backup
375
- * and restore procedures are not supported.*
376
- */
377
- async getAdapterVersion() {
378
- const versionResponse = await this.znp.request(constants_1.Subsystem.SYS, "version", {});
379
- const version = versionResponse.payload.product;
380
- return version;
381
- }
382
- /**
383
- * Internal method to retrieve address manager table.
384
- *
385
- * @param version ZNP stack version the adapter is running.
386
- */
387
- async getAddressManagerTable(version) {
388
- if (version === tstype_1.ZnpVersion.zStack3x0) {
389
- return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_ADDRMGR, undefined, Structs.addressManagerTable);
390
- }
391
- else {
392
- return this.nv.readItem(common_1.NvItemsIds.ADDRMGR, 0, Structs.addressManagerTable);
393
- }
394
- }
395
- /**
396
- * Internal method to retrieve security manager table. Also referred to as APS Link Key Table.
397
- */
398
- async getSecurityManagerTable() {
399
- return this.nv.readItem(common_1.NvItemsIds.APS_LINK_KEY_TABLE, 0, Structs.securityManagerTable);
400
- }
401
- /**
402
- * Internal method to retrieve APS Link Key Data Table containing arbitrary APS link keys.
403
- *
404
- * @param version ZNP stack version the adapter is running.
405
- */
406
- async getApsLinkKeyDataTable(version) {
407
- if (version === tstype_1.ZnpVersion.zStack3x0) {
408
- return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_APS_KEY_DATA_TABLE, undefined, Structs.apsLinkKeyDataTable);
409
- }
410
- else {
411
- return this.nv.readTable("legacy", common_1.NvItemsIds.APS_LINK_KEY_DATA_START, 255, Structs.apsLinkKeyDataTable);
412
- }
413
- }
414
- /**
415
- * Internal method to retrieve Trust Center Link Key table which describes seed-based APS link keys for devices.
416
- *
417
- * @param version ZNP stack version the adapter is running.
418
- */
419
- async getTclkTable(version) {
420
- if (version === tstype_1.ZnpVersion.zStack3x0) {
421
- return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_TCLK_TABLE, undefined, Structs.apsTcLinkKeyTable);
422
- }
423
- else {
424
- return this.nv.readTable("legacy", common_1.NvItemsIds.LEGACY_TCLK_TABLE_START, 239, Structs.apsTcLinkKeyTable);
425
- }
426
- }
427
- /**
428
- * Internal method to retrieve network security material table, which contains network key frame counter.
429
- *
430
- * @param version ZNP stack version the adapter is running.
431
- */
432
- async getNetworkSecurityMaterialTable(version) {
433
- if (version === tstype_1.ZnpVersion.zStack3x0) {
434
- return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_NWK_SEC_MATERIAL_TABLE, undefined, Structs.nwkSecMaterialDescriptorTable);
435
- }
436
- else {
437
- return this.nv.readTable("legacy", common_1.NvItemsIds.LEGACY_NWK_SEC_MATERIAL_TABLE_START, 12, Structs.nwkSecMaterialDescriptorTable);
438
- }
439
- }
440
- }
441
- exports.AdapterBackup = AdapterBackup;
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.AdapterBackup = void 0;
30
+ /* eslint-disable max-len */
31
+ const debug_1 = __importDefault(require("debug"));
32
+ const Structs = __importStar(require("../structs"));
33
+ const Utils = __importStar(require("../utils"));
34
+ const utils_1 = require("../../../utils");
35
+ const mz_1 = require("mz");
36
+ const common_1 = require("../constants/common");
37
+ const constants_1 = require("../unpi/constants");
38
+ const tstype_1 = require("./tstype");
39
+ const structs_1 = require("../structs");
40
+ /**
41
+ * Class providing ZNP adapter backup and restore procedures based mostly on NV memory manipulation.
42
+ */
43
+ class AdapterBackup {
44
+ constructor(znp, nv, path) {
45
+ this.debug = (0, debug_1.default)("zigbee-herdsman:adapter:zStack:startup:backup");
46
+ this.znp = znp;
47
+ this.nv = nv;
48
+ this.defaultPath = path;
49
+ }
50
+ /**
51
+ * Loads currently stored backup and returns it in internal backup model.
52
+ */
53
+ async getStoredBackup() {
54
+ var _a, _b, _c, _d;
55
+ try {
56
+ await mz_1.fs.access(this.defaultPath);
57
+ }
58
+ catch (error) {
59
+ return null;
60
+ }
61
+ let data;
62
+ try {
63
+ data = JSON.parse((await mz_1.fs.readFile(this.defaultPath)).toString());
64
+ }
65
+ catch (error) {
66
+ throw new Error('Coordinator backup is corrupted');
67
+ }
68
+ if (((_a = data.metadata) === null || _a === void 0 ? void 0 : _a.format) === "zigpy/open-coordinator-backup" && ((_b = data.metadata) === null || _b === void 0 ? void 0 : _b.version)) {
69
+ if (((_c = data.metadata) === null || _c === void 0 ? void 0 : _c.version) !== 1) {
70
+ throw new Error(`Unsupported open coordinator backup version (version=${(_d = data.metadata) === null || _d === void 0 ? void 0 : _d.version})`);
71
+ }
72
+ return utils_1.BackupUtils.fromUnifiedBackup(data);
73
+ }
74
+ else if (data.adapterType === "zStack") {
75
+ return utils_1.BackupUtils.fromLegacyBackup(data);
76
+ }
77
+ else {
78
+ throw new Error("Unknown backup format");
79
+ }
80
+ }
81
+ /**
82
+ * Creates a new backup from connected ZNP adapter and returns it in internal backup model format.
83
+ */
84
+ async createBackup() {
85
+ this.debug("creating backup");
86
+ const version = await this.getAdapterVersion();
87
+ /* get adapter ieee address */
88
+ const ieeeAddressResponse = await this.znp.request(constants_1.Subsystem.SYS, "getExtAddr", {});
89
+ if (!ieeeAddressResponse || !ieeeAddressResponse.payload.extaddress || !ieeeAddressResponse.payload.extaddress.startsWith("0x")) {
90
+ throw new Error("Failed to read adapter IEEE address");
91
+ }
92
+ const ieeeAddress = Buffer.from(ieeeAddressResponse.payload.extaddress.split("0x")[1], "hex");
93
+ this.debug("fetched adapter ieee address");
94
+ /* get adapter nib */
95
+ const nib = await this.nv.readItem(common_1.NvItemsIds.NIB, 0, Structs.nib);
96
+ if (!nib) {
97
+ throw new Error("Cannot backup - adapter not commissioned");
98
+ }
99
+ this.debug("fetched adapter nib");
100
+ /* get adapter active key information */
101
+ let activeKeyInfo;
102
+ if (version === tstype_1.ZnpVersion.zStack12) {
103
+ const key = Structs.nwkKey((await this.znp.request(constants_1.Subsystem.SAPI, "readConfiguration", { configid: common_1.NvItemsIds.PRECFGKEY })).payload.value);
104
+ activeKeyInfo = Structs.nwkKeyDescriptor();
105
+ activeKeyInfo.key = key.key;
106
+ }
107
+ else {
108
+ activeKeyInfo = await this.nv.readItem(common_1.NvItemsIds.NWK_ACTIVE_KEY_INFO, 0, Structs.nwkKeyDescriptor);
109
+ }
110
+ if (!activeKeyInfo) {
111
+ throw new Error("Cannot backup - missing active key info");
112
+ }
113
+ this.debug("fetched adapter active key information");
114
+ /* get adapter security data */
115
+ const preconfiguredKeyEnabled = await this.nv.readItem(common_1.NvItemsIds.PRECFGKEYS_ENABLE, 0);
116
+ this.debug("fetched adapter pre-configured key");
117
+ const addressManagerTable = await this.getAddressManagerTable(version);
118
+ this.debug(`fetched adapter address manager table (capacity=${(addressManagerTable === null || addressManagerTable === void 0 ? void 0 : addressManagerTable.capacity) || 0}, used=${(addressManagerTable === null || addressManagerTable === void 0 ? void 0 : addressManagerTable.usedCount) || 0})`);
119
+ const securityManagerTable = await this.getSecurityManagerTable();
120
+ this.debug(`fetched adapter security manager table (capacity=${(securityManagerTable === null || securityManagerTable === void 0 ? void 0 : securityManagerTable.usedCount) || 0}, used=${(securityManagerTable === null || securityManagerTable === void 0 ? void 0 : securityManagerTable.usedCount) || 0})`);
121
+ const apsLinkKeyDataTable = await this.getApsLinkKeyDataTable(version);
122
+ this.debug(`fetched adapter aps link key data table (capacity=${(apsLinkKeyDataTable === null || apsLinkKeyDataTable === void 0 ? void 0 : apsLinkKeyDataTable.usedCount) || 0}, used=${(apsLinkKeyDataTable === null || apsLinkKeyDataTable === void 0 ? void 0 : apsLinkKeyDataTable.usedCount) || 0})`);
123
+ const tclkSeed = version === tstype_1.ZnpVersion.zStack12 ? null : await this.nv.readItem(common_1.NvItemsIds.TCLK_SEED, 0, Structs.nwkKey);
124
+ this.debug("fetched adapter tclk seed");
125
+ const tclkTable = await this.getTclkTable(version);
126
+ this.debug(`fetched adapter tclk table (capacity=${(tclkTable === null || tclkTable === void 0 ? void 0 : tclkTable.usedCount) || 0}, used=${(tclkTable === null || tclkTable === void 0 ? void 0 : tclkTable.usedCount) || 0})`);
127
+ const secMaterialTable = await this.getNetworkSecurityMaterialTable(version);
128
+ this.debug(`fetched adapter network security material table (capacity=${(secMaterialTable === null || secMaterialTable === void 0 ? void 0 : secMaterialTable.usedCount) || 0}, used=${(secMaterialTable === null || secMaterialTable === void 0 ? void 0 : secMaterialTable.usedCount) || 0})`);
129
+ /* examine network security material table */
130
+ const genericExtendedPanId = Buffer.alloc(8, 0xff);
131
+ let secMaterialDescriptor = null;
132
+ /* istanbul ignore next */
133
+ for (const entry of secMaterialTable.used) {
134
+ if (entry.extendedPanID.equals(nib.extendedPANID)) {
135
+ secMaterialDescriptor = entry;
136
+ break;
137
+ }
138
+ else if (!secMaterialDescriptor && entry.extendedPanID.equals(genericExtendedPanId)) {
139
+ secMaterialDescriptor = entry;
140
+ }
141
+ }
142
+ if (!secMaterialDescriptor) {
143
+ secMaterialDescriptor = Structs.nwkSecMaterialDescriptorEntry();
144
+ secMaterialDescriptor.extendedPanID = nib.extendedPANID;
145
+ secMaterialDescriptor.FrameCounter = version === tstype_1.ZnpVersion.zStack12 ? 0 : 1250;
146
+ }
147
+ /* return backup structure */
148
+ /* istanbul ignore next */
149
+ return {
150
+ znp: {
151
+ version: version,
152
+ trustCenterLinkKeySeed: (tclkSeed === null || tclkSeed === void 0 ? void 0 : tclkSeed.key) || undefined
153
+ },
154
+ networkOptions: {
155
+ panId: nib.nwkPanId,
156
+ extendedPanId: nib.extendedPANID,
157
+ channelList: Utils.unpackChannelList(nib.channelList),
158
+ networkKey: activeKeyInfo.key,
159
+ networkKeyDistribute: preconfiguredKeyEnabled && preconfiguredKeyEnabled[0] === 0x01
160
+ },
161
+ logicalChannel: nib.nwkLogicalChannel,
162
+ networkKeyInfo: {
163
+ sequenceNumber: activeKeyInfo.keySeqNum,
164
+ frameCounter: secMaterialDescriptor.FrameCounter
165
+ },
166
+ securityLevel: nib.SecurityLevel,
167
+ networkUpdateId: nib.nwkUpdateId,
168
+ coordinatorIeeeAddress: ieeeAddress,
169
+ devices: addressManagerTable && addressManagerTable.used.map((ame, ami) => {
170
+ /* take all entries of assoc and/or security type */
171
+ if (!ame.isSet() || (ame.user & (structs_1.AddressManagerUser.Assoc | structs_1.AddressManagerUser.Security)) === 0) {
172
+ /* istanbul ignore next */
173
+ return null;
174
+ }
175
+ let linkKeyInfo = null;
176
+ const sme = securityManagerTable.used.find(e => e.ami === ami);
177
+ if (sme) {
178
+ const apsKeyDataIndex = version === tstype_1.ZnpVersion.zStack30x ? sme.keyNvId - common_1.NvItemsIds.APS_LINK_KEY_DATA_START : sme.keyNvId;
179
+ const apsKeyData = apsLinkKeyDataTable.used[apsKeyDataIndex] || null;
180
+ if (apsKeyData) {
181
+ linkKeyInfo = {
182
+ key: apsKeyData.key,
183
+ rxCounter: apsKeyData.rxFrmCntr,
184
+ txCounter: apsKeyData.txFrmCntr
185
+ };
186
+ }
187
+ }
188
+ else {
189
+ const tclkTableEntry = tclkTable.used.find(e => e.extAddr.equals(ame.extAddr));
190
+ if (tclkTableEntry) {
191
+ const rotatedSeed = Buffer.concat([tclkSeed.key.slice(tclkTableEntry.SeedShift_IcIndex), tclkSeed.key.slice(0, tclkTableEntry.SeedShift_IcIndex)]);
192
+ const extAddrReversed = Buffer.from(ame.extAddr).reverse();
193
+ const extAddrRepeated = Buffer.concat([extAddrReversed, extAddrReversed]);
194
+ const derivedKey = Buffer.alloc(16);
195
+ for (let i = 0; i < 16; i++) {
196
+ derivedKey[i] = rotatedSeed[i] ^ extAddrRepeated[i];
197
+ }
198
+ linkKeyInfo = {
199
+ key: derivedKey,
200
+ rxCounter: tclkTableEntry.rxFrmCntr,
201
+ txCounter: tclkTableEntry.txFrmCntr
202
+ };
203
+ }
204
+ }
205
+ return {
206
+ networkAddress: ame.nwkAddr,
207
+ ieeeAddress: ame.extAddr,
208
+ isDirectChild: (ame.user & structs_1.AddressManagerUser.Assoc) > 0,
209
+ linkKey: !linkKeyInfo ? undefined : linkKeyInfo
210
+ };
211
+ }).filter(e => e) || []
212
+ };
213
+ }
214
+ /**
215
+ * Restores a structure in internal backup format to connected ZNP adapter.
216
+ *
217
+ * @param backup Backup to restore to connected adapter.
218
+ */
219
+ async restoreBackup(backup) {
220
+ var _a, _b;
221
+ this.debug("restoring backup");
222
+ const version = await this.getAdapterVersion();
223
+ /* istanbul ignore next */
224
+ if (version === tstype_1.ZnpVersion.zStack12) {
225
+ throw new Error("backup cannot be restored on Z-Stack 1.2 adapter");
226
+ }
227
+ /* fetch provisional NIB */
228
+ const nib = await this.nv.readItem(common_1.NvItemsIds.NIB, 0, Structs.nib);
229
+ /* update NIB with desired nwk config */
230
+ nib.nwkPanId = backup.networkOptions.panId;
231
+ nib.channelList = Utils.packChannelList(backup.networkOptions.channelList);
232
+ nib.nwkLogicalChannel = backup.networkOptions.channelList[0];
233
+ nib.extendedPANID = backup.networkOptions.extendedPanId;
234
+ nib.SecurityLevel = backup.securityLevel;
235
+ nib.nwkUpdateId = backup.networkUpdateId;
236
+ /* prepare key info */
237
+ const keyDescriptor = Structs.nwkKeyDescriptor();
238
+ keyDescriptor.keySeqNum = backup.networkKeyInfo.sequenceNumber || 0;
239
+ keyDescriptor.key = backup.networkOptions.networkKey;
240
+ /* determine table sizes */
241
+ const currentAddressManagerTable = await this.getAddressManagerTable(version);
242
+ const currentSecurityManagerTable = await this.getSecurityManagerTable();
243
+ const currentApsLinkKeyDataTable = await this.getApsLinkKeyDataTable(version);
244
+ const currentTclkTable = await this.getTclkTable(version);
245
+ const currentNwkSecMaterialTable = await this.getNetworkSecurityMaterialTable(version);
246
+ this.debug(`got target adapter table sizes:`);
247
+ this.debug(` - address manager table: ${currentAddressManagerTable.capacity}`);
248
+ this.debug(` - security manager table: ${currentSecurityManagerTable.capacity}`);
249
+ this.debug(` - aps link key data table: ${currentApsLinkKeyDataTable.capacity}`);
250
+ this.debug(` - tclk table: ${currentTclkTable.capacity}`);
251
+ this.debug(` - network security material table: ${currentNwkSecMaterialTable.capacity}`);
252
+ /* prepare table structures */
253
+ const addressManagerTable = Structs.addressManagerTable(currentAddressManagerTable.capacity);
254
+ const securityManagerTable = Structs.securityManagerTable(currentSecurityManagerTable.capacity);
255
+ const apsLinkKeyDataTable = Structs.apsLinkKeyDataTable(currentApsLinkKeyDataTable.capacity);
256
+ const tclkTable = Structs.apsTcLinkKeyTable(currentTclkTable.capacity);
257
+ const nwkSecurityMaterialTable = Structs.nwkSecMaterialDescriptorTable(currentNwkSecMaterialTable.capacity);
258
+ /* prepare security material table (nwk frame counters) */
259
+ const mwkSecMaterialEntry = nwkSecurityMaterialTable.entries[0];
260
+ mwkSecMaterialEntry.extendedPanID = backup.networkOptions.extendedPanId;
261
+ mwkSecMaterialEntry.FrameCounter = backup.networkKeyInfo.frameCounter + 2500;
262
+ const genericNwkSecMaterialEntry = nwkSecurityMaterialTable.entries[nwkSecurityMaterialTable.capacity - 1];
263
+ genericNwkSecMaterialEntry.extendedPanID = Buffer.alloc(8, 0xff);
264
+ genericNwkSecMaterialEntry.FrameCounter = backup.networkKeyInfo.frameCounter + 2500;
265
+ /* populate device & security tables and write them */
266
+ for (const device of backup.devices) {
267
+ const ame = addressManagerTable.getNextFree();
268
+ ame.nwkAddr = device.networkAddress;
269
+ ame.extAddr = device.ieeeAddress;
270
+ ame.user = device.isDirectChild ? structs_1.AddressManagerUser.Assoc : structs_1.AddressManagerUser.Default;
271
+ if (device.linkKey) {
272
+ let linkKeyProcessed = false;
273
+ /* attempt to recover tclk seed parameters (if available) */
274
+ if ((_a = backup.znp) === null || _a === void 0 ? void 0 : _a.trustCenterLinkKeySeed) {
275
+ const tclkSeed = backup.znp.trustCenterLinkKeySeed;
276
+ const extAddrReversed = Buffer.from(ame.extAddr).reverse();
277
+ const extAddrRepeated = Buffer.concat([extAddrReversed, extAddrReversed]);
278
+ const recoveredKey = Buffer.alloc(16);
279
+ for (let i = 0; i < 16; i++) {
280
+ recoveredKey[i] = device.linkKey.key[i] ^ extAddrRepeated[i];
281
+ }
282
+ let recoveredSeedShift = null;
283
+ for (let i = 0; i < 16; i++) {
284
+ const rotated = Buffer.concat([recoveredKey.slice(recoveredKey.length - i, recoveredKey.length), recoveredKey.slice(0, recoveredKey.length - i)]);
285
+ if (rotated.equals(tclkSeed)) {
286
+ recoveredSeedShift = i;
287
+ break;
288
+ }
289
+ }
290
+ if (recoveredSeedShift !== null) {
291
+ ame.user |= structs_1.AddressManagerUser.Security;
292
+ const tclkEntry = tclkTable.getNextFree();
293
+ if (!tclkEntry) {
294
+ throw new Error(`target adapter tclk table size insufficient (size=${tclkTable.capacity})`);
295
+ }
296
+ tclkEntry.extAddr = ame.extAddr;
297
+ tclkEntry.SeedShift_IcIndex = recoveredSeedShift;
298
+ tclkEntry.keyAttributes = 2;
299
+ tclkEntry.keyType = 0;
300
+ tclkEntry.rxFrmCntr = device.linkKey.rxCounter;
301
+ tclkEntry.txFrmCntr = device.linkKey.txCounter + 2500;
302
+ linkKeyProcessed = true;
303
+ this.debug(`successfully recovered link key for ${device.ieeeAddress.toString("hex")} using tclk seed (shift=${recoveredSeedShift})`);
304
+ }
305
+ }
306
+ /* attempt to create aps link key data entry */
307
+ if (!linkKeyProcessed) {
308
+ ame.user |= structs_1.AddressManagerUser.Security;
309
+ const apsKeyDataEntry = apsLinkKeyDataTable.getNextFree();
310
+ if (!apsKeyDataEntry) {
311
+ throw new Error(`target adapter aps link key data table size insufficient (size=${apsLinkKeyDataTable.capacity})`);
312
+ }
313
+ apsKeyDataEntry.key = device.linkKey.key;
314
+ apsKeyDataEntry.rxFrmCntr = device.linkKey.rxCounter;
315
+ apsKeyDataEntry.txFrmCntr = device.linkKey.txCounter + 2500;
316
+ const sme = securityManagerTable.getNextFree();
317
+ if (!sme) {
318
+ throw new Error(`target adapter security manager table size insufficient (size=${securityManagerTable.capacity})`);
319
+ }
320
+ sme.ami = addressManagerTable.indexOf(ame);
321
+ sme.keyNvId = version === tstype_1.ZnpVersion.zStack3x0 ? apsLinkKeyDataTable.indexOf(apsKeyDataEntry) : common_1.NvItemsIds.APS_LINK_KEY_DATA_START + apsLinkKeyDataTable.indexOf(apsKeyDataEntry);
322
+ sme.authenticationOption = structs_1.SecurityManagerAuthenticationOption.AuthenticatedCBCK;
323
+ linkKeyProcessed = true;
324
+ this.debug(`successfully recovered link key for ${device.ieeeAddress.toString("hex")} using aps key data table`);
325
+ }
326
+ }
327
+ }
328
+ /* recover coordinator ieee address */
329
+ const reversedAdapterIeee = Buffer.from(backup.coordinatorIeeeAddress).reverse();
330
+ await this.nv.writeItem(common_1.NvItemsIds.EXTADDR, reversedAdapterIeee);
331
+ /* write updated nib */
332
+ await this.nv.writeItem(common_1.NvItemsIds.NIB, nib);
333
+ /* write network key info */
334
+ await this.nv.updateItem(common_1.NvItemsIds.NWK_ACTIVE_KEY_INFO, keyDescriptor.serialize());
335
+ await this.nv.updateItem(common_1.NvItemsIds.NWK_ALTERN_KEY_INFO, keyDescriptor.serialize());
336
+ /* write tclk seed if present */
337
+ if ((_b = backup.znp) === null || _b === void 0 ? void 0 : _b.trustCenterLinkKeySeed) {
338
+ await this.nv.writeItem(common_1.NvItemsIds.TCLK_SEED, backup.znp.trustCenterLinkKeySeed);
339
+ }
340
+ /* write network security material table (nwk frame counters) */
341
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
342
+ await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_NWK_SEC_MATERIAL_TABLE, nwkSecurityMaterialTable);
343
+ }
344
+ else {
345
+ await this.nv.writeTable("legacy", common_1.NvItemsIds.LEGACY_NWK_SEC_MATERIAL_TABLE_START, nwkSecurityMaterialTable);
346
+ }
347
+ /* write address manager table */
348
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
349
+ await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_ADDRMGR, addressManagerTable);
350
+ }
351
+ else {
352
+ await this.nv.writeItem(common_1.NvItemsIds.ADDRMGR, addressManagerTable);
353
+ }
354
+ /* write security manager table */
355
+ await this.nv.writeItem(common_1.NvItemsIds.APS_LINK_KEY_TABLE, securityManagerTable);
356
+ /* write aps link key data table */
357
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
358
+ await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_APS_KEY_DATA_TABLE, apsLinkKeyDataTable);
359
+ }
360
+ else {
361
+ await this.nv.writeTable("legacy", common_1.NvItemsIds.APS_LINK_KEY_DATA_START, apsLinkKeyDataTable);
362
+ }
363
+ /* write tclk table */
364
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
365
+ await this.nv.writeTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_TCLK_TABLE, tclkTable);
366
+ }
367
+ else {
368
+ await this.nv.writeTable("legacy", common_1.NvItemsIds.LEGACY_TCLK_TABLE_START, tclkTable);
369
+ }
370
+ }
371
+ /**
372
+ * Acquires ZNP version internal to `zigbee-herdsman` from controller.
373
+ *
374
+ * *If Z-Stack 1.2 controller is detected an error is thrown, since Z-Stack 1.2 backup
375
+ * and restore procedures are not supported.*
376
+ */
377
+ async getAdapterVersion() {
378
+ const versionResponse = await this.znp.request(constants_1.Subsystem.SYS, "version", {});
379
+ const version = versionResponse.payload.product;
380
+ return version;
381
+ }
382
+ /**
383
+ * Internal method to retrieve address manager table.
384
+ *
385
+ * @param version ZNP stack version the adapter is running.
386
+ */
387
+ async getAddressManagerTable(version) {
388
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
389
+ return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_ADDRMGR, undefined, Structs.addressManagerTable);
390
+ }
391
+ else {
392
+ return this.nv.readItem(common_1.NvItemsIds.ADDRMGR, 0, Structs.addressManagerTable);
393
+ }
394
+ }
395
+ /**
396
+ * Internal method to retrieve security manager table. Also referred to as APS Link Key Table.
397
+ */
398
+ async getSecurityManagerTable() {
399
+ return this.nv.readItem(common_1.NvItemsIds.APS_LINK_KEY_TABLE, 0, Structs.securityManagerTable);
400
+ }
401
+ /**
402
+ * Internal method to retrieve APS Link Key Data Table containing arbitrary APS link keys.
403
+ *
404
+ * @param version ZNP stack version the adapter is running.
405
+ */
406
+ async getApsLinkKeyDataTable(version) {
407
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
408
+ return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.ZCD_NV_EX_APS_KEY_DATA_TABLE, undefined, Structs.apsLinkKeyDataTable);
409
+ }
410
+ else {
411
+ return this.nv.readTable("legacy", common_1.NvItemsIds.APS_LINK_KEY_DATA_START, 255, Structs.apsLinkKeyDataTable);
412
+ }
413
+ }
414
+ /**
415
+ * Internal method to retrieve Trust Center Link Key table which describes seed-based APS link keys for devices.
416
+ *
417
+ * @param version ZNP stack version the adapter is running.
418
+ */
419
+ async getTclkTable(version) {
420
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
421
+ return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_TCLK_TABLE, undefined, Structs.apsTcLinkKeyTable);
422
+ }
423
+ else {
424
+ return this.nv.readTable("legacy", common_1.NvItemsIds.LEGACY_TCLK_TABLE_START, 239, Structs.apsTcLinkKeyTable);
425
+ }
426
+ }
427
+ /**
428
+ * Internal method to retrieve network security material table, which contains network key frame counter.
429
+ *
430
+ * @param version ZNP stack version the adapter is running.
431
+ */
432
+ async getNetworkSecurityMaterialTable(version) {
433
+ if (version === tstype_1.ZnpVersion.zStack3x0) {
434
+ return this.nv.readTable("extended", common_1.NvSystemIds.ZSTACK, common_1.NvItemsIds.EX_NWK_SEC_MATERIAL_TABLE, undefined, Structs.nwkSecMaterialDescriptorTable);
435
+ }
436
+ else {
437
+ return this.nv.readTable("legacy", common_1.NvItemsIds.LEGACY_NWK_SEC_MATERIAL_TABLE_START, 12, Structs.nwkSecMaterialDescriptorTable);
438
+ }
439
+ }
440
+ }
441
+ exports.AdapterBackup = AdapterBackup;
442
442
  //# sourceMappingURL=adapter-backup.js.map