@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
|
@@ -33,9 +33,8 @@ const model_1 = require("./model");
|
|
|
33
33
|
const helpers_1 = require("./helpers");
|
|
34
34
|
const Events = __importStar(require("./events"));
|
|
35
35
|
const tstype_1 = require("./tstype");
|
|
36
|
-
const debug_1 = __importDefault(require("debug"));
|
|
37
36
|
const fs_1 = __importDefault(require("fs"));
|
|
38
|
-
const
|
|
37
|
+
const Zcl = __importStar(require("../zspec/zcl"));
|
|
39
38
|
const touchlink_1 = __importDefault(require("./touchlink"));
|
|
40
39
|
const greenPower_1 = __importDefault(require("./greenPower"));
|
|
41
40
|
const utils_1 = require("../utils");
|
|
@@ -44,12 +43,14 @@ const assert_1 = __importDefault(require("assert"));
|
|
|
44
43
|
// @ts-ignore
|
|
45
44
|
const mixin_deep_1 = __importDefault(require("mixin-deep"));
|
|
46
45
|
const group_1 = __importDefault(require("./model/group"));
|
|
46
|
+
const logger_1 = require("../utils/logger");
|
|
47
|
+
const NS = 'zh:controller';
|
|
47
48
|
async function catcho(func, errorMessage) {
|
|
48
49
|
try {
|
|
49
50
|
await func();
|
|
50
51
|
}
|
|
51
52
|
catch (error) {
|
|
52
|
-
|
|
53
|
+
logger_1.logger.error(`${errorMessage}: ${error}`, NS);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
const DefaultOptions = {
|
|
@@ -66,10 +67,9 @@ const DefaultOptions = {
|
|
|
66
67
|
backupPath: null,
|
|
67
68
|
adapter: { disableLED: false },
|
|
68
69
|
acceptJoiningDeviceHandler: null,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
log: (0, debug_1.default)('zigbee-herdsman:controller:log'),
|
|
70
|
+
konnextConfig: {
|
|
71
|
+
isEncrypted: 0,
|
|
72
|
+
},
|
|
73
73
|
};
|
|
74
74
|
/**
|
|
75
75
|
* @noInheritDoc
|
|
@@ -90,18 +90,18 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
90
90
|
databaseSaveTimer;
|
|
91
91
|
touchlink;
|
|
92
92
|
stopping;
|
|
93
|
+
adapterDisconnected;
|
|
93
94
|
networkParametersCached;
|
|
94
|
-
logger;
|
|
95
95
|
/**
|
|
96
96
|
* Create a controller
|
|
97
97
|
*
|
|
98
98
|
* To auto detect the port provide `null` for `options.serialPort.path`
|
|
99
99
|
*/
|
|
100
|
-
constructor(options
|
|
100
|
+
constructor(options) {
|
|
101
101
|
super();
|
|
102
102
|
this.stopping = false;
|
|
103
|
+
this.adapterDisconnected = true; // set false after adapter.start() is successfully called
|
|
103
104
|
this.options = (0, mixin_deep_1.default)(JSON.parse(JSON.stringify(DefaultOptions)), options);
|
|
104
|
-
this.logger = logger;
|
|
105
105
|
// Validate options
|
|
106
106
|
for (const channel of this.options.network.channelList) {
|
|
107
107
|
if (channel < 11 || channel > 26) {
|
|
@@ -115,8 +115,7 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
115
115
|
throw new Error(`ExtendedPanID must be 8 digits long, got ${this.options.network.extendedPanID.length}.`);
|
|
116
116
|
}
|
|
117
117
|
if (this.options.network.panID >= 0xFFFF || this.options.network.panID <= 0) {
|
|
118
|
-
throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534),
|
|
119
|
-
`got ${this.options.network.panID}.`);
|
|
118
|
+
throw new Error(`PanID must have a value of 0x0001 (1) - 0xFFFE (65534), got ${this.options.network.panID}.`);
|
|
120
119
|
}
|
|
121
120
|
}
|
|
122
121
|
/**
|
|
@@ -127,19 +126,28 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
127
126
|
this.database = database_1.default.open(this.options.databasePath);
|
|
128
127
|
model_1.Entity.injectDatabase(this.database);
|
|
129
128
|
// Adapter (create and inject)
|
|
130
|
-
this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.
|
|
131
|
-
debug
|
|
129
|
+
this.adapter = await adapter_1.Adapter.create(this.options.network, this.options.serialPort, this.options.backupPath, this.options.adapter, this.options.konnextConfig);
|
|
130
|
+
logger_1.logger.debug(`Starting with options '${JSON.stringify(this.options)}'`, NS);
|
|
132
131
|
const startResult = await this.adapter.start();
|
|
133
|
-
debug
|
|
132
|
+
logger_1.logger.debug(`Started with result '${startResult}'`, NS);
|
|
133
|
+
this.adapterDisconnected = false;
|
|
134
|
+
// Check if we have to change the channel, only do this when adapter `resumed` because:
|
|
135
|
+
// - `getNetworkParameters` might be return wrong info because it needs to propogate after backup restore
|
|
136
|
+
// - If result is not `resumed` (`reset` or `restored`), the adapter should comission with the channel from `this.options.network`
|
|
137
|
+
if ((startResult === 'resumed') && (await this.adapter.supportsChangeChannel())) {
|
|
138
|
+
const netParams = (await this.getNetworkParameters());
|
|
139
|
+
if (this.options.network.channelList[0] !== netParams.channel) {
|
|
140
|
+
await this.changeChannel();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
134
143
|
model_1.Entity.injectAdapter(this.database.id, this.adapter);
|
|
135
144
|
// log injection
|
|
136
|
-
debug
|
|
145
|
+
logger_1.logger.debug(`Injected database: ${this.database != null}, adapter: ${this.adapter != null}`, NS);
|
|
137
146
|
this.greenPower = new greenPower_1.default(this.adapter);
|
|
138
147
|
this.greenPower.on(tstype_1.GreenPowerEvents.deviceJoined, this.onDeviceJoinedGreenPower.bind(this));
|
|
139
148
|
// Register adapter events
|
|
140
149
|
this.adapter.on(adapter_1.Events.Events.deviceJoined, this.onDeviceJoined.bind(this));
|
|
141
|
-
this.adapter.on(adapter_1.Events.Events.
|
|
142
|
-
this.adapter.on(adapter_1.Events.Events.rawData, (data) => this.onZclOrRawData('raw', data));
|
|
150
|
+
this.adapter.on(adapter_1.Events.Events.zclPayload, this.onZclPayload.bind(this));
|
|
143
151
|
this.adapter.on(adapter_1.Events.Events.disconnected, this.onAdapterDisconnected.bind(this));
|
|
144
152
|
this.adapter.on(adapter_1.Events.Events.deviceAnnounce, this.onDeviceAnnounce.bind(this));
|
|
145
153
|
this.adapter.on(adapter_1.Events.Events.deviceLeave, this.onDeviceLeave.bind(this));
|
|
@@ -148,7 +156,7 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
148
156
|
if (this.options.databaseBackupPath && fs_1.default.existsSync(this.options.databasePath)) {
|
|
149
157
|
fs_1.default.copyFileSync(this.options.databasePath, this.options.databaseBackupPath);
|
|
150
158
|
}
|
|
151
|
-
debug
|
|
159
|
+
logger_1.logger.debug('Clearing database...', NS);
|
|
152
160
|
for (const group of group_1.default.allByDatabaseID(this.database.id)) {
|
|
153
161
|
group.removeFromDatabase();
|
|
154
162
|
}
|
|
@@ -162,13 +170,13 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
162
170
|
// Add coordinator to the database if it is not there yet.
|
|
163
171
|
const coordinator = await this.adapter.getCoordinator();
|
|
164
172
|
if (model_1.Device.byType('Coordinator', this.database.id).length === 0) {
|
|
165
|
-
debug
|
|
173
|
+
logger_1.logger.debug('No coordinator in database, querying...', NS);
|
|
166
174
|
model_1.Device.create('Coordinator', coordinator.ieeeAddr, coordinator.networkAddress, coordinator.manufacturerID, undefined, undefined, undefined, true, coordinator.endpoints, this.database.id);
|
|
167
175
|
}
|
|
168
176
|
// Update coordinator ieeeAddr if changed, can happen due to e.g. reflashing
|
|
169
177
|
const databaseCoordinator = model_1.Device.byType('Coordinator', this.database.id)[0];
|
|
170
178
|
if (databaseCoordinator.ieeeAddr !== coordinator.ieeeAddr) {
|
|
171
|
-
|
|
179
|
+
logger_1.logger.info(`Coordinator address changed, updating to '${coordinator.ieeeAddr}'`, NS);
|
|
172
180
|
databaseCoordinator.changeIeeeAddress(coordinator.ieeeAddr);
|
|
173
181
|
}
|
|
174
182
|
// Set backup timer to 1 day.
|
|
@@ -243,7 +251,7 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
243
251
|
this.emit(Events.Events.permitJoinChanged, data);
|
|
244
252
|
}
|
|
245
253
|
else {
|
|
246
|
-
debug
|
|
254
|
+
logger_1.logger.debug('Disable joining', NS);
|
|
247
255
|
await this.greenPower.permitJoin(0, null);
|
|
248
256
|
await this.adapter.permitJoin(0, null);
|
|
249
257
|
const data = { permitted: false, reason, timeout: this.permitJoinTimeout };
|
|
@@ -259,21 +267,28 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
259
267
|
isStopping() {
|
|
260
268
|
return this.stopping;
|
|
261
269
|
}
|
|
270
|
+
isAdapterDisconnected() {
|
|
271
|
+
return this.adapterDisconnected;
|
|
272
|
+
}
|
|
262
273
|
async stop() {
|
|
263
274
|
this.stopping = true;
|
|
264
|
-
this.databaseSave();
|
|
265
275
|
// Unregister adapter events
|
|
266
276
|
this.adapter.removeAllListeners(adapter_1.Events.Events.deviceJoined);
|
|
267
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.
|
|
268
|
-
this.adapter.removeAllListeners(adapter_1.Events.Events.rawData);
|
|
277
|
+
this.adapter.removeAllListeners(adapter_1.Events.Events.zclPayload);
|
|
269
278
|
this.adapter.removeAllListeners(adapter_1.Events.Events.disconnected);
|
|
270
279
|
this.adapter.removeAllListeners(adapter_1.Events.Events.deviceAnnounce);
|
|
271
280
|
this.adapter.removeAllListeners(adapter_1.Events.Events.deviceLeave);
|
|
272
|
-
await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
|
|
273
281
|
clearInterval(this.backupTimer);
|
|
274
282
|
clearInterval(this.databaseSaveTimer);
|
|
275
|
-
|
|
276
|
-
|
|
283
|
+
if (this.adapterDisconnected) {
|
|
284
|
+
this.databaseSave();
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
await catcho(() => this.permitJoinInternal(false, 'manual'), "Failed to disable join on stop");
|
|
288
|
+
await this.backup(); // always calls databaseSave()
|
|
289
|
+
await this.adapter.stop();
|
|
290
|
+
this.adapterDisconnected = true;
|
|
291
|
+
}
|
|
277
292
|
}
|
|
278
293
|
databaseSave() {
|
|
279
294
|
for (const device of model_1.Device.allByDatabaseID(this.database.id)) {
|
|
@@ -287,13 +302,13 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
287
302
|
async backup() {
|
|
288
303
|
this.databaseSave();
|
|
289
304
|
if (this.options.backupPath && await this.adapter.supportsBackup()) {
|
|
290
|
-
debug
|
|
305
|
+
logger_1.logger.debug('Creating coordinator backup', NS);
|
|
291
306
|
const backup = await this.adapter.backup(model_1.Device.all().map((d) => d.ieeeAddr));
|
|
292
307
|
const unifiedBackup = await utils_1.BackupUtils.toUnifiedBackup(backup);
|
|
293
308
|
const tmpBackupPath = this.options.backupPath + '.tmp';
|
|
294
309
|
fs_1.default.writeFileSync(tmpBackupPath, JSON.stringify(unifiedBackup, null, 2));
|
|
295
310
|
fs_1.default.renameSync(tmpBackupPath, this.options.backupPath);
|
|
296
|
-
|
|
311
|
+
logger_1.logger.info(`Wrote coordinator backup to '${this.options.backupPath}'`, NS);
|
|
297
312
|
}
|
|
298
313
|
}
|
|
299
314
|
async coordinatorCheck() {
|
|
@@ -363,6 +378,14 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
363
378
|
createGroup(groupID) {
|
|
364
379
|
return group_1.default.create(groupID, this.database.id);
|
|
365
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Broadcast a network-wide channel change.
|
|
383
|
+
*/
|
|
384
|
+
async changeChannel() {
|
|
385
|
+
logger_1.logger.info(`Broadcasting change channel to '${this.options.network.channelList[0]}'.`, NS);
|
|
386
|
+
await this.adapter.changeChannel(this.options.network.channelList[0]);
|
|
387
|
+
this.networkParametersCached = null; // invalidate cache
|
|
388
|
+
}
|
|
366
389
|
/**
|
|
367
390
|
* Set transmit power of the adapter
|
|
368
391
|
*/
|
|
@@ -370,15 +393,16 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
370
393
|
return this.adapter.setTransmitPower(value);
|
|
371
394
|
}
|
|
372
395
|
onNetworkAddress(payload) {
|
|
373
|
-
debug
|
|
396
|
+
logger_1.logger.debug(`Network address '${payload.ieeeAddr}'`, NS);
|
|
374
397
|
const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
|
|
375
398
|
if (!device) {
|
|
376
|
-
debug
|
|
399
|
+
logger_1.logger.debug(`Network address is from unknown device '${payload.ieeeAddr}'`, NS);
|
|
377
400
|
return;
|
|
378
401
|
}
|
|
402
|
+
device.updateLastSeen();
|
|
379
403
|
this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'networkAddress' });
|
|
380
404
|
if (device.networkAddress !== payload.networkAddress) {
|
|
381
|
-
debug
|
|
405
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' got new networkAddress '${payload.networkAddress}'`, NS);
|
|
382
406
|
device.networkAddress = payload.networkAddress;
|
|
383
407
|
device.save();
|
|
384
408
|
const data = { device };
|
|
@@ -386,17 +410,17 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
386
410
|
}
|
|
387
411
|
}
|
|
388
412
|
onDeviceAnnounce(payload) {
|
|
389
|
-
debug
|
|
413
|
+
logger_1.logger.debug(`Device announce '${payload.ieeeAddr}'`, NS);
|
|
390
414
|
const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
|
|
391
415
|
if (!device) {
|
|
392
|
-
debug
|
|
416
|
+
logger_1.logger.debug(`Device announce is from unknown device '${payload.ieeeAddr}'`, NS);
|
|
393
417
|
return;
|
|
394
418
|
}
|
|
395
419
|
device.updateLastSeen();
|
|
396
420
|
this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'deviceAnnounce' });
|
|
397
421
|
device.implicitCheckin();
|
|
398
422
|
if (device.networkAddress !== payload.networkAddress) {
|
|
399
|
-
debug
|
|
423
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' announced with new networkAddress '${payload.networkAddress}'`, NS);
|
|
400
424
|
device.networkAddress = payload.networkAddress;
|
|
401
425
|
device.save();
|
|
402
426
|
}
|
|
@@ -404,22 +428,25 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
404
428
|
this.selfAndDeviceEmit(device, Events.Events.deviceAnnounce, data);
|
|
405
429
|
}
|
|
406
430
|
onDeviceLeave(payload) {
|
|
407
|
-
debug
|
|
408
|
-
const device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr);
|
|
409
|
-
if (device) {
|
|
410
|
-
debug
|
|
411
|
-
|
|
431
|
+
logger_1.logger.debug(`Device leave '${payload.ieeeAddr}'`, NS);
|
|
432
|
+
const device = payload.ieeeAddr ? model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr) : model_1.Device.byNetworkAddress(this.database.id, payload.networkAddress);
|
|
433
|
+
if (!device) {
|
|
434
|
+
logger_1.logger.debug(`Device leave is from unknown or already deleted device '${payload.ieeeAddr ?? payload.networkAddress}'`, NS);
|
|
435
|
+
return;
|
|
412
436
|
}
|
|
413
|
-
|
|
437
|
+
logger_1.logger.debug(`Removing device from database '${device.ieeeAddr}'`, NS);
|
|
438
|
+
device.removeFromDatabase();
|
|
439
|
+
const data = { ieeeAddr: device.ieeeAddr };
|
|
414
440
|
this.selfAndDeviceEmit(device, Events.Events.deviceLeave, data);
|
|
415
441
|
}
|
|
416
442
|
async onAdapterDisconnected() {
|
|
417
|
-
debug
|
|
443
|
+
logger_1.logger.debug(`Adapter disconnected`, NS);
|
|
444
|
+
this.adapterDisconnected = true;
|
|
418
445
|
await catcho(() => this.adapter.stop(), 'Failed to stop adapter on disconnect');
|
|
419
446
|
this.emit(Events.Events.adapterDisconnected);
|
|
420
447
|
}
|
|
421
448
|
async onDeviceJoinedGreenPower(payload) {
|
|
422
|
-
debug
|
|
449
|
+
logger_1.logger.debug(`Green power device '${JSON.stringify(payload)}' joined`, NS);
|
|
423
450
|
// Green power devices don't have an ieeeAddr, the sourceID is unique and static so use this.
|
|
424
451
|
let ieeeAddr = payload.sourceID.toString(16);
|
|
425
452
|
ieeeAddr = `0x${'0'.repeat(16 - ieeeAddr.length)}${ieeeAddr}`;
|
|
@@ -427,8 +454,8 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
427
454
|
const modelID = `GreenPower_${payload.deviceID}`;
|
|
428
455
|
let device = model_1.Device.byIeeeAddr(this.database.id, ieeeAddr, true);
|
|
429
456
|
if (!device) {
|
|
430
|
-
debug
|
|
431
|
-
debug
|
|
457
|
+
logger_1.logger.debug(`New green power device '${ieeeAddr}' joined`, NS);
|
|
458
|
+
logger_1.logger.debug(`Creating device '${ieeeAddr}'`, NS);
|
|
432
459
|
device = model_1.Device.create('GreenPower', ieeeAddr, payload.networkAddress, null, undefined, undefined, modelID, true, [], this.database.id);
|
|
433
460
|
device.save();
|
|
434
461
|
this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
|
|
@@ -436,7 +463,7 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
436
463
|
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, deviceInterviewPayload);
|
|
437
464
|
}
|
|
438
465
|
else if (device.isDeleted) {
|
|
439
|
-
debug
|
|
466
|
+
logger_1.logger.debug(`Deleted green power device '${ieeeAddr}' joined, undeleting`, NS);
|
|
440
467
|
device.undelete(true);
|
|
441
468
|
this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
|
|
442
469
|
const deviceInterviewPayload = { status: 'successful', device };
|
|
@@ -448,32 +475,31 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
448
475
|
this.emit(event, data);
|
|
449
476
|
}
|
|
450
477
|
async onDeviceJoined(payload) {
|
|
451
|
-
debug
|
|
478
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' joined`, NS);
|
|
452
479
|
if (this.options.acceptJoiningDeviceHandler) {
|
|
453
480
|
if (!(await this.options.acceptJoiningDeviceHandler(payload.ieeeAddr))) {
|
|
454
|
-
debug
|
|
481
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' rejected by handler, removing it`, NS);
|
|
455
482
|
await catcho(() => this.adapter.removeDevice(payload.networkAddress, payload.ieeeAddr), 'Failed to remove rejected device');
|
|
456
483
|
return;
|
|
457
484
|
}
|
|
458
485
|
else {
|
|
459
|
-
debug
|
|
486
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' accepted by handler`, NS);
|
|
460
487
|
}
|
|
461
488
|
}
|
|
462
489
|
let device = model_1.Device.byIeeeAddr(this.database.id, payload.ieeeAddr, true);
|
|
463
490
|
if (!device) {
|
|
464
|
-
debug
|
|
465
|
-
debug
|
|
491
|
+
logger_1.logger.debug(`New device '${payload.ieeeAddr}' joined`, NS);
|
|
492
|
+
logger_1.logger.debug(`Creating device '${payload.ieeeAddr}'`, NS);
|
|
466
493
|
device = model_1.Device.create('Unknown', payload.ieeeAddr, payload.networkAddress, undefined, undefined, undefined, undefined, false, [], this.database.id);
|
|
467
494
|
this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
|
|
468
495
|
}
|
|
469
496
|
else if (device.isDeleted) {
|
|
470
|
-
debug
|
|
497
|
+
logger_1.logger.debug(`Deleted device '${payload.ieeeAddr}' joined, undeleting`, NS);
|
|
471
498
|
device.undelete();
|
|
472
499
|
this.selfAndDeviceEmit(device, Events.Events.deviceJoined, { device });
|
|
473
500
|
}
|
|
474
501
|
if (device.networkAddress !== payload.networkAddress) {
|
|
475
|
-
debug
|
|
476
|
-
`updating networkAddress`);
|
|
502
|
+
logger_1.logger.debug(`Device '${payload.ieeeAddr}' is already in database with different network address, updating network address`, NS);
|
|
477
503
|
device.networkAddress = payload.networkAddress;
|
|
478
504
|
device.save();
|
|
479
505
|
}
|
|
@@ -482,124 +508,156 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
482
508
|
device.implicitCheckin();
|
|
483
509
|
if (!device.interviewCompleted && !device.interviewing) {
|
|
484
510
|
const payloadStart = { status: 'started', device };
|
|
485
|
-
|
|
511
|
+
logger_1.logger.info(`Interview for '${device.ieeeAddr}' started`, NS);
|
|
486
512
|
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, payloadStart);
|
|
487
513
|
try {
|
|
488
514
|
await device.interview();
|
|
489
|
-
|
|
515
|
+
logger_1.logger.info(`Succesfully interviewed '${device.ieeeAddr}'`, NS);
|
|
490
516
|
const event = { status: 'successful', device };
|
|
491
517
|
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
|
|
492
518
|
}
|
|
493
519
|
catch (error) {
|
|
494
|
-
|
|
520
|
+
logger_1.logger.error(`Interview failed for '${device.ieeeAddr} with error '${error}'`, NS);
|
|
495
521
|
const event = { status: 'failed', device };
|
|
496
522
|
this.selfAndDeviceEmit(device, Events.Events.deviceInterview, event);
|
|
497
523
|
}
|
|
498
524
|
}
|
|
499
525
|
else {
|
|
500
|
-
debug
|
|
501
|
-
`in progress '${device.interviewing}'`);
|
|
526
|
+
logger_1.logger.debug(`Not interviewing '${payload.ieeeAddr}', completed '${device.interviewCompleted}', in progress '${device.interviewing}'`, NS);
|
|
502
527
|
}
|
|
503
528
|
}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
delete logDataPayload.frame.Cluster;
|
|
529
|
+
async onZclPayload(payload) {
|
|
530
|
+
let frame = undefined;
|
|
531
|
+
let device = undefined;
|
|
532
|
+
if (payload.clusterID === Zcl.Clusters.touchlink.ID) {
|
|
533
|
+
// This is handled by touchlink
|
|
534
|
+
return;
|
|
511
535
|
}
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
// This is handled by touchlink
|
|
517
|
-
return;
|
|
536
|
+
else if (payload.clusterID === Zcl.Clusters.greenPower.ID) {
|
|
537
|
+
try {
|
|
538
|
+
// Custom clusters are not supported for Green Power since we need to parse the frame to get the device.
|
|
539
|
+
frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, {});
|
|
518
540
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
541
|
+
catch (error) {
|
|
542
|
+
logger_1.logger.debug(`Failed to parse frame green power frame, ignoring it: ${error}`, NS);
|
|
543
|
+
return;
|
|
544
|
+
// <<<<<<< HEAD
|
|
545
|
+
// } else if (dataPayload.frame.Cluster.name === 'greenPower') {
|
|
546
|
+
// await this.greenPower.onZclGreenPowerData(dataPayload);
|
|
547
|
+
// // lookup encapsulated gpDevice for further processing
|
|
548
|
+
// gpDevice = Device.byNetworkAddress(dataPayload.frame.Payload.srcID & 0xFFFF, this.database.id);
|
|
549
|
+
// }
|
|
550
|
+
// }
|
|
551
|
+
// let device = gpDevice ? gpDevice : (typeof dataPayload.address === 'string'
|
|
552
|
+
// ? Device.byIeeeAddr(this.database.id, dataPayload.address)
|
|
553
|
+
// : Device.byNetworkAddress(dataPayload.address, this.database.id));
|
|
554
|
+
// /**
|
|
555
|
+
// * Handling of re-transmitted Xiaomi messages.
|
|
556
|
+
// * https://github.com/Koenkk/zigbee2mqtt/issues/1238
|
|
557
|
+
// * https://github.com/Koenkk/zigbee2mqtt/issues/3592
|
|
558
|
+
// *
|
|
559
|
+
// * Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
|
|
560
|
+
// * The network address of these message is set to the one of the Xiaomi router.
|
|
561
|
+
// * Therefore it looks like if the message came from the Xiaomi router, while in
|
|
562
|
+
// * fact it came from the end device.
|
|
563
|
+
// * Handling these message would result in false state updates.
|
|
564
|
+
// * The group ID attribute of these message defines the network address of the end device.
|
|
565
|
+
// */
|
|
566
|
+
// if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && dataPayload.groupID) {
|
|
567
|
+
// debug.log(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${dataPayload.groupID}`);
|
|
568
|
+
// device = Device.byNetworkAddress(dataPayload.groupID, this.database.id);
|
|
569
|
+
// }
|
|
570
|
+
// =======
|
|
523
571
|
}
|
|
572
|
+
await this.greenPower.onZclGreenPowerData(payload, frame);
|
|
573
|
+
// lookup encapsulated gpDevice for further processing
|
|
574
|
+
device = model_1.Device.byNetworkAddress(frame.payload.srcID & 0xffff, this.database.id);
|
|
524
575
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
576
|
+
else {
|
|
577
|
+
/**
|
|
578
|
+
* Handling of re-transmitted Xiaomi messages.
|
|
579
|
+
* https://github.com/Koenkk/zigbee2mqtt/issues/1238
|
|
580
|
+
* https://github.com/Koenkk/zigbee2mqtt/issues/3592
|
|
581
|
+
*
|
|
582
|
+
* Some Xiaomi router devices re-transmit messages from Xiaomi end devices.
|
|
583
|
+
* The network address of these message is set to the one of the Xiaomi router.
|
|
584
|
+
* Therefore it looks like if the message came from the Xiaomi router, while in
|
|
585
|
+
* fact it came from the end device.
|
|
586
|
+
* Handling these message would result in false state updates.
|
|
587
|
+
* The group ID attribute of these message defines the network address of the end device.
|
|
588
|
+
*/
|
|
589
|
+
device = model_1.Device.find(this.database.id, payload.address);
|
|
590
|
+
if (device?.manufacturerName === 'LUMI' && device?.type == 'Router' && payload.groupID) {
|
|
591
|
+
logger_1.logger.debug(`Handling re-transmitted Xiaomi message ${device.networkAddress} -> ${payload.groupID}`, NS);
|
|
592
|
+
device = model_1.Device.byNetworkAddress(this.database.id, payload.groupID);
|
|
593
|
+
}
|
|
594
|
+
try {
|
|
595
|
+
frame = Zcl.Frame.fromBuffer(payload.clusterID, payload.header, payload.data, device?.customClusters);
|
|
596
|
+
}
|
|
597
|
+
catch (error) {
|
|
598
|
+
logger_1.logger.debug(`Failed to parse frame: ${error}`, NS);
|
|
599
|
+
}
|
|
543
600
|
}
|
|
544
601
|
if (!device) {
|
|
545
|
-
debug
|
|
546
|
-
`skipping...`);
|
|
602
|
+
logger_1.logger.debug(`Data is from unknown device with address '${payload.address}', skipping...`, NS);
|
|
547
603
|
return;
|
|
548
604
|
}
|
|
605
|
+
logger_1.logger.debug(`Received payload: clusterID=${payload.clusterID}, address=${payload.address}, groupID=${payload.groupID}, `
|
|
606
|
+
+ `endpoint=${payload.endpoint}, destinationEndpoint=${payload.destinationEndpoint}, wasBroadcast=${payload.wasBroadcast}, `
|
|
607
|
+
+ `linkQuality=${payload.linkquality}, frame=${frame?.toString()}`, NS);
|
|
549
608
|
device.updateLastSeen();
|
|
550
609
|
//no implicit checkin for genPollCtrl data because it might interfere with the explicit checkin
|
|
551
|
-
if (!
|
|
610
|
+
if (!frame?.isCluster("genPollCtrl")) {
|
|
552
611
|
device.implicitCheckin();
|
|
553
612
|
}
|
|
554
|
-
device.linkquality =
|
|
555
|
-
let endpoint = device.getEndpoint(
|
|
613
|
+
device.linkquality = payload.linkquality;
|
|
614
|
+
let endpoint = device.getEndpoint(payload.endpoint);
|
|
556
615
|
if (!endpoint) {
|
|
557
|
-
debug
|
|
558
|
-
`network address '${
|
|
559
|
-
endpoint = device.createEndpoint(
|
|
616
|
+
logger_1.logger.debug(`Data is from unknown endpoint '${payload.endpoint}' from device with ` +
|
|
617
|
+
`network address '${payload.address}', creating it...`, NS);
|
|
618
|
+
endpoint = device.createEndpoint(payload.endpoint);
|
|
560
619
|
}
|
|
561
620
|
// Parse command for event
|
|
562
621
|
let type = undefined;
|
|
563
622
|
let data;
|
|
564
623
|
let clusterName = undefined;
|
|
565
624
|
const meta = {};
|
|
566
|
-
if (
|
|
567
|
-
const
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
meta.
|
|
571
|
-
meta.
|
|
572
|
-
|
|
573
|
-
if (frame.isGlobal()) {
|
|
625
|
+
if (frame) {
|
|
626
|
+
const command = frame.command;
|
|
627
|
+
clusterName = frame.cluster.name;
|
|
628
|
+
meta.zclTransactionSequenceNumber = frame.header.transactionSequenceNumber;
|
|
629
|
+
meta.manufacturerCode = frame.header.manufacturerCode;
|
|
630
|
+
meta.frameControl = frame.header.frameControl;
|
|
631
|
+
if (frame.header.isGlobal) {
|
|
574
632
|
if (frame.isCommand('report')) {
|
|
575
633
|
type = 'attributeReport';
|
|
576
|
-
data = helpers_1.ZclFrameConverter.attributeKeyValue(
|
|
634
|
+
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
577
635
|
}
|
|
578
636
|
else if (frame.isCommand('read')) {
|
|
579
637
|
type = 'read';
|
|
580
|
-
data = helpers_1.ZclFrameConverter.attributeList(
|
|
638
|
+
data = helpers_1.ZclFrameConverter.attributeList(frame, device.manufacturerID, device.customClusters);
|
|
581
639
|
}
|
|
582
640
|
else if (frame.isCommand('write')) {
|
|
583
641
|
type = 'write';
|
|
584
|
-
data = helpers_1.ZclFrameConverter.attributeKeyValue(
|
|
642
|
+
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
585
643
|
}
|
|
586
644
|
else {
|
|
587
645
|
/* istanbul ignore else */
|
|
588
646
|
if (frame.isCommand('readRsp')) {
|
|
589
647
|
type = 'readResponse';
|
|
590
|
-
data = helpers_1.ZclFrameConverter.attributeKeyValue(
|
|
648
|
+
data = helpers_1.ZclFrameConverter.attributeKeyValue(frame, device.manufacturerID, device.customClusters);
|
|
591
649
|
}
|
|
592
650
|
}
|
|
593
651
|
}
|
|
594
652
|
else {
|
|
595
653
|
/* istanbul ignore else */
|
|
596
|
-
if (frame.isSpecific
|
|
654
|
+
if (frame.header.isSpecific) {
|
|
597
655
|
if (Events.CommandsLookup[command.name]) {
|
|
598
656
|
type = Events.CommandsLookup[command.name];
|
|
599
|
-
data =
|
|
657
|
+
data = frame.payload;
|
|
600
658
|
}
|
|
601
659
|
else {
|
|
602
|
-
debug
|
|
660
|
+
logger_1.logger.debug(`Skipping command '${command.name}' because it is missing from the lookup`, NS);
|
|
603
661
|
}
|
|
604
662
|
}
|
|
605
663
|
}
|
|
@@ -611,19 +669,19 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
611
669
|
property.set(value, device);
|
|
612
670
|
}
|
|
613
671
|
}
|
|
614
|
-
endpoint.saveClusterAttributeKeyValue(frame.
|
|
672
|
+
endpoint.saveClusterAttributeKeyValue(frame.cluster.ID, data);
|
|
615
673
|
}
|
|
616
674
|
}
|
|
617
675
|
else {
|
|
618
676
|
type = 'raw';
|
|
619
|
-
data =
|
|
620
|
-
const name =
|
|
677
|
+
data = payload.data;
|
|
678
|
+
const name = Zcl.Utils.getCluster(payload.clusterID, device.manufacturerID, device.customClusters).name;
|
|
621
679
|
clusterName = Number.isNaN(Number(name)) ? name : Number(name);
|
|
622
680
|
}
|
|
623
681
|
if (type && data) {
|
|
624
|
-
const endpoint = device.getEndpoint(
|
|
625
|
-
const linkquality =
|
|
626
|
-
const groupID =
|
|
682
|
+
const endpoint = device.getEndpoint(payload.endpoint);
|
|
683
|
+
const linkquality = payload.linkquality;
|
|
684
|
+
const groupID = payload.groupID;
|
|
627
685
|
const eventData = {
|
|
628
686
|
type: type, device, endpoint, data, linkquality, groupID, cluster: clusterName, meta
|
|
629
687
|
};
|
|
@@ -633,8 +691,8 @@ class Controller extends events_1.default.EventEmitter {
|
|
|
633
691
|
else {
|
|
634
692
|
this.selfAndDeviceEmit(device, Events.Events.lastSeenChanged, { device, reason: 'messageNonEmitted' });
|
|
635
693
|
}
|
|
636
|
-
if (
|
|
637
|
-
await device.onZclData(
|
|
694
|
+
if (frame) {
|
|
695
|
+
await device.onZclData(payload, frame, endpoint);
|
|
638
696
|
}
|
|
639
697
|
}
|
|
640
698
|
}
|