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