@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
|
@@ -30,18 +30,16 @@ const zclTransactionSequenceNumber_1 = __importDefault(require("../helpers/zclTr
|
|
|
30
30
|
const endpoint_1 = __importDefault(require("./endpoint"));
|
|
31
31
|
const entity_1 = __importDefault(require("./entity"));
|
|
32
32
|
const utils_1 = require("../../utils");
|
|
33
|
-
const
|
|
34
|
-
const Zcl = __importStar(require("../../zcl"));
|
|
33
|
+
const Zcl = __importStar(require("../../zspec/zcl"));
|
|
35
34
|
const assert_1 = __importDefault(require("assert"));
|
|
36
35
|
const helpers_1 = require("../helpers");
|
|
36
|
+
const logger_1 = require("../../utils/logger");
|
|
37
|
+
const enums_1 = require("../../zspec/enums");
|
|
37
38
|
/**
|
|
38
39
|
* @ignore
|
|
39
40
|
*/
|
|
40
41
|
const OneJanuary2000 = new Date('January 01, 2000 00:00:00 UTC+00:00').getTime();
|
|
41
|
-
const
|
|
42
|
-
error: (0, debug_1.default)('zigbee-herdsman:controller:device:error'),
|
|
43
|
-
log: (0, debug_1.default)('zigbee-herdsman:controller:device:log'),
|
|
44
|
-
};
|
|
42
|
+
const NS = 'zh:controller:device';
|
|
45
43
|
class Device extends entity_1.default {
|
|
46
44
|
databaseID;
|
|
47
45
|
ID;
|
|
@@ -64,11 +62,12 @@ class Device extends entity_1.default {
|
|
|
64
62
|
_zclVersion;
|
|
65
63
|
_linkquality;
|
|
66
64
|
_skipDefaultResponse;
|
|
67
|
-
|
|
65
|
+
_customReadResponse;
|
|
68
66
|
_deleted;
|
|
69
67
|
_lastDefaultResponseSequenceNumber;
|
|
70
68
|
_checkinInterval;
|
|
71
69
|
_pendingRequestTimeout;
|
|
70
|
+
_customClusters = {};
|
|
72
71
|
// Getters/setters
|
|
73
72
|
get ieeeAddr() { return this._ieeeAddr; }
|
|
74
73
|
set ieeeAddr(ieeeAddr) { this._ieeeAddr = ieeeAddr; }
|
|
@@ -99,7 +98,7 @@ class Device extends entity_1.default {
|
|
|
99
98
|
}
|
|
100
99
|
get powerSource() { return this._powerSource; }
|
|
101
100
|
set powerSource(powerSource) {
|
|
102
|
-
this._powerSource = typeof powerSource === 'number' ? Zcl.
|
|
101
|
+
this._powerSource = typeof powerSource === 'number' ? Zcl.POWER_SOURCES[powerSource & ~(1 << 7)] : powerSource;
|
|
103
102
|
}
|
|
104
103
|
get softwareBuildID() { return this._softwareBuildID; }
|
|
105
104
|
set softwareBuildID(softwareBuildID) { this._softwareBuildID = softwareBuildID; }
|
|
@@ -111,8 +110,8 @@ class Device extends entity_1.default {
|
|
|
111
110
|
set linkquality(linkquality) { this._linkquality = linkquality; }
|
|
112
111
|
get skipDefaultResponse() { return this._skipDefaultResponse; }
|
|
113
112
|
set skipDefaultResponse(skipDefaultResponse) { this._skipDefaultResponse = skipDefaultResponse; }
|
|
114
|
-
get
|
|
115
|
-
set
|
|
113
|
+
get customReadResponse() { return this._customReadResponse; }
|
|
114
|
+
set customReadResponse(customReadResponse) { this._customReadResponse = customReadResponse; }
|
|
116
115
|
get checkinInterval() { return this._checkinInterval; }
|
|
117
116
|
set checkinInterval(checkinInterval) {
|
|
118
117
|
this._checkinInterval = checkinInterval;
|
|
@@ -120,6 +119,7 @@ class Device extends entity_1.default {
|
|
|
120
119
|
}
|
|
121
120
|
get pendingRequestTimeout() { return this._pendingRequestTimeout; }
|
|
122
121
|
set pendingRequestTimeout(pendingRequestTimeout) { this._pendingRequestTimeout = pendingRequestTimeout; }
|
|
122
|
+
get customClusters() { return this._customClusters; }
|
|
123
123
|
meta;
|
|
124
124
|
// This lookup contains all devices that are queried from the database, this is to ensure that always
|
|
125
125
|
// the same instance is returned.
|
|
@@ -156,7 +156,6 @@ class Device extends entity_1.default {
|
|
|
156
156
|
this._interviewCompleted = interviewCompleted;
|
|
157
157
|
this._interviewing = false;
|
|
158
158
|
this._skipDefaultResponse = false;
|
|
159
|
-
this._skipTimeResponse = false;
|
|
160
159
|
this.meta = meta;
|
|
161
160
|
this._lastSeen = lastSeen;
|
|
162
161
|
this._checkinInterval = checkinInterval;
|
|
@@ -183,7 +182,7 @@ class Device extends entity_1.default {
|
|
|
183
182
|
}
|
|
184
183
|
// There might be multiple endpoints with same DeviceId but it is not supported and first endpoint is returned
|
|
185
184
|
getEndpointByDeviceType(deviceType) {
|
|
186
|
-
const deviceID = Zcl.
|
|
185
|
+
const deviceID = Zcl.ENDPOINT_DEVICE_TYPE[deviceType];
|
|
187
186
|
return this.endpoints.find((d) => d.deviceID === deviceID);
|
|
188
187
|
}
|
|
189
188
|
implicitCheckin() {
|
|
@@ -200,110 +199,113 @@ class Device extends entity_1.default {
|
|
|
200
199
|
hasPendingRequests() {
|
|
201
200
|
return this.endpoints.find(e => e.hasPendingRequests()) !== undefined;
|
|
202
201
|
}
|
|
203
|
-
async onZclData(dataPayload, endpoint) {
|
|
204
|
-
const frame = dataPayload.frame;
|
|
202
|
+
async onZclData(dataPayload, frame, endpoint) {
|
|
205
203
|
// Update reportable properties
|
|
206
204
|
if (frame.isCluster('genBasic') && (frame.isCommand('readRsp') || frame.isCommand('report'))) {
|
|
207
|
-
for (const [key, val] of Object.entries(helpers_1.ZclFrameConverter.attributeKeyValue(frame, this.manufacturerID))) {
|
|
205
|
+
for (const [key, val] of Object.entries(helpers_1.ZclFrameConverter.attributeKeyValue(frame, this.manufacturerID, this.customClusters))) {
|
|
208
206
|
Device.ReportablePropertiesMapping[key]?.set(val, this);
|
|
209
207
|
}
|
|
210
208
|
}
|
|
211
209
|
// Respond to enroll requests
|
|
212
|
-
if (frame.isSpecific
|
|
213
|
-
debug
|
|
210
|
+
if (frame.header.isSpecific && frame.isCluster('ssIasZone') && frame.isCommand('enrollReq')) {
|
|
211
|
+
logger_1.logger.debug(`IAS - '${this.ieeeAddr}' responding to enroll response`, NS);
|
|
214
212
|
const payload = { enrollrspcode: 0, zoneid: 23 };
|
|
215
213
|
await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true });
|
|
216
214
|
}
|
|
217
215
|
// Reponse to read requests
|
|
218
|
-
if (frame.isGlobal
|
|
216
|
+
if (frame.header.isGlobal && frame.isCommand('read') && !(this._customReadResponse?.(frame, endpoint))) {
|
|
219
217
|
const time = Math.round(((new Date()).getTime() - OneJanuary2000) / 1000);
|
|
220
218
|
const attributes = {
|
|
221
219
|
...endpoint.clusters,
|
|
222
|
-
genTime: {
|
|
220
|
+
genTime: {
|
|
221
|
+
attributes: {
|
|
223
222
|
timeStatus: 3, // Time-master + synchronised
|
|
224
223
|
time: time,
|
|
225
224
|
timeZone: ((new Date()).getTimezoneOffset() * -1) * 60,
|
|
226
225
|
localTime: time - (new Date()).getTimezoneOffset() * 60,
|
|
227
226
|
lastSetTime: time,
|
|
228
227
|
validUntilTime: time + (24 * 60 * 60), // valid for 24 hours
|
|
229
|
-
}
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
230
|
};
|
|
231
|
-
if (frame.
|
|
231
|
+
if (frame.cluster.name in attributes) {
|
|
232
232
|
const response = {};
|
|
233
|
-
for (const entry of frame.
|
|
234
|
-
if (frame.
|
|
235
|
-
const name = frame.
|
|
236
|
-
if (name in attributes[frame.
|
|
237
|
-
response[name] = attributes[frame.
|
|
233
|
+
for (const entry of frame.payload) {
|
|
234
|
+
if (frame.cluster.hasAttribute(entry.attrId)) {
|
|
235
|
+
const name = frame.cluster.getAttribute(entry.attrId).name;
|
|
236
|
+
if (name in attributes[frame.cluster.name].attributes) {
|
|
237
|
+
response[name] = attributes[frame.cluster.name].attributes[name];
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
try {
|
|
242
|
-
await endpoint.readResponse(frame.
|
|
242
|
+
await endpoint.readResponse(frame.cluster.ID, frame.header.transactionSequenceNumber, response, { srcEndpoint: dataPayload.destinationEndpoint });
|
|
243
243
|
}
|
|
244
244
|
catch (error) {
|
|
245
|
-
|
|
245
|
+
logger_1.logger.error(`Read response to ${this.ieeeAddr} failed`, NS);
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
249
|
// Handle check-in from sleeping end devices
|
|
250
|
-
if (frame.isSpecific
|
|
250
|
+
if (frame.header.isSpecific && frame.isCluster("genPollCtrl") && frame.isCommand("checkin")) {
|
|
251
251
|
try {
|
|
252
252
|
if (this.hasPendingRequests() || (this._checkinInterval === undefined)) {
|
|
253
253
|
const payload = {
|
|
254
254
|
startFastPolling: true,
|
|
255
255
|
fastPollTimeout: 0,
|
|
256
256
|
};
|
|
257
|
-
debug
|
|
258
|
-
await endpoint.command(frame.
|
|
257
|
+
logger_1.logger.debug(`check-in from ${this.ieeeAddr}: accepting fast-poll`, NS);
|
|
258
|
+
await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
|
|
259
259
|
// This is a good time to read the checkin interval if we haven't stored it previously
|
|
260
260
|
if (this._checkinInterval === undefined) {
|
|
261
261
|
const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
|
|
262
262
|
this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
|
|
263
263
|
this.resetPendingRequestTimeout();
|
|
264
|
-
debug
|
|
264
|
+
logger_1.logger.debug(`Request Queue (${this.ieeeAddr}): default expiration timeout set to ${this.pendingRequestTimeout}`, NS);
|
|
265
265
|
}
|
|
266
266
|
await Promise.all(this.endpoints.map(async (e) => e.sendPendingRequests(true)));
|
|
267
267
|
// We *must* end fast-poll when we're done sending things. Otherwise
|
|
268
268
|
// we cause undue power-drain.
|
|
269
|
-
debug
|
|
270
|
-
await endpoint.command(frame.
|
|
269
|
+
logger_1.logger.debug(`check-in from ${this.ieeeAddr}: stopping fast-poll`, NS);
|
|
270
|
+
await endpoint.command(frame.cluster.ID, 'fastPollStop', {}, { sendPolicy: 'immediate' });
|
|
271
271
|
}
|
|
272
272
|
else {
|
|
273
273
|
const payload = {
|
|
274
274
|
startFastPolling: false,
|
|
275
275
|
fastPollTimeout: 0,
|
|
276
276
|
};
|
|
277
|
-
debug
|
|
278
|
-
await endpoint.command(frame.
|
|
277
|
+
logger_1.logger.debug(`check-in from ${this.ieeeAddr}: declining fast-poll`, NS);
|
|
278
|
+
await endpoint.command(frame.cluster.ID, 'checkinRsp', payload, { sendPolicy: 'immediate' });
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
catch (error) {
|
|
282
282
|
/* istanbul ignore next */
|
|
283
|
-
|
|
283
|
+
logger_1.logger.error(`Handling of poll check-in from ${this.ieeeAddr} failed`, NS);
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
// Send a default response if necessary.
|
|
287
|
-
const isDefaultResponse = frame.isGlobal
|
|
288
|
-
const commandHasResponse = frame.
|
|
289
|
-
const disableDefaultResponse = frame.
|
|
287
|
+
const isDefaultResponse = frame.header.isGlobal && frame.command.name === 'defaultRsp';
|
|
288
|
+
const commandHasResponse = frame.command.hasOwnProperty('response');
|
|
289
|
+
const disableDefaultResponse = frame.header.frameControl.disableDefaultResponse;
|
|
290
|
+
/* istanbul ignore next */
|
|
291
|
+
const disableTuyaDefaultResponse = endpoint.getDevice().manufacturerName?.startsWith('_TZ') && process.env['DISABLE_TUYA_DEFAULT_RESPONSE'];
|
|
290
292
|
// Sometimes messages are received twice, prevent responding twice
|
|
291
|
-
const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.
|
|
293
|
+
const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.header.transactionSequenceNumber;
|
|
292
294
|
if (this.type !== 'GreenPower' && !dataPayload.wasBroadcast && !disableDefaultResponse && !isDefaultResponse &&
|
|
293
|
-
!commandHasResponse && !this._skipDefaultResponse && !alreadyResponded) {
|
|
295
|
+
!commandHasResponse && !this._skipDefaultResponse && !alreadyResponded && !disableTuyaDefaultResponse) {
|
|
294
296
|
try {
|
|
295
|
-
this._lastDefaultResponseSequenceNumber = frame.
|
|
297
|
+
this._lastDefaultResponseSequenceNumber = frame.header.transactionSequenceNumber;
|
|
296
298
|
// In the ZCL it is not documented what the direction of the default response should be
|
|
297
299
|
// In https://github.com/Koenkk/zigbee2mqtt/issues/18096 a commandResponse (SERVER_TO_CLIENT)
|
|
298
300
|
// is send and the device expects a CLIENT_TO_SERVER back.
|
|
299
301
|
// Previously SERVER_TO_CLIENT was always used.
|
|
300
302
|
// Therefore for non-global commands we inverse the direction.
|
|
301
|
-
const direction = frame.isGlobal
|
|
303
|
+
const direction = frame.header.isGlobal ? Zcl.Direction.SERVER_TO_CLIENT : (frame.header.frameControl.direction === Zcl.Direction.CLIENT_TO_SERVER
|
|
302
304
|
? Zcl.Direction.SERVER_TO_CLIENT : Zcl.Direction.CLIENT_TO_SERVER);
|
|
303
|
-
await endpoint.defaultResponse(frame.
|
|
305
|
+
await endpoint.defaultResponse(frame.command.ID, 0, frame.cluster.ID, frame.header.transactionSequenceNumber, { direction });
|
|
304
306
|
}
|
|
305
307
|
catch (error) {
|
|
306
|
-
|
|
308
|
+
logger_1.logger.error(`Default response to ${this.ieeeAddr} failed`, NS);
|
|
307
309
|
}
|
|
308
310
|
}
|
|
309
311
|
}
|
|
@@ -322,7 +324,7 @@ class Device extends entity_1.default {
|
|
|
322
324
|
}
|
|
323
325
|
// default: no timeout (messages expire immediately after first send attempt)
|
|
324
326
|
let pendingRequestTimeout = 0;
|
|
325
|
-
if ((endpoints.filter((e) => e.
|
|
327
|
+
if ((endpoints.filter((e) => e.inputClusters.includes(Zcl.Clusters.genPollCtrl.ID))).length > 0) {
|
|
326
328
|
// default for devices that support genPollCtrl cluster (RX off when idle): 1 day
|
|
327
329
|
pendingRequestTimeout = 86400000;
|
|
328
330
|
/* istanbul ignore else */
|
|
@@ -331,7 +333,7 @@ class Device extends entity_1.default {
|
|
|
331
333
|
pendingRequestTimeout = entry.checkinInterval * 1000; // milliseconds
|
|
332
334
|
}
|
|
333
335
|
}
|
|
334
|
-
debug
|
|
336
|
+
logger_1.logger.debug(`Request Queue (${ieeeAddr}): default expiration timeout set to ${pendingRequestTimeout}`, NS);
|
|
335
337
|
return new Device(databaseID, entry.id, entry.type, ieeeAddr, networkAddress, entry.manufId, endpoints, entry.manufName, entry.powerSource, entry.modelId, entry.appVersion, entry.stackVersion, entry.zclVersion, entry.hwVersion, entry.dateCode, entry.swBuildId, entry.interviewCompleted, meta, entry.lastSeen || null, entry.checkinInterval, pendingRequestTimeout);
|
|
336
338
|
}
|
|
337
339
|
toDatabaseEntry() {
|
|
@@ -364,13 +366,18 @@ class Device extends entity_1.default {
|
|
|
364
366
|
}
|
|
365
367
|
});
|
|
366
368
|
}
|
|
369
|
+
static find(databaseID, ieeeOrNwkAddress, includeDeleted = false) {
|
|
370
|
+
return typeof ieeeOrNwkAddress === 'string' ? Device.byIeeeAddr(databaseID, ieeeOrNwkAddress, includeDeleted)
|
|
371
|
+
: Device.byNetworkAddress(ieeeOrNwkAddress, databaseID, includeDeleted);
|
|
372
|
+
}
|
|
367
373
|
static byIeeeAddr(databaseID, ieeeAddr, includeDeleted = false) {
|
|
368
374
|
Device.loadFromDatabaseIfNecessary();
|
|
369
375
|
const device = Device.devices.get(databaseID)[ieeeAddr];
|
|
370
376
|
return device?._deleted && !includeDeleted ? undefined : device;
|
|
371
377
|
}
|
|
372
|
-
static byNetworkAddress(networkAddress, databaseID) {
|
|
373
|
-
|
|
378
|
+
static byNetworkAddress(networkAddress, databaseID, includeDeleted = false) {
|
|
379
|
+
Device.loadFromDatabaseIfNecessary();
|
|
380
|
+
return Object.values(Device.allByDatabaseID(databaseID)).find(d => (includeDeleted || !d._deleted) && d.networkAddress === networkAddress);
|
|
374
381
|
}
|
|
375
382
|
static byType(type, databaseID) {
|
|
376
383
|
return Device.allByDatabaseID(databaseID).filter(d => d.type === type);
|
|
@@ -414,23 +421,23 @@ class Device extends entity_1.default {
|
|
|
414
421
|
async interview() {
|
|
415
422
|
if (this.interviewing) {
|
|
416
423
|
const message = `Interview - interview already in progress for '${this.ieeeAddr}'`;
|
|
417
|
-
debug
|
|
424
|
+
logger_1.logger.debug(message, NS);
|
|
418
425
|
throw new Error(message);
|
|
419
426
|
}
|
|
420
427
|
let error;
|
|
421
428
|
this._interviewing = true;
|
|
422
|
-
debug
|
|
429
|
+
logger_1.logger.debug(`Interview - start device '${this.ieeeAddr}'`, NS);
|
|
423
430
|
try {
|
|
424
431
|
await this.interviewInternal();
|
|
425
|
-
debug
|
|
432
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}'`, NS);
|
|
426
433
|
this._interviewCompleted = true;
|
|
427
434
|
}
|
|
428
435
|
catch (e) {
|
|
429
436
|
if (this.interviewQuirks()) {
|
|
430
|
-
debug
|
|
437
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${e}')`, NS);
|
|
431
438
|
}
|
|
432
439
|
else {
|
|
433
|
-
debug
|
|
440
|
+
logger_1.logger.debug(`Interview - failed for device '${this.ieeeAddr}' with error '${e.stack}'`, NS);
|
|
434
441
|
error = e;
|
|
435
442
|
}
|
|
436
443
|
}
|
|
@@ -443,7 +450,7 @@ class Device extends entity_1.default {
|
|
|
443
450
|
}
|
|
444
451
|
}
|
|
445
452
|
interviewQuirks() {
|
|
446
|
-
debug
|
|
453
|
+
logger_1.logger.debug(`Interview - quirks check for '${this.modelID}'-'${this.manufacturerName}'-'${this.type}'`, NS);
|
|
447
454
|
// TuYa devices are typically hard to interview. They also don't require a full interview to work correctly
|
|
448
455
|
// e.g. no ias enrolling is required for the devices to work.
|
|
449
456
|
// Assume that in case we got both the manufacturerName and modelID the device works correctly.
|
|
@@ -457,7 +464,7 @@ class Device extends entity_1.default {
|
|
|
457
464
|
this._powerSource = this._powerSource || 'Battery';
|
|
458
465
|
this._interviewing = false;
|
|
459
466
|
this._interviewCompleted = true;
|
|
460
|
-
debug
|
|
467
|
+
logger_1.logger.debug(`Interview - quirks matched for TuYa end device`, NS);
|
|
461
468
|
return true;
|
|
462
469
|
}
|
|
463
470
|
// Some devices, e.g. Xiaomi end devices have a different interview procedure, after pairing they
|
|
@@ -480,18 +487,18 @@ class Device extends entity_1.default {
|
|
|
480
487
|
const match = Object.keys(lookup).find((key) => this.modelID && this.modelID.match(key));
|
|
481
488
|
if (match) {
|
|
482
489
|
const info = lookup[match];
|
|
483
|
-
debug
|
|
490
|
+
logger_1.logger.debug(`Interview procedure failed but got modelID matching '${match}', assuming interview succeeded`, NS);
|
|
484
491
|
this._type = this._type === 'Unknown' ? info.type : this._type;
|
|
485
492
|
this._manufacturerID = this._manufacturerID || info.manufacturerID;
|
|
486
493
|
this._manufacturerName = this._manufacturerName || info.manufacturerName;
|
|
487
494
|
this._powerSource = this._powerSource || info.powerSource;
|
|
488
495
|
this._interviewing = false;
|
|
489
496
|
this._interviewCompleted = true;
|
|
490
|
-
debug
|
|
497
|
+
logger_1.logger.debug(`Interview - quirks matched on '${match}'`, NS);
|
|
491
498
|
return true;
|
|
492
499
|
}
|
|
493
500
|
else {
|
|
494
|
-
debug
|
|
501
|
+
logger_1.logger.debug('Interview - quirks did not match', NS);
|
|
495
502
|
return false;
|
|
496
503
|
}
|
|
497
504
|
}
|
|
@@ -500,7 +507,7 @@ class Device extends entity_1.default {
|
|
|
500
507
|
const nodeDescriptor = await entity_1.default.getAdapterByID(this.databaseID).nodeDescriptor(this.networkAddress);
|
|
501
508
|
this._manufacturerID = nodeDescriptor.manufacturerCode;
|
|
502
509
|
this._type = nodeDescriptor.type;
|
|
503
|
-
debug
|
|
510
|
+
logger_1.logger.debug(`Interview - got node descriptor for device '${this.ieeeAddr}'`, NS);
|
|
504
511
|
};
|
|
505
512
|
const hasNodeDescriptor = () => this._manufacturerID != null && this._type != null;
|
|
506
513
|
if (!hasNodeDescriptor()) {
|
|
@@ -511,18 +518,18 @@ class Device extends entity_1.default {
|
|
|
511
518
|
}
|
|
512
519
|
catch (error) {
|
|
513
520
|
if (this.interviewQuirks()) {
|
|
514
|
-
debug
|
|
521
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`, NS);
|
|
515
522
|
return;
|
|
516
523
|
}
|
|
517
524
|
else {
|
|
518
525
|
// Most of the times the first node descriptor query fails and the seconds one succeeds.
|
|
519
|
-
debug
|
|
526
|
+
logger_1.logger.debug(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
|
|
520
527
|
}
|
|
521
528
|
}
|
|
522
529
|
}
|
|
523
530
|
}
|
|
524
531
|
else {
|
|
525
|
-
debug
|
|
532
|
+
logger_1.logger.debug(`Interview - skip node descriptor request for '${this.ieeeAddr}', already got it`, NS);
|
|
526
533
|
}
|
|
527
534
|
if (!hasNodeDescriptor()) {
|
|
528
535
|
throw new Error(`Interview failed because can not get node descriptor ('${this.ieeeAddr}')`);
|
|
@@ -530,7 +537,7 @@ class Device extends entity_1.default {
|
|
|
530
537
|
if (this.manufacturerID === 4619 && this._type === 'EndDevice') {
|
|
531
538
|
// Give TuYa end device some time to pair. Otherwise they leave immediately.
|
|
532
539
|
// https://github.com/Koenkk/zigbee2mqtt/issues/5814
|
|
533
|
-
debug
|
|
540
|
+
logger_1.logger.debug("Interview - Detected TuYa end device, waiting 10 seconds...", NS);
|
|
534
541
|
await (0, utils_1.Wait)(10000);
|
|
535
542
|
}
|
|
536
543
|
else if ([0, 4098].includes(this.manufacturerID)) {
|
|
@@ -538,7 +545,7 @@ class Device extends entity_1.default {
|
|
|
538
545
|
// In case the device responds, the endoint and modelID/manufacturerName are set
|
|
539
546
|
// in controller.onZclOrRawData()
|
|
540
547
|
// https://github.com/Koenkk/zigbee2mqtt/issues/7553
|
|
541
|
-
debug
|
|
548
|
+
logger_1.logger.debug("Interview - Detected potential TuYa end device, reading modelID and manufacturerName...", NS);
|
|
542
549
|
try {
|
|
543
550
|
const endpoint = endpoint_1.default.create(this.databaseID, 1, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
|
|
544
551
|
const result = await endpoint.read('genBasic', ['modelId', 'manufacturerName'], { sendPolicy: 'immediate' });
|
|
@@ -547,7 +554,7 @@ class Device extends entity_1.default {
|
|
|
547
554
|
}
|
|
548
555
|
catch (error) {
|
|
549
556
|
/* istanbul ignore next */
|
|
550
|
-
debug
|
|
557
|
+
logger_1.logger.debug(`Interview - TuYa read modelID and manufacturerName failed (${error})`, NS);
|
|
551
558
|
}
|
|
552
559
|
}
|
|
553
560
|
// e.g. Xiaomi Aqara Opple devices fail to respond to the first active endpoints request, therefore try 2 times
|
|
@@ -560,7 +567,7 @@ class Device extends entity_1.default {
|
|
|
560
567
|
break;
|
|
561
568
|
}
|
|
562
569
|
catch (error) {
|
|
563
|
-
debug
|
|
570
|
+
logger_1.logger.debug(`Interview - active endpoints request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
|
|
564
571
|
}
|
|
565
572
|
}
|
|
566
573
|
if (!activeEndpoints) {
|
|
@@ -572,7 +579,7 @@ class Device extends entity_1.default {
|
|
|
572
579
|
// This is not a valid endpoint number according to the ZCL, requesting a simple descriptor will result
|
|
573
580
|
// into an error. Therefore we filter it, more info: https://github.com/Koenkk/zigbee-herdsman/issues/82
|
|
574
581
|
activeEndpoints.endpoints.filter((e) => e !== 0 && !this.getEndpoint(e)).forEach((e) => this._endpoints.push(endpoint_1.default.create(this.databaseID, e, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr)));
|
|
575
|
-
debug
|
|
582
|
+
logger_1.logger.debug(`Interview - got active endpoints for device '${this.ieeeAddr}'`, NS);
|
|
576
583
|
for (const endpointID of activeEndpoints.endpoints.filter((e) => e !== 0)) {
|
|
577
584
|
const endpoint = this.getEndpoint(endpointID);
|
|
578
585
|
const simpleDescriptor = await adapter.simpleDescriptor(this.networkAddress, endpoint.ID);
|
|
@@ -580,7 +587,7 @@ class Device extends entity_1.default {
|
|
|
580
587
|
endpoint.deviceID = simpleDescriptor.deviceID;
|
|
581
588
|
endpoint.inputClusters = simpleDescriptor.inputClusters;
|
|
582
589
|
endpoint.outputClusters = simpleDescriptor.outputClusters;
|
|
583
|
-
debug
|
|
590
|
+
logger_1.logger.debug(`Interview - got simple descriptor for endpoint '${endpoint.ID}' device '${this.ieeeAddr}'`, NS);
|
|
584
591
|
// Read attributes, nice to have but not required for succesfull pairing as most of the attributes
|
|
585
592
|
// are not mandatory in ZCL specification.
|
|
586
593
|
if (endpoint.supportsInputCluster('genBasic')) {
|
|
@@ -597,8 +604,7 @@ class Device extends entity_1.default {
|
|
|
597
604
|
// https://github.com/Koenkk/zigbee-herdsman-converters/issues/2485.
|
|
598
605
|
// The modelID and manufacturerName are crucial for device identification, so retry.
|
|
599
606
|
if (item.key === 'modelID' || item.key === 'manufacturerName') {
|
|
600
|
-
debug
|
|
601
|
-
`retrying after 10 seconds...`);
|
|
607
|
+
logger_1.logger.debug(`Interview - first ${item.key} retrieval attempt failed, retrying after 10 seconds...`, NS);
|
|
602
608
|
await (0, utils_1.Wait)(10000);
|
|
603
609
|
result = await endpoint.read('genBasic', [key], { sendPolicy: 'immediate' });
|
|
604
610
|
}
|
|
@@ -607,11 +613,10 @@ class Device extends entity_1.default {
|
|
|
607
613
|
}
|
|
608
614
|
}
|
|
609
615
|
item.set(result[key], this);
|
|
610
|
-
debug
|
|
616
|
+
logger_1.logger.debug(`Interview - got '${item.key}' for device '${this.ieeeAddr}'`, NS);
|
|
611
617
|
}
|
|
612
618
|
catch (error) {
|
|
613
|
-
debug
|
|
614
|
-
`endpoint '${endpoint.ID}' (${error})`);
|
|
619
|
+
logger_1.logger.debug(`Interview - failed to read attribute '${item.key}' from endpoint '${endpoint.ID}' (${error})`, NS);
|
|
615
620
|
}
|
|
616
621
|
}
|
|
617
622
|
}
|
|
@@ -620,14 +625,14 @@ class Device extends entity_1.default {
|
|
|
620
625
|
const coordinator = Device.byType('Coordinator', this.databaseID)[0];
|
|
621
626
|
// Enroll IAS device
|
|
622
627
|
for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('ssIasZone'))) {
|
|
623
|
-
debug
|
|
628
|
+
logger_1.logger.debug(`Interview - IAS - enrolling '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
624
629
|
const stateBefore = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
|
|
625
|
-
debug
|
|
630
|
+
logger_1.logger.debug(`Interview - IAS - before enrolling state: '${JSON.stringify(stateBefore)}'`, NS);
|
|
626
631
|
// Do not enroll when device has already been enrolled
|
|
627
632
|
if (stateBefore.zoneState !== 1 || stateBefore.iasCieAddr !== coordinator.ieeeAddr) {
|
|
628
|
-
debug
|
|
633
|
+
logger_1.logger.debug(`Interview - IAS - not enrolled, enrolling`, NS);
|
|
629
634
|
await endpoint.write('ssIasZone', { 'iasCieAddr': coordinator.ieeeAddr }, { sendPolicy: 'immediate' });
|
|
630
|
-
debug
|
|
635
|
+
logger_1.logger.debug(`Interview - IAS - wrote iasCieAddr`, NS);
|
|
631
636
|
// There are 2 enrollment procedures:
|
|
632
637
|
// - Auto enroll: coordinator has to send enrollResponse without receiving an enroll request
|
|
633
638
|
// this case is handled below.
|
|
@@ -635,34 +640,34 @@ class Device extends entity_1.default {
|
|
|
635
640
|
// this case in hanled in onZclData().
|
|
636
641
|
// https://github.com/Koenkk/zigbee2mqtt/issues/4569#issuecomment-706075676
|
|
637
642
|
await (0, utils_1.Wait)(500);
|
|
638
|
-
debug
|
|
643
|
+
logger_1.logger.debug(`IAS - '${this.ieeeAddr}' sending enroll response (auto enroll)`, NS);
|
|
639
644
|
const payload = { enrollrspcode: 0, zoneid: 23 };
|
|
640
645
|
await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true, sendPolicy: 'immediate' });
|
|
641
646
|
let enrolled = false;
|
|
642
647
|
for (let attempt = 0; attempt < 20; attempt++) {
|
|
643
648
|
await (0, utils_1.Wait)(500);
|
|
644
649
|
const stateAfter = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
|
|
645
|
-
debug
|
|
650
|
+
logger_1.logger.debug(`Interview - IAS - after enrolling state (${attempt}): '${JSON.stringify(stateAfter)}'`, NS);
|
|
646
651
|
if (stateAfter.zoneState === 1) {
|
|
647
652
|
enrolled = true;
|
|
648
653
|
break;
|
|
649
654
|
}
|
|
650
655
|
}
|
|
651
656
|
if (enrolled) {
|
|
652
|
-
debug
|
|
657
|
+
logger_1.logger.debug(`Interview - IAS successfully enrolled '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
653
658
|
}
|
|
654
659
|
else {
|
|
655
660
|
throw new Error(`Interview failed because of failed IAS enroll (zoneState didn't change ('${this.ieeeAddr}')`);
|
|
656
661
|
}
|
|
657
662
|
}
|
|
658
663
|
else {
|
|
659
|
-
debug
|
|
664
|
+
logger_1.logger.debug(`Interview - IAS - already enrolled, skipping enroll`, NS);
|
|
660
665
|
}
|
|
661
666
|
}
|
|
662
667
|
// Bind poll control
|
|
663
668
|
try {
|
|
664
669
|
for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('genPollCtrl'))) {
|
|
665
|
-
debug
|
|
670
|
+
logger_1.logger.debug(`Interview - Poll control - binding '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
666
671
|
await endpoint.bind('genPollCtrl', coordinator.endpoints[0]);
|
|
667
672
|
const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
|
|
668
673
|
this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
|
|
@@ -671,7 +676,7 @@ class Device extends entity_1.default {
|
|
|
671
676
|
}
|
|
672
677
|
catch (error) {
|
|
673
678
|
/* istanbul ignore next */
|
|
674
|
-
debug
|
|
679
|
+
logger_1.logger.debug(`Interview - failed to bind genPollCtrl (${error})`, NS);
|
|
675
680
|
}
|
|
676
681
|
}
|
|
677
682
|
async removeFromNetwork() {
|
|
@@ -680,8 +685,8 @@ class Device extends entity_1.default {
|
|
|
680
685
|
options: 0x002550,
|
|
681
686
|
srcID: Number(this.ieeeAddr),
|
|
682
687
|
};
|
|
683
|
-
const frame = Zcl.
|
|
684
|
-
await entity_1.default.getAdapterByID(this.databaseID).sendZclFrameToAll(242, frame, 242);
|
|
688
|
+
const frame = Zcl.Frame.create(Zcl.FrameType.SPECIFIC, Zcl.Direction.SERVER_TO_CLIENT, true, null, zclTransactionSequenceNumber_1.default.next(), 'pairing', 33, payload, this.customClusters);
|
|
689
|
+
await entity_1.default.getAdapterByID(this.databaseID).sendZclFrameToAll(242, frame, 242, enums_1.BroadcastAddress.RX_ON_WHEN_IDLE);
|
|
685
690
|
}
|
|
686
691
|
else
|
|
687
692
|
await entity_1.default.getAdapterByID(this.databaseID).removeDevice(this.networkAddress, this.ieeeAddr);
|
|
@@ -720,6 +725,22 @@ class Device extends entity_1.default {
|
|
|
720
725
|
const endpoint = this.endpoints.find((ep) => ep.inputClusters.includes(0)) ?? this.endpoints[0];
|
|
721
726
|
await endpoint.read('genBasic', ['zclVersion'], { disableRecovery });
|
|
722
727
|
}
|
|
728
|
+
addCustomCluster(name, cluster) {
|
|
729
|
+
(0, assert_1.default)(!([Zcl.Clusters.touchlink.ID, Zcl.Clusters.greenPower.ID].includes(cluster.ID)), 'Overriding of greenPower or touchlink cluster is not supported');
|
|
730
|
+
if (Zcl.Utils.isClusterName(name)) {
|
|
731
|
+
const existingCluster = Zcl.Clusters[name];
|
|
732
|
+
// Extend existing cluster
|
|
733
|
+
(0, assert_1.default)(existingCluster.ID === cluster.ID, `Custom cluster ID (${cluster.ID}) should match existing cluster ID (${existingCluster.ID})`);
|
|
734
|
+
cluster = {
|
|
735
|
+
ID: cluster.ID,
|
|
736
|
+
manufacturerCode: cluster.manufacturerCode,
|
|
737
|
+
attributes: { ...existingCluster.attributes, ...cluster.attributes },
|
|
738
|
+
commands: { ...existingCluster.commands, ...cluster.commands },
|
|
739
|
+
commandsResponse: { ...existingCluster.commandsResponse, ...cluster.commandsResponse },
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
this._customClusters[name] = cluster;
|
|
743
|
+
}
|
|
723
744
|
}
|
|
724
745
|
exports.default = Device;
|
|
725
746
|
//# sourceMappingURL=device.js.map
|