@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.
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/copilot-instructions.md +689 -0
- package/.github/dependabot.yml +22 -0
- package/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +294 -0
- package/.github/prompts/create-agentsmd.prompt.md +249 -0
- package/.github/prompts/create-specification.prompt.md +127 -0
- package/.github/prompts/review-and-refactor.prompt.md +15 -0
- package/.github/prompts/update-specification.prompt.md +127 -0
- package/.github/workflows/ci.yml +70 -0
- package/.github/workflows/release-please.yml +18 -0
- package/.github/workflows/stale.yml +20 -0
- package/.github/workflows/typedoc.yaml +47 -0
- package/.release-please-manifest.json +2 -2
- package/.vscode/extensions.json +3 -0
- package/.vscode/settings.json +11 -0
- package/AGENTS.md +441 -0
- package/CHANGELOG.md +1245 -0
- package/README.md +2 -2
- package/biome.json +103 -0
- package/examples/join-and-log.js +18 -18
- package/package.json +83 -70
- package/release-please-config.json +8 -8
- package/scripts/check-clusters-changes.ts +328 -0
- package/scripts/clusters-changes.log +584 -0
- package/scripts/clusters-typegen.ts +608 -0
- package/scripts/utils.ts +88 -0
- package/scripts/zap-update-clusters-report.json +303 -0
- package/scripts/zap-update-clusters.ts +1520 -0
- package/scripts/zap-update-types.ts +707 -0
- package/scripts/zap-xml-clusters-overrides-data.ts +52 -0
- package/scripts/zap-xml-clusters-overrides.ts +400 -0
- package/scripts/zap-xml-types.ts +146 -0
- package/src/adapter/adapter.ts +210 -0
- package/src/adapter/adapterDiscovery.ts +736 -0
- package/src/adapter/const.ts +12 -0
- package/src/adapter/deconz/adapter/deconzAdapter.ts +888 -0
- package/src/adapter/deconz/driver/constants.ts +246 -0
- package/src/adapter/deconz/driver/driver.ts +1528 -0
- package/src/adapter/deconz/driver/frame.ts +11 -0
- package/src/adapter/deconz/driver/frameParser.ts +766 -0
- package/src/adapter/deconz/driver/parser.ts +45 -0
- package/src/adapter/deconz/driver/writer.ts +22 -0
- package/src/adapter/deconz/types.d.ts +13 -0
- package/src/adapter/ember/adapter/emberAdapter.ts +2262 -0
- package/src/adapter/ember/adapter/endpoints.ts +86 -0
- package/src/adapter/ember/adapter/oneWaitress.ts +324 -0
- package/src/adapter/ember/adapter/tokensManager.ts +780 -0
- package/src/adapter/ember/consts.ts +178 -0
- package/src/adapter/ember/enums.ts +1746 -0
- package/src/adapter/ember/ezsp/buffalo.ts +1392 -0
- package/src/adapter/ember/ezsp/consts.ts +148 -0
- package/src/adapter/ember/ezsp/enums.ts +1114 -0
- package/src/adapter/ember/ezsp/ezsp.ts +9073 -0
- package/src/adapter/ember/ezspError.ts +10 -0
- package/src/adapter/ember/types.ts +866 -0
- package/src/adapter/ember/uart/ash.ts +1933 -0
- package/src/adapter/ember/uart/consts.ts +109 -0
- package/src/adapter/ember/uart/enums.ts +192 -0
- package/src/adapter/ember/uart/parser.ts +42 -0
- package/src/adapter/ember/uart/queues.ts +247 -0
- package/src/adapter/ember/uart/writer.ts +50 -0
- package/src/adapter/ember/utils/initters.ts +58 -0
- package/src/adapter/ember/utils/math.ts +71 -0
- package/src/adapter/events.ts +21 -0
- package/src/adapter/ezsp/adapter/backup.ts +100 -0
- package/src/adapter/ezsp/adapter/ezspAdapter.ts +632 -0
- package/src/adapter/ezsp/driver/commands.ts +2497 -0
- package/src/adapter/ezsp/driver/consts.ts +11 -0
- package/src/adapter/ezsp/driver/driver.ts +1002 -0
- package/src/adapter/ezsp/driver/ezsp.ts +802 -0
- package/src/adapter/ezsp/driver/frame.ts +101 -0
- package/src/adapter/ezsp/driver/index.ts +4 -0
- package/src/adapter/ezsp/driver/multicast.ts +78 -0
- package/src/adapter/ezsp/driver/parser.ts +81 -0
- package/src/adapter/ezsp/driver/types/basic.ts +201 -0
- package/src/adapter/ezsp/driver/types/index.ts +239 -0
- package/src/adapter/ezsp/driver/types/named.ts +2330 -0
- package/src/adapter/ezsp/driver/types/struct.ts +844 -0
- package/src/adapter/ezsp/driver/uart.ts +460 -0
- package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
- package/src/adapter/ezsp/driver/utils/index.ts +32 -0
- package/src/adapter/ezsp/driver/writer.ts +64 -0
- package/src/adapter/index.ts +3 -0
- package/src/adapter/serialPort.ts +58 -0
- package/src/adapter/tstype.ts +57 -0
- package/src/adapter/utils.ts +41 -0
- package/src/adapter/z-stack/adapter/adapter-backup.ts +509 -0
- package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
- package/src/adapter/z-stack/adapter/endpoints.ts +60 -0
- package/src/adapter/z-stack/adapter/manager.ts +543 -0
- package/src/adapter/z-stack/adapter/tstype.ts +6 -0
- package/src/adapter/z-stack/adapter/zStackAdapter.ts +1350 -0
- package/src/adapter/z-stack/constants/af.ts +27 -0
- package/src/adapter/z-stack/constants/common.ts +285 -0
- package/src/adapter/z-stack/constants/dbg.ts +23 -0
- package/src/adapter/z-stack/constants/index.ts +11 -0
- package/src/adapter/z-stack/constants/mac.ts +128 -0
- package/src/adapter/z-stack/constants/sapi.ts +25 -0
- package/src/adapter/z-stack/constants/sys.ts +72 -0
- package/src/adapter/z-stack/constants/util.ts +82 -0
- package/src/adapter/z-stack/constants/utils.ts +14 -0
- package/src/adapter/z-stack/constants/zdo.ts +103 -0
- package/src/adapter/z-stack/models/startup-options.ts +13 -0
- package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
- package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
- package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
- package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
- package/src/adapter/z-stack/structs/entries/index.ts +16 -0
- package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
- package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
- package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
- package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
- package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
- package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
- package/src/adapter/z-stack/structs/index.ts +4 -0
- package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
- package/src/adapter/z-stack/structs/struct.ts +367 -0
- package/src/adapter/z-stack/structs/table.ts +198 -0
- package/src/adapter/z-stack/unpi/constants.ts +33 -0
- package/src/adapter/z-stack/unpi/frame.ts +62 -0
- package/src/adapter/z-stack/unpi/index.ts +4 -0
- package/src/adapter/z-stack/unpi/parser.ts +67 -0
- package/src/adapter/z-stack/unpi/writer.ts +37 -0
- package/src/adapter/z-stack/utils/channel-list.ts +40 -0
- package/src/adapter/z-stack/utils/index.ts +2 -0
- package/src/adapter/z-stack/utils/network-options.ts +26 -0
- package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
- package/src/adapter/z-stack/znp/definition.ts +2713 -0
- package/src/adapter/z-stack/znp/index.ts +2 -0
- package/src/adapter/z-stack/znp/parameterType.ts +22 -0
- package/src/adapter/z-stack/znp/tstype.ts +44 -0
- package/src/adapter/z-stack/znp/utils.ts +10 -0
- package/src/adapter/z-stack/znp/znp.ts +345 -0
- package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
- package/src/adapter/zboss/adapter/zbossAdapter.ts +535 -0
- package/src/adapter/zboss/commands.ts +1184 -0
- package/src/adapter/zboss/consts.ts +9 -0
- package/src/adapter/zboss/driver.ts +422 -0
- package/src/adapter/zboss/enums.ts +360 -0
- package/src/adapter/zboss/frame.ts +227 -0
- package/src/adapter/zboss/reader.ts +65 -0
- package/src/adapter/zboss/types.ts +0 -0
- package/src/adapter/zboss/uart.ts +428 -0
- package/src/adapter/zboss/utils.ts +58 -0
- package/src/adapter/zboss/writer.ts +49 -0
- package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +25 -0
- package/src/adapter/zigate/adapter/zigateAdapter.ts +633 -0
- package/src/adapter/zigate/driver/LICENSE +17 -0
- package/src/adapter/zigate/driver/buffaloZiGate.ts +210 -0
- package/src/adapter/zigate/driver/commandType.ts +418 -0
- package/src/adapter/zigate/driver/constants.ts +150 -0
- package/src/adapter/zigate/driver/frame.ts +197 -0
- package/src/adapter/zigate/driver/messageType.ts +287 -0
- package/src/adapter/zigate/driver/parameterType.ts +32 -0
- package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
- package/src/adapter/zigate/driver/zigate.ts +422 -0
- package/src/adapter/zoh/adapter/utils.ts +27 -0
- package/src/adapter/zoh/adapter/zohAdapter.ts +931 -0
- package/src/buffalo/buffalo.ts +336 -0
- package/src/buffalo/index.ts +1 -0
- package/src/controller/controller.ts +1159 -0
- package/src/controller/database.ts +148 -0
- package/src/controller/events.ts +52 -0
- package/src/controller/greenPower.ts +613 -0
- package/src/controller/helpers/index.ts +1 -0
- package/src/controller/helpers/installCodes.ts +107 -0
- package/src/controller/helpers/ota.ts +575 -0
- package/src/controller/helpers/request.ts +96 -0
- package/src/controller/helpers/requestQueue.ts +126 -0
- package/src/controller/helpers/zclFrameConverter.ts +64 -0
- package/src/controller/helpers/zclTransactionSequenceNumber.ts +15 -0
- package/src/controller/index.ts +6 -0
- package/src/controller/model/device.ts +1791 -0
- package/src/controller/model/endpoint.ts +1235 -0
- package/src/controller/model/entity.ts +43 -0
- package/src/controller/model/group.ts +446 -0
- package/src/controller/model/index.ts +5 -0
- package/src/controller/model/konnextConfig.ts +6 -0
- package/src/controller/model/zigbeeEntity.ts +30 -0
- package/src/controller/touchlink.ts +195 -0
- package/src/controller/tstype.ts +374 -0
- package/src/index.ts +14 -0
- package/src/models/backup-storage-legacy.ts +48 -0
- package/src/models/backup-storage-unified.ts +47 -0
- package/src/models/backup.ts +37 -0
- package/src/models/index.ts +5 -0
- package/src/models/network-options.ts +11 -0
- package/src/utils/aes.ts +218 -0
- package/src/utils/async-mutex.ts +31 -0
- package/src/utils/backup.ts +152 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/logger.ts +20 -0
- package/src/utils/patchBigIntSerialization.ts +8 -0
- package/src/utils/queue.ts +79 -0
- package/src/utils/timeService.ts +139 -0
- package/src/utils/utils.ts +19 -0
- package/src/utils/wait.ts +5 -0
- package/src/utils/waitress.ts +96 -0
- package/src/zspec/consts.ts +89 -0
- package/src/zspec/enums.ts +22 -0
- package/src/zspec/index.ts +3 -0
- package/src/zspec/tstypes.ts +18 -0
- package/src/zspec/utils.ts +247 -0
- package/src/zspec/zcl/buffaloZcl.ts +1073 -0
- package/src/zspec/zcl/definition/cluster.ts +7845 -0
- package/src/zspec/zcl/definition/clusters-types.ts +8577 -0
- package/src/zspec/zcl/definition/consts.ts +24 -0
- package/src/zspec/zcl/definition/datatypes.ts +2454 -0
- package/src/zspec/zcl/definition/enums.ts +224 -0
- package/src/zspec/zcl/definition/foundation.ts +342 -0
- package/src/zspec/zcl/definition/manufacturerCode.ts +730 -0
- package/src/zspec/zcl/definition/status.ts +69 -0
- package/src/zspec/zcl/definition/tstype.ts +446 -0
- package/src/zspec/zcl/index.ts +11 -0
- package/src/zspec/zcl/utils.ts +521 -0
- package/src/zspec/zcl/zclFrame.ts +383 -0
- package/src/zspec/zcl/zclHeader.ts +102 -0
- package/src/zspec/zcl/zclStatusError.ts +10 -0
- package/src/zspec/zdo/buffaloZdo.ts +2336 -0
- package/src/zspec/zdo/definition/clusters.ts +722 -0
- package/src/zspec/zdo/definition/consts.ts +16 -0
- package/src/zspec/zdo/definition/enums.ts +99 -0
- package/src/zspec/zdo/definition/status.ts +105 -0
- package/src/zspec/zdo/definition/tstypes.ts +1062 -0
- package/src/zspec/zdo/index.ts +7 -0
- package/src/zspec/zdo/utils.ts +76 -0
- package/src/zspec/zdo/zdoStatusError.ts +10 -0
- package/test/adapter/adapter.test.ts +1276 -0
- package/test/adapter/ember/ash.test.ts +337 -0
- package/test/adapter/ember/consts.ts +131 -0
- package/test/adapter/ember/emberAdapter.test.ts +3447 -0
- package/test/adapter/ember/ezsp.test.ts +389 -0
- package/test/adapter/ember/ezspBuffalo.test.ts +93 -0
- package/test/adapter/ember/ezspError.test.ts +12 -0
- package/test/adapter/ember/math.test.ts +190 -0
- package/test/adapter/ezsp/frame.test.ts +30 -0
- package/test/adapter/ezsp/uart.test.ts +181 -0
- package/test/adapter/z-stack/adapter.test.ts +4260 -0
- package/test/adapter/z-stack/constants.test.ts +33 -0
- package/test/adapter/z-stack/structs.test.ts +115 -0
- package/test/adapter/z-stack/unpi.test.ts +213 -0
- package/test/adapter/z-stack/znp.test.ts +1288 -0
- package/test/adapter/zboss/fixZdoResponse.test.ts +179 -0
- package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +81 -0
- package/test/adapter/zigate/zdo.test.ts +187 -0
- package/test/adapter/zoh/utils.test.ts +36 -0
- package/test/adapter/zoh/zohAdapter.test.ts +1451 -0
- package/test/benchOptions.ts +14 -0
- package/test/buffalo.test.ts +431 -0
- package/test/controller.bench.ts +215 -0
- package/test/controller.test.ts +10030 -0
- package/test/data/integrity-code-1166-012B-24031511-upgradeMe-RB 249 T.zigbee +0 -0
- package/test/data/manuf-tags-tradfri-cv-cct-unified_release_prod_v587757105_33e34452-9267-4665-bc5a-844c8f61f063.ota +0 -0
- package/test/data/padded-tretakt_smart_plug_soc-0x1100-2.4.25-prod.ota.ota.signed +0 -0
- package/test/data/telink-aes-A60_RGBW_T-0x00B6-0x03483712-MF_DIS.OTA +0 -0
- package/test/data/zbminir2_v1.0.8.ota +0 -0
- package/test/device-ota.test.ts +3332 -0
- package/test/greenpower.test.ts +1409 -0
- package/test/mockAdapters.ts +95 -0
- package/test/mockDevices.ts +623 -0
- package/test/requests.bench.ts +321 -0
- package/test/testUtils.ts +20 -0
- package/test/timeService.test.ts +214 -0
- package/test/tsconfig.json +9 -0
- package/test/utils/math.ts +19 -0
- package/test/utils.test.ts +352 -0
- package/test/vitest.config.mts +28 -0
- package/test/vitest.ts +9 -0
- package/test/zcl.test.ts +2858 -0
- package/test/zspec/utils.test.ts +68 -0
- package/test/zspec/zcl/buffalo.test.ts +1316 -0
- package/test/zspec/zcl/frame.test.ts +1056 -0
- package/test/zspec/zcl/utils.test.ts +650 -0
- package/test/zspec/zdo/buffalo.test.ts +1850 -0
- package/test/zspec/zdo/utils.test.ts +241 -0
- package/tsconfig.json +8 -10
- package/.babelrc.js +0 -6
- package/.eslintignore +0 -3
- package/dist/adapter/adapter.d.ts +0 -64
- package/dist/adapter/adapter.d.ts.map +0 -1
- package/dist/adapter/adapter.js +0 -157
- package/dist/adapter/adapter.js.map +0 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +0 -71
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +0 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.js +0 -1072
- package/dist/adapter/deconz/adapter/deconzAdapter.js.map +0 -1
- package/dist/adapter/deconz/adapter/index.d.ts +0 -3
- package/dist/adapter/deconz/adapter/index.d.ts.map +0 -1
- package/dist/adapter/deconz/adapter/index.js +0 -11
- package/dist/adapter/deconz/adapter/index.js.map +0 -1
- package/dist/adapter/deconz/driver/constants.d.ts +0 -105
- package/dist/adapter/deconz/driver/constants.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/constants.js +0 -56
- package/dist/adapter/deconz/driver/constants.js.map +0 -1
- package/dist/adapter/deconz/driver/driver.d.ts +0 -82
- package/dist/adapter/deconz/driver/driver.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/driver.js +0 -751
- package/dist/adapter/deconz/driver/driver.js.map +0 -1
- package/dist/adapter/deconz/driver/frame.d.ts +0 -7
- package/dist/adapter/deconz/driver/frame.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/frame.js +0 -14
- package/dist/adapter/deconz/driver/frame.js.map +0 -1
- package/dist/adapter/deconz/driver/frameParser.d.ts +0 -3
- package/dist/adapter/deconz/driver/frameParser.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/frameParser.js +0 -444
- package/dist/adapter/deconz/driver/frameParser.js.map +0 -1
- package/dist/adapter/deconz/driver/parser.d.ts +0 -13
- package/dist/adapter/deconz/driver/parser.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/parser.js +0 -64
- package/dist/adapter/deconz/driver/parser.js.map +0 -1
- package/dist/adapter/deconz/driver/writer.d.ts +0 -9
- package/dist/adapter/deconz/driver/writer.d.ts.map +0 -1
- package/dist/adapter/deconz/driver/writer.js +0 -45
- package/dist/adapter/deconz/driver/writer.js.map +0 -1
- package/dist/adapter/ember/adapter/emberAdapter.d.ts +0 -806
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/emberAdapter.js +0 -2942
- package/dist/adapter/ember/adapter/emberAdapter.js.map +0 -1
- package/dist/adapter/ember/adapter/endpoints.d.ts +0 -27
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/endpoints.js +0 -68
- package/dist/adapter/ember/adapter/endpoints.js.map +0 -1
- package/dist/adapter/ember/adapter/index.d.ts +0 -3
- package/dist/adapter/ember/adapter/index.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/index.js +0 -6
- package/dist/adapter/ember/adapter/index.js.map +0 -1
- package/dist/adapter/ember/adapter/oneWaitress.d.ts +0 -108
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/oneWaitress.js +0 -241
- package/dist/adapter/ember/adapter/oneWaitress.js.map +0 -1
- package/dist/adapter/ember/adapter/requestQueue.d.ts +0 -57
- package/dist/adapter/ember/adapter/requestQueue.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/requestQueue.js +0 -139
- package/dist/adapter/ember/adapter/requestQueue.js.map +0 -1
- package/dist/adapter/ember/adapter/tokensManager.d.ts +0 -69
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +0 -1
- package/dist/adapter/ember/adapter/tokensManager.js +0 -688
- package/dist/adapter/ember/adapter/tokensManager.js.map +0 -1
- package/dist/adapter/ember/consts.d.ts +0 -191
- package/dist/adapter/ember/consts.d.ts.map +0 -1
- package/dist/adapter/ember/consts.js +0 -246
- package/dist/adapter/ember/consts.js.map +0 -1
- package/dist/adapter/ember/enums.d.ts +0 -2172
- package/dist/adapter/ember/enums.d.ts.map +0 -1
- package/dist/adapter/ember/enums.js +0 -2375
- package/dist/adapter/ember/enums.js.map +0 -1
- package/dist/adapter/ember/ezsp/buffalo.d.ts +0 -156
- package/dist/adapter/ember/ezsp/buffalo.d.ts.map +0 -1
- package/dist/adapter/ember/ezsp/buffalo.js +0 -1033
- package/dist/adapter/ember/ezsp/buffalo.js.map +0 -1
- package/dist/adapter/ember/ezsp/consts.d.ts +0 -116
- package/dist/adapter/ember/ezsp/consts.d.ts.map +0 -1
- package/dist/adapter/ember/ezsp/consts.js +0 -128
- package/dist/adapter/ember/ezsp/consts.js.map +0 -1
- package/dist/adapter/ember/ezsp/enums.d.ts +0 -879
- package/dist/adapter/ember/ezsp/enums.d.ts.map +0 -1
- package/dist/adapter/ember/ezsp/enums.js +0 -948
- package/dist/adapter/ember/ezsp/enums.js.map +0 -1
- package/dist/adapter/ember/ezsp/ezsp.d.ts +0 -2662
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +0 -1
- package/dist/adapter/ember/ezsp/ezsp.js +0 -6454
- package/dist/adapter/ember/ezsp/ezsp.js.map +0 -1
- package/dist/adapter/ember/types.d.ts +0 -733
- package/dist/adapter/ember/types.d.ts.map +0 -1
- package/dist/adapter/ember/types.js +0 -3
- package/dist/adapter/ember/types.js.map +0 -1
- package/dist/adapter/ember/uart/ash.d.ts +0 -464
- package/dist/adapter/ember/uart/ash.d.ts.map +0 -1
- package/dist/adapter/ember/uart/ash.js +0 -1633
- package/dist/adapter/ember/uart/ash.js.map +0 -1
- package/dist/adapter/ember/uart/consts.d.ts +0 -91
- package/dist/adapter/ember/uart/consts.d.ts.map +0 -1
- package/dist/adapter/ember/uart/consts.js +0 -100
- package/dist/adapter/ember/uart/consts.js.map +0 -1
- package/dist/adapter/ember/uart/enums.d.ts +0 -191
- package/dist/adapter/ember/uart/enums.d.ts.map +0 -1
- package/dist/adapter/ember/uart/enums.js +0 -197
- package/dist/adapter/ember/uart/enums.js.map +0 -1
- package/dist/adapter/ember/uart/parser.d.ts +0 -10
- package/dist/adapter/ember/uart/parser.d.ts.map +0 -1
- package/dist/adapter/ember/uart/parser.js +0 -37
- package/dist/adapter/ember/uart/parser.js.map +0 -1
- package/dist/adapter/ember/uart/queues.d.ts +0 -85
- package/dist/adapter/ember/uart/queues.d.ts.map +0 -1
- package/dist/adapter/ember/uart/queues.js +0 -214
- package/dist/adapter/ember/uart/queues.js.map +0 -1
- package/dist/adapter/ember/uart/writer.d.ts +0 -15
- package/dist/adapter/ember/uart/writer.d.ts.map +0 -1
- package/dist/adapter/ember/uart/writer.js +0 -46
- package/dist/adapter/ember/uart/writer.js.map +0 -1
- package/dist/adapter/ember/utils/initters.d.ts +0 -20
- package/dist/adapter/ember/utils/initters.d.ts.map +0 -1
- package/dist/adapter/ember/utils/initters.js +0 -58
- package/dist/adapter/ember/utils/initters.js.map +0 -1
- package/dist/adapter/ember/utils/math.d.ts +0 -51
- package/dist/adapter/ember/utils/math.d.ts.map +0 -1
- package/dist/adapter/ember/utils/math.js +0 -102
- package/dist/adapter/ember/utils/math.js.map +0 -1
- package/dist/adapter/ember/zdo.d.ts +0 -925
- package/dist/adapter/ember/zdo.d.ts.map +0 -1
- package/dist/adapter/ember/zdo.js +0 -723
- package/dist/adapter/ember/zdo.js.map +0 -1
- package/dist/adapter/events.d.ts +0 -42
- package/dist/adapter/events.d.ts.map +0 -1
- package/dist/adapter/events.js +0 -13
- package/dist/adapter/events.js.map +0 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts +0 -13
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +0 -1
- package/dist/adapter/ezsp/adapter/backup.js +0 -101
- package/dist/adapter/ezsp/adapter/backup.js.map +0 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +0 -65
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +0 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.js +0 -634
- package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +0 -1
- package/dist/adapter/ezsp/adapter/index.d.ts +0 -3
- package/dist/adapter/ezsp/adapter/index.d.ts.map +0 -1
- package/dist/adapter/ezsp/adapter/index.js +0 -11
- package/dist/adapter/ezsp/adapter/index.js.map +0 -1
- package/dist/adapter/ezsp/driver/commands.d.ts +0 -37
- package/dist/adapter/ezsp/driver/commands.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/commands.js +0 -2387
- package/dist/adapter/ezsp/driver/commands.js.map +0 -1
- package/dist/adapter/ezsp/driver/consts.d.ts +0 -11
- package/dist/adapter/ezsp/driver/consts.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/consts.js +0 -14
- package/dist/adapter/ezsp/driver/consts.js.map +0 -1
- package/dist/adapter/ezsp/driver/driver.d.ts +0 -109
- package/dist/adapter/ezsp/driver/driver.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/driver.js +0 -796
- package/dist/adapter/ezsp/driver/driver.js.map +0 -1
- package/dist/adapter/ezsp/driver/ezsp.d.ts +0 -106
- package/dist/adapter/ezsp/driver/ezsp.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/ezsp.js +0 -664
- package/dist/adapter/ezsp/driver/ezsp.js.map +0 -1
- package/dist/adapter/ezsp/driver/frame.d.ts +0 -40
- package/dist/adapter/ezsp/driver/frame.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/frame.js +0 -101
- package/dist/adapter/ezsp/driver/frame.js.map +0 -1
- package/dist/adapter/ezsp/driver/index.d.ts +0 -4
- package/dist/adapter/ezsp/driver/index.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/index.js +0 -9
- package/dist/adapter/ezsp/driver/index.js.map +0 -1
- package/dist/adapter/ezsp/driver/multicast.d.ts +0 -13
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/multicast.js +0 -74
- package/dist/adapter/ezsp/driver/multicast.js.map +0 -1
- package/dist/adapter/ezsp/driver/parser.d.ts +0 -12
- package/dist/adapter/ezsp/driver/parser.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/parser.js +0 -105
- package/dist/adapter/ezsp/driver/parser.js.map +0 -1
- package/dist/adapter/ezsp/driver/types/basic.d.ts +0 -63
- package/dist/adapter/ezsp/driver/types/basic.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/types/basic.js +0 -209
- package/dist/adapter/ezsp/driver/types/basic.js.map +0 -1
- package/dist/adapter/ezsp/driver/types/index.d.ts +0 -10
- package/dist/adapter/ezsp/driver/types/index.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/types/index.js +0 -139
- package/dist/adapter/ezsp/driver/types/index.js.map +0 -1
- package/dist/adapter/ezsp/driver/types/named.d.ts +0 -1288
- package/dist/adapter/ezsp/driver/types/named.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/types/named.js +0 -2330
- package/dist/adapter/ezsp/driver/types/named.js.map +0 -1
- package/dist/adapter/ezsp/driver/types/struct.d.ts +0 -271
- package/dist/adapter/ezsp/driver/types/struct.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/types/struct.js +0 -804
- package/dist/adapter/ezsp/driver/types/struct.js.map +0 -1
- package/dist/adapter/ezsp/driver/uart.d.ts +0 -49
- package/dist/adapter/ezsp/driver/uart.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/uart.js +0 -383
- package/dist/adapter/ezsp/driver/uart.js.map +0 -1
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +0 -3
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +0 -56
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +0 -1
- package/dist/adapter/ezsp/driver/utils/index.d.ts +0 -20
- package/dist/adapter/ezsp/driver/utils/index.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/utils/index.js +0 -73
- package/dist/adapter/ezsp/driver/utils/index.js.map +0 -1
- package/dist/adapter/ezsp/driver/writer.d.ts +0 -14
- package/dist/adapter/ezsp/driver/writer.d.ts.map +0 -1
- package/dist/adapter/ezsp/driver/writer.js +0 -83
- package/dist/adapter/ezsp/driver/writer.js.map +0 -1
- package/dist/adapter/index.d.ts +0 -5
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/index.js +0 -36
- package/dist/adapter/index.js.map +0 -1
- package/dist/adapter/serialPort.d.ts +0 -14
- package/dist/adapter/serialPort.d.ts.map +0 -1
- package/dist/adapter/serialPort.js +0 -47
- package/dist/adapter/serialPort.js.map +0 -1
- package/dist/adapter/serialPortUtils.d.ts +0 -13
- package/dist/adapter/serialPortUtils.d.ts.map +0 -1
- package/dist/adapter/serialPortUtils.js +0 -19
- package/dist/adapter/serialPortUtils.js.map +0 -1
- package/dist/adapter/socketPortUtils.d.ts +0 -11
- package/dist/adapter/socketPortUtils.d.ts.map +0 -1
- package/dist/adapter/socketPortUtils.js +0 -17
- package/dist/adapter/socketPortUtils.js.map +0 -1
- package/dist/adapter/tstype.d.ts +0 -86
- package/dist/adapter/tstype.d.ts.map +0 -1
- package/dist/adapter/tstype.js +0 -3
- package/dist/adapter/tstype.js.map +0 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -62
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.js +0 -459
- package/dist/adapter/z-stack/adapter/adapter-backup.js.map +0 -1
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +0 -151
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +0 -259
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +0 -1
- package/dist/adapter/z-stack/adapter/endpoints.d.ts +0 -12
- package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/endpoints.js +0 -74
- package/dist/adapter/z-stack/adapter/endpoints.js.map +0 -1
- package/dist/adapter/z-stack/adapter/index.d.ts +0 -3
- package/dist/adapter/z-stack/adapter/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/index.js +0 -9
- package/dist/adapter/z-stack/adapter/index.js.map +0 -1
- package/dist/adapter/z-stack/adapter/manager.d.ts +0 -84
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/manager.js +0 -474
- package/dist/adapter/z-stack/adapter/manager.js.map +0 -1
- package/dist/adapter/z-stack/adapter/tstype.d.ts +0 -7
- package/dist/adapter/z-stack/adapter/tstype.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/tstype.js +0 -10
- package/dist/adapter/z-stack/adapter/tstype.js.map +0 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +0 -86
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +0 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +0 -912
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +0 -1
- package/dist/adapter/z-stack/constants/af.d.ts +0 -24
- package/dist/adapter/z-stack/constants/af.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/af.js +0 -28
- package/dist/adapter/z-stack/constants/af.js.map +0 -1
- package/dist/adapter/z-stack/constants/common.d.ts +0 -279
- package/dist/adapter/z-stack/constants/common.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/common.js +0 -293
- package/dist/adapter/z-stack/constants/common.js.map +0 -1
- package/dist/adapter/z-stack/constants/dbg.d.ts +0 -23
- package/dist/adapter/z-stack/constants/dbg.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/dbg.js +0 -25
- package/dist/adapter/z-stack/constants/dbg.js.map +0 -1
- package/dist/adapter/z-stack/constants/index.d.ts +0 -11
- package/dist/adapter/z-stack/constants/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/index.js +0 -48
- package/dist/adapter/z-stack/constants/index.js.map +0 -1
- package/dist/adapter/z-stack/constants/mac.d.ts +0 -128
- package/dist/adapter/z-stack/constants/mac.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/mac.js +0 -130
- package/dist/adapter/z-stack/constants/mac.js.map +0 -1
- package/dist/adapter/z-stack/constants/sapi.d.ts +0 -25
- package/dist/adapter/z-stack/constants/sapi.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/sapi.js +0 -27
- package/dist/adapter/z-stack/constants/sapi.js.map +0 -1
- package/dist/adapter/z-stack/constants/sys.d.ts +0 -72
- package/dist/adapter/z-stack/constants/sys.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/sys.js +0 -74
- package/dist/adapter/z-stack/constants/sys.js.map +0 -1
- package/dist/adapter/z-stack/constants/util.d.ts +0 -82
- package/dist/adapter/z-stack/constants/util.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/util.js +0 -84
- package/dist/adapter/z-stack/constants/util.js.map +0 -1
- package/dist/adapter/z-stack/constants/utils.d.ts +0 -5
- package/dist/adapter/z-stack/constants/utils.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/utils.js +0 -15
- package/dist/adapter/z-stack/constants/utils.js.map +0 -1
- package/dist/adapter/z-stack/constants/zdo.d.ts +0 -103
- package/dist/adapter/z-stack/constants/zdo.d.ts.map +0 -1
- package/dist/adapter/z-stack/constants/zdo.js +0 -105
- package/dist/adapter/z-stack/constants/zdo.js.map +0 -1
- package/dist/adapter/z-stack/models/index.d.ts +0 -2
- package/dist/adapter/z-stack/models/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/models/index.js +0 -18
- package/dist/adapter/z-stack/models/index.js.map +0 -1
- package/dist/adapter/z-stack/models/startup-options.d.ts +0 -13
- package/dist/adapter/z-stack/models/startup-options.d.ts.map +0 -1
- package/dist/adapter/z-stack/models/startup-options.js +0 -3
- package/dist/adapter/z-stack/models/startup-options.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +0 -24
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +0 -46
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/address-manager-table.js +0 -23
- package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +0 -22
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +0 -24
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +0 -25
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +0 -24
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +0 -9
- package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/channel-list.js +0 -16
- package/dist/adapter/z-stack/structs/entries/channel-list.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +0 -9
- package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/has-configured.js +0 -17
- package/dist/adapter/z-stack/structs/entries/has-configured.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/index.d.ts +0 -17
- package/dist/adapter/z-stack/structs/entries/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/index.js +0 -33
- package/dist/adapter/z-stack/structs/entries/index.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nib.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nib.js +0 -69
- package/dist/adapter/z-stack/structs/entries/nib.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +0 -19
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +0 -9
- package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-key.js +0 -16
- package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +0 -9
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +0 -16
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +0 -14
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +0 -24
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +0 -23
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +0 -21
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +0 -37
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +0 -1
- package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +0 -11
- package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/entries/security-manager-table.js +0 -25
- package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +0 -1
- package/dist/adapter/z-stack/structs/index.d.ts +0 -5
- package/dist/adapter/z-stack/structs/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/index.js +0 -21
- package/dist/adapter/z-stack/structs/index.js.map +0 -1
- package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +0 -14
- package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/serializable-memory-object.js +0 -3
- package/dist/adapter/z-stack/structs/serializable-memory-object.js.map +0 -1
- package/dist/adapter/z-stack/structs/struct.d.ts +0 -100
- package/dist/adapter/z-stack/structs/struct.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/struct.js +0 -297
- package/dist/adapter/z-stack/structs/struct.js.map +0 -1
- package/dist/adapter/z-stack/structs/table.d.ts +0 -95
- package/dist/adapter/z-stack/structs/table.d.ts.map +0 -1
- package/dist/adapter/z-stack/structs/table.js +0 -164
- package/dist/adapter/z-stack/structs/table.js.map +0 -1
- package/dist/adapter/z-stack/unpi/constants.d.ts +0 -29
- package/dist/adapter/z-stack/unpi/constants.d.ts.map +0 -1
- package/dist/adapter/z-stack/unpi/constants.js +0 -40
- package/dist/adapter/z-stack/unpi/constants.js.map +0 -1
- package/dist/adapter/z-stack/unpi/frame.d.ts +0 -17
- package/dist/adapter/z-stack/unpi/frame.d.ts.map +0 -1
- package/dist/adapter/z-stack/unpi/frame.js +0 -55
- package/dist/adapter/z-stack/unpi/frame.js.map +0 -1
- package/dist/adapter/z-stack/unpi/index.d.ts +0 -6
- package/dist/adapter/z-stack/unpi/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/unpi/index.js +0 -38
- package/dist/adapter/z-stack/unpi/index.js.map +0 -1
- package/dist/adapter/z-stack/unpi/parser.d.ts +0 -13
- package/dist/adapter/z-stack/unpi/parser.d.ts.map +0 -1
- package/dist/adapter/z-stack/unpi/parser.js +0 -86
- package/dist/adapter/z-stack/unpi/parser.js.map +0 -1
- package/dist/adapter/z-stack/unpi/writer.d.ts +0 -12
- package/dist/adapter/z-stack/unpi/writer.d.ts.map +0 -1
- package/dist/adapter/z-stack/unpi/writer.js +0 -55
- package/dist/adapter/z-stack/unpi/writer.js.map +0 -1
- package/dist/adapter/z-stack/utils/channel-list.d.ts +0 -21
- package/dist/adapter/z-stack/utils/channel-list.d.ts.map +0 -1
- package/dist/adapter/z-stack/utils/channel-list.js +0 -41
- package/dist/adapter/z-stack/utils/channel-list.js.map +0 -1
- package/dist/adapter/z-stack/utils/index.d.ts +0 -3
- package/dist/adapter/z-stack/utils/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/utils/index.js +0 -19
- package/dist/adapter/z-stack/utils/index.js.map +0 -1
- package/dist/adapter/z-stack/utils/network-options.d.ts +0 -9
- package/dist/adapter/z-stack/utils/network-options.d.ts.map +0 -1
- package/dist/adapter/z-stack/utils/network-options.js +0 -23
- package/dist/adapter/z-stack/utils/network-options.js.map +0 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +0 -14
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.js +0 -243
- package/dist/adapter/z-stack/znp/buffaloZnp.js.map +0 -1
- package/dist/adapter/z-stack/znp/definition.d.ts +0 -6
- package/dist/adapter/z-stack/znp/definition.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/definition.js +0 -3052
- package/dist/adapter/z-stack/znp/definition.js.map +0 -1
- package/dist/adapter/z-stack/znp/index.d.ts +0 -4
- package/dist/adapter/z-stack/znp/index.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/index.js +0 -11
- package/dist/adapter/z-stack/znp/index.js.map +0 -1
- package/dist/adapter/z-stack/znp/parameterType.d.ts +0 -23
- package/dist/adapter/z-stack/znp/parameterType.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/parameterType.js +0 -26
- package/dist/adapter/z-stack/znp/parameterType.js.map +0 -1
- package/dist/adapter/z-stack/znp/tstype.d.ts +0 -23
- package/dist/adapter/z-stack/znp/tstype.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/tstype.js +0 -3
- package/dist/adapter/z-stack/znp/tstype.js.map +0 -1
- package/dist/adapter/z-stack/znp/znp.d.ts +0 -47
- package/dist/adapter/z-stack/znp/znp.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/znp.js +0 -322
- package/dist/adapter/z-stack/znp/znp.js.map +0 -1
- package/dist/adapter/z-stack/znp/zpiObject.d.ts +0 -20
- package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +0 -1
- package/dist/adapter/z-stack/znp/zpiObject.js +0 -103
- package/dist/adapter/z-stack/znp/zpiObject.js.map +0 -1
- package/dist/adapter/zigate/adapter/index.d.ts +0 -3
- package/dist/adapter/zigate/adapter/index.d.ts.map +0 -1
- package/dist/adapter/zigate/adapter/index.js +0 -11
- package/dist/adapter/zigate/adapter/index.js.map +0 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +0 -72
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +0 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +0 -681
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +0 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +0 -18
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.js +0 -190
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +0 -1
- package/dist/adapter/zigate/driver/commandType.d.ts +0 -43
- package/dist/adapter/zigate/driver/commandType.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/commandType.js +0 -390
- package/dist/adapter/zigate/driver/commandType.js.map +0 -1
- package/dist/adapter/zigate/driver/constants.d.ts +0 -277
- package/dist/adapter/zigate/driver/constants.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/constants.js +0 -372
- package/dist/adapter/zigate/driver/constants.js.map +0 -1
- package/dist/adapter/zigate/driver/frame.d.ts +0 -27
- package/dist/adapter/zigate/driver/frame.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/frame.js +0 -173
- package/dist/adapter/zigate/driver/frame.js.map +0 -1
- package/dist/adapter/zigate/driver/messageType.d.ts +0 -13
- package/dist/adapter/zigate/driver/messageType.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/messageType.js +0 -284
- package/dist/adapter/zigate/driver/messageType.js.map +0 -1
- package/dist/adapter/zigate/driver/parameterType.d.ts +0 -28
- package/dist/adapter/zigate/driver/parameterType.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/parameterType.js +0 -33
- package/dist/adapter/zigate/driver/parameterType.js.map +0 -1
- package/dist/adapter/zigate/driver/ziGateObject.d.ts +0 -24
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/ziGateObject.js +0 -111
- package/dist/adapter/zigate/driver/ziGateObject.js.map +0 -1
- package/dist/adapter/zigate/driver/zigate.d.ts +0 -50
- package/dist/adapter/zigate/driver/zigate.d.ts.map +0 -1
- package/dist/adapter/zigate/driver/zigate.js +0 -289
- package/dist/adapter/zigate/driver/zigate.js.map +0 -1
- package/dist/buffalo/buffalo.d.ts +0 -55
- package/dist/buffalo/buffalo.d.ts.map +0 -1
- package/dist/buffalo/buffalo.js +0 -230
- package/dist/buffalo/buffalo.js.map +0 -1
- package/dist/buffalo/index.d.ts +0 -3
- package/dist/buffalo/index.d.ts.map +0 -1
- package/dist/buffalo/index.js +0 -9
- package/dist/buffalo/index.js.map +0 -1
- package/dist/controller/controller.d.ts +0 -119
- package/dist/controller/controller.d.ts.map +0 -1
- package/dist/controller/controller.js +0 -700
- package/dist/controller/controller.js.map +0 -1
- package/dist/controller/database.d.ts +0 -20
- package/dist/controller/database.d.ts.map +0 -1
- package/dist/controller/database.js +0 -94
- package/dist/controller/database.js.map +0 -1
- package/dist/controller/events.d.ts +0 -59
- package/dist/controller/events.d.ts.map +0 -1
- package/dist/controller/events.js +0 -113
- package/dist/controller/events.js.map +0 -1
- package/dist/controller/greenPower.d.ts +0 -14
- package/dist/controller/greenPower.d.ts.map +0 -1
- package/dist/controller/greenPower.js +0 -216
- package/dist/controller/greenPower.js.map +0 -1
- package/dist/controller/helpers/index.d.ts +0 -3
- package/dist/controller/helpers/index.d.ts.map +0 -1
- package/dist/controller/helpers/index.js +0 -29
- package/dist/controller/helpers/index.js.map +0 -1
- package/dist/controller/helpers/request.d.ts +0 -22
- package/dist/controller/helpers/request.d.ts.map +0 -1
- package/dist/controller/helpers/request.js +0 -78
- package/dist/controller/helpers/request.js.map +0 -1
- package/dist/controller/helpers/requestQueue.d.ts +0 -13
- package/dist/controller/helpers/requestQueue.d.ts.map +0 -1
- package/dist/controller/helpers/requestQueue.js +0 -106
- package/dist/controller/helpers/requestQueue.js.map +0 -1
- package/dist/controller/helpers/zclFrameConverter.d.ts +0 -9
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +0 -1
- package/dist/controller/helpers/zclFrameConverter.js +0 -70
- package/dist/controller/helpers/zclFrameConverter.js.map +0 -1
- package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +0 -6
- package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +0 -1
- package/dist/controller/helpers/zclTransactionSequenceNumber.js +0 -14
- package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +0 -1
- package/dist/controller/index.d.ts +0 -6
- package/dist/controller/index.d.ts.map +0 -1
- package/dist/controller/index.js +0 -9
- package/dist/controller/index.js.map +0 -1
- package/dist/controller/model/device.d.ts +0 -140
- package/dist/controller/model/device.d.ts.map +0 -1
- package/dist/controller/model/device.js +0 -746
- package/dist/controller/model/device.js.map +0 -1
- package/dist/controller/model/endpoint.d.ts +0 -134
- package/dist/controller/model/endpoint.d.ts.map +0 -1
- package/dist/controller/model/endpoint.js +0 -667
- package/dist/controller/model/endpoint.js.map +0 -1
- package/dist/controller/model/entity.d.ts +0 -15
- package/dist/controller/model/entity.d.ts.map +0 -1
- package/dist/controller/model/entity.js +0 -27
- package/dist/controller/model/entity.js.map +0 -1
- package/dist/controller/model/group.d.ts +0 -39
- package/dist/controller/model/group.d.ts.map +0 -1
- package/dist/controller/model/group.js +0 -226
- package/dist/controller/model/group.js.map +0 -1
- package/dist/controller/model/index.d.ts +0 -6
- package/dist/controller/model/index.d.ts.map +0 -1
- package/dist/controller/model/index.js +0 -15
- package/dist/controller/model/index.js.map +0 -1
- package/dist/controller/model/konnextConfig.d.ts +0 -7
- package/dist/controller/model/konnextConfig.d.ts.map +0 -1
- package/dist/controller/model/konnextConfig.js +0 -3
- package/dist/controller/model/konnextConfig.js.map +0 -1
- package/dist/controller/touchlink.d.ts +0 -20
- package/dist/controller/touchlink.d.ts.map +0 -1
- package/dist/controller/touchlink.js +0 -157
- package/dist/controller/touchlink.js.map +0 -1
- package/dist/controller/tstype.d.ts +0 -21
- package/dist/controller/tstype.d.ts.map +0 -1
- package/dist/controller/tstype.js +0 -9
- package/dist/controller/tstype.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -37
- package/dist/index.js.map +0 -1
- package/dist/models/backup-storage-legacy.d.ts +0 -27
- package/dist/models/backup-storage-legacy.d.ts.map +0 -1
- package/dist/models/backup-storage-legacy.js +0 -3
- package/dist/models/backup-storage-legacy.js.map +0 -1
- package/dist/models/backup-storage-unified.d.ts +0 -50
- package/dist/models/backup-storage-unified.d.ts.map +0 -1
- package/dist/models/backup-storage-unified.js +0 -3
- package/dist/models/backup-storage-unified.js.map +0 -1
- package/dist/models/backup.d.ts +0 -38
- package/dist/models/backup.d.ts.map +0 -1
- package/dist/models/backup.js +0 -3
- package/dist/models/backup.js.map +0 -1
- package/dist/models/index.d.ts +0 -5
- package/dist/models/index.d.ts.map +0 -1
- package/dist/models/index.js +0 -21
- package/dist/models/index.js.map +0 -1
- package/dist/models/network-options.d.ts +0 -13
- package/dist/models/network-options.d.ts.map +0 -1
- package/dist/models/network-options.js +0 -3
- package/dist/models/network-options.js.map +0 -1
- package/dist/utils/aes.d.ts +0 -40
- package/dist/utils/aes.d.ts.map +0 -1
- package/dist/utils/aes.js +0 -198
- package/dist/utils/aes.js.map +0 -1
- package/dist/utils/assertString.d.ts +0 -3
- package/dist/utils/assertString.d.ts.map +0 -1
- package/dist/utils/assertString.js +0 -9
- package/dist/utils/assertString.js.map +0 -1
- package/dist/utils/backup.d.ts +0 -21
- package/dist/utils/backup.d.ts.map +0 -1
- package/dist/utils/backup.js +0 -190
- package/dist/utils/backup.js.map +0 -1
- package/dist/utils/equalsPartial.d.ts +0 -3
- package/dist/utils/equalsPartial.d.ts.map +0 -1
- package/dist/utils/equalsPartial.js +0 -12
- package/dist/utils/equalsPartial.js.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -46
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/isNumberArray.d.ts +0 -3
- package/dist/utils/isNumberArray.d.ts.map +0 -1
- package/dist/utils/isNumberArray.js +0 -7
- package/dist/utils/isNumberArray.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -9
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -14
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/queue.d.ts +0 -12
- package/dist/utils/queue.d.ts.map +0 -1
- package/dist/utils/queue.js +0 -62
- package/dist/utils/queue.js.map +0 -1
- package/dist/utils/realpathSync.d.ts +0 -3
- package/dist/utils/realpathSync.d.ts.map +0 -1
- package/dist/utils/realpathSync.js +0 -13
- package/dist/utils/realpathSync.js.map +0 -1
- package/dist/utils/wait.d.ts +0 -3
- package/dist/utils/wait.d.ts.map +0 -1
- package/dist/utils/wait.js +0 -9
- package/dist/utils/wait.js.map +0 -1
- package/dist/utils/waitress.d.ts +0 -22
- package/dist/utils/waitress.d.ts.map +0 -1
- package/dist/utils/waitress.js +0 -69
- package/dist/utils/waitress.js.map +0 -1
- package/dist/zspec/consts.d.ts +0 -60
- package/dist/zspec/consts.d.ts.map +0 -1
- package/dist/zspec/consts.js +0 -64
- package/dist/zspec/consts.js.map +0 -1
- package/dist/zspec/enums.d.ts +0 -19
- package/dist/zspec/enums.d.ts.map +0 -1
- package/dist/zspec/enums.js +0 -28
- package/dist/zspec/enums.js.map +0 -1
- package/dist/zspec/index.d.ts +0 -4
- package/dist/zspec/index.d.ts.map +0 -1
- package/dist/zspec/index.js +0 -43
- package/dist/zspec/index.js.map +0 -1
- package/dist/zspec/tstypes.d.ts +0 -19
- package/dist/zspec/tstypes.d.ts.map +0 -1
- package/dist/zspec/tstypes.js +0 -3
- package/dist/zspec/tstypes.js.map +0 -1
- package/dist/zspec/utils.d.ts +0 -14
- package/dist/zspec/utils.d.ts.map +0 -1
- package/dist/zspec/utils.js +0 -29
- package/dist/zspec/utils.js.map +0 -1
- package/dist/zspec/zcl/buffaloZcl.d.ts +0 -55
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +0 -1
- package/dist/zspec/zcl/buffaloZcl.js +0 -929
- package/dist/zspec/zcl/buffaloZcl.js.map +0 -1
- package/dist/zspec/zcl/definition/cluster.d.ts +0 -3
- package/dist/zspec/zcl/definition/cluster.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/cluster.js +0 -5500
- package/dist/zspec/zcl/definition/cluster.js.map +0 -1
- package/dist/zspec/zcl/definition/consts.d.ts +0 -9
- package/dist/zspec/zcl/definition/consts.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/consts.js +0 -27
- package/dist/zspec/zcl/definition/consts.js.map +0 -1
- package/dist/zspec/zcl/definition/enums.d.ts +0 -177
- package/dist/zspec/zcl/definition/enums.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/enums.js +0 -187
- package/dist/zspec/zcl/definition/enums.js.map +0 -1
- package/dist/zspec/zcl/definition/foundation.d.ts +0 -11
- package/dist/zspec/zcl/definition/foundation.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/foundation.js +0 -241
- package/dist/zspec/zcl/definition/foundation.js.map +0 -1
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts +0 -727
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/manufacturerCode.js +0 -733
- package/dist/zspec/zcl/definition/manufacturerCode.js.map +0 -1
- package/dist/zspec/zcl/definition/status.d.ts +0 -69
- package/dist/zspec/zcl/definition/status.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/status.js +0 -74
- package/dist/zspec/zcl/definition/status.js.map +0 -1
- package/dist/zspec/zcl/definition/tstype.d.ts +0 -114
- package/dist/zspec/zcl/definition/tstype.d.ts.map +0 -1
- package/dist/zspec/zcl/definition/tstype.js +0 -4
- package/dist/zspec/zcl/definition/tstype.js.map +0 -1
- package/dist/zspec/zcl/index.d.ts +0 -11
- package/dist/zspec/zcl/index.d.ts.map +0 -1
- package/dist/zspec/zcl/index.js +0 -47
- package/dist/zspec/zcl/index.js.map +0 -1
- package/dist/zspec/zcl/utils.d.ts +0 -7
- package/dist/zspec/zcl/utils.d.ts.map +0 -1
- package/dist/zspec/zcl/utils.js +0 -234
- package/dist/zspec/zcl/utils.js.map +0 -1
- package/dist/zspec/zcl/zclFrame.d.ts +0 -36
- package/dist/zspec/zcl/zclFrame.d.ts.map +0 -1
- package/dist/zspec/zcl/zclFrame.js +0 -304
- package/dist/zspec/zcl/zclFrame.js.map +0 -1
- package/dist/zspec/zcl/zclHeader.d.ts +0 -17
- package/dist/zspec/zcl/zclHeader.d.ts.map +0 -1
- package/dist/zspec/zcl/zclHeader.js +0 -88
- package/dist/zspec/zcl/zclHeader.js.map +0 -1
- package/dist/zspec/zcl/zclStatusError.d.ts +0 -6
- package/dist/zspec/zcl/zclStatusError.d.ts.map +0 -1
- package/dist/zspec/zcl/zclStatusError.js +0 -13
- package/dist/zspec/zcl/zclStatusError.js.map +0 -1
- package/dist/zspec/zdo/buffaloZdo.d.ts +0 -438
- package/dist/zspec/zdo/buffaloZdo.d.ts.map +0 -1
- package/dist/zspec/zdo/buffaloZdo.js +0 -1892
- package/dist/zspec/zdo/buffaloZdo.js.map +0 -1
- package/dist/zspec/zdo/definition/clusters.d.ts +0 -624
- package/dist/zspec/zdo/definition/clusters.d.ts.map +0 -1
- package/dist/zspec/zdo/definition/clusters.js +0 -687
- package/dist/zspec/zdo/definition/clusters.js.map +0 -1
- package/dist/zspec/zdo/definition/consts.d.ts +0 -13
- package/dist/zspec/zdo/definition/consts.d.ts.map +0 -1
- package/dist/zspec/zdo/definition/consts.js +0 -16
- package/dist/zspec/zdo/definition/consts.js.map +0 -1
- package/dist/zspec/zdo/definition/enums.d.ts +0 -75
- package/dist/zspec/zdo/definition/enums.d.ts.map +0 -1
- package/dist/zspec/zdo/definition/enums.js +0 -97
- package/dist/zspec/zdo/definition/enums.js.map +0 -1
- package/dist/zspec/zdo/definition/status.d.ts +0 -99
- package/dist/zspec/zdo/definition/status.d.ts.map +0 -1
- package/dist/zspec/zdo/definition/status.js +0 -109
- package/dist/zspec/zdo/definition/status.js.map +0 -1
- package/dist/zspec/zdo/definition/tstypes.d.ts +0 -787
- package/dist/zspec/zdo/definition/tstypes.d.ts.map +0 -1
- package/dist/zspec/zdo/definition/tstypes.js +0 -3
- package/dist/zspec/zdo/definition/tstypes.js.map +0 -1
- package/dist/zspec/zdo/index.d.ts +0 -7
- package/dist/zspec/zdo/index.d.ts.map +0 -1
- package/dist/zspec/zdo/index.js +0 -39
- package/dist/zspec/zdo/index.js.map +0 -1
- package/dist/zspec/zdo/utils.d.ts +0 -25
- package/dist/zspec/zdo/utils.d.ts.map +0 -1
- package/dist/zspec/zdo/utils.js +0 -75
- package/dist/zspec/zdo/utils.js.map +0 -1
- package/dist/zspec/zdo/zdoStatusError.d.ts +0 -6
- package/dist/zspec/zdo/zdoStatusError.d.ts.map +0 -1
- package/dist/zspec/zdo/zdoStatusError.js +0 -13
- package/dist/zspec/zdo/zdoStatusError.js.map +0 -1
- package/typedoc-tsconfig.json +0 -44
|
@@ -0,0 +1,1528 @@
|
|
|
1
|
+
/* v8 ignore start */
|
|
2
|
+
|
|
3
|
+
import events from "node:events";
|
|
4
|
+
import net from "node:net";
|
|
5
|
+
|
|
6
|
+
import slip from "slip";
|
|
7
|
+
import {Buffalo} from "../../../buffalo";
|
|
8
|
+
import type {Backup} from "../../../models";
|
|
9
|
+
import {logger} from "../../../utils/logger";
|
|
10
|
+
import {SerialPort} from "../../serialPort";
|
|
11
|
+
import type {NetworkOptions, SerialPortOptions} from "../../tstype";
|
|
12
|
+
import {isTcpPath, parseTcpPath} from "../../utils";
|
|
13
|
+
import PARAM, {
|
|
14
|
+
ApsAddressMode,
|
|
15
|
+
type ApsDataRequest,
|
|
16
|
+
type ApsRequest,
|
|
17
|
+
DataType,
|
|
18
|
+
FirmwareCommand,
|
|
19
|
+
NetworkState,
|
|
20
|
+
NwkBroadcastAddress,
|
|
21
|
+
ParamId,
|
|
22
|
+
type ReceivedDataResponse,
|
|
23
|
+
type Request,
|
|
24
|
+
stackParameters,
|
|
25
|
+
} from "./constants";
|
|
26
|
+
|
|
27
|
+
import {frameParserEvents} from "./frameParser";
|
|
28
|
+
import Parser from "./parser";
|
|
29
|
+
import Writer from "./writer";
|
|
30
|
+
|
|
31
|
+
const NS = "zh:deconz:driver";
|
|
32
|
+
|
|
33
|
+
const queue: Array<Request> = [];
|
|
34
|
+
export const busyQueue: Array<Request> = [];
|
|
35
|
+
export const apsQueue: Array<ApsRequest> = [];
|
|
36
|
+
export const apsBusyQueue: Array<ApsRequest> = [];
|
|
37
|
+
|
|
38
|
+
const DRIVER_EVENT = Symbol("drv_ev");
|
|
39
|
+
|
|
40
|
+
const DEV_STATUS_NET_STATE_MASK = 0x03;
|
|
41
|
+
const DEV_STATUS_APS_CONFIRM = 0x04;
|
|
42
|
+
const DEV_STATUS_APS_INDICATION = 0x08;
|
|
43
|
+
const DEV_STATUS_APS_FREE_SLOTS = 0x20;
|
|
44
|
+
//const DEV_STATUS_CONFIG_CHANGED = 0x10;
|
|
45
|
+
|
|
46
|
+
enum DriverState {
|
|
47
|
+
Init = 0,
|
|
48
|
+
Connected = 1,
|
|
49
|
+
Connecting = 2,
|
|
50
|
+
ReadConfiguration = 3,
|
|
51
|
+
WaitToReconnect = 4,
|
|
52
|
+
Reconfigure = 5,
|
|
53
|
+
CloseAndRestart = 6,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
enum TxState {
|
|
57
|
+
Idle = 0,
|
|
58
|
+
WaitResponse = 1,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
enum DriverEvent {
|
|
62
|
+
Action = 0,
|
|
63
|
+
Connected = 1,
|
|
64
|
+
Disconnected = 2,
|
|
65
|
+
DeviceStateUpdated = 3,
|
|
66
|
+
ConnectError = 4,
|
|
67
|
+
CloseError = 5,
|
|
68
|
+
EnqueuedApsDataRequest = 6,
|
|
69
|
+
Tick = 7,
|
|
70
|
+
FirmwareCommandSend = 8,
|
|
71
|
+
FirmwareCommandReceived = 9,
|
|
72
|
+
FirmwareCommandTimeout = 10,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface CommandResult {
|
|
76
|
+
cmd: number;
|
|
77
|
+
seq: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
type DriverEventData = number | CommandResult;
|
|
81
|
+
|
|
82
|
+
class Driver extends events.EventEmitter {
|
|
83
|
+
private serialPort?: SerialPort;
|
|
84
|
+
private serialPortOptions: SerialPortOptions;
|
|
85
|
+
private writer: Writer;
|
|
86
|
+
private parser: Parser;
|
|
87
|
+
private frameParserEvent = frameParserEvents;
|
|
88
|
+
private seqNumber: number;
|
|
89
|
+
private deviceStatus = 0;
|
|
90
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
91
|
+
private configChanged: number;
|
|
92
|
+
private socketPort?: net.Socket;
|
|
93
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
94
|
+
private timeoutCounter = 0;
|
|
95
|
+
private watchdogTriggeredTime = 0;
|
|
96
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
97
|
+
private lastFirmwareRxTime = 0;
|
|
98
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
99
|
+
private tickTimer: NodeJS.Timeout;
|
|
100
|
+
private driverStateStart = 0;
|
|
101
|
+
private driverState: DriverState = DriverState.Init;
|
|
102
|
+
private firmwareLog: string[];
|
|
103
|
+
private transactionID = 0; // for APS and ZDO
|
|
104
|
+
// in flight lockstep sending commands
|
|
105
|
+
private txState: TxState = TxState.Idle;
|
|
106
|
+
private txCommand = 0;
|
|
107
|
+
private txSeq = 0;
|
|
108
|
+
private txTime = 0;
|
|
109
|
+
private networkOptions: NetworkOptions;
|
|
110
|
+
private backup: Backup | undefined;
|
|
111
|
+
private configMatchesBackup = false;
|
|
112
|
+
private configIsNewNetwork = false;
|
|
113
|
+
public restoredFromBackup = false;
|
|
114
|
+
public paramMacAddress = 0n;
|
|
115
|
+
public paramTcAddress = 0n;
|
|
116
|
+
public paramFirmwareVersion = 0;
|
|
117
|
+
public paramCurrentChannel = 0;
|
|
118
|
+
public paramNwkPanid = 0;
|
|
119
|
+
public paramNwkKey: Buffer<ArrayBufferLike> = Buffer.alloc(16);
|
|
120
|
+
public paramEndpoint0: Buffer | undefined;
|
|
121
|
+
public paramEndpoint1: Buffer | undefined;
|
|
122
|
+
public fixParamEndpoint0: Buffer;
|
|
123
|
+
public fixParamEndpoint1: Buffer;
|
|
124
|
+
public paramNwkUpdateId = 0;
|
|
125
|
+
public paramChannelMask = 0;
|
|
126
|
+
public paramProtocolVersion = 0;
|
|
127
|
+
public paramFrameCounter = 0;
|
|
128
|
+
public paramApsUseExtPanid = 0n;
|
|
129
|
+
|
|
130
|
+
public constructor(serialPortOptions: SerialPortOptions, networkOptions: NetworkOptions, backup: Backup | undefined, firmwareLog: string[]) {
|
|
131
|
+
super();
|
|
132
|
+
this.seqNumber = 0;
|
|
133
|
+
this.configChanged = 0;
|
|
134
|
+
this.networkOptions = networkOptions;
|
|
135
|
+
this.serialPortOptions = serialPortOptions;
|
|
136
|
+
this.backup = backup;
|
|
137
|
+
this.firmwareLog = firmwareLog;
|
|
138
|
+
|
|
139
|
+
this.writer = new Writer();
|
|
140
|
+
this.parser = new Parser();
|
|
141
|
+
|
|
142
|
+
this.fixParamEndpoint0 = Buffer.from([
|
|
143
|
+
0x00, // index
|
|
144
|
+
0x01, // endpoint,
|
|
145
|
+
0x04, // profileId
|
|
146
|
+
0x01,
|
|
147
|
+
0x05, // deviceId
|
|
148
|
+
0x00,
|
|
149
|
+
0x01, // deviceVersion
|
|
150
|
+
0x05, // in cluster count
|
|
151
|
+
0x00, // basic
|
|
152
|
+
0x00,
|
|
153
|
+
0x06, // on/off
|
|
154
|
+
0x00,
|
|
155
|
+
0x0a, // time
|
|
156
|
+
0x00,
|
|
157
|
+
0x19, // ota
|
|
158
|
+
0x00,
|
|
159
|
+
0x01, // ias ace
|
|
160
|
+
0x05,
|
|
161
|
+
0x04, // out cluster count
|
|
162
|
+
0x01, // power configuration
|
|
163
|
+
0x00,
|
|
164
|
+
0x20, // poll control
|
|
165
|
+
0x00,
|
|
166
|
+
0x00, // ias zone
|
|
167
|
+
0x05,
|
|
168
|
+
0x02, // ias wd
|
|
169
|
+
0x05,
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
this.fixParamEndpoint1 = Buffer.from([
|
|
173
|
+
0x01, // index
|
|
174
|
+
0xf2, // endpoint,
|
|
175
|
+
0xe0, // profileId
|
|
176
|
+
0xa1,
|
|
177
|
+
0x64, // deviceId
|
|
178
|
+
0x00,
|
|
179
|
+
0x01, // deviceVersion
|
|
180
|
+
0x00, // in cluster count
|
|
181
|
+
0x01, // out cluster count
|
|
182
|
+
0x21, // green power
|
|
183
|
+
0x00,
|
|
184
|
+
]);
|
|
185
|
+
|
|
186
|
+
this.tickTimer = setInterval(() => {
|
|
187
|
+
this.tick();
|
|
188
|
+
}, 100);
|
|
189
|
+
|
|
190
|
+
this.onParsed = this.onParsed.bind(this);
|
|
191
|
+
this.frameParserEvent.on("deviceStateUpdated", (data: number) => {
|
|
192
|
+
this.checkDeviceStatus(data);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
this.on("close", () => {
|
|
196
|
+
for (const interval of this.intervals) {
|
|
197
|
+
clearInterval(interval);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
this.timeoutCounter = 0;
|
|
201
|
+
this.cleanupAllQueues();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
this.on(DRIVER_EVENT, (event, data) => {
|
|
205
|
+
this.handleStateEvent(event, data);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public cleanupAllQueues() {
|
|
210
|
+
const msg = `Cleanup in state: ${DriverState[this.driverState]}`;
|
|
211
|
+
|
|
212
|
+
for (let i = 0; i < queue.length; i++) {
|
|
213
|
+
queue[i].reject(new Error(msg));
|
|
214
|
+
}
|
|
215
|
+
queue.length = 0;
|
|
216
|
+
|
|
217
|
+
for (let i = 0; i < busyQueue.length; i++) {
|
|
218
|
+
busyQueue[i].reject(new Error(msg));
|
|
219
|
+
}
|
|
220
|
+
busyQueue.length = 0;
|
|
221
|
+
|
|
222
|
+
for (let i = 0; i < apsQueue.length; i++) {
|
|
223
|
+
apsQueue[i].reject(new Error(msg));
|
|
224
|
+
}
|
|
225
|
+
apsQueue.length = 0;
|
|
226
|
+
|
|
227
|
+
for (let i = 0; i < apsBusyQueue.length; i++) {
|
|
228
|
+
apsBusyQueue[i].reject(new Error(msg));
|
|
229
|
+
}
|
|
230
|
+
apsBusyQueue.length = 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public started(): boolean {
|
|
234
|
+
return this.driverState === DriverState.Connected;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
protected intervals: NodeJS.Timeout[] = [];
|
|
238
|
+
|
|
239
|
+
protected registerInterval(interval: NodeJS.Timeout): void {
|
|
240
|
+
this.intervals.push(interval);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
protected async catchPromise<T>(val: Promise<T>): Promise<undefined | Awaited<T>> {
|
|
244
|
+
return (await Promise.resolve(val).catch((err) => logger.debug(`Promise was caught with reason: ${err}`, NS))) as undefined | Awaited<T>;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public nextTransactionID(): number {
|
|
248
|
+
this.transactionID++;
|
|
249
|
+
|
|
250
|
+
if (this.transactionID > 255) {
|
|
251
|
+
this.transactionID = 1;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return this.transactionID;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private tick(): void {
|
|
258
|
+
this.emitStateEvent(DriverEvent.Tick);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private emitStateEvent(event: DriverEvent, data?: DriverEventData) {
|
|
262
|
+
this.emit(DRIVER_EVENT, event, data);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
private needWatchdogReset(): boolean {
|
|
266
|
+
const now = Date.now();
|
|
267
|
+
if (300 * 1000 < now - this.watchdogTriggeredTime) {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private async resetWatchdog(): Promise<void> {
|
|
274
|
+
const lastTime = this.watchdogTriggeredTime;
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
logger.debug("Reset firmware watchdog", NS);
|
|
278
|
+
// Set timestamp before command to let needWatchdogReset() no trigger multiple times.
|
|
279
|
+
this.watchdogTriggeredTime = Date.now();
|
|
280
|
+
await this.writeParameterRequest(ParamId.DEV_WATCHDOG_TTL, 600);
|
|
281
|
+
logger.debug("Reset firmware watchdog success", NS);
|
|
282
|
+
} catch (_err) {
|
|
283
|
+
this.watchdogTriggeredTime = lastTime;
|
|
284
|
+
logger.debug("Reset firmware watchdog failed", NS);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
private handleFirmwareEvent(event: DriverEvent, data?: DriverEventData): void {
|
|
289
|
+
if (event === DriverEvent.FirmwareCommandSend) {
|
|
290
|
+
if (this.txState !== TxState.Idle) {
|
|
291
|
+
throw new Error("Unexpected TX state not idle");
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const d = data as CommandResult;
|
|
295
|
+
this.txState = TxState.WaitResponse;
|
|
296
|
+
this.txCommand = d.cmd;
|
|
297
|
+
this.txSeq = d.seq;
|
|
298
|
+
this.txTime = Date.now();
|
|
299
|
+
//logger.debug(`tx wait for cmd: ${d.cmd.toString(16).padStart(2, "0")}, seq: ${d.seq}`, NS);
|
|
300
|
+
} else if (event === DriverEvent.FirmwareCommandReceived) {
|
|
301
|
+
if (this.txState !== TxState.WaitResponse) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const d = data as CommandResult;
|
|
306
|
+
if (this.txCommand === d.cmd && this.txSeq === d.seq) {
|
|
307
|
+
this.txState = TxState.Idle;
|
|
308
|
+
//logger.debug(`tx released for cmd: ${d.cmd.toString(16).padStart(2, "0")}, seq: ${d.seq}`, NS);
|
|
309
|
+
}
|
|
310
|
+
} else if (event === DriverEvent.FirmwareCommandTimeout) {
|
|
311
|
+
if (this.txState === TxState.WaitResponse) {
|
|
312
|
+
this.txState = TxState.Idle;
|
|
313
|
+
logger.debug(`tx timeout for cmd: ${this.txCommand.toString(16).padStart(2, "0")}, seq: ${this.txSeq}`, NS);
|
|
314
|
+
}
|
|
315
|
+
} else if (event === DriverEvent.Tick) {
|
|
316
|
+
if (this.txState === TxState.WaitResponse) {
|
|
317
|
+
if (Date.now() - this.txTime > 2000) {
|
|
318
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandTimeout);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private handleConnectedStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
325
|
+
if (event === DriverEvent.DeviceStateUpdated) {
|
|
326
|
+
this.handleApsQueueOnDeviceState();
|
|
327
|
+
} else if (event === DriverEvent.Tick) {
|
|
328
|
+
if (this.needWatchdogReset()) {
|
|
329
|
+
this.resetWatchdog().catch(() => {});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
this.processQueue();
|
|
333
|
+
|
|
334
|
+
if (this.txState === TxState.Idle) {
|
|
335
|
+
this.deviceStatus = 0; // force refresh in response
|
|
336
|
+
this.sendReadDeviceStateRequest(this.nextSeqNumber());
|
|
337
|
+
}
|
|
338
|
+
} else if (event === DriverEvent.Disconnected) {
|
|
339
|
+
logger.debug("Disconnected wait and reconnect", NS);
|
|
340
|
+
this.driverStateStart = Date.now();
|
|
341
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
private handleConnectingStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
346
|
+
if (event === DriverEvent.Action) {
|
|
347
|
+
this.watchdogTriggeredTime = 0; // force reset watchdog
|
|
348
|
+
|
|
349
|
+
this.cleanupAllQueues(); // start with fresh queues
|
|
350
|
+
|
|
351
|
+
// TODO(mpi): In future we should simply try which baudrate may work (in a state machine).
|
|
352
|
+
// E.g. connect with baudrate XY, query firmware, on timeout try other baudrate.
|
|
353
|
+
// Most units out there are ConBee2/3 which support 115200.
|
|
354
|
+
// The 38400 default is outdated now and only works for a few units.
|
|
355
|
+
const baudrate = this.serialPortOptions.baudRate || 38400;
|
|
356
|
+
|
|
357
|
+
if (!this.serialPortOptions.path) {
|
|
358
|
+
// unlikely but handle it anyway
|
|
359
|
+
this.driverStateStart = Date.now();
|
|
360
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
let prom: Promise<void> | undefined;
|
|
365
|
+
if (isTcpPath(this.serialPortOptions.path)) {
|
|
366
|
+
prom = this.openSocketPort();
|
|
367
|
+
} else if (baudrate) {
|
|
368
|
+
prom = this.openSerialPort(baudrate);
|
|
369
|
+
} else {
|
|
370
|
+
// unlikely but handle it anyway
|
|
371
|
+
this.driverStateStart = Date.now();
|
|
372
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// biome-ignore lint/nursery/noMisusedPromises: ignore
|
|
376
|
+
if (prom) {
|
|
377
|
+
prom.catch((err) => {
|
|
378
|
+
logger.debug(`${err}`, NS);
|
|
379
|
+
this.driverStateStart = Date.now();
|
|
380
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
} else if (event === DriverEvent.Connected) {
|
|
384
|
+
this.driverStateStart = Date.now();
|
|
385
|
+
this.driverState = DriverState.ReadConfiguration;
|
|
386
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private isNetworkConfigurationValid(): boolean {
|
|
391
|
+
const opts = this.networkOptions;
|
|
392
|
+
|
|
393
|
+
let configExtPanID = 0n;
|
|
394
|
+
const configNetworkKey = Buffer.from(opts.networkKey || []);
|
|
395
|
+
|
|
396
|
+
if (opts.extendedPanID) {
|
|
397
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
398
|
+
configExtPanID = Buffer.from(opts.extendedPanID).readBigUInt64BE();
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if (this.backup) {
|
|
402
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
403
|
+
const backupExtPanID = Buffer.from(this.backup.networkOptions.extendedPanId).readBigUInt64BE();
|
|
404
|
+
|
|
405
|
+
if (
|
|
406
|
+
opts.panID === this.backup.networkOptions.panId &&
|
|
407
|
+
configExtPanID === backupExtPanID &&
|
|
408
|
+
opts.channelList.includes(this.backup.logicalChannel) &&
|
|
409
|
+
configNetworkKey.equals(this.backup.networkOptions.networkKey)
|
|
410
|
+
) {
|
|
411
|
+
logger.debug("Configuration matches backup", NS);
|
|
412
|
+
this.configMatchesBackup = true;
|
|
413
|
+
} else {
|
|
414
|
+
logger.debug("Configuration doesn't match backup (ignore backup)", NS);
|
|
415
|
+
this.configMatchesBackup = false; // ignore Backup
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (this.paramMacAddress !== this.paramTcAddress) {
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (!this.paramEndpoint0 || this.fixParamEndpoint0.compare(this.paramEndpoint0) !== 0) {
|
|
424
|
+
logger.debug("Endpoint[0] doesn't match configuration", NS);
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (!this.paramEndpoint1 || this.fixParamEndpoint1.compare(this.paramEndpoint1) !== 0) {
|
|
429
|
+
logger.debug("Endpoint[1] doesn't match configuration", NS);
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if ((this.deviceStatus & DEV_STATUS_NET_STATE_MASK) !== NetworkState.Connected) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (opts.channelList.find((ch) => ch === this.paramCurrentChannel) === undefined) {
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if (configExtPanID !== 0n) {
|
|
442
|
+
if (configExtPanID !== this.paramApsUseExtPanid) {
|
|
443
|
+
this.configIsNewNetwork = true;
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (opts.panID !== this.paramNwkPanid) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if (opts.networkKey) {
|
|
453
|
+
if (!configNetworkKey.equals(this.paramNwkKey)) {
|
|
454
|
+
// this.configIsNewNetwork = true; // maybe, but we need to consider key rotation
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (this.backup && this.configMatchesBackup) {
|
|
460
|
+
// The backup might be from another unit, if the mac doesn't match clone it!
|
|
461
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
462
|
+
const backupMacAddress = this.backup.coordinatorIeeeAddress.readBigUInt64BE();
|
|
463
|
+
if (backupMacAddress !== this.paramMacAddress) {
|
|
464
|
+
this.configIsNewNetwork = true;
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
if (this.paramNwkUpdateId < this.backup.networkUpdateId) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// NOTE(mpi): Ignore the frame counter for now and only handle in case of this.configIsNewNetwork == true.
|
|
473
|
+
// TODO(mpi): We might also check Trust Center Link Key and key sequence number (unlikely but possible case).
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// TODO(mpi): Check endpoint configuration
|
|
477
|
+
// const ep1 = = await this.driver.readParameterRequest(PARAM.PARAM.STK.Endpoint,);
|
|
478
|
+
return true;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
private async reconfigureNetwork(): Promise<void> {
|
|
482
|
+
const opts = this.networkOptions;
|
|
483
|
+
|
|
484
|
+
// if the configuration has a different channel, broadcast a channel change to the network first
|
|
485
|
+
if (this.networkOptions.channelList.length !== 0) {
|
|
486
|
+
if (opts.channelList[0] !== this.paramCurrentChannel) {
|
|
487
|
+
logger.debug(`change channel from ${this.paramCurrentChannel} to ${opts.channelList[0]}`, NS);
|
|
488
|
+
// increase the NWK Update ID so devices which search for the network know this is an update
|
|
489
|
+
this.paramNwkUpdateId = (this.paramNwkUpdateId + 1) % 255;
|
|
490
|
+
this.paramCurrentChannel = opts.channelList[0];
|
|
491
|
+
|
|
492
|
+
if ((this.deviceStatus & DEV_STATUS_NET_STATE_MASK) === NetworkState.Connected) {
|
|
493
|
+
await this.sendChangeChannelRequest();
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// first disconnect the network
|
|
499
|
+
await this.changeNetworkStateRequest(NetworkState.Disconnected);
|
|
500
|
+
|
|
501
|
+
// check if a backup needs to be applied
|
|
502
|
+
// Ember check if backup is needed:
|
|
503
|
+
// - panId, extPanId, network key different -> leave network
|
|
504
|
+
// - left or not joined -> consider using backup
|
|
505
|
+
// backup is only used when matching the z2m config: panId, extPanId, channel, network key
|
|
506
|
+
// parameters restored from backup:
|
|
507
|
+
// - networkKey,
|
|
508
|
+
// - networkKeyInfo.sequenceNumber NOTE(mpi): not a reason for using backup!?
|
|
509
|
+
// - networkKeyInfo.frameCounter
|
|
510
|
+
// - networkOptions.panId
|
|
511
|
+
// - extendedPanId
|
|
512
|
+
// - logicalChannel
|
|
513
|
+
// - backup!.ezsp!.hashed_tclk! NOTE(mpi): not a reason for using backup!?
|
|
514
|
+
// - backup!.networkUpdateId NOTE(mpi): not a reason for using backup!?
|
|
515
|
+
|
|
516
|
+
let frameCounter = 0;
|
|
517
|
+
|
|
518
|
+
if (this.backup && this.configMatchesBackup) {
|
|
519
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
520
|
+
const backupMacAddress = this.backup.coordinatorIeeeAddress.readBigUInt64BE();
|
|
521
|
+
if (backupMacAddress !== this.paramMacAddress) {
|
|
522
|
+
logger.debug(
|
|
523
|
+
`Use mac address from backup 0x${backupMacAddress.toString(16).padStart(16, "0")}, replaces 0x${this.paramMacAddress.toString(16).padStart(16, "0")}`,
|
|
524
|
+
NS,
|
|
525
|
+
);
|
|
526
|
+
this.paramMacAddress = backupMacAddress;
|
|
527
|
+
this.restoredFromBackup = true;
|
|
528
|
+
|
|
529
|
+
await this.writeParameterRequest(ParamId.MAC_ADDRESS, backupMacAddress);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (this.configIsNewNetwork && this.paramFrameCounter < this.backup.networkKeyInfo.frameCounter) {
|
|
533
|
+
// delicate situation, only update frame counter if:
|
|
534
|
+
// - backup counter is higher
|
|
535
|
+
// - this is in fact a new network
|
|
536
|
+
// - configIsNewNetwork guards also from mistreating counter overflow
|
|
537
|
+
logger.debug(`Use higher frame counter from backup ${this.backup.networkKeyInfo.frameCounter}`, NS);
|
|
538
|
+
// Additionally increase frame counter. Note this might still be too low!
|
|
539
|
+
frameCounter = this.backup.networkKeyInfo.frameCounter + 1000;
|
|
540
|
+
this.restoredFromBackup = true;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (this.paramNwkUpdateId < this.backup.networkUpdateId) {
|
|
544
|
+
logger.debug(`Use network update ID from backup ${this.backup.networkUpdateId}`, NS);
|
|
545
|
+
this.paramNwkUpdateId = this.backup.networkUpdateId;
|
|
546
|
+
this.restoredFromBackup = true;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// TODO(mpi): Later on also check key sequence number.
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
if (this.paramMacAddress !== this.paramTcAddress) {
|
|
553
|
+
this.paramTcAddress = this.paramMacAddress;
|
|
554
|
+
await this.writeParameterRequest(ParamId.APS_TRUST_CENTER_ADDRESS, this.paramTcAddress);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
if (this.configIsNewNetwork && this.paramFrameCounter < frameCounter) {
|
|
558
|
+
this.paramFrameCounter = frameCounter;
|
|
559
|
+
try {
|
|
560
|
+
await this.writeParameterRequest(ParamId.STK_FRAME_COUNTER, this.paramFrameCounter);
|
|
561
|
+
} catch (_err) {
|
|
562
|
+
// on older firmware versions this fails as unsuppored
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
await this.writeParameterRequest(ParamId.STK_NWK_UPDATE_ID, this.paramNwkUpdateId);
|
|
567
|
+
|
|
568
|
+
if (this.networkOptions.channelList.length !== 0) {
|
|
569
|
+
await this.writeParameterRequest(ParamId.APS_CHANNEL_MASK, 1 << this.networkOptions.channelList[0]);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
this.paramNwkPanid = this.networkOptions.panID;
|
|
573
|
+
await this.writeParameterRequest(ParamId.NWK_PANID, this.networkOptions.panID);
|
|
574
|
+
await this.writeParameterRequest(ParamId.STK_PREDEFINED_PANID, 1);
|
|
575
|
+
|
|
576
|
+
if (this.networkOptions.extendedPanID) {
|
|
577
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
578
|
+
this.paramApsUseExtPanid = Buffer.from(this.networkOptions.extendedPanID).readBigUInt64BE();
|
|
579
|
+
await this.writeParameterRequest(ParamId.APS_USE_EXTENDED_PANID, this.paramApsUseExtPanid);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// check current network key against configuration.yaml
|
|
583
|
+
if (this.networkOptions.networkKey) {
|
|
584
|
+
this.paramNwkKey = Buffer.from(this.networkOptions.networkKey);
|
|
585
|
+
await this.writeParameterRequest(ParamId.STK_NETWORK_KEY, Buffer.from([0x0, ...this.networkOptions.networkKey]));
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// check current endpoint configuration
|
|
589
|
+
if (!this.paramEndpoint0 || this.fixParamEndpoint0.compare(this.paramEndpoint0) !== 0) {
|
|
590
|
+
this.paramEndpoint0 = this.fixParamEndpoint0;
|
|
591
|
+
await this.writeParameterRequest(ParamId.STK_ENDPOINT, this.paramEndpoint0);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
if (!this.paramEndpoint1 || this.fixParamEndpoint1.compare(this.paramEndpoint1) !== 0) {
|
|
595
|
+
this.paramEndpoint1 = this.fixParamEndpoint1;
|
|
596
|
+
await this.writeParameterRequest(ParamId.STK_ENDPOINT, this.paramEndpoint1);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// now reconnect, this will also store configuration in nvram
|
|
600
|
+
await this.changeNetworkStateRequest(NetworkState.Connected);
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
private handleReadConfigurationStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
605
|
+
if (event === DriverEvent.Action) {
|
|
606
|
+
logger.debug("Query firmware parameters", NS);
|
|
607
|
+
|
|
608
|
+
this.deviceStatus = 0; // need fresh value
|
|
609
|
+
|
|
610
|
+
Promise.all([
|
|
611
|
+
this.resetWatchdog(),
|
|
612
|
+
this.readFirmwareVersionRequest(),
|
|
613
|
+
this.readDeviceStatusRequest(),
|
|
614
|
+
this.readParameterRequest(ParamId.MAC_ADDRESS),
|
|
615
|
+
this.readParameterRequest(ParamId.APS_TRUST_CENTER_ADDRESS),
|
|
616
|
+
this.readParameterRequest(ParamId.NWK_PANID),
|
|
617
|
+
this.readParameterRequest(ParamId.APS_USE_EXTENDED_PANID),
|
|
618
|
+
this.readParameterRequest(ParamId.STK_CURRENT_CHANNEL),
|
|
619
|
+
this.readParameterRequest(ParamId.STK_NETWORK_KEY, Buffer.from([0])),
|
|
620
|
+
this.readParameterRequest(ParamId.STK_NWK_UPDATE_ID),
|
|
621
|
+
this.readParameterRequest(ParamId.APS_CHANNEL_MASK),
|
|
622
|
+
this.readParameterRequest(ParamId.STK_PROTOCOL_VERSION),
|
|
623
|
+
this.readParameterRequest(ParamId.STK_FRAME_COUNTER),
|
|
624
|
+
this.readParameterRequest(ParamId.STK_ENDPOINT, Buffer.from([0])),
|
|
625
|
+
this.readParameterRequest(ParamId.STK_ENDPOINT, Buffer.from([1])),
|
|
626
|
+
])
|
|
627
|
+
.then(
|
|
628
|
+
([
|
|
629
|
+
_watchdog,
|
|
630
|
+
fwVersion,
|
|
631
|
+
_deviceState,
|
|
632
|
+
mac,
|
|
633
|
+
tcAddress,
|
|
634
|
+
panid,
|
|
635
|
+
apsUseExtPanid,
|
|
636
|
+
currentChannel,
|
|
637
|
+
nwkKey,
|
|
638
|
+
nwkUpdateId,
|
|
639
|
+
channelMask,
|
|
640
|
+
protocolVersion,
|
|
641
|
+
frameCounter,
|
|
642
|
+
ep0,
|
|
643
|
+
ep1,
|
|
644
|
+
]) => {
|
|
645
|
+
this.paramFirmwareVersion = fwVersion;
|
|
646
|
+
this.paramCurrentChannel = currentChannel as number;
|
|
647
|
+
this.paramApsUseExtPanid = apsUseExtPanid as bigint;
|
|
648
|
+
this.paramNwkPanid = panid as number;
|
|
649
|
+
this.paramNwkKey = nwkKey as Buffer;
|
|
650
|
+
this.paramNwkUpdateId = nwkUpdateId as number;
|
|
651
|
+
this.paramMacAddress = mac as bigint;
|
|
652
|
+
this.paramTcAddress = tcAddress as bigint;
|
|
653
|
+
this.paramChannelMask = channelMask as number;
|
|
654
|
+
this.paramProtocolVersion = protocolVersion as number;
|
|
655
|
+
if (frameCounter !== null) {
|
|
656
|
+
this.paramFrameCounter = frameCounter as number;
|
|
657
|
+
}
|
|
658
|
+
if (ep0 !== null) {
|
|
659
|
+
this.paramEndpoint0 = ep0 as Buffer;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (ep1 !== null) {
|
|
663
|
+
this.paramEndpoint1 = ep1 as Buffer;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// console.log({fwVersion, mac, panid, apsUseExtPanid, currentChannel, nwkKey, nwkUpdateId, channelMask, protocolVersion, frameCounter});
|
|
667
|
+
|
|
668
|
+
if (this.isNetworkConfigurationValid()) {
|
|
669
|
+
logger.debug("Zigbee configuration valid", NS);
|
|
670
|
+
this.driverStateStart = Date.now();
|
|
671
|
+
this.driverState = DriverState.Connected;
|
|
672
|
+
|
|
673
|
+
// enable optional firmware debug messages
|
|
674
|
+
let logLevel = 0;
|
|
675
|
+
for (const level of this.firmwareLog) {
|
|
676
|
+
if (level === "APS") logLevel |= 0x00000100;
|
|
677
|
+
else if (level === "APS_L2") logLevel |= 0x00010000;
|
|
678
|
+
}
|
|
679
|
+
if (logLevel !== 0) {
|
|
680
|
+
this.writeParameterRequest(ParamId.STK_DEBUG_LOG_LEVEL, logLevel)
|
|
681
|
+
.then((_x) => {
|
|
682
|
+
logger.debug("Enabled firmware logging", NS);
|
|
683
|
+
})
|
|
684
|
+
.catch((_err) => {
|
|
685
|
+
logger.debug("Firmware logging unsupported by firmware", NS);
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
} else {
|
|
689
|
+
this.driverStateStart = Date.now();
|
|
690
|
+
this.driverState = DriverState.Reconfigure;
|
|
691
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
)
|
|
695
|
+
.catch((_err) => {
|
|
696
|
+
this.driverStateStart = Date.now();
|
|
697
|
+
this.driverState = DriverState.CloseAndRestart;
|
|
698
|
+
logger.debug("Failed to query firmware parameters", NS);
|
|
699
|
+
});
|
|
700
|
+
} else if (event === DriverEvent.Tick) {
|
|
701
|
+
this.processQueue();
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
private handleReconfigureStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
706
|
+
if (event === DriverEvent.Action) {
|
|
707
|
+
logger.debug("Reconfigure Zigbee network to match configuration", NS);
|
|
708
|
+
|
|
709
|
+
this.reconfigureNetwork()
|
|
710
|
+
.then(() => {
|
|
711
|
+
this.driverStateStart = Date.now();
|
|
712
|
+
this.driverState = DriverState.Connected;
|
|
713
|
+
})
|
|
714
|
+
.catch((err) => {
|
|
715
|
+
logger.debug(`Failed to reconfigure Zigbee network, error: ${err}, wait 15 seconds to retry`, NS);
|
|
716
|
+
this.driverStateStart = Date.now();
|
|
717
|
+
});
|
|
718
|
+
} else if (event === DriverEvent.Tick) {
|
|
719
|
+
this.processQueue();
|
|
720
|
+
|
|
721
|
+
// if we run into this timeout assume some error and retry after waiting a bit
|
|
722
|
+
if (15000 < Date.now() - this.driverStateStart) {
|
|
723
|
+
this.driverStateStart = Date.now();
|
|
724
|
+
this.driverState = DriverState.CloseAndRestart;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
if (this.txState === TxState.Idle) {
|
|
728
|
+
// needed to process channel change ZDP request
|
|
729
|
+
this.deviceStatus = 0; // force refresh in response
|
|
730
|
+
this.sendReadDeviceStateRequest(this.nextSeqNumber());
|
|
731
|
+
}
|
|
732
|
+
} else if (event === DriverEvent.DeviceStateUpdated) {
|
|
733
|
+
this.handleApsQueueOnDeviceState();
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
private handleWaitToReconnectStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
738
|
+
if (event === DriverEvent.Tick) {
|
|
739
|
+
if (5000 < Date.now() - this.driverStateStart) {
|
|
740
|
+
this.driverState = DriverState.Connecting;
|
|
741
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
private handleCloseAndRestartStateEvent(event: DriverEvent, _data?: DriverEventData): void {
|
|
747
|
+
if (event === DriverEvent.Tick) {
|
|
748
|
+
if (1000 < Date.now() - this.driverStateStart) {
|
|
749
|
+
// if the connection is open try to close it every second.
|
|
750
|
+
this.driverStateStart = Date.now();
|
|
751
|
+
if (this.isOpen()) {
|
|
752
|
+
this.close().catch(() => {});
|
|
753
|
+
} else {
|
|
754
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
private handleApsQueueOnDeviceState() {
|
|
761
|
+
// logger.debug(`Updated device status: ${data.toString(2)}`, NS);
|
|
762
|
+
|
|
763
|
+
const netState = this.deviceStatus & DEV_STATUS_NET_STATE_MASK;
|
|
764
|
+
|
|
765
|
+
if (this.txState === TxState.Idle) {
|
|
766
|
+
if (netState === NetworkState.Connected) {
|
|
767
|
+
const status = this.deviceStatus;
|
|
768
|
+
if (status & DEV_STATUS_APS_CONFIRM) {
|
|
769
|
+
this.deviceStatus = 0; // force refresh in response
|
|
770
|
+
this.sendReadApsConfirmRequest(this.nextSeqNumber());
|
|
771
|
+
} else if (status & DEV_STATUS_APS_INDICATION) {
|
|
772
|
+
this.deviceStatus = 0; // force refresh in response
|
|
773
|
+
this.sendReadApsIndicationRequest(this.nextSeqNumber());
|
|
774
|
+
} else if (status & DEV_STATUS_APS_FREE_SLOTS) {
|
|
775
|
+
this.deviceStatus = 0; // force refresh in response
|
|
776
|
+
this.processApsQueue();
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
private handleStateEvent(event: DriverEvent, data?: DriverEventData): void {
|
|
783
|
+
try {
|
|
784
|
+
// all states
|
|
785
|
+
if (
|
|
786
|
+
event === DriverEvent.Tick ||
|
|
787
|
+
event === DriverEvent.FirmwareCommandReceived ||
|
|
788
|
+
event === DriverEvent.FirmwareCommandSend ||
|
|
789
|
+
event === DriverEvent.FirmwareCommandTimeout
|
|
790
|
+
) {
|
|
791
|
+
this.handleFirmwareEvent(event, data);
|
|
792
|
+
this.processBusyQueueTimeouts();
|
|
793
|
+
this.processApsBusyQueueTimeouts();
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
if (this.driverState === DriverState.Init) {
|
|
797
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
798
|
+
this.driverStateStart = 0; // force fast initial connect
|
|
799
|
+
} else if (this.driverState === DriverState.Connected) {
|
|
800
|
+
this.handleConnectedStateEvent(event, data);
|
|
801
|
+
} else if (this.driverState === DriverState.Connecting) {
|
|
802
|
+
this.handleConnectingStateEvent(event, data);
|
|
803
|
+
} else if (this.driverState === DriverState.WaitToReconnect) {
|
|
804
|
+
this.handleWaitToReconnectStateEvent(event, data);
|
|
805
|
+
} else if (this.driverState === DriverState.ReadConfiguration) {
|
|
806
|
+
this.handleReadConfigurationStateEvent(event, data);
|
|
807
|
+
} else if (this.driverState === DriverState.Reconfigure) {
|
|
808
|
+
this.handleReconfigureStateEvent(event, data);
|
|
809
|
+
} else if (this.driverState === DriverState.CloseAndRestart) {
|
|
810
|
+
this.handleCloseAndRestartStateEvent(event, data);
|
|
811
|
+
} else {
|
|
812
|
+
if (event !== DriverEvent.Tick) {
|
|
813
|
+
logger.debug(`handle state: ${DriverState[this.driverState]}, event: ${DriverEvent[event]}`, NS);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
} catch (_err) {
|
|
817
|
+
// console.error(err);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
private onPortClose(error: boolean | Error): void {
|
|
822
|
+
if (error) {
|
|
823
|
+
logger.info(`Port close: state: ${DriverState[this.driverState]}, reason: ${error}`, NS);
|
|
824
|
+
} else {
|
|
825
|
+
logger.debug(`Port closed in state: ${DriverState[this.driverState]}`, NS);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
829
|
+
this.emit("close");
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
private onPortError(error: Error): void {
|
|
833
|
+
logger.error(`Port error: ${error}`, NS);
|
|
834
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
835
|
+
this.emit("close");
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
private isOpen(): boolean {
|
|
839
|
+
if (this.serialPort) return this.serialPort.isOpen;
|
|
840
|
+
if (this.socketPort) return this.socketPort.readyState !== "closed";
|
|
841
|
+
return false;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
public openSerialPort(baudrate: number): Promise<void> {
|
|
845
|
+
return new Promise((resolve, reject): void => {
|
|
846
|
+
if (!this.serialPortOptions.path) {
|
|
847
|
+
reject(new Error("Failed to open serial port, path is undefined"));
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
logger.debug(`Opening serial port: ${this.serialPortOptions.path}`, NS);
|
|
851
|
+
|
|
852
|
+
const path = this.serialPortOptions.path || "";
|
|
853
|
+
|
|
854
|
+
if (!this.serialPort) {
|
|
855
|
+
this.serialPort = new SerialPort({path, baudRate: baudrate, autoOpen: false});
|
|
856
|
+
this.writer.pipe(this.serialPort);
|
|
857
|
+
this.serialPort.pipe(this.parser);
|
|
858
|
+
this.parser.on("parsed", this.onParsed);
|
|
859
|
+
this.serialPort.on("close", this.onPortClose.bind(this));
|
|
860
|
+
this.serialPort.on("error", this.onPortError.bind(this));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
if (!this.serialPort) {
|
|
864
|
+
reject(new Error("Failed to create SerialPort instance"));
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
if (this.serialPort.isOpen) {
|
|
869
|
+
resolve();
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
this.serialPort.open((error) => {
|
|
874
|
+
if (error) {
|
|
875
|
+
reject(new Error(`Error while opening serialport '${error}'`));
|
|
876
|
+
|
|
877
|
+
if (this.serialPort) {
|
|
878
|
+
if (this.serialPort.isOpen) {
|
|
879
|
+
this.emitStateEvent(DriverEvent.ConnectError);
|
|
880
|
+
//this.serialPort!.close();
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
} else {
|
|
884
|
+
logger.debug("Serialport opened", NS);
|
|
885
|
+
this.emitStateEvent(DriverEvent.Connected);
|
|
886
|
+
resolve();
|
|
887
|
+
}
|
|
888
|
+
});
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
private async openSocketPort(): Promise<void> {
|
|
893
|
+
if (!this.serialPortOptions.path) {
|
|
894
|
+
throw new Error("No serial port TCP path specified");
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
const info = parseTcpPath(this.serialPortOptions.path);
|
|
898
|
+
logger.debug(`Opening TCP socket with ${info.host}:${info.port}`, NS);
|
|
899
|
+
this.socketPort = new net.Socket();
|
|
900
|
+
this.socketPort.setNoDelay(true);
|
|
901
|
+
this.socketPort.setKeepAlive(true, 15000);
|
|
902
|
+
|
|
903
|
+
this.writer = new Writer();
|
|
904
|
+
this.writer.pipe(this.socketPort);
|
|
905
|
+
|
|
906
|
+
this.parser = new Parser();
|
|
907
|
+
this.socketPort.pipe(this.parser);
|
|
908
|
+
this.parser.on("parsed", this.onParsed);
|
|
909
|
+
|
|
910
|
+
return await new Promise((resolve, reject): void => {
|
|
911
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
912
|
+
this.socketPort!.on("connect", () => {
|
|
913
|
+
logger.debug("Socket connected", NS);
|
|
914
|
+
});
|
|
915
|
+
|
|
916
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
917
|
+
this.socketPort!.on("ready", () => {
|
|
918
|
+
logger.debug("Socket ready", NS);
|
|
919
|
+
this.emitStateEvent(DriverEvent.Connected);
|
|
920
|
+
resolve();
|
|
921
|
+
});
|
|
922
|
+
|
|
923
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
924
|
+
this.socketPort!.once("close", this.onPortClose);
|
|
925
|
+
|
|
926
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
927
|
+
this.socketPort!.on("error", (error) => {
|
|
928
|
+
logger.error(`Socket error ${error}`, NS);
|
|
929
|
+
reject(new Error("Error while opening socket"));
|
|
930
|
+
});
|
|
931
|
+
|
|
932
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
933
|
+
this.socketPort!.connect(info.port, info.host);
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
public close(): Promise<void> {
|
|
938
|
+
return new Promise((resolve, reject): void => {
|
|
939
|
+
if (this.serialPort) {
|
|
940
|
+
if (this.serialPort.isOpen) {
|
|
941
|
+
// wait until remaining data is written
|
|
942
|
+
this.serialPort.flush();
|
|
943
|
+
this.serialPort.close((error): void => {
|
|
944
|
+
if (error) {
|
|
945
|
+
// TODO(mpi): monitor, this must not happen after drain
|
|
946
|
+
// close() failes if there is pending data to write!
|
|
947
|
+
this.emitStateEvent(DriverEvent.CloseError);
|
|
948
|
+
reject(new Error(`Error while closing serialport '${error}'`));
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
955
|
+
this.emit("close");
|
|
956
|
+
resolve();
|
|
957
|
+
} else if (this.socketPort) {
|
|
958
|
+
this.socketPort.destroy();
|
|
959
|
+
this.socketPort = undefined;
|
|
960
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
961
|
+
resolve();
|
|
962
|
+
} else {
|
|
963
|
+
resolve();
|
|
964
|
+
this.emit("close");
|
|
965
|
+
}
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
public readParameterRequest(parameterId: ParamId, parameter?: Buffer | number | bigint): Promise<unknown> {
|
|
970
|
+
const seqNumber = this.nextSeqNumber();
|
|
971
|
+
return new Promise((resolve, reject): void => {
|
|
972
|
+
//logger.debug(`push read parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId}`, NS);
|
|
973
|
+
const ts = 0;
|
|
974
|
+
const commandId = FirmwareCommand.ReadParameter;
|
|
975
|
+
const networkState = NetworkState.Ignore;
|
|
976
|
+
|
|
977
|
+
const req: Request = {commandId, networkState, parameterId, parameter, seqNumber, resolve, reject, ts};
|
|
978
|
+
queue.push(req);
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
public writeParameterRequest(parameterId: ParamId, parameter: Buffer | number | bigint): Promise<void> {
|
|
983
|
+
const seqNumber = this.nextSeqNumber();
|
|
984
|
+
return new Promise((resolve, reject): void => {
|
|
985
|
+
//logger.debug(`push write parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId} parameter: ${parameter}`, NS);
|
|
986
|
+
const ts = 0;
|
|
987
|
+
const commandId = FirmwareCommand.WriteParameter;
|
|
988
|
+
const networkState = NetworkState.Ignore;
|
|
989
|
+
const req: Request = {commandId, networkState, parameterId, parameter, seqNumber, resolve, reject, ts};
|
|
990
|
+
queue.push(req);
|
|
991
|
+
});
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
private sendChangeChannelRequest(): Promise<undefined | ReceivedDataResponse> {
|
|
995
|
+
const zdpSeq = this.nextTransactionID();
|
|
996
|
+
const scanChannels = 1 << this.networkOptions.channelList[0];
|
|
997
|
+
const scanDuration = 0xfe; // special value = channel change
|
|
998
|
+
|
|
999
|
+
const payload = Buffer.alloc(7);
|
|
1000
|
+
let pos = 0;
|
|
1001
|
+
pos = payload.writeUInt8(zdpSeq, pos);
|
|
1002
|
+
pos = payload.writeUInt32LE(scanChannels, pos);
|
|
1003
|
+
pos = payload.writeUInt8(scanDuration, pos);
|
|
1004
|
+
pos = payload.writeUInt8(this.paramNwkUpdateId, pos);
|
|
1005
|
+
|
|
1006
|
+
const req: ApsDataRequest = {
|
|
1007
|
+
requestId: this.nextTransactionID(),
|
|
1008
|
+
destAddrMode: ApsAddressMode.Nwk,
|
|
1009
|
+
destAddr16: NwkBroadcastAddress.BroadcastRxOnWhenIdle,
|
|
1010
|
+
destEndpoint: 0,
|
|
1011
|
+
profileId: 0,
|
|
1012
|
+
clusterId: 0x0038, // ZDP_MGMT_NWK_UPDATE_REQ_CLID
|
|
1013
|
+
srcEndpoint: 0,
|
|
1014
|
+
asduLength: payload.length,
|
|
1015
|
+
asduPayload: payload,
|
|
1016
|
+
txOptions: 0,
|
|
1017
|
+
radius: PARAM.PARAM.txRadius.DEFAULT_RADIUS,
|
|
1018
|
+
timeout: PARAM.PARAM.APS.MAX_SEND_TIMEOUT,
|
|
1019
|
+
};
|
|
1020
|
+
|
|
1021
|
+
return this.enqueueApsDataRequest(req);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
public async writeLinkKey(ieeeAddress: string, hashedKey: Buffer): Promise<void> {
|
|
1025
|
+
const buf = Buffer.alloc(8 + 16);
|
|
1026
|
+
|
|
1027
|
+
if (ieeeAddress[1] !== "x") {
|
|
1028
|
+
ieeeAddress = `0x${ieeeAddress}`;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
buf.writeBigUint64LE(BigInt(ieeeAddress));
|
|
1032
|
+
for (let i = 0; i < 16; i++) {
|
|
1033
|
+
buf.writeUint8(hashedKey[i], 8 + i);
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
await this.writeParameterRequest(ParamId.STK_LINK_KEY, buf);
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
public readFirmwareVersionRequest(): Promise<number> {
|
|
1040
|
+
const seqNumber = this.nextSeqNumber();
|
|
1041
|
+
return new Promise((resolve, reject): void => {
|
|
1042
|
+
//logger.debug(`push read firmware version request to queue. seqNr: ${seqNumber}`, NS);
|
|
1043
|
+
const ts = 0;
|
|
1044
|
+
const commandId = FirmwareCommand.FirmwareVersion;
|
|
1045
|
+
const networkState = NetworkState.Ignore;
|
|
1046
|
+
const parameterId = ParamId.NONE;
|
|
1047
|
+
const req: Request = {commandId, networkState, parameterId, seqNumber, resolve, reject, ts};
|
|
1048
|
+
queue.push(req);
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
public readDeviceStatusRequest(): Promise<number> {
|
|
1053
|
+
const seqNumber = this.nextSeqNumber();
|
|
1054
|
+
return new Promise((resolve, reject): void => {
|
|
1055
|
+
//logger.debug(`push read firmware version request to queue. seqNr: ${seqNumber}`, NS);
|
|
1056
|
+
const ts = 0;
|
|
1057
|
+
const commandId = FirmwareCommand.Status;
|
|
1058
|
+
const networkState = NetworkState.Ignore;
|
|
1059
|
+
const parameterId = ParamId.NONE;
|
|
1060
|
+
const req: Request = {commandId, networkState, parameterId, seqNumber, resolve, reject, ts};
|
|
1061
|
+
queue.push(req);
|
|
1062
|
+
});
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
private sendReadParameterRequest(parameterId: ParamId, seqNumber: number, arg?: Buffer | number | bigint): CommandResult {
|
|
1066
|
+
let frameLength = 8; // starts with min. frame length
|
|
1067
|
+
let payloadLength = 1; // min. parameterId
|
|
1068
|
+
|
|
1069
|
+
if (arg instanceof Buffer) {
|
|
1070
|
+
payloadLength += arg.byteLength;
|
|
1071
|
+
frameLength += arg.byteLength;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
const buf = new Buffalo(Buffer.alloc(frameLength));
|
|
1075
|
+
|
|
1076
|
+
buf.writeUInt8(FirmwareCommand.ReadParameter);
|
|
1077
|
+
buf.writeUInt8(seqNumber);
|
|
1078
|
+
buf.writeUInt8(0); // reserved, shall be 0
|
|
1079
|
+
buf.writeUInt16(frameLength);
|
|
1080
|
+
buf.writeUInt16(payloadLength);
|
|
1081
|
+
buf.writeUInt8(parameterId);
|
|
1082
|
+
|
|
1083
|
+
if (arg instanceof Buffer) {
|
|
1084
|
+
buf.writeBuffer(arg, arg.byteLength);
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
return this.sendRequest(buf.getBuffer());
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
private sendWriteParameterRequest(parameterId: ParamId, value: Buffer | number | bigint, seqNumber: number): CommandResult {
|
|
1091
|
+
// command id, sequence number, 0, framelength(U16), payloadlength(U16), parameter id, parameter
|
|
1092
|
+
const param = stackParameters.find((x) => x.id === parameterId);
|
|
1093
|
+
if (!param) {
|
|
1094
|
+
throw new Error("tried to write unknown stack parameter");
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
const buf = Buffer.alloc(128);
|
|
1098
|
+
let pos = 0;
|
|
1099
|
+
pos = buf.writeUInt8(FirmwareCommand.WriteParameter, pos);
|
|
1100
|
+
pos = buf.writeUInt8(seqNumber, pos);
|
|
1101
|
+
pos = buf.writeUInt8(0, pos); // status: not used
|
|
1102
|
+
|
|
1103
|
+
const posFrameLength = pos; // remember
|
|
1104
|
+
|
|
1105
|
+
pos = buf.writeUInt16LE(0, pos); // dummy frame length
|
|
1106
|
+
// -------------- actual data ---------------------------------------
|
|
1107
|
+
const posPayloadLength = pos; // remember
|
|
1108
|
+
|
|
1109
|
+
pos = buf.writeUInt16LE(0, pos); // dummy payload length
|
|
1110
|
+
pos = buf.writeUInt8(parameterId, pos);
|
|
1111
|
+
|
|
1112
|
+
if (value instanceof Buffer) {
|
|
1113
|
+
for (let i = 0; i < value.length; i++) {
|
|
1114
|
+
pos = buf.writeUInt8(value[i], pos);
|
|
1115
|
+
}
|
|
1116
|
+
} else if (typeof value === "number") {
|
|
1117
|
+
if (param.type === DataType.U8) {
|
|
1118
|
+
pos = buf.writeUInt8(value, pos);
|
|
1119
|
+
} else if (param.type === DataType.U16) {
|
|
1120
|
+
pos = buf.writeUInt16LE(value, pos);
|
|
1121
|
+
} else if (param.type === DataType.U32) {
|
|
1122
|
+
pos = buf.writeUInt32LE(value, pos);
|
|
1123
|
+
} else {
|
|
1124
|
+
throw new Error("tried to write unknown parameter number type");
|
|
1125
|
+
}
|
|
1126
|
+
} else if (typeof value === "bigint") {
|
|
1127
|
+
if (param.type === DataType.U64) {
|
|
1128
|
+
pos = buf.writeBigUInt64LE(value, pos);
|
|
1129
|
+
} else {
|
|
1130
|
+
throw new Error("tried to write unknown parameter number type");
|
|
1131
|
+
}
|
|
1132
|
+
} else {
|
|
1133
|
+
throw new Error("tried to write unknown parameter type");
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
const payloadLength = pos - (posPayloadLength + 2);
|
|
1137
|
+
|
|
1138
|
+
buf.writeUInt16LE(payloadLength, posPayloadLength); // actual payload length
|
|
1139
|
+
buf.writeUInt16LE(pos, posFrameLength); // actual frame length
|
|
1140
|
+
|
|
1141
|
+
const out = buf.subarray(0, pos);
|
|
1142
|
+
return this.sendRequest(out);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
private sendReadFirmwareVersionRequest(seqNumber: number): CommandResult {
|
|
1146
|
+
/* command id, sequence number, 0, framelength(U16) */
|
|
1147
|
+
return this.sendRequest(Buffer.from([FirmwareCommand.FirmwareVersion, seqNumber, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]));
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
private sendReadDeviceStateRequest(seqNumber: number): CommandResult {
|
|
1151
|
+
/* command id, sequence number, 0, framelength(U16) */
|
|
1152
|
+
return this.sendRequest(Buffer.from([FirmwareCommand.Status, seqNumber, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00]));
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
private sendRequest(buffer: Buffer): CommandResult {
|
|
1156
|
+
const frame = Buffer.concat([buffer, this.calcCrc(buffer)]);
|
|
1157
|
+
const slipframe = slip.encode(frame);
|
|
1158
|
+
|
|
1159
|
+
if (frame[0] === 0x00) {
|
|
1160
|
+
throw new Error(`send unexpected frame with invalid command ID: 0x${frame[0].toString(16).padStart(2, "0")}`);
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
if (slipframe.length >= 256) {
|
|
1164
|
+
throw new Error("send unexpected long slip frame");
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
let written = false;
|
|
1168
|
+
|
|
1169
|
+
if (this.serialPort) {
|
|
1170
|
+
if (!this.serialPort.isOpen) {
|
|
1171
|
+
throw new Error("Can't write to serial port while it isn't open");
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
for (let retry = 0; retry < 3 && !written; retry++) {
|
|
1175
|
+
written = this.serialPort.write(slipframe, (err) => {
|
|
1176
|
+
if (err) {
|
|
1177
|
+
throw new Error(`Failed to write to serial port: ${err.message}`);
|
|
1178
|
+
}
|
|
1179
|
+
});
|
|
1180
|
+
|
|
1181
|
+
// if written is false, we also need to wait for drain()
|
|
1182
|
+
this.serialPort.drain(); // flush
|
|
1183
|
+
}
|
|
1184
|
+
} else if (this.socketPort) {
|
|
1185
|
+
written = this.socketPort.write(slipframe, (err) => {
|
|
1186
|
+
if (err) {
|
|
1187
|
+
throw new Error(`Failed to write to serial port: ${err.message}`);
|
|
1188
|
+
}
|
|
1189
|
+
written = true;
|
|
1190
|
+
});
|
|
1191
|
+
|
|
1192
|
+
// handle in upper functions
|
|
1193
|
+
// if (!written) {
|
|
1194
|
+
// await this.sleep(1000);
|
|
1195
|
+
// }
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
if (!written) {
|
|
1199
|
+
throw new Error(`Failed to send request cmd: ${frame[0]}, seq: ${frame[1]}`);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
const result = {cmd: frame[0], seq: frame[1]};
|
|
1203
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandSend, result);
|
|
1204
|
+
return result;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
private processQueue(): void {
|
|
1208
|
+
if (queue.length === 0) {
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
if (busyQueue.length > 0) {
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
if (this.txState !== TxState.Idle) {
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
const req: Request | undefined = queue.shift();
|
|
1220
|
+
|
|
1221
|
+
if (req) {
|
|
1222
|
+
req.ts = Date.now();
|
|
1223
|
+
|
|
1224
|
+
try {
|
|
1225
|
+
switch (req.commandId) {
|
|
1226
|
+
case FirmwareCommand.ReadParameter:
|
|
1227
|
+
logger.debug(`send read parameter request from queue. parameter: ${ParamId[req.parameterId]} seq: ${req.seqNumber}`, NS);
|
|
1228
|
+
this.sendReadParameterRequest(req.parameterId, req.seqNumber, req.parameter);
|
|
1229
|
+
break;
|
|
1230
|
+
case FirmwareCommand.WriteParameter:
|
|
1231
|
+
if (req.parameter === undefined) {
|
|
1232
|
+
throw new Error(`Write parameter request without parameter: ${ParamId[req.parameterId]}`);
|
|
1233
|
+
}
|
|
1234
|
+
logger.debug(`Send write parameter request from queue. seq: ${req.seqNumber} parameter: ${ParamId[req.parameterId]}`, NS);
|
|
1235
|
+
this.sendWriteParameterRequest(req.parameterId, req.parameter, req.seqNumber);
|
|
1236
|
+
break;
|
|
1237
|
+
case FirmwareCommand.FirmwareVersion:
|
|
1238
|
+
logger.debug(`Send read firmware version request from queue. seq: ${req.seqNumber}`, NS);
|
|
1239
|
+
this.sendReadFirmwareVersionRequest(req.seqNumber);
|
|
1240
|
+
break;
|
|
1241
|
+
case FirmwareCommand.Status:
|
|
1242
|
+
//logger.debug(`Send read device state from queue. seqNr: ${req.seqNumber}`, NS);
|
|
1243
|
+
this.sendReadDeviceStateRequest(req.seqNumber);
|
|
1244
|
+
break;
|
|
1245
|
+
case FirmwareCommand.ChangeNetworkState:
|
|
1246
|
+
logger.debug(`Send change network state request from queue. seq: ${req.seqNumber}`, NS);
|
|
1247
|
+
this.sendChangeNetworkStateRequest(req.seqNumber, req.networkState);
|
|
1248
|
+
break;
|
|
1249
|
+
default:
|
|
1250
|
+
throw new Error("process queue - unknown command id");
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
busyQueue.push(req);
|
|
1254
|
+
} catch (_err) {
|
|
1255
|
+
//console.error(err);
|
|
1256
|
+
req.reject(new Error(`Failed to process request ${FirmwareCommand[req.commandId]}, seq: ${req.seqNumber}`));
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
private processBusyQueueTimeouts(): void {
|
|
1262
|
+
let i = busyQueue.length;
|
|
1263
|
+
while (i--) {
|
|
1264
|
+
const req: Request = busyQueue[i];
|
|
1265
|
+
const now = Date.now();
|
|
1266
|
+
|
|
1267
|
+
if (10000 < now - req.ts) {
|
|
1268
|
+
//remove from busyQueue
|
|
1269
|
+
busyQueue.splice(i, 1);
|
|
1270
|
+
this.timeoutCounter++;
|
|
1271
|
+
req.reject(new Error(`Timeout for queued command ${FirmwareCommand[req.commandId]}, seq: ${req.seqNumber}`));
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
public changeNetworkStateRequest(networkState: NetworkState): Promise<void> {
|
|
1277
|
+
const seqNumber = this.nextSeqNumber();
|
|
1278
|
+
return new Promise((resolve, reject): void => {
|
|
1279
|
+
//logger.debug(`push change network state request to apsQueue. seqNr: ${seqNumber}`, NS);
|
|
1280
|
+
const ts = 0;
|
|
1281
|
+
const commandId = FirmwareCommand.ChangeNetworkState;
|
|
1282
|
+
const parameterId = ParamId.NONE;
|
|
1283
|
+
const req: Request = {commandId, networkState, parameterId, seqNumber, resolve, reject, ts};
|
|
1284
|
+
queue.push(req);
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
private sendChangeNetworkStateRequest(seqNumber: number, networkState: NetworkState): CommandResult {
|
|
1289
|
+
return this.sendRequest(Buffer.from([FirmwareCommand.ChangeNetworkState, seqNumber, 0x00, 0x06, 0x00, networkState]));
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
private checkDeviceStatus(deviceStatus: number): void {
|
|
1293
|
+
this.deviceStatus = deviceStatus;
|
|
1294
|
+
this.configChanged = (deviceStatus >> 4) & 0x01;
|
|
1295
|
+
this.emitStateEvent(DriverEvent.DeviceStateUpdated, deviceStatus);
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
public enqueueApsDataRequest(request: ApsDataRequest): Promise<undefined | ReceivedDataResponse> {
|
|
1299
|
+
const seqNumber = this.nextSeqNumber();
|
|
1300
|
+
return new Promise((resolve, reject): void => {
|
|
1301
|
+
//logger.debug(`push enqueue send data request to apsQueue. seqNr: ${seqNumber}`, NS);
|
|
1302
|
+
const ts = Date.now();
|
|
1303
|
+
const commandId = FirmwareCommand.ApsDataRequest;
|
|
1304
|
+
const req: ApsRequest = {commandId, seqNumber, request, resolve, reject, ts};
|
|
1305
|
+
apsQueue.push(req);
|
|
1306
|
+
this.emitStateEvent(DriverEvent.EnqueuedApsDataRequest, req.seqNumber);
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
private processApsQueue(): void {
|
|
1311
|
+
if (apsQueue.length === 0) {
|
|
1312
|
+
return;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
if (this.txState !== TxState.Idle) {
|
|
1316
|
+
return;
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
const req = apsQueue.shift();
|
|
1320
|
+
if (!req) {
|
|
1321
|
+
return;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
if (req.request) {
|
|
1325
|
+
req.ts = Date.now();
|
|
1326
|
+
|
|
1327
|
+
if (req.commandId !== FirmwareCommand.ApsDataRequest) {
|
|
1328
|
+
// should never happen
|
|
1329
|
+
throw new Error("process APS queue - unknown command id");
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
try {
|
|
1333
|
+
this.sendEnqueueApsDataRequest(req.request, req.seqNumber);
|
|
1334
|
+
apsBusyQueue.push(req);
|
|
1335
|
+
} catch (_) {
|
|
1336
|
+
apsQueue.unshift(req);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
private sendReadApsConfirmRequest(seqNumber: number): CommandResult {
|
|
1342
|
+
logger.debug(`Request APS-DATA.confirm seq: ${seqNumber}`, NS);
|
|
1343
|
+
return this.sendRequest(Buffer.from([FirmwareCommand.ApsDataConfirm, seqNumber, 0x00, 0x07, 0x00, 0x00, 0x00]));
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
private sendReadApsIndicationRequest(seqNumber: number): CommandResult {
|
|
1347
|
+
logger.debug(`Request APS-DATA.indication seq: ${seqNumber}`, NS);
|
|
1348
|
+
return this.sendRequest(Buffer.from([FirmwareCommand.ApsDataIndication, seqNumber, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01]));
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
private sendEnqueueApsDataRequest(request: ApsDataRequest, seqNumber: number): CommandResult {
|
|
1352
|
+
const payloadLength =
|
|
1353
|
+
12 + (request.destAddrMode === ApsAddressMode.Group ? 2 : request.destAddrMode === ApsAddressMode.Nwk ? 3 : 9) + request.asduLength;
|
|
1354
|
+
const frameLength = 7 + payloadLength;
|
|
1355
|
+
const cid1 = request.clusterId & 0xff;
|
|
1356
|
+
const cid2 = (request.clusterId >> 8) & 0xff;
|
|
1357
|
+
const asdul1 = request.asduLength & 0xff;
|
|
1358
|
+
const asdul2 = (request.asduLength >> 8) & 0xff;
|
|
1359
|
+
let destArray: Array<number> = [];
|
|
1360
|
+
let dest = "";
|
|
1361
|
+
|
|
1362
|
+
if (request.destAddr16 !== undefined) {
|
|
1363
|
+
destArray[0] = request.destAddr16 & 0xff;
|
|
1364
|
+
destArray[1] = (request.destAddr16 >> 8) & 0xff;
|
|
1365
|
+
dest = request.destAddr16.toString(16);
|
|
1366
|
+
}
|
|
1367
|
+
if (request.destAddr64 !== undefined) {
|
|
1368
|
+
dest = request.destAddr64;
|
|
1369
|
+
destArray = this.macAddrStringToArray(request.destAddr64);
|
|
1370
|
+
}
|
|
1371
|
+
if (request.destEndpoint !== undefined) {
|
|
1372
|
+
destArray.push(request.destEndpoint);
|
|
1373
|
+
dest += " EP:";
|
|
1374
|
+
dest += request.destEndpoint;
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
logger.debug(`Request APS-DATA.request: dest: 0x${dest} seq: ${seqNumber} requestId: ${request.requestId}`, NS);
|
|
1378
|
+
|
|
1379
|
+
return this.sendRequest(
|
|
1380
|
+
Buffer.from([
|
|
1381
|
+
FirmwareCommand.ApsDataRequest,
|
|
1382
|
+
seqNumber,
|
|
1383
|
+
0x00,
|
|
1384
|
+
frameLength & 0xff,
|
|
1385
|
+
(frameLength >> 8) & 0xff,
|
|
1386
|
+
payloadLength & 0xff,
|
|
1387
|
+
(payloadLength >> 8) & 0xff,
|
|
1388
|
+
request.requestId,
|
|
1389
|
+
0x00,
|
|
1390
|
+
request.destAddrMode,
|
|
1391
|
+
...destArray,
|
|
1392
|
+
request.profileId & 0xff,
|
|
1393
|
+
(request.profileId >> 8) & 0xff,
|
|
1394
|
+
cid1,
|
|
1395
|
+
cid2,
|
|
1396
|
+
request.srcEndpoint,
|
|
1397
|
+
asdul1,
|
|
1398
|
+
asdul2,
|
|
1399
|
+
...request.asduPayload,
|
|
1400
|
+
request.txOptions,
|
|
1401
|
+
request.radius,
|
|
1402
|
+
]),
|
|
1403
|
+
);
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
private processApsBusyQueueTimeouts(): void {
|
|
1407
|
+
let i = apsBusyQueue.length;
|
|
1408
|
+
while (i--) {
|
|
1409
|
+
const req = apsBusyQueue[i];
|
|
1410
|
+
const now = Date.now();
|
|
1411
|
+
let timeout = 60000;
|
|
1412
|
+
if (req.request != null && req.request.timeout != null) {
|
|
1413
|
+
timeout = req.request.timeout * 1000; // seconds * 1000 = milliseconds
|
|
1414
|
+
}
|
|
1415
|
+
if (now - req.ts > timeout) {
|
|
1416
|
+
//remove from busyQueue
|
|
1417
|
+
apsBusyQueue.splice(i, 1);
|
|
1418
|
+
req.reject(new Error(`Timeout for APS-DATA.request, seq: ${req.seqNumber}`));
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
private calcCrc(buffer: Uint8Array): Buffer {
|
|
1424
|
+
let crc = 0;
|
|
1425
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
1426
|
+
crc += buffer[i];
|
|
1427
|
+
}
|
|
1428
|
+
const crc0 = (~crc + 1) & 0xff;
|
|
1429
|
+
const crc1 = ((~crc + 1) >> 8) & 0xff;
|
|
1430
|
+
return Buffer.from([crc0, crc1]);
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
public macAddrStringToArray(addr: string): Array<number> {
|
|
1434
|
+
if (addr.indexOf("0x") === 0) {
|
|
1435
|
+
addr = addr.slice(2, addr.length);
|
|
1436
|
+
}
|
|
1437
|
+
if (addr.length < 16) {
|
|
1438
|
+
for (let l = 0; l < 16 - addr.length; l++) {
|
|
1439
|
+
addr = `0${addr}`;
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
const result: number[] = [];
|
|
1443
|
+
let y = 0;
|
|
1444
|
+
for (let i = 0; i < 8; i++) {
|
|
1445
|
+
result[i] = Number.parseInt(addr.substr(y, 2), 16);
|
|
1446
|
+
y += 2;
|
|
1447
|
+
}
|
|
1448
|
+
const reverse = result.reverse();
|
|
1449
|
+
return reverse;
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
public macAddrArrayToString(addr: Array<number>): string {
|
|
1453
|
+
if (addr.length !== 8) {
|
|
1454
|
+
throw new Error(`invalid array length for MAC address: ${addr.length}`);
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
let result = "0x";
|
|
1458
|
+
let char = "";
|
|
1459
|
+
let i = 8;
|
|
1460
|
+
while (i--) {
|
|
1461
|
+
char = addr[i].toString(16);
|
|
1462
|
+
if (char.length < 2) {
|
|
1463
|
+
char = `0${char}`;
|
|
1464
|
+
}
|
|
1465
|
+
result += char;
|
|
1466
|
+
}
|
|
1467
|
+
return result;
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
/**
|
|
1471
|
+
* generalArrayToString result is not reversed!
|
|
1472
|
+
*/
|
|
1473
|
+
public generalArrayToString(key: Array<number>, length: number): string {
|
|
1474
|
+
let result = "0x";
|
|
1475
|
+
let char = "";
|
|
1476
|
+
let i = 0;
|
|
1477
|
+
while (i < length) {
|
|
1478
|
+
char = key[i].toString(16);
|
|
1479
|
+
if (char.length < 2) {
|
|
1480
|
+
char = `0${char}`;
|
|
1481
|
+
}
|
|
1482
|
+
result += char;
|
|
1483
|
+
i++;
|
|
1484
|
+
}
|
|
1485
|
+
return result;
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
private nextSeqNumber(): number {
|
|
1489
|
+
this.seqNumber++;
|
|
1490
|
+
|
|
1491
|
+
if (this.seqNumber > 254) {
|
|
1492
|
+
this.seqNumber = 1;
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
return this.seqNumber;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
private onParsed(frame: Uint8Array): void {
|
|
1499
|
+
if (frame.length >= 5) {
|
|
1500
|
+
// min. packet length [cmd, seq, status, u16 storedLength]
|
|
1501
|
+
const storedLength = (frame[4] << 8) | frame[3];
|
|
1502
|
+
if (storedLength + 2 !== frame.length) {
|
|
1503
|
+
// frame without CRC16
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
let crc = 0;
|
|
1508
|
+
for (let i = 0; i < storedLength; i++) {
|
|
1509
|
+
crc += frame[i];
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
crc = (~crc + 1) & 0xffff;
|
|
1513
|
+
const crcFrame = (frame[frame.length - 1] << 8) | frame[frame.length - 2];
|
|
1514
|
+
|
|
1515
|
+
if (crc === crcFrame) {
|
|
1516
|
+
this.lastFirmwareRxTime = Date.now();
|
|
1517
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandReceived, {cmd: frame[0], seq: frame[1]});
|
|
1518
|
+
this.emit("rxFrame", frame.slice(0, storedLength));
|
|
1519
|
+
} else {
|
|
1520
|
+
logger.debug("frame CRC invalid (could be ASCII message)", NS);
|
|
1521
|
+
}
|
|
1522
|
+
} else {
|
|
1523
|
+
logger.debug(`frame length (${frame.length}) < 5, discard`, NS);
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
export default Driver;
|