@willieee802/zigbee-herdsman 0.48.3 → 0.49.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1283 -0
- package/README.md +1 -1
- package/biome.json +103 -0
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
- package/dist/adapter/const.d.ts.map +1 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
- package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
- package/dist/adapter/events.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/index.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
- package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
- package/dist/adapter/zboss/driver.d.ts.map +1 -0
- package/dist/adapter/zboss/frame.d.ts.map +1 -0
- package/dist/adapter/zboss/frame.js +200 -0
- package/dist/adapter/zboss/frame.js.map +1 -0
- package/dist/adapter/zboss/uart.d.ts.map +1 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.js +70 -62
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
- package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/controller/controller.js +524 -350
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/database.d.ts.map +1 -1
- package/dist/controller/events.d.ts.map +1 -1
- package/dist/controller/events.js +0 -110
- package/dist/controller/events.js.map +1 -1
- package/dist/controller/greenPower.d.ts.map +1 -1
- package/dist/controller/greenPower.js +330 -121
- package/dist/controller/greenPower.js.map +1 -1
- package/dist/controller/helpers/index.d.ts.map +1 -1
- package/dist/controller/helpers/ota.d.ts.map +1 -0
- package/dist/controller/helpers/ota.js +467 -0
- package/dist/controller/helpers/ota.js.map +1 -0
- package/dist/controller/helpers/request.d.ts.map +1 -1
- package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.js +36 -22
- package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
- package/dist/controller/index.d.ts.map +1 -1
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +1052 -402
- package/dist/controller/model/device.js.map +1 -1
- package/dist/controller/model/endpoint.d.ts.map +1 -1
- package/dist/controller/model/endpoint.js +447 -292
- package/dist/controller/model/endpoint.js.map +1 -1
- package/dist/controller/model/entity.d.ts.map +1 -1
- package/dist/controller/model/group.d.ts.map +1 -1
- package/dist/controller/model/group.js +202 -85
- package/dist/controller/model/group.js.map +1 -1
- package/dist/controller/model/index.d.ts.map +1 -1
- package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
- package/dist/controller/touchlink.d.ts.map +1 -1
- package/dist/controller/tstype.d.ts.map +1 -1
- package/dist/controller/tstype.js +0 -6
- package/dist/controller/tstype.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/utils/timeService.d.ts.map +1 -0
- package/dist/utils/timeService.js +127 -0
- package/dist/utils/timeService.js.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
- package/dist/zspec/zcl/buffaloZcl.js +327 -287
- package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
- package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
- package/dist/zspec/zcl/definition/cluster.js +6050 -4043
- package/dist/zspec/zcl/definition/cluster.js.map +1 -1
- package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
- package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/clusters-types.js +3 -0
- package/dist/zspec/zcl/definition/clusters-types.js.map +1 -0
- package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
- package/dist/zspec/zcl/definition/foundation.js +170 -99
- package/dist/zspec/zcl/definition/foundation.js.map +1 -1
- package/dist/zspec/zcl/definition/tstype.d.ts +190 -31
- package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
- package/dist/zspec/zcl/definition/tstype.js +0 -1
- package/dist/zspec/zcl/definition/tstype.js.map +1 -1
- package/dist/zspec/zcl/index.d.ts.map +1 -1
- package/dist/zspec/zcl/index.js +23 -13
- package/dist/zspec/zcl/index.js.map +1 -1
- package/dist/zspec/zcl/utils.d.ts.map +1 -1
- package/dist/zspec/zcl/utils.js +288 -103
- package/dist/zspec/zcl/utils.js.map +1 -1
- package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
- package/dist/zspec/zcl/zclFrame.js +121 -97
- package/dist/zspec/zcl/zclFrame.js.map +1 -1
- package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
- package/dist/zspec/zcl/zclHeader.js +13 -13
- package/dist/zspec/zcl/zclHeader.js.map +1 -1
- package/examples/join-and-log.js +18 -18
- package/package.json +23 -3
- 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 +578 -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 +7554 -0
- package/src/zspec/zcl/definition/clusters-types.ts +8228 -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 +432 -0
- package/src/zspec/zcl/index.ts +11 -0
- package/src/zspec/zcl/utils.ts +504 -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 +10038 -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 +2887 -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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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/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.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.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/database.d.ts +0 -20
- 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/greenPower.d.ts +0 -14
- package/dist/controller/helpers/index.d.ts +0 -3
- 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.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.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/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.js +0 -9
- package/dist/controller/index.js.map +0 -1
- package/dist/controller/model/device.d.ts +0 -140
- package/dist/controller/model/endpoint.d.ts +0 -134
- package/dist/controller/model/entity.d.ts +0 -15
- 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/index.d.ts +0 -6
- 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.js +0 -157
- package/dist/controller/touchlink.js.map +0 -1
- package/dist/controller/tstype.d.ts +0 -21
- package/dist/index.d.ts +0 -6
- 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/definition/cluster.d.ts +0 -3
- 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/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/index.d.ts +0 -11
- package/dist/zspec/zcl/utils.d.ts +0 -7
- package/dist/zspec/zcl/zclFrame.d.ts +0 -36
- package/dist/zspec/zcl/zclHeader.d.ts +0 -17
- 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
|
@@ -15,83 +15,66 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
28
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
|
|
30
|
-
const
|
|
39
|
+
exports.Controller = void 0;
|
|
40
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
41
|
+
const node_events_1 = __importDefault(require("node:events"));
|
|
42
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
31
43
|
const adapter_1 = require("../adapter");
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const fs_1 = __importDefault(require("fs"));
|
|
44
|
+
const utils_1 = require("../utils");
|
|
45
|
+
const logger_1 = require("../utils/logger");
|
|
46
|
+
const utils_2 = require("../utils/utils");
|
|
47
|
+
const ZSpec = __importStar(require("../zspec"));
|
|
37
48
|
const Zcl = __importStar(require("../zspec/zcl"));
|
|
38
|
-
const
|
|
49
|
+
const Zdo = __importStar(require("../zspec/zdo"));
|
|
50
|
+
const database_1 = __importDefault(require("./database"));
|
|
39
51
|
const greenPower_1 = __importDefault(require("./greenPower"));
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
52
|
+
const helpers_1 = require("./helpers");
|
|
53
|
+
const installCodes_1 = require("./helpers/installCodes");
|
|
54
|
+
const zclTransactionSequenceNumber_1 = __importDefault(require("./helpers/zclTransactionSequenceNumber"));
|
|
55
|
+
const model_1 = require("./model");
|
|
56
|
+
const device_1 = require("./model/device");
|
|
45
57
|
const group_1 = __importDefault(require("./model/group"));
|
|
46
|
-
const
|
|
47
|
-
const NS =
|
|
48
|
-
async function catcho(func, errorMessage) {
|
|
49
|
-
try {
|
|
50
|
-
await func();
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
logger_1.logger.error(`${errorMessage}: ${error}`, NS);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const DefaultOptions = {
|
|
57
|
-
network: {
|
|
58
|
-
networkKeyDistribute: false,
|
|
59
|
-
networkKey: [0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D],
|
|
60
|
-
panID: 0x1a62,
|
|
61
|
-
extendedPanID: [0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD],
|
|
62
|
-
channelList: [11],
|
|
63
|
-
},
|
|
64
|
-
serialPort: {},
|
|
65
|
-
databasePath: null,
|
|
66
|
-
databaseBackupPath: null,
|
|
67
|
-
backupPath: null,
|
|
68
|
-
adapter: { disableLED: false },
|
|
69
|
-
acceptJoiningDeviceHandler: null,
|
|
70
|
-
konnextConfig: {
|
|
71
|
-
isEncrypted: 0,
|
|
72
|
-
},
|
|
73
|
-
};
|
|
58
|
+
const touchlink_1 = __importDefault(require("./touchlink"));
|
|
59
|
+
const NS = "zh:controller";
|
|
74
60
|
/**
|
|
75
61
|
* @noInheritDoc
|
|
76
62
|
*/
|
|
77
|
-
class Controller extends
|
|
63
|
+
class Controller extends node_events_1.default.EventEmitter {
|
|
78
64
|
options;
|
|
79
65
|
database;
|
|
80
66
|
adapter;
|
|
81
|
-
greenPower;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
permitJoinTimeoutTimer;
|
|
86
|
-
permitJoinTimeout;
|
|
87
|
-
// eslint-disable-next-line
|
|
67
|
+
#greenPower;
|
|
68
|
+
#touchlink;
|
|
69
|
+
permitJoinTimer;
|
|
70
|
+
permitJoinEnd;
|
|
88
71
|
backupTimer;
|
|
89
|
-
// eslint-disable-next-line
|
|
90
72
|
databaseSaveTimer;
|
|
91
|
-
touchlink;
|
|
92
73
|
stopping;
|
|
93
74
|
adapterDisconnected;
|
|
94
75
|
networkParametersCached;
|
|
76
|
+
/** List of unknown devices detected during a single runtime session. Serves as de-dupe and anti-spam. */
|
|
77
|
+
unknownDevices;
|
|
95
78
|
/**
|
|
96
79
|
* Create a controller
|
|
97
80
|
*
|
|
@@ -101,168 +84,227 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
101
84
|
super();
|
|
102
85
|
this.stopping = false;
|
|
103
86
|
this.adapterDisconnected = true; // set false after adapter.start() is successfully called
|
|
104
|
-
|
|
87
|
+
const { network: networkOpts, serialPort: serialPortOpts, adapter: adapterOpts, konnextConfig: konnextConfigOpts, ...restOpts } = options;
|
|
88
|
+
this.options = {
|
|
89
|
+
network: {
|
|
90
|
+
networkKeyDistribute: false,
|
|
91
|
+
networkKey: [0x01, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0d],
|
|
92
|
+
extendedPanID: [0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd],
|
|
93
|
+
...networkOpts,
|
|
94
|
+
},
|
|
95
|
+
serialPort: { ...serialPortOpts },
|
|
96
|
+
adapter: {
|
|
97
|
+
...adapterOpts,
|
|
98
|
+
},
|
|
99
|
+
konnextConfig: {
|
|
100
|
+
// @ts-ignore-next-line we need to set a default value for isEncrypted
|
|
101
|
+
isEncrypted: 0,
|
|
102
|
+
...konnextConfigOpts,
|
|
103
|
+
},
|
|
104
|
+
...restOpts,
|
|
105
|
+
};
|
|
106
|
+
this.unknownDevices = new Set();
|
|
105
107
|
// Validate options
|
|
106
108
|
for (const channel of this.options.network.channelList) {
|
|
107
109
|
if (channel < 11 || channel > 26) {
|
|
108
110
|
throw new Error(`'${channel}' is an invalid channel, use a channel between 11 - 26.`);
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
|
-
if (!
|
|
112
|
-
throw new Error(`Network key must be 16 digits long, got ${this.options.network.networkKey
|
|
113
|
+
if (!(0, utils_2.isNumberArrayOfLength)(this.options.network.networkKey, 16)) {
|
|
114
|
+
throw new Error(`Network key must be a 16 digits long array, got ${this.options.network.networkKey}.`);
|
|
113
115
|
}
|
|
114
|
-
if (!
|
|
115
|
-
throw new Error(`ExtendedPanID must be 8 digits long, got ${this.options.network.extendedPanID
|
|
116
|
+
if (!(0, utils_2.isNumberArrayOfLength)(this.options.network.extendedPanID, 8)) {
|
|
117
|
+
throw new Error(`ExtendedPanID must be an 8 digits long array, got ${this.options.network.extendedPanID}.`);
|
|
116
118
|
}
|
|
117
|
-
if (this.options.network.panID
|
|
119
|
+
if (this.options.network.panID < 1 || this.options.network.panID >= 0xffff) {
|
|
118
120
|
throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
|
|
119
121
|
}
|
|
120
122
|
}
|
|
123
|
+
get greenPower() {
|
|
124
|
+
return this.#greenPower;
|
|
125
|
+
}
|
|
126
|
+
get touchlink() {
|
|
127
|
+
return this.#touchlink;
|
|
128
|
+
}
|
|
121
129
|
/**
|
|
122
130
|
* Start the Herdsman controller
|
|
123
131
|
*/
|
|
124
|
-
async start() {
|
|
132
|
+
async start(abortSignal) {
|
|
125
133
|
// Database (create end inject)
|
|
126
134
|
this.database = database_1.default.open(this.options.databasePath);
|
|
127
135
|
model_1.Entity.injectDatabase(this.database);
|
|
128
136
|
// Adapter (create and inject)
|
|
129
137
|
this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.options.konnextConfig);
|
|
130
|
-
|
|
138
|
+
abortSignal?.throwIfAborted();
|
|
139
|
+
const stringifiedOptions = JSON.stringify(this.options).replaceAll(JSON.stringify(this.options.network.networkKey), '"HIDDEN"');
|
|
140
|
+
logger_1.logger.debug(`Starting with options '${stringifiedOptions}'`, NS);
|
|
131
141
|
const startResult = await this.adapter.start();
|
|
132
142
|
logger_1.logger.debug(`Started with result '${startResult}'`, NS);
|
|
133
143
|
this.adapterDisconnected = false;
|
|
144
|
+
abortSignal?.throwIfAborted();
|
|
134
145
|
// Check if we have to change the channel, only do this when adapter `resumed` because:
|
|
135
146
|
// - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
|
|
136
147
|
// - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
|
|
137
|
-
if (
|
|
138
|
-
const netParams =
|
|
139
|
-
|
|
140
|
-
|
|
148
|
+
if (startResult === "resumed") {
|
|
149
|
+
const netParams = await this.getNetworkParameters();
|
|
150
|
+
const configuredChannel = this.options.network.channelList[0];
|
|
151
|
+
const adapterChannel = netParams.channel;
|
|
152
|
+
const nwkUpdateID = netParams.nwkUpdateID;
|
|
153
|
+
if (configuredChannel !== adapterChannel) {
|
|
154
|
+
logger_1.logger.info(`Configured channel '${configuredChannel}' does not match adapter channel '${adapterChannel}', changing channel`, NS);
|
|
155
|
+
await this.changeChannel(adapterChannel, configuredChannel, nwkUpdateID);
|
|
156
|
+
abortSignal?.throwIfAborted();
|
|
141
157
|
}
|
|
142
158
|
}
|
|
143
159
|
model_1.Entity.injectAdapter(this.database.id, this.adapter);
|
|
144
160
|
// log injection
|
|
145
|
-
logger_1.logger.debug(`Injected database: ${this.database
|
|
146
|
-
this
|
|
147
|
-
this
|
|
161
|
+
logger_1.logger.debug(`Injected database: ${this.database !== undefined}, adapter: ${this.adapter !== undefined}`, NS);
|
|
162
|
+
this.#greenPower = new greenPower_1.default(this.adapter, this.database.id);
|
|
163
|
+
this.#greenPower.on("deviceJoined", this.onDeviceJoinedGreenPower.bind(this));
|
|
164
|
+
this.#greenPower.on("deviceLeave", this.onDeviceLeaveGreenPower.bind(this));
|
|
148
165
|
// Register adapter events
|
|
149
|
-
this.adapter.on(
|
|
150
|
-
this.adapter.on(
|
|
151
|
-
this.adapter.on(
|
|
152
|
-
this.adapter.on(
|
|
153
|
-
this.adapter.on(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
|
|
158
|
-
}
|
|
159
|
-
logger_1.logger.debug('Clearing database...', NS);
|
|
160
|
-
for (const group of group_1.default.allByDatabaseID(this.database.id)) {
|
|
161
|
-
group.removeFromDatabase();
|
|
162
|
-
}
|
|
163
|
-
for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
|
|
164
|
-
device.removeFromDatabase();
|
|
166
|
+
this.adapter.on("deviceJoined", this.onDeviceJoined.bind(this));
|
|
167
|
+
this.adapter.on("zclPayload", this.onZclPayload.bind(this));
|
|
168
|
+
this.adapter.on("zdoResponse", this.onZdoResponse.bind(this));
|
|
169
|
+
this.adapter.on("disconnected", this.onAdapterDisconnected.bind(this));
|
|
170
|
+
this.adapter.on("deviceLeave", this.onDeviceLeave.bind(this));
|
|
171
|
+
if (startResult === "reset") {
|
|
172
|
+
if (this.options.databaseBackupPath && node_fs_1.default.existsSync(this.options.databasePath)) {
|
|
173
|
+
node_fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
|
|
165
174
|
}
|
|
175
|
+
this.database.clear();
|
|
176
|
+
group_1.default.resetCache();
|
|
177
|
+
model_1.Device.resetCache();
|
|
178
|
+
abortSignal?.throwIfAborted();
|
|
166
179
|
}
|
|
167
|
-
if (startResult ===
|
|
180
|
+
if (startResult === "reset" || (this.options.backupPath && !node_fs_1.default.existsSync(this.options.backupPath))) {
|
|
168
181
|
await this.backup();
|
|
182
|
+
abortSignal?.throwIfAborted();
|
|
169
183
|
}
|
|
170
184
|
// Add coordinator to the database if it is not there yet.
|
|
171
|
-
const
|
|
172
|
-
if (model_1.Device.byType(
|
|
173
|
-
logger_1.logger.debug(
|
|
174
|
-
model_1.Device.create(
|
|
185
|
+
const coordinatorIEEE = await this.adapter.getCoordinatorIEEE();
|
|
186
|
+
if (model_1.Device.byType(this.database.id, "Coordinator").length === 0) {
|
|
187
|
+
logger_1.logger.debug("No coordinator in database, querying...", NS);
|
|
188
|
+
const coordinator = model_1.Device.create("Coordinator", coordinatorIEEE, ZSpec.COORDINATOR_ADDRESS, this.adapter.manufacturerID, undefined, undefined, undefined, device_1.InterviewState.Successful, undefined, this.database.id);
|
|
189
|
+
await coordinator.updateActiveEndpoints();
|
|
190
|
+
abortSignal?.throwIfAborted();
|
|
191
|
+
for (const endpoint of coordinator.endpoints) {
|
|
192
|
+
await endpoint.updateSimpleDescriptor();
|
|
193
|
+
abortSignal?.throwIfAborted();
|
|
194
|
+
}
|
|
195
|
+
coordinator.save();
|
|
175
196
|
}
|
|
176
197
|
// Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
|
|
177
|
-
const databaseCoordinator = model_1.Device.byType(
|
|
178
|
-
if (databaseCoordinator.ieeeAddr !==
|
|
179
|
-
logger_1.logger.info(`Coordinator address changed, updating to '${
|
|
180
|
-
databaseCoordinator.changeIeeeAddress(
|
|
198
|
+
const databaseCoordinator = model_1.Device.byType(this.database.id, "Coordinator")[0];
|
|
199
|
+
if (databaseCoordinator.ieeeAddr !== coordinatorIEEE) {
|
|
200
|
+
logger_1.logger.info(`Coordinator address changed, updating to '${coordinatorIEEE}'`, NS);
|
|
201
|
+
databaseCoordinator.changeIeeeAddress(coordinatorIEEE);
|
|
181
202
|
}
|
|
182
203
|
// Set backup timer to 1 day.
|
|
183
204
|
this.backupTimer = setInterval(() => this.backup(), 86400000);
|
|
184
|
-
// Set database save timer to
|
|
185
|
-
this.databaseSaveTimer = setInterval(() => this.databaseSave(),
|
|
186
|
-
this
|
|
205
|
+
// Set database save timer to 5 minutes.
|
|
206
|
+
this.databaseSaveTimer = setInterval(() => this.databaseSave(), 300000);
|
|
207
|
+
this.#touchlink = new touchlink_1.default(this.adapter);
|
|
187
208
|
return startResult;
|
|
188
209
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
async
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
210
|
+
/**
|
|
211
|
+
* Send a request according to given payload.
|
|
212
|
+
* @param rawPayload Payload used to determine and build the request
|
|
213
|
+
* @param customClusters Manually passed custom clusters used in ZCL serialization (if any, if matching)
|
|
214
|
+
* @returns A response may or may not be returned depending on given payload (up to caller to verify)
|
|
215
|
+
*/
|
|
216
|
+
async sendRaw(rawPayload, customClusters = {}) {
|
|
217
|
+
const { ieeeAddress, networkAddress, groupId, dstEndpoint, srcEndpoint = ZSpec.HA_ENDPOINT, interPan = false, profileId = ZSpec.HA_PROFILE_ID, clusterKey, zdoParams, zcl, disableResponse = false, timeout = 10000, } = rawPayload;
|
|
218
|
+
if (profileId === Zdo.ZDO_PROFILE_ID) {
|
|
219
|
+
(0, node_assert_1.default)(ieeeAddress);
|
|
220
|
+
(0, node_assert_1.default)(networkAddress !== undefined);
|
|
221
|
+
(0, node_assert_1.default)(clusterKey !== undefined && typeof clusterKey === "number");
|
|
222
|
+
// no ZDO request takes 0 params
|
|
223
|
+
(0, node_assert_1.default)(Array.isArray(zdoParams) && zdoParams.length > 0);
|
|
224
|
+
// will fail if args are incorrect for request
|
|
225
|
+
const buf = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterKey, ...zdoParams);
|
|
226
|
+
return (await this.adapter.sendZdo(ieeeAddress, networkAddress, clusterKey, buf, disableResponse));
|
|
227
|
+
}
|
|
228
|
+
(0, node_assert_1.default)(zcl);
|
|
229
|
+
if (interPan) {
|
|
230
|
+
(0, node_assert_1.default)(zcl.commandKey);
|
|
231
|
+
(0, node_assert_1.default)(zcl.payload);
|
|
232
|
+
(0, node_assert_1.default)(zcl.frameType === undefined);
|
|
233
|
+
(0, node_assert_1.default)(zcl.direction === undefined);
|
|
234
|
+
const zclFrame = Zcl.Frame.create(zcl.frameType ?? Zcl.FrameType.SPECIFIC, zcl.direction ?? Zcl.Direction.CLIENT_TO_SERVER, true, zcl.manufacturerCode, 0, zcl.commandKey, clusterKey ?? Zcl.Clusters.touchlink.ID, zcl.payload, customClusters);
|
|
235
|
+
if (ieeeAddress) {
|
|
236
|
+
await this.adapter.sendZclFrameInterPANToIeeeAddr(zclFrame, ieeeAddress);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
return await this.adapter.sendZclFrameInterPANBroadcast(zclFrame, timeout, disableResponse);
|
|
240
|
+
}
|
|
241
|
+
(0, node_assert_1.default)(clusterKey !== undefined);
|
|
242
|
+
(0, node_assert_1.default)(zcl.frameType !== undefined);
|
|
243
|
+
(0, node_assert_1.default)(zcl.direction !== undefined);
|
|
244
|
+
const zclFrame = Zcl.Frame.create(zcl.frameType, zcl.direction, zcl.disableDefaultResponse ?? false, zcl.manufacturerCode, zcl.tsn ?? zclTransactionSequenceNumber_1.default.next(), zcl.commandKey, clusterKey, zcl.payload, customClusters);
|
|
245
|
+
if (groupId !== undefined) {
|
|
246
|
+
(0, node_assert_1.default)(groupId >= 0x0000 && groupId <= 0xffff);
|
|
247
|
+
await this.adapter.sendZclFrameToGroup(groupId, zclFrame, srcEndpoint, profileId);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
(0, node_assert_1.default)(dstEndpoint !== undefined && dstEndpoint >= 0x01 && dstEndpoint <= 0xff);
|
|
251
|
+
(0, node_assert_1.default)(srcEndpoint >= 0x01 && srcEndpoint <= 0xff);
|
|
252
|
+
(0, node_assert_1.default)(networkAddress !== undefined && networkAddress >= 0x0000 && networkAddress <= 0xffff);
|
|
253
|
+
if (networkAddress >= ZSpec.BROADCAST_MIN) {
|
|
254
|
+
await this.adapter.sendZclFrameToAll(dstEndpoint, zclFrame, srcEndpoint, networkAddress, profileId);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
(0, node_assert_1.default)(ieeeAddress);
|
|
258
|
+
return await this.adapter.sendZclFrameToEndpoint(ieeeAddress, networkAddress, dstEndpoint, zclFrame, timeout, disableResponse, false, srcEndpoint, profileId);
|
|
200
259
|
}
|
|
201
260
|
async addInstallCode(installCode) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
261
|
+
// will throw if code cannot be parsed
|
|
262
|
+
const [ieeeAddr, keyStr] = (0, installCodes_1.parseInstallCode)(installCode);
|
|
263
|
+
// biome-ignore lint/style/noNonNullAssertion: valid from above parsing
|
|
264
|
+
const key = Buffer.from(keyStr.match(/.{1,2}/g).map((d) => Number.parseInt(d, 16)));
|
|
265
|
+
// will throw if code cannot be fixed and is invalid
|
|
266
|
+
const [adjustedKey, adjusted] = (0, installCodes_1.checkInstallCode)(key, true);
|
|
267
|
+
if (adjusted) {
|
|
268
|
+
logger_1.logger.info(`Install code was adjusted for reason '${adjusted}'.`, NS);
|
|
269
|
+
}
|
|
270
|
+
logger_1.logger.info(`Adding install code for ${ieeeAddr}.`, NS);
|
|
271
|
+
await this.adapter.addInstallCode(ieeeAddr, adjustedKey, false);
|
|
272
|
+
if (adjusted === "missing CRC") {
|
|
273
|
+
// in case the CRC was missing, could also be a "already-hashed" key, send both
|
|
274
|
+
// XXX: seems to be the case for old HA1.2 devices
|
|
275
|
+
await this.adapter.addInstallCode(ieeeAddr, key, true);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async permitJoin(time, device) {
|
|
279
|
+
clearTimeout(this.permitJoinTimer);
|
|
280
|
+
this.permitJoinTimer = undefined;
|
|
281
|
+
this.permitJoinEnd = undefined;
|
|
282
|
+
if (time > 0) {
|
|
283
|
+
// never permit more than uint8, and never permit 255 that is often equal to "forever"
|
|
284
|
+
(0, node_assert_1.default)(time <= 254, "Cannot permit join for more than 254 seconds.");
|
|
285
|
+
await this.adapter.permitJoin(time, device?.networkAddress);
|
|
286
|
+
await this.#greenPower.permitJoin(time, device?.networkAddress);
|
|
287
|
+
const timeMs = time * 1000;
|
|
288
|
+
this.permitJoinEnd = Date.now() + timeMs;
|
|
289
|
+
this.permitJoinTimer = setTimeout(() => {
|
|
290
|
+
this.emit("permitJoinChanged", { permitted: false });
|
|
291
|
+
this.permitJoinTimer = undefined;
|
|
292
|
+
this.permitJoinEnd = undefined;
|
|
293
|
+
}, timeMs);
|
|
294
|
+
this.emit("permitJoinChanged", { permitted: true, time });
|
|
207
295
|
}
|
|
208
296
|
else {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
ieeeAddr = `0x${ieeeAddr}`;
|
|
215
|
-
key = Buffer.from(key.match(/.{1,2}/g).map(d => parseInt(d, 16)));
|
|
216
|
-
await this.adapter.addInstallCode(ieeeAddr, key);
|
|
217
|
-
}
|
|
218
|
-
async permitJoin(permit, device, time) {
|
|
219
|
-
await this.permitJoinInternal(permit, 'manual', device, time);
|
|
220
|
-
}
|
|
221
|
-
async permitJoinInternal(permit, reason, device, time) {
|
|
222
|
-
clearInterval(this.permitJoinNetworkClosedTimer);
|
|
223
|
-
clearInterval(this.permitJoinTimeoutTimer);
|
|
224
|
-
this.permitJoinNetworkClosedTimer = null;
|
|
225
|
-
this.permitJoinTimeoutTimer = null;
|
|
226
|
-
this.permitJoinTimeout = undefined;
|
|
227
|
-
if (permit) {
|
|
228
|
-
await this.adapter.permitJoin(254, !device ? null : device.networkAddress);
|
|
229
|
-
await this.greenPower.permitJoin(254, !device ? null : device.networkAddress);
|
|
230
|
-
// Zigbee 3 networks automatically close after max 255 seconds, keep network open.
|
|
231
|
-
this.permitJoinNetworkClosedTimer = setInterval(async () => {
|
|
232
|
-
await catcho(async () => {
|
|
233
|
-
await this.adapter.permitJoin(254, !device ? null : device.networkAddress);
|
|
234
|
-
await this.greenPower.permitJoin(254, !device ? null : device.networkAddress);
|
|
235
|
-
}, "Failed to keep permit join alive");
|
|
236
|
-
}, 200 * 1000);
|
|
237
|
-
if (typeof time === 'number') {
|
|
238
|
-
this.permitJoinTimeout = time;
|
|
239
|
-
this.permitJoinTimeoutTimer = setInterval(async () => {
|
|
240
|
-
this.permitJoinTimeout--;
|
|
241
|
-
if (this.permitJoinTimeout <= 0) {
|
|
242
|
-
await this.permitJoinInternal(false, 'timer_expired');
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
const data = { permitted: true, timeout: this.permitJoinTimeout, reason };
|
|
246
|
-
this.emit(Events.Events.permitJoinChanged, data);
|
|
247
|
-
}
|
|
248
|
-
}, 1000);
|
|
249
|
-
}
|
|
250
|
-
const data = { permitted: true, reason, timeout: this.permitJoinTimeout };
|
|
251
|
-
this.emit(Events.Events.permitJoinChanged, data);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
logger_1.logger.debug('Disable joining', NS);
|
|
255
|
-
await this.greenPower.permitJoin(0, null);
|
|
256
|
-
await this.adapter.permitJoin(0, null);
|
|
257
|
-
const data = { permitted: false, reason, timeout: this.permitJoinTimeout };
|
|
258
|
-
this.emit(Events.Events.permitJoinChanged, data);
|
|
297
|
+
logger_1.logger.debug("Disable joining", NS);
|
|
298
|
+
await this.#greenPower.permitJoin(0);
|
|
299
|
+
await this.adapter.permitJoin(0);
|
|
300
|
+
this.emit("permitJoinChanged", { permitted: false });
|
|
259
301
|
}
|
|
260
302
|
}
|
|
261
303
|
getPermitJoin() {
|
|
262
|
-
return this.
|
|
304
|
+
return this.permitJoinTimer !== undefined;
|
|
263
305
|
}
|
|
264
|
-
|
|
265
|
-
return this.
|
|
306
|
+
getPermitJoinEnd() {
|
|
307
|
+
return this.permitJoinEnd;
|
|
266
308
|
}
|
|
267
309
|
isStopping() {
|
|
268
310
|
return this.stopping;
|
|
@@ -273,61 +315,72 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
273
315
|
async stop() {
|
|
274
316
|
this.stopping = true;
|
|
275
317
|
// Unregister adapter events
|
|
276
|
-
this.adapter.removeAllListeners(
|
|
277
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.zclPayload);
|
|
278
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.disconnected);
|
|
279
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.deviceAnnounce);
|
|
280
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.deviceLeave);
|
|
318
|
+
this.adapter.removeAllListeners();
|
|
281
319
|
clearInterval(this.backupTimer);
|
|
282
320
|
clearInterval(this.databaseSaveTimer);
|
|
283
321
|
if (this.adapterDisconnected) {
|
|
284
322
|
this.databaseSave();
|
|
285
323
|
}
|
|
286
324
|
else {
|
|
287
|
-
|
|
325
|
+
try {
|
|
326
|
+
await this.#touchlink.stop();
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
logger_1.logger.error(`Failed to stop Touchlink: ${error}`, NS);
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
await this.permitJoin(0);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
logger_1.logger.error(`Failed to disable join on stop: ${error}`, NS);
|
|
336
|
+
}
|
|
288
337
|
await this.backup(); // always calls databaseSave()
|
|
289
338
|
await this.adapter.stop();
|
|
290
339
|
this.adapterDisconnected = true;
|
|
291
340
|
}
|
|
341
|
+
model_1.Device.resetCache();
|
|
342
|
+
group_1.default.resetCache();
|
|
343
|
+
model_1.Entity.removeAdapter(this.database.id);
|
|
344
|
+
model_1.Entity.removeDatabase(this.database.id);
|
|
292
345
|
}
|
|
293
346
|
databaseSave() {
|
|
294
|
-
for (const device of model_1.Device.
|
|
347
|
+
for (const device of model_1.Device.allIterator(this.database.id)) {
|
|
295
348
|
device.save(false);
|
|
296
349
|
}
|
|
297
|
-
for (const group of group_1.default.
|
|
350
|
+
for (const group of group_1.default.allIterator(this.database.id)) {
|
|
298
351
|
group.save(false);
|
|
299
352
|
}
|
|
300
353
|
this.database.write();
|
|
301
354
|
}
|
|
302
355
|
async backup() {
|
|
303
356
|
this.databaseSave();
|
|
304
|
-
if (this.options.backupPath && await this.adapter.supportsBackup()) {
|
|
305
|
-
logger_1.logger.debug(
|
|
306
|
-
const backup = await this.adapter.backup(
|
|
307
|
-
const unifiedBackup =
|
|
308
|
-
const tmpBackupPath = this.options.backupPath
|
|
309
|
-
|
|
310
|
-
|
|
357
|
+
if (this.options.backupPath && (await this.adapter.supportsBackup())) {
|
|
358
|
+
logger_1.logger.debug("Creating coordinator backup", NS);
|
|
359
|
+
const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
|
|
360
|
+
const unifiedBackup = utils_1.BackupUtils.toUnifiedBackup(backup);
|
|
361
|
+
const tmpBackupPath = `${this.options.backupPath}.tmp`;
|
|
362
|
+
node_fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
|
|
363
|
+
node_fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
|
|
311
364
|
logger_1.logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
|
|
312
365
|
}
|
|
313
366
|
}
|
|
314
367
|
async coordinatorCheck() {
|
|
315
368
|
if (await this.adapter.supportsBackup()) {
|
|
316
|
-
const backup = await this.adapter.backup(
|
|
317
|
-
const devicesInBackup = backup.devices.map((d) =>
|
|
318
|
-
const missingRouters =
|
|
319
|
-
|
|
369
|
+
const backup = await this.adapter.backup(this.getDeviceIeeeAddresses());
|
|
370
|
+
const devicesInBackup = backup.devices.map((d) => ZSpec.Utils.eui64BEBufferToHex(d.ieeeAddress));
|
|
371
|
+
const missingRouters = [];
|
|
372
|
+
for (const device of this.getDevicesIterator((d) => d.type === "Router" && !devicesInBackup.includes(d.ieeeAddr))) {
|
|
373
|
+
missingRouters.push(device);
|
|
374
|
+
}
|
|
320
375
|
return { missingRouters };
|
|
321
376
|
}
|
|
322
|
-
|
|
323
|
-
throw new Error("Coordinator does not coordinator check because it doesn't support backups");
|
|
324
|
-
}
|
|
377
|
+
throw new Error("Coordinator does not coordinator check because it doesn't support backups");
|
|
325
378
|
}
|
|
326
379
|
async reset(type) {
|
|
327
380
|
await this.adapter.reset(type);
|
|
328
381
|
}
|
|
329
382
|
async getCoordinatorVersion() {
|
|
330
|
-
return this.adapter.getCoordinatorVersion();
|
|
383
|
+
return await this.adapter.getCoordinatorVersion();
|
|
331
384
|
}
|
|
332
385
|
async getNetworkParameters() {
|
|
333
386
|
// Cache network parameters as they don't change anymore after start.
|
|
@@ -336,17 +389,30 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
336
389
|
}
|
|
337
390
|
return this.networkParametersCached;
|
|
338
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Get the database ID for this controller's database.
|
|
394
|
+
*/
|
|
395
|
+
getDatabaseId() {
|
|
396
|
+
return this.database.id;
|
|
397
|
+
}
|
|
339
398
|
/**
|
|
340
399
|
* Get all devices
|
|
400
|
+
* @deprecated use getDevicesIterator()
|
|
341
401
|
*/
|
|
342
402
|
getDevices() {
|
|
343
403
|
return model_1.Device.allByDatabaseID(this.database.id);
|
|
344
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Get iterator for all devices
|
|
407
|
+
*/
|
|
408
|
+
getDevicesIterator(predicate) {
|
|
409
|
+
return model_1.Device.allIterator(this.database.id, predicate);
|
|
410
|
+
}
|
|
345
411
|
/**
|
|
346
412
|
* Get all devices with a specific type
|
|
347
413
|
*/
|
|
348
414
|
getDevicesByType(type) {
|
|
349
|
-
return model_1.Device.byType(
|
|
415
|
+
return model_1.Device.byType(this.database.id, type);
|
|
350
416
|
}
|
|
351
417
|
/**
|
|
352
418
|
* Get device by ieeeAddr
|
|
@@ -358,7 +424,17 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
358
424
|
* Get device by networkAddress
|
|
359
425
|
*/
|
|
360
426
|
getDeviceByNetworkAddress(networkAddress) {
|
|
361
|
-
return model_1.Device.byNetworkAddress(
|
|
427
|
+
return model_1.Device.byNetworkAddress(this.database.id, networkAddress);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Get IEEE address for all devices
|
|
431
|
+
*/
|
|
432
|
+
getDeviceIeeeAddresses() {
|
|
433
|
+
const deviceIeeeAddresses = [];
|
|
434
|
+
for (const device of model_1.Device.allIterator(this.database.id)) {
|
|
435
|
+
deviceIeeeAddresses.push(device.ieeeAddr);
|
|
436
|
+
}
|
|
437
|
+
return deviceIeeeAddresses;
|
|
362
438
|
}
|
|
363
439
|
/**
|
|
364
440
|
* Get group by ID
|
|
@@ -368,10 +444,17 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
368
444
|
}
|
|
369
445
|
/**
|
|
370
446
|
* Get all groups
|
|
447
|
+
* @deprecated use getGroupsIterator()
|
|
371
448
|
*/
|
|
372
449
|
getGroups() {
|
|
373
450
|
return group_1.default.allByDatabaseID(this.database.id);
|
|
374
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Get iterator for all groups
|
|
454
|
+
*/
|
|
455
|
+
getGroupsIterator(predicate) {
|
|
456
|
+
return group_1.default.allIterator(this.database.id, predicate);
|
|
457
|
+
}
|
|
375
458
|
/**
|
|
376
459
|
* Create a Group
|
|
377
460
|
*/
|
|
@@ -381,54 +464,99 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
381
464
|
/**
|
|
382
465
|
* Broadcast a network-wide channel change.
|
|
383
466
|
*/
|
|
384
|
-
async changeChannel() {
|
|
385
|
-
logger_1.logger.
|
|
386
|
-
|
|
387
|
-
|
|
467
|
+
async changeChannel(oldChannel, newChannel, nwkUpdateID) {
|
|
468
|
+
logger_1.logger.warning(`Changing channel from '${oldChannel}' to '${newChannel}'`, NS);
|
|
469
|
+
// According to the Zigbee specification:
|
|
470
|
+
// When broadcasting a Mgmt_NWK_Update_req to notify devices of a new channel, the nwkUpdateId parameter should be incremented in the NIB and included in the Mgmt_NWK_Update_req.
|
|
471
|
+
// The valid range of nwkUpdateId is 0x00 to 0xFF, and it should wrap back to 0 if necessary.
|
|
472
|
+
if (++nwkUpdateID > 0xff) {
|
|
473
|
+
nwkUpdateID = 0x00;
|
|
474
|
+
}
|
|
475
|
+
const clusterId = Zdo.ClusterId.NWK_UPDATE_REQUEST;
|
|
476
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, [newChannel], 0xfe, undefined, nwkUpdateID, undefined);
|
|
477
|
+
await this.adapter.sendZdo(ZSpec.BLANK_EUI64, ZSpec.BroadcastAddress.SLEEPY, clusterId, zdoPayload, true);
|
|
478
|
+
logger_1.logger.info(`Channel changed to '${newChannel}'`, NS);
|
|
479
|
+
this.networkParametersCached = undefined; // invalidate cache
|
|
480
|
+
// wait for the broadcast to propagate and the adapter to actually change
|
|
481
|
+
// NOTE: observed to ~9sec on `ember` with actual stack event
|
|
482
|
+
await (0, utils_1.wait)(12000);
|
|
483
|
+
}
|
|
484
|
+
async identifyUnknownDevice(nwkAddress) {
|
|
485
|
+
if (this.unknownDevices.has(nwkAddress)) {
|
|
486
|
+
// prevent duplicate triggering
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
logger_1.logger.debug(`Trying to identify unknown device with address '${nwkAddress}'`, NS);
|
|
490
|
+
this.unknownDevices.add(nwkAddress);
|
|
491
|
+
const clusterId = Zdo.ClusterId.IEEE_ADDRESS_REQUEST;
|
|
492
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, nwkAddress, false, 0);
|
|
493
|
+
try {
|
|
494
|
+
const response = await this.adapter.sendZdo(ZSpec.BLANK_EUI64, nwkAddress, clusterId, zdoPayload, false);
|
|
495
|
+
if (Zdo.Buffalo.checkStatus(response)) {
|
|
496
|
+
const payload = response[1];
|
|
497
|
+
const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
|
|
498
|
+
if (device) {
|
|
499
|
+
this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
|
|
500
|
+
this.unknownDevices.delete(payload.nwkAddress);
|
|
501
|
+
}
|
|
502
|
+
return device;
|
|
503
|
+
}
|
|
504
|
+
throw new Zdo.StatusError(response[0]);
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
// Catches 2 types of exception: Zdo.StatusError and no response from `adapter.sendZdo()`.
|
|
508
|
+
logger_1.logger.debug(`Failed to retrieve IEEE address for device '${nwkAddress}': ${error}`, NS);
|
|
509
|
+
}
|
|
510
|
+
// NOTE: by keeping nwkAddress in `this.unknownDevices` on fail, it prevents a non-responding device from potentially spamming identify.
|
|
511
|
+
// This only lasts until next reboot (runtime Set), allowing to 'force' another trigger if necessary.
|
|
388
512
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
513
|
+
checkDeviceNetworkAddress(device, ieeeAddress, nwkAddress) {
|
|
514
|
+
if (device.networkAddress !== nwkAddress) {
|
|
515
|
+
logger_1.logger.debug(`Device '${ieeeAddress}' got new networkAddress '${nwkAddress}'`, NS);
|
|
516
|
+
device.networkAddress = nwkAddress;
|
|
517
|
+
device.save();
|
|
518
|
+
this.selfAndDeviceEmit(device, "deviceNetworkAddressChanged", { device });
|
|
519
|
+
}
|
|
394
520
|
}
|
|
395
521
|
onNetworkAddress(payload) {
|
|
396
|
-
logger_1.logger.debug(`Network address '${payload.
|
|
397
|
-
const device = model_1.Device.byIeeeAddr(this.database.id, payload.
|
|
522
|
+
logger_1.logger.debug(`Network address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
523
|
+
const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
|
|
398
524
|
if (!device) {
|
|
399
|
-
logger_1.logger.debug(`Network address is from unknown device '${payload.
|
|
525
|
+
logger_1.logger.debug(`Network address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
400
526
|
return;
|
|
401
527
|
}
|
|
402
528
|
device.updateLastSeen();
|
|
403
|
-
this.selfAndDeviceEmit(device,
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
529
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "networkAddress" });
|
|
530
|
+
this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
|
|
531
|
+
}
|
|
532
|
+
onIEEEAddress(payload) {
|
|
533
|
+
logger_1.logger.debug(`IEEE address from '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
534
|
+
const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
|
|
535
|
+
if (!device) {
|
|
536
|
+
logger_1.logger.debug(`IEEE address is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
537
|
+
return;
|
|
410
538
|
}
|
|
539
|
+
device.updateLastSeen();
|
|
540
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "networkAddress" });
|
|
541
|
+
this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
|
|
411
542
|
}
|
|
412
543
|
onDeviceAnnounce(payload) {
|
|
413
|
-
logger_1.logger.debug(`Device announce '${payload.
|
|
414
|
-
const device = model_1.Device.byIeeeAddr(this.database.id, payload.
|
|
544
|
+
logger_1.logger.debug(`Device announce from '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
545
|
+
const device = model_1.Device.byIeeeAddr(this.database.id, payload.eui64);
|
|
415
546
|
if (!device) {
|
|
416
|
-
logger_1.logger.debug(`Device announce is from unknown device '${payload.
|
|
547
|
+
logger_1.logger.debug(`Device announce is from unknown device '${payload.eui64}:${payload.nwkAddress}'`, NS);
|
|
417
548
|
return;
|
|
418
549
|
}
|
|
419
550
|
device.updateLastSeen();
|
|
420
|
-
this.selfAndDeviceEmit(device,
|
|
551
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "deviceAnnounce" });
|
|
421
552
|
device.implicitCheckin();
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
device.networkAddress = payload.networkAddress;
|
|
425
|
-
device.save();
|
|
426
|
-
}
|
|
427
|
-
const data = { device };
|
|
428
|
-
this.selfAndDeviceEmit(device, Events.Events.deviceAnnounce, data);
|
|
553
|
+
this.checkDeviceNetworkAddress(device, payload.eui64, payload.nwkAddress);
|
|
554
|
+
this.selfAndDeviceEmit(device, "deviceAnnounce", { device });
|
|
429
555
|
}
|
|
430
556
|
onDeviceLeave(payload) {
|
|
431
557
|
logger_1.logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
|
|
558
|
+
// XXX: seems type is not properly detected?
|
|
559
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
432
560
|
const device = payload.ieeeAddr ? model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : model_1.Device.byNetworkAddress(this.database.id, payload.networkAddress);
|
|
433
561
|
if (!device) {
|
|
434
562
|
logger_1.logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
|
|
@@ -436,67 +564,90 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
436
564
|
}
|
|
437
565
|
logger_1.logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
|
|
438
566
|
device.removeFromDatabase();
|
|
439
|
-
|
|
440
|
-
this.selfAndDeviceEmit(device, Events.Events.deviceLeave, data);
|
|
567
|
+
this.selfAndDeviceEmit(device, "deviceLeave", { ieeeAddr: device.ieeeAddr });
|
|
441
568
|
}
|
|
442
569
|
async onAdapterDisconnected() {
|
|
443
|
-
logger_1.logger.debug(
|
|
570
|
+
logger_1.logger.debug("Adapter disconnected", NS);
|
|
444
571
|
this.adapterDisconnected = true;
|
|
445
|
-
|
|
446
|
-
|
|
572
|
+
try {
|
|
573
|
+
await this.adapter.stop();
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
logger_1.logger.error(`Failed to stop adapter on disconnect: ${error}`, NS);
|
|
577
|
+
}
|
|
578
|
+
this.emit("adapterDisconnected");
|
|
447
579
|
}
|
|
448
|
-
|
|
449
|
-
logger_1.logger.debug(`Green power device '${JSON.stringify(payload)}' joined`, NS);
|
|
580
|
+
onDeviceJoinedGreenPower(payload) {
|
|
581
|
+
logger_1.logger.debug(() => `Green power device '${JSON.stringify(payload).replaceAll(/\[[\d,]+\]/g, "HIDDEN")}' joined`, NS);
|
|
450
582
|
// Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
|
|
451
|
-
|
|
452
|
-
ieeeAddr = `0x${'0'.repeat(16 - ieeeAddr.length)}${ieeeAddr}`;
|
|
583
|
+
const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(payload.sourceID);
|
|
453
584
|
// Green power devices dont' have a modelID, create a modelID based on the deviceID (=type)
|
|
454
585
|
const modelID = `GreenPower_${payload.deviceID}`;
|
|
455
586
|
let device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr, true);
|
|
456
587
|
if (!device) {
|
|
457
588
|
logger_1.logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
|
|
458
589
|
logger_1.logger.debug(`Creating device '${ieeeAddr}'`, NS);
|
|
459
|
-
device = model_1.Device.create(
|
|
590
|
+
device = model_1.Device.create("GreenPower", ieeeAddr, payload.networkAddress, undefined, undefined, undefined, modelID, device_1.InterviewState.Successful, payload.securityKey ? Array.from(payload.securityKey) : /* v8 ignore next */ undefined, this.database.id);
|
|
460
591
|
device.save();
|
|
461
|
-
this.selfAndDeviceEmit(device,
|
|
462
|
-
|
|
463
|
-
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
|
|
592
|
+
this.selfAndDeviceEmit(device, "deviceJoined", { device });
|
|
593
|
+
this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
|
|
464
594
|
}
|
|
465
595
|
else if (device.isDeleted) {
|
|
466
596
|
logger_1.logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
|
|
467
|
-
device.undelete(
|
|
468
|
-
this.selfAndDeviceEmit(device,
|
|
469
|
-
|
|
470
|
-
|
|
597
|
+
device.undelete();
|
|
598
|
+
this.selfAndDeviceEmit(device, "deviceJoined", { device });
|
|
599
|
+
this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
onDeviceLeaveGreenPower(sourceID) {
|
|
603
|
+
logger_1.logger.debug(`Green power device '${sourceID}' left`, NS);
|
|
604
|
+
// Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
|
|
605
|
+
const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(sourceID);
|
|
606
|
+
const device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
|
|
607
|
+
if (!device) {
|
|
608
|
+
logger_1.logger.debug(`Green power device leave is from unknown or already deleted device '${ieeeAddr}'`, NS);
|
|
609
|
+
return;
|
|
471
610
|
}
|
|
611
|
+
logger_1.logger.debug(`Removing green power device from database '${device.ieeeAddr}'`, NS);
|
|
612
|
+
device.removeFromDatabase();
|
|
613
|
+
this.selfAndDeviceEmit(device, "deviceLeave", { ieeeAddr: device.ieeeAddr });
|
|
472
614
|
}
|
|
473
|
-
selfAndDeviceEmit(device, event,
|
|
474
|
-
device
|
|
475
|
-
this.emit(event,
|
|
615
|
+
selfAndDeviceEmit(device, event, ...args) {
|
|
616
|
+
device.emit(event, ...args);
|
|
617
|
+
this.emit(event, ...args);
|
|
476
618
|
}
|
|
477
619
|
async onDeviceJoined(payload) {
|
|
478
620
|
logger_1.logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
|
|
479
621
|
if (this.options.acceptJoiningDeviceHandler) {
|
|
480
622
|
if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
|
|
481
623
|
logger_1.logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
|
|
482
|
-
|
|
624
|
+
// XXX: GP devices? see Device.removeFromNetwork
|
|
625
|
+
try {
|
|
626
|
+
const clusterId = Zdo.ClusterId.LEAVE_REQUEST;
|
|
627
|
+
const zdoPayload = Zdo.Buffalo.buildRequest(this.adapter.hasZdoMessageOverhead, clusterId, payload.ieeeAddr, Zdo.LeaveRequestFlags.WITHOUT_REJOIN);
|
|
628
|
+
const response = await this.adapter.sendZdo(payload.ieeeAddr, payload.networkAddress, clusterId, zdoPayload, false);
|
|
629
|
+
if (!Zdo.Buffalo.checkStatus(response)) {
|
|
630
|
+
throw new Zdo.StatusError(response[0]);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
catch (error) {
|
|
634
|
+
logger_1.logger.error(`Failed to remove rejected device: ${error.message}`, NS);
|
|
635
|
+
}
|
|
483
636
|
return;
|
|
484
637
|
}
|
|
485
|
-
|
|
486
|
-
logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
|
|
487
|
-
}
|
|
638
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
|
|
488
639
|
}
|
|
489
640
|
let device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
|
|
490
641
|
if (!device) {
|
|
491
642
|
logger_1.logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
|
|
492
643
|
logger_1.logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
|
|
493
|
-
device = model_1.Device.create(
|
|
494
|
-
this.selfAndDeviceEmit(device,
|
|
644
|
+
device = model_1.Device.create("Unknown", payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, device_1.InterviewState.Pending, undefined, this.database.id);
|
|
645
|
+
this.selfAndDeviceEmit(device, "deviceJoined", { device });
|
|
495
646
|
}
|
|
496
647
|
else if (device.isDeleted) {
|
|
497
648
|
logger_1.logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
|
|
498
649
|
device.undelete();
|
|
499
|
-
this.selfAndDeviceEmit(device,
|
|
650
|
+
this.selfAndDeviceEmit(device, "deviceJoined", { device });
|
|
500
651
|
}
|
|
501
652
|
if (device.networkAddress !== payload.networkAddress) {
|
|
502
653
|
logger_1.logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
|
|
@@ -504,36 +655,56 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
504
655
|
device.save();
|
|
505
656
|
}
|
|
506
657
|
device.updateLastSeen();
|
|
507
|
-
this.selfAndDeviceEmit(device,
|
|
658
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "deviceJoined" });
|
|
508
659
|
device.implicitCheckin();
|
|
509
|
-
if (
|
|
510
|
-
const payloadStart = { status: 'started', device };
|
|
660
|
+
if (device.interviewState === device_1.InterviewState.Pending || device.interviewState === device_1.InterviewState.Failed) {
|
|
511
661
|
logger_1.logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
|
|
512
|
-
this.selfAndDeviceEmit(device,
|
|
662
|
+
this.selfAndDeviceEmit(device, "deviceInterview", { status: "started", device });
|
|
513
663
|
try {
|
|
514
664
|
await device.interview();
|
|
515
665
|
logger_1.logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
|
|
516
|
-
|
|
517
|
-
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
|
|
666
|
+
this.selfAndDeviceEmit(device, "deviceInterview", { status: "successful", device });
|
|
518
667
|
}
|
|
519
668
|
catch (error) {
|
|
520
669
|
logger_1.logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
|
|
521
|
-
|
|
522
|
-
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
|
|
670
|
+
this.selfAndDeviceEmit(device, "deviceInterview", { status: "failed", device });
|
|
523
671
|
}
|
|
524
672
|
}
|
|
525
673
|
else {
|
|
526
|
-
logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}',
|
|
674
|
+
logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', interviewState=${device.interviewState}'`, NS);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
onZdoResponse(clusterId, response) {
|
|
678
|
+
logger_1.logger.debug(`Received ZDO response: clusterId=${Zdo.ClusterId[clusterId]}, status=${Zdo.Status[response[0]]}, payload=${JSON.stringify(response[1])}`, NS);
|
|
679
|
+
switch (clusterId) {
|
|
680
|
+
case Zdo.ClusterId.NETWORK_ADDRESS_RESPONSE: {
|
|
681
|
+
if (Zdo.Buffalo.checkStatus(response)) {
|
|
682
|
+
this.onNetworkAddress(response[1]);
|
|
683
|
+
}
|
|
684
|
+
break;
|
|
685
|
+
}
|
|
686
|
+
case Zdo.ClusterId.IEEE_ADDRESS_RESPONSE: {
|
|
687
|
+
if (Zdo.Buffalo.checkStatus(response)) {
|
|
688
|
+
this.onIEEEAddress(response[1]);
|
|
689
|
+
}
|
|
690
|
+
break;
|
|
691
|
+
}
|
|
692
|
+
case Zdo.ClusterId.END_DEVICE_ANNOUNCE: {
|
|
693
|
+
if (Zdo.Buffalo.checkStatus(response)) {
|
|
694
|
+
this.onDeviceAnnounce(response[1]);
|
|
695
|
+
}
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
527
698
|
}
|
|
528
699
|
}
|
|
529
700
|
async onZclPayload(payload) {
|
|
530
|
-
let frame
|
|
531
|
-
let device
|
|
701
|
+
let frame;
|
|
702
|
+
let device;
|
|
532
703
|
if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
|
|
533
704
|
// This is handled by touchlink
|
|
534
705
|
return;
|
|
535
706
|
}
|
|
536
|
-
|
|
707
|
+
if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
|
|
537
708
|
try {
|
|
538
709
|
// Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
|
|
539
710
|
frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
|
|
@@ -541,37 +712,30 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
541
712
|
catch (error) {
|
|
542
713
|
logger_1.logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
|
|
543
714
|
return;
|
|
544
|
-
// <<<<<<< HEAD
|
|
545
|
-
// } else if (dataPayload.frame.Cluster.name === 'greenPower') {
|
|
546
|
-
// await this.greenPower.onZclGreenPowerData(dataPayload);
|
|
547
|
-
// // lookup encapsulated gpDevice for further processing
|
|
548
|
-
// gpDevice = Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
|
|
549
|
-
// }
|
|
550
|
-
// }
|
|
551
|
-
// let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
|
|
552
|
-
// ? Device.byIeeeAddr(this.database.id, dataPayload.address)
|
|
553
|
-
// : Device.byNetworkAddress(dataPayload.address, this.database.id));
|
|
554
|
-
// /**
|
|
555
|
-
// * Handling of re-transmitted Xiaomi messages.
|
|
556
|
-
// * https://github.com/Koenkk/zigbee2mqtt/issues/1238
|
|
557
|
-
// * https://github.com/Koenkk/zigbee2mqtt/issues/3592
|
|
558
|
-
// *
|
|
559
|
-
// * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
|
|
560
|
-
// * The network address of these message is set to the one of the Xiaomi router.
|
|
561
|
-
// * Therefore it looks like if the message came from the Xiaomi router, while in
|
|
562
|
-
// * fact it came from the end device.
|
|
563
|
-
// * Handling these message would result in false state updates.
|
|
564
|
-
// * The group ID attribute of these message defines the network address of the end device.
|
|
565
|
-
// */
|
|
566
|
-
// if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
|
|
567
|
-
// debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
|
|
568
|
-
// device = Device.byNetworkAddress(dataPayload.groupID, this.database.id);
|
|
569
|
-
// }
|
|
570
|
-
// =======
|
|
571
715
|
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
716
|
+
if (frame.payload.commandID === undefined) {
|
|
717
|
+
// can be from gpd or gpp
|
|
718
|
+
// can be:
|
|
719
|
+
// - greenPower.commandsResponse.commissioningMode
|
|
720
|
+
// - Foundation.defaultRsp for greenPower.commandsResponse.pairing with status INVALID_FIELD or INSUFFICIENT_SPACE
|
|
721
|
+
// - ...
|
|
722
|
+
device = model_1.Device.find(this.database.id, payload.address);
|
|
723
|
+
}
|
|
724
|
+
else {
|
|
725
|
+
if (frame.payload.srcID === undefined) {
|
|
726
|
+
logger_1.logger.debug("Data is from unsupported green power device with IEEE addressing, skipping...", NS);
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
const ieeeAddr = greenPower_1.default.sourceIdToIeeeAddress(frame.payload.srcID);
|
|
730
|
+
device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
|
|
731
|
+
frame = await this.#greenPower.processCommand(payload, frame, device?.gpSecurityKey ? Buffer.from(device.gpSecurityKey) : undefined);
|
|
732
|
+
// lookup encapsulated gpDevice for further processing (re-fetch, may have been created by above call)
|
|
733
|
+
device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr);
|
|
734
|
+
if (!device) {
|
|
735
|
+
logger_1.logger.debug(`Data is from unknown green power device with address '${ieeeAddr}' (${frame.payload.srcID}), skipping...`, NS);
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
575
739
|
}
|
|
576
740
|
else {
|
|
577
741
|
/**
|
|
@@ -587,41 +751,45 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
587
751
|
* The group ID attribute of these message defines the network address of the end device.
|
|
588
752
|
*/
|
|
589
753
|
device = model_1.Device.find(this.database.id, payload.address);
|
|
590
|
-
if (device?.manufacturerName ===
|
|
754
|
+
if (device?.manufacturerName === "LUMI" && device?.type === "Router" && payload.groupID) {
|
|
591
755
|
logger_1.logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
|
|
592
756
|
device = model_1.Device.byNetworkAddress(this.database.id, payload.groupID);
|
|
593
757
|
}
|
|
594
758
|
try {
|
|
595
|
-
frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device
|
|
759
|
+
frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device ? device.customClusters : {});
|
|
596
760
|
}
|
|
597
761
|
catch (error) {
|
|
598
762
|
logger_1.logger.debug(`Failed to parse frame: ${error}`, NS);
|
|
599
763
|
}
|
|
600
764
|
}
|
|
601
765
|
if (!device) {
|
|
602
|
-
|
|
603
|
-
|
|
766
|
+
if (typeof payload.address === "number" && !model_1.Device.isDeletedByNetworkAddress(this.database.id, payload.address)) {
|
|
767
|
+
device = await this.identifyUnknownDevice(payload.address);
|
|
768
|
+
}
|
|
769
|
+
if (!device) {
|
|
770
|
+
logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
604
773
|
}
|
|
605
|
-
logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, `
|
|
606
|
-
|
|
607
|
-
|
|
774
|
+
logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, ` +
|
|
775
|
+
`endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, ` +
|
|
776
|
+
`linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
|
|
608
777
|
device.updateLastSeen();
|
|
609
778
|
//no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
|
|
610
|
-
if (
|
|
779
|
+
if (frame?.cluster.name !== "genPollCtrl") {
|
|
611
780
|
device.implicitCheckin();
|
|
612
781
|
}
|
|
613
782
|
device.linkquality = payload.linkquality;
|
|
614
783
|
let endpoint = device.getEndpoint(payload.endpoint);
|
|
615
784
|
if (!endpoint) {
|
|
616
|
-
logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with
|
|
617
|
-
`network address '${payload.address}', creating it...`, NS);
|
|
785
|
+
logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with network address '${payload.address}', creating it...`, NS);
|
|
618
786
|
endpoint = device.createEndpoint(payload.endpoint);
|
|
619
787
|
}
|
|
620
788
|
// Parse command for event
|
|
621
|
-
let type
|
|
622
|
-
let data;
|
|
623
|
-
let clusterName
|
|
624
|
-
const meta = {};
|
|
789
|
+
let type;
|
|
790
|
+
let data = {};
|
|
791
|
+
let clusterName;
|
|
792
|
+
const meta = { rawData: payload.data };
|
|
625
793
|
if (frame) {
|
|
626
794
|
const command = frame.command;
|
|
627
795
|
clusterName = frame.cluster.name;
|
|
@@ -629,72 +797,78 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
629
797
|
meta.manufacturerCode = frame.header.manufacturerCode;
|
|
630
798
|
meta.frameControl = frame.header.frameControl;
|
|
631
799
|
if (frame.header.isGlobal) {
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
}
|
|
636
|
-
else if (frame.isCommand('read')) {
|
|
637
|
-
type = 'read';
|
|
638
|
-
data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
|
|
639
|
-
}
|
|
640
|
-
else if (frame.isCommand('write')) {
|
|
641
|
-
type = 'write';
|
|
642
|
-
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
/* istanbul ignore else */
|
|
646
|
-
if (frame.isCommand('readRsp')) {
|
|
647
|
-
type = 'readResponse';
|
|
800
|
+
switch (frame.command.name) {
|
|
801
|
+
case "report": {
|
|
802
|
+
type = "attributeReport";
|
|
648
803
|
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
804
|
+
break;
|
|
649
805
|
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
type =
|
|
657
|
-
data = frame.
|
|
806
|
+
case "read": {
|
|
807
|
+
type = "read";
|
|
808
|
+
data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
|
|
809
|
+
break;
|
|
810
|
+
}
|
|
811
|
+
case "write": {
|
|
812
|
+
type = "write";
|
|
813
|
+
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
814
|
+
break;
|
|
815
|
+
}
|
|
816
|
+
case "readRsp": {
|
|
817
|
+
type = "readResponse";
|
|
818
|
+
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
819
|
+
break;
|
|
658
820
|
}
|
|
659
|
-
|
|
660
|
-
|
|
821
|
+
case "defaultRsp": {
|
|
822
|
+
if (frame.payload.statusCode !== Zcl.Status.SUCCESS) {
|
|
823
|
+
logger_1.logger.debug(`Failure default response from '${payload.address}': clusterID=${payload.clusterID} cmdId=${frame.payload.cmdId} status=${Zcl.Status[frame.payload.statusCode]}`, NS);
|
|
824
|
+
}
|
|
825
|
+
break;
|
|
661
826
|
}
|
|
662
827
|
}
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
const property = model_1.Device.ReportablePropertiesMapping[key];
|
|
668
|
-
if (property && !device[property.key]) {
|
|
669
|
-
property.set(value, device);
|
|
828
|
+
if (type === "readResponse" || type === "attributeReport") {
|
|
829
|
+
// devices report attributes through readRsp or attributeReport
|
|
830
|
+
if (frame.cluster.name === "genBasic") {
|
|
831
|
+
device.updateGenBasic(data);
|
|
670
832
|
}
|
|
833
|
+
endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
if (frame.header.isSpecific) {
|
|
838
|
+
type = `command${command.name.charAt(0).toUpperCase()}${command.name.slice(1)}`;
|
|
839
|
+
data = frame.payload;
|
|
671
840
|
}
|
|
672
|
-
endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
|
|
673
841
|
}
|
|
674
842
|
}
|
|
675
843
|
else {
|
|
676
|
-
type =
|
|
844
|
+
type = "raw";
|
|
677
845
|
data = payload.data;
|
|
678
846
|
const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
|
|
679
847
|
clusterName = Number.isNaN(Number(name)) ? name : Number(name);
|
|
680
848
|
}
|
|
681
849
|
if (type && data) {
|
|
682
|
-
const endpoint = device.getEndpoint(payload.endpoint);
|
|
683
850
|
const linkquality = payload.linkquality;
|
|
684
851
|
const groupID = payload.groupID;
|
|
685
|
-
|
|
686
|
-
type
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
852
|
+
this.selfAndDeviceEmit(device, "message", {
|
|
853
|
+
type,
|
|
854
|
+
device,
|
|
855
|
+
endpoint,
|
|
856
|
+
data,
|
|
857
|
+
linkquality,
|
|
858
|
+
groupID,
|
|
859
|
+
cluster: clusterName,
|
|
860
|
+
meta,
|
|
861
|
+
});
|
|
862
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "messageEmitted" });
|
|
690
863
|
}
|
|
691
864
|
else {
|
|
692
|
-
this.selfAndDeviceEmit(device,
|
|
865
|
+
this.selfAndDeviceEmit(device, "lastSeenChanged", { device, reason: "messageNonEmitted" });
|
|
693
866
|
}
|
|
694
867
|
if (frame) {
|
|
695
868
|
await device.onZclData(payload, frame, endpoint);
|
|
696
869
|
}
|
|
697
870
|
}
|
|
698
871
|
}
|
|
872
|
+
exports.Controller = Controller;
|
|
699
873
|
exports.default = Controller;
|
|
700
874
|
//# sourceMappingURL=controller.js.map
|