@willieee802/zigbee-herdsman 0.36.0 → 0.48.2
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/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +317 -0
- package/dist/adapter/adapter.d.ts +15 -13
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/adapter/adapter.js +15 -17
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +14 -12
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.js +118 -128
- package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
- package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
- package/dist/adapter/deconz/driver/driver.js +44 -44
- package/dist/adapter/deconz/driver/driver.js.map +1 -1
- package/dist/adapter/deconz/driver/frameParser.js +43 -43
- package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
- package/dist/adapter/deconz/driver/parser.js +6 -6
- package/dist/adapter/deconz/driver/parser.js.map +1 -1
- package/dist/adapter/deconz/driver/writer.js +3 -3
- package/dist/adapter/deconz/driver/writer.js.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.d.ts +32 -36
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.js +418 -446
- package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
- package/dist/adapter/ember/adapter/endpoints.d.ts +5 -3
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/endpoints.js +33 -31
- package/dist/adapter/ember/adapter/endpoints.js.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.d.ts +10 -2
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.js +19 -5
- package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
- package/dist/adapter/ember/adapter/requestQueue.d.ts +2 -4
- package/dist/adapter/ember/adapter/requestQueue.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/requestQueue.js +16 -21
- package/dist/adapter/ember/adapter/requestQueue.js.map +1 -1
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/tokensManager.js +23 -20
- package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
- package/dist/adapter/ember/consts.d.ts +0 -7
- package/dist/adapter/ember/consts.d.ts.map +1 -1
- package/dist/adapter/ember/consts.js +2 -9
- package/dist/adapter/ember/consts.js.map +1 -1
- package/dist/adapter/ember/enums.d.ts +12 -14
- package/dist/adapter/ember/enums.d.ts.map +1 -1
- package/dist/adapter/ember/enums.js +12 -14
- package/dist/adapter/ember/enums.js.map +1 -1
- package/dist/adapter/ember/ezsp/buffalo.js +4 -4
- package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
- package/dist/adapter/ember/ezsp/ezsp.d.ts +1 -2
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
- package/dist/adapter/ember/ezsp/ezsp.js +218 -199
- package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
- package/dist/adapter/ember/types.d.ts +9 -9
- package/dist/adapter/ember/types.d.ts.map +1 -1
- package/dist/adapter/ember/uart/ash.d.ts +11 -5
- package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
- package/dist/adapter/ember/uart/ash.js +125 -93
- package/dist/adapter/ember/uart/ash.js.map +1 -1
- package/dist/adapter/ember/uart/consts.d.ts +1 -1
- package/dist/adapter/ember/uart/consts.js +1 -1
- package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
- package/dist/adapter/ember/uart/parser.js +5 -9
- package/dist/adapter/ember/uart/parser.js.map +1 -1
- package/dist/adapter/ember/uart/queues.d.ts.map +1 -1
- package/dist/adapter/ember/uart/queues.js +3 -1
- package/dist/adapter/ember/uart/queues.js.map +1 -1
- package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
- package/dist/adapter/ember/uart/writer.js +4 -6
- package/dist/adapter/ember/uart/writer.js.map +1 -1
- package/dist/adapter/ember/utils/math.d.ts.map +1 -1
- package/dist/adapter/ember/zdo.d.ts +6 -2
- package/dist/adapter/ember/zdo.d.ts.map +1 -1
- package/dist/adapter/ember/zdo.js +2 -2
- package/dist/adapter/ember/zdo.js.map +1 -1
- package/dist/adapter/events.d.ts +17 -23
- package/dist/adapter/events.d.ts.map +1 -1
- package/dist/adapter/events.js +1 -2
- package/dist/adapter/events.js.map +1 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts +0 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/backup.js +3 -7
- package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +13 -10
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.js +79 -72
- package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
- package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/commands.js +3 -5
- package/dist/adapter/ezsp/driver/commands.js.map +1 -1
- package/dist/adapter/ezsp/driver/driver.d.ts +1 -4
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/driver.js +101 -122
- package/dist/adapter/ezsp/driver/driver.js.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.js +61 -50
- package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/multicast.js +8 -12
- package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
- package/dist/adapter/ezsp/driver/parser.js +5 -5
- package/dist/adapter/ezsp/driver/parser.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/basic.js +1 -1
- package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/named.js +2 -2
- package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/struct.js +2 -2
- package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
- package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/uart.js +46 -46
- package/dist/adapter/ezsp/driver/uart.js.map +1 -1
- package/dist/adapter/ezsp/driver/writer.js +3 -6
- package/dist/adapter/ezsp/driver/writer.js.map +1 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.js +25 -29
- package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
- package/dist/adapter/z-stack/adapter/endpoints.js +4 -4
- package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.d.ts +1 -4
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.js +52 -61
- package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +14 -10
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +95 -69
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
- package/dist/adapter/z-stack/unpi/parser.d.ts +3 -1
- package/dist/adapter/z-stack/unpi/parser.d.ts.map +1 -1
- package/dist/adapter/z-stack/unpi/parser.js +18 -8
- package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
- package/dist/adapter/z-stack/unpi/writer.d.ts +3 -2
- package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
- package/dist/adapter/z-stack/unpi/writer.js +21 -11
- package/dist/adapter/z-stack/unpi/writer.js.map +1 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +4 -2
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.js +154 -25
- package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
- package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/definition.js +2 -1
- package/dist/adapter/z-stack/znp/definition.js.map +1 -1
- package/dist/adapter/z-stack/znp/tstype.d.ts +4 -3
- package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/znp.d.ts +3 -1
- package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/znp.js +27 -32
- package/dist/adapter/z-stack/znp/znp.js.map +1 -1
- package/dist/adapter/z-stack/znp/zpiObject.js +2 -2
- package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +13 -12
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +81 -90
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +7 -8
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.js +150 -100
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
- package/dist/adapter/zigate/driver/commandType.d.ts +2 -1
- package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/commandType.js +56 -52
- package/dist/adapter/zigate/driver/commandType.js.map +1 -1
- package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/frame.js +8 -8
- package/dist/adapter/zigate/driver/frame.js.map +1 -1
- package/dist/adapter/zigate/driver/messageType.d.ts +2 -1
- package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/messageType.js +113 -108
- package/dist/adapter/zigate/driver/messageType.js.map +1 -1
- package/dist/adapter/zigate/driver/parameterType.d.ts +8 -1
- package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/parameterType.js +9 -0
- package/dist/adapter/zigate/driver/parameterType.js.map +1 -1
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/ziGateObject.js +9 -9
- package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/zigate.js +23 -31
- package/dist/adapter/zigate/driver/zigate.js.map +1 -1
- package/dist/buffalo/buffalo.d.ts +23 -19
- package/dist/buffalo/buffalo.d.ts.map +1 -1
- package/dist/buffalo/buffalo.js +74 -169
- package/dist/buffalo/buffalo.js.map +1 -1
- package/dist/buffalo/index.d.ts +1 -2
- package/dist/buffalo/index.d.ts.map +1 -1
- package/dist/buffalo/index.js +1 -26
- package/dist/buffalo/index.js.map +1 -1
- package/dist/controller/controller.d.ts +10 -5
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/controller/controller.js +184 -126
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/database.d.ts +1 -0
- package/dist/controller/database.d.ts.map +1 -1
- package/dist/controller/database.js +7 -10
- package/dist/controller/database.js.map +1 -1
- package/dist/controller/events.d.ts +2 -2
- package/dist/controller/events.d.ts.map +1 -1
- package/dist/controller/events.js +4 -0
- package/dist/controller/events.js.map +1 -1
- package/dist/controller/greenPower.d.ts +2 -1
- package/dist/controller/greenPower.d.ts.map +1 -1
- package/dist/controller/greenPower.js +51 -57
- package/dist/controller/greenPower.js.map +1 -1
- package/dist/controller/helpers/request.d.ts +3 -3
- package/dist/controller/helpers/request.d.ts.map +1 -1
- package/dist/controller/helpers/request.js +2 -2
- package/dist/controller/helpers/request.js.map +1 -1
- package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
- package/dist/controller/helpers/requestQueue.js +26 -36
- package/dist/controller/helpers/requestQueue.js.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.d.ts +4 -3
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.js +33 -14
- package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
- package/dist/controller/model/device.d.ts +12 -5
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +105 -86
- package/dist/controller/model/device.js.map +1 -1
- package/dist/controller/model/endpoint.d.ts +22 -17
- package/dist/controller/model/endpoint.d.ts.map +1 -1
- package/dist/controller/model/endpoint.js +139 -228
- package/dist/controller/model/endpoint.js.map +1 -1
- package/dist/controller/model/group.d.ts +1 -1
- package/dist/controller/model/group.d.ts.map +1 -1
- package/dist/controller/model/group.js +18 -18
- package/dist/controller/model/group.js.map +1 -1
- package/dist/controller/model/konnextConfig.d.ts +7 -0
- package/dist/controller/model/konnextConfig.d.ts.map +1 -0
- package/dist/controller/{logger-stub.js → model/konnextConfig.js} +1 -1
- package/dist/controller/model/konnextConfig.js.map +1 -0
- package/dist/controller/touchlink.js +25 -28
- package/dist/controller/touchlink.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/aes.d.ts +40 -0
- package/dist/utils/aes.d.ts.map +1 -0
- package/dist/utils/aes.js +198 -0
- package/dist/utils/aes.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/zspec/consts.d.ts +60 -0
- package/dist/zspec/consts.d.ts.map +1 -0
- package/dist/zspec/consts.js +64 -0
- package/dist/zspec/consts.js.map +1 -0
- package/dist/zspec/enums.d.ts +19 -0
- package/dist/zspec/enums.d.ts.map +1 -0
- package/dist/zspec/enums.js +28 -0
- package/dist/zspec/enums.js.map +1 -0
- package/dist/zspec/index.d.ts +4 -0
- package/dist/zspec/index.d.ts.map +1 -0
- package/dist/zspec/index.js +43 -0
- package/dist/zspec/index.js.map +1 -0
- package/dist/zspec/tstypes.d.ts +19 -0
- package/dist/zspec/tstypes.d.ts.map +1 -0
- package/dist/{buffalo/tstype.js → zspec/tstypes.js} +1 -1
- package/dist/zspec/tstypes.js.map +1 -0
- package/dist/zspec/utils.d.ts +14 -0
- package/dist/zspec/utils.d.ts.map +1 -0
- package/dist/zspec/utils.js +29 -0
- package/dist/zspec/utils.js.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts +55 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.js +929 -0
- package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
- package/dist/zspec/zcl/definition/cluster.d.ts +3 -0
- package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/cluster.js +5500 -0
- package/dist/zspec/zcl/definition/cluster.js.map +1 -0
- package/dist/zspec/zcl/definition/consts.d.ts +9 -0
- package/dist/zspec/zcl/definition/consts.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/consts.js +27 -0
- package/dist/zspec/zcl/definition/consts.js.map +1 -0
- package/dist/zspec/zcl/definition/enums.d.ts +177 -0
- package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/enums.js +187 -0
- package/dist/zspec/zcl/definition/enums.js.map +1 -0
- package/dist/zspec/zcl/definition/foundation.d.ts +11 -0
- package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/foundation.js +241 -0
- package/dist/zspec/zcl/definition/foundation.js.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts +727 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.js +733 -0
- package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -0
- package/dist/zspec/zcl/definition/status.d.ts +69 -0
- package/dist/zspec/zcl/definition/status.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/status.js +74 -0
- package/dist/zspec/zcl/definition/status.js.map +1 -0
- package/dist/zspec/zcl/definition/tstype.d.ts +114 -0
- package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
- package/dist/{zcl/zclHeader.js → zspec/zcl/definition/tstype.js} +2 -1
- package/dist/zspec/zcl/definition/tstype.js.map +1 -0
- package/dist/zspec/zcl/index.d.ts +11 -0
- package/dist/zspec/zcl/index.d.ts.map +1 -0
- package/dist/zspec/zcl/index.js +47 -0
- package/dist/zspec/zcl/index.js.map +1 -0
- package/dist/zspec/zcl/utils.d.ts +7 -0
- package/dist/zspec/zcl/utils.d.ts.map +1 -0
- package/dist/zspec/zcl/utils.js +234 -0
- package/dist/zspec/zcl/utils.js.map +1 -0
- package/dist/zspec/zcl/zclFrame.d.ts +36 -0
- package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
- package/dist/zspec/zcl/zclFrame.js +304 -0
- package/dist/zspec/zcl/zclFrame.js.map +1 -0
- package/dist/zspec/zcl/zclHeader.d.ts +17 -0
- package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
- package/dist/zspec/zcl/zclHeader.js +88 -0
- package/dist/zspec/zcl/zclHeader.js.map +1 -0
- package/dist/zspec/zcl/zclStatusError.d.ts +6 -0
- package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -0
- package/dist/zspec/zcl/zclStatusError.js +13 -0
- package/dist/zspec/zcl/zclStatusError.js.map +1 -0
- package/dist/zspec/zdo/buffaloZdo.d.ts +438 -0
- package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
- package/dist/zspec/zdo/buffaloZdo.js +1892 -0
- package/dist/zspec/zdo/buffaloZdo.js.map +1 -0
- package/dist/zspec/zdo/definition/clusters.d.ts +624 -0
- package/dist/zspec/zdo/definition/clusters.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/clusters.js +687 -0
- package/dist/zspec/zdo/definition/clusters.js.map +1 -0
- package/dist/zspec/zdo/definition/consts.d.ts +13 -0
- package/dist/zspec/zdo/definition/consts.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/consts.js +16 -0
- package/dist/zspec/zdo/definition/consts.js.map +1 -0
- package/dist/zspec/zdo/definition/enums.d.ts +75 -0
- package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/enums.js +97 -0
- package/dist/zspec/zdo/definition/enums.js.map +1 -0
- package/dist/zspec/zdo/definition/status.d.ts +99 -0
- package/dist/zspec/zdo/definition/status.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/status.js +109 -0
- package/dist/zspec/zdo/definition/status.js.map +1 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts +787 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
- package/dist/{zcl/definition/tstype.js → zspec/zdo/definition/tstypes.js} +1 -1
- package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
- package/dist/zspec/zdo/index.d.ts +7 -0
- package/dist/zspec/zdo/index.d.ts.map +1 -0
- package/dist/zspec/zdo/index.js +39 -0
- package/dist/zspec/zdo/index.js.map +1 -0
- package/dist/zspec/zdo/utils.d.ts +25 -0
- package/dist/zspec/zdo/utils.d.ts.map +1 -0
- package/dist/zspec/zdo/utils.js +75 -0
- package/dist/zspec/zdo/utils.js.map +1 -0
- package/dist/zspec/zdo/zdoStatusError.d.ts +6 -0
- package/dist/zspec/zdo/zdoStatusError.d.ts.map +1 -0
- package/dist/zspec/zdo/zdoStatusError.js +13 -0
- package/dist/zspec/zdo/zdoStatusError.js.map +1 -0
- package/examples/join-and-log.js +7 -12
- package/package.json +6 -6
- package/dist/adapter/zigate/debug.d.ts +0 -8
- package/dist/adapter/zigate/debug.d.ts.map +0 -1
- package/dist/adapter/zigate/debug.js +0 -20
- package/dist/adapter/zigate/debug.js.map +0 -1
- package/dist/buffalo/tstype.d.ts +0 -9
- package/dist/buffalo/tstype.d.ts.map +0 -1
- package/dist/buffalo/tstype.js.map +0 -1
- package/dist/controller/logger-stub.d.ts +0 -7
- package/dist/controller/logger-stub.d.ts.map +0 -1
- package/dist/controller/logger-stub.js.map +0 -1
- package/dist/zcl/buffaloZcl.d.ts +0 -42
- package/dist/zcl/buffaloZcl.d.ts.map +0 -1
- package/dist/zcl/buffaloZcl.js +0 -595
- package/dist/zcl/buffaloZcl.js.map +0 -1
- package/dist/zcl/definition/buffaloZclDataType.d.ts +0 -18
- package/dist/zcl/definition/buffaloZclDataType.d.ts.map +0 -1
- package/dist/zcl/definition/buffaloZclDataType.js +0 -21
- package/dist/zcl/definition/buffaloZclDataType.js.map +0 -1
- package/dist/zcl/definition/cluster.d.ts +0 -30
- package/dist/zcl/definition/cluster.d.ts.map +0 -1
- package/dist/zcl/definition/cluster.js +0 -5531
- package/dist/zcl/definition/cluster.js.map +0 -1
- package/dist/zcl/definition/dataType.d.ts +0 -60
- package/dist/zcl/definition/dataType.d.ts.map +0 -1
- package/dist/zcl/definition/dataType.js +0 -65
- package/dist/zcl/definition/dataType.js.map +0 -1
- package/dist/zcl/definition/direction.d.ts +0 -6
- package/dist/zcl/definition/direction.d.ts.map +0 -1
- package/dist/zcl/definition/direction.js +0 -9
- package/dist/zcl/definition/direction.js.map +0 -1
- package/dist/zcl/definition/endpointDeviceType.d.ts +0 -5
- package/dist/zcl/definition/endpointDeviceType.d.ts.map +0 -1
- package/dist/zcl/definition/endpointDeviceType.js +0 -16
- package/dist/zcl/definition/endpointDeviceType.js.map +0 -1
- package/dist/zcl/definition/foundation.d.ts +0 -12
- package/dist/zcl/definition/foundation.d.ts.map +0 -1
- package/dist/zcl/definition/foundation.js +0 -168
- package/dist/zcl/definition/foundation.js.map +0 -1
- package/dist/zcl/definition/frameControl.d.ts +0 -11
- package/dist/zcl/definition/frameControl.d.ts.map +0 -1
- package/dist/zcl/definition/frameControl.js +0 -3
- package/dist/zcl/definition/frameControl.js.map +0 -1
- package/dist/zcl/definition/frameType.d.ts +0 -6
- package/dist/zcl/definition/frameType.d.ts.map +0 -1
- package/dist/zcl/definition/frameType.js +0 -9
- package/dist/zcl/definition/frameType.js.map +0 -1
- package/dist/zcl/definition/index.d.ts +0 -14
- package/dist/zcl/definition/index.d.ts.map +0 -1
- package/dist/zcl/definition/index.js +0 -52
- package/dist/zcl/definition/index.js.map +0 -1
- package/dist/zcl/definition/manufacturerCode.d.ts +0 -1078
- package/dist/zcl/definition/manufacturerCode.d.ts.map +0 -1
- package/dist/zcl/definition/manufacturerCode.js +0 -1083
- package/dist/zcl/definition/manufacturerCode.js.map +0 -1
- package/dist/zcl/definition/powerSource.d.ts +0 -5
- package/dist/zcl/definition/powerSource.d.ts.map +0 -1
- package/dist/zcl/definition/powerSource.js +0 -13
- package/dist/zcl/definition/powerSource.js.map +0 -1
- package/dist/zcl/definition/status.d.ts +0 -39
- package/dist/zcl/definition/status.d.ts.map +0 -1
- package/dist/zcl/definition/status.js +0 -42
- package/dist/zcl/definition/status.js.map +0 -1
- package/dist/zcl/definition/tstype.d.ts +0 -17
- package/dist/zcl/definition/tstype.d.ts.map +0 -1
- package/dist/zcl/definition/tstype.js.map +0 -1
- package/dist/zcl/index.d.ts +0 -17
- package/dist/zcl/index.d.ts.map +0 -1
- package/dist/zcl/index.js +0 -56
- package/dist/zcl/index.js.map +0 -1
- package/dist/zcl/tstype.d.ts +0 -57
- package/dist/zcl/tstype.d.ts.map +0 -1
- package/dist/zcl/tstype.js +0 -10
- package/dist/zcl/tstype.js.map +0 -1
- package/dist/zcl/utils.d.ts +0 -7
- package/dist/zcl/utils.d.ts.map +0 -1
- package/dist/zcl/utils.js +0 -165
- package/dist/zcl/utils.js.map +0 -1
- package/dist/zcl/zclFrame.d.ts +0 -41
- package/dist/zcl/zclFrame.d.ts.map +0 -1
- package/dist/zcl/zclFrame.js +0 -352
- package/dist/zcl/zclFrame.js.map +0 -1
- package/dist/zcl/zclHeader.d.ts +0 -9
- package/dist/zcl/zclHeader.d.ts.map +0 -1
- package/dist/zcl/zclHeader.js.map +0 -1
- package/dist/zcl/zclStatusError.d.ts +0 -6
- package/dist/zcl/zclStatusError.d.ts.map +0 -1
- package/dist/zcl/zclStatusError.js +0 -15
- package/dist/zcl/zclStatusError.js.map +0 -1
|
@@ -1,19 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
29
|
exports.EmberAdapter = void 0;
|
|
7
30
|
/* istanbul ignore file */
|
|
8
|
-
const debug_1 = __importDefault(require("debug"));
|
|
9
31
|
const es6_1 = __importDefault(require("fast-deep-equal/es6"));
|
|
10
32
|
const mz_1 = require("mz");
|
|
11
33
|
const serialPortUtils_1 = __importDefault(require("../../serialPortUtils"));
|
|
12
34
|
const socketPortUtils_1 = __importDefault(require("../../socketPortUtils"));
|
|
13
35
|
const utils_1 = require("../../../utils");
|
|
14
36
|
const __1 = require("../..");
|
|
15
|
-
const
|
|
16
|
-
const cluster_1 = __importDefault(require("../../../zcl/definition/cluster"));
|
|
37
|
+
const Zcl = __importStar(require("../../../zspec/zcl"));
|
|
17
38
|
const events_1 = require("../../events");
|
|
18
39
|
const math_1 = require("../utils/math");
|
|
19
40
|
const ezsp_1 = require("../ezsp/ezsp");
|
|
@@ -28,7 +49,9 @@ const endpoints_1 = require("./endpoints");
|
|
|
28
49
|
const initters_1 = require("../utils/initters");
|
|
29
50
|
const crypto_1 = require("crypto");
|
|
30
51
|
const oneWaitress_1 = require("./oneWaitress");
|
|
31
|
-
const
|
|
52
|
+
const logger_1 = require("../../../utils/logger");
|
|
53
|
+
// import {EmberTokensManager} from "./tokensManager";
|
|
54
|
+
const NS = 'zh:ember';
|
|
32
55
|
/** Enum to pass strings from numbers up to Z2M. */
|
|
33
56
|
var RoutingTableStatus;
|
|
34
57
|
(function (RoutingTableStatus) {
|
|
@@ -42,15 +65,6 @@ var RoutingTableStatus;
|
|
|
42
65
|
RoutingTableStatus[RoutingTableStatus["RESERVED3"] = 7] = "RESERVED3";
|
|
43
66
|
})(RoutingTableStatus || (RoutingTableStatus = {}));
|
|
44
67
|
;
|
|
45
|
-
/** Events specific to OneWaitress usage. */
|
|
46
|
-
var OneWaitressEvents;
|
|
47
|
-
(function (OneWaitressEvents) {
|
|
48
|
-
OneWaitressEvents["STACK_STATUS_NETWORK_UP"] = "STACK_STATUS_NETWORK_UP";
|
|
49
|
-
OneWaitressEvents["STACK_STATUS_NETWORK_DOWN"] = "STACK_STATUS_NETWORK_DOWN";
|
|
50
|
-
OneWaitressEvents["STACK_STATUS_NETWORK_OPENED"] = "STACK_STATUS_NETWORK_OPENED";
|
|
51
|
-
OneWaitressEvents["STACK_STATUS_NETWORK_CLOSED"] = "STACK_STATUS_NETWORK_CLOSED";
|
|
52
|
-
})(OneWaitressEvents || (OneWaitressEvents = {}));
|
|
53
|
-
;
|
|
54
68
|
var NetworkInitAction;
|
|
55
69
|
(function (NetworkInitAction) {
|
|
56
70
|
/** Ain't that nice! */
|
|
@@ -116,11 +130,15 @@ const BACKUP_OLDEST_SUPPORTED_EZSP_VERSION = 12;
|
|
|
116
130
|
const BROADCAST_NETWORK_KEY_SWITCH_WAIT_TIME = 15000;
|
|
117
131
|
/**
|
|
118
132
|
* Stack configuration values for various supported stacks.
|
|
133
|
+
*
|
|
134
|
+
* https://github.com/darkxst/silabs-firmware-builder/tree/main/manifests
|
|
135
|
+
* https://github.com/NabuCasa/silabs-firmware/wiki/Zigbee-EmberZNet-NCP-firmware-configuration#skyconnect
|
|
136
|
+
* https://github.com/SiliconLabs/UnifySDK/blob/main/applications/zigbeed/project_files/zigbeed.slcp
|
|
119
137
|
*/
|
|
120
138
|
const STACK_CONFIGS = {
|
|
121
139
|
"default": {
|
|
122
140
|
/** <1-250> (Default: 2) @see EzspConfigId.ADDRESS_TABLE_SIZE */
|
|
123
|
-
ADDRESS_TABLE_SIZE: 16, // zigpc: 32, darkxst: 16
|
|
141
|
+
ADDRESS_TABLE_SIZE: 16, // zigpc: 32, darkxst: 16, nabucasa: 16
|
|
124
142
|
/** <0-4> (Default: 2) @see EzspConfigId.TRUST_CENTER_ADDRESS_CACHE_SIZE */
|
|
125
143
|
TRUST_CENTER_ADDRESS_CACHE_SIZE: 2,
|
|
126
144
|
/** (Default: USE_TOKEN) @see EzspConfigId.TX_POWER_MODE */
|
|
@@ -132,7 +150,7 @@ const STACK_CONFIGS = {
|
|
|
132
150
|
/** <-> (Default: ) @see EzspConfigId.SECURITY_LEVEL */
|
|
133
151
|
SECURITY_LEVEL: consts_2.SECURITY_LEVEL_Z3,
|
|
134
152
|
/** (Default: KEEP_ALIVE_SUPPORT_ALL) @see EzspValueId.END_DEVICE_KEEP_ALIVE_SUPPORT_MODE */
|
|
135
|
-
END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL,
|
|
153
|
+
END_DEVICE_KEEP_ALIVE_SUPPORT_MODE: enums_2.EmberKeepAliveMode.KEEP_ALIVE_SUPPORT_ALL,
|
|
136
154
|
/** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE */
|
|
137
155
|
MAXIMUM_INCOMING_TRANSFER_SIZE: consts_2.MAXIMUM_APS_PAYLOAD_LENGTH,
|
|
138
156
|
/** <-> (Default: MAXIMUM_APS_PAYLOAD_LENGTH) @see EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE */
|
|
@@ -140,27 +158,27 @@ const STACK_CONFIGS = {
|
|
|
140
158
|
/** <-> (Default: 10000) @see EzspValueId.TRANSIENT_DEVICE_TIMEOUT */
|
|
141
159
|
TRANSIENT_DEVICE_TIMEOUT: 10000,
|
|
142
160
|
/** <0-127> (Default: 2) @see EzspConfigId.BINDING_TABLE_SIZE */
|
|
143
|
-
BINDING_TABLE_SIZE:
|
|
161
|
+
BINDING_TABLE_SIZE: 32, // zigpc: 2, Z3GatewayGPCombo: 5, nabucasa: 32
|
|
144
162
|
/** <0-127> (Default: 0) @see EzspConfigId.KEY_TABLE_SIZE */
|
|
145
163
|
KEY_TABLE_SIZE: 0, // zigpc: 4
|
|
146
164
|
/** <6-64> (Default: 6) @see EzspConfigId.MAX_END_DEVICE_CHILDREN */
|
|
147
|
-
MAX_END_DEVICE_CHILDREN:
|
|
165
|
+
MAX_END_DEVICE_CHILDREN: 32, // zigpc: 6, nabucasa: 32, Dongle-E (Sonoff firmware): 32
|
|
148
166
|
/** <1-255> (Default: 10) @see EzspConfigId.APS_UNICAST_MESSAGE_COUNT */
|
|
149
|
-
APS_UNICAST_MESSAGE_COUNT:
|
|
167
|
+
APS_UNICAST_MESSAGE_COUNT: 32, // zigpc: 10, darkxst: 20, nabucasa: 20
|
|
150
168
|
/** <15-254> (Default: 15) @see EzspConfigId.BROADCAST_TABLE_SIZE */
|
|
151
169
|
BROADCAST_TABLE_SIZE: 15, // zigpc: 15, Z3GatewayGPCombo: 35 - NOTE: Sonoff Dongle-E fails at 35
|
|
152
170
|
/** [1, 16, 26] (Default: 16). @see EzspConfigId.NEIGHBOR_TABLE_SIZE */
|
|
153
|
-
NEIGHBOR_TABLE_SIZE: 26, // zigpc: 16, darkxst: 26
|
|
171
|
+
NEIGHBOR_TABLE_SIZE: 26, // zigpc: 16, darkxst: 26, nabucasa: 26
|
|
154
172
|
/** (Default: 8) @see EzspConfigId.END_DEVICE_POLL_TIMEOUT */
|
|
155
173
|
END_DEVICE_POLL_TIMEOUT: 8, // zigpc: 8
|
|
156
174
|
/** <0-65535> (Default: 300) @see EzspConfigId.TRANSIENT_KEY_TIMEOUT_S */
|
|
157
175
|
TRANSIENT_KEY_TIMEOUT_S: 300, // zigpc: 65535
|
|
158
176
|
/** <-> (Default: 16) @see EzspConfigId.RETRY_QUEUE_SIZE */
|
|
159
|
-
RETRY_QUEUE_SIZE: 16,
|
|
177
|
+
RETRY_QUEUE_SIZE: 16, // nabucasa: 16
|
|
160
178
|
/** <0-255> (Default: 0) @see EzspConfigId.SOURCE_ROUTE_TABLE_SIZE */
|
|
161
|
-
SOURCE_ROUTE_TABLE_SIZE: 200, // Z3GatewayGPCombo: 100, darkxst: 200
|
|
179
|
+
SOURCE_ROUTE_TABLE_SIZE: 200, // Z3GatewayGPCombo: 100, darkxst: 200, nabucasa: 200
|
|
162
180
|
/** <1-250> (Default: 8) @see EzspConfigId.MULTICAST_TABLE_SIZE */
|
|
163
|
-
MULTICAST_TABLE_SIZE: 16, // darkxst: 16
|
|
181
|
+
MULTICAST_TABLE_SIZE: 16, // darkxst: 16, nabucasa: 16 - NOTE: should always be at least enough to register FIXED_ENDPOINTS multicastIds
|
|
164
182
|
},
|
|
165
183
|
"zigbeed": {
|
|
166
184
|
ADDRESS_TABLE_SIZE: 128,
|
|
@@ -184,18 +202,17 @@ const STACK_CONFIGS = {
|
|
|
184
202
|
RETRY_QUEUE_SIZE: 16,
|
|
185
203
|
SOURCE_ROUTE_TABLE_SIZE: 254,
|
|
186
204
|
MULTICAST_TABLE_SIZE: 128,
|
|
187
|
-
/*
|
|
188
|
-
ROUTE_TABLE_SIZE: 254,
|
|
189
|
-
DISCOVERY_TABLE_SIZE: 64,
|
|
190
|
-
PACKET_BUFFER_COUNT: 255,
|
|
191
|
-
CUSTOM_MAC_FILTER_TABLE_SIZE: 64,
|
|
192
|
-
MAC_FILTER_TABLE_SIZE: 32,
|
|
193
|
-
CHILD_TABLE_SIZE: 64,
|
|
194
|
-
PLUGIN_ZIGBEE_PRO_STACK_CHILD_TABLE_SIZE: 64,
|
|
195
|
-
APS_MESSAGE_COUNT: 64,
|
|
196
|
-
*/
|
|
197
205
|
},
|
|
198
206
|
};
|
|
207
|
+
/**
|
|
208
|
+
* NOTE: This from SDK is currently ignored here because of issues in below links:
|
|
209
|
+
* - BUGZID 12261: Concentrators use MTORRs for route discovery and should not enable route discovery in the APS options.
|
|
210
|
+
* - https://community.silabs.com/s/question/0D58Y00008DRfDCSA1/coordinator-cant-send-unicast-to-sleepy-node-after-reboot
|
|
211
|
+
* - https://community.silabs.com/s/question/0D58Y0000B4nTb7SQE/largedense-network-communication-problem-source-route-table-not-big-enough
|
|
212
|
+
*
|
|
213
|
+
* Removing `ENABLE_ROUTE_DISCOVERY` leads to devices that won't reconnect/go offline, and various other issues. Keeping it for now.
|
|
214
|
+
*/
|
|
215
|
+
const DEFAULT_APS_OPTIONS = (enums_2.EmberApsOption.RETRY | enums_2.EmberApsOption.ENABLE_ROUTE_DISCOVERY | enums_2.EmberApsOption.ENABLE_ADDRESS_DISCOVERY);
|
|
199
216
|
/**
|
|
200
217
|
* Enabling this allows to immediately reject requests that won't be able to get to their destination.
|
|
201
218
|
* However, it causes more NCP calls, notably to get the source route overhead.
|
|
@@ -210,12 +227,25 @@ const DEFAULT_ZCL_REQUEST_TIMEOUT = 15000; //msec
|
|
|
210
227
|
const DEFAULT_NETWORK_REQUEST_TIMEOUT = 10000; // nothing on the network to bother requests, should be much faster than this
|
|
211
228
|
/** Time between watchdog counters reading/clearing */
|
|
212
229
|
const WATCHDOG_COUNTERS_FEED_INTERVAL = 3600000; // every hour...
|
|
230
|
+
/** Default manufacturer code reported by coordinator. */
|
|
231
|
+
const DEFAULT_MANUFACTURER_CODE = Zcl.ManufacturerCode.SILICON_LABORATORIES;
|
|
232
|
+
/**
|
|
233
|
+
* Workaround for devices that require a specific manufacturer code to be reported by coordinator while interviewing...
|
|
234
|
+
* - Lumi/Aqara devices do not work properly otherwise (missing features): https://github.com/Koenkk/zigbee2mqtt/issues/9274
|
|
235
|
+
*/
|
|
236
|
+
const WORKAROUND_JOIN_MANUF_IEEE_PREFIX_TO_CODE = {
|
|
237
|
+
// NOTE: Lumi has a new prefix registered since 2021, in case they start using that one with new devices, it might need to be added here too...
|
|
238
|
+
// "0x18c23c" https://maclookup.app/vendors/lumi-united-technology-co-ltd
|
|
239
|
+
"0x54ef44": Zcl.ManufacturerCode.LUMI_UNITED_TECHOLOGY_LTD_SHENZHEN,
|
|
240
|
+
};
|
|
213
241
|
/**
|
|
214
242
|
* Relay calls between Z2M and EZSP-layer and handle any error that might occur via queue & waitress.
|
|
215
243
|
*
|
|
216
244
|
* Anything post `start` that requests anything from the EZSP layer must run through the request queue for proper execution flow.
|
|
217
245
|
*/
|
|
218
246
|
class EmberAdapter extends __1.Adapter {
|
|
247
|
+
/** Current manufacturer code assigned to the coordinator. Used for join workarounds... */
|
|
248
|
+
manufacturerCode;
|
|
219
249
|
/** Key in STACK_CONFIGS */
|
|
220
250
|
stackConfig;
|
|
221
251
|
/** EMBER_LOW_RAM_CONCENTRATOR or EMBER_HIGH_RAM_CONCENTRATOR. */
|
|
@@ -238,19 +268,15 @@ class EmberAdapter extends __1.Adapter {
|
|
|
238
268
|
* NOTE: Do not use directly, use getter functions for it that check if valid or need retrieval from NCP.
|
|
239
269
|
*/
|
|
240
270
|
networkCache;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
multicastTable;
|
|
247
|
-
constructor(networkOptions, serialPortOptions, backupPath, adapterOptions, logger) {
|
|
248
|
-
super(networkOptions, serialPortOptions, backupPath, adapterOptions, logger);
|
|
249
|
-
// TODO config, should be fine like this for now?
|
|
250
|
-
this.stackConfig = socketPortUtils_1.default.isTcpPath(serialPortOptions.path) ? 'zigbeed' : 'default';
|
|
271
|
+
constructor(networkOptions, serialPortOptions, backupPath, adapterOptions) {
|
|
272
|
+
super(networkOptions, serialPortOptions, backupPath, adapterOptions);
|
|
273
|
+
// TODO config
|
|
274
|
+
// XXX: 'zigbeed': 4.4.x/7.4.x not supported by multiprotocol at the moment, will need refactoring when/if support is added
|
|
275
|
+
this.stackConfig = 'default';
|
|
251
276
|
// TODO config
|
|
252
277
|
this.concentratorType = consts_2.EMBER_HIGH_RAM_CONCENTRATOR;
|
|
253
278
|
const delay = (typeof this.adapterOptions.delay === 'number') ? Math.min(Math.max(this.adapterOptions.delay, 5), 60) : 5;
|
|
279
|
+
logger_1.logger.debug(`Using delay=${delay}.`, NS);
|
|
254
280
|
this.requestQueue = new requestQueue_1.EmberRequestQueue(delay);
|
|
255
281
|
this.oneWaitress = new oneWaitress_1.EmberOneWaitress();
|
|
256
282
|
this.zdoRequestBuffalo = new buffalo_1.EzspBuffalo(Buffer.alloc(consts_1.EZSP_MAX_FRAME_LENGTH));
|
|
@@ -273,36 +299,34 @@ class EmberAdapter extends __1.Adapter {
|
|
|
273
299
|
this.clearNetworkCache();
|
|
274
300
|
switch (status) {
|
|
275
301
|
case enums_2.EmberStatus.NETWORK_UP: {
|
|
276
|
-
this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_UP);
|
|
277
|
-
|
|
302
|
+
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP);
|
|
303
|
+
logger_1.logger.info(`[STACK STATUS] Network up.`, NS);
|
|
278
304
|
break;
|
|
279
305
|
}
|
|
280
306
|
case enums_2.EmberStatus.NETWORK_DOWN: {
|
|
281
|
-
this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_DOWN);
|
|
282
|
-
|
|
307
|
+
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN);
|
|
308
|
+
logger_1.logger.info(`[STACK STATUS] Network down.`, NS);
|
|
283
309
|
break;
|
|
284
310
|
}
|
|
285
311
|
case enums_2.EmberStatus.NETWORK_OPENED: {
|
|
286
|
-
this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_OPENED);
|
|
287
|
-
|
|
288
|
-
const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY));
|
|
289
|
-
if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
|
|
290
|
-
console.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`);
|
|
291
|
-
return enums_2.EmberStatus.ERR_FATAL;
|
|
292
|
-
}
|
|
293
|
-
return enums_2.EmberStatus.SUCCESS;
|
|
294
|
-
}, console.error, // no reject, just log error if any
|
|
295
|
-
true);
|
|
296
|
-
console.log(`[STACK STATUS] Network opened.`);
|
|
312
|
+
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_OPENED);
|
|
313
|
+
logger_1.logger.info(`[STACK STATUS] Network opened.`, NS);
|
|
297
314
|
break;
|
|
298
315
|
}
|
|
299
316
|
case enums_2.EmberStatus.NETWORK_CLOSED: {
|
|
300
|
-
this.oneWaitress.resolveEvent(OneWaitressEvents.STACK_STATUS_NETWORK_CLOSED);
|
|
301
|
-
|
|
317
|
+
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_CLOSED);
|
|
318
|
+
logger_1.logger.info(`[STACK STATUS] Network closed.`, NS);
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case enums_2.EmberStatus.CHANNEL_CHANGED: {
|
|
322
|
+
this.oneWaitress.resolveEvent(oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED);
|
|
323
|
+
// invalidate cache
|
|
324
|
+
this.networkCache.parameters.radioChannel = consts_2.INVALID_RADIO_CHANNEL;
|
|
325
|
+
logger_1.logger.info(`[STACK STATUS] Channel changed.`, NS);
|
|
302
326
|
break;
|
|
303
327
|
}
|
|
304
328
|
default: {
|
|
305
|
-
debug(`[STACK STATUS] ${enums_2.EmberStatus[status]}
|
|
329
|
+
logger_1.logger.debug(`[STACK STATUS] ${enums_2.EmberStatus[status]}.`, NS);
|
|
306
330
|
break;
|
|
307
331
|
}
|
|
308
332
|
}
|
|
@@ -323,8 +347,8 @@ class EmberAdapter extends __1.Adapter {
|
|
|
323
347
|
case enums_2.EmberOutgoingMessageType.MULTICAST:
|
|
324
348
|
case enums_2.EmberOutgoingMessageType.MULTICAST_WITH_ALIAS: {
|
|
325
349
|
// BC/MC not checking for message sent, avoid unnecessary waitress lookups
|
|
326
|
-
|
|
327
|
-
+ `[apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]
|
|
350
|
+
logger_1.logger.error(`Delivery of ${enums_2.EmberOutgoingMessageType[type]} failed for "${indexOrDestination}" `
|
|
351
|
+
+ `[apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
|
|
328
352
|
break;
|
|
329
353
|
}
|
|
330
354
|
default: {
|
|
@@ -368,32 +392,19 @@ class EmberAdapter extends __1.Adapter {
|
|
|
368
392
|
* @param messageContents
|
|
369
393
|
*/
|
|
370
394
|
async onIncomingMessage(type, apsFrame, lastHopLqi, sender, messageContents) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
catch (error) {
|
|
385
|
-
const payload = {
|
|
386
|
-
clusterID: apsFrame.clusterId,
|
|
387
|
-
address: sender,
|
|
388
|
-
data: messageContents,
|
|
389
|
-
endpoint: apsFrame.sourceEndpoint,
|
|
390
|
-
linkquality: lastHopLqi,
|
|
391
|
-
groupID: apsFrame.groupId,
|
|
392
|
-
wasBroadcast: ((type === enums_2.EmberIncomingMessageType.BROADCAST) || (type === enums_2.EmberIncomingMessageType.BROADCAST_LOOPBACK)),
|
|
393
|
-
destinationEndpoint: apsFrame.destinationEndpoint,
|
|
394
|
-
};
|
|
395
|
-
this.emit(events_1.Events.rawData, payload);
|
|
396
|
-
}
|
|
395
|
+
const payload = {
|
|
396
|
+
clusterID: apsFrame.clusterId,
|
|
397
|
+
header: Zcl.Header.fromBuffer(messageContents),
|
|
398
|
+
address: sender,
|
|
399
|
+
data: messageContents,
|
|
400
|
+
endpoint: apsFrame.sourceEndpoint,
|
|
401
|
+
linkquality: lastHopLqi,
|
|
402
|
+
groupID: apsFrame.groupId,
|
|
403
|
+
wasBroadcast: ((type === enums_2.EmberIncomingMessageType.BROADCAST) || (type === enums_2.EmberIncomingMessageType.BROADCAST_LOOPBACK)),
|
|
404
|
+
destinationEndpoint: apsFrame.destinationEndpoint,
|
|
405
|
+
};
|
|
406
|
+
this.oneWaitress.resolveZCL(payload);
|
|
407
|
+
this.emit(events_1.Events.zclPayload, payload);
|
|
397
408
|
}
|
|
398
409
|
/**
|
|
399
410
|
* Emitted from @see Ezsp.ezspMacFilterMatchMessageHandler when the message is a valid InterPAN touchlink message.
|
|
@@ -406,7 +417,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
406
417
|
*/
|
|
407
418
|
async onTouchlinkMessage(sourcePanId, sourceAddress, groupId, lastHopLqi, messageContents) {
|
|
408
419
|
const payload = {
|
|
409
|
-
|
|
420
|
+
clusterID: Zcl.Clusters.touchlink.ID,
|
|
421
|
+
data: messageContents,
|
|
422
|
+
header: Zcl.Header.fromBuffer(messageContents),
|
|
410
423
|
address: sourceAddress,
|
|
411
424
|
endpoint: 1, // arbitrary since not sent over-the-air
|
|
412
425
|
linkquality: lastHopLqi,
|
|
@@ -415,7 +428,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
415
428
|
destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
|
|
416
429
|
};
|
|
417
430
|
this.oneWaitress.resolveZCL(payload);
|
|
418
|
-
this.emit(events_1.Events.
|
|
431
|
+
this.emit(events_1.Events.zclPayload, payload);
|
|
419
432
|
}
|
|
420
433
|
/**
|
|
421
434
|
* Emitted from @see Ezsp.ezspGpepIncomingMessageHandler
|
|
@@ -441,27 +454,29 @@ class EmberAdapter extends __1.Adapter {
|
|
|
441
454
|
gpdHeader.writeUInt32LE(frameCounter, 9); // frameCounter
|
|
442
455
|
gpdHeader.writeUInt8(gpdCommandId, 13); // commandID
|
|
443
456
|
gpdHeader.writeUInt8(gpdCommandPayload.length, 14); // payloadSize
|
|
444
|
-
const
|
|
457
|
+
const data = Buffer.concat([gpdHeader, gpdCommandPayload]);
|
|
445
458
|
const payload = {
|
|
446
|
-
|
|
459
|
+
header: Zcl.Header.fromBuffer(data),
|
|
460
|
+
data,
|
|
461
|
+
clusterID: Zcl.Clusters.greenPower.ID,
|
|
447
462
|
address: sourceId,
|
|
448
463
|
endpoint: consts_2.GP_ENDPOINT,
|
|
449
464
|
linkquality: gpdLink,
|
|
450
465
|
groupID: this.greenPowerGroup,
|
|
451
|
-
|
|
452
|
-
wasBroadcast: (gpFrame.Payload.gppNwkAddr != null) ? false : true,
|
|
466
|
+
wasBroadcast: true,
|
|
453
467
|
destinationEndpoint: consts_2.GP_ENDPOINT,
|
|
454
468
|
};
|
|
455
469
|
this.oneWaitress.resolveZCL(payload);
|
|
456
|
-
this.emit(events_1.Events.
|
|
470
|
+
this.emit(events_1.Events.zclPayload, payload);
|
|
457
471
|
}
|
|
458
472
|
catch (err) {
|
|
459
|
-
|
|
473
|
+
logger_1.logger.error(`<~x~ [GP] Failed creating ZCL payload. Skipping. ${err}`, NS);
|
|
460
474
|
return;
|
|
461
475
|
}
|
|
462
476
|
}
|
|
463
477
|
/**
|
|
464
478
|
* Emitted from @see Ezsp.ezspTrustCenterJoinHandler
|
|
479
|
+
* Also from @see Ezsp.ezspIdConflictHandler as a DEVICE_LEFT
|
|
465
480
|
*
|
|
466
481
|
* @param newNodeId
|
|
467
482
|
* @param newNodeEui64
|
|
@@ -471,7 +486,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
471
486
|
*/
|
|
472
487
|
async onTrustCenterJoin(newNodeId, newNodeEui64, status, policyDecision, parentOfNewNodeId) {
|
|
473
488
|
if (status === enums_2.EmberDeviceUpdate.DEVICE_LEFT) {
|
|
474
|
-
// NOTE: `policyDecision` here is NO_ACTION and `parentOfNewNodeId` is 65535
|
|
475
489
|
const payload = {
|
|
476
490
|
networkAddress: newNodeId,
|
|
477
491
|
ieeeAddr: newNodeEui64,
|
|
@@ -484,24 +498,41 @@ class EmberAdapter extends __1.Adapter {
|
|
|
484
498
|
networkAddress: newNodeId,
|
|
485
499
|
ieeeAddr: newNodeEui64,
|
|
486
500
|
};
|
|
487
|
-
|
|
501
|
+
// set workaround manuf code if necessary, or revert to default if previous joined device required workaround and new one does not
|
|
502
|
+
const joinManufCode = WORKAROUND_JOIN_MANUF_IEEE_PREFIX_TO_CODE[newNodeEui64.substring(0, 8)] ?? DEFAULT_MANUFACTURER_CODE;
|
|
503
|
+
if (this.manufacturerCode !== joinManufCode) {
|
|
504
|
+
await new Promise((resolve, reject) => {
|
|
505
|
+
this.requestQueue.enqueue(async () => {
|
|
506
|
+
logger_1.logger.debug(`[WORKAROUND] Setting coordinator manufacturer code to ${Zcl.ManufacturerCode[joinManufCode]}.`, NS);
|
|
507
|
+
await this.ezsp.ezspSetManufacturerCode(joinManufCode);
|
|
508
|
+
this.manufacturerCode = joinManufCode;
|
|
509
|
+
this.emit(events_1.Events.deviceJoined, payload);
|
|
510
|
+
resolve();
|
|
511
|
+
return enums_2.EmberStatus.SUCCESS;
|
|
512
|
+
}, reject, true);
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
this.emit(events_1.Events.deviceJoined, payload);
|
|
517
|
+
}
|
|
488
518
|
}
|
|
489
519
|
else {
|
|
490
|
-
|
|
520
|
+
logger_1.logger.warning(`[TRUST CENTER] Device ${newNodeId}:${newNodeEui64} was denied joining via ${parentOfNewNodeId}.`, NS);
|
|
491
521
|
}
|
|
492
522
|
}
|
|
493
523
|
}
|
|
494
524
|
async watchdogCounters() {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
525
|
+
await new Promise((resolve, reject) => {
|
|
526
|
+
this.requestQueue.enqueue(async () => {
|
|
527
|
+
// listed as per EmberCounterType
|
|
528
|
+
const ncpCounters = (await this.ezsp.ezspReadAndClearCounters());
|
|
529
|
+
logger_1.logger.info(`[NCP COUNTERS] ${ncpCounters.join(',')}`, NS);
|
|
530
|
+
const ashCounters = this.ezsp.ash.readAndClearCounters();
|
|
531
|
+
logger_1.logger.info(`[ASH COUNTERS] ${ashCounters.join(',')}`, NS);
|
|
532
|
+
resolve();
|
|
533
|
+
return enums_2.EmberStatus.SUCCESS;
|
|
534
|
+
}, reject);
|
|
535
|
+
});
|
|
505
536
|
}
|
|
506
537
|
initVariables() {
|
|
507
538
|
this.ezsp.removeAllListeners(ezsp_1.EzspEvents.ncpNeedsResetAndInit);
|
|
@@ -511,9 +542,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
511
542
|
this.zdoRequestRadius = 255;
|
|
512
543
|
this.interpanLock = false;
|
|
513
544
|
this.networkCache = (0, initters_1.initNetworkCache)();
|
|
514
|
-
this.
|
|
515
|
-
// always at least length==1 because of allowed MULTICAST_TABLE_SIZE range
|
|
516
|
-
this.multicastTable = new Array(STACK_CONFIGS[this.stackConfig].MULTICAST_TABLE_SIZE).fill(null);
|
|
545
|
+
this.manufacturerCode = DEFAULT_MANUFACTURER_CODE; // will be set in NCP in initEzsp
|
|
517
546
|
this.ezsp.once(ezsp_1.EzspEvents.ncpNeedsResetAndInit, this.onNcpNeedsResetAndInit.bind(this));
|
|
518
547
|
}
|
|
519
548
|
/**
|
|
@@ -522,16 +551,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
522
551
|
*/
|
|
523
552
|
async initEzsp() {
|
|
524
553
|
let result = "resumed";
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
if (result !== enums_2.EzspStatus.SUCCESS) {
|
|
530
|
-
throw new Error(`Failed to start EZSP layer with status=${enums_2.EzspStatus[result]}.`);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
catch (err) {
|
|
534
|
-
throw err;
|
|
554
|
+
// NOTE: something deep in this call can throw too
|
|
555
|
+
const startResult = (await this.ezsp.start());
|
|
556
|
+
if (startResult !== enums_2.EzspStatus.SUCCESS) {
|
|
557
|
+
throw new Error(`Failed to start EZSP layer with status=${enums_2.EzspStatus[startResult]}.`);
|
|
535
558
|
}
|
|
536
559
|
// call before any other command, else fails
|
|
537
560
|
await this.emberVersion();
|
|
@@ -539,7 +562,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
539
562
|
await this.initNCPAddressTable();
|
|
540
563
|
await this.initNCPConfiguration();
|
|
541
564
|
// WARNING: From here on EZSP commands that affect memory allocation on the NCP should no longer be called (like resizing tables)
|
|
542
|
-
await this.onNCPPostReset();
|
|
543
565
|
await this.registerFixedEndpoints();
|
|
544
566
|
this.clearNetworkCache();
|
|
545
567
|
result = (await this.initTrustCenter());
|
|
@@ -554,7 +576,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
554
576
|
this.networkCache.parameters = parameters;
|
|
555
577
|
this.networkCache.status = (await this.ezsp.ezspNetworkState());
|
|
556
578
|
this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
|
|
557
|
-
debug(`[INIT] Network Ready! ${JSON.stringify(this.networkCache)}
|
|
579
|
+
logger_1.logger.debug(`[INIT] Network Ready! ${JSON.stringify(this.networkCache)}`, NS);
|
|
580
|
+
this.watchdogCountersHandle = setInterval(this.watchdogCounters.bind(this), WATCHDOG_COUNTERS_FEED_INTERVAL);
|
|
581
|
+
this.requestQueue.startDispatching();
|
|
558
582
|
return result;
|
|
559
583
|
}
|
|
560
584
|
/**
|
|
@@ -583,9 +607,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
583
607
|
await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_INCOMING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_INCOMING_TRANSFER_SIZE));
|
|
584
608
|
await this.emberSetEzspValue(enums_1.EzspValueId.MAXIMUM_OUTGOING_TRANSFER_SIZE, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].MAXIMUM_OUTGOING_TRANSFER_SIZE));
|
|
585
609
|
await this.emberSetEzspValue(enums_1.EzspValueId.TRANSIENT_DEVICE_TIMEOUT, 2, (0, math_1.lowHighBytes)(STACK_CONFIGS[this.stackConfig].TRANSIENT_DEVICE_TIMEOUT));
|
|
586
|
-
|
|
587
|
-
// Ember's ID is 0x1002 and is the default, but this can be overridden in App Builder.
|
|
588
|
-
await this.ezsp.ezspSetManufacturerCode(consts_2.MANUFACTURER_CODE);
|
|
610
|
+
await this.ezsp.ezspSetManufacturerCode(this.manufacturerCode);
|
|
589
611
|
// network security init
|
|
590
612
|
await this.emberSetEzspConfigValue(enums_1.EzspConfigId.STACK_PROFILE, STACK_CONFIGS[this.stackConfig].STACK_PROFILE);
|
|
591
613
|
await this.emberSetEzspConfigValue(enums_1.EzspConfigId.SECURITY_LEVEL, STACK_CONFIGS[this.stackConfig].SECURITY_LEVEL);
|
|
@@ -642,15 +664,16 @@ class EmberAdapter extends __1.Adapter {
|
|
|
642
664
|
throw new Error(`[CONCENTRATOR] Failed to set concentrator with status=${status}.`);
|
|
643
665
|
}
|
|
644
666
|
const remainTilMTORR = (await this.ezsp.ezspSetSourceRouteDiscoveryMode(enums_2.EmberSourceRouteDiscoveryMode.RESCHEDULE));
|
|
645
|
-
|
|
667
|
+
logger_1.logger.info(`[CONCENTRATOR] Started source route discovery. ${remainTilMTORR}ms until next broadcast.`, NS);
|
|
646
668
|
}
|
|
647
669
|
/**
|
|
648
670
|
* Register fixed endpoints and set any related multicast entries that need to be.
|
|
649
671
|
*/
|
|
650
672
|
async registerFixedEndpoints() {
|
|
673
|
+
let mcTableIdx = 0;
|
|
651
674
|
for (const ep of endpoints_1.FIXED_ENDPOINTS) {
|
|
652
675
|
if (ep.networkIndex !== 0x00) {
|
|
653
|
-
debug(`Multi-network not currently supported. Skipping endpoint ${JSON.stringify(ep)}
|
|
676
|
+
logger_1.logger.debug(`Multi-network not currently supported. Skipping endpoint ${JSON.stringify(ep)}.`, NS);
|
|
654
677
|
continue;
|
|
655
678
|
}
|
|
656
679
|
const [epStatus,] = (await this.ezsp.ezspGetEndpointFlags(ep.endpoint));
|
|
@@ -658,30 +681,29 @@ class EmberAdapter extends __1.Adapter {
|
|
|
658
681
|
if (epStatus !== enums_2.EzspStatus.SUCCESS) {
|
|
659
682
|
// check to see if ezspAddEndpoint needs to be called
|
|
660
683
|
// if ezspInit is called without NCP reset, ezspAddEndpoint is not necessary and will return an error
|
|
661
|
-
const status = (await this.ezsp.ezspAddEndpoint(ep.endpoint, ep.profileId, ep.deviceId, ep.deviceVersion, ep.inClusterList,
|
|
684
|
+
const status = (await this.ezsp.ezspAddEndpoint(ep.endpoint, ep.profileId, ep.deviceId, ep.deviceVersion, ep.inClusterList.slice(), // copy
|
|
685
|
+
ep.outClusterList.slice()));
|
|
662
686
|
if (status === enums_2.EzspStatus.SUCCESS) {
|
|
663
|
-
debug(`Registered endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}
|
|
687
|
+
logger_1.logger.debug(`Registered endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`, NS);
|
|
664
688
|
}
|
|
665
689
|
else {
|
|
666
690
|
throw new Error(`Failed to register endpoint "${ep.endpoint}" with status=${enums_2.EzspStatus[status]}.`);
|
|
667
691
|
}
|
|
668
692
|
}
|
|
669
693
|
else {
|
|
670
|
-
debug(`Endpoint "${ep.endpoint}" already registered
|
|
694
|
+
logger_1.logger.debug(`Endpoint "${ep.endpoint}" already registered.`, NS);
|
|
671
695
|
}
|
|
672
|
-
|
|
673
|
-
const
|
|
674
|
-
multicastId
|
|
696
|
+
for (const multicastId of ep.multicastIds) {
|
|
697
|
+
const multicastEntry = {
|
|
698
|
+
multicastId,
|
|
675
699
|
endpoint: ep.endpoint,
|
|
676
700
|
networkIndex: ep.networkIndex,
|
|
677
701
|
};
|
|
678
|
-
const status = (await this.ezsp.ezspSetMulticastTableEntry(
|
|
702
|
+
const status = (await this.ezsp.ezspSetMulticastTableEntry(mcTableIdx++, multicastEntry));
|
|
679
703
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
680
|
-
throw new Error(`Failed to register group "
|
|
704
|
+
throw new Error(`Failed to register group "${multicastId}" in multicast table with status=${enums_2.EmberStatus[status]}.`);
|
|
681
705
|
}
|
|
682
|
-
|
|
683
|
-
this.multicastTable[0] = gpMulticastEntry;
|
|
684
|
-
debug(`Registered multicast table entry: ${JSON.stringify(gpMulticastEntry)}.`);
|
|
706
|
+
logger_1.logger.debug(`Registered multicast table entry: ${JSON.stringify(multicastEntry)}.`, NS);
|
|
685
707
|
}
|
|
686
708
|
}
|
|
687
709
|
}
|
|
@@ -714,21 +736,19 @@ class EmberAdapter extends __1.Adapter {
|
|
|
714
736
|
bitmask: (enums_2.EmberNetworkInitBitmask.PARENT_INFO_IN_TOKEN | enums_2.EmberNetworkInitBitmask.END_DEVICE_REJOIN_ON_REBOOT)
|
|
715
737
|
};
|
|
716
738
|
const initStatus = (await this.ezsp.ezspNetworkInit(networkInitStruct));
|
|
717
|
-
debug(`[INIT TC] Network init status=${enums_2.EmberStatus[initStatus]}
|
|
739
|
+
logger_1.logger.debug(`[INIT TC] Network init status=${enums_2.EmberStatus[initStatus]}.`, NS);
|
|
718
740
|
if ((initStatus !== enums_2.EmberStatus.SUCCESS) && (initStatus !== enums_2.EmberStatus.NOT_JOINED)) {
|
|
719
741
|
throw new Error(`[INIT TC] Failed network init request with status=${enums_2.EmberStatus[initStatus]}.`);
|
|
720
742
|
}
|
|
721
743
|
let action = NetworkInitAction.DONE;
|
|
722
744
|
if (initStatus === enums_2.EmberStatus.SUCCESS) {
|
|
723
745
|
// network
|
|
724
|
-
await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Network init');
|
|
746
|
+
await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Network init');
|
|
725
747
|
const [npStatus, nodeType, netParams] = (await this.ezsp.ezspGetNetworkParameters());
|
|
726
|
-
debug(`[INIT TC] Current network config=${JSON.stringify(this.networkOptions)}
|
|
727
|
-
debug(`[INIT TC] Current NCP network: nodeType=${enums_2.EmberNodeType[nodeType]} params=${JSON.stringify(netParams)}
|
|
728
|
-
// XXX: should not force a form when it's only a channel change, just change the channel, wait a sec, then continue the logic
|
|
748
|
+
logger_1.logger.debug(`[INIT TC] Current network config=${JSON.stringify(this.networkOptions)}`, NS);
|
|
749
|
+
logger_1.logger.debug(`[INIT TC] Current NCP network: nodeType=${enums_2.EmberNodeType[nodeType]} params=${JSON.stringify(netParams)}`, NS);
|
|
729
750
|
if ((npStatus === enums_2.EmberStatus.SUCCESS) && (nodeType === enums_2.EmberNodeType.COORDINATOR) && (this.networkOptions.panID === netParams.panId)
|
|
730
|
-
&& ((0, es6_1.default)(this.networkOptions.extendedPanID, netParams.extendedPanId))
|
|
731
|
-
&& (this.networkOptions.channelList.includes(netParams.radioChannel))) {
|
|
751
|
+
&& ((0, es6_1.default)(this.networkOptions.extendedPanID, netParams.extendedPanId))) {
|
|
732
752
|
// config matches adapter so far, no error, we can check the network key
|
|
733
753
|
const context = (0, initters_1.initSecurityManagerContext)();
|
|
734
754
|
context.coreKeyType = enums_2.SecManKeyType.NETWORK;
|
|
@@ -737,7 +757,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
737
757
|
if (nkStatus !== enums_2.SLStatus.OK) {
|
|
738
758
|
throw new Error(`[BACKUP] Failed to export Network Key with status=${enums_2.SLStatus[nkStatus]}.`);
|
|
739
759
|
}
|
|
740
|
-
debug(`[INIT TC] Current NCP network: networkKey=${networkKey.contents.toString('hex')}
|
|
760
|
+
logger_1.logger.debug(`[INIT TC] Current NCP network: networkKey=${networkKey.contents.toString('hex')}`, NS);
|
|
741
761
|
// config doesn't match adapter anymore
|
|
742
762
|
if (!networkKey.contents.equals(configNetworkKey)) {
|
|
743
763
|
action = NetworkInitAction.LEAVE;
|
|
@@ -748,12 +768,12 @@ class EmberAdapter extends __1.Adapter {
|
|
|
748
768
|
action = NetworkInitAction.LEAVE;
|
|
749
769
|
}
|
|
750
770
|
if (action === NetworkInitAction.LEAVE) {
|
|
751
|
-
|
|
771
|
+
logger_1.logger.info(`[INIT TC] NCP network does not match config. Leaving network...`, NS);
|
|
752
772
|
const leaveStatus = (await this.ezsp.ezspLeaveNetwork());
|
|
753
773
|
if (leaveStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
754
774
|
throw new Error(`[INIT TC] Failed leave network request with status=${enums_2.EmberStatus[leaveStatus]}.`);
|
|
755
775
|
}
|
|
756
|
-
await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_DOWN }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Leave network');
|
|
776
|
+
await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_DOWN }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT TC] Leave network');
|
|
757
777
|
await (0, utils_1.Wait)(200); // settle down
|
|
758
778
|
action = NetworkInitAction.LEFT;
|
|
759
779
|
}
|
|
@@ -771,24 +791,21 @@ class EmberAdapter extends __1.Adapter {
|
|
|
771
791
|
}
|
|
772
792
|
else {
|
|
773
793
|
// config doesn't match backup
|
|
774
|
-
|
|
794
|
+
logger_1.logger.info(`[INIT TC] Config does not match backup.`, NS);
|
|
775
795
|
action = NetworkInitAction.FORM_CONFIG;
|
|
776
796
|
}
|
|
777
797
|
}
|
|
778
798
|
else {
|
|
779
799
|
// no backup
|
|
780
|
-
|
|
800
|
+
logger_1.logger.info(`[INIT TC] No valid backup found.`, NS);
|
|
781
801
|
action = NetworkInitAction.FORM_CONFIG;
|
|
782
802
|
}
|
|
783
803
|
}
|
|
784
|
-
else {
|
|
785
|
-
action = NetworkInitAction.DONE; // just to be clear
|
|
786
|
-
}
|
|
787
804
|
//---- from here on, we assume everything is in place for whatever decision was taken above
|
|
788
805
|
let result = 'resumed';
|
|
789
806
|
switch (action) {
|
|
790
807
|
case NetworkInitAction.FORM_BACKUP: {
|
|
791
|
-
|
|
808
|
+
logger_1.logger.info(`[INIT TC] Forming from backup.`, NS);
|
|
792
809
|
const keyList = backup.devices.map((device) => {
|
|
793
810
|
const octets = Array.from(device.ieeeAddress.reverse());
|
|
794
811
|
const deviceEui64 = '0x' + octets.map(octet => octet.toString(16).padStart(2, '0')).join("");
|
|
@@ -807,13 +824,13 @@ class EmberAdapter extends __1.Adapter {
|
|
|
807
824
|
break;
|
|
808
825
|
}
|
|
809
826
|
case NetworkInitAction.FORM_CONFIG: {
|
|
810
|
-
|
|
827
|
+
logger_1.logger.info(`[INIT TC] Forming from config.`, NS);
|
|
811
828
|
await this.formNetwork(false, /*from config*/ configNetworkKey, 0, this.networkOptions.panID, this.networkOptions.extendedPanID, this.networkOptions.channelList[0], (0, crypto_1.randomBytes)(consts_1.EMBER_ENCRYPTION_KEY_SIZE));
|
|
812
829
|
result = 'reset';
|
|
813
830
|
break;
|
|
814
831
|
}
|
|
815
832
|
case NetworkInitAction.DONE: {
|
|
816
|
-
|
|
833
|
+
logger_1.logger.info(`[INIT TC] NCP network matches config.`, NS);
|
|
817
834
|
break;
|
|
818
835
|
}
|
|
819
836
|
default: {
|
|
@@ -825,17 +842,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
825
842
|
// XXX: while this remains a pretty low occurrence in most (small) networks,
|
|
826
843
|
// currently Z2M won't support the key update because of one-way config...
|
|
827
844
|
// need to investigate handling this properly
|
|
828
|
-
//
|
|
829
|
-
// + `This may result in some devices (especially battery-powered) temporarily losing connection
|
|
845
|
+
// logger.warning(`[INIT TC] Network key frame counter is reaching its limit. Scheduling broadcast to update network key. `
|
|
846
|
+
// + `This may result in some devices (especially battery-powered) temporarily losing connection.`, NS);
|
|
830
847
|
// // XXX: no idea here on the proper timer value, but this will block the network for several seconds on exec
|
|
831
848
|
// // (probably have to take the behavior of sleepy-end devices into account to improve chances of reaching everyone right away?)
|
|
832
849
|
// setTimeout(async () => {
|
|
833
850
|
// this.requestQueue.enqueue(async (): Promise<EmberStatus> => {
|
|
834
851
|
// await this.broadcastNetworkKeyUpdate();
|
|
835
852
|
// return EmberStatus.SUCCESS;
|
|
836
|
-
// },
|
|
853
|
+
// }, logger.error, true);// no reject just log error if any, will retry next start, & prioritize so we know it'll run when expected
|
|
837
854
|
// }, 300000);
|
|
838
|
-
|
|
855
|
+
logger_1.logger.warning(`[INIT TC] Network key frame counter is reaching its limit. A new network key will have to be instaured soon.`, NS);
|
|
839
856
|
}
|
|
840
857
|
return result;
|
|
841
858
|
}
|
|
@@ -880,15 +897,15 @@ class EmberAdapter extends __1.Adapter {
|
|
|
880
897
|
nwkUpdateId: 0,
|
|
881
898
|
channels: consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK,
|
|
882
899
|
};
|
|
883
|
-
|
|
900
|
+
logger_1.logger.info(`[INIT FORM] Forming new network with: ${JSON.stringify(netParams)}`, NS);
|
|
884
901
|
emberStatus = (await this.ezsp.ezspFormNetwork(netParams));
|
|
885
902
|
if (emberStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
886
903
|
throw new Error(`[INIT FORM] Failed form network request with status=${enums_2.EmberStatus[emberStatus]}.`);
|
|
887
904
|
}
|
|
888
|
-
await this.oneWaitress.startWaitingForEvent({ eventName: OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT FORM] Form network');
|
|
905
|
+
await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_NETWORK_UP }, DEFAULT_NETWORK_REQUEST_TIMEOUT, '[INIT FORM] Form network');
|
|
889
906
|
const stStatus = await this.ezsp.ezspStartWritingStackTokens();
|
|
890
|
-
debug(`[INIT FORM] Start writing stack tokens status=${enums_2.EzspStatus[stStatus]}
|
|
891
|
-
|
|
907
|
+
logger_1.logger.debug(`[INIT FORM] Start writing stack tokens status=${enums_2.EzspStatus[stStatus]}.`, NS);
|
|
908
|
+
logger_1.logger.info(`[INIT FORM] New network formed!`, NS);
|
|
892
909
|
}
|
|
893
910
|
/**
|
|
894
911
|
* Loads currently stored backup and returns it in internal backup model.
|
|
@@ -912,10 +929,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
912
929
|
throw new Error(`[BACKUP] Unsupported open coordinator backup version (version=${data.metadata?.version}).`);
|
|
913
930
|
}
|
|
914
931
|
if (!data.stack_specific?.ezsp || !data.metadata.internal.ezspVersion) {
|
|
915
|
-
throw new Error(`[BACKUP]
|
|
932
|
+
throw new Error(`[BACKUP] Current backup file is not for EmberZNet stack.`);
|
|
916
933
|
}
|
|
917
934
|
if (data.metadata.internal.ezspVersion < BACKUP_OLDEST_SUPPORTED_EZSP_VERSION) {
|
|
918
|
-
throw new Error(`[BACKUP]
|
|
935
|
+
throw new Error(`[BACKUP] Current backup file is from an unsupported EZSP version (min: ${BACKUP_OLDEST_SUPPORTED_EZSP_VERSION}).`);
|
|
919
936
|
}
|
|
920
937
|
return utils_1.BackupUtils.fromUnifiedBackup(data);
|
|
921
938
|
}
|
|
@@ -940,7 +957,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
940
957
|
const keyList = [];
|
|
941
958
|
for (let i = 0; i < keyTableSize; i++) {
|
|
942
959
|
[deviceEui64, plaintextKey, apsKeyMeta, status] = (await this.ezsp.ezspExportLinkKeyByIndex(i));
|
|
943
|
-
debug(`[BACKUP] Export link key at index ${i}, status=${enums_2.SLStatus[status]}
|
|
960
|
+
logger_1.logger.debug(`[BACKUP] Export link key at index ${i}, status=${enums_2.SLStatus[status]}.`, NS);
|
|
944
961
|
// only include key if we could retrieve one at index and hash it properly
|
|
945
962
|
if (status === enums_2.SLStatus.OK) {
|
|
946
963
|
// Rather than give the real link key, the backup contains a hashed version of the key.
|
|
@@ -957,11 +974,11 @@ class EmberAdapter extends __1.Adapter {
|
|
|
957
974
|
}
|
|
958
975
|
else {
|
|
959
976
|
// this should never happen?
|
|
960
|
-
|
|
977
|
+
logger_1.logger.error(`[BACKUP] Failed to hash link key at index ${i} with status=${enums_2.EmberStatus[hashStatus]}. Omitting from backup.`, NS);
|
|
961
978
|
}
|
|
962
979
|
}
|
|
963
980
|
}
|
|
964
|
-
|
|
981
|
+
logger_1.logger.info(`[BACKUP] Retrieved ${keyList.length} link keys.`, NS);
|
|
965
982
|
return keyList;
|
|
966
983
|
}
|
|
967
984
|
/**
|
|
@@ -999,7 +1016,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
999
1016
|
+ `with status=${enums_2.EmberStatus[status]}`);
|
|
1000
1017
|
}
|
|
1001
1018
|
}
|
|
1002
|
-
|
|
1019
|
+
logger_1.logger.info(`[BACKUP] Imported ${backupData.length} keys.`, NS);
|
|
1003
1020
|
}
|
|
1004
1021
|
/**
|
|
1005
1022
|
* Routine to update the network key and broadcast the update to the network after a set time.
|
|
@@ -1010,11 +1027,11 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1010
1027
|
async broadcastNetworkKeyUpdate() {
|
|
1011
1028
|
return new Promise((resolve, reject) => {
|
|
1012
1029
|
this.requestQueue.enqueue(async () => {
|
|
1013
|
-
|
|
1030
|
+
logger_1.logger.warning(`[TRUST CENTER] Performing a network key update. This might take a while and disrupt normal operation.`, NS);
|
|
1014
1031
|
// zero-filled = let stack generate new random network key
|
|
1015
1032
|
let status = await this.ezsp.ezspBroadcastNextNetworkKey({ contents: Buffer.alloc(consts_1.EMBER_ENCRYPTION_KEY_SIZE) });
|
|
1016
1033
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
1017
|
-
|
|
1034
|
+
logger_1.logger.error(`[TRUST CENTER] Failed to broadcast next network key with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
1018
1035
|
return status;
|
|
1019
1036
|
}
|
|
1020
1037
|
// XXX: this will block other requests for a while, but should ensure the key propagates without interference?
|
|
@@ -1023,7 +1040,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1023
1040
|
status = (await this.ezsp.ezspBroadcastNetworkKeySwitch());
|
|
1024
1041
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
1025
1042
|
// XXX: Not sure how likely this is, but this is bad, probably should hard fail?
|
|
1026
|
-
|
|
1043
|
+
logger_1.logger.error(`[TRUST CENTER] Failed to broadcast network key switch with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
1027
1044
|
return status;
|
|
1028
1045
|
}
|
|
1029
1046
|
resolve();
|
|
@@ -1036,117 +1053,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1036
1053
|
* @param status
|
|
1037
1054
|
*/
|
|
1038
1055
|
async onNcpNeedsResetAndInit(status) {
|
|
1039
|
-
|
|
1056
|
+
logger_1.logger.error(`!!! NCP FATAL ERROR reason=${enums_2.EzspStatus[status]}. ATTEMPTING RESET... !!!`, NS);
|
|
1040
1057
|
try {
|
|
1041
1058
|
await this.stop();
|
|
1042
1059
|
await (0, utils_1.Wait)(500); // just because
|
|
1043
1060
|
await this.start();
|
|
1044
1061
|
}
|
|
1045
1062
|
catch (err) {
|
|
1046
|
-
|
|
1063
|
+
logger_1.logger.error(`Failed to reset and init NCP. ${err}`, NS);
|
|
1047
1064
|
this.emit(events_1.Events.disconnected);
|
|
1048
1065
|
}
|
|
1049
1066
|
}
|
|
1050
|
-
/**
|
|
1051
|
-
* Called right before a NCP reset.
|
|
1052
|
-
*/
|
|
1053
|
-
async onNCPPreReset() {
|
|
1054
|
-
this.requestQueue.stopDispatching();
|
|
1055
|
-
}
|
|
1056
|
-
/**
|
|
1057
|
-
* Called right after a NCP reset, right before the creation of endpoints.
|
|
1058
|
-
*/
|
|
1059
|
-
async onNCPPostReset() {
|
|
1060
|
-
this.requestQueue.startDispatching();
|
|
1061
|
-
this.watchdogCountersHandle = setInterval(this.watchdogCounters.bind(this), WATCHDOG_COUNTERS_FEED_INTERVAL);
|
|
1062
|
-
}
|
|
1063
|
-
/**
|
|
1064
|
-
* Handle changes in groups that needs to be propagated to the NCP multicast table.
|
|
1065
|
-
*
|
|
1066
|
-
* XXX: Since Z2M doesn't explicitly check-in downstream when groups are created/removed, we look at outgoing genGroups commands.
|
|
1067
|
-
* If the NCP doesn't know about groups, it can miss messages from some devices (remotes for example), so we add it...
|
|
1068
|
-
*
|
|
1069
|
-
* @param commandId
|
|
1070
|
-
* @param groupId
|
|
1071
|
-
*/
|
|
1072
|
-
async onGroupChange(commandId, groupId) {
|
|
1073
|
-
switch (commandId) {
|
|
1074
|
-
case cluster_1.default.genGroups.commands.add.ID: {
|
|
1075
|
-
// check if group already in multicast table, should not happen...
|
|
1076
|
-
const existingIndex = this.multicastTable.findIndex((e) => ((e != null) && (e.multicastId === groupId)));
|
|
1077
|
-
if (existingIndex == -1) {
|
|
1078
|
-
// find first unused index
|
|
1079
|
-
const newEntryIndex = this.multicastTable.findIndex((e) => (!e));
|
|
1080
|
-
if (newEntryIndex != -1) {
|
|
1081
|
-
const newEntry = {
|
|
1082
|
-
multicastId: groupId,
|
|
1083
|
-
endpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
|
|
1084
|
-
networkIndex: endpoints_1.FIXED_ENDPOINTS[0].networkIndex,
|
|
1085
|
-
};
|
|
1086
|
-
const status = (await this.ezsp.ezspSetMulticastTableEntry(newEntryIndex, newEntry));
|
|
1087
|
-
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
1088
|
-
console.error(`Failed to register group "${groupId}" in multicast table at index "${newEntryIndex}" with status=${enums_2.EmberStatus[status]}.`);
|
|
1089
|
-
}
|
|
1090
|
-
else {
|
|
1091
|
-
debug(`Registered multicast table entry: ${JSON.stringify(newEntry)}.`);
|
|
1092
|
-
}
|
|
1093
|
-
// always assume "it worked" to keep sync with Z2M first, NCP second, otherwise trouble might arise... should always work anyway
|
|
1094
|
-
this.multicastTable[newEntryIndex] = newEntry;
|
|
1095
|
-
}
|
|
1096
|
-
else {
|
|
1097
|
-
console.warn(`Coordinator multicast table is full (max: ${STACK_CONFIGS[this.stackConfig].MULTICAST_TABLE_SIZE}). `
|
|
1098
|
-
+ `Some devices in new groups may not work properly, including in group "${groupId}". `
|
|
1099
|
-
+ `If that happens, please remove groups to be below the limit. `
|
|
1100
|
-
+ `Removed groups are only removed from coordinator after a Zigbee2MQTT restart.`);
|
|
1101
|
-
}
|
|
1102
|
-
}
|
|
1103
|
-
else {
|
|
1104
|
-
debug(`Added group "${groupId}", but local table says it is already registered at index "${existingIndex}". Skipping.`);
|
|
1105
|
-
}
|
|
1106
|
-
break;
|
|
1107
|
-
}
|
|
1108
|
-
// NOTE: Can't remove groups, since we watch from command exec to group members, that would trigger from any removed member,
|
|
1109
|
-
// even though the group might still exist...
|
|
1110
|
-
// Leaving this here (since it's done...), just in case we get better notifications for groups from upstream.
|
|
1111
|
-
// case Cluster.genGroups.commands.remove.ID: {
|
|
1112
|
-
// const entryIndex = this.multicastTable.findIndex((e) => ((e != null) && (e.multicastId === groupId)));
|
|
1113
|
-
// // just in case, never remove GP at i zero, should never be the case...
|
|
1114
|
-
// if (entryIndex > 0) {
|
|
1115
|
-
// const entry = this.multicastTable[entryIndex];
|
|
1116
|
-
// entry.endpoint = 0;// signals "not in use" in the stack
|
|
1117
|
-
// const status = (await this.ezsp.ezspSetMulticastTableEntry(entryIndex, entry));
|
|
1118
|
-
// if (status !== EmberStatus.SUCCESS) {
|
|
1119
|
-
// console.error(`Failed to remove multicast table entry at index "${entryIndex}" for group "${groupId}".`);
|
|
1120
|
-
// } else {
|
|
1121
|
-
// debug(`Removed multicast table entry at index "${entryIndex}".`);
|
|
1122
|
-
// }
|
|
1123
|
-
// // always assume "it worked" to keep sync with Z2M first, NCP second, otherwise trouble might arise... should always work anyway
|
|
1124
|
-
// this.multicastTable[entryIndex] = null;
|
|
1125
|
-
// } else {
|
|
1126
|
-
// debug(`Removed group "${groupId}", but local table did not have a reference to it.`);
|
|
1127
|
-
// }
|
|
1128
|
-
// break;
|
|
1129
|
-
// }
|
|
1130
|
-
// case Cluster.genGroups.commands.removeAll.ID: {
|
|
1131
|
-
// // this can create quite a few NCP calls, but hopefully shouldn't happen often
|
|
1132
|
-
// // always skip green power at i==0
|
|
1133
|
-
// for (let i = 1; i < this.multicastTable.length; i++) {
|
|
1134
|
-
// const entry = this.multicastTable[i];
|
|
1135
|
-
// if (entry != null) {
|
|
1136
|
-
// entry.endpoint = 0;// signals "not in use" in the stack
|
|
1137
|
-
// const status = (await this.ezsp.ezspSetMulticastTableEntry(i, entry));
|
|
1138
|
-
// if (status !== EmberStatus.SUCCESS) {
|
|
1139
|
-
// console.error(`Failed to remove multicast entry at index "${i}" with status=${EmberStatus[status]}.`);
|
|
1140
|
-
// } else {
|
|
1141
|
-
// debug(`Removed multicast table entry at index "${i}".`);
|
|
1142
|
-
// }
|
|
1143
|
-
// }
|
|
1144
|
-
// this.multicastTable[i] = null;
|
|
1145
|
-
// }
|
|
1146
|
-
// break;
|
|
1147
|
-
// }
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
1067
|
//---- START Events
|
|
1151
1068
|
//---- END Events
|
|
1152
1069
|
//---- START Cache-enabled EZSP wrappers
|
|
@@ -1191,7 +1108,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1191
1108
|
this.networkCache.parameters = parameters;
|
|
1192
1109
|
}
|
|
1193
1110
|
else {
|
|
1194
|
-
|
|
1111
|
+
logger_1.logger.error(`Failed to get PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
1195
1112
|
}
|
|
1196
1113
|
}
|
|
1197
1114
|
return this.networkCache.parameters.panId;
|
|
@@ -1208,7 +1125,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1208
1125
|
this.networkCache.parameters = parameters;
|
|
1209
1126
|
}
|
|
1210
1127
|
else {
|
|
1211
|
-
|
|
1128
|
+
logger_1.logger.error(`Failed to get Extended PAN ID (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
1212
1129
|
}
|
|
1213
1130
|
}
|
|
1214
1131
|
return this.networkCache.parameters.extendedPanId;
|
|
@@ -1225,7 +1142,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1225
1142
|
this.networkCache.parameters = parameters;
|
|
1226
1143
|
}
|
|
1227
1144
|
else {
|
|
1228
|
-
|
|
1145
|
+
logger_1.logger.error(`Failed to get radio channel (via network parameters) with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
1229
1146
|
}
|
|
1230
1147
|
}
|
|
1231
1148
|
return this.networkCache.parameters.radioChannel;
|
|
@@ -1236,7 +1153,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1236
1153
|
this.requestQueue.enqueue(async () => {
|
|
1237
1154
|
const status = (await this.ezsp.ezspStartScan(enums_2.EzspNetworkScanType.ENERGY_SCAN, consts_2.EMBER_ALL_802_15_4_CHANNELS_MASK, ENERGY_SCAN_DURATION));
|
|
1238
1155
|
if (status !== enums_2.SLStatus.OK) {
|
|
1239
|
-
|
|
1156
|
+
logger_1.logger.error(`Failed energy scan request with status=${enums_2.SLStatus[status]}.`, NS);
|
|
1240
1157
|
return enums_2.EmberStatus.ERR_FATAL;
|
|
1241
1158
|
}
|
|
1242
1159
|
// TODO: result in logs only atm, since UI doesn't support it
|
|
@@ -1270,34 +1187,21 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1270
1187
|
if (ncpEzspProtocolVer !== consts_1.EZSP_PROTOCOL_VERSION) {
|
|
1271
1188
|
throw new Error(`NCP EZSP protocol version of ${ncpEzspProtocolVer} does not match Host version ${hostEzspProtocolVer}`);
|
|
1272
1189
|
}
|
|
1273
|
-
debug(`NCP info: EZSPVersion=${ncpEzspProtocolVer} StackType=${ncpStackType} StackVersion=${ncpStackVer}
|
|
1190
|
+
logger_1.logger.debug(`NCP info: EZSPVersion=${ncpEzspProtocolVer} StackType=${ncpStackType} StackVersion=${ncpStackVer}`, NS);
|
|
1274
1191
|
const [status, versionStruct] = (await this.ezsp.ezspGetVersionStruct());
|
|
1275
1192
|
if (status !== enums_2.EzspStatus.SUCCESS) {
|
|
1276
|
-
//
|
|
1277
|
-
|
|
1278
|
-
this.version = {
|
|
1279
|
-
ezsp: ncpEzspProtocolVer,
|
|
1280
|
-
revision: `${ncpStackVer}`,
|
|
1281
|
-
major: ncpStackVer,
|
|
1282
|
-
minor: 0,
|
|
1283
|
-
patch: 0,
|
|
1284
|
-
special: 0,
|
|
1285
|
-
build: 0,
|
|
1286
|
-
type: enums_2.EmberVersionType.GA, // default...
|
|
1287
|
-
};
|
|
1193
|
+
// Should never happen with support of only EZSP v13+
|
|
1194
|
+
throw new Error(`NCP has old-style version number. Not supported.`);
|
|
1288
1195
|
}
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
};
|
|
1296
|
-
if (versionStruct.type !== enums_2.EmberVersionType.GA) {
|
|
1297
|
-
console.warn(`NCP is running a non-GA version (${enums_2.EmberVersionType[versionStruct.type]}).`);
|
|
1298
|
-
}
|
|
1196
|
+
this.version = {
|
|
1197
|
+
ezsp: ncpEzspProtocolVer,
|
|
1198
|
+
revision: `${versionStruct.major}.${versionStruct.minor}.${versionStruct.patch} [${enums_2.EmberVersionType[versionStruct.type]}]`,
|
|
1199
|
+
...versionStruct,
|
|
1200
|
+
};
|
|
1201
|
+
if (versionStruct.type !== enums_2.EmberVersionType.GA) {
|
|
1202
|
+
logger_1.logger.warning(`NCP is running a non-GA version (${enums_2.EmberVersionType[versionStruct.type]}).`, NS);
|
|
1299
1203
|
}
|
|
1300
|
-
debug(`NCP version info: ${JSON.stringify(this.version)}
|
|
1204
|
+
logger_1.logger.debug(`NCP version info: ${JSON.stringify(this.version)}`, NS);
|
|
1301
1205
|
}
|
|
1302
1206
|
/**
|
|
1303
1207
|
* This function sets an EZSP config value.
|
|
@@ -1309,14 +1213,14 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1309
1213
|
*/
|
|
1310
1214
|
async emberSetEzspConfigValue(configId, value) {
|
|
1311
1215
|
const status = (await this.ezsp.ezspSetConfigurationValue(configId, value));
|
|
1312
|
-
debug(`[EzspConfigId] SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}
|
|
1216
|
+
logger_1.logger.debug(`[EzspConfigId] SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
|
|
1313
1217
|
if (status === enums_2.EzspStatus.ERROR_INVALID_ID) {
|
|
1314
1218
|
// can be ZLL where not all NCPs need or support it.
|
|
1315
|
-
|
|
1219
|
+
logger_1.logger.warning(`[EzspConfigId] Unsupported configuration ID ${enums_1.EzspConfigId[configId]} by NCP.`, NS);
|
|
1316
1220
|
}
|
|
1317
1221
|
else if (status !== enums_2.EzspStatus.SUCCESS) {
|
|
1318
|
-
|
|
1319
|
-
|
|
1222
|
+
logger_1.logger.warning(`[EzspConfigId] Failed to SET "${enums_1.EzspConfigId[configId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}. `
|
|
1223
|
+
+ `Firmware value will be used instead.`, NS);
|
|
1320
1224
|
}
|
|
1321
1225
|
return status;
|
|
1322
1226
|
}
|
|
@@ -1329,7 +1233,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1329
1233
|
*/
|
|
1330
1234
|
async emberSetEzspValue(valueId, valueLength, value) {
|
|
1331
1235
|
const status = (await this.ezsp.ezspSetValue(valueId, valueLength, value));
|
|
1332
|
-
debug(`[EzspValueId] SET "${enums_1.EzspValueId[valueId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}
|
|
1236
|
+
logger_1.logger.debug(`[EzspValueId] SET "${enums_1.EzspValueId[valueId]}" TO "${value}" with status=${enums_2.EzspStatus[status]}.`, NS);
|
|
1333
1237
|
return status;
|
|
1334
1238
|
}
|
|
1335
1239
|
/**
|
|
@@ -1340,7 +1244,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1340
1244
|
*/
|
|
1341
1245
|
async emberSetEzspPolicy(policyId, decisionId) {
|
|
1342
1246
|
const status = (await this.ezsp.ezspSetPolicy(policyId, decisionId));
|
|
1343
|
-
debug(`[EzspPolicyId] SET "${enums_1.EzspPolicyId[policyId]}" TO "${decisionId}" with status=${enums_2.EzspStatus[status]}
|
|
1247
|
+
logger_1.logger.debug(`[EzspPolicyId] SET "${enums_1.EzspPolicyId[policyId]}" TO "${decisionId}" with status=${enums_2.EzspStatus[status]}.`, NS);
|
|
1344
1248
|
return status;
|
|
1345
1249
|
}
|
|
1346
1250
|
/**
|
|
@@ -1432,10 +1336,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1432
1336
|
let status = (await this.ezsp.ezspPermitJoining(duration));
|
|
1433
1337
|
let apsFrame = null;
|
|
1434
1338
|
let messageTag = null;
|
|
1435
|
-
debug(`Permit joining for ${duration} sec. status=${[status]}
|
|
1339
|
+
logger_1.logger.debug(`Permit joining for ${duration} sec. status=${[status]}`, NS);
|
|
1436
1340
|
if (broadcastMgmtPermitJoin) {
|
|
1437
1341
|
// `authentication`: TC significance always 1 (zb specs)
|
|
1438
|
-
[status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(consts_2.EMBER_BROADCAST_ADDRESS, duration, 1,
|
|
1342
|
+
[status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(consts_2.EMBER_BROADCAST_ADDRESS, duration, 1, DEFAULT_APS_OPTIONS));
|
|
1439
1343
|
}
|
|
1440
1344
|
return [status, apsFrame, messageTag];
|
|
1441
1345
|
}
|
|
@@ -1476,7 +1380,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1476
1380
|
return value;
|
|
1477
1381
|
}
|
|
1478
1382
|
else {
|
|
1479
|
-
debug(`Failed to get source route overhead (via extended value), status=${enums_2.EzspStatus[status]}
|
|
1383
|
+
logger_1.logger.debug(`Failed to get source route overhead (via extended value), status=${enums_2.EzspStatus[status]}.`, NS);
|
|
1480
1384
|
}
|
|
1481
1385
|
return 0;
|
|
1482
1386
|
}
|
|
@@ -1594,17 +1498,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1594
1498
|
const messageContents = this.zdoRequestBuffalo.getWritten();
|
|
1595
1499
|
if (destination === consts_2.EMBER_BROADCAST_ADDRESS || destination === consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS
|
|
1596
1500
|
|| destination === consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS) {
|
|
1597
|
-
debug(`~~~> [ZDO BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]
|
|
1501
|
+
logger_1.logger.debug(`~~~> [ZDO BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
|
|
1598
1502
|
const [status, apsSequence] = (await this.ezsp.ezspSendBroadcast(destination, apsFrame, this.getZDORequestRadius(), messageTag, messageContents));
|
|
1599
1503
|
apsFrame.sequence = apsSequence;
|
|
1600
|
-
debug(`~~~> [SENT ZDO type=BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]
|
|
1504
|
+
logger_1.logger.debug(`~~~> [SENT ZDO type=BROADCAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
|
|
1601
1505
|
return [status, apsFrame, messageTag];
|
|
1602
1506
|
}
|
|
1603
1507
|
else {
|
|
1604
|
-
debug(`~~~> [ZDO UNICAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]
|
|
1508
|
+
logger_1.logger.debug(`~~~> [ZDO UNICAST apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag}]`, NS);
|
|
1605
1509
|
const [status, apsSequence] = (await this.ezsp.ezspSendUnicast(enums_2.EmberOutgoingMessageType.DIRECT, destination, apsFrame, messageTag, messageContents));
|
|
1606
1510
|
apsFrame.sequence = apsSequence;
|
|
1607
|
-
debug(`~~~> [SENT ZDO type=DIRECT apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]
|
|
1511
|
+
logger_1.logger.debug(`~~~> [SENT ZDO type=DIRECT apsFrame=${JSON.stringify(apsFrame)} messageTag=${messageTag} status=${enums_2.EmberStatus[status]}]`, NS);
|
|
1608
1512
|
return [status, apsFrame, messageTag];
|
|
1609
1513
|
}
|
|
1610
1514
|
}
|
|
@@ -1646,7 +1550,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1646
1550
|
this.zdoRequestBuffalo.writeListUInt16(inClusters);
|
|
1647
1551
|
this.zdoRequestBuffalo.writeUInt8(outClusters.length);
|
|
1648
1552
|
this.zdoRequestBuffalo.writeListUInt16(outClusters);
|
|
1649
|
-
debug(`~~~> [ZDO
|
|
1553
|
+
logger_1.logger.debug(`~~~> [ZDO MATCH_DESCRIPTORS_REQUEST target=${target} profile=${profile} inClusters=${inClusters} outClusters=${outClusters}]`, NS);
|
|
1650
1554
|
return this.sendZDORequestBuffer(target, zdo_1.MATCH_DESCRIPTORS_REQUEST, options);
|
|
1651
1555
|
}
|
|
1652
1556
|
/**
|
|
@@ -1671,7 +1575,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1671
1575
|
this.zdoRequestBuffalo.writeIeeeAddr(target);
|
|
1672
1576
|
this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
|
|
1673
1577
|
this.zdoRequestBuffalo.writeUInt8(childStartIndex);
|
|
1674
|
-
debug(`~~~> [ZDO
|
|
1578
|
+
logger_1.logger.debug(`~~~> [ZDO NETWORK_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
|
|
1675
1579
|
return this.sendZDORequestBuffer(consts_2.EMBER_RX_ON_WHEN_IDLE_BROADCAST_ADDRESS, zdo_1.NETWORK_ADDRESS_REQUEST, enums_2.EmberApsOption.SOURCE_EUI64);
|
|
1676
1580
|
}
|
|
1677
1581
|
/**
|
|
@@ -1697,7 +1601,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1697
1601
|
this.zdoRequestBuffalo.writeUInt16(target);
|
|
1698
1602
|
this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
|
|
1699
1603
|
this.zdoRequestBuffalo.writeUInt8(childStartIndex);
|
|
1700
|
-
debug(`~~~> [ZDO
|
|
1604
|
+
logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST target=${target} reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
|
|
1701
1605
|
return this.sendZDORequestBuffer(target, zdo_1.IEEE_ADDRESS_REQUEST, options);
|
|
1702
1606
|
}
|
|
1703
1607
|
/**
|
|
@@ -1713,8 +1617,8 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1713
1617
|
this.zdoRequestBuffalo.writeUInt16(discoveryNodeId);
|
|
1714
1618
|
this.zdoRequestBuffalo.writeUInt8(reportKids ? 1 : 0);
|
|
1715
1619
|
this.zdoRequestBuffalo.writeUInt8(childStartIndex);
|
|
1716
|
-
debug(`~~~> [ZDO
|
|
1717
|
-
+ `reportKids=${reportKids} childStartIndex=${childStartIndex}]
|
|
1620
|
+
logger_1.logger.debug(`~~~> [ZDO IEEE_ADDRESS_REQUEST targetNodeIdOfRequest=${targetNodeIdOfRequest} discoveryNodeId=${discoveryNodeId} `
|
|
1621
|
+
+ `reportKids=${reportKids} childStartIndex=${childStartIndex}]`, NS);
|
|
1718
1622
|
return this.sendZDORequestBuffer(targetNodeIdOfRequest, zdo_1.IEEE_ADDRESS_REQUEST, options);
|
|
1719
1623
|
}
|
|
1720
1624
|
/**
|
|
@@ -1753,7 +1657,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1753
1657
|
this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
|
|
1754
1658
|
this.zdoRequestBuffalo.writeUInt16(target);
|
|
1755
1659
|
this.zdoRequestBuffalo.writeUInt8(targetEndpoint);
|
|
1756
|
-
debug(`~~~> [ZDO
|
|
1660
|
+
logger_1.logger.debug(`~~~> [ZDO SIMPLE_DESCRIPTOR_REQUEST target=${target} targetEndpoint=${targetEndpoint}]`, NS);
|
|
1757
1661
|
return this.sendZDORequestBuffer(target, zdo_1.SIMPLE_DESCRIPTOR_REQUEST, options);
|
|
1758
1662
|
}
|
|
1759
1663
|
/**
|
|
@@ -1828,8 +1732,8 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1828
1732
|
* @returns The tag used on the message.
|
|
1829
1733
|
*/
|
|
1830
1734
|
async emberBindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
|
|
1831
|
-
debug(`~~~> [ZDO
|
|
1832
|
-
+ `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]
|
|
1735
|
+
logger_1.logger.debug(`~~~> [ZDO BIND_REQUEST target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
|
|
1736
|
+
+ `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`, NS);
|
|
1833
1737
|
return this.emberSendZigDevBindRequest(target, zdo_1.BIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
|
|
1834
1738
|
}
|
|
1835
1739
|
/**
|
|
@@ -1862,8 +1766,8 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1862
1766
|
* @returns The tag used on the message.
|
|
1863
1767
|
*/
|
|
1864
1768
|
async emberUnbindRequest(target, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options) {
|
|
1865
|
-
debug(`~~~> [ZDO
|
|
1866
|
-
+ `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]
|
|
1769
|
+
logger_1.logger.debug(`~~~> [ZDO UNBIND_REQUEST target=${target} source=${source} sourceEndpoint=${sourceEndpoint} clusterId=${clusterId} type=${type} `
|
|
1770
|
+
+ `destination=${destination} groupAddress=${groupAddress} destinationEndpoint=${destinationEndpoint}]`, NS);
|
|
1867
1771
|
return this.emberSendZigDevBindRequest(target, zdo_1.UNBIND_REQUEST, source, sourceEndpoint, clusterId, type, destination, groupAddress, destinationEndpoint, options);
|
|
1868
1772
|
}
|
|
1869
1773
|
/**
|
|
@@ -1880,7 +1784,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1880
1784
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1881
1785
|
*/
|
|
1882
1786
|
async emberActiveEndpointsRequest(target, options) {
|
|
1883
|
-
debug(`~~~> [ZDO
|
|
1787
|
+
logger_1.logger.debug(`~~~> [ZDO ACTIVE_ENDPOINTS_REQUEST target=${target}]`, NS);
|
|
1884
1788
|
return this.emberSendZigDevRequestTarget(target, zdo_1.ACTIVE_ENDPOINTS_REQUEST, options);
|
|
1885
1789
|
}
|
|
1886
1790
|
/**
|
|
@@ -1900,7 +1804,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1900
1804
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1901
1805
|
*/
|
|
1902
1806
|
async emberPowerDescriptorRequest(target, options) {
|
|
1903
|
-
debug(`~~~> [ZDO
|
|
1807
|
+
logger_1.logger.debug(`~~~> [ZDO POWER_DESCRIPTOR_REQUEST target=${target}]`, NS);
|
|
1904
1808
|
return this.emberSendZigDevRequestTarget(target, zdo_1.POWER_DESCRIPTOR_REQUEST, options);
|
|
1905
1809
|
}
|
|
1906
1810
|
/**
|
|
@@ -1919,7 +1823,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1919
1823
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1920
1824
|
*/
|
|
1921
1825
|
async emberNodeDescriptorRequest(target, options) {
|
|
1922
|
-
debug(`~~~> [ZDO
|
|
1826
|
+
logger_1.logger.debug(`~~~> [ZDO NODE_DESCRIPTOR_REQUEST target=${target}]`, NS);
|
|
1923
1827
|
return this.emberSendZigDevRequestTarget(target, zdo_1.NODE_DESCRIPTOR_REQUEST, options);
|
|
1924
1828
|
}
|
|
1925
1829
|
/**
|
|
@@ -1940,7 +1844,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1940
1844
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1941
1845
|
*/
|
|
1942
1846
|
async emberLqiTableRequest(target, startIndex, options) {
|
|
1943
|
-
debug(`~~~> [ZDO
|
|
1847
|
+
logger_1.logger.debug(`~~~> [ZDO LQI_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
|
|
1944
1848
|
return this.emberTableRequest(zdo_1.LQI_TABLE_REQUEST, target, startIndex, options);
|
|
1945
1849
|
}
|
|
1946
1850
|
/**
|
|
@@ -1961,7 +1865,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1961
1865
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1962
1866
|
*/
|
|
1963
1867
|
async emberRoutingTableRequest(target, startIndex, options) {
|
|
1964
|
-
debug(`~~~> [ZDO
|
|
1868
|
+
logger_1.logger.debug(`~~~> [ZDO ROUTING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
|
|
1965
1869
|
return this.emberTableRequest(zdo_1.ROUTING_TABLE_REQUEST, target, startIndex, options);
|
|
1966
1870
|
}
|
|
1967
1871
|
/**
|
|
@@ -1983,7 +1887,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
1983
1887
|
* ::EMBER_NETWORK_DOWN or ::EMBER_NETWORK_BUSY.
|
|
1984
1888
|
*/
|
|
1985
1889
|
async emberBindingTableRequest(target, startIndex, options) {
|
|
1986
|
-
debug(`~~~> [ZDO
|
|
1890
|
+
logger_1.logger.debug(`~~~> [ZDO BINDING_TABLE_REQUEST target=${target} startIndex=${startIndex}]`, NS);
|
|
1987
1891
|
return this.emberTableRequest(zdo_1.BINDING_TABLE_REQUEST, target, startIndex, options);
|
|
1988
1892
|
}
|
|
1989
1893
|
/**
|
|
@@ -2022,7 +1926,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2022
1926
|
this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
|
|
2023
1927
|
this.zdoRequestBuffalo.writeIeeeAddr(deviceAddress);
|
|
2024
1928
|
this.zdoRequestBuffalo.writeUInt8(leaveRequestFlags);
|
|
2025
|
-
debug(`~~~> [ZDO
|
|
1929
|
+
logger_1.logger.debug(`~~~> [ZDO LEAVE_REQUEST target=${target} deviceAddress=${deviceAddress} leaveRequestFlags=${leaveRequestFlags}]`, NS);
|
|
2026
1930
|
return this.sendZDORequestBuffer(target, zdo_1.LEAVE_REQUEST, options);
|
|
2027
1931
|
}
|
|
2028
1932
|
/**
|
|
@@ -2046,9 +1950,42 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2046
1950
|
this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
|
|
2047
1951
|
this.zdoRequestBuffalo.writeUInt8(duration);
|
|
2048
1952
|
this.zdoRequestBuffalo.writeUInt8(authentication);
|
|
2049
|
-
debug(`~~~> [ZDO
|
|
1953
|
+
logger_1.logger.debug(`~~~> [ZDO PERMIT_JOINING_REQUEST target=${target} duration=${duration} authentication=${authentication}]`, NS);
|
|
2050
1954
|
return this.sendZDORequestBuffer(target, zdo_1.PERMIT_JOINING_REQUEST, options);
|
|
2051
1955
|
}
|
|
1956
|
+
/**
|
|
1957
|
+
* ZDO
|
|
1958
|
+
*
|
|
1959
|
+
* @see NWK_UPDATE_REQUEST
|
|
1960
|
+
*
|
|
1961
|
+
* @param target
|
|
1962
|
+
* @param scanChannels uint8_t[]
|
|
1963
|
+
* @param duration uint8_t
|
|
1964
|
+
* @param count uint8_t
|
|
1965
|
+
* @param manager
|
|
1966
|
+
*/
|
|
1967
|
+
async emberNetworkUpdateRequest(target, scanChannels, duration, count, manager, options) {
|
|
1968
|
+
this.zdoRequestBuffalo.setPosition(zdo_1.ZDO_MESSAGE_OVERHEAD);
|
|
1969
|
+
this.zdoRequestBuffalo.writeUInt32(scanChannels.reduce((a, c) => a + (1 << c), 0)); // to uint32_t
|
|
1970
|
+
this.zdoRequestBuffalo.writeUInt8(duration);
|
|
1971
|
+
if (count != null) {
|
|
1972
|
+
this.zdoRequestBuffalo.writeUInt8(count);
|
|
1973
|
+
}
|
|
1974
|
+
if (manager != null) {
|
|
1975
|
+
this.zdoRequestBuffalo.writeUInt16(manager);
|
|
1976
|
+
}
|
|
1977
|
+
logger_1.logger.debug(`~~~> [ZDO NWK_UPDATE_REQUEST target=${target} scanChannels=${scanChannels} duration=${duration} count=${count} manager=${manager}]`, NS);
|
|
1978
|
+
return this.sendZDORequestBuffer(target, zdo_1.NWK_UPDATE_REQUEST, options);
|
|
1979
|
+
}
|
|
1980
|
+
async emberScanChannelsRequest(target, scanChannels, duration, count, options) {
|
|
1981
|
+
return this.emberNetworkUpdateRequest(target, scanChannels, duration, count, null, options);
|
|
1982
|
+
}
|
|
1983
|
+
async emberChannelChangeRequest(target, channel, options) {
|
|
1984
|
+
return this.emberNetworkUpdateRequest(target, [channel], 0xFE, null, null, options);
|
|
1985
|
+
}
|
|
1986
|
+
async emberSetActiveChannelsAndNwkManagerIdRequest(target, scanChannels, manager, options) {
|
|
1987
|
+
return this.emberNetworkUpdateRequest(target, scanChannels, 0xFF, null, manager, options);
|
|
1988
|
+
}
|
|
2052
1989
|
//---- END Ember ZDO
|
|
2053
1990
|
//-- START Adapter implementation
|
|
2054
1991
|
static async isValidPath(path) {
|
|
@@ -2060,7 +1997,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2060
1997
|
return serialPortUtils_1.default.is((0, utils_1.RealpathSync)(path), autoDetectDefinitions);
|
|
2061
1998
|
}
|
|
2062
1999
|
catch (error) {
|
|
2063
|
-
debug(`Failed to determine if path is valid: '${error}'
|
|
2000
|
+
logger_1.logger.debug(`Failed to determine if path is valid: '${error}'`, NS);
|
|
2064
2001
|
return false;
|
|
2065
2002
|
}
|
|
2066
2003
|
}
|
|
@@ -2070,16 +2007,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2070
2007
|
return paths.length > 0 ? paths[0] : null;
|
|
2071
2008
|
}
|
|
2072
2009
|
async start() {
|
|
2073
|
-
|
|
2010
|
+
logger_1.logger.info(`======== Ember Adapter Starting ========`, NS);
|
|
2074
2011
|
this.initVariables();
|
|
2075
|
-
debug(`Starting EZSP with stack configuration: "${this.stackConfig}"
|
|
2012
|
+
logger_1.logger.debug(`Starting EZSP with stack configuration: "${this.stackConfig}".`, NS);
|
|
2076
2013
|
const result = await this.initEzsp();
|
|
2077
2014
|
return result;
|
|
2078
2015
|
}
|
|
2079
2016
|
async stop() {
|
|
2017
|
+
this.requestQueue.stopDispatching();
|
|
2080
2018
|
await this.ezsp.stop();
|
|
2081
2019
|
this.initVariables();
|
|
2082
|
-
|
|
2020
|
+
logger_1.logger.info(`======== Ember Adapter Stopped ========`, NS);
|
|
2083
2021
|
}
|
|
2084
2022
|
// queued, non-InterPAN
|
|
2085
2023
|
async getCoordinator() {
|
|
@@ -2091,14 +2029,14 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2091
2029
|
resolve({
|
|
2092
2030
|
ieeeAddr,
|
|
2093
2031
|
networkAddress: consts_2.ZIGBEE_COORDINATOR_ADDRESS,
|
|
2094
|
-
manufacturerID:
|
|
2032
|
+
manufacturerID: DEFAULT_MANUFACTURER_CODE,
|
|
2095
2033
|
endpoints: endpoints_1.FIXED_ENDPOINTS.map((ep) => {
|
|
2096
2034
|
return {
|
|
2097
2035
|
profileID: ep.profileId,
|
|
2098
2036
|
ID: ep.endpoint,
|
|
2099
2037
|
deviceID: ep.deviceId,
|
|
2100
|
-
inputClusters: ep.inClusterList,
|
|
2101
|
-
outputClusters: ep.outClusterList,
|
|
2038
|
+
inputClusters: ep.inClusterList.slice(), // copy
|
|
2039
|
+
outputClusters: ep.outClusterList.slice(), // copy
|
|
2102
2040
|
};
|
|
2103
2041
|
}),
|
|
2104
2042
|
});
|
|
@@ -2107,7 +2045,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2107
2045
|
});
|
|
2108
2046
|
}
|
|
2109
2047
|
async getCoordinatorVersion() {
|
|
2110
|
-
return { type: `
|
|
2048
|
+
return { type: `EmberZNet`, meta: this.version };
|
|
2111
2049
|
}
|
|
2112
2050
|
// queued
|
|
2113
2051
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -2128,7 +2066,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2128
2066
|
// grab fresh version here, bypass cache
|
|
2129
2067
|
const [netStatus, , netParams] = (await this.ezsp.ezspGetNetworkParameters());
|
|
2130
2068
|
if (netStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2131
|
-
|
|
2069
|
+
logger_1.logger.error(`[BACKUP] Failed to get network parameters.`, NS);
|
|
2132
2070
|
return netStatus;
|
|
2133
2071
|
}
|
|
2134
2072
|
// update cache
|
|
@@ -2136,7 +2074,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2136
2074
|
this.networkCache.eui64 = (await this.ezsp.ezspGetEui64());
|
|
2137
2075
|
const [netKeyStatus, netKeyInfo] = (await this.ezsp.ezspGetNetworkKeyInfo());
|
|
2138
2076
|
if (netKeyStatus !== enums_2.SLStatus.OK) {
|
|
2139
|
-
|
|
2077
|
+
logger_1.logger.error(`[BACKUP] Failed to get network keys info.`, NS);
|
|
2140
2078
|
return ((netKeyStatus === enums_2.SLStatus.BUSY) || (netKeyStatus === enums_2.SLStatus.NOT_READY))
|
|
2141
2079
|
? enums_2.EmberStatus.NETWORK_BUSY : enums_2.EmberStatus.ERR_FATAL; // allow retry on statuses that should be temporary
|
|
2142
2080
|
}
|
|
@@ -2152,7 +2090,6 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2152
2090
|
// this.ezsp,
|
|
2153
2091
|
// Buffer.from(this.networkCache.eui64.substring(2/*0x*/), 'hex').reverse()
|
|
2154
2092
|
// ));
|
|
2155
|
-
// console.log(tokensBuf.toString('hex'));
|
|
2156
2093
|
let context = (0, initters_1.initSecurityManagerContext)();
|
|
2157
2094
|
context.coreKeyType = enums_2.SecManKeyType.TC_LINK;
|
|
2158
2095
|
const [tcLinkKey, tclkStatus] = (await this.ezsp.ezspExportKey(context));
|
|
@@ -2211,29 +2148,50 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2211
2148
|
this.checkInterpanLock();
|
|
2212
2149
|
// first call will cache for the others, but in all likelihood, it will all be from freshly cached after init
|
|
2213
2150
|
// since Controller caches this also.
|
|
2151
|
+
const channel = (await this.emberGetRadioChannel());
|
|
2214
2152
|
const panID = (await this.emberGetPanId());
|
|
2215
2153
|
const extendedPanID = (await this.emberGetExtendedPanId());
|
|
2216
|
-
const channel = (await this.emberGetRadioChannel());
|
|
2217
2154
|
resolve({
|
|
2218
|
-
panID
|
|
2155
|
+
panID,
|
|
2219
2156
|
extendedPanID: parseInt(Buffer.from(extendedPanID).toString('hex'), 16),
|
|
2220
|
-
channel
|
|
2157
|
+
channel,
|
|
2221
2158
|
});
|
|
2222
2159
|
return enums_2.EmberStatus.SUCCESS;
|
|
2223
2160
|
}, reject);
|
|
2224
2161
|
});
|
|
2225
2162
|
}
|
|
2163
|
+
async supportsChangeChannel() {
|
|
2164
|
+
return true;
|
|
2165
|
+
}
|
|
2166
|
+
// queued
|
|
2167
|
+
async changeChannel(newChannel) {
|
|
2168
|
+
return new Promise((resolve, reject) => {
|
|
2169
|
+
this.requestQueue.enqueue(async () => {
|
|
2170
|
+
this.checkInterpanLock();
|
|
2171
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2172
|
+
const [status, apsFrame, messageTag] = (await this.emberChannelChangeRequest(consts_2.EMBER_SLEEPY_BROADCAST_ADDRESS, newChannel, DEFAULT_APS_OPTIONS));
|
|
2173
|
+
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2174
|
+
logger_1.logger.error(`[ZDO] Failed broadcast channel change to "${newChannel}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2175
|
+
return status;
|
|
2176
|
+
}
|
|
2177
|
+
await this.oneWaitress.startWaitingForEvent({ eventName: oneWaitress_1.OneWaitressEvents.STACK_STATUS_CHANNEL_CHANGED }, DEFAULT_NETWORK_REQUEST_TIMEOUT * 2, // observed to ~9sec
|
|
2178
|
+
'[ZDO] Change Channel');
|
|
2179
|
+
resolve();
|
|
2180
|
+
return enums_2.EmberStatus.SUCCESS;
|
|
2181
|
+
}, reject);
|
|
2182
|
+
});
|
|
2183
|
+
}
|
|
2226
2184
|
// queued
|
|
2227
2185
|
async setTransmitPower(value) {
|
|
2228
2186
|
if (typeof value !== 'number') {
|
|
2229
|
-
|
|
2187
|
+
logger_1.logger.error(`Tried to set transmit power to non-number. Value ${value} of type ${typeof value}.`, NS);
|
|
2230
2188
|
return;
|
|
2231
2189
|
}
|
|
2232
2190
|
return new Promise((resolve, reject) => {
|
|
2233
2191
|
this.requestQueue.enqueue(async () => {
|
|
2234
2192
|
const status = await this.ezsp.ezspSetRadioPower(value);
|
|
2235
2193
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2236
|
-
|
|
2194
|
+
logger_1.logger.error(`Failed to set transmit power to ${value} status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2237
2195
|
return status;
|
|
2238
2196
|
}
|
|
2239
2197
|
resolve();
|
|
@@ -2244,41 +2202,45 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2244
2202
|
// queued
|
|
2245
2203
|
async addInstallCode(ieeeAddress, key) {
|
|
2246
2204
|
if (!key) {
|
|
2247
|
-
throw new Error(`[ADD INSTALL CODE] Failed for
|
|
2248
|
-
}
|
|
2249
|
-
if (consts_2.EMBER_INSTALL_CODE_SIZES.indexOf(key.length) === -1) {
|
|
2250
|
-
throw new Error(`[ADD INSTALL CODE] Failed for "${ieeeAddress}"; invalid code size.`);
|
|
2205
|
+
throw new Error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}'; no code given.`);
|
|
2251
2206
|
}
|
|
2252
|
-
//
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2207
|
+
// codes with CRC, check CRC before sending to NCP, otherwise let NCP handle
|
|
2208
|
+
if (consts_2.EMBER_INSTALL_CODE_SIZES.indexOf(key.length) !== -1) {
|
|
2209
|
+
// Reverse the bits in a byte (uint8_t)
|
|
2210
|
+
const reverse = (b) => {
|
|
2211
|
+
return (((b * 0x0802 & 0x22110) | (b * 0x8020 & 0x88440)) * 0x10101 >> 16) & 0xFF;
|
|
2212
|
+
};
|
|
2213
|
+
let crc = 0xFFFF; // uint16_t
|
|
2214
|
+
// Compute the CRC and verify that it matches.
|
|
2215
|
+
// The bit reversals, byte swap, and ones' complement are due to differences between halCommonCrc16 and the Smart Energy version.
|
|
2216
|
+
for (let index = 0; index < (key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE); index++) {
|
|
2217
|
+
crc = (0, math_1.halCommonCrc16)(reverse(key[index]), crc);
|
|
2218
|
+
}
|
|
2219
|
+
crc = (~(0, math_1.highLowToInt)(reverse((0, math_1.lowByte)(crc)), reverse((0, math_1.highByte)(crc)))) & 0xFFFF;
|
|
2220
|
+
if (key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE] !== (0, math_1.lowByte)(crc)
|
|
2221
|
+
|| key[key.length - consts_2.EMBER_INSTALL_CODE_CRC_SIZE + 1] !== (0, math_1.highByte)(crc)) {
|
|
2222
|
+
throw new Error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}'; invalid code CRC.`);
|
|
2223
|
+
}
|
|
2224
|
+
else {
|
|
2225
|
+
logger_1.logger.debug(`[ADD INSTALL CODE] CRC validated for '${ieeeAddress}'.`, NS);
|
|
2226
|
+
}
|
|
2265
2227
|
}
|
|
2266
2228
|
return new Promise((resolve, reject) => {
|
|
2267
2229
|
this.requestQueue.enqueue(async () => {
|
|
2268
2230
|
// Compute the key from the install code and CRC.
|
|
2269
2231
|
const [aesStatus, keyContents] = (await this.emberAesHashSimple(key));
|
|
2270
2232
|
if (aesStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2271
|
-
|
|
2233
|
+
logger_1.logger.error(`[ADD INSTALL CODE] Failed AES hash for '${ieeeAddress}' with status=${enums_2.EmberStatus[aesStatus]}.`, NS);
|
|
2272
2234
|
return aesStatus;
|
|
2273
2235
|
}
|
|
2274
2236
|
// Add the key to the transient key table.
|
|
2275
2237
|
// This will be used while the DUT joins.
|
|
2276
2238
|
const impStatus = (await this.ezsp.ezspImportTransientKey(ieeeAddress, { contents: keyContents }, enums_2.SecManFlag.NONE));
|
|
2277
2239
|
if (impStatus == enums_2.SLStatus.OK) {
|
|
2278
|
-
debug(`[ADD INSTALL CODE] Success for
|
|
2240
|
+
logger_1.logger.debug(`[ADD INSTALL CODE] Success for '${ieeeAddress}'.`, NS);
|
|
2279
2241
|
}
|
|
2280
2242
|
else {
|
|
2281
|
-
|
|
2243
|
+
logger_1.logger.error(`[ADD INSTALL CODE] Failed for '${ieeeAddress}' with status=${enums_2.SLStatus[impStatus]}.`, NS);
|
|
2282
2244
|
return enums_2.EmberStatus.ERR_FATAL;
|
|
2283
2245
|
}
|
|
2284
2246
|
resolve();
|
|
@@ -2315,34 +2277,47 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2315
2277
|
if (seconds) {
|
|
2316
2278
|
const plaintextKey = { contents: Buffer.from(consts_2.ZIGBEE_PROFILE_INTEROPERABILITY_LINK_KEY) };
|
|
2317
2279
|
const impKeyStatus = (await this.ezsp.ezspImportTransientKey(consts_2.BLANK_EUI64, plaintextKey, enums_2.SecManFlag.NONE));
|
|
2318
|
-
|
|
2319
|
-
|
|
2280
|
+
if (impKeyStatus !== enums_2.SLStatus.OK) {
|
|
2281
|
+
logger_1.logger.error(`[ZDO] Failed import transient key with status=${enums_2.SLStatus[impKeyStatus]}.`, NS);
|
|
2282
|
+
return enums_2.EmberStatus.ERR_FATAL;
|
|
2283
|
+
}
|
|
2284
|
+
const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.USE_PRECONFIGURED_KEY));
|
|
2285
|
+
if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
|
|
2286
|
+
logger_1.logger.error(`[ZDO] Failed set join policy with status=${enums_2.EzspStatus[setJPstatus]}.`, NS);
|
|
2287
|
+
return enums_2.EmberStatus.ERR_FATAL;
|
|
2288
|
+
}
|
|
2289
|
+
return enums_2.EmberStatus.SUCCESS;
|
|
2320
2290
|
}
|
|
2321
2291
|
else {
|
|
2292
|
+
if (this.manufacturerCode !== DEFAULT_MANUFACTURER_CODE) {
|
|
2293
|
+
logger_1.logger.debug(`[WORKAROUND] Reverting coordinator manufacturer code to default.`, NS);
|
|
2294
|
+
await this.ezsp.ezspSetManufacturerCode(DEFAULT_MANUFACTURER_CODE);
|
|
2295
|
+
this.manufacturerCode = DEFAULT_MANUFACTURER_CODE;
|
|
2296
|
+
}
|
|
2322
2297
|
await this.ezsp.ezspClearTransientLinkKeys();
|
|
2323
2298
|
const setJPstatus = (await this.emberSetJoinPolicy(enums_2.EmberJoinDecision.ALLOW_REJOINS_ONLY));
|
|
2324
2299
|
if (setJPstatus !== enums_2.EzspStatus.SUCCESS) {
|
|
2325
|
-
|
|
2300
|
+
logger_1.logger.error(`[ZDO] Failed set join policy for with status=${enums_2.EzspStatus[setJPstatus]}.`, NS);
|
|
2326
2301
|
return enums_2.EmberStatus.ERR_FATAL;
|
|
2327
2302
|
}
|
|
2328
2303
|
return enums_2.EmberStatus.SUCCESS;
|
|
2329
2304
|
}
|
|
2330
2305
|
};
|
|
2331
|
-
// NOTE: can't ZDO PJ on coordinator, so if network address is null or zero (coordinator), using local permit join
|
|
2332
2306
|
if (networkAddress) {
|
|
2307
|
+
// specific device that is not `Coordinator`
|
|
2333
2308
|
return new Promise((resolve, reject) => {
|
|
2334
2309
|
this.requestQueue.enqueue(async () => {
|
|
2335
2310
|
this.checkInterpanLock();
|
|
2336
2311
|
const pjStatus = (await preJoining());
|
|
2337
2312
|
if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2338
|
-
|
|
2313
|
+
logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
|
|
2339
2314
|
return pjStatus;
|
|
2340
2315
|
}
|
|
2341
2316
|
// `authentication`: TC significance always 1 (zb specs)
|
|
2342
2317
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2343
2318
|
const [status, apsFrame, messageTag] = (await this.emberPermitJoiningRequest(networkAddress, seconds, 1, 0));
|
|
2344
2319
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2345
|
-
|
|
2320
|
+
logger_1.logger.error(`[ZDO] Failed permit joining request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2346
2321
|
return status;
|
|
2347
2322
|
}
|
|
2348
2323
|
(await this.oneWaitress.startWaitingFor({
|
|
@@ -2356,19 +2331,20 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2356
2331
|
});
|
|
2357
2332
|
}
|
|
2358
2333
|
else {
|
|
2359
|
-
//
|
|
2334
|
+
// coordinator-only, or all
|
|
2360
2335
|
return new Promise((resolve, reject) => {
|
|
2361
2336
|
this.requestQueue.enqueue(async () => {
|
|
2362
2337
|
this.checkInterpanLock();
|
|
2363
2338
|
const pjStatus = (await preJoining());
|
|
2364
2339
|
if (pjStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2365
|
-
|
|
2340
|
+
logger_1.logger.error(`[ZDO] Failed pre joining request for "${networkAddress}" with status=${enums_2.EmberStatus[pjStatus]}.`, NS);
|
|
2366
2341
|
return pjStatus;
|
|
2367
2342
|
}
|
|
2343
|
+
// local permit join if `Coordinator`-only requested, else local + broadcast
|
|
2368
2344
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2369
|
-
const [status, apsFrame, messageTag] = (await this.emberPermitJoining(seconds,
|
|
2345
|
+
const [status, apsFrame, messageTag] = (await this.emberPermitJoining(seconds, (networkAddress === consts_2.ZIGBEE_COORDINATOR_ADDRESS) ? false : true));
|
|
2370
2346
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2371
|
-
|
|
2347
|
+
logger_1.logger.error(`[ZDO] Failed permit joining request with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2372
2348
|
return status;
|
|
2373
2349
|
}
|
|
2374
2350
|
// NOTE: because Z2M is refreshing the permit join duration early to prevent it from closing
|
|
@@ -2399,9 +2375,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2399
2375
|
const neighbors = [];
|
|
2400
2376
|
const request = async (startIndex) => {
|
|
2401
2377
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2402
|
-
const [reqStatus, apsFrame, messageTag] = (await this.emberLqiTableRequest(networkAddress, startIndex,
|
|
2378
|
+
const [reqStatus, apsFrame, messageTag] = (await this.emberLqiTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
|
|
2403
2379
|
if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2404
|
-
|
|
2380
|
+
logger_1.logger.error(`[ZDO] Failed LQI request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
|
|
2405
2381
|
return [reqStatus, null, null];
|
|
2406
2382
|
}
|
|
2407
2383
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
@@ -2446,9 +2422,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2446
2422
|
const table = [];
|
|
2447
2423
|
const request = async (startIndex) => {
|
|
2448
2424
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2449
|
-
const [reqStatus, apsFrame, messageTag] = (await this.emberRoutingTableRequest(networkAddress, startIndex,
|
|
2425
|
+
const [reqStatus, apsFrame, messageTag] = (await this.emberRoutingTableRequest(networkAddress, startIndex, DEFAULT_APS_OPTIONS));
|
|
2450
2426
|
if (reqStatus !== enums_2.EmberStatus.SUCCESS) {
|
|
2451
|
-
|
|
2427
|
+
logger_1.logger.error(`[ZDO] Failed routing table request for "${networkAddress}" (index "${startIndex}") with status=${enums_2.EmberStatus[reqStatus]}.`, NS);
|
|
2452
2428
|
return [reqStatus, null, null];
|
|
2453
2429
|
}
|
|
2454
2430
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
@@ -2492,9 +2468,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2492
2468
|
this.requestQueue.enqueue(async () => {
|
|
2493
2469
|
this.checkInterpanLock();
|
|
2494
2470
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2495
|
-
const [status, apsFrame, messageTag] = (await this.emberNodeDescriptorRequest(networkAddress,
|
|
2471
|
+
const [status, apsFrame, messageTag] = (await this.emberNodeDescriptorRequest(networkAddress, DEFAULT_APS_OPTIONS));
|
|
2496
2472
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2497
|
-
|
|
2473
|
+
logger_1.logger.error(`[ZDO] Failed node descriptor for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2498
2474
|
return status;
|
|
2499
2475
|
}
|
|
2500
2476
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
@@ -2516,9 +2492,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2516
2492
|
}
|
|
2517
2493
|
// always 0 before rev. 21 where field was added
|
|
2518
2494
|
if (result.stackRevision < CURRENT_ZIGBEE_SPEC_REVISION) {
|
|
2519
|
-
|
|
2495
|
+
logger_1.logger.warning(`[ZDO] Node descriptor for "${networkAddress}" reports device is only compliant to revision `
|
|
2520
2496
|
+ `"${(result.stackRevision < 21) ? 'pre-21' : result.stackRevision}" of the ZigBee specification `
|
|
2521
|
-
+ `(current revision: ${CURRENT_ZIGBEE_SPEC_REVISION})
|
|
2497
|
+
+ `(current revision: ${CURRENT_ZIGBEE_SPEC_REVISION}).`, NS);
|
|
2522
2498
|
}
|
|
2523
2499
|
resolve({ type, manufacturerCode: result.manufacturerCode });
|
|
2524
2500
|
return enums_2.EmberStatus.SUCCESS;
|
|
@@ -2531,9 +2507,9 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2531
2507
|
this.requestQueue.enqueue(async () => {
|
|
2532
2508
|
this.checkInterpanLock();
|
|
2533
2509
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2534
|
-
const [status, apsFrame, messageTag] = (await this.emberActiveEndpointsRequest(networkAddress,
|
|
2510
|
+
const [status, apsFrame, messageTag] = (await this.emberActiveEndpointsRequest(networkAddress, DEFAULT_APS_OPTIONS));
|
|
2535
2511
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2536
|
-
|
|
2512
|
+
logger_1.logger.error(`[ZDO] Failed active endpoints request for "${networkAddress}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2537
2513
|
return status;
|
|
2538
2514
|
}
|
|
2539
2515
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
@@ -2552,10 +2528,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2552
2528
|
this.requestQueue.enqueue(async () => {
|
|
2553
2529
|
this.checkInterpanLock();
|
|
2554
2530
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2555
|
-
const [status, apsFrame, messageTag] = (await this.emberSimpleDescriptorRequest(networkAddress, endpointID,
|
|
2531
|
+
const [status, apsFrame, messageTag] = (await this.emberSimpleDescriptorRequest(networkAddress, endpointID, DEFAULT_APS_OPTIONS));
|
|
2556
2532
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2557
|
-
|
|
2558
|
-
+ `with status=${enums_2.EmberStatus[status]}
|
|
2533
|
+
logger_1.logger.error(`[ZDO] Failed simple descriptor request for "${networkAddress}" endpoint "${endpointID}" `
|
|
2534
|
+
+ `with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2559
2535
|
return status;
|
|
2560
2536
|
}
|
|
2561
2537
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
@@ -2583,10 +2559,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2583
2559
|
this.checkInterpanLock();
|
|
2584
2560
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2585
2561
|
const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
|
|
2586
|
-
destinationEndpoint,
|
|
2562
|
+
destinationEndpoint, DEFAULT_APS_OPTIONS));
|
|
2587
2563
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2588
|
-
|
|
2589
|
-
+ `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}
|
|
2564
|
+
logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
|
|
2565
|
+
+ `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2590
2566
|
return status;
|
|
2591
2567
|
}
|
|
2592
2568
|
await this.oneWaitress.startWaitingFor({
|
|
@@ -2607,10 +2583,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2607
2583
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2608
2584
|
const [status, apsFrame, messageTag] = (await this.emberBindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
|
|
2609
2585
|
destinationAddressOrGroup, destinationEndpoint, // doesn't matter
|
|
2610
|
-
|
|
2586
|
+
DEFAULT_APS_OPTIONS));
|
|
2611
2587
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2612
|
-
|
|
2613
|
-
+ `with status=${enums_2.EmberStatus[status]}
|
|
2588
|
+
logger_1.logger.error(`[ZDO] Failed bind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
|
|
2589
|
+
+ `with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2614
2590
|
return status;
|
|
2615
2591
|
}
|
|
2616
2592
|
await this.oneWaitress.startWaitingFor({
|
|
@@ -2633,10 +2609,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2633
2609
|
this.checkInterpanLock();
|
|
2634
2610
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2635
2611
|
const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.UNICAST_BINDING, destinationAddressOrGroup, null, // doesn't matter
|
|
2636
|
-
destinationEndpoint,
|
|
2612
|
+
destinationEndpoint, DEFAULT_APS_OPTIONS));
|
|
2637
2613
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2638
|
-
|
|
2639
|
-
+ `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}
|
|
2614
|
+
logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" destination "${destinationAddressOrGroup}" `
|
|
2615
|
+
+ `endpoint "${destinationEndpoint}" with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2640
2616
|
return status;
|
|
2641
2617
|
}
|
|
2642
2618
|
await this.oneWaitress.startWaitingFor({
|
|
@@ -2657,10 +2633,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2657
2633
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2658
2634
|
const [status, apsFrame, messageTag] = (await this.emberUnbindRequest(destinationNetworkAddress, sourceIeeeAddress, sourceEndpoint, clusterID, zdo_1.MULTICAST_BINDING, null, // doesn't matter
|
|
2659
2635
|
destinationAddressOrGroup, destinationEndpoint, // doesn't matter
|
|
2660
|
-
|
|
2636
|
+
DEFAULT_APS_OPTIONS));
|
|
2661
2637
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2662
|
-
|
|
2663
|
-
+ `with status=${enums_2.EmberStatus[status]}
|
|
2638
|
+
logger_1.logger.error(`[ZDO] Failed unbind request for "${destinationNetworkAddress}" group "${destinationAddressOrGroup}" `
|
|
2639
|
+
+ `with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2664
2640
|
return status;
|
|
2665
2641
|
}
|
|
2666
2642
|
await this.oneWaitress.startWaitingFor({
|
|
@@ -2680,10 +2656,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2680
2656
|
this.requestQueue.enqueue(async () => {
|
|
2681
2657
|
this.checkInterpanLock();
|
|
2682
2658
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2683
|
-
const [status, apsFrame, messageTag] = (await this.emberLeaveRequest(networkAddress, ieeeAddr, enums_2.EmberLeaveRequestFlags.WITHOUT_REJOIN,
|
|
2659
|
+
const [status, apsFrame, messageTag] = (await this.emberLeaveRequest(networkAddress, ieeeAddr, enums_2.EmberLeaveRequestFlags.WITHOUT_REJOIN, DEFAULT_APS_OPTIONS));
|
|
2684
2660
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2685
|
-
|
|
2686
|
-
+ `with status=${enums_2.EmberStatus[status]}
|
|
2661
|
+
logger_1.logger.error(`[ZDO] Failed remove device request for "${networkAddress}" target "${ieeeAddr}" `
|
|
2662
|
+
+ `with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2687
2663
|
return status;
|
|
2688
2664
|
}
|
|
2689
2665
|
await this.oneWaitress.startWaitingFor({
|
|
@@ -2701,20 +2677,20 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2701
2677
|
async sendZclFrameToEndpoint(ieeeAddr, networkAddress, endpoint, zclFrame, timeout, disableResponse, disableRecovery, sourceEndpoint) {
|
|
2702
2678
|
const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
|
|
2703
2679
|
endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
|
|
2704
|
-
const command = zclFrame.
|
|
2680
|
+
const command = zclFrame.command;
|
|
2705
2681
|
let commandResponseId = null;
|
|
2706
2682
|
if (command.hasOwnProperty('response') && disableResponse === false) {
|
|
2707
2683
|
commandResponseId = command.response;
|
|
2708
2684
|
}
|
|
2709
|
-
else if (!zclFrame.
|
|
2710
|
-
commandResponseId =
|
|
2685
|
+
else if (!zclFrame.header.frameControl.disableDefaultResponse) {
|
|
2686
|
+
commandResponseId = Zcl.Foundation.defaultRsp.ID;
|
|
2711
2687
|
}
|
|
2712
2688
|
const apsFrame = {
|
|
2713
2689
|
profileId: sourceEndpointInfo.profileId,
|
|
2714
|
-
clusterId: zclFrame.
|
|
2690
|
+
clusterId: zclFrame.cluster.ID,
|
|
2715
2691
|
sourceEndpoint: sourceEndpointInfo.endpoint,
|
|
2716
2692
|
destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
|
|
2717
|
-
options:
|
|
2693
|
+
options: DEFAULT_APS_OPTIONS,
|
|
2718
2694
|
groupId: 0,
|
|
2719
2695
|
sequence: 0, // set by stack
|
|
2720
2696
|
};
|
|
@@ -2732,16 +2708,12 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2732
2708
|
return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
|
|
2733
2709
|
}
|
|
2734
2710
|
}
|
|
2735
|
-
|
|
2736
|
-
if (apsFrame.clusterId === cluster_1.default.genGroups.ID) {
|
|
2737
|
-
await this.onGroupChange(command.ID, zclFrame.Payload.groupid);
|
|
2738
|
-
}
|
|
2739
|
-
debug(`~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.Header)}]`);
|
|
2711
|
+
logger_1.logger.debug(`~~~> [ZCL to=${networkAddress} apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
2740
2712
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2741
2713
|
const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.DIRECT, networkAddress, apsFrame, data, 0, // alias
|
|
2742
2714
|
0));
|
|
2743
2715
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2744
|
-
|
|
2716
|
+
logger_1.logger.error(`~x~> [ZCL to=${networkAddress}] Failed to send request with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2745
2717
|
return status; // let queue handle retry based on status
|
|
2746
2718
|
}
|
|
2747
2719
|
if (commandResponseId != null) {
|
|
@@ -2749,7 +2721,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2749
2721
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
2750
2722
|
target: networkAddress,
|
|
2751
2723
|
apsFrame,
|
|
2752
|
-
zclSequence: zclFrame.
|
|
2724
|
+
zclSequence: zclFrame.header.transactionSequenceNumber,
|
|
2753
2725
|
commandIdentifier: commandResponseId,
|
|
2754
2726
|
}, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT));
|
|
2755
2727
|
resolve(result);
|
|
@@ -2767,10 +2739,10 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2767
2739
|
endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
|
|
2768
2740
|
const apsFrame = {
|
|
2769
2741
|
profileId: sourceEndpointInfo.profileId,
|
|
2770
|
-
clusterId: zclFrame.
|
|
2742
|
+
clusterId: zclFrame.cluster.ID,
|
|
2771
2743
|
sourceEndpoint: sourceEndpointInfo.endpoint,
|
|
2772
2744
|
destinationEndpoint: endpoints_1.FIXED_ENDPOINTS[0].endpoint,
|
|
2773
|
-
options:
|
|
2745
|
+
options: DEFAULT_APS_OPTIONS,
|
|
2774
2746
|
groupId: groupID,
|
|
2775
2747
|
sequence: 0, // set by stack
|
|
2776
2748
|
};
|
|
@@ -2784,13 +2756,13 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2784
2756
|
return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
|
|
2785
2757
|
}
|
|
2786
2758
|
}
|
|
2787
|
-
debug(`~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.
|
|
2759
|
+
logger_1.logger.debug(`~~~> [ZCL GROUP apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
2788
2760
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2789
2761
|
const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.MULTICAST, apsFrame.groupId, // not used for MC
|
|
2790
2762
|
apsFrame, data, 0, // alias
|
|
2791
2763
|
0));
|
|
2792
2764
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2793
|
-
|
|
2765
|
+
logger_1.logger.error(`~x~> [ZCL GROUP] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2794
2766
|
return status; // let queue handle retry based on status
|
|
2795
2767
|
}
|
|
2796
2768
|
// NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
|
|
@@ -2800,16 +2772,16 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2800
2772
|
});
|
|
2801
2773
|
}
|
|
2802
2774
|
// queued, non-InterPAN
|
|
2803
|
-
async sendZclFrameToAll(endpoint, zclFrame, sourceEndpoint) {
|
|
2775
|
+
async sendZclFrameToAll(endpoint, zclFrame, sourceEndpoint, destination) {
|
|
2804
2776
|
const sourceEndpointInfo = typeof sourceEndpoint === 'number' ?
|
|
2805
2777
|
endpoints_1.FIXED_ENDPOINTS.find((epi) => (epi.endpoint === sourceEndpoint)) : endpoints_1.FIXED_ENDPOINTS[0];
|
|
2806
2778
|
const apsFrame = {
|
|
2807
2779
|
profileId: sourceEndpointInfo.profileId,
|
|
2808
|
-
clusterId: zclFrame.
|
|
2780
|
+
clusterId: zclFrame.cluster.ID,
|
|
2809
2781
|
sourceEndpoint: sourceEndpointInfo.endpoint,
|
|
2810
2782
|
destinationEndpoint: (typeof endpoint === 'number') ? endpoint : endpoints_1.FIXED_ENDPOINTS[0].endpoint,
|
|
2811
|
-
options:
|
|
2812
|
-
groupId:
|
|
2783
|
+
options: DEFAULT_APS_OPTIONS,
|
|
2784
|
+
groupId: destination,
|
|
2813
2785
|
sequence: 0, // set by stack
|
|
2814
2786
|
};
|
|
2815
2787
|
const data = zclFrame.toBuffer();
|
|
@@ -2817,17 +2789,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2817
2789
|
this.requestQueue.enqueue(async () => {
|
|
2818
2790
|
this.checkInterpanLock();
|
|
2819
2791
|
if (CHECK_APS_PAYLOAD_LENGTH) {
|
|
2820
|
-
const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.BROADCAST,
|
|
2792
|
+
const maxPayloadLength = (await this.maximumApsPayloadLength(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame));
|
|
2821
2793
|
if (data.length > maxPayloadLength) {
|
|
2822
2794
|
return enums_2.EmberStatus.MESSAGE_TOO_LONG; // queue will reject
|
|
2823
2795
|
}
|
|
2824
2796
|
}
|
|
2825
|
-
debug(`~~~> [ZCL BROADCAST apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.
|
|
2797
|
+
logger_1.logger.debug(`~~~> [ZCL BROADCAST apsFrame=${JSON.stringify(apsFrame)} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
2826
2798
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2827
|
-
const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.BROADCAST,
|
|
2799
|
+
const [status, messageTag] = (await this.ezsp.send(enums_2.EmberOutgoingMessageType.BROADCAST, destination, apsFrame, data, 0, // alias
|
|
2828
2800
|
0));
|
|
2829
2801
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2830
|
-
|
|
2802
|
+
logger_1.logger.error(`~x~> [ZCL BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2831
2803
|
return status; // let queue handle retry based on status
|
|
2832
2804
|
}
|
|
2833
2805
|
// NOTE: since ezspMessageSentHandler could take a while here, we don't block, it'll just be logged if the delivery failed
|
|
@@ -2842,7 +2814,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2842
2814
|
// queued
|
|
2843
2815
|
async setChannelInterPAN(channel) {
|
|
2844
2816
|
if (typeof channel !== 'number') {
|
|
2845
|
-
|
|
2817
|
+
logger_1.logger.error(`Tried to set channel InterPAN to non-number. Channel ${channel} of type ${typeof channel}.`, NS);
|
|
2846
2818
|
return;
|
|
2847
2819
|
}
|
|
2848
2820
|
return new Promise((resolve, reject) => {
|
|
@@ -2851,7 +2823,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2851
2823
|
const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(channel));
|
|
2852
2824
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2853
2825
|
this.interpanLock = false; // XXX: ok?
|
|
2854
|
-
|
|
2826
|
+
logger_1.logger.error(`Failed to set InterPAN channel to ${channel} with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2855
2827
|
return status;
|
|
2856
2828
|
}
|
|
2857
2829
|
resolve();
|
|
@@ -2875,12 +2847,12 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2875
2847
|
msgBuffalo.writeIeeeAddr(sourceEui64); // sourceAddress
|
|
2876
2848
|
msgBuffalo.writeUInt16(consts_2.STUB_NWK_FRAME_CONTROL); // nwkFrameControl
|
|
2877
2849
|
msgBuffalo.writeUInt8((enums_2.EmberInterpanMessageType.UNICAST | consts_2.INTERPAN_APS_FRAME_TYPE)); // apsFrameControl
|
|
2878
|
-
msgBuffalo.writeUInt16(zclFrame.
|
|
2850
|
+
msgBuffalo.writeUInt16(zclFrame.cluster.ID);
|
|
2879
2851
|
msgBuffalo.writeUInt16(consts_2.TOUCHLINK_PROFILE_ID);
|
|
2880
|
-
debug(`~~~> [ZCL TOUCHLINK to=${ieeeAddress} header=${JSON.stringify(zclFrame.
|
|
2852
|
+
logger_1.logger.debug(`~~~> [ZCL TOUCHLINK to=${ieeeAddress} header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
2881
2853
|
const status = (await this.ezsp.ezspSendRawMessage(Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()])));
|
|
2882
2854
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2883
|
-
|
|
2855
|
+
logger_1.logger.error(`~x~> [ZCL TOUCHLINK to=${ieeeAddress}] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2884
2856
|
return status;
|
|
2885
2857
|
}
|
|
2886
2858
|
// NOTE: can use ezspRawTransmitCompleteHandler if needed here
|
|
@@ -2891,14 +2863,14 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2891
2863
|
}
|
|
2892
2864
|
// queued
|
|
2893
2865
|
async sendZclFrameInterPANBroadcast(zclFrame, timeout) {
|
|
2894
|
-
const command = zclFrame.
|
|
2866
|
+
const command = zclFrame.command;
|
|
2895
2867
|
if (!command.hasOwnProperty('response')) {
|
|
2896
2868
|
throw new Error(`Command '${command.name}' has no response, cannot wait for response.`);
|
|
2897
2869
|
}
|
|
2898
2870
|
// just for waitress
|
|
2899
2871
|
const apsFrame = {
|
|
2900
2872
|
profileId: consts_2.TOUCHLINK_PROFILE_ID,
|
|
2901
|
-
clusterId: zclFrame.
|
|
2873
|
+
clusterId: zclFrame.cluster.ID,
|
|
2902
2874
|
sourceEndpoint: 0,
|
|
2903
2875
|
destinationEndpoint: 0,
|
|
2904
2876
|
options: enums_2.EmberApsOption.NONE,
|
|
@@ -2922,17 +2894,17 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2922
2894
|
msgBuffalo.writeUInt16(apsFrame.clusterId);
|
|
2923
2895
|
msgBuffalo.writeUInt16(apsFrame.profileId);
|
|
2924
2896
|
const data = Buffer.concat([msgBuffalo.getWritten(), zclFrame.toBuffer()]);
|
|
2925
|
-
debug(`~~~> [ZCL TOUCHLINK BROADCAST header=${JSON.stringify(zclFrame.
|
|
2897
|
+
logger_1.logger.debug(`~~~> [ZCL TOUCHLINK BROADCAST header=${JSON.stringify(zclFrame.header)}]`, NS);
|
|
2926
2898
|
const status = (await this.ezsp.ezspSendRawMessage(data));
|
|
2927
2899
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2928
|
-
|
|
2900
|
+
logger_1.logger.error(`~x~> [ZCL TOUCHLINK BROADCAST] Failed to send with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2929
2901
|
return status;
|
|
2930
2902
|
}
|
|
2931
2903
|
// NOTE: can use ezspRawTransmitCompleteHandler if needed here
|
|
2932
2904
|
const result = (await this.oneWaitress.startWaitingFor({
|
|
2933
2905
|
target: null,
|
|
2934
2906
|
apsFrame: apsFrame,
|
|
2935
|
-
zclSequence: zclFrame.
|
|
2907
|
+
zclSequence: zclFrame.header.transactionSequenceNumber,
|
|
2936
2908
|
commandIdentifier: command.response,
|
|
2937
2909
|
}, timeout || DEFAULT_ZCL_REQUEST_TIMEOUT * 2)); // XXX: touchlink timeout?
|
|
2938
2910
|
resolve(result);
|
|
@@ -2946,7 +2918,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2946
2918
|
this.requestQueue.enqueue(async () => {
|
|
2947
2919
|
const status = (await this.ezsp.ezspSetLogicalAndRadioChannel(this.networkOptions.channelList[0]));
|
|
2948
2920
|
if (status !== enums_2.EmberStatus.SUCCESS) {
|
|
2949
|
-
|
|
2921
|
+
logger_1.logger.error(`Failed to restore InterPAN channel to ${this.networkOptions.channelList[0]} with status=${enums_2.EmberStatus[status]}.`, NS);
|
|
2950
2922
|
return status;
|
|
2951
2923
|
}
|
|
2952
2924
|
// let adapter settle down
|
|
@@ -2960,7 +2932,7 @@ class EmberAdapter extends __1.Adapter {
|
|
|
2960
2932
|
//-- END Adapter implementation
|
|
2961
2933
|
checkInterpanLock() {
|
|
2962
2934
|
if (this.interpanLock) {
|
|
2963
|
-
|
|
2935
|
+
logger_1.logger.error(`[INTERPAN MODE] Cannot execute non-InterPAN commands.`, NS);
|
|
2964
2936
|
// will be caught by request queue and rejected internally.
|
|
2965
2937
|
throw new Error(enums_2.EzspStatus[enums_2.EzspStatus.ERROR_INVALID_CALL]);
|
|
2966
2938
|
}
|