@willieee802/zigbee-herdsman 0.36.0 → 0.48.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +317 -0
- package/dist/adapter/adapter.d.ts +15 -13
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/adapter/adapter.js +15 -17
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +14 -12
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
- package/dist/adapter/deconz/adapter/deconzAdapter.js +118 -128
- package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -1
- package/dist/adapter/deconz/driver/driver.d.ts.map +1 -1
- package/dist/adapter/deconz/driver/driver.js +44 -44
- package/dist/adapter/deconz/driver/driver.js.map +1 -1
- package/dist/adapter/deconz/driver/frameParser.js +43 -43
- package/dist/adapter/deconz/driver/frameParser.js.map +1 -1
- package/dist/adapter/deconz/driver/parser.js +6 -6
- package/dist/adapter/deconz/driver/parser.js.map +1 -1
- package/dist/adapter/deconz/driver/writer.js +3 -3
- package/dist/adapter/deconz/driver/writer.js.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.d.ts +32 -36
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/emberAdapter.js +418 -446
- package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -1
- package/dist/adapter/ember/adapter/endpoints.d.ts +5 -3
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/endpoints.js +33 -31
- package/dist/adapter/ember/adapter/endpoints.js.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.d.ts +10 -2
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/oneWaitress.js +19 -5
- package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -1
- package/dist/adapter/ember/adapter/requestQueue.d.ts +2 -4
- package/dist/adapter/ember/adapter/requestQueue.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/requestQueue.js +16 -21
- package/dist/adapter/ember/adapter/requestQueue.js.map +1 -1
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
- package/dist/adapter/ember/adapter/tokensManager.js +23 -20
- package/dist/adapter/ember/adapter/tokensManager.js.map +1 -1
- package/dist/adapter/ember/consts.d.ts +0 -7
- package/dist/adapter/ember/consts.d.ts.map +1 -1
- package/dist/adapter/ember/consts.js +2 -9
- package/dist/adapter/ember/consts.js.map +1 -1
- package/dist/adapter/ember/enums.d.ts +12 -14
- package/dist/adapter/ember/enums.d.ts.map +1 -1
- package/dist/adapter/ember/enums.js +12 -14
- package/dist/adapter/ember/enums.js.map +1 -1
- package/dist/adapter/ember/ezsp/buffalo.js +4 -4
- package/dist/adapter/ember/ezsp/buffalo.js.map +1 -1
- package/dist/adapter/ember/ezsp/ezsp.d.ts +1 -2
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
- package/dist/adapter/ember/ezsp/ezsp.js +218 -199
- package/dist/adapter/ember/ezsp/ezsp.js.map +1 -1
- package/dist/adapter/ember/types.d.ts +9 -9
- package/dist/adapter/ember/types.d.ts.map +1 -1
- package/dist/adapter/ember/uart/ash.d.ts +11 -5
- package/dist/adapter/ember/uart/ash.d.ts.map +1 -1
- package/dist/adapter/ember/uart/ash.js +125 -93
- package/dist/adapter/ember/uart/ash.js.map +1 -1
- package/dist/adapter/ember/uart/consts.d.ts +1 -1
- package/dist/adapter/ember/uart/consts.js +1 -1
- package/dist/adapter/ember/uart/parser.d.ts.map +1 -1
- package/dist/adapter/ember/uart/parser.js +5 -9
- package/dist/adapter/ember/uart/parser.js.map +1 -1
- package/dist/adapter/ember/uart/queues.d.ts.map +1 -1
- package/dist/adapter/ember/uart/queues.js +3 -1
- package/dist/adapter/ember/uart/queues.js.map +1 -1
- package/dist/adapter/ember/uart/writer.d.ts.map +1 -1
- package/dist/adapter/ember/uart/writer.js +4 -6
- package/dist/adapter/ember/uart/writer.js.map +1 -1
- package/dist/adapter/ember/utils/math.d.ts.map +1 -1
- package/dist/adapter/ember/zdo.d.ts +6 -2
- package/dist/adapter/ember/zdo.d.ts.map +1 -1
- package/dist/adapter/ember/zdo.js +2 -2
- package/dist/adapter/ember/zdo.js.map +1 -1
- package/dist/adapter/events.d.ts +17 -23
- package/dist/adapter/events.d.ts.map +1 -1
- package/dist/adapter/events.js +1 -2
- package/dist/adapter/events.js.map +1 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts +0 -1
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/backup.js +3 -7
- package/dist/adapter/ezsp/adapter/backup.js.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +13 -10
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
- package/dist/adapter/ezsp/adapter/ezspAdapter.js +79 -72
- package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -1
- package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/commands.js +3 -5
- package/dist/adapter/ezsp/driver/commands.js.map +1 -1
- package/dist/adapter/ezsp/driver/driver.d.ts +1 -4
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/driver.js +101 -122
- package/dist/adapter/ezsp/driver/driver.js.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/ezsp.js +61 -50
- package/dist/adapter/ezsp/driver/ezsp.js.map +1 -1
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/multicast.js +8 -12
- package/dist/adapter/ezsp/driver/multicast.js.map +1 -1
- package/dist/adapter/ezsp/driver/parser.js +5 -5
- package/dist/adapter/ezsp/driver/parser.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/basic.js +1 -1
- package/dist/adapter/ezsp/driver/types/basic.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/named.js +2 -2
- package/dist/adapter/ezsp/driver/types/named.js.map +1 -1
- package/dist/adapter/ezsp/driver/types/struct.js +2 -2
- package/dist/adapter/ezsp/driver/types/struct.js.map +1 -1
- package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -1
- package/dist/adapter/ezsp/driver/uart.js +46 -46
- package/dist/adapter/ezsp/driver/uart.js.map +1 -1
- package/dist/adapter/ezsp/driver/writer.js +3 -6
- package/dist/adapter/ezsp/driver/writer.js.map +1 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/adapter-backup.js +25 -29
- package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -1
- package/dist/adapter/z-stack/adapter/endpoints.js +4 -4
- package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.d.ts +1 -4
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/manager.js +52 -61
- package/dist/adapter/z-stack/adapter/manager.js.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +14 -10
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +95 -69
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
- package/dist/adapter/z-stack/unpi/parser.d.ts +3 -1
- package/dist/adapter/z-stack/unpi/parser.d.ts.map +1 -1
- package/dist/adapter/z-stack/unpi/parser.js +18 -8
- package/dist/adapter/z-stack/unpi/parser.js.map +1 -1
- package/dist/adapter/z-stack/unpi/writer.d.ts +3 -2
- package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -1
- package/dist/adapter/z-stack/unpi/writer.js +21 -11
- package/dist/adapter/z-stack/unpi/writer.js.map +1 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +4 -2
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/buffaloZnp.js +154 -25
- package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -1
- package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/definition.js +2 -1
- package/dist/adapter/z-stack/znp/definition.js.map +1 -1
- package/dist/adapter/z-stack/znp/tstype.d.ts +4 -3
- package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/znp.d.ts +3 -1
- package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -1
- package/dist/adapter/z-stack/znp/znp.js +27 -32
- package/dist/adapter/z-stack/znp/znp.js.map +1 -1
- package/dist/adapter/z-stack/znp/zpiObject.js +2 -2
- package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +13 -12
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +81 -90
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +7 -8
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/buffaloZiGate.js +150 -100
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
- package/dist/adapter/zigate/driver/commandType.d.ts +2 -1
- package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/commandType.js +56 -52
- package/dist/adapter/zigate/driver/commandType.js.map +1 -1
- package/dist/adapter/zigate/driver/frame.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/frame.js +8 -8
- package/dist/adapter/zigate/driver/frame.js.map +1 -1
- package/dist/adapter/zigate/driver/messageType.d.ts +2 -1
- package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/messageType.js +113 -108
- package/dist/adapter/zigate/driver/messageType.js.map +1 -1
- package/dist/adapter/zigate/driver/parameterType.d.ts +8 -1
- package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/parameterType.js +9 -0
- package/dist/adapter/zigate/driver/parameterType.js.map +1 -1
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/ziGateObject.js +9 -9
- package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -1
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
- package/dist/adapter/zigate/driver/zigate.js +23 -31
- package/dist/adapter/zigate/driver/zigate.js.map +1 -1
- package/dist/buffalo/buffalo.d.ts +23 -19
- package/dist/buffalo/buffalo.d.ts.map +1 -1
- package/dist/buffalo/buffalo.js +74 -169
- package/dist/buffalo/buffalo.js.map +1 -1
- package/dist/buffalo/index.d.ts +1 -2
- package/dist/buffalo/index.d.ts.map +1 -1
- package/dist/buffalo/index.js +1 -26
- package/dist/buffalo/index.js.map +1 -1
- package/dist/controller/controller.d.ts +10 -5
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/controller/controller.js +184 -126
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/database.d.ts +1 -0
- package/dist/controller/database.d.ts.map +1 -1
- package/dist/controller/database.js +7 -10
- package/dist/controller/database.js.map +1 -1
- package/dist/controller/events.d.ts +2 -2
- package/dist/controller/events.d.ts.map +1 -1
- package/dist/controller/events.js +4 -0
- package/dist/controller/events.js.map +1 -1
- package/dist/controller/greenPower.d.ts +2 -1
- package/dist/controller/greenPower.d.ts.map +1 -1
- package/dist/controller/greenPower.js +51 -57
- package/dist/controller/greenPower.js.map +1 -1
- package/dist/controller/helpers/request.d.ts +3 -3
- package/dist/controller/helpers/request.d.ts.map +1 -1
- package/dist/controller/helpers/request.js +2 -2
- package/dist/controller/helpers/request.js.map +1 -1
- package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
- package/dist/controller/helpers/requestQueue.js +26 -36
- package/dist/controller/helpers/requestQueue.js.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.d.ts +4 -3
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
- package/dist/controller/helpers/zclFrameConverter.js +33 -14
- package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
- package/dist/controller/model/device.d.ts +12 -5
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +105 -86
- package/dist/controller/model/device.js.map +1 -1
- package/dist/controller/model/endpoint.d.ts +22 -17
- package/dist/controller/model/endpoint.d.ts.map +1 -1
- package/dist/controller/model/endpoint.js +139 -228
- package/dist/controller/model/endpoint.js.map +1 -1
- package/dist/controller/model/group.d.ts +1 -1
- package/dist/controller/model/group.d.ts.map +1 -1
- package/dist/controller/model/group.js +18 -18
- package/dist/controller/model/group.js.map +1 -1
- package/dist/controller/model/konnextConfig.d.ts +7 -0
- package/dist/controller/model/konnextConfig.d.ts.map +1 -0
- package/dist/controller/{logger-stub.js → model/konnextConfig.js} +1 -1
- package/dist/controller/model/konnextConfig.js.map +1 -0
- package/dist/controller/touchlink.js +25 -28
- package/dist/controller/touchlink.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/aes.d.ts +40 -0
- package/dist/utils/aes.d.ts.map +1 -0
- package/dist/utils/aes.js +198 -0
- package/dist/utils/aes.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/zspec/consts.d.ts +60 -0
- package/dist/zspec/consts.d.ts.map +1 -0
- package/dist/zspec/consts.js +64 -0
- package/dist/zspec/consts.js.map +1 -0
- package/dist/zspec/enums.d.ts +19 -0
- package/dist/zspec/enums.d.ts.map +1 -0
- package/dist/zspec/enums.js +28 -0
- package/dist/zspec/enums.js.map +1 -0
- package/dist/zspec/index.d.ts +4 -0
- package/dist/zspec/index.d.ts.map +1 -0
- package/dist/zspec/index.js +43 -0
- package/dist/zspec/index.js.map +1 -0
- package/dist/zspec/tstypes.d.ts +19 -0
- package/dist/zspec/tstypes.d.ts.map +1 -0
- package/dist/{buffalo/tstype.js → zspec/tstypes.js} +1 -1
- package/dist/zspec/tstypes.js.map +1 -0
- package/dist/zspec/utils.d.ts +14 -0
- package/dist/zspec/utils.d.ts.map +1 -0
- package/dist/zspec/utils.js +29 -0
- package/dist/zspec/utils.js.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts +55 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.js +929 -0
- package/dist/zspec/zcl/buffaloZcl.js.map +1 -0
- package/dist/zspec/zcl/definition/cluster.d.ts +3 -0
- package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/cluster.js +5500 -0
- package/dist/zspec/zcl/definition/cluster.js.map +1 -0
- package/dist/zspec/zcl/definition/consts.d.ts +9 -0
- package/dist/zspec/zcl/definition/consts.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/consts.js +27 -0
- package/dist/zspec/zcl/definition/consts.js.map +1 -0
- package/dist/zspec/zcl/definition/enums.d.ts +177 -0
- package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/enums.js +187 -0
- package/dist/zspec/zcl/definition/enums.js.map +1 -0
- package/dist/zspec/zcl/definition/foundation.d.ts +11 -0
- package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/foundation.js +241 -0
- package/dist/zspec/zcl/definition/foundation.js.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts +727 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.js +733 -0
- package/dist/zspec/zcl/definition/manufacturerCode.js.map +1 -0
- package/dist/zspec/zcl/definition/status.d.ts +69 -0
- package/dist/zspec/zcl/definition/status.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/status.js +74 -0
- package/dist/zspec/zcl/definition/status.js.map +1 -0
- package/dist/zspec/zcl/definition/tstype.d.ts +114 -0
- package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
- package/dist/{zcl/zclHeader.js → zspec/zcl/definition/tstype.js} +2 -1
- package/dist/zspec/zcl/definition/tstype.js.map +1 -0
- package/dist/zspec/zcl/index.d.ts +11 -0
- package/dist/zspec/zcl/index.d.ts.map +1 -0
- package/dist/zspec/zcl/index.js +47 -0
- package/dist/zspec/zcl/index.js.map +1 -0
- package/dist/zspec/zcl/utils.d.ts +7 -0
- package/dist/zspec/zcl/utils.d.ts.map +1 -0
- package/dist/zspec/zcl/utils.js +234 -0
- package/dist/zspec/zcl/utils.js.map +1 -0
- package/dist/zspec/zcl/zclFrame.d.ts +36 -0
- package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
- package/dist/zspec/zcl/zclFrame.js +304 -0
- package/dist/zspec/zcl/zclFrame.js.map +1 -0
- package/dist/zspec/zcl/zclHeader.d.ts +17 -0
- package/dist/zspec/zcl/zclHeader.d.ts.map +1 -0
- package/dist/zspec/zcl/zclHeader.js +88 -0
- package/dist/zspec/zcl/zclHeader.js.map +1 -0
- package/dist/zspec/zcl/zclStatusError.d.ts +6 -0
- package/dist/zspec/zcl/zclStatusError.d.ts.map +1 -0
- package/dist/zspec/zcl/zclStatusError.js +13 -0
- package/dist/zspec/zcl/zclStatusError.js.map +1 -0
- package/dist/zspec/zdo/buffaloZdo.d.ts +438 -0
- package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
- package/dist/zspec/zdo/buffaloZdo.js +1892 -0
- package/dist/zspec/zdo/buffaloZdo.js.map +1 -0
- package/dist/zspec/zdo/definition/clusters.d.ts +624 -0
- package/dist/zspec/zdo/definition/clusters.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/clusters.js +687 -0
- package/dist/zspec/zdo/definition/clusters.js.map +1 -0
- package/dist/zspec/zdo/definition/consts.d.ts +13 -0
- package/dist/zspec/zdo/definition/consts.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/consts.js +16 -0
- package/dist/zspec/zdo/definition/consts.js.map +1 -0
- package/dist/zspec/zdo/definition/enums.d.ts +75 -0
- package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/enums.js +97 -0
- package/dist/zspec/zdo/definition/enums.js.map +1 -0
- package/dist/zspec/zdo/definition/status.d.ts +99 -0
- package/dist/zspec/zdo/definition/status.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/status.js +109 -0
- package/dist/zspec/zdo/definition/status.js.map +1 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts +787 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
- package/dist/{zcl/definition/tstype.js → zspec/zdo/definition/tstypes.js} +1 -1
- package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
- package/dist/zspec/zdo/index.d.ts +7 -0
- package/dist/zspec/zdo/index.d.ts.map +1 -0
- package/dist/zspec/zdo/index.js +39 -0
- package/dist/zspec/zdo/index.js.map +1 -0
- package/dist/zspec/zdo/utils.d.ts +25 -0
- package/dist/zspec/zdo/utils.d.ts.map +1 -0
- package/dist/zspec/zdo/utils.js +75 -0
- package/dist/zspec/zdo/utils.js.map +1 -0
- package/dist/zspec/zdo/zdoStatusError.d.ts +6 -0
- package/dist/zspec/zdo/zdoStatusError.d.ts.map +1 -0
- package/dist/zspec/zdo/zdoStatusError.js +13 -0
- package/dist/zspec/zdo/zdoStatusError.js.map +1 -0
- package/examples/join-and-log.js +7 -12
- package/package.json +6 -6
- package/dist/adapter/zigate/debug.d.ts +0 -8
- package/dist/adapter/zigate/debug.d.ts.map +0 -1
- package/dist/adapter/zigate/debug.js +0 -20
- package/dist/adapter/zigate/debug.js.map +0 -1
- package/dist/buffalo/tstype.d.ts +0 -9
- package/dist/buffalo/tstype.d.ts.map +0 -1
- package/dist/buffalo/tstype.js.map +0 -1
- package/dist/controller/logger-stub.d.ts +0 -7
- package/dist/controller/logger-stub.d.ts.map +0 -1
- package/dist/controller/logger-stub.js.map +0 -1
- package/dist/zcl/buffaloZcl.d.ts +0 -42
- package/dist/zcl/buffaloZcl.d.ts.map +0 -1
- package/dist/zcl/buffaloZcl.js +0 -595
- package/dist/zcl/buffaloZcl.js.map +0 -1
- package/dist/zcl/definition/buffaloZclDataType.d.ts +0 -18
- package/dist/zcl/definition/buffaloZclDataType.d.ts.map +0 -1
- package/dist/zcl/definition/buffaloZclDataType.js +0 -21
- package/dist/zcl/definition/buffaloZclDataType.js.map +0 -1
- package/dist/zcl/definition/cluster.d.ts +0 -30
- package/dist/zcl/definition/cluster.d.ts.map +0 -1
- package/dist/zcl/definition/cluster.js +0 -5531
- package/dist/zcl/definition/cluster.js.map +0 -1
- package/dist/zcl/definition/dataType.d.ts +0 -60
- package/dist/zcl/definition/dataType.d.ts.map +0 -1
- package/dist/zcl/definition/dataType.js +0 -65
- package/dist/zcl/definition/dataType.js.map +0 -1
- package/dist/zcl/definition/direction.d.ts +0 -6
- package/dist/zcl/definition/direction.d.ts.map +0 -1
- package/dist/zcl/definition/direction.js +0 -9
- package/dist/zcl/definition/direction.js.map +0 -1
- package/dist/zcl/definition/endpointDeviceType.d.ts +0 -5
- package/dist/zcl/definition/endpointDeviceType.d.ts.map +0 -1
- package/dist/zcl/definition/endpointDeviceType.js +0 -16
- package/dist/zcl/definition/endpointDeviceType.js.map +0 -1
- package/dist/zcl/definition/foundation.d.ts +0 -12
- package/dist/zcl/definition/foundation.d.ts.map +0 -1
- package/dist/zcl/definition/foundation.js +0 -168
- package/dist/zcl/definition/foundation.js.map +0 -1
- package/dist/zcl/definition/frameControl.d.ts +0 -11
- package/dist/zcl/definition/frameControl.d.ts.map +0 -1
- package/dist/zcl/definition/frameControl.js +0 -3
- package/dist/zcl/definition/frameControl.js.map +0 -1
- package/dist/zcl/definition/frameType.d.ts +0 -6
- package/dist/zcl/definition/frameType.d.ts.map +0 -1
- package/dist/zcl/definition/frameType.js +0 -9
- package/dist/zcl/definition/frameType.js.map +0 -1
- package/dist/zcl/definition/index.d.ts +0 -14
- package/dist/zcl/definition/index.d.ts.map +0 -1
- package/dist/zcl/definition/index.js +0 -52
- package/dist/zcl/definition/index.js.map +0 -1
- package/dist/zcl/definition/manufacturerCode.d.ts +0 -1078
- package/dist/zcl/definition/manufacturerCode.d.ts.map +0 -1
- package/dist/zcl/definition/manufacturerCode.js +0 -1083
- package/dist/zcl/definition/manufacturerCode.js.map +0 -1
- package/dist/zcl/definition/powerSource.d.ts +0 -5
- package/dist/zcl/definition/powerSource.d.ts.map +0 -1
- package/dist/zcl/definition/powerSource.js +0 -13
- package/dist/zcl/definition/powerSource.js.map +0 -1
- package/dist/zcl/definition/status.d.ts +0 -39
- package/dist/zcl/definition/status.d.ts.map +0 -1
- package/dist/zcl/definition/status.js +0 -42
- package/dist/zcl/definition/status.js.map +0 -1
- package/dist/zcl/definition/tstype.d.ts +0 -17
- package/dist/zcl/definition/tstype.d.ts.map +0 -1
- package/dist/zcl/definition/tstype.js.map +0 -1
- package/dist/zcl/index.d.ts +0 -17
- package/dist/zcl/index.d.ts.map +0 -1
- package/dist/zcl/index.js +0 -56
- package/dist/zcl/index.js.map +0 -1
- package/dist/zcl/tstype.d.ts +0 -57
- package/dist/zcl/tstype.d.ts.map +0 -1
- package/dist/zcl/tstype.js +0 -10
- package/dist/zcl/tstype.js.map +0 -1
- package/dist/zcl/utils.d.ts +0 -7
- package/dist/zcl/utils.d.ts.map +0 -1
- package/dist/zcl/utils.js +0 -165
- package/dist/zcl/utils.js.map +0 -1
- package/dist/zcl/zclFrame.d.ts +0 -41
- package/dist/zcl/zclFrame.d.ts.map +0 -1
- package/dist/zcl/zclFrame.js +0 -352
- package/dist/zcl/zclFrame.js.map +0 -1
- package/dist/zcl/zclHeader.d.ts +0 -9
- package/dist/zcl/zclHeader.d.ts.map +0 -1
- package/dist/zcl/zclHeader.js.map +0 -1
- package/dist/zcl/zclStatusError.d.ts +0 -6
- package/dist/zcl/zclStatusError.d.ts.map +0 -1
- package/dist/zcl/zclStatusError.js +0 -15
- package/dist/zcl/zclStatusError.js.map +0 -1
|
@@ -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,112 +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
290
|
/* istanbul ignore next */
|
|
291
291
|
const disableTuyaDefaultResponse = endpoint.getDevice().manufacturerName?.startsWith('_TZ') && process.env['DISABLE_TUYA_DEFAULT_RESPONSE'];
|
|
292
292
|
// Sometimes messages are received twice, prevent responding twice
|
|
293
|
-
const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.
|
|
293
|
+
const alreadyResponded = this._lastDefaultResponseSequenceNumber === frame.header.transactionSequenceNumber;
|
|
294
294
|
if (this.type !== 'GreenPower' && !dataPayload.wasBroadcast && !disableDefaultResponse && !isDefaultResponse &&
|
|
295
295
|
!commandHasResponse && !this._skipDefaultResponse && !alreadyResponded && !disableTuyaDefaultResponse) {
|
|
296
296
|
try {
|
|
297
|
-
this._lastDefaultResponseSequenceNumber = frame.
|
|
297
|
+
this._lastDefaultResponseSequenceNumber = frame.header.transactionSequenceNumber;
|
|
298
298
|
// In the ZCL it is not documented what the direction of the default response should be
|
|
299
299
|
// In https://github.com/Koenkk/zigbee2mqtt/issues/18096 a commandResponse (SERVER_TO_CLIENT)
|
|
300
300
|
// is send and the device expects a CLIENT_TO_SERVER back.
|
|
301
301
|
// Previously SERVER_TO_CLIENT was always used.
|
|
302
302
|
// Therefore for non-global commands we inverse the direction.
|
|
303
|
-
const direction = frame.isGlobal
|
|
303
|
+
const direction = frame.header.isGlobal ? Zcl.Direction.SERVER_TO_CLIENT : (frame.header.frameControl.direction === Zcl.Direction.CLIENT_TO_SERVER
|
|
304
304
|
? Zcl.Direction.SERVER_TO_CLIENT : Zcl.Direction.CLIENT_TO_SERVER);
|
|
305
|
-
await endpoint.defaultResponse(frame.
|
|
305
|
+
await endpoint.defaultResponse(frame.command.ID, 0, frame.cluster.ID, frame.header.transactionSequenceNumber, { direction });
|
|
306
306
|
}
|
|
307
307
|
catch (error) {
|
|
308
|
-
|
|
308
|
+
logger_1.logger.error(`Default response to ${this.ieeeAddr} failed`, NS);
|
|
309
309
|
}
|
|
310
310
|
}
|
|
311
311
|
}
|
|
@@ -324,7 +324,7 @@ class Device extends entity_1.default {
|
|
|
324
324
|
}
|
|
325
325
|
// default: no timeout (messages expire immediately after first send attempt)
|
|
326
326
|
let pendingRequestTimeout = 0;
|
|
327
|
-
if ((endpoints.filter((e) => e.
|
|
327
|
+
if ((endpoints.filter((e) => e.inputClusters.includes(Zcl.Clusters.genPollCtrl.ID))).length > 0) {
|
|
328
328
|
// default for devices that support genPollCtrl cluster (RX off when idle): 1 day
|
|
329
329
|
pendingRequestTimeout = 86400000;
|
|
330
330
|
/* istanbul ignore else */
|
|
@@ -333,7 +333,7 @@ class Device extends entity_1.default {
|
|
|
333
333
|
pendingRequestTimeout = entry.checkinInterval * 1000; // milliseconds
|
|
334
334
|
}
|
|
335
335
|
}
|
|
336
|
-
debug
|
|
336
|
+
logger_1.logger.debug(`Request Queue (${ieeeAddr}): default expiration timeout set to ${pendingRequestTimeout}`, NS);
|
|
337
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);
|
|
338
338
|
}
|
|
339
339
|
toDatabaseEntry() {
|
|
@@ -366,13 +366,18 @@ class Device extends entity_1.default {
|
|
|
366
366
|
}
|
|
367
367
|
});
|
|
368
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
|
+
}
|
|
369
373
|
static byIeeeAddr(databaseID, ieeeAddr, includeDeleted = false) {
|
|
370
374
|
Device.loadFromDatabaseIfNecessary();
|
|
371
375
|
const device = Device.devices.get(databaseID)[ieeeAddr];
|
|
372
376
|
return device?._deleted && !includeDeleted ? undefined : device;
|
|
373
377
|
}
|
|
374
|
-
static byNetworkAddress(networkAddress, databaseID) {
|
|
375
|
-
|
|
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);
|
|
376
381
|
}
|
|
377
382
|
static byType(type, databaseID) {
|
|
378
383
|
return Device.allByDatabaseID(databaseID).filter(d => d.type === type);
|
|
@@ -416,23 +421,23 @@ class Device extends entity_1.default {
|
|
|
416
421
|
async interview() {
|
|
417
422
|
if (this.interviewing) {
|
|
418
423
|
const message = `Interview - interview already in progress for '${this.ieeeAddr}'`;
|
|
419
|
-
debug
|
|
424
|
+
logger_1.logger.debug(message, NS);
|
|
420
425
|
throw new Error(message);
|
|
421
426
|
}
|
|
422
427
|
let error;
|
|
423
428
|
this._interviewing = true;
|
|
424
|
-
debug
|
|
429
|
+
logger_1.logger.debug(`Interview - start device '${this.ieeeAddr}'`, NS);
|
|
425
430
|
try {
|
|
426
431
|
await this.interviewInternal();
|
|
427
|
-
debug
|
|
432
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}'`, NS);
|
|
428
433
|
this._interviewCompleted = true;
|
|
429
434
|
}
|
|
430
435
|
catch (e) {
|
|
431
436
|
if (this.interviewQuirks()) {
|
|
432
|
-
debug
|
|
437
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${e}')`, NS);
|
|
433
438
|
}
|
|
434
439
|
else {
|
|
435
|
-
debug
|
|
440
|
+
logger_1.logger.debug(`Interview - failed for device '${this.ieeeAddr}' with error '${e.stack}'`, NS);
|
|
436
441
|
error = e;
|
|
437
442
|
}
|
|
438
443
|
}
|
|
@@ -445,7 +450,7 @@ class Device extends entity_1.default {
|
|
|
445
450
|
}
|
|
446
451
|
}
|
|
447
452
|
interviewQuirks() {
|
|
448
|
-
debug
|
|
453
|
+
logger_1.logger.debug(`Interview - quirks check for '${this.modelID}'-'${this.manufacturerName}'-'${this.type}'`, NS);
|
|
449
454
|
// TuYa devices are typically hard to interview. They also don't require a full interview to work correctly
|
|
450
455
|
// e.g. no ias enrolling is required for the devices to work.
|
|
451
456
|
// Assume that in case we got both the manufacturerName and modelID the device works correctly.
|
|
@@ -459,7 +464,7 @@ class Device extends entity_1.default {
|
|
|
459
464
|
this._powerSource = this._powerSource || 'Battery';
|
|
460
465
|
this._interviewing = false;
|
|
461
466
|
this._interviewCompleted = true;
|
|
462
|
-
debug
|
|
467
|
+
logger_1.logger.debug(`Interview - quirks matched for TuYa end device`, NS);
|
|
463
468
|
return true;
|
|
464
469
|
}
|
|
465
470
|
// Some devices, e.g. Xiaomi end devices have a different interview procedure, after pairing they
|
|
@@ -482,18 +487,18 @@ class Device extends entity_1.default {
|
|
|
482
487
|
const match = Object.keys(lookup).find((key) => this.modelID && this.modelID.match(key));
|
|
483
488
|
if (match) {
|
|
484
489
|
const info = lookup[match];
|
|
485
|
-
debug
|
|
490
|
+
logger_1.logger.debug(`Interview procedure failed but got modelID matching '${match}', assuming interview succeeded`, NS);
|
|
486
491
|
this._type = this._type === 'Unknown' ? info.type : this._type;
|
|
487
492
|
this._manufacturerID = this._manufacturerID || info.manufacturerID;
|
|
488
493
|
this._manufacturerName = this._manufacturerName || info.manufacturerName;
|
|
489
494
|
this._powerSource = this._powerSource || info.powerSource;
|
|
490
495
|
this._interviewing = false;
|
|
491
496
|
this._interviewCompleted = true;
|
|
492
|
-
debug
|
|
497
|
+
logger_1.logger.debug(`Interview - quirks matched on '${match}'`, NS);
|
|
493
498
|
return true;
|
|
494
499
|
}
|
|
495
500
|
else {
|
|
496
|
-
debug
|
|
501
|
+
logger_1.logger.debug('Interview - quirks did not match', NS);
|
|
497
502
|
return false;
|
|
498
503
|
}
|
|
499
504
|
}
|
|
@@ -502,7 +507,7 @@ class Device extends entity_1.default {
|
|
|
502
507
|
const nodeDescriptor = await entity_1.default.getAdapterByID(this.databaseID).nodeDescriptor(this.networkAddress);
|
|
503
508
|
this._manufacturerID = nodeDescriptor.manufacturerCode;
|
|
504
509
|
this._type = nodeDescriptor.type;
|
|
505
|
-
debug
|
|
510
|
+
logger_1.logger.debug(`Interview - got node descriptor for device '${this.ieeeAddr}'`, NS);
|
|
506
511
|
};
|
|
507
512
|
const hasNodeDescriptor = () => this._manufacturerID != null && this._type != null;
|
|
508
513
|
if (!hasNodeDescriptor()) {
|
|
@@ -513,18 +518,18 @@ class Device extends entity_1.default {
|
|
|
513
518
|
}
|
|
514
519
|
catch (error) {
|
|
515
520
|
if (this.interviewQuirks()) {
|
|
516
|
-
debug
|
|
521
|
+
logger_1.logger.debug(`Interview - completed for device '${this.ieeeAddr}' because of quirks ('${error}')`, NS);
|
|
517
522
|
return;
|
|
518
523
|
}
|
|
519
524
|
else {
|
|
520
525
|
// Most of the times the first node descriptor query fails and the seconds one succeeds.
|
|
521
|
-
debug
|
|
526
|
+
logger_1.logger.debug(`Interview - node descriptor request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
|
|
522
527
|
}
|
|
523
528
|
}
|
|
524
529
|
}
|
|
525
530
|
}
|
|
526
531
|
else {
|
|
527
|
-
debug
|
|
532
|
+
logger_1.logger.debug(`Interview - skip node descriptor request for '${this.ieeeAddr}', already got it`, NS);
|
|
528
533
|
}
|
|
529
534
|
if (!hasNodeDescriptor()) {
|
|
530
535
|
throw new Error(`Interview failed because can not get node descriptor ('${this.ieeeAddr}')`);
|
|
@@ -532,7 +537,7 @@ class Device extends entity_1.default {
|
|
|
532
537
|
if (this.manufacturerID === 4619 && this._type === 'EndDevice') {
|
|
533
538
|
// Give TuYa end device some time to pair. Otherwise they leave immediately.
|
|
534
539
|
// https://github.com/Koenkk/zigbee2mqtt/issues/5814
|
|
535
|
-
debug
|
|
540
|
+
logger_1.logger.debug("Interview - Detected TuYa end device, waiting 10 seconds...", NS);
|
|
536
541
|
await (0, utils_1.Wait)(10000);
|
|
537
542
|
}
|
|
538
543
|
else if ([0, 4098].includes(this.manufacturerID)) {
|
|
@@ -540,7 +545,7 @@ class Device extends entity_1.default {
|
|
|
540
545
|
// In case the device responds, the endoint and modelID/manufacturerName are set
|
|
541
546
|
// in controller.onZclOrRawData()
|
|
542
547
|
// https://github.com/Koenkk/zigbee2mqtt/issues/7553
|
|
543
|
-
debug
|
|
548
|
+
logger_1.logger.debug("Interview - Detected potential TuYa end device, reading modelID and manufacturerName...", NS);
|
|
544
549
|
try {
|
|
545
550
|
const endpoint = endpoint_1.default.create(this.databaseID, 1, undefined, undefined, [], [], this.networkAddress, this.ieeeAddr);
|
|
546
551
|
const result = await endpoint.read('genBasic', ['modelId', 'manufacturerName'], { sendPolicy: 'immediate' });
|
|
@@ -549,7 +554,7 @@ class Device extends entity_1.default {
|
|
|
549
554
|
}
|
|
550
555
|
catch (error) {
|
|
551
556
|
/* istanbul ignore next */
|
|
552
|
-
debug
|
|
557
|
+
logger_1.logger.debug(`Interview - TuYa read modelID and manufacturerName failed (${error})`, NS);
|
|
553
558
|
}
|
|
554
559
|
}
|
|
555
560
|
// e.g. Xiaomi Aqara Opple devices fail to respond to the first active endpoints request, therefore try 2 times
|
|
@@ -562,7 +567,7 @@ class Device extends entity_1.default {
|
|
|
562
567
|
break;
|
|
563
568
|
}
|
|
564
569
|
catch (error) {
|
|
565
|
-
debug
|
|
570
|
+
logger_1.logger.debug(`Interview - active endpoints request failed for '${this.ieeeAddr}', attempt ${attempt + 1}`, NS);
|
|
566
571
|
}
|
|
567
572
|
}
|
|
568
573
|
if (!activeEndpoints) {
|
|
@@ -574,7 +579,7 @@ class Device extends entity_1.default {
|
|
|
574
579
|
// This is not a valid endpoint number according to the ZCL, requesting a simple descriptor will result
|
|
575
580
|
// into an error. Therefore we filter it, more info: https://github.com/Koenkk/zigbee-herdsman/issues/82
|
|
576
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)));
|
|
577
|
-
debug
|
|
582
|
+
logger_1.logger.debug(`Interview - got active endpoints for device '${this.ieeeAddr}'`, NS);
|
|
578
583
|
for (const endpointID of activeEndpoints.endpoints.filter((e) => e !== 0)) {
|
|
579
584
|
const endpoint = this.getEndpoint(endpointID);
|
|
580
585
|
const simpleDescriptor = await adapter.simpleDescriptor(this.networkAddress, endpoint.ID);
|
|
@@ -582,7 +587,7 @@ class Device extends entity_1.default {
|
|
|
582
587
|
endpoint.deviceID = simpleDescriptor.deviceID;
|
|
583
588
|
endpoint.inputClusters = simpleDescriptor.inputClusters;
|
|
584
589
|
endpoint.outputClusters = simpleDescriptor.outputClusters;
|
|
585
|
-
debug
|
|
590
|
+
logger_1.logger.debug(`Interview - got simple descriptor for endpoint '${endpoint.ID}' device '${this.ieeeAddr}'`, NS);
|
|
586
591
|
// Read attributes, nice to have but not required for succesfull pairing as most of the attributes
|
|
587
592
|
// are not mandatory in ZCL specification.
|
|
588
593
|
if (endpoint.supportsInputCluster('genBasic')) {
|
|
@@ -599,8 +604,7 @@ class Device extends entity_1.default {
|
|
|
599
604
|
// https://github.com/Koenkk/zigbee-herdsman-converters/issues/2485.
|
|
600
605
|
// The modelID and manufacturerName are crucial for device identification, so retry.
|
|
601
606
|
if (item.key === 'modelID' || item.key === 'manufacturerName') {
|
|
602
|
-
debug
|
|
603
|
-
`retrying after 10 seconds...`);
|
|
607
|
+
logger_1.logger.debug(`Interview - first ${item.key} retrieval attempt failed, retrying after 10 seconds...`, NS);
|
|
604
608
|
await (0, utils_1.Wait)(10000);
|
|
605
609
|
result = await endpoint.read('genBasic', [key], { sendPolicy: 'immediate' });
|
|
606
610
|
}
|
|
@@ -609,11 +613,10 @@ class Device extends entity_1.default {
|
|
|
609
613
|
}
|
|
610
614
|
}
|
|
611
615
|
item.set(result[key], this);
|
|
612
|
-
debug
|
|
616
|
+
logger_1.logger.debug(`Interview - got '${item.key}' for device '${this.ieeeAddr}'`, NS);
|
|
613
617
|
}
|
|
614
618
|
catch (error) {
|
|
615
|
-
debug
|
|
616
|
-
`endpoint '${endpoint.ID}' (${error})`);
|
|
619
|
+
logger_1.logger.debug(`Interview - failed to read attribute '${item.key}' from endpoint '${endpoint.ID}' (${error})`, NS);
|
|
617
620
|
}
|
|
618
621
|
}
|
|
619
622
|
}
|
|
@@ -622,14 +625,14 @@ class Device extends entity_1.default {
|
|
|
622
625
|
const coordinator = Device.byType('Coordinator', this.databaseID)[0];
|
|
623
626
|
// Enroll IAS device
|
|
624
627
|
for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('ssIasZone'))) {
|
|
625
|
-
debug
|
|
628
|
+
logger_1.logger.debug(`Interview - IAS - enrolling '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
626
629
|
const stateBefore = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
|
|
627
|
-
debug
|
|
630
|
+
logger_1.logger.debug(`Interview - IAS - before enrolling state: '${JSON.stringify(stateBefore)}'`, NS);
|
|
628
631
|
// Do not enroll when device has already been enrolled
|
|
629
632
|
if (stateBefore.zoneState !== 1 || stateBefore.iasCieAddr !== coordinator.ieeeAddr) {
|
|
630
|
-
debug
|
|
633
|
+
logger_1.logger.debug(`Interview - IAS - not enrolled, enrolling`, NS);
|
|
631
634
|
await endpoint.write('ssIasZone', { 'iasCieAddr': coordinator.ieeeAddr }, { sendPolicy: 'immediate' });
|
|
632
|
-
debug
|
|
635
|
+
logger_1.logger.debug(`Interview - IAS - wrote iasCieAddr`, NS);
|
|
633
636
|
// There are 2 enrollment procedures:
|
|
634
637
|
// - Auto enroll: coordinator has to send enrollResponse without receiving an enroll request
|
|
635
638
|
// this case is handled below.
|
|
@@ -637,34 +640,34 @@ class Device extends entity_1.default {
|
|
|
637
640
|
// this case in hanled in onZclData().
|
|
638
641
|
// https://github.com/Koenkk/zigbee2mqtt/issues/4569#issuecomment-706075676
|
|
639
642
|
await (0, utils_1.Wait)(500);
|
|
640
|
-
debug
|
|
643
|
+
logger_1.logger.debug(`IAS - '${this.ieeeAddr}' sending enroll response (auto enroll)`, NS);
|
|
641
644
|
const payload = { enrollrspcode: 0, zoneid: 23 };
|
|
642
645
|
await endpoint.command('ssIasZone', 'enrollRsp', payload, { disableDefaultResponse: true, sendPolicy: 'immediate' });
|
|
643
646
|
let enrolled = false;
|
|
644
647
|
for (let attempt = 0; attempt < 20; attempt++) {
|
|
645
648
|
await (0, utils_1.Wait)(500);
|
|
646
649
|
const stateAfter = await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState'], { sendPolicy: 'immediate' });
|
|
647
|
-
debug
|
|
650
|
+
logger_1.logger.debug(`Interview - IAS - after enrolling state (${attempt}): '${JSON.stringify(stateAfter)}'`, NS);
|
|
648
651
|
if (stateAfter.zoneState === 1) {
|
|
649
652
|
enrolled = true;
|
|
650
653
|
break;
|
|
651
654
|
}
|
|
652
655
|
}
|
|
653
656
|
if (enrolled) {
|
|
654
|
-
debug
|
|
657
|
+
logger_1.logger.debug(`Interview - IAS successfully enrolled '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
655
658
|
}
|
|
656
659
|
else {
|
|
657
660
|
throw new Error(`Interview failed because of failed IAS enroll (zoneState didn't change ('${this.ieeeAddr}')`);
|
|
658
661
|
}
|
|
659
662
|
}
|
|
660
663
|
else {
|
|
661
|
-
debug
|
|
664
|
+
logger_1.logger.debug(`Interview - IAS - already enrolled, skipping enroll`, NS);
|
|
662
665
|
}
|
|
663
666
|
}
|
|
664
667
|
// Bind poll control
|
|
665
668
|
try {
|
|
666
669
|
for (const endpoint of this.endpoints.filter((e) => e.supportsInputCluster('genPollCtrl'))) {
|
|
667
|
-
debug
|
|
670
|
+
logger_1.logger.debug(`Interview - Poll control - binding '${this.ieeeAddr}' endpoint '${endpoint.ID}'`, NS);
|
|
668
671
|
await endpoint.bind('genPollCtrl', coordinator.endpoints[0]);
|
|
669
672
|
const pollPeriod = await endpoint.read('genPollCtrl', ['checkinInterval'], { sendPolicy: 'immediate' });
|
|
670
673
|
this._checkinInterval = pollPeriod.checkinInterval / 4; // convert to seconds
|
|
@@ -673,7 +676,7 @@ class Device extends entity_1.default {
|
|
|
673
676
|
}
|
|
674
677
|
catch (error) {
|
|
675
678
|
/* istanbul ignore next */
|
|
676
|
-
debug
|
|
679
|
+
logger_1.logger.debug(`Interview - failed to bind genPollCtrl (${error})`, NS);
|
|
677
680
|
}
|
|
678
681
|
}
|
|
679
682
|
async removeFromNetwork() {
|
|
@@ -682,8 +685,8 @@ class Device extends entity_1.default {
|
|
|
682
685
|
options: 0x002550,
|
|
683
686
|
srcID: Number(this.ieeeAddr),
|
|
684
687
|
};
|
|
685
|
-
const frame = Zcl.
|
|
686
|
-
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);
|
|
687
690
|
}
|
|
688
691
|
else
|
|
689
692
|
await entity_1.default.getAdapterByID(this.databaseID).removeDevice(this.networkAddress, this.ieeeAddr);
|
|
@@ -722,6 +725,22 @@ class Device extends entity_1.default {
|
|
|
722
725
|
const endpoint = this.endpoints.find((ep) => ep.inputClusters.includes(0)) ?? this.endpoints[0];
|
|
723
726
|
await endpoint.read('genBasic', ['zclVersion'], { disableRecovery });
|
|
724
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
|
+
}
|
|
725
744
|
}
|
|
726
745
|
exports.default = Device;
|
|
727
746
|
//# sourceMappingURL=device.js.map
|