@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,1350 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
|
|
3
|
+
import debounce from "debounce";
|
|
4
|
+
|
|
5
|
+
import type * as Models from "../../../models";
|
|
6
|
+
import {Queue, Waitress, wait} from "../../../utils";
|
|
7
|
+
import {logger} from "../../../utils/logger";
|
|
8
|
+
import * as ZSpec from "../../../zspec";
|
|
9
|
+
import type {BroadcastAddress} from "../../../zspec/enums";
|
|
10
|
+
import type {Eui64} from "../../../zspec/tstypes";
|
|
11
|
+
import * as Zcl from "../../../zspec/zcl";
|
|
12
|
+
import * as Zdo from "../../../zspec/zdo";
|
|
13
|
+
import type * as ZdoTypes from "../../../zspec/zdo/definition/tstypes";
|
|
14
|
+
import Adapter from "../../adapter";
|
|
15
|
+
import type * as Events from "../../events";
|
|
16
|
+
import type {AdapterOptions, CoordinatorVersion, NetworkOptions, NetworkParameters, SerialPortOptions, StartResult} from "../../tstype";
|
|
17
|
+
import * as Constants from "../constants";
|
|
18
|
+
import {Constants as UnpiConstants} from "../unpi";
|
|
19
|
+
import {Znp, type ZpiObject} from "../znp";
|
|
20
|
+
import Definition from "../znp/definition";
|
|
21
|
+
import {isMtCmdAreqZdo} from "../znp/utils";
|
|
22
|
+
import {Endpoints} from "./endpoints";
|
|
23
|
+
import {ZnpAdapterManager} from "./manager";
|
|
24
|
+
import {ZnpVersion} from "./tstype";
|
|
25
|
+
import {KonnextConfig} from "../../../controller/model/konnextConfig";
|
|
26
|
+
|
|
27
|
+
const NS = "zh:zstack";
|
|
28
|
+
const Subsystem = UnpiConstants.Subsystem;
|
|
29
|
+
const Type = UnpiConstants.Type;
|
|
30
|
+
const {ZnpCommandStatus, AddressMode} = Constants.COMMON;
|
|
31
|
+
|
|
32
|
+
const DataConfirmTimeout = 9999; // Not an actual code
|
|
33
|
+
|
|
34
|
+
interface WaitressMatcher {
|
|
35
|
+
address?: number | string;
|
|
36
|
+
endpoint: number;
|
|
37
|
+
transactionSequenceNumber?: number;
|
|
38
|
+
frameType: Zcl.FrameType;
|
|
39
|
+
clusterID: number;
|
|
40
|
+
commandIdentifier: number;
|
|
41
|
+
direction: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
class DataConfirmError extends Error {
|
|
45
|
+
public code: number;
|
|
46
|
+
constructor(code: number) {
|
|
47
|
+
const error = code === DataConfirmTimeout ? "'TIMEOUT'" : `'${ZnpCommandStatus[code]}' (0x${code.toString(16)})`;
|
|
48
|
+
const message = `Data request failed with error: ${error}`;
|
|
49
|
+
super(message);
|
|
50
|
+
this.code = code;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export class ZStackAdapter extends Adapter {
|
|
55
|
+
private deviceAnnounceRouteDiscoveryDebouncers: Map<number, () => void>;
|
|
56
|
+
private znp: Znp;
|
|
57
|
+
// @ts-expect-error initialized in `start`
|
|
58
|
+
private adapterManager: ZnpAdapterManager;
|
|
59
|
+
private transactionID: number;
|
|
60
|
+
// @ts-expect-error initialized in `start`
|
|
61
|
+
private version: {
|
|
62
|
+
product: number;
|
|
63
|
+
transportrev: number;
|
|
64
|
+
majorrel: number;
|
|
65
|
+
minorrel: number;
|
|
66
|
+
maintrel: number;
|
|
67
|
+
revision: string;
|
|
68
|
+
};
|
|
69
|
+
private closing: boolean;
|
|
70
|
+
// @ts-expect-error initialized in `start`
|
|
71
|
+
private queue: Queue;
|
|
72
|
+
private supportsLED?: boolean;
|
|
73
|
+
private interpanLock: boolean;
|
|
74
|
+
private interpanEndpointRegistered: boolean;
|
|
75
|
+
private waitress: Waitress<Events.ZclPayload, WaitressMatcher>;
|
|
76
|
+
private konnextConfig: KonnextConfig;
|
|
77
|
+
|
|
78
|
+
public constructor(networkOptions: NetworkOptions, serialPortOptions: SerialPortOptions, backupPath: string, adapterOptions: AdapterOptions, konnextConfig: KonnextConfig) {
|
|
79
|
+
super(networkOptions, serialPortOptions, backupPath, adapterOptions);
|
|
80
|
+
this.hasZdoMessageOverhead = false;
|
|
81
|
+
this.manufacturerID = Zcl.ManufacturerCode.TEXAS_INSTRUMENTS;
|
|
82
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
83
|
+
this.znp = new Znp(this.serialPortOptions.path!, this.serialPortOptions.baudRate!, this.serialPortOptions.rtscts!, konnextConfig);
|
|
84
|
+
|
|
85
|
+
this.konnextConfig = konnextConfig;
|
|
86
|
+
this.transactionID = 0;
|
|
87
|
+
this.deviceAnnounceRouteDiscoveryDebouncers = new Map();
|
|
88
|
+
this.interpanLock = false;
|
|
89
|
+
this.interpanEndpointRegistered = false;
|
|
90
|
+
this.closing = false;
|
|
91
|
+
this.waitress = new Waitress<Events.ZclPayload, WaitressMatcher>(this.waitressValidator, this.waitressTimeoutFormatter);
|
|
92
|
+
|
|
93
|
+
this.znp.on("received", this.onZnpRecieved.bind(this));
|
|
94
|
+
this.znp.on("close", this.onZnpClose.bind(this));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Adapter methods
|
|
99
|
+
*/
|
|
100
|
+
public async start(): Promise<StartResult> {
|
|
101
|
+
await this.znp.open();
|
|
102
|
+
|
|
103
|
+
const attempts = 3;
|
|
104
|
+
for (let i = 0; i < attempts; i++) {
|
|
105
|
+
try {
|
|
106
|
+
await this.znp.request(Subsystem.SYS, "ping", {capabilities: 1});
|
|
107
|
+
break;
|
|
108
|
+
} catch (e) {
|
|
109
|
+
if (attempts - 1 === i) {
|
|
110
|
+
throw new Error(`Failed to connect to the adapter (${e})`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Old firmware did not support version, assume it's Z-Stack 1.2 for now.
|
|
116
|
+
try {
|
|
117
|
+
this.version = (await this.znp.requestWithReply(Subsystem.SYS, "version", {})).payload as typeof this.version;
|
|
118
|
+
} catch {
|
|
119
|
+
logger.debug("Failed to get zStack version, assuming 1.2", NS);
|
|
120
|
+
this.version = {transportrev: 2, product: 0, majorrel: 2, minorrel: 0, maintrel: 0, revision: ""};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const concurrent = this.adapterOptions?.concurrent ? this.adapterOptions.concurrent : this.version.product === ZnpVersion.ZStack3x0 ? 16 : 2;
|
|
124
|
+
|
|
125
|
+
logger.debug(`Adapter concurrent: ${concurrent}`, NS);
|
|
126
|
+
|
|
127
|
+
this.queue = new Queue(concurrent);
|
|
128
|
+
|
|
129
|
+
logger.debug(() => `Detected znp version '${ZnpVersion[this.version.product]}' (${JSON.stringify(this.version)})`, NS);
|
|
130
|
+
this.adapterManager = new ZnpAdapterManager(this, this.znp, {
|
|
131
|
+
backupPath: this.backupPath,
|
|
132
|
+
version: this.version.product,
|
|
133
|
+
greenPowerGroup: ZSpec.GP_GROUP_ID,
|
|
134
|
+
networkOptions: this.networkOptions,
|
|
135
|
+
adapterOptions: this.adapterOptions,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const startResult = this.adapterManager.start();
|
|
139
|
+
|
|
140
|
+
if (this.adapterOptions.disableLED) {
|
|
141
|
+
// Wait a bit for adapter to startup, otherwise led doesn't disable (tested with CC2531)
|
|
142
|
+
await wait(200);
|
|
143
|
+
await this.setLED("disable");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (this.adapterOptions.transmitPower != null) {
|
|
147
|
+
await this.znp.request(Subsystem.SYS, "stackTune", {operation: 0, value: this.adapterOptions.transmitPower});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return await startResult;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public async stop(): Promise<void> {
|
|
154
|
+
this.closing = true;
|
|
155
|
+
await this.znp.close();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public async getCoordinatorIEEE(): Promise<string> {
|
|
159
|
+
return await this.queue.execute(async () => {
|
|
160
|
+
this.checkInterpanLock();
|
|
161
|
+
const deviceInfo = await this.znp.requestWithReply(Subsystem.UTIL, "getDeviceInfo", {});
|
|
162
|
+
|
|
163
|
+
return deviceInfo.payload.ieeeaddr;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
public async getCoordinatorVersion(): Promise<CoordinatorVersion> {
|
|
168
|
+
return await Promise.resolve({type: ZnpVersion[this.version.product], meta: this.version});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
public async permitJoin(seconds: number, networkAddress?: number): Promise<void> {
|
|
172
|
+
const clusterId = Zdo.ClusterId.PERMIT_JOINING_REQUEST;
|
|
173
|
+
// `authentication`: TC significance always 1 (zb specs)
|
|
174
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, clusterId, seconds, 1, []);
|
|
175
|
+
|
|
176
|
+
if (networkAddress === undefined) {
|
|
177
|
+
await this.sendZdo(ZSpec.BLANK_EUI64, ZSpec.BroadcastAddress.DEFAULT, clusterId, zdoPayload, true);
|
|
178
|
+
} else {
|
|
179
|
+
// NOTE: `sendZdo` takes care of adjusting the payload as appropriate based on `networkAddress === 0` or not
|
|
180
|
+
const result = await this.sendZdo(ZSpec.BLANK_EUI64, networkAddress, clusterId, zdoPayload, false);
|
|
181
|
+
|
|
182
|
+
/* v8 ignore start */
|
|
183
|
+
if (!Zdo.Buffalo.checkStatus<Zdo.ClusterId.PERMIT_JOINING_RESPONSE>(result)) {
|
|
184
|
+
// TODO: will disappear once moved upstream
|
|
185
|
+
throw new Zdo.StatusError(result[0]);
|
|
186
|
+
}
|
|
187
|
+
/* v8 ignore stop */
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
await this.queue.execute<void>(async () => {
|
|
191
|
+
this.checkInterpanLock();
|
|
192
|
+
await this.setLED(seconds === 0 ? "off" : "on");
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public async reset(type: "soft" | "hard"): Promise<void> {
|
|
197
|
+
if (type === "soft") {
|
|
198
|
+
await this.znp.request(Subsystem.SYS, "resetReq", {type: Constants.SYS.resetType.SOFT});
|
|
199
|
+
} else {
|
|
200
|
+
await this.znp.request(Subsystem.SYS, "resetReq", {type: Constants.SYS.resetType.HARD});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private async setLED(action: "disable" | "on" | "off"): Promise<void> {
|
|
205
|
+
if (this.supportsLED == null) {
|
|
206
|
+
// Only zStack3x0 with 20210430 and greater support LED
|
|
207
|
+
const zStack3x0 = this.version.product === ZnpVersion.ZStack3x0;
|
|
208
|
+
this.supportsLED = !zStack3x0 || (zStack3x0 && Number.parseInt(this.version.revision, 10) >= 20210430);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (!this.supportsLED || (this.adapterOptions.disableLED && action !== "disable")) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Firmwares build on and after 20211029 should handle LED themselves
|
|
216
|
+
const firmwareControlsLed = Number.parseInt(this.version.revision, 10) >= 20211029;
|
|
217
|
+
const lookup = {
|
|
218
|
+
disable: firmwareControlsLed ? {ledid: 0xff, mode: 5} : {ledid: 3, mode: 0},
|
|
219
|
+
on: firmwareControlsLed ? null : {ledid: 3, mode: 1},
|
|
220
|
+
off: firmwareControlsLed ? null : {ledid: 3, mode: 0},
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const payload = lookup[action];
|
|
224
|
+
if (payload) {
|
|
225
|
+
await this.znp.request(Subsystem.UTIL, "ledControl", payload, undefined, 500).catch(() => {
|
|
226
|
+
// We cannot 100% correctly determine if an adapter supports LED. E.g. the zStack 1.2 20190608
|
|
227
|
+
// fw supports led on the CC2531 but not on the CC2530. Therefore if a led request fails never thrown
|
|
228
|
+
// an error but instead mark the led as unsupported.
|
|
229
|
+
// https://github.com/Koenkk/zigbee-herdsman/issues/377
|
|
230
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/7693
|
|
231
|
+
this.supportsLED = false;
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private async requestNetworkAddress(ieeeAddr: string): Promise<number> {
|
|
237
|
+
/**
|
|
238
|
+
* NOTE: There are cases where multiple nwkAddrRsp are recevied with different network addresses,
|
|
239
|
+
* this is currently not handled, the first nwkAddrRsp is taken.
|
|
240
|
+
*/
|
|
241
|
+
logger.debug(`Request network address of '${ieeeAddr}'`, NS);
|
|
242
|
+
|
|
243
|
+
const clusterId = Zdo.ClusterId.NETWORK_ADDRESS_REQUEST;
|
|
244
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.hasZdoMessageOverhead, clusterId, ieeeAddr as Eui64, false, 0);
|
|
245
|
+
|
|
246
|
+
const result = await this.sendZdoInternal(ieeeAddr, ZSpec.NULL_NODE_ID, clusterId, zdoPayload, false, true);
|
|
247
|
+
|
|
248
|
+
if (Zdo.Buffalo.checkStatus<Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE>(result)) {
|
|
249
|
+
return result[1].nwkAddress;
|
|
250
|
+
/* v8 ignore start */
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// TODO: will disappear once moved upstream
|
|
254
|
+
throw new Zdo.StatusError(result[0]);
|
|
255
|
+
/* v8 ignore stop */
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private supportsAssocRemove(): boolean {
|
|
259
|
+
return this.version.product === ZnpVersion.ZStack3x0 && Number.parseInt(this.version.revision, 10) >= 20200805;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private supportsAssocAdd(): boolean {
|
|
263
|
+
return this.version.product === ZnpVersion.ZStack3x0 && Number.parseInt(this.version.revision, 10) >= 20201026;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private async discoverRoute(networkAddress: number, waitSettled = true): Promise<void> {
|
|
267
|
+
logger.debug(`Discovering route to ${networkAddress}`, NS);
|
|
268
|
+
const payload = {dstAddr: networkAddress, options: 0, radius: Constants.AF.DEFAULT_RADIUS};
|
|
269
|
+
await this.znp.request(Subsystem.ZDO, "extRouteDisc", payload);
|
|
270
|
+
|
|
271
|
+
if (waitSettled) {
|
|
272
|
+
await wait(3000);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Retrieve all data for AF_INCOMING_MSG_EXT with huge data byte count.
|
|
278
|
+
*
|
|
279
|
+
* @param timestamp
|
|
280
|
+
* @param length full data length
|
|
281
|
+
*
|
|
282
|
+
* @returns Buffer containing the full data or undefined on error
|
|
283
|
+
*/
|
|
284
|
+
private async dataRetrieveAll(timestamp: number, length: number): Promise<Buffer | undefined> {
|
|
285
|
+
const buf = Buffer.alloc(length);
|
|
286
|
+
const blockSize = 240;
|
|
287
|
+
|
|
288
|
+
const freeExtMessage = async () => {
|
|
289
|
+
// A length of zero is special and triggers the freeing of
|
|
290
|
+
// the corresponding incoming message.
|
|
291
|
+
await this.znp.requestWithReply(Subsystem.AF, "dataRetrieve", {timestamp: timestamp, index: 0, length: 0});
|
|
292
|
+
};
|
|
293
|
+
for (let index = 0; index < length; index += blockSize) {
|
|
294
|
+
const chunkSize = Math.min(blockSize, length - index);
|
|
295
|
+
const rsp = await this.znp.requestWithReply(
|
|
296
|
+
Subsystem.AF,
|
|
297
|
+
"dataRetrieve",
|
|
298
|
+
{
|
|
299
|
+
timestamp: timestamp,
|
|
300
|
+
index: index,
|
|
301
|
+
length: chunkSize,
|
|
302
|
+
},
|
|
303
|
+
undefined,
|
|
304
|
+
);
|
|
305
|
+
// 0x00 = afStatus_SUCCESS
|
|
306
|
+
if (rsp.payload.status !== 0x00) {
|
|
307
|
+
logger.error(
|
|
308
|
+
`dataRetrieve [timestamp: ${timestamp}, index: ${index}, chunkSize: ${chunkSize}] error status: ${rsp.payload.status}`,
|
|
309
|
+
NS,
|
|
310
|
+
);
|
|
311
|
+
await freeExtMessage();
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
if (rsp.payload.length !== chunkSize) {
|
|
315
|
+
logger.error(`dataRetrieve length mismatch [${chunkSize} requested, ${rsp.payload.length} returned`, NS);
|
|
316
|
+
await freeExtMessage();
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
rsp.payload.data.copy(buf, index);
|
|
320
|
+
}
|
|
321
|
+
await freeExtMessage();
|
|
322
|
+
return buf;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
public async sendZdo(
|
|
326
|
+
ieeeAddress: string,
|
|
327
|
+
networkAddress: number,
|
|
328
|
+
clusterId: Zdo.ClusterId,
|
|
329
|
+
payload: Buffer,
|
|
330
|
+
disableResponse: true,
|
|
331
|
+
): Promise<void>;
|
|
332
|
+
public async sendZdo<K extends keyof ZdoTypes.RequestToResponseMap>(
|
|
333
|
+
ieeeAddress: string,
|
|
334
|
+
networkAddress: number,
|
|
335
|
+
clusterId: K,
|
|
336
|
+
payload: Buffer,
|
|
337
|
+
disableResponse: false,
|
|
338
|
+
): Promise<ZdoTypes.RequestToResponseMap[K]>;
|
|
339
|
+
public async sendZdo<K extends keyof ZdoTypes.RequestToResponseMap>(
|
|
340
|
+
ieeeAddress: string,
|
|
341
|
+
networkAddress: number,
|
|
342
|
+
clusterId: K,
|
|
343
|
+
payload: Buffer,
|
|
344
|
+
disableResponse: boolean,
|
|
345
|
+
): Promise<ZdoTypes.RequestToResponseMap[K] | undefined> {
|
|
346
|
+
return await this.sendZdoInternal(ieeeAddress, networkAddress, clusterId, payload, disableResponse, false);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
private async sendZdoInternal(
|
|
350
|
+
ieeeAddress: string,
|
|
351
|
+
networkAddress: number,
|
|
352
|
+
clusterId: Zdo.ClusterId,
|
|
353
|
+
payload: Buffer,
|
|
354
|
+
disableResponse: boolean,
|
|
355
|
+
skipQueue: boolean,
|
|
356
|
+
): Promise<undefined>;
|
|
357
|
+
private async sendZdoInternal<K extends keyof ZdoTypes.RequestToResponseMap>(
|
|
358
|
+
ieeeAddress: string,
|
|
359
|
+
networkAddress: number,
|
|
360
|
+
clusterId: K,
|
|
361
|
+
payload: Buffer,
|
|
362
|
+
disableResponse: false,
|
|
363
|
+
skipQueue: boolean,
|
|
364
|
+
): Promise<ZdoTypes.RequestToResponseMap[K]>;
|
|
365
|
+
private async sendZdoInternal<K extends keyof ZdoTypes.RequestToResponseMap>(
|
|
366
|
+
ieeeAddress: string,
|
|
367
|
+
networkAddress: number,
|
|
368
|
+
clusterId: K,
|
|
369
|
+
payload: Buffer,
|
|
370
|
+
disableResponse: boolean,
|
|
371
|
+
skipQueue: boolean,
|
|
372
|
+
): Promise<ZdoTypes.RequestToResponseMap[K] | undefined> {
|
|
373
|
+
const func = async (): Promise<ZdoTypes.RequestToResponseMap[K] | undefined> => {
|
|
374
|
+
this.checkInterpanLock();
|
|
375
|
+
|
|
376
|
+
// stack-specific requirements
|
|
377
|
+
switch (clusterId) {
|
|
378
|
+
case Zdo.ClusterId.PERMIT_JOINING_REQUEST: {
|
|
379
|
+
const finalPayload = Buffer.alloc(payload.length + 3);
|
|
380
|
+
finalPayload.writeUInt8(ZSpec.BroadcastAddress[networkAddress] ? AddressMode.ADDR_BROADCAST : AddressMode.ADDR_16BIT, 0);
|
|
381
|
+
// zstack uses AddressMode.ADDR_16BIT + ZSpec.BroadcastAddress.DEFAULT to signal "coordinator-only"
|
|
382
|
+
finalPayload.writeUInt16LE(networkAddress === 0 ? ZSpec.BroadcastAddress.DEFAULT : networkAddress, 1);
|
|
383
|
+
finalPayload.set(payload, 3);
|
|
384
|
+
|
|
385
|
+
payload = finalPayload;
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
case Zdo.ClusterId.NWK_UPDATE_REQUEST: {
|
|
390
|
+
// extra zeroes for empty nwkManagerAddr if necessary
|
|
391
|
+
const zeroes = 9 - payload.length - 1; /* zstack doesn't have nwkUpdateId */
|
|
392
|
+
const finalPayload = Buffer.alloc(payload.length + 3 + zeroes);
|
|
393
|
+
finalPayload.writeUInt16LE(networkAddress, 0);
|
|
394
|
+
finalPayload.writeUInt8(ZSpec.BroadcastAddress[networkAddress] ? AddressMode.ADDR_BROADCAST : AddressMode.ADDR_16BIT, 2);
|
|
395
|
+
finalPayload.set(payload, 3);
|
|
396
|
+
|
|
397
|
+
payload = finalPayload;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
case Zdo.ClusterId.BIND_REQUEST:
|
|
402
|
+
case Zdo.ClusterId.UNBIND_REQUEST: {
|
|
403
|
+
// extra zeroes for uint16 (in place of ieee when MULTICAST) and endpoint (not used when MULTICAST)
|
|
404
|
+
const zeroes = 21 - payload.length;
|
|
405
|
+
const finalPayload = Buffer.alloc(payload.length + 2 + zeroes);
|
|
406
|
+
finalPayload.writeUInt16LE(networkAddress, 0);
|
|
407
|
+
finalPayload.set(payload, 2);
|
|
408
|
+
|
|
409
|
+
payload = finalPayload;
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
case Zdo.ClusterId.NETWORK_ADDRESS_REQUEST:
|
|
414
|
+
case Zdo.ClusterId.IEEE_ADDRESS_REQUEST: {
|
|
415
|
+
// no modification necessary
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
default: {
|
|
420
|
+
const finalPayload = Buffer.alloc(payload.length + 2);
|
|
421
|
+
finalPayload.writeUInt16LE(networkAddress, 0);
|
|
422
|
+
finalPayload.set(payload, 2);
|
|
423
|
+
|
|
424
|
+
payload = finalPayload;
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
let waiter: ReturnType<typeof this.znp.waitFor> | undefined;
|
|
430
|
+
|
|
431
|
+
if (!disableResponse) {
|
|
432
|
+
const responseClusterId = Zdo.Utils.getResponseClusterId(clusterId);
|
|
433
|
+
|
|
434
|
+
if (responseClusterId) {
|
|
435
|
+
const cmd = Definition[Subsystem.ZDO].find((c) => isMtCmdAreqZdo(c) && c.zdoClusterId === responseClusterId);
|
|
436
|
+
assert(cmd, `Response for ZDO cluster ID '${responseClusterId}' not supported.`);
|
|
437
|
+
|
|
438
|
+
waiter = this.znp.waitFor(
|
|
439
|
+
UnpiConstants.Type.AREQ,
|
|
440
|
+
Subsystem.ZDO,
|
|
441
|
+
cmd.name,
|
|
442
|
+
responseClusterId === Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE ? ieeeAddress : networkAddress,
|
|
443
|
+
undefined,
|
|
444
|
+
undefined,
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
try {
|
|
450
|
+
await this.znp.requestZdo(clusterId, payload, waiter?.ID);
|
|
451
|
+
} catch (error) {
|
|
452
|
+
if (clusterId === Zdo.ClusterId.NODE_DESCRIPTOR_REQUEST) {
|
|
453
|
+
// Discover route when node descriptor request fails
|
|
454
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/3276
|
|
455
|
+
logger.debug(`Discover route to '${networkAddress}' because node descriptor request failed`, NS);
|
|
456
|
+
await this.discoverRoute(networkAddress);
|
|
457
|
+
await this.znp.requestZdo(clusterId, payload, /* v8 ignore next */ waiter?.ID);
|
|
458
|
+
} else {
|
|
459
|
+
throw error;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
if (waiter) {
|
|
464
|
+
const response = await waiter.start().promise;
|
|
465
|
+
|
|
466
|
+
return response.payload.zdo;
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
return skipQueue ? await func() : await this.queue.execute(func, networkAddress);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
public async sendZclFrameToEndpoint(
|
|
473
|
+
ieeeAddr: string,
|
|
474
|
+
networkAddress: number,
|
|
475
|
+
endpoint: number,
|
|
476
|
+
zclFrame: Zcl.Frame,
|
|
477
|
+
timeout: number,
|
|
478
|
+
disableResponse: boolean,
|
|
479
|
+
disableRecovery: boolean,
|
|
480
|
+
sourceEndpoint?: number,
|
|
481
|
+
profileId?: number,
|
|
482
|
+
): Promise<Events.ZclPayload | undefined> {
|
|
483
|
+
const srcEndpoint = this.selectSourceEndpoint(sourceEndpoint, profileId);
|
|
484
|
+
|
|
485
|
+
return await this.queue.execute<Events.ZclPayload | undefined>(async () => {
|
|
486
|
+
this.checkInterpanLock();
|
|
487
|
+
return await this.sendZclFrameToEndpointInternal(
|
|
488
|
+
ieeeAddr,
|
|
489
|
+
networkAddress,
|
|
490
|
+
endpoint,
|
|
491
|
+
srcEndpoint,
|
|
492
|
+
zclFrame,
|
|
493
|
+
timeout,
|
|
494
|
+
disableResponse,
|
|
495
|
+
disableRecovery,
|
|
496
|
+
0,
|
|
497
|
+
0,
|
|
498
|
+
false,
|
|
499
|
+
false,
|
|
500
|
+
false,
|
|
501
|
+
undefined,
|
|
502
|
+
);
|
|
503
|
+
}, networkAddress);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
private async sendZclFrameToEndpointInternal(
|
|
507
|
+
ieeeAddr: string,
|
|
508
|
+
networkAddress: number,
|
|
509
|
+
endpoint: number,
|
|
510
|
+
sourceEndpoint: number,
|
|
511
|
+
zclFrame: Zcl.Frame,
|
|
512
|
+
timeout: number,
|
|
513
|
+
disableResponse: boolean,
|
|
514
|
+
disableRecovery: boolean,
|
|
515
|
+
responseAttempt: number,
|
|
516
|
+
dataRequestAttempt: number,
|
|
517
|
+
checkedNetworkAddress: boolean,
|
|
518
|
+
discoveredRoute: boolean,
|
|
519
|
+
assocRemove: boolean,
|
|
520
|
+
assocRestore?: {ieeeadr: string; nwkaddr: number; noderelation: number},
|
|
521
|
+
): Promise<Events.ZclPayload | undefined> {
|
|
522
|
+
logger.debug(
|
|
523
|
+
`sendZclFrameToEndpointInternal ${ieeeAddr}:${networkAddress}/${endpoint} ` +
|
|
524
|
+
`(${responseAttempt},${dataRequestAttempt},${this.queue.count()})`,
|
|
525
|
+
NS,
|
|
526
|
+
);
|
|
527
|
+
let response = null;
|
|
528
|
+
const command = zclFrame.command;
|
|
529
|
+
if (command.response !== undefined && disableResponse === false) {
|
|
530
|
+
response = this.waitForInternal(
|
|
531
|
+
networkAddress,
|
|
532
|
+
endpoint,
|
|
533
|
+
zclFrame.header.frameControl.frameType,
|
|
534
|
+
Zcl.Direction.SERVER_TO_CLIENT,
|
|
535
|
+
zclFrame.header.transactionSequenceNumber,
|
|
536
|
+
zclFrame.cluster.ID,
|
|
537
|
+
command.response,
|
|
538
|
+
timeout,
|
|
539
|
+
);
|
|
540
|
+
} else if (!zclFrame.header.frameControl.disableDefaultResponse) {
|
|
541
|
+
response = this.waitForInternal(
|
|
542
|
+
networkAddress,
|
|
543
|
+
endpoint,
|
|
544
|
+
Zcl.FrameType.GLOBAL,
|
|
545
|
+
Zcl.Direction.SERVER_TO_CLIENT,
|
|
546
|
+
zclFrame.header.transactionSequenceNumber,
|
|
547
|
+
zclFrame.cluster.ID,
|
|
548
|
+
Zcl.Foundation.defaultRsp.ID,
|
|
549
|
+
timeout,
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
const dataConfirmResult = await this.dataRequest(
|
|
554
|
+
networkAddress,
|
|
555
|
+
endpoint,
|
|
556
|
+
sourceEndpoint,
|
|
557
|
+
zclFrame.cluster.ID,
|
|
558
|
+
Constants.AF.DEFAULT_RADIUS,
|
|
559
|
+
zclFrame.toBuffer(),
|
|
560
|
+
timeout,
|
|
561
|
+
);
|
|
562
|
+
|
|
563
|
+
if (dataConfirmResult !== ZnpCommandStatus.SUCCESS) {
|
|
564
|
+
// In case dataConfirm timesout (= null) or gives an error, try to recover
|
|
565
|
+
logger.debug(`Data confirm error (${ieeeAddr}:${networkAddress},${dataConfirmResult},${dataRequestAttempt})`, NS);
|
|
566
|
+
if (response !== null) response.cancel();
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* In case we did an assocRemove in the previous attempt and it still fails after this, assume that the
|
|
570
|
+
* coordinator is still the parent of the device (but for some reason the device is not available now).
|
|
571
|
+
* Re-add the device to the assoc table, otherwise we will never be able to reach it anymore.
|
|
572
|
+
*/
|
|
573
|
+
if (assocRemove && assocRestore && this.supportsAssocAdd()) {
|
|
574
|
+
logger.debug(`assocAdd(${assocRestore.ieeeadr})`, NS);
|
|
575
|
+
await this.znp.request(Subsystem.UTIL, "assocAdd", assocRestore);
|
|
576
|
+
assocRestore = undefined;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const recoverableErrors = [
|
|
580
|
+
ZnpCommandStatus.NWK_NO_ROUTE,
|
|
581
|
+
ZnpCommandStatus.MAC_NO_ACK,
|
|
582
|
+
ZnpCommandStatus.MAC_CHANNEL_ACCESS_FAILURE,
|
|
583
|
+
ZnpCommandStatus.MAC_TRANSACTION_EXPIRED,
|
|
584
|
+
ZnpCommandStatus.BUFFER_FULL,
|
|
585
|
+
ZnpCommandStatus.MAC_NO_RESOURCES,
|
|
586
|
+
];
|
|
587
|
+
|
|
588
|
+
if (dataRequestAttempt >= 4 || !recoverableErrors.includes(dataConfirmResult) || disableRecovery) {
|
|
589
|
+
throw new DataConfirmError(dataConfirmResult);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
if (
|
|
593
|
+
dataConfirmResult === ZnpCommandStatus.MAC_CHANNEL_ACCESS_FAILURE ||
|
|
594
|
+
dataConfirmResult === ZnpCommandStatus.BUFFER_FULL ||
|
|
595
|
+
dataConfirmResult === ZnpCommandStatus.MAC_NO_RESOURCES
|
|
596
|
+
) {
|
|
597
|
+
/**
|
|
598
|
+
* MAC_CHANNEL_ACCESS_FAILURE: When many commands at once are executed we can end up in a MAC
|
|
599
|
+
* channel access failure error. This is because there is too much traffic on the network.
|
|
600
|
+
* Retry this command once after a cooling down period.
|
|
601
|
+
* BUFFER_FULL: When many commands are executed at once the buffer can get full, wait
|
|
602
|
+
* some time and retry.
|
|
603
|
+
* MAC_NO_RESOURCES: Operation could not be completed because no memory resources are available,
|
|
604
|
+
* wait some time and retry.
|
|
605
|
+
*/
|
|
606
|
+
await wait(2000);
|
|
607
|
+
return await this.sendZclFrameToEndpointInternal(
|
|
608
|
+
ieeeAddr,
|
|
609
|
+
networkAddress,
|
|
610
|
+
endpoint,
|
|
611
|
+
sourceEndpoint,
|
|
612
|
+
zclFrame,
|
|
613
|
+
timeout,
|
|
614
|
+
disableResponse,
|
|
615
|
+
disableRecovery,
|
|
616
|
+
responseAttempt,
|
|
617
|
+
dataRequestAttempt + 1,
|
|
618
|
+
checkedNetworkAddress,
|
|
619
|
+
discoveredRoute,
|
|
620
|
+
assocRemove,
|
|
621
|
+
assocRestore,
|
|
622
|
+
);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
let doAssocRemove = false;
|
|
626
|
+
if (
|
|
627
|
+
!assocRemove &&
|
|
628
|
+
dataConfirmResult === ZnpCommandStatus.MAC_TRANSACTION_EXPIRED &&
|
|
629
|
+
dataRequestAttempt >= 1 &&
|
|
630
|
+
this.supportsAssocRemove()
|
|
631
|
+
) {
|
|
632
|
+
const match = await this.znp.requestWithReply(Subsystem.UTIL, "assocGetWithAddress", {
|
|
633
|
+
extaddr: ieeeAddr,
|
|
634
|
+
nwkaddr: networkAddress,
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
if (match.payload.nwkaddr !== 0xfffe && match.payload.noderelation !== 255) {
|
|
638
|
+
doAssocRemove = true;
|
|
639
|
+
assocRestore = {ieeeadr: ieeeAddr, nwkaddr: networkAddress, noderelation: match.payload.noderelation};
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
assocRemove = true;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// NWK_NO_ROUTE: no network route => rediscover route
|
|
646
|
+
// MAC_NO_ACK: route may be corrupted
|
|
647
|
+
// MAC_TRANSACTION_EXPIRED: Mac layer is sleeping
|
|
648
|
+
if (doAssocRemove) {
|
|
649
|
+
/**
|
|
650
|
+
* Since child aging is disabled on the firmware, when a end device is directly connected
|
|
651
|
+
* to the coordinator and changes parent and the coordinator does not recevie this update,
|
|
652
|
+
* it still thinks it's directly connected.
|
|
653
|
+
* A discoverRoute() is not send out in this case, therefore remove it from the associated device
|
|
654
|
+
* list and try again.
|
|
655
|
+
* Note: assocRemove is a custom command, not available by default, only available on recent
|
|
656
|
+
* z-stack-firmware firmware version. In case it's not supported by the coordinator we will
|
|
657
|
+
* automatically timeout after 60000ms.
|
|
658
|
+
*/
|
|
659
|
+
logger.debug(`assocRemove(${ieeeAddr})`, NS);
|
|
660
|
+
await this.znp.request(Subsystem.UTIL, "assocRemove", {ieeeadr: ieeeAddr});
|
|
661
|
+
} else if (!discoveredRoute && dataRequestAttempt >= 1) {
|
|
662
|
+
discoveredRoute = true;
|
|
663
|
+
await this.discoverRoute(networkAddress);
|
|
664
|
+
} else if (!checkedNetworkAddress && dataRequestAttempt >= 1) {
|
|
665
|
+
// Figure out once if the network address has been changed.
|
|
666
|
+
try {
|
|
667
|
+
checkedNetworkAddress = true;
|
|
668
|
+
const actualNetworkAddress = await this.requestNetworkAddress(ieeeAddr);
|
|
669
|
+
if (networkAddress !== actualNetworkAddress) {
|
|
670
|
+
logger.debug("Failed because request was done with wrong network address", NS);
|
|
671
|
+
discoveredRoute = true;
|
|
672
|
+
networkAddress = actualNetworkAddress;
|
|
673
|
+
await this.discoverRoute(actualNetworkAddress);
|
|
674
|
+
} else {
|
|
675
|
+
logger.debug("Network address did not change", NS);
|
|
676
|
+
}
|
|
677
|
+
/* v8 ignore start */
|
|
678
|
+
} catch {
|
|
679
|
+
/* empty */
|
|
680
|
+
}
|
|
681
|
+
/* v8 ignore stop */
|
|
682
|
+
} else {
|
|
683
|
+
logger.debug("Wait 2000ms", NS);
|
|
684
|
+
await wait(2000);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
return await this.sendZclFrameToEndpointInternal(
|
|
688
|
+
ieeeAddr,
|
|
689
|
+
networkAddress,
|
|
690
|
+
endpoint,
|
|
691
|
+
sourceEndpoint,
|
|
692
|
+
zclFrame,
|
|
693
|
+
timeout,
|
|
694
|
+
disableResponse,
|
|
695
|
+
disableRecovery,
|
|
696
|
+
responseAttempt,
|
|
697
|
+
dataRequestAttempt + 1,
|
|
698
|
+
checkedNetworkAddress,
|
|
699
|
+
discoveredRoute,
|
|
700
|
+
assocRemove,
|
|
701
|
+
assocRestore,
|
|
702
|
+
);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
if (response !== null) {
|
|
706
|
+
try {
|
|
707
|
+
const result = await response.start().promise;
|
|
708
|
+
return result;
|
|
709
|
+
} catch (error) {
|
|
710
|
+
logger.debug(`Response timeout (${ieeeAddr}:${networkAddress},${responseAttempt})`, NS);
|
|
711
|
+
if (responseAttempt < 1 && !disableRecovery) {
|
|
712
|
+
// No response could be because the radio of the end device is turned off:
|
|
713
|
+
// Sometimes the coordinator does not properly set the PENDING flag.
|
|
714
|
+
// Try to rewrite the device entry in the association table, this fixes it sometimes.
|
|
715
|
+
const match = await this.znp.requestWithReply(Subsystem.UTIL, "assocGetWithAddress", {
|
|
716
|
+
extaddr: ieeeAddr,
|
|
717
|
+
nwkaddr: networkAddress,
|
|
718
|
+
});
|
|
719
|
+
logger.debug(
|
|
720
|
+
`Response timeout recovery: Node relation ${match.payload.noderelation} (${ieeeAddr} / ${match.payload.nwkaddr})`,
|
|
721
|
+
NS,
|
|
722
|
+
);
|
|
723
|
+
if (
|
|
724
|
+
this.supportsAssocAdd() &&
|
|
725
|
+
this.supportsAssocRemove() &&
|
|
726
|
+
match.payload.nwkaddr !== 0xfffe &&
|
|
727
|
+
match.payload.noderelation === 1
|
|
728
|
+
) {
|
|
729
|
+
logger.debug(`Response timeout recovery: Rewrite association table entry (${ieeeAddr})`, NS);
|
|
730
|
+
await this.znp.request(Subsystem.UTIL, "assocRemove", {ieeeadr: ieeeAddr});
|
|
731
|
+
await this.znp.request(Subsystem.UTIL, "assocAdd", {
|
|
732
|
+
ieeeadr: ieeeAddr,
|
|
733
|
+
nwkaddr: networkAddress,
|
|
734
|
+
noderelation: match.payload.noderelation,
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
// No response could be of invalid route, e.g. when message is send to wrong parent of end device.
|
|
738
|
+
await this.discoverRoute(networkAddress);
|
|
739
|
+
return await this.sendZclFrameToEndpointInternal(
|
|
740
|
+
ieeeAddr,
|
|
741
|
+
networkAddress,
|
|
742
|
+
endpoint,
|
|
743
|
+
sourceEndpoint,
|
|
744
|
+
zclFrame,
|
|
745
|
+
timeout,
|
|
746
|
+
disableResponse,
|
|
747
|
+
disableRecovery,
|
|
748
|
+
responseAttempt + 1,
|
|
749
|
+
dataRequestAttempt,
|
|
750
|
+
checkedNetworkAddress,
|
|
751
|
+
discoveredRoute,
|
|
752
|
+
assocRemove,
|
|
753
|
+
assocRestore,
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
throw error;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
public async sendZclFrameToGroup(groupID: number, zclFrame: Zcl.Frame, sourceEndpoint?: number, profileId?: number): Promise<void> {
|
|
763
|
+
const srcEndpoint = this.selectSourceEndpoint(sourceEndpoint, profileId);
|
|
764
|
+
|
|
765
|
+
return await this.queue.execute<void>(async () => {
|
|
766
|
+
this.checkInterpanLock();
|
|
767
|
+
await this.dataRequestExtended(
|
|
768
|
+
AddressMode.ADDR_GROUP,
|
|
769
|
+
groupID,
|
|
770
|
+
0xff,
|
|
771
|
+
0,
|
|
772
|
+
srcEndpoint,
|
|
773
|
+
zclFrame.cluster.ID,
|
|
774
|
+
Constants.AF.DEFAULT_RADIUS,
|
|
775
|
+
zclFrame.toBuffer(),
|
|
776
|
+
3000,
|
|
777
|
+
true,
|
|
778
|
+
);
|
|
779
|
+
|
|
780
|
+
/**
|
|
781
|
+
* As a group command is not confirmed and thus immidiately returns
|
|
782
|
+
* (contrary to network address requests) we will give the
|
|
783
|
+
* command some time to 'settle' in the network.
|
|
784
|
+
*/
|
|
785
|
+
await wait(200);
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
public async sendZclFrameToAll(
|
|
790
|
+
endpoint: number,
|
|
791
|
+
zclFrame: Zcl.Frame,
|
|
792
|
+
sourceEndpoint: number,
|
|
793
|
+
destination: BroadcastAddress,
|
|
794
|
+
profileId?: number,
|
|
795
|
+
): Promise<void> {
|
|
796
|
+
const srcEndpoint = this.selectSourceEndpoint(sourceEndpoint, profileId);
|
|
797
|
+
|
|
798
|
+
return await this.queue.execute<void>(async () => {
|
|
799
|
+
this.checkInterpanLock();
|
|
800
|
+
await this.dataRequestExtended(
|
|
801
|
+
AddressMode.ADDR_16BIT,
|
|
802
|
+
destination,
|
|
803
|
+
endpoint,
|
|
804
|
+
0,
|
|
805
|
+
srcEndpoint,
|
|
806
|
+
zclFrame.cluster.ID,
|
|
807
|
+
Constants.AF.DEFAULT_RADIUS,
|
|
808
|
+
zclFrame.toBuffer(),
|
|
809
|
+
3000,
|
|
810
|
+
false,
|
|
811
|
+
0,
|
|
812
|
+
);
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* As a broadcast command is not confirmed and thus immidiately returns
|
|
816
|
+
* (contrary to network address requests) we will give the
|
|
817
|
+
* command some time to 'settle' in the network.
|
|
818
|
+
*/
|
|
819
|
+
await wait(200);
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
public async addInstallCode(ieeeAddress: string, key: Buffer, hashed: boolean): Promise<void> {
|
|
824
|
+
assert(this.version.product !== ZnpVersion.ZStack12, "Install code is not supported for ZStack 1.2 adapter");
|
|
825
|
+
// TODO: always use 0x2? => const hashedKey = hashed ? key : ZSpec.Utils.aes128MmoHash(key);
|
|
826
|
+
const payload = {installCodeFormat: hashed ? 0x2 : 0x1, ieeeaddr: ieeeAddress, installCode: key};
|
|
827
|
+
await this.znp.request(Subsystem.APP_CNF, "bdbAddInstallCode", payload);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Event handlers
|
|
832
|
+
*/
|
|
833
|
+
public onZnpClose(): void {
|
|
834
|
+
if (!this.closing) {
|
|
835
|
+
this.emit("disconnected");
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
private onZnpRecieved(object: ZpiObject): void {
|
|
840
|
+
if (object.type !== UnpiConstants.Type.AREQ) {
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
if (object.subsystem === Subsystem.ZDO) {
|
|
845
|
+
if (isMtCmdAreqZdo(object.command)) {
|
|
846
|
+
this.emit("zdoResponse", object.command.zdoClusterId, object.payload.zdo);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
if (object.command.name === "tcDeviceInd") {
|
|
850
|
+
const payload: Events.DeviceJoinedPayload = {
|
|
851
|
+
networkAddress: object.payload.nwkaddr,
|
|
852
|
+
ieeeAddr: object.payload.extaddr,
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
this.emit("deviceJoined", payload);
|
|
856
|
+
} else if (object.command.name === "endDeviceAnnceInd") {
|
|
857
|
+
// TODO: better way???
|
|
858
|
+
if (Zdo.Buffalo.checkStatus<Zdo.ClusterId.END_DEVICE_ANNOUNCE>(object.payload.zdo)) {
|
|
859
|
+
const zdoPayload = object.payload.zdo[1];
|
|
860
|
+
// Only discover routes to end devices, if bit 1 of capabilities === 0 it's an end device.
|
|
861
|
+
const isEndDevice = zdoPayload.capabilities.deviceType === 0;
|
|
862
|
+
|
|
863
|
+
if (isEndDevice) {
|
|
864
|
+
if (!this.deviceAnnounceRouteDiscoveryDebouncers.has(zdoPayload.nwkAddress)) {
|
|
865
|
+
// If a device announces multiple times in a very short time, it makes no sense
|
|
866
|
+
// to rediscover the route every time.
|
|
867
|
+
const debouncer = debounce(
|
|
868
|
+
() => {
|
|
869
|
+
this.queue
|
|
870
|
+
.execute<void>(async () => {
|
|
871
|
+
await this.discoverRoute(zdoPayload.nwkAddress, false).catch(() => {});
|
|
872
|
+
}, zdoPayload.nwkAddress)
|
|
873
|
+
.catch(() => {});
|
|
874
|
+
},
|
|
875
|
+
60 * 1000,
|
|
876
|
+
{immediate: true},
|
|
877
|
+
);
|
|
878
|
+
this.deviceAnnounceRouteDiscoveryDebouncers.set(zdoPayload.nwkAddress, debouncer);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
const debouncer = this.deviceAnnounceRouteDiscoveryDebouncers.get(zdoPayload.nwkAddress);
|
|
882
|
+
assert(debouncer);
|
|
883
|
+
debouncer();
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
} else if (object.command.name === "concentratorIndCb") {
|
|
887
|
+
// Some routers may change short addresses and the announcement
|
|
888
|
+
// is missed by the coordinator. This can happen when there are
|
|
889
|
+
// power outages or other interruptions in service. They may
|
|
890
|
+
// not send additional announcements, causing the device to go
|
|
891
|
+
// offline. However, those devices may instead send
|
|
892
|
+
// Concentrator Indicator Callback commands, which contain both
|
|
893
|
+
// the short and the long address allowing us to update our own
|
|
894
|
+
// mappings.
|
|
895
|
+
// https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/158/4403.zstacktask.c
|
|
896
|
+
// https://github.com/Koenkk/zigbee-herdsman/issues/74
|
|
897
|
+
this.emit("zdoResponse", Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE, [
|
|
898
|
+
Zdo.Status.SUCCESS,
|
|
899
|
+
{
|
|
900
|
+
eui64: object.payload.extaddr,
|
|
901
|
+
nwkAddress: object.payload.srcaddr,
|
|
902
|
+
startIndex: 0,
|
|
903
|
+
assocDevList: [],
|
|
904
|
+
} as ZdoTypes.NetworkAddressResponse,
|
|
905
|
+
]);
|
|
906
|
+
} else {
|
|
907
|
+
if (object.command.name === "leaveInd") {
|
|
908
|
+
if (object.payload.rejoin) {
|
|
909
|
+
logger.debug("Device leave: Got leave indication with rejoin=true, nothing to do", NS);
|
|
910
|
+
} else {
|
|
911
|
+
const payload: Events.DeviceLeavePayload = {
|
|
912
|
+
networkAddress: object.payload.srcaddr,
|
|
913
|
+
ieeeAddr: object.payload.extaddr,
|
|
914
|
+
};
|
|
915
|
+
|
|
916
|
+
this.emit("deviceLeave", payload);
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
} else {
|
|
921
|
+
if (object.subsystem === Subsystem.AF) {
|
|
922
|
+
if (object.command.name === "incomingMsg" || object.command.name === "incomingMsgExt") {
|
|
923
|
+
// TI ZNP API docs
|
|
924
|
+
// ---------------
|
|
925
|
+
// AF_INCOMING_MSG_EXT - SrcAddrMode
|
|
926
|
+
// A value of 3 (i.e. the enumeration value for ‘afAddr64Bit’) indicates 8-
|
|
927
|
+
// byte/64-bit address mode; otherwise, only the 2 LSB’s of the 8 bytes are
|
|
928
|
+
// used to form a 2-byte short address.
|
|
929
|
+
|
|
930
|
+
// Addr is currently parsed by Buffalo as Eui64 (`0x${string}`), but it's
|
|
931
|
+
// possible future changes could read srcaddrmode and parse accordingly.
|
|
932
|
+
// Prior tests also passed an integer (e.g. 2), so best to handle all cases.
|
|
933
|
+
// If type is not a string, we assume a 16-bit address.
|
|
934
|
+
|
|
935
|
+
const isEui64Addr = typeof object.payload.srcaddr === "string";
|
|
936
|
+
|
|
937
|
+
const srcaddr =
|
|
938
|
+
object.command.name === "incomingMsgExt" && object.payload.srcaddrmode !== 0x03
|
|
939
|
+
? isEui64Addr
|
|
940
|
+
? Number.parseInt(object.payload.srcaddr.slice(-4), 16)
|
|
941
|
+
: object.payload.srcaddr
|
|
942
|
+
: object.payload.srcaddr;
|
|
943
|
+
|
|
944
|
+
// TI ZNP API docs suggest that payload.data should be zero length for messages
|
|
945
|
+
// with huge data, but testing shows it is 3-bytes, the first two of which are
|
|
946
|
+
// the 16-bit srcAddr.
|
|
947
|
+
// Possibly zh is not parsing incomingMsgExt correctly. Just compare len with
|
|
948
|
+
// payload length for now.
|
|
949
|
+
//if (object.command.name === "incomingMsgExt" && object.payload.len > 0 && object.payload.data.length === 0) {
|
|
950
|
+
|
|
951
|
+
if (object.command.name === "incomingMsgExt" && object.payload.data.length < object.payload.len) {
|
|
952
|
+
// The ZNP will send incomingMsgExt (AF_INCOMING_MSG_EXT)
|
|
953
|
+
// when data length is > about 223 bytes (or if INTER_PAN network
|
|
954
|
+
// is used).
|
|
955
|
+
//
|
|
956
|
+
// In the first case, the data is not included in the payload, but
|
|
957
|
+
// must be retrieved block by block from the ZNP buffer using the
|
|
958
|
+
// AF_DATA_RETRIEVE message.
|
|
959
|
+
|
|
960
|
+
this.queue
|
|
961
|
+
.execute<void>(async () => {
|
|
962
|
+
const data = await this.dataRetrieveAll(object.payload.timestamp, object.payload.len);
|
|
963
|
+
if (data === undefined) {
|
|
964
|
+
logger.error("Failed to retrieve chunked payload for incomingMsgExt", NS);
|
|
965
|
+
} else {
|
|
966
|
+
logger.debug(
|
|
967
|
+
`Retrieved ${data.length} bytes from huge data buffer for msg with timestamp ${object.payload.timestamp}`,
|
|
968
|
+
NS,
|
|
969
|
+
);
|
|
970
|
+
const payload: Events.ZclPayload = {
|
|
971
|
+
clusterID: object.payload.clusterid,
|
|
972
|
+
data: data,
|
|
973
|
+
header: Zcl.Header.fromBuffer(data),
|
|
974
|
+
address: srcaddr,
|
|
975
|
+
endpoint: object.payload.srcendpoint,
|
|
976
|
+
linkquality: object.payload.linkquality,
|
|
977
|
+
groupID: object.payload.groupid,
|
|
978
|
+
wasBroadcast: object.payload.wasbroadcast === 1,
|
|
979
|
+
destinationEndpoint: object.payload.dstendpoint,
|
|
980
|
+
};
|
|
981
|
+
this.waitress.resolve(payload);
|
|
982
|
+
this.emit("zclPayload", payload);
|
|
983
|
+
}
|
|
984
|
+
})
|
|
985
|
+
.catch(() => {});
|
|
986
|
+
} else {
|
|
987
|
+
// incomingMsg OR incomingMsgExt with data
|
|
988
|
+
// in the payload (i.e. INTER_PAN network)
|
|
989
|
+
|
|
990
|
+
const payload: Events.ZclPayload = {
|
|
991
|
+
clusterID: object.payload.clusterid,
|
|
992
|
+
data: object.payload.data,
|
|
993
|
+
header: Zcl.Header.fromBuffer(object.payload.data),
|
|
994
|
+
address: srcaddr,
|
|
995
|
+
endpoint: object.payload.srcendpoint,
|
|
996
|
+
linkquality: object.payload.linkquality,
|
|
997
|
+
groupID: object.payload.groupid,
|
|
998
|
+
wasBroadcast: object.payload.wasbroadcast === 1,
|
|
999
|
+
destinationEndpoint: object.payload.dstendpoint,
|
|
1000
|
+
};
|
|
1001
|
+
|
|
1002
|
+
this.waitress.resolve(payload);
|
|
1003
|
+
this.emit("zclPayload", payload);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
public async getNetworkParameters(): Promise<NetworkParameters> {
|
|
1011
|
+
const result = await this.znp.requestWithReply(Subsystem.ZDO, "extNwkInfo", {});
|
|
1012
|
+
return {
|
|
1013
|
+
panID: result.payload.panid as number,
|
|
1014
|
+
extendedPanID: result.payload.extendedpanid as string, // read as IEEEADDR, so `0x${string}`
|
|
1015
|
+
channel: result.payload.channel as number,
|
|
1016
|
+
/**
|
|
1017
|
+
* Return a dummy nwkUpdateId of 0, the nwkUpdateId is used when changing channels however the
|
|
1018
|
+
* zstack API does not allow to set this value. Instead it automatically increments the nwkUpdateId
|
|
1019
|
+
* based on the value in the NIB.
|
|
1020
|
+
* https://github.com/Koenkk/zigbee-herdsman/pull/1280#discussion_r1947815987
|
|
1021
|
+
*/
|
|
1022
|
+
nwkUpdateID: 0,
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
public async supportsBackup(): Promise<boolean> {
|
|
1027
|
+
return await Promise.resolve(true);
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
public async backup(ieeeAddressesInDatabase: string[]): Promise<Models.Backup> {
|
|
1031
|
+
return await this.adapterManager.backup.createBackup(ieeeAddressesInDatabase);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
public async setChannelInterPAN(channel: number): Promise<void> {
|
|
1035
|
+
return await this.queue.execute<void>(async () => {
|
|
1036
|
+
this.interpanLock = true;
|
|
1037
|
+
await this.znp.request(Subsystem.AF, "interPanCtl", {cmd: 1, data: [channel]});
|
|
1038
|
+
|
|
1039
|
+
if (!this.interpanEndpointRegistered) {
|
|
1040
|
+
// Make sure that endpoint 12 is registered to proxy the InterPAN messages.
|
|
1041
|
+
await this.znp.request(Subsystem.AF, "interPanCtl", {cmd: 2, data: [12]});
|
|
1042
|
+
this.interpanEndpointRegistered = true;
|
|
1043
|
+
}
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
public async sendZclFrameInterPANToIeeeAddr(zclFrame: Zcl.Frame, ieeeAddr: string): Promise<void> {
|
|
1048
|
+
return await this.queue.execute<void>(async () => {
|
|
1049
|
+
await this.dataRequestExtended(
|
|
1050
|
+
AddressMode.ADDR_64BIT,
|
|
1051
|
+
ieeeAddr,
|
|
1052
|
+
0xfe,
|
|
1053
|
+
0xffff,
|
|
1054
|
+
12,
|
|
1055
|
+
zclFrame.cluster.ID,
|
|
1056
|
+
30,
|
|
1057
|
+
zclFrame.toBuffer(),
|
|
1058
|
+
10000,
|
|
1059
|
+
false,
|
|
1060
|
+
);
|
|
1061
|
+
});
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<Events.ZclPayload>;
|
|
1065
|
+
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
|
|
1066
|
+
public async sendZclFrameInterPANBroadcast(
|
|
1067
|
+
zclFrame: Zcl.Frame,
|
|
1068
|
+
timeout: number,
|
|
1069
|
+
disableResponse: boolean,
|
|
1070
|
+
): Promise<Events.ZclPayload | undefined> {
|
|
1071
|
+
return await this.queue.execute<Events.ZclPayload | undefined>(async () => {
|
|
1072
|
+
const command = zclFrame.command;
|
|
1073
|
+
if (!disableResponse && command.response === undefined) {
|
|
1074
|
+
throw new Error(`Command '${command.name}' has no response, cannot wait for response`);
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
let response: ReturnType<typeof this.waitForInternal> | undefined;
|
|
1078
|
+
|
|
1079
|
+
if (!disableResponse && command.response !== undefined) {
|
|
1080
|
+
response = this.waitForInternal(
|
|
1081
|
+
undefined,
|
|
1082
|
+
0xfe,
|
|
1083
|
+
zclFrame.header.frameControl.frameType,
|
|
1084
|
+
Zcl.Direction.SERVER_TO_CLIENT,
|
|
1085
|
+
undefined,
|
|
1086
|
+
zclFrame.cluster.ID,
|
|
1087
|
+
command.response,
|
|
1088
|
+
timeout,
|
|
1089
|
+
);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
try {
|
|
1093
|
+
await this.dataRequestExtended(
|
|
1094
|
+
AddressMode.ADDR_16BIT,
|
|
1095
|
+
0xffff,
|
|
1096
|
+
0xfe,
|
|
1097
|
+
0xffff,
|
|
1098
|
+
12,
|
|
1099
|
+
zclFrame.cluster.ID,
|
|
1100
|
+
30,
|
|
1101
|
+
zclFrame.toBuffer(),
|
|
1102
|
+
10000,
|
|
1103
|
+
false,
|
|
1104
|
+
);
|
|
1105
|
+
} catch (error) {
|
|
1106
|
+
response?.cancel();
|
|
1107
|
+
throw error;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
if (response) {
|
|
1111
|
+
return await response.start().promise;
|
|
1112
|
+
}
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
public async restoreChannelInterPAN(): Promise<void> {
|
|
1117
|
+
return await this.queue.execute<void>(async () => {
|
|
1118
|
+
await this.znp.request(Subsystem.AF, "interPanCtl", {cmd: 0, data: []});
|
|
1119
|
+
// Give adapter some time to restore, otherwise stuff crashes
|
|
1120
|
+
await wait(3000);
|
|
1121
|
+
this.interpanLock = false;
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
private waitForInternal(
|
|
1126
|
+
networkAddress: number | undefined,
|
|
1127
|
+
endpoint: number,
|
|
1128
|
+
frameType: Zcl.FrameType,
|
|
1129
|
+
direction: Zcl.Direction,
|
|
1130
|
+
transactionSequenceNumber: number | undefined,
|
|
1131
|
+
clusterID: number,
|
|
1132
|
+
commandIdentifier: number,
|
|
1133
|
+
timeout: number,
|
|
1134
|
+
): {start: () => {promise: Promise<Events.ZclPayload>}; cancel: () => void} {
|
|
1135
|
+
const payload = {
|
|
1136
|
+
address: networkAddress,
|
|
1137
|
+
endpoint,
|
|
1138
|
+
clusterID,
|
|
1139
|
+
commandIdentifier,
|
|
1140
|
+
frameType,
|
|
1141
|
+
direction,
|
|
1142
|
+
transactionSequenceNumber,
|
|
1143
|
+
};
|
|
1144
|
+
|
|
1145
|
+
const waiter = this.waitress.waitFor(payload, timeout);
|
|
1146
|
+
const cancel = (): void => this.waitress.remove(waiter.ID);
|
|
1147
|
+
return {start: waiter.start, cancel};
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
public waitFor(
|
|
1151
|
+
networkAddress: number | undefined,
|
|
1152
|
+
endpoint: number,
|
|
1153
|
+
frameType: Zcl.FrameType,
|
|
1154
|
+
direction: Zcl.Direction,
|
|
1155
|
+
transactionSequenceNumber: number | undefined,
|
|
1156
|
+
clusterID: number,
|
|
1157
|
+
commandIdentifier: number,
|
|
1158
|
+
timeout: number,
|
|
1159
|
+
): {promise: Promise<Events.ZclPayload>; cancel: () => void} {
|
|
1160
|
+
const waiter = this.waitForInternal(
|
|
1161
|
+
networkAddress,
|
|
1162
|
+
endpoint,
|
|
1163
|
+
frameType,
|
|
1164
|
+
direction,
|
|
1165
|
+
transactionSequenceNumber,
|
|
1166
|
+
clusterID,
|
|
1167
|
+
commandIdentifier,
|
|
1168
|
+
timeout,
|
|
1169
|
+
);
|
|
1170
|
+
|
|
1171
|
+
return {cancel: waiter.cancel, promise: waiter.start().promise};
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
/**
|
|
1175
|
+
* Private methods
|
|
1176
|
+
*/
|
|
1177
|
+
private async dataRequest(
|
|
1178
|
+
destinationAddress: number,
|
|
1179
|
+
destinationEndpoint: number,
|
|
1180
|
+
sourceEndpoint: number,
|
|
1181
|
+
clusterID: number,
|
|
1182
|
+
radius: number,
|
|
1183
|
+
data: Buffer,
|
|
1184
|
+
timeout: number,
|
|
1185
|
+
): Promise<number> {
|
|
1186
|
+
const transactionID = this.nextTransactionID();
|
|
1187
|
+
const response = this.znp.waitFor(Type.AREQ, Subsystem.AF, "dataConfirm", undefined, transactionID, undefined, timeout);
|
|
1188
|
+
|
|
1189
|
+
await this.znp.request(
|
|
1190
|
+
Subsystem.AF,
|
|
1191
|
+
"dataRequest",
|
|
1192
|
+
{
|
|
1193
|
+
dstaddr: destinationAddress,
|
|
1194
|
+
destendpoint: destinationEndpoint,
|
|
1195
|
+
srcendpoint: sourceEndpoint,
|
|
1196
|
+
clusterid: clusterID,
|
|
1197
|
+
transid: transactionID,
|
|
1198
|
+
options: 0,
|
|
1199
|
+
radius: radius,
|
|
1200
|
+
len: data.length,
|
|
1201
|
+
data: data,
|
|
1202
|
+
},
|
|
1203
|
+
response.ID,
|
|
1204
|
+
);
|
|
1205
|
+
|
|
1206
|
+
let result = null;
|
|
1207
|
+
try {
|
|
1208
|
+
const dataConfirm = await response.start().promise;
|
|
1209
|
+
result = dataConfirm.payload.status;
|
|
1210
|
+
} catch {
|
|
1211
|
+
result = DataConfirmTimeout;
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
return result;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
private async dataRequestExtended(
|
|
1218
|
+
addressMode: number,
|
|
1219
|
+
destinationAddressOrGroupID: number | string,
|
|
1220
|
+
destinationEndpoint: number,
|
|
1221
|
+
panID: number,
|
|
1222
|
+
sourceEndpoint: number,
|
|
1223
|
+
clusterID: number,
|
|
1224
|
+
radius: number,
|
|
1225
|
+
data: Buffer,
|
|
1226
|
+
timeout: number,
|
|
1227
|
+
confirmation: boolean,
|
|
1228
|
+
attemptsLeft = 5,
|
|
1229
|
+
): Promise<ZpiObject | undefined> {
|
|
1230
|
+
const transactionID = this.nextTransactionID();
|
|
1231
|
+
const response = confirmation
|
|
1232
|
+
? this.znp.waitFor(Type.AREQ, Subsystem.AF, "dataConfirm", undefined, transactionID, undefined, timeout)
|
|
1233
|
+
: undefined;
|
|
1234
|
+
|
|
1235
|
+
await this.znp.request(
|
|
1236
|
+
Subsystem.AF,
|
|
1237
|
+
"dataRequestExt",
|
|
1238
|
+
{
|
|
1239
|
+
dstaddrmode: addressMode,
|
|
1240
|
+
dstaddr: this.toAddressString(destinationAddressOrGroupID),
|
|
1241
|
+
destendpoint: destinationEndpoint,
|
|
1242
|
+
dstpanid: panID,
|
|
1243
|
+
srcendpoint: sourceEndpoint,
|
|
1244
|
+
clusterid: clusterID,
|
|
1245
|
+
transid: transactionID,
|
|
1246
|
+
options: 0, // TODO: why was this here? Constants.AF.options.DISCV_ROUTE,
|
|
1247
|
+
radius,
|
|
1248
|
+
len: data.length,
|
|
1249
|
+
data: data,
|
|
1250
|
+
},
|
|
1251
|
+
response?.ID,
|
|
1252
|
+
);
|
|
1253
|
+
|
|
1254
|
+
if (confirmation && response) {
|
|
1255
|
+
const dataConfirm = await response.start().promise;
|
|
1256
|
+
if (dataConfirm.payload.status !== ZnpCommandStatus.SUCCESS) {
|
|
1257
|
+
if (
|
|
1258
|
+
attemptsLeft > 0 &&
|
|
1259
|
+
(dataConfirm.payload.status === ZnpCommandStatus.MAC_CHANNEL_ACCESS_FAILURE ||
|
|
1260
|
+
dataConfirm.payload.status === ZnpCommandStatus.BUFFER_FULL)
|
|
1261
|
+
) {
|
|
1262
|
+
/**
|
|
1263
|
+
* 225: When many commands at once are executed we can end up in a MAC channel access failure
|
|
1264
|
+
* error. This is because there is too much traffic on the network.
|
|
1265
|
+
* Retry this command once after a cooling down period.
|
|
1266
|
+
*/
|
|
1267
|
+
await wait(2000);
|
|
1268
|
+
return await this.dataRequestExtended(
|
|
1269
|
+
addressMode,
|
|
1270
|
+
destinationAddressOrGroupID,
|
|
1271
|
+
destinationEndpoint,
|
|
1272
|
+
panID,
|
|
1273
|
+
sourceEndpoint,
|
|
1274
|
+
clusterID,
|
|
1275
|
+
radius,
|
|
1276
|
+
data,
|
|
1277
|
+
timeout,
|
|
1278
|
+
confirmation,
|
|
1279
|
+
attemptsLeft - 1,
|
|
1280
|
+
);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
throw new DataConfirmError(dataConfirm.payload.status);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
return dataConfirm;
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
private nextTransactionID(): number {
|
|
1291
|
+
this.transactionID++;
|
|
1292
|
+
|
|
1293
|
+
if (this.transactionID > 255) {
|
|
1294
|
+
this.transactionID = 1;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
return this.transactionID;
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
private toAddressString(address: number | string): string {
|
|
1301
|
+
return typeof address === "number" ? `0x${address.toString(16).padStart(16, "0")}` : address.toString();
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
private waitressTimeoutFormatter(matcher: WaitressMatcher, timeout: number): string {
|
|
1305
|
+
return (
|
|
1306
|
+
`Timeout - ${matcher.address} - ${matcher.endpoint}` +
|
|
1307
|
+
` - ${matcher.transactionSequenceNumber} - ${matcher.clusterID}` +
|
|
1308
|
+
` - ${matcher.commandIdentifier} after ${timeout}ms`
|
|
1309
|
+
);
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
private waitressValidator(payload: Events.ZclPayload, matcher: WaitressMatcher): boolean {
|
|
1313
|
+
return Boolean(
|
|
1314
|
+
payload.header &&
|
|
1315
|
+
(!matcher.address || payload.address === matcher.address) &&
|
|
1316
|
+
payload.endpoint === matcher.endpoint &&
|
|
1317
|
+
(matcher.transactionSequenceNumber === undefined || payload.header.transactionSequenceNumber === matcher.transactionSequenceNumber) &&
|
|
1318
|
+
payload.clusterID === matcher.clusterID &&
|
|
1319
|
+
matcher.frameType === payload.header.frameControl.frameType &&
|
|
1320
|
+
matcher.commandIdentifier === payload.header.commandIdentifier &&
|
|
1321
|
+
matcher.direction === payload.header.frameControl.direction,
|
|
1322
|
+
);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
private checkInterpanLock(): void {
|
|
1326
|
+
if (this.interpanLock) {
|
|
1327
|
+
throw new Error("Cannot execute command, in Inter-PAN mode");
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
private selectSourceEndpoint(sourceEndpoint?: number, profileId?: number): number {
|
|
1332
|
+
// Use provided sourceEndpoint as the highest priority
|
|
1333
|
+
let srcEndpoint = sourceEndpoint;
|
|
1334
|
+
// If sourceEndpoint is not provided, try to select the source endpoint based on the profileId.
|
|
1335
|
+
if (srcEndpoint === undefined && profileId !== undefined) {
|
|
1336
|
+
srcEndpoint = Endpoints.find((e) => e.appprofid === profileId)?.endpoint;
|
|
1337
|
+
}
|
|
1338
|
+
//If no profileId is provided, or if no corresponding endpoint exists, use endpoint 1.
|
|
1339
|
+
if (srcEndpoint === undefined) {
|
|
1340
|
+
srcEndpoint = 1;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
// Validate that the requested profileId can be satisfied by the adapter.
|
|
1344
|
+
if (profileId !== undefined && Endpoints.find((e) => e.endpoint === srcEndpoint)?.appprofid !== profileId) {
|
|
1345
|
+
throw new Error(`Profile ID ${profileId} is not supported by this adapter.`);
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
return srcEndpoint;
|
|
1349
|
+
}
|
|
1350
|
+
}
|