@willieee802/zigbee-herdsman 0.49.0 → 0.49.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 +38 -0
- package/biome.json +1 -1
- package/dist/adapter/adapter.d.ts +66 -0
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapter.js +110 -0
- package/dist/adapter/adapter.js.map +1 -0
- package/dist/adapter/adapterDiscovery.d.ts +34 -0
- package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
- package/dist/adapter/adapterDiscovery.js +646 -0
- package/dist/adapter/adapterDiscovery.js.map +1 -0
- package/dist/adapter/const.d.ts +9 -0
- package/dist/adapter/const.d.ts.map +1 -0
- package/dist/adapter/const.js +48 -0
- package/dist/adapter/const.js.map +1 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +61 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.js +719 -0
- package/dist/adapter/deconz/adapter/deconzAdapter.js.map +1 -0
- package/dist/adapter/deconz/driver/constants.d.ts +210 -0
- package/dist/adapter/deconz/driver/constants.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/constants.js +139 -0
- package/dist/adapter/deconz/driver/constants.js.map +1 -0
- package/dist/adapter/deconz/driver/driver.d.ts +111 -0
- package/dist/adapter/deconz/driver/driver.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/driver.js +1362 -0
- package/dist/adapter/deconz/driver/driver.js.map +1 -0
- package/dist/adapter/deconz/driver/frame.d.ts +6 -0
- package/dist/adapter/deconz/driver/frame.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/frame.js +13 -0
- package/dist/adapter/deconz/driver/frame.js.map +1 -0
- package/dist/adapter/deconz/driver/frameParser.d.ts +5 -0
- package/dist/adapter/deconz/driver/frameParser.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/frameParser.js +700 -0
- package/dist/adapter/deconz/driver/frameParser.js.map +1 -0
- package/dist/adapter/deconz/driver/parser.d.ts +10 -0
- package/dist/adapter/deconz/driver/parser.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/parser.js +39 -0
- package/dist/adapter/deconz/driver/parser.js.map +1 -0
- package/dist/adapter/deconz/driver/writer.d.ts +8 -0
- package/dist/adapter/deconz/driver/writer.d.ts.map +1 -0
- package/dist/adapter/deconz/driver/writer.js +53 -0
- package/dist/adapter/deconz/driver/writer.js.map +1 -0
- package/dist/adapter/ember/adapter/emberAdapter.d.ts +338 -0
- package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/emberAdapter.js +1663 -0
- package/dist/adapter/ember/adapter/emberAdapter.js.map +1 -0
- package/dist/adapter/ember/adapter/endpoints.d.ts +27 -0
- package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/endpoints.js +69 -0
- package/dist/adapter/ember/adapter/endpoints.js.map +1 -0
- package/dist/adapter/ember/adapter/oneWaitress.d.ts +112 -0
- package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/oneWaitress.js +233 -0
- package/dist/adapter/ember/adapter/oneWaitress.js.map +1 -0
- package/dist/adapter/ember/adapter/tokensManager.d.ts +69 -0
- package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -0
- package/dist/adapter/ember/adapter/tokensManager.js +684 -0
- package/dist/adapter/ember/adapter/tokensManager.js.map +1 -0
- package/dist/adapter/ember/consts.d.ts +107 -0
- package/dist/adapter/ember/consts.d.ts.map +1 -0
- package/dist/adapter/ember/consts.js +155 -0
- package/dist/adapter/ember/consts.js.map +1 -0
- package/dist/adapter/ember/enums.d.ts +1568 -0
- package/dist/adapter/ember/enums.d.ts.map +1 -0
- package/dist/adapter/ember/enums.js +1697 -0
- package/dist/adapter/ember/enums.js.map +1 -0
- package/dist/adapter/ember/ezsp/buffalo.d.ts +166 -0
- package/dist/adapter/ember/ezsp/buffalo.d.ts.map +1 -0
- package/dist/adapter/ember/ezsp/buffalo.js +1133 -0
- package/dist/adapter/ember/ezsp/buffalo.js.map +1 -0
- package/dist/adapter/ember/ezsp/consts.d.ts +117 -0
- package/dist/adapter/ember/ezsp/consts.d.ts.map +1 -0
- package/dist/adapter/ember/ezsp/consts.js +129 -0
- package/dist/adapter/ember/ezsp/consts.js.map +1 -0
- package/dist/adapter/ember/ezsp/enums.d.ts +1016 -0
- package/dist/adapter/ember/ezsp/enums.d.ts.map +1 -0
- package/dist/adapter/ember/ezsp/enums.js +1103 -0
- package/dist/adapter/ember/ezsp/enums.js.map +1 -0
- package/dist/adapter/ember/ezsp/ezsp.d.ts +2951 -0
- package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -0
- package/dist/adapter/ember/ezsp/ezsp.js +7119 -0
- package/dist/adapter/ember/ezsp/ezsp.js.map +1 -0
- package/dist/adapter/ember/ezspError.d.ts +6 -0
- package/dist/adapter/ember/ezspError.d.ts.map +1 -0
- package/dist/adapter/ember/ezspError.js +13 -0
- package/dist/adapter/ember/ezspError.js.map +1 -0
- package/dist/adapter/ember/types.d.ts +787 -0
- package/dist/adapter/ember/types.d.ts.map +1 -0
- package/dist/adapter/ember/types.js +3 -0
- package/dist/adapter/ember/types.js.map +1 -0
- package/dist/adapter/ember/uart/ash.d.ts +434 -0
- package/dist/adapter/ember/uart/ash.d.ts.map +1 -0
- package/dist/adapter/ember/uart/ash.js +1561 -0
- package/dist/adapter/ember/uart/ash.js.map +1 -0
- package/dist/adapter/ember/uart/consts.d.ts +91 -0
- package/dist/adapter/ember/uart/consts.d.ts.map +1 -0
- package/dist/adapter/ember/uart/consts.js +100 -0
- package/dist/adapter/ember/uart/consts.js.map +1 -0
- package/dist/adapter/ember/uart/enums.d.ts +191 -0
- package/dist/adapter/ember/uart/enums.d.ts.map +1 -0
- package/dist/adapter/ember/uart/enums.js +156 -0
- package/dist/adapter/ember/uart/enums.js.map +1 -0
- package/dist/adapter/ember/uart/parser.d.ts +7 -0
- package/dist/adapter/ember/uart/parser.d.ts.map +1 -0
- package/dist/adapter/ember/uart/parser.js +32 -0
- package/dist/adapter/ember/uart/parser.js.map +1 -0
- package/dist/adapter/ember/uart/queues.d.ts +84 -0
- package/dist/adapter/ember/uart/queues.d.ts.map +1 -0
- package/dist/adapter/ember/uart/queues.js +213 -0
- package/dist/adapter/ember/uart/queues.js.map +1 -0
- package/dist/adapter/ember/uart/writer.d.ts +13 -0
- package/dist/adapter/ember/uart/writer.d.ts.map +1 -0
- package/dist/adapter/ember/uart/writer.js +42 -0
- package/dist/adapter/ember/uart/writer.js.map +1 -0
- package/dist/adapter/ember/utils/initters.d.ts +20 -0
- package/dist/adapter/ember/utils/initters.d.ts.map +1 -0
- package/dist/adapter/ember/utils/initters.js +92 -0
- package/dist/adapter/ember/utils/initters.js.map +1 -0
- package/dist/adapter/ember/utils/math.d.ts +41 -0
- package/dist/adapter/ember/utils/math.d.ts.map +1 -0
- package/dist/adapter/ember/utils/math.js +80 -0
- package/dist/adapter/ember/utils/math.js.map +1 -0
- package/dist/adapter/events.d.ts +24 -0
- package/dist/adapter/events.d.ts.map +1 -0
- package/dist/adapter/events.js +3 -0
- package/dist/adapter/events.js.map +1 -0
- package/dist/adapter/ezsp/adapter/backup.d.ts +13 -0
- package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -0
- package/dist/adapter/ezsp/adapter/backup.js +89 -0
- package/dist/adapter/ezsp/adapter/backup.js.map +1 -0
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +53 -0
- package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -0
- package/dist/adapter/ezsp/adapter/ezspAdapter.js +464 -0
- package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +1 -0
- package/dist/adapter/ezsp/driver/commands.d.ts +37 -0
- package/dist/adapter/ezsp/driver/commands.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/commands.js +2387 -0
- package/dist/adapter/ezsp/driver/commands.js.map +1 -0
- package/dist/adapter/ezsp/driver/consts.d.ts +11 -0
- package/dist/adapter/ezsp/driver/consts.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/consts.js +14 -0
- package/dist/adapter/ezsp/driver/consts.js.map +1 -0
- package/dist/adapter/ezsp/driver/driver.d.ts +96 -0
- package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/driver.js +852 -0
- package/dist/adapter/ezsp/driver/driver.js.map +1 -0
- package/dist/adapter/ezsp/driver/ezsp.d.ts +104 -0
- package/dist/adapter/ezsp/driver/ezsp.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/ezsp.js +678 -0
- package/dist/adapter/ezsp/driver/ezsp.js.map +1 -0
- package/dist/adapter/ezsp/driver/frame.d.ts +39 -0
- package/dist/adapter/ezsp/driver/frame.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/frame.js +101 -0
- package/dist/adapter/ezsp/driver/frame.js.map +1 -0
- package/dist/adapter/ezsp/driver/index.d.ts +4 -0
- package/dist/adapter/ezsp/driver/index.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/index.js +8 -0
- package/dist/adapter/ezsp/driver/index.js.map +1 -0
- package/dist/adapter/ezsp/driver/multicast.d.ts +16 -0
- package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/multicast.js +74 -0
- package/dist/adapter/ezsp/driver/multicast.js.map +1 -0
- package/dist/adapter/ezsp/driver/parser.d.ts +9 -0
- package/dist/adapter/ezsp/driver/parser.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/parser.js +109 -0
- package/dist/adapter/ezsp/driver/parser.js.map +1 -0
- package/dist/adapter/ezsp/driver/types/basic.d.ts +62 -0
- package/dist/adapter/ezsp/driver/types/basic.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/types/basic.js +187 -0
- package/dist/adapter/ezsp/driver/types/basic.js.map +1 -0
- package/dist/adapter/ezsp/driver/types/index.d.ts +9 -0
- package/dist/adapter/ezsp/driver/types/index.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/types/index.js +137 -0
- package/dist/adapter/ezsp/driver/types/index.js.map +1 -0
- package/dist/adapter/ezsp/driver/types/named.d.ts +1287 -0
- package/dist/adapter/ezsp/driver/types/named.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/types/named.js +2337 -0
- package/dist/adapter/ezsp/driver/types/named.js.map +1 -0
- package/dist/adapter/ezsp/driver/types/struct.d.ts +270 -0
- package/dist/adapter/ezsp/driver/types/struct.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/types/struct.js +869 -0
- package/dist/adapter/ezsp/driver/types/struct.js.map +1 -0
- package/dist/adapter/ezsp/driver/uart.d.ts +46 -0
- package/dist/adapter/ezsp/driver/uart.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/uart.js +390 -0
- package/dist/adapter/ezsp/driver/uart.js.map +1 -0
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +5 -0
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +37 -0
- package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +1 -0
- package/dist/adapter/ezsp/driver/utils/index.d.ts +5 -0
- package/dist/adapter/ezsp/driver/utils/index.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/utils/index.js +35 -0
- package/dist/adapter/ezsp/driver/utils/index.js.map +1 -0
- package/dist/adapter/ezsp/driver/writer.d.ts +12 -0
- package/dist/adapter/ezsp/driver/writer.d.ts.map +1 -0
- package/dist/adapter/ezsp/driver/writer.js +92 -0
- package/dist/adapter/ezsp/driver/writer.js.map +1 -0
- package/dist/adapter/index.d.ts +4 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +41 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/serialPort.d.ts +19 -0
- package/dist/adapter/serialPort.d.ts.map +1 -0
- package/dist/adapter/serialPort.js +51 -0
- package/dist/adapter/serialPort.js.map +1 -0
- package/dist/adapter/tstype.d.ts +52 -0
- package/dist/adapter/tstype.d.ts.map +1 -0
- package/dist/adapter/tstype.js +3 -0
- package/dist/adapter/tstype.js.map +1 -0
- package/dist/adapter/utils.d.ts +8 -0
- package/dist/adapter/utils.d.ts.map +1 -0
- package/dist/adapter/utils.js +42 -0
- package/dist/adapter/utils.js.map +1 -0
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +62 -0
- package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/adapter-backup.js +469 -0
- package/dist/adapter/z-stack/adapter/adapter-backup.js.map +1 -0
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +150 -0
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +279 -0
- package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +1 -0
- package/dist/adapter/z-stack/adapter/endpoints.d.ts +12 -0
- package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/endpoints.js +87 -0
- package/dist/adapter/z-stack/adapter/endpoints.js.map +1 -0
- package/dist/adapter/z-stack/adapter/manager.d.ts +86 -0
- package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/manager.js +493 -0
- package/dist/adapter/z-stack/adapter/manager.js.map +1 -0
- package/dist/adapter/z-stack/adapter/tstype.d.ts +7 -0
- package/dist/adapter/z-stack/adapter/tstype.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/tstype.js +10 -0
- package/dist/adapter/z-stack/adapter/tstype.js.map +1 -0
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +85 -0
- package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -0
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +924 -0
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -0
- package/dist/adapter/z-stack/constants/af.d.ts +24 -0
- package/dist/adapter/z-stack/constants/af.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/af.js +28 -0
- package/dist/adapter/z-stack/constants/af.js.map +1 -0
- package/dist/adapter/z-stack/constants/common.d.ts +279 -0
- package/dist/adapter/z-stack/constants/common.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/common.js +290 -0
- package/dist/adapter/z-stack/constants/common.js.map +1 -0
- package/dist/adapter/z-stack/constants/dbg.d.ts +23 -0
- package/dist/adapter/z-stack/constants/dbg.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/dbg.js +25 -0
- package/dist/adapter/z-stack/constants/dbg.js.map +1 -0
- package/dist/adapter/z-stack/constants/index.d.ts +11 -0
- package/dist/adapter/z-stack/constants/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/index.js +58 -0
- package/dist/adapter/z-stack/constants/index.js.map +1 -0
- package/dist/adapter/z-stack/constants/mac.d.ts +128 -0
- package/dist/adapter/z-stack/constants/mac.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/mac.js +130 -0
- package/dist/adapter/z-stack/constants/mac.js.map +1 -0
- package/dist/adapter/z-stack/constants/sapi.d.ts +25 -0
- package/dist/adapter/z-stack/constants/sapi.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/sapi.js +27 -0
- package/dist/adapter/z-stack/constants/sapi.js.map +1 -0
- package/dist/adapter/z-stack/constants/sys.d.ts +72 -0
- package/dist/adapter/z-stack/constants/sys.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/sys.js +74 -0
- package/dist/adapter/z-stack/constants/sys.js.map +1 -0
- package/dist/adapter/z-stack/constants/util.d.ts +82 -0
- package/dist/adapter/z-stack/constants/util.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/util.js +84 -0
- package/dist/adapter/z-stack/constants/util.js.map +1 -0
- package/dist/adapter/z-stack/constants/utils.d.ts +5 -0
- package/dist/adapter/z-stack/constants/utils.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/utils.js +14 -0
- package/dist/adapter/z-stack/constants/utils.js.map +1 -0
- package/dist/adapter/z-stack/constants/zdo.d.ts +103 -0
- package/dist/adapter/z-stack/constants/zdo.d.ts.map +1 -0
- package/dist/adapter/z-stack/constants/zdo.js +105 -0
- package/dist/adapter/z-stack/constants/zdo.js.map +1 -0
- package/dist/adapter/z-stack/models/startup-options.d.ts +13 -0
- package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -0
- package/dist/adapter/z-stack/models/startup-options.js +3 -0
- package/dist/adapter/z-stack/models/startup-options.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +23 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +43 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-table.js +24 -0
- package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +16 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +25 -0
- package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +23 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +25 -0
- package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +8 -0
- package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/channel-list.js +12 -0
- package/dist/adapter/z-stack/structs/entries/channel-list.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +8 -0
- package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/has-configured.js +22 -0
- package/dist/adapter/z-stack/structs/entries/has-configured.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/index.d.ts +17 -0
- package/dist/adapter/z-stack/structs/entries/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/index.js +33 -0
- package/dist/adapter/z-stack/structs/entries/index.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nib.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nib.js +72 -0
- package/dist/adapter/z-stack/structs/entries/nib.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +21 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +8 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key.js +19 -0
- package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +8 -0
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +12 -0
- package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +13 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +22 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +24 -0
- package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +20 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +35 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +1 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +10 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-table.js +25 -0
- package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +1 -0
- package/dist/adapter/z-stack/structs/index.d.ts +5 -0
- package/dist/adapter/z-stack/structs/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/index.js +21 -0
- package/dist/adapter/z-stack/structs/index.js.map +1 -0
- package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +13 -0
- package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/serializable-memory-object.js +3 -0
- package/dist/adapter/z-stack/structs/serializable-memory-object.js.map +1 -0
- package/dist/adapter/z-stack/structs/struct.d.ts +99 -0
- package/dist/adapter/z-stack/structs/struct.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/struct.js +308 -0
- package/dist/adapter/z-stack/structs/struct.js.map +1 -0
- package/dist/adapter/z-stack/structs/table.d.ts +94 -0
- package/dist/adapter/z-stack/structs/table.d.ts.map +1 -0
- package/dist/adapter/z-stack/structs/table.js +167 -0
- package/dist/adapter/z-stack/structs/table.js.map +1 -0
- package/dist/adapter/z-stack/unpi/constants.d.ts +29 -0
- package/dist/adapter/z-stack/unpi/constants.d.ts.map +1 -0
- package/dist/adapter/z-stack/unpi/constants.js +40 -0
- package/dist/adapter/z-stack/unpi/constants.js.map +1 -0
- package/dist/adapter/z-stack/unpi/frame.d.ts +15 -0
- package/dist/adapter/z-stack/unpi/frame.d.ts.map +1 -0
- package/dist/adapter/z-stack/unpi/frame.js +53 -0
- package/dist/adapter/z-stack/unpi/frame.js.map +1 -0
- package/dist/adapter/z-stack/unpi/index.d.ts +5 -0
- package/dist/adapter/z-stack/unpi/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/unpi/index.js +44 -0
- package/dist/adapter/z-stack/unpi/index.js.map +1 -0
- package/dist/adapter/z-stack/unpi/parser.d.ts +10 -0
- package/dist/adapter/z-stack/unpi/parser.d.ts.map +1 -0
- package/dist/adapter/z-stack/unpi/parser.js +94 -0
- package/dist/adapter/z-stack/unpi/parser.js.map +1 -0
- package/dist/adapter/z-stack/unpi/writer.d.ts +9 -0
- package/dist/adapter/z-stack/unpi/writer.d.ts.map +1 -0
- package/dist/adapter/z-stack/unpi/writer.js +66 -0
- package/dist/adapter/z-stack/unpi/writer.js.map +1 -0
- package/dist/adapter/z-stack/utils/channel-list.d.ts +21 -0
- package/dist/adapter/z-stack/utils/channel-list.d.ts.map +1 -0
- package/dist/adapter/z-stack/utils/channel-list.js +45 -0
- package/dist/adapter/z-stack/utils/channel-list.js.map +1 -0
- package/dist/adapter/z-stack/utils/index.d.ts +3 -0
- package/dist/adapter/z-stack/utils/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/utils/index.js +19 -0
- package/dist/adapter/z-stack/utils/index.js.map +1 -0
- package/dist/adapter/z-stack/utils/network-options.d.ts +9 -0
- package/dist/adapter/z-stack/utils/network-options.d.ts.map +1 -0
- package/dist/adapter/z-stack/utils/network-options.js +22 -0
- package/dist/adapter/z-stack/utils/network-options.js.map +1 -0
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +10 -0
- package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/buffaloZnp.js +162 -0
- package/dist/adapter/z-stack/znp/buffaloZnp.js.map +1 -0
- package/dist/adapter/z-stack/znp/definition.d.ts +18 -0
- package/dist/adapter/z-stack/znp/definition.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/definition.js +2703 -0
- package/dist/adapter/z-stack/znp/definition.js.map +1 -0
- package/dist/adapter/z-stack/znp/index.d.ts +3 -0
- package/dist/adapter/z-stack/znp/index.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/index.js +8 -0
- package/dist/adapter/z-stack/znp/index.js.map +1 -0
- package/dist/adapter/z-stack/znp/parameterType.d.ts +19 -0
- package/dist/adapter/z-stack/znp/parameterType.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/parameterType.js +22 -0
- package/dist/adapter/z-stack/znp/parameterType.js.map +1 -0
- package/dist/adapter/z-stack/znp/tstype.d.ts +40 -0
- package/dist/adapter/z-stack/znp/tstype.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/tstype.js +3 -0
- package/dist/adapter/z-stack/znp/tstype.js.map +1 -0
- package/dist/adapter/z-stack/znp/utils.d.ts +4 -0
- package/dist/adapter/z-stack/znp/utils.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/utils.js +12 -0
- package/dist/adapter/z-stack/znp/utils.js.map +1 -0
- package/dist/adapter/z-stack/znp/znp.d.ts +43 -0
- package/dist/adapter/z-stack/znp/znp.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/znp.js +295 -0
- package/dist/adapter/z-stack/znp/znp.js.map +1 -0
- package/dist/adapter/z-stack/znp/zpiObject.d.ts +19 -0
- package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +1 -0
- package/dist/adapter/z-stack/znp/zpiObject.js +121 -0
- package/dist/adapter/z-stack/znp/zpiObject.js.map +1 -0
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts +44 -0
- package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
- package/dist/adapter/zboss/adapter/zbossAdapter.js +365 -0
- package/dist/adapter/zboss/adapter/zbossAdapter.js.map +1 -0
- package/dist/adapter/zboss/commands.d.ts +20 -0
- package/dist/adapter/zboss/commands.d.ts.map +1 -0
- package/dist/adapter/zboss/commands.js +1141 -0
- package/dist/adapter/zboss/commands.js.map +1 -0
- package/dist/adapter/zboss/consts.d.ts +9 -0
- package/dist/adapter/zboss/consts.d.ts.map +1 -0
- package/dist/adapter/zboss/consts.js +12 -0
- package/dist/adapter/zboss/consts.js.map +1 -0
- package/dist/adapter/zboss/driver.d.ts +55 -0
- package/dist/adapter/zboss/driver.d.ts.map +1 -0
- package/dist/adapter/zboss/driver.js +358 -0
- package/dist/adapter/zboss/driver.js.map +1 -0
- package/dist/adapter/zboss/enums.d.ts +301 -0
- package/dist/adapter/zboss/enums.d.ts.map +1 -0
- package/dist/adapter/zboss/enums.js +359 -0
- package/dist/adapter/zboss/enums.js.map +1 -0
- package/dist/adapter/zboss/frame.d.ts +34 -0
- package/dist/adapter/zboss/frame.d.ts.map +1 -0
- package/dist/adapter/zboss/frame.js +200 -0
- package/dist/adapter/zboss/frame.js.map +1 -0
- package/dist/adapter/zboss/reader.d.ts +8 -0
- package/dist/adapter/zboss/reader.d.ts.map +1 -0
- package/dist/adapter/zboss/reader.js +59 -0
- package/dist/adapter/zboss/reader.js.map +1 -0
- package/dist/adapter/zboss/types.d.ts +2 -0
- package/dist/adapter/zboss/types.d.ts.map +1 -0
- package/dist/adapter/zboss/types.js +3 -0
- package/dist/adapter/zboss/types.js.map +1 -0
- package/dist/adapter/zboss/uart.d.ts +38 -0
- package/dist/adapter/zboss/uart.d.ts.map +1 -0
- package/dist/adapter/zboss/uart.js +373 -0
- package/dist/adapter/zboss/uart.js.map +1 -0
- package/dist/adapter/zboss/utils.d.ts +9 -0
- package/dist/adapter/zboss/utils.d.ts.map +1 -0
- package/dist/adapter/zboss/utils.js +56 -0
- package/dist/adapter/zboss/utils.js.map +1 -0
- package/dist/adapter/zboss/writer.d.ts +14 -0
- package/dist/adapter/zboss/writer.d.ts.map +1 -0
- package/dist/adapter/zboss/writer.js +41 -0
- package/dist/adapter/zboss/writer.js.map +1 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.d.ts +5 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.d.ts.map +1 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js +26 -0
- package/dist/adapter/zigate/adapter/patchZdoBuffaloBE.js.map +1 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +63 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.js +462 -0
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +22 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.js +198 -0
- package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -0
- package/dist/adapter/zigate/driver/commandType.d.ts +42 -0
- package/dist/adapter/zigate/driver/commandType.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/commandType.js +381 -0
- package/dist/adapter/zigate/driver/commandType.js.map +1 -0
- package/dist/adapter/zigate/driver/constants.d.ts +116 -0
- package/dist/adapter/zigate/driver/constants.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/constants.js +147 -0
- package/dist/adapter/zigate/driver/constants.js.map +1 -0
- package/dist/adapter/zigate/driver/frame.d.ts +26 -0
- package/dist/adapter/zigate/driver/frame.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/frame.js +161 -0
- package/dist/adapter/zigate/driver/frame.js.map +1 -0
- package/dist/adapter/zigate/driver/messageType.d.ts +13 -0
- package/dist/adapter/zigate/driver/messageType.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/messageType.js +281 -0
- package/dist/adapter/zigate/driver/messageType.js.map +1 -0
- package/dist/adapter/zigate/driver/parameterType.d.ts +25 -0
- package/dist/adapter/zigate/driver/parameterType.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/parameterType.js +31 -0
- package/dist/adapter/zigate/driver/parameterType.js.map +1 -0
- package/dist/adapter/zigate/driver/ziGateObject.d.ts +23 -0
- package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/ziGateObject.js +117 -0
- package/dist/adapter/zigate/driver/ziGateObject.js.map +1 -0
- package/dist/adapter/zigate/driver/zigate.d.ts +47 -0
- package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -0
- package/dist/adapter/zigate/driver/zigate.js +364 -0
- package/dist/adapter/zigate/driver/zigate.js.map +1 -0
- package/dist/adapter/zoh/adapter/utils.d.ts +16 -0
- package/dist/adapter/zoh/adapter/utils.d.ts.map +1 -0
- package/dist/adapter/zoh/adapter/utils.js +31 -0
- package/dist/adapter/zoh/adapter/utils.js.map +1 -0
- package/dist/adapter/zoh/adapter/zohAdapter.d.ts +100 -0
- package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
- package/dist/adapter/zoh/adapter/zohAdapter.js +715 -0
- package/dist/adapter/zoh/adapter/zohAdapter.js.map +1 -0
- package/dist/buffalo/buffalo.d.ts +67 -0
- package/dist/buffalo/buffalo.d.ts.map +1 -0
- package/dist/buffalo/buffalo.js +275 -0
- package/dist/buffalo/buffalo.js.map +1 -0
- package/dist/buffalo/index.d.ts +2 -0
- package/dist/buffalo/index.d.ts.map +1 -0
- package/dist/buffalo/index.js +6 -0
- package/dist/buffalo/index.js.map +1 -0
- package/dist/controller/controller.d.ts +155 -0
- package/dist/controller/controller.d.ts.map +1 -0
- package/dist/controller/controller.js +874 -0
- package/dist/controller/controller.js.map +1 -0
- package/dist/controller/database.d.ts +21 -0
- package/dist/controller/database.d.ts.map +1 -0
- package/dist/controller/database.js +128 -0
- package/dist/controller/database.js.map +1 -0
- package/dist/controller/events.d.ts +44 -0
- package/dist/controller/events.d.ts.map +1 -0
- package/dist/controller/events.js +3 -0
- package/dist/controller/events.js.map +1 -0
- package/dist/controller/greenPower.d.ts +78 -0
- package/dist/controller/greenPower.d.ts.map +1 -0
- package/dist/controller/greenPower.js +425 -0
- package/dist/controller/greenPower.js.map +1 -0
- package/dist/controller/helpers/index.d.ts +2 -0
- package/dist/controller/helpers/index.d.ts.map +1 -0
- package/dist/controller/helpers/index.js +38 -0
- package/dist/controller/helpers/index.js.map +1 -0
- package/dist/controller/helpers/installCodes.d.ts +27 -0
- package/dist/controller/helpers/installCodes.d.ts.map +1 -0
- package/dist/controller/helpers/installCodes.js +90 -0
- package/dist/controller/helpers/installCodes.js.map +1 -0
- package/dist/controller/helpers/ota.d.ts +53 -0
- package/dist/controller/helpers/ota.d.ts.map +1 -0
- package/dist/controller/helpers/ota.js +467 -0
- package/dist/controller/helpers/ota.js.map +1 -0
- package/dist/controller/helpers/request.d.ts +22 -0
- package/dist/controller/helpers/request.d.ts.map +1 -0
- package/dist/controller/helpers/request.js +82 -0
- package/dist/controller/helpers/request.js.map +1 -0
- package/dist/controller/helpers/requestQueue.d.ts +13 -0
- package/dist/controller/helpers/requestQueue.d.ts.map +1 -0
- package/dist/controller/helpers/requestQueue.js +109 -0
- package/dist/controller/helpers/requestQueue.js.map +1 -0
- package/dist/controller/helpers/zclFrameConverter.d.ts +7 -0
- package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -0
- package/dist/controller/helpers/zclFrameConverter.js +84 -0
- package/dist/controller/helpers/zclFrameConverter.js.map +1 -0
- package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +8 -0
- package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +1 -0
- package/dist/controller/helpers/zclTransactionSequenceNumber.js +14 -0
- package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +1 -0
- package/dist/controller/index.d.ts +6 -0
- package/dist/controller/index.d.ts.map +1 -0
- package/dist/controller/index.js +9 -0
- package/dist/controller/index.js.map +1 -0
- package/dist/controller/model/device.d.ts +150 -0
- package/dist/controller/model/device.d.ts.map +1 -0
- package/dist/controller/model/device.js +1396 -0
- package/dist/controller/model/device.js.map +1 -0
- package/dist/controller/model/endpoint.d.ts +150 -0
- package/dist/controller/model/endpoint.d.ts.map +1 -0
- package/dist/controller/model/endpoint.js +822 -0
- package/dist/controller/model/endpoint.js.map +1 -0
- package/dist/controller/model/entity.d.ts +18 -0
- package/dist/controller/model/entity.d.ts.map +1 -0
- package/dist/controller/model/entity.js +35 -0
- package/dist/controller/model/entity.js.map +1 -0
- package/dist/controller/model/group.d.ts +50 -0
- package/dist/controller/model/group.d.ts.map +1 -0
- package/dist/controller/model/group.js +343 -0
- package/dist/controller/model/group.js.map +1 -0
- package/dist/controller/model/index.d.ts +6 -0
- package/dist/controller/model/index.d.ts.map +1 -0
- package/dist/controller/model/index.js +14 -0
- package/dist/controller/model/index.js.map +1 -0
- package/dist/controller/model/konnextConfig.d.ts +7 -0
- package/dist/controller/model/konnextConfig.d.ts.map +1 -0
- package/dist/controller/model/konnextConfig.js +3 -0
- package/dist/controller/model/konnextConfig.js.map +1 -0
- package/dist/controller/model/zigbeeEntity.d.ts +8 -0
- package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
- package/dist/controller/model/zigbeeEntity.js +11 -0
- package/dist/controller/model/zigbeeEntity.js.map +1 -0
- package/dist/controller/touchlink.d.ts +20 -0
- package/dist/controller/touchlink.d.ts.map +1 -0
- package/dist/controller/touchlink.js +169 -0
- package/dist/controller/touchlink.js.map +1 -0
- package/dist/controller/tstype.d.ts +152 -0
- package/dist/controller/tstype.d.ts.map +1 -0
- package/dist/controller/tstype.js +3 -0
- package/dist/controller/tstype.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/models/backup-storage-legacy.d.ts +25 -0
- package/dist/models/backup-storage-legacy.d.ts.map +1 -0
- package/dist/models/backup-storage-legacy.js +3 -0
- package/dist/models/backup-storage-legacy.js.map +1 -0
- package/dist/models/backup-storage-unified.d.ts +50 -0
- package/dist/models/backup-storage-unified.d.ts.map +1 -0
- package/dist/models/backup-storage-unified.js +3 -0
- package/dist/models/backup-storage-unified.js.map +1 -0
- package/dist/models/backup.d.ts +37 -0
- package/dist/models/backup.d.ts.map +1 -0
- package/dist/models/backup.js +3 -0
- package/dist/models/backup.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +22 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/network-options.d.ts +12 -0
- package/dist/models/network-options.d.ts.map +1 -0
- package/dist/models/network-options.js +3 -0
- package/dist/models/network-options.js.map +1 -0
- package/dist/utils/aes.d.ts +40 -0
- package/dist/utils/aes.d.ts.map +1 -0
- package/dist/utils/aes.js +207 -0
- package/dist/utils/aes.js.map +1 -0
- package/dist/utils/async-mutex.d.ts +7 -0
- package/dist/utils/async-mutex.d.ts.map +1 -0
- package/dist/utils/async-mutex.js +31 -0
- package/dist/utils/async-mutex.js.map +1 -0
- package/dist/utils/backup.d.ts +21 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +179 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +45 -0
- package/dist/utils/index.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/utils/patchBigIntSerialization.d.ts +2 -0
- package/dist/utils/patchBigIntSerialization.d.ts.map +1 -0
- package/dist/utils/patchBigIntSerialization.js +9 -0
- package/dist/utils/patchBigIntSerialization.js.map +1 -0
- package/dist/utils/queue.d.ts +8 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/queue.js +67 -0
- package/dist/utils/queue.js.map +1 -0
- package/dist/utils/timeService.d.ts +6 -0
- package/dist/utils/timeService.d.ts.map +1 -0
- package/dist/utils/timeService.js +127 -0
- package/dist/utils/timeService.js.map +1 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +24 -0
- package/dist/utils/utils.js.map +1 -0
- package/dist/utils/wait.d.ts +2 -0
- package/dist/utils/wait.d.ts.map +1 -0
- package/dist/utils/wait.js +9 -0
- package/dist/utils/wait.js.map +1 -0
- package/dist/utils/waitress.d.ts +23 -0
- package/dist/utils/waitress.d.ts.map +1 -0
- package/dist/utils/waitress.js +76 -0
- package/dist/utils/waitress.js.map +1 -0
- package/dist/zspec/consts.d.ts +75 -0
- package/dist/zspec/consts.d.ts.map +1 -0
- package/dist/zspec/consts.js +79 -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 +27 -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/zspec/tstypes.js +3 -0
- package/dist/zspec/tstypes.js.map +1 -0
- package/dist/zspec/utils.d.ts +77 -0
- package/dist/zspec/utils.d.ts.map +1 -0
- package/dist/zspec/utils.js +217 -0
- package/dist/zspec/utils.js.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts +43 -0
- package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -0
- package/dist/zspec/zcl/buffaloZcl.js +969 -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 +7507 -0
- package/dist/zspec/zcl/definition/cluster.js.map +1 -0
- package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
- package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/clusters-types.js +3 -0
- package/dist/zspec/zcl/definition/clusters-types.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/datatypes.d.ts +2173 -0
- package/dist/zspec/zcl/definition/datatypes.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/datatypes.js +2315 -0
- package/dist/zspec/zcl/definition/datatypes.js.map +1 -0
- package/dist/zspec/zcl/definition/enums.d.ts +205 -0
- package/dist/zspec/zcl/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/enums.js +218 -0
- package/dist/zspec/zcl/definition/enums.js.map +1 -0
- package/dist/zspec/zcl/definition/foundation.d.ts +10 -0
- package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/foundation.js +312 -0
- package/dist/zspec/zcl/definition/foundation.js.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts +729 -0
- package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/manufacturerCode.js +734 -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 +273 -0
- package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -0
- package/dist/zspec/zcl/definition/tstype.js +3 -0
- package/dist/zspec/zcl/definition/tstype.js.map +1 -0
- package/dist/zspec/zcl/index.d.ts +12 -0
- package/dist/zspec/zcl/index.d.ts.map +1 -0
- package/dist/zspec/zcl/index.js +57 -0
- package/dist/zspec/zcl/index.js.map +1 -0
- package/dist/zspec/zcl/utils.d.ts +15 -0
- package/dist/zspec/zcl/utils.d.ts.map +1 -0
- package/dist/zspec/zcl/utils.js +419 -0
- package/dist/zspec/zcl/utils.js.map +1 -0
- package/dist/zspec/zcl/zclFrame.d.ts +49 -0
- package/dist/zspec/zcl/zclFrame.d.ts.map +1 -0
- package/dist/zspec/zcl/zclFrame.js +328 -0
- package/dist/zspec/zcl/zclFrame.js.map +1 -0
- package/dist/zspec/zcl/zclHeader.d.ts +16 -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 +407 -0
- package/dist/zspec/zdo/buffaloZdo.d.ts.map +1 -0
- package/dist/zspec/zdo/buffaloZdo.js +1919 -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 +686 -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 +85 -0
- package/dist/zspec/zdo/definition/enums.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/enums.js +103 -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 +108 -0
- package/dist/zspec/zdo/definition/status.js.map +1 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts +955 -0
- package/dist/zspec/zdo/definition/tstypes.d.ts.map +1 -0
- package/dist/zspec/zdo/definition/tstypes.js +4 -0
- package/dist/zspec/zdo/definition/tstypes.js.map +1 -0
- package/dist/zspec/zdo/index.d.ts +8 -0
- package/dist/zspec/zdo/index.d.ts.map +1 -0
- package/dist/zspec/zdo/index.js +51 -0
- package/dist/zspec/zdo/index.js.map +1 -0
- package/dist/zspec/zdo/utils.d.ts +24 -0
- package/dist/zspec/zdo/utils.d.ts.map +1 -0
- package/dist/zspec/zdo/utils.js +74 -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/package.json +90 -83
- package/src/controller/helpers/ota.ts +5 -2
- package/src/zspec/zcl/definition/cluster.ts +3 -294
- package/src/zspec/zcl/definition/clusters-types.ts +6 -355
- package/src/zspec/zcl/definition/tstype.ts +0 -14
- package/src/zspec/zcl/utils.ts +14 -31
- package/test/controller.test.ts +16 -8
- package/test/zcl.test.ts +36 -7
|
@@ -0,0 +1,1362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* v8 ignore start */
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.apsBusyQueue = exports.apsQueue = exports.busyQueue = void 0;
|
|
41
|
+
const node_events_1 = __importDefault(require("node:events"));
|
|
42
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
43
|
+
const slip_1 = __importDefault(require("slip"));
|
|
44
|
+
const buffalo_1 = require("../../../buffalo");
|
|
45
|
+
const logger_1 = require("../../../utils/logger");
|
|
46
|
+
const serialPort_1 = require("../../serialPort");
|
|
47
|
+
const utils_1 = require("../../utils");
|
|
48
|
+
const constants_1 = __importStar(require("./constants"));
|
|
49
|
+
const frameParser_1 = require("./frameParser");
|
|
50
|
+
const parser_1 = __importDefault(require("./parser"));
|
|
51
|
+
const writer_1 = __importDefault(require("./writer"));
|
|
52
|
+
const NS = "zh:deconz:driver";
|
|
53
|
+
const queue = [];
|
|
54
|
+
exports.busyQueue = [];
|
|
55
|
+
exports.apsQueue = [];
|
|
56
|
+
exports.apsBusyQueue = [];
|
|
57
|
+
const DRIVER_EVENT = Symbol("drv_ev");
|
|
58
|
+
const DEV_STATUS_NET_STATE_MASK = 0x03;
|
|
59
|
+
const DEV_STATUS_APS_CONFIRM = 0x04;
|
|
60
|
+
const DEV_STATUS_APS_INDICATION = 0x08;
|
|
61
|
+
const DEV_STATUS_APS_FREE_SLOTS = 0x20;
|
|
62
|
+
//const DEV_STATUS_CONFIG_CHANGED = 0x10;
|
|
63
|
+
var DriverState;
|
|
64
|
+
(function (DriverState) {
|
|
65
|
+
DriverState[DriverState["Init"] = 0] = "Init";
|
|
66
|
+
DriverState[DriverState["Connected"] = 1] = "Connected";
|
|
67
|
+
DriverState[DriverState["Connecting"] = 2] = "Connecting";
|
|
68
|
+
DriverState[DriverState["ReadConfiguration"] = 3] = "ReadConfiguration";
|
|
69
|
+
DriverState[DriverState["WaitToReconnect"] = 4] = "WaitToReconnect";
|
|
70
|
+
DriverState[DriverState["Reconfigure"] = 5] = "Reconfigure";
|
|
71
|
+
DriverState[DriverState["CloseAndRestart"] = 6] = "CloseAndRestart";
|
|
72
|
+
})(DriverState || (DriverState = {}));
|
|
73
|
+
var TxState;
|
|
74
|
+
(function (TxState) {
|
|
75
|
+
TxState[TxState["Idle"] = 0] = "Idle";
|
|
76
|
+
TxState[TxState["WaitResponse"] = 1] = "WaitResponse";
|
|
77
|
+
})(TxState || (TxState = {}));
|
|
78
|
+
var DriverEvent;
|
|
79
|
+
(function (DriverEvent) {
|
|
80
|
+
DriverEvent[DriverEvent["Action"] = 0] = "Action";
|
|
81
|
+
DriverEvent[DriverEvent["Connected"] = 1] = "Connected";
|
|
82
|
+
DriverEvent[DriverEvent["Disconnected"] = 2] = "Disconnected";
|
|
83
|
+
DriverEvent[DriverEvent["DeviceStateUpdated"] = 3] = "DeviceStateUpdated";
|
|
84
|
+
DriverEvent[DriverEvent["ConnectError"] = 4] = "ConnectError";
|
|
85
|
+
DriverEvent[DriverEvent["CloseError"] = 5] = "CloseError";
|
|
86
|
+
DriverEvent[DriverEvent["EnqueuedApsDataRequest"] = 6] = "EnqueuedApsDataRequest";
|
|
87
|
+
DriverEvent[DriverEvent["Tick"] = 7] = "Tick";
|
|
88
|
+
DriverEvent[DriverEvent["FirmwareCommandSend"] = 8] = "FirmwareCommandSend";
|
|
89
|
+
DriverEvent[DriverEvent["FirmwareCommandReceived"] = 9] = "FirmwareCommandReceived";
|
|
90
|
+
DriverEvent[DriverEvent["FirmwareCommandTimeout"] = 10] = "FirmwareCommandTimeout";
|
|
91
|
+
})(DriverEvent || (DriverEvent = {}));
|
|
92
|
+
class Driver extends node_events_1.default.EventEmitter {
|
|
93
|
+
serialPort;
|
|
94
|
+
serialPortOptions;
|
|
95
|
+
writer;
|
|
96
|
+
parser;
|
|
97
|
+
frameParserEvent = frameParser_1.frameParserEvents;
|
|
98
|
+
seqNumber;
|
|
99
|
+
deviceStatus = 0;
|
|
100
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
101
|
+
configChanged;
|
|
102
|
+
socketPort;
|
|
103
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
104
|
+
timeoutCounter = 0;
|
|
105
|
+
watchdogTriggeredTime = 0;
|
|
106
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
107
|
+
lastFirmwareRxTime = 0;
|
|
108
|
+
// biome-ignore lint/correctness/noUnusedPrivateClassMembers: ignore
|
|
109
|
+
tickTimer;
|
|
110
|
+
driverStateStart = 0;
|
|
111
|
+
driverState = DriverState.Init;
|
|
112
|
+
firmwareLog;
|
|
113
|
+
transactionID = 0; // for APS and ZDO
|
|
114
|
+
// in flight lockstep sending commands
|
|
115
|
+
txState = TxState.Idle;
|
|
116
|
+
txCommand = 0;
|
|
117
|
+
txSeq = 0;
|
|
118
|
+
txTime = 0;
|
|
119
|
+
networkOptions;
|
|
120
|
+
backup;
|
|
121
|
+
configMatchesBackup = false;
|
|
122
|
+
configIsNewNetwork = false;
|
|
123
|
+
restoredFromBackup = false;
|
|
124
|
+
paramMacAddress = 0n;
|
|
125
|
+
paramTcAddress = 0n;
|
|
126
|
+
paramFirmwareVersion = 0;
|
|
127
|
+
paramCurrentChannel = 0;
|
|
128
|
+
paramNwkPanid = 0;
|
|
129
|
+
paramNwkKey = Buffer.alloc(16);
|
|
130
|
+
paramEndpoint0;
|
|
131
|
+
paramEndpoint1;
|
|
132
|
+
fixParamEndpoint0;
|
|
133
|
+
fixParamEndpoint1;
|
|
134
|
+
paramNwkUpdateId = 0;
|
|
135
|
+
paramChannelMask = 0;
|
|
136
|
+
paramProtocolVersion = 0;
|
|
137
|
+
paramFrameCounter = 0;
|
|
138
|
+
paramApsUseExtPanid = 0n;
|
|
139
|
+
constructor(serialPortOptions, networkOptions, backup, firmwareLog) {
|
|
140
|
+
super();
|
|
141
|
+
this.seqNumber = 0;
|
|
142
|
+
this.configChanged = 0;
|
|
143
|
+
this.networkOptions = networkOptions;
|
|
144
|
+
this.serialPortOptions = serialPortOptions;
|
|
145
|
+
this.backup = backup;
|
|
146
|
+
this.firmwareLog = firmwareLog;
|
|
147
|
+
this.writer = new writer_1.default();
|
|
148
|
+
this.parser = new parser_1.default();
|
|
149
|
+
this.fixParamEndpoint0 = Buffer.from([
|
|
150
|
+
0x00, // index
|
|
151
|
+
0x01, // endpoint,
|
|
152
|
+
0x04, // profileId
|
|
153
|
+
0x01,
|
|
154
|
+
0x05, // deviceId
|
|
155
|
+
0x00,
|
|
156
|
+
0x01, // deviceVersion
|
|
157
|
+
0x05, // in cluster count
|
|
158
|
+
0x00, // basic
|
|
159
|
+
0x00,
|
|
160
|
+
0x06, // on/off
|
|
161
|
+
0x00,
|
|
162
|
+
0x0a, // time
|
|
163
|
+
0x00,
|
|
164
|
+
0x19, // ota
|
|
165
|
+
0x00,
|
|
166
|
+
0x01, // ias ace
|
|
167
|
+
0x05,
|
|
168
|
+
0x04, // out cluster count
|
|
169
|
+
0x01, // power configuration
|
|
170
|
+
0x00,
|
|
171
|
+
0x20, // poll control
|
|
172
|
+
0x00,
|
|
173
|
+
0x00, // ias zone
|
|
174
|
+
0x05,
|
|
175
|
+
0x02, // ias wd
|
|
176
|
+
0x05,
|
|
177
|
+
]);
|
|
178
|
+
this.fixParamEndpoint1 = Buffer.from([
|
|
179
|
+
0x01, // index
|
|
180
|
+
0xf2, // endpoint,
|
|
181
|
+
0xe0, // profileId
|
|
182
|
+
0xa1,
|
|
183
|
+
0x64, // deviceId
|
|
184
|
+
0x00,
|
|
185
|
+
0x01, // deviceVersion
|
|
186
|
+
0x00, // in cluster count
|
|
187
|
+
0x01, // out cluster count
|
|
188
|
+
0x21, // green power
|
|
189
|
+
0x00,
|
|
190
|
+
]);
|
|
191
|
+
this.tickTimer = setInterval(() => {
|
|
192
|
+
this.tick();
|
|
193
|
+
}, 100);
|
|
194
|
+
this.onParsed = this.onParsed.bind(this);
|
|
195
|
+
this.frameParserEvent.on("deviceStateUpdated", (data) => {
|
|
196
|
+
this.checkDeviceStatus(data);
|
|
197
|
+
});
|
|
198
|
+
this.on("close", () => {
|
|
199
|
+
for (const interval of this.intervals) {
|
|
200
|
+
clearInterval(interval);
|
|
201
|
+
}
|
|
202
|
+
this.timeoutCounter = 0;
|
|
203
|
+
this.cleanupAllQueues();
|
|
204
|
+
});
|
|
205
|
+
this.on(DRIVER_EVENT, (event, data) => {
|
|
206
|
+
this.handleStateEvent(event, data);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
cleanupAllQueues() {
|
|
210
|
+
const msg = `Cleanup in state: ${DriverState[this.driverState]}`;
|
|
211
|
+
for (let i = 0; i < queue.length; i++) {
|
|
212
|
+
queue[i].reject(new Error(msg));
|
|
213
|
+
}
|
|
214
|
+
queue.length = 0;
|
|
215
|
+
for (let i = 0; i < exports.busyQueue.length; i++) {
|
|
216
|
+
exports.busyQueue[i].reject(new Error(msg));
|
|
217
|
+
}
|
|
218
|
+
exports.busyQueue.length = 0;
|
|
219
|
+
for (let i = 0; i < exports.apsQueue.length; i++) {
|
|
220
|
+
exports.apsQueue[i].reject(new Error(msg));
|
|
221
|
+
}
|
|
222
|
+
exports.apsQueue.length = 0;
|
|
223
|
+
for (let i = 0; i < exports.apsBusyQueue.length; i++) {
|
|
224
|
+
exports.apsBusyQueue[i].reject(new Error(msg));
|
|
225
|
+
}
|
|
226
|
+
exports.apsBusyQueue.length = 0;
|
|
227
|
+
}
|
|
228
|
+
started() {
|
|
229
|
+
return this.driverState === DriverState.Connected;
|
|
230
|
+
}
|
|
231
|
+
intervals = [];
|
|
232
|
+
registerInterval(interval) {
|
|
233
|
+
this.intervals.push(interval);
|
|
234
|
+
}
|
|
235
|
+
async catchPromise(val) {
|
|
236
|
+
return (await Promise.resolve(val).catch((err) => logger_1.logger.debug(`Promise was caught with reason: ${err}`, NS)));
|
|
237
|
+
}
|
|
238
|
+
nextTransactionID() {
|
|
239
|
+
this.transactionID++;
|
|
240
|
+
if (this.transactionID > 255) {
|
|
241
|
+
this.transactionID = 1;
|
|
242
|
+
}
|
|
243
|
+
return this.transactionID;
|
|
244
|
+
}
|
|
245
|
+
tick() {
|
|
246
|
+
this.emitStateEvent(DriverEvent.Tick);
|
|
247
|
+
}
|
|
248
|
+
emitStateEvent(event, data) {
|
|
249
|
+
this.emit(DRIVER_EVENT, event, data);
|
|
250
|
+
}
|
|
251
|
+
needWatchdogReset() {
|
|
252
|
+
const now = Date.now();
|
|
253
|
+
if (300 * 1000 < now - this.watchdogTriggeredTime) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
async resetWatchdog() {
|
|
259
|
+
const lastTime = this.watchdogTriggeredTime;
|
|
260
|
+
try {
|
|
261
|
+
logger_1.logger.debug("Reset firmware watchdog", NS);
|
|
262
|
+
// Set timestamp before command to let needWatchdogReset() no trigger multiple times.
|
|
263
|
+
this.watchdogTriggeredTime = Date.now();
|
|
264
|
+
await this.writeParameterRequest(constants_1.ParamId.DEV_WATCHDOG_TTL, 600);
|
|
265
|
+
logger_1.logger.debug("Reset firmware watchdog success", NS);
|
|
266
|
+
}
|
|
267
|
+
catch (_err) {
|
|
268
|
+
this.watchdogTriggeredTime = lastTime;
|
|
269
|
+
logger_1.logger.debug("Reset firmware watchdog failed", NS);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
handleFirmwareEvent(event, data) {
|
|
273
|
+
if (event === DriverEvent.FirmwareCommandSend) {
|
|
274
|
+
if (this.txState !== TxState.Idle) {
|
|
275
|
+
throw new Error("Unexpected TX state not idle");
|
|
276
|
+
}
|
|
277
|
+
const d = data;
|
|
278
|
+
this.txState = TxState.WaitResponse;
|
|
279
|
+
this.txCommand = d.cmd;
|
|
280
|
+
this.txSeq = d.seq;
|
|
281
|
+
this.txTime = Date.now();
|
|
282
|
+
//logger.debug(`tx wait for cmd: ${d.cmd.toString(16).padStart(2, "0")}, seq: ${d.seq}`, NS);
|
|
283
|
+
}
|
|
284
|
+
else if (event === DriverEvent.FirmwareCommandReceived) {
|
|
285
|
+
if (this.txState !== TxState.WaitResponse) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const d = data;
|
|
289
|
+
if (this.txCommand === d.cmd && this.txSeq === d.seq) {
|
|
290
|
+
this.txState = TxState.Idle;
|
|
291
|
+
//logger.debug(`tx released for cmd: ${d.cmd.toString(16).padStart(2, "0")}, seq: ${d.seq}`, NS);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else if (event === DriverEvent.FirmwareCommandTimeout) {
|
|
295
|
+
if (this.txState === TxState.WaitResponse) {
|
|
296
|
+
this.txState = TxState.Idle;
|
|
297
|
+
logger_1.logger.debug(`tx timeout for cmd: ${this.txCommand.toString(16).padStart(2, "0")}, seq: ${this.txSeq}`, NS);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else if (event === DriverEvent.Tick) {
|
|
301
|
+
if (this.txState === TxState.WaitResponse) {
|
|
302
|
+
if (Date.now() - this.txTime > 2000) {
|
|
303
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandTimeout);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
handleConnectedStateEvent(event, _data) {
|
|
309
|
+
if (event === DriverEvent.DeviceStateUpdated) {
|
|
310
|
+
this.handleApsQueueOnDeviceState();
|
|
311
|
+
}
|
|
312
|
+
else if (event === DriverEvent.Tick) {
|
|
313
|
+
if (this.needWatchdogReset()) {
|
|
314
|
+
this.resetWatchdog().catch(() => { });
|
|
315
|
+
}
|
|
316
|
+
this.processQueue();
|
|
317
|
+
if (this.txState === TxState.Idle) {
|
|
318
|
+
this.deviceStatus = 0; // force refresh in response
|
|
319
|
+
this.sendReadDeviceStateRequest(this.nextSeqNumber());
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (event === DriverEvent.Disconnected) {
|
|
323
|
+
logger_1.logger.debug("Disconnected wait and reconnect", NS);
|
|
324
|
+
this.driverStateStart = Date.now();
|
|
325
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
handleConnectingStateEvent(event, _data) {
|
|
329
|
+
if (event === DriverEvent.Action) {
|
|
330
|
+
this.watchdogTriggeredTime = 0; // force reset watchdog
|
|
331
|
+
this.cleanupAllQueues(); // start with fresh queues
|
|
332
|
+
// TODO(mpi): In future we should simply try which baudrate may work (in a state machine).
|
|
333
|
+
// E.g. connect with baudrate XY, query firmware, on timeout try other baudrate.
|
|
334
|
+
// Most units out there are ConBee2/3 which support 115200.
|
|
335
|
+
// The 38400 default is outdated now and only works for a few units.
|
|
336
|
+
const baudrate = this.serialPortOptions.baudRate || 38400;
|
|
337
|
+
if (!this.serialPortOptions.path) {
|
|
338
|
+
// unlikely but handle it anyway
|
|
339
|
+
this.driverStateStart = Date.now();
|
|
340
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
let prom;
|
|
344
|
+
if ((0, utils_1.isTcpPath)(this.serialPortOptions.path)) {
|
|
345
|
+
prom = this.openSocketPort();
|
|
346
|
+
}
|
|
347
|
+
else if (baudrate) {
|
|
348
|
+
prom = this.openSerialPort(baudrate);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// unlikely but handle it anyway
|
|
352
|
+
this.driverStateStart = Date.now();
|
|
353
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
354
|
+
}
|
|
355
|
+
// biome-ignore lint/nursery/noMisusedPromises: ignore
|
|
356
|
+
if (prom) {
|
|
357
|
+
prom.catch((err) => {
|
|
358
|
+
logger_1.logger.debug(`${err}`, NS);
|
|
359
|
+
this.driverStateStart = Date.now();
|
|
360
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
else if (event === DriverEvent.Connected) {
|
|
365
|
+
this.driverStateStart = Date.now();
|
|
366
|
+
this.driverState = DriverState.ReadConfiguration;
|
|
367
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
isNetworkConfigurationValid() {
|
|
371
|
+
const opts = this.networkOptions;
|
|
372
|
+
let configExtPanID = 0n;
|
|
373
|
+
const configNetworkKey = Buffer.from(opts.networkKey || []);
|
|
374
|
+
if (opts.extendedPanID) {
|
|
375
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
376
|
+
configExtPanID = Buffer.from(opts.extendedPanID).readBigUInt64BE();
|
|
377
|
+
}
|
|
378
|
+
if (this.backup) {
|
|
379
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
380
|
+
const backupExtPanID = Buffer.from(this.backup.networkOptions.extendedPanId).readBigUInt64BE();
|
|
381
|
+
if (opts.panID === this.backup.networkOptions.panId &&
|
|
382
|
+
configExtPanID === backupExtPanID &&
|
|
383
|
+
opts.channelList.includes(this.backup.logicalChannel) &&
|
|
384
|
+
configNetworkKey.equals(this.backup.networkOptions.networkKey)) {
|
|
385
|
+
logger_1.logger.debug("Configuration matches backup", NS);
|
|
386
|
+
this.configMatchesBackup = true;
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
logger_1.logger.debug("Configuration doesn't match backup (ignore backup)", NS);
|
|
390
|
+
this.configMatchesBackup = false; // ignore Backup
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (this.paramMacAddress !== this.paramTcAddress) {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
if (!this.paramEndpoint0 || this.fixParamEndpoint0.compare(this.paramEndpoint0) !== 0) {
|
|
397
|
+
logger_1.logger.debug("Endpoint[0] doesn't match configuration", NS);
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
if (!this.paramEndpoint1 || this.fixParamEndpoint1.compare(this.paramEndpoint1) !== 0) {
|
|
401
|
+
logger_1.logger.debug("Endpoint[1] doesn't match configuration", NS);
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
if ((this.deviceStatus & DEV_STATUS_NET_STATE_MASK) !== constants_1.NetworkState.Connected) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
if (opts.channelList.find((ch) => ch === this.paramCurrentChannel) === undefined) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
if (configExtPanID !== 0n) {
|
|
411
|
+
if (configExtPanID !== this.paramApsUseExtPanid) {
|
|
412
|
+
this.configIsNewNetwork = true;
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (opts.panID !== this.paramNwkPanid) {
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
if (opts.networkKey) {
|
|
420
|
+
if (!configNetworkKey.equals(this.paramNwkKey)) {
|
|
421
|
+
// this.configIsNewNetwork = true; // maybe, but we need to consider key rotation
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (this.backup && this.configMatchesBackup) {
|
|
426
|
+
// The backup might be from another unit, if the mac doesn't match clone it!
|
|
427
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
428
|
+
const backupMacAddress = this.backup.coordinatorIeeeAddress.readBigUInt64BE();
|
|
429
|
+
if (backupMacAddress !== this.paramMacAddress) {
|
|
430
|
+
this.configIsNewNetwork = true;
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
if (this.paramNwkUpdateId < this.backup.networkUpdateId) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
// NOTE(mpi): Ignore the frame counter for now and only handle in case of this.configIsNewNetwork == true.
|
|
437
|
+
// TODO(mpi): We might also check Trust Center Link Key and key sequence number (unlikely but possible case).
|
|
438
|
+
}
|
|
439
|
+
// TODO(mpi): Check endpoint configuration
|
|
440
|
+
// const ep1 = = await this.driver.readParameterRequest(PARAM.PARAM.STK.Endpoint,);
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
async reconfigureNetwork() {
|
|
444
|
+
const opts = this.networkOptions;
|
|
445
|
+
// if the configuration has a different channel, broadcast a channel change to the network first
|
|
446
|
+
if (this.networkOptions.channelList.length !== 0) {
|
|
447
|
+
if (opts.channelList[0] !== this.paramCurrentChannel) {
|
|
448
|
+
logger_1.logger.debug(`change channel from ${this.paramCurrentChannel} to ${opts.channelList[0]}`, NS);
|
|
449
|
+
// increase the NWK Update ID so devices which search for the network know this is an update
|
|
450
|
+
this.paramNwkUpdateId = (this.paramNwkUpdateId + 1) % 255;
|
|
451
|
+
this.paramCurrentChannel = opts.channelList[0];
|
|
452
|
+
if ((this.deviceStatus & DEV_STATUS_NET_STATE_MASK) === constants_1.NetworkState.Connected) {
|
|
453
|
+
await this.sendChangeChannelRequest();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// first disconnect the network
|
|
458
|
+
await this.changeNetworkStateRequest(constants_1.NetworkState.Disconnected);
|
|
459
|
+
// check if a backup needs to be applied
|
|
460
|
+
// Ember check if backup is needed:
|
|
461
|
+
// - panId, extPanId, network key different -> leave network
|
|
462
|
+
// - left or not joined -> consider using backup
|
|
463
|
+
// backup is only used when matching the z2m config: panId, extPanId, channel, network key
|
|
464
|
+
// parameters restored from backup:
|
|
465
|
+
// - networkKey,
|
|
466
|
+
// - networkKeyInfo.sequenceNumber NOTE(mpi): not a reason for using backup!?
|
|
467
|
+
// - networkKeyInfo.frameCounter
|
|
468
|
+
// - networkOptions.panId
|
|
469
|
+
// - extendedPanId
|
|
470
|
+
// - logicalChannel
|
|
471
|
+
// - backup!.ezsp!.hashed_tclk! NOTE(mpi): not a reason for using backup!?
|
|
472
|
+
// - backup!.networkUpdateId NOTE(mpi): not a reason for using backup!?
|
|
473
|
+
let frameCounter = 0;
|
|
474
|
+
if (this.backup && this.configMatchesBackup) {
|
|
475
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
476
|
+
const backupMacAddress = this.backup.coordinatorIeeeAddress.readBigUInt64BE();
|
|
477
|
+
if (backupMacAddress !== this.paramMacAddress) {
|
|
478
|
+
logger_1.logger.debug(`Use mac address from backup 0x${backupMacAddress.toString(16).padStart(16, "0")}, replaces 0x${this.paramMacAddress.toString(16).padStart(16, "0")}`, NS);
|
|
479
|
+
this.paramMacAddress = backupMacAddress;
|
|
480
|
+
this.restoredFromBackup = true;
|
|
481
|
+
await this.writeParameterRequest(constants_1.ParamId.MAC_ADDRESS, backupMacAddress);
|
|
482
|
+
}
|
|
483
|
+
if (this.configIsNewNetwork && this.paramFrameCounter < this.backup.networkKeyInfo.frameCounter) {
|
|
484
|
+
// delicate situation, only update frame counter if:
|
|
485
|
+
// - backup counter is higher
|
|
486
|
+
// - this is in fact a new network
|
|
487
|
+
// - configIsNewNetwork guards also from mistreating counter overflow
|
|
488
|
+
logger_1.logger.debug(`Use higher frame counter from backup ${this.backup.networkKeyInfo.frameCounter}`, NS);
|
|
489
|
+
// Additionally increase frame counter. Note this might still be too low!
|
|
490
|
+
frameCounter = this.backup.networkKeyInfo.frameCounter + 1000;
|
|
491
|
+
this.restoredFromBackup = true;
|
|
492
|
+
}
|
|
493
|
+
if (this.paramNwkUpdateId < this.backup.networkUpdateId) {
|
|
494
|
+
logger_1.logger.debug(`Use network update ID from backup ${this.backup.networkUpdateId}`, NS);
|
|
495
|
+
this.paramNwkUpdateId = this.backup.networkUpdateId;
|
|
496
|
+
this.restoredFromBackup = true;
|
|
497
|
+
}
|
|
498
|
+
// TODO(mpi): Later on also check key sequence number.
|
|
499
|
+
}
|
|
500
|
+
if (this.paramMacAddress !== this.paramTcAddress) {
|
|
501
|
+
this.paramTcAddress = this.paramMacAddress;
|
|
502
|
+
await this.writeParameterRequest(constants_1.ParamId.APS_TRUST_CENTER_ADDRESS, this.paramTcAddress);
|
|
503
|
+
}
|
|
504
|
+
if (this.configIsNewNetwork && this.paramFrameCounter < frameCounter) {
|
|
505
|
+
this.paramFrameCounter = frameCounter;
|
|
506
|
+
try {
|
|
507
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_FRAME_COUNTER, this.paramFrameCounter);
|
|
508
|
+
}
|
|
509
|
+
catch (_err) {
|
|
510
|
+
// on older firmware versions this fails as unsuppored
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_NWK_UPDATE_ID, this.paramNwkUpdateId);
|
|
514
|
+
if (this.networkOptions.channelList.length !== 0) {
|
|
515
|
+
await this.writeParameterRequest(constants_1.ParamId.APS_CHANNEL_MASK, 1 << this.networkOptions.channelList[0]);
|
|
516
|
+
}
|
|
517
|
+
this.paramNwkPanid = this.networkOptions.panID;
|
|
518
|
+
await this.writeParameterRequest(constants_1.ParamId.NWK_PANID, this.networkOptions.panID);
|
|
519
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_PREDEFINED_PANID, 1);
|
|
520
|
+
if (this.networkOptions.extendedPanID) {
|
|
521
|
+
// NOTE(mpi): U64 values in buffer are big endian!
|
|
522
|
+
this.paramApsUseExtPanid = Buffer.from(this.networkOptions.extendedPanID).readBigUInt64BE();
|
|
523
|
+
await this.writeParameterRequest(constants_1.ParamId.APS_USE_EXTENDED_PANID, this.paramApsUseExtPanid);
|
|
524
|
+
}
|
|
525
|
+
// check current network key against configuration.yaml
|
|
526
|
+
if (this.networkOptions.networkKey) {
|
|
527
|
+
this.paramNwkKey = Buffer.from(this.networkOptions.networkKey);
|
|
528
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_NETWORK_KEY, Buffer.from([0x0, ...this.networkOptions.networkKey]));
|
|
529
|
+
}
|
|
530
|
+
// check current endpoint configuration
|
|
531
|
+
if (!this.paramEndpoint0 || this.fixParamEndpoint0.compare(this.paramEndpoint0) !== 0) {
|
|
532
|
+
this.paramEndpoint0 = this.fixParamEndpoint0;
|
|
533
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_ENDPOINT, this.paramEndpoint0);
|
|
534
|
+
}
|
|
535
|
+
if (!this.paramEndpoint1 || this.fixParamEndpoint1.compare(this.paramEndpoint1) !== 0) {
|
|
536
|
+
this.paramEndpoint1 = this.fixParamEndpoint1;
|
|
537
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_ENDPOINT, this.paramEndpoint1);
|
|
538
|
+
}
|
|
539
|
+
// now reconnect, this will also store configuration in nvram
|
|
540
|
+
await this.changeNetworkStateRequest(constants_1.NetworkState.Connected);
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
handleReadConfigurationStateEvent(event, _data) {
|
|
544
|
+
if (event === DriverEvent.Action) {
|
|
545
|
+
logger_1.logger.debug("Query firmware parameters", NS);
|
|
546
|
+
this.deviceStatus = 0; // need fresh value
|
|
547
|
+
Promise.all([
|
|
548
|
+
this.resetWatchdog(),
|
|
549
|
+
this.readFirmwareVersionRequest(),
|
|
550
|
+
this.readDeviceStatusRequest(),
|
|
551
|
+
this.readParameterRequest(constants_1.ParamId.MAC_ADDRESS),
|
|
552
|
+
this.readParameterRequest(constants_1.ParamId.APS_TRUST_CENTER_ADDRESS),
|
|
553
|
+
this.readParameterRequest(constants_1.ParamId.NWK_PANID),
|
|
554
|
+
this.readParameterRequest(constants_1.ParamId.APS_USE_EXTENDED_PANID),
|
|
555
|
+
this.readParameterRequest(constants_1.ParamId.STK_CURRENT_CHANNEL),
|
|
556
|
+
this.readParameterRequest(constants_1.ParamId.STK_NETWORK_KEY, Buffer.from([0])),
|
|
557
|
+
this.readParameterRequest(constants_1.ParamId.STK_NWK_UPDATE_ID),
|
|
558
|
+
this.readParameterRequest(constants_1.ParamId.APS_CHANNEL_MASK),
|
|
559
|
+
this.readParameterRequest(constants_1.ParamId.STK_PROTOCOL_VERSION),
|
|
560
|
+
this.readParameterRequest(constants_1.ParamId.STK_FRAME_COUNTER),
|
|
561
|
+
this.readParameterRequest(constants_1.ParamId.STK_ENDPOINT, Buffer.from([0])),
|
|
562
|
+
this.readParameterRequest(constants_1.ParamId.STK_ENDPOINT, Buffer.from([1])),
|
|
563
|
+
])
|
|
564
|
+
.then(([_watchdog, fwVersion, _deviceState, mac, tcAddress, panid, apsUseExtPanid, currentChannel, nwkKey, nwkUpdateId, channelMask, protocolVersion, frameCounter, ep0, ep1,]) => {
|
|
565
|
+
this.paramFirmwareVersion = fwVersion;
|
|
566
|
+
this.paramCurrentChannel = currentChannel;
|
|
567
|
+
this.paramApsUseExtPanid = apsUseExtPanid;
|
|
568
|
+
this.paramNwkPanid = panid;
|
|
569
|
+
this.paramNwkKey = nwkKey;
|
|
570
|
+
this.paramNwkUpdateId = nwkUpdateId;
|
|
571
|
+
this.paramMacAddress = mac;
|
|
572
|
+
this.paramTcAddress = tcAddress;
|
|
573
|
+
this.paramChannelMask = channelMask;
|
|
574
|
+
this.paramProtocolVersion = protocolVersion;
|
|
575
|
+
if (frameCounter !== null) {
|
|
576
|
+
this.paramFrameCounter = frameCounter;
|
|
577
|
+
}
|
|
578
|
+
if (ep0 !== null) {
|
|
579
|
+
this.paramEndpoint0 = ep0;
|
|
580
|
+
}
|
|
581
|
+
if (ep1 !== null) {
|
|
582
|
+
this.paramEndpoint1 = ep1;
|
|
583
|
+
}
|
|
584
|
+
// console.log({fwVersion, mac, panid, apsUseExtPanid, currentChannel, nwkKey, nwkUpdateId, channelMask, protocolVersion, frameCounter});
|
|
585
|
+
if (this.isNetworkConfigurationValid()) {
|
|
586
|
+
logger_1.logger.debug("Zigbee configuration valid", NS);
|
|
587
|
+
this.driverStateStart = Date.now();
|
|
588
|
+
this.driverState = DriverState.Connected;
|
|
589
|
+
// enable optional firmware debug messages
|
|
590
|
+
let logLevel = 0;
|
|
591
|
+
for (const level of this.firmwareLog) {
|
|
592
|
+
if (level === "APS")
|
|
593
|
+
logLevel |= 0x00000100;
|
|
594
|
+
else if (level === "APS_L2")
|
|
595
|
+
logLevel |= 0x00010000;
|
|
596
|
+
}
|
|
597
|
+
if (logLevel !== 0) {
|
|
598
|
+
this.writeParameterRequest(constants_1.ParamId.STK_DEBUG_LOG_LEVEL, logLevel)
|
|
599
|
+
.then((_x) => {
|
|
600
|
+
logger_1.logger.debug("Enabled firmware logging", NS);
|
|
601
|
+
})
|
|
602
|
+
.catch((_err) => {
|
|
603
|
+
logger_1.logger.debug("Firmware logging unsupported by firmware", NS);
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
this.driverStateStart = Date.now();
|
|
609
|
+
this.driverState = DriverState.Reconfigure;
|
|
610
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
611
|
+
}
|
|
612
|
+
})
|
|
613
|
+
.catch((_err) => {
|
|
614
|
+
this.driverStateStart = Date.now();
|
|
615
|
+
this.driverState = DriverState.CloseAndRestart;
|
|
616
|
+
logger_1.logger.debug("Failed to query firmware parameters", NS);
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
else if (event === DriverEvent.Tick) {
|
|
620
|
+
this.processQueue();
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
handleReconfigureStateEvent(event, _data) {
|
|
624
|
+
if (event === DriverEvent.Action) {
|
|
625
|
+
logger_1.logger.debug("Reconfigure Zigbee network to match configuration", NS);
|
|
626
|
+
this.reconfigureNetwork()
|
|
627
|
+
.then(() => {
|
|
628
|
+
this.driverStateStart = Date.now();
|
|
629
|
+
this.driverState = DriverState.Connected;
|
|
630
|
+
})
|
|
631
|
+
.catch((err) => {
|
|
632
|
+
logger_1.logger.debug(`Failed to reconfigure Zigbee network, error: ${err}, wait 15 seconds to retry`, NS);
|
|
633
|
+
this.driverStateStart = Date.now();
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
else if (event === DriverEvent.Tick) {
|
|
637
|
+
this.processQueue();
|
|
638
|
+
// if we run into this timeout assume some error and retry after waiting a bit
|
|
639
|
+
if (15000 < Date.now() - this.driverStateStart) {
|
|
640
|
+
this.driverStateStart = Date.now();
|
|
641
|
+
this.driverState = DriverState.CloseAndRestart;
|
|
642
|
+
}
|
|
643
|
+
if (this.txState === TxState.Idle) {
|
|
644
|
+
// needed to process channel change ZDP request
|
|
645
|
+
this.deviceStatus = 0; // force refresh in response
|
|
646
|
+
this.sendReadDeviceStateRequest(this.nextSeqNumber());
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
else if (event === DriverEvent.DeviceStateUpdated) {
|
|
650
|
+
this.handleApsQueueOnDeviceState();
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
handleWaitToReconnectStateEvent(event, _data) {
|
|
654
|
+
if (event === DriverEvent.Tick) {
|
|
655
|
+
if (5000 < Date.now() - this.driverStateStart) {
|
|
656
|
+
this.driverState = DriverState.Connecting;
|
|
657
|
+
this.emitStateEvent(DriverEvent.Action);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
handleCloseAndRestartStateEvent(event, _data) {
|
|
662
|
+
if (event === DriverEvent.Tick) {
|
|
663
|
+
if (1000 < Date.now() - this.driverStateStart) {
|
|
664
|
+
// if the connection is open try to close it every second.
|
|
665
|
+
this.driverStateStart = Date.now();
|
|
666
|
+
if (this.isOpen()) {
|
|
667
|
+
this.close().catch(() => { });
|
|
668
|
+
}
|
|
669
|
+
else {
|
|
670
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
handleApsQueueOnDeviceState() {
|
|
676
|
+
// logger.debug(`Updated device status: ${data.toString(2)}`, NS);
|
|
677
|
+
const netState = this.deviceStatus & DEV_STATUS_NET_STATE_MASK;
|
|
678
|
+
if (this.txState === TxState.Idle) {
|
|
679
|
+
if (netState === constants_1.NetworkState.Connected) {
|
|
680
|
+
const status = this.deviceStatus;
|
|
681
|
+
if (status & DEV_STATUS_APS_CONFIRM) {
|
|
682
|
+
this.deviceStatus = 0; // force refresh in response
|
|
683
|
+
this.sendReadApsConfirmRequest(this.nextSeqNumber());
|
|
684
|
+
}
|
|
685
|
+
else if (status & DEV_STATUS_APS_INDICATION) {
|
|
686
|
+
this.deviceStatus = 0; // force refresh in response
|
|
687
|
+
this.sendReadApsIndicationRequest(this.nextSeqNumber());
|
|
688
|
+
}
|
|
689
|
+
else if (status & DEV_STATUS_APS_FREE_SLOTS) {
|
|
690
|
+
this.deviceStatus = 0; // force refresh in response
|
|
691
|
+
this.processApsQueue();
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
handleStateEvent(event, data) {
|
|
697
|
+
try {
|
|
698
|
+
// all states
|
|
699
|
+
if (event === DriverEvent.Tick ||
|
|
700
|
+
event === DriverEvent.FirmwareCommandReceived ||
|
|
701
|
+
event === DriverEvent.FirmwareCommandSend ||
|
|
702
|
+
event === DriverEvent.FirmwareCommandTimeout) {
|
|
703
|
+
this.handleFirmwareEvent(event, data);
|
|
704
|
+
this.processBusyQueueTimeouts();
|
|
705
|
+
this.processApsBusyQueueTimeouts();
|
|
706
|
+
}
|
|
707
|
+
if (this.driverState === DriverState.Init) {
|
|
708
|
+
this.driverState = DriverState.WaitToReconnect;
|
|
709
|
+
this.driverStateStart = 0; // force fast initial connect
|
|
710
|
+
}
|
|
711
|
+
else if (this.driverState === DriverState.Connected) {
|
|
712
|
+
this.handleConnectedStateEvent(event, data);
|
|
713
|
+
}
|
|
714
|
+
else if (this.driverState === DriverState.Connecting) {
|
|
715
|
+
this.handleConnectingStateEvent(event, data);
|
|
716
|
+
}
|
|
717
|
+
else if (this.driverState === DriverState.WaitToReconnect) {
|
|
718
|
+
this.handleWaitToReconnectStateEvent(event, data);
|
|
719
|
+
}
|
|
720
|
+
else if (this.driverState === DriverState.ReadConfiguration) {
|
|
721
|
+
this.handleReadConfigurationStateEvent(event, data);
|
|
722
|
+
}
|
|
723
|
+
else if (this.driverState === DriverState.Reconfigure) {
|
|
724
|
+
this.handleReconfigureStateEvent(event, data);
|
|
725
|
+
}
|
|
726
|
+
else if (this.driverState === DriverState.CloseAndRestart) {
|
|
727
|
+
this.handleCloseAndRestartStateEvent(event, data);
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
if (event !== DriverEvent.Tick) {
|
|
731
|
+
logger_1.logger.debug(`handle state: ${DriverState[this.driverState]}, event: ${DriverEvent[event]}`, NS);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
catch (_err) {
|
|
736
|
+
// console.error(err);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
onPortClose(error) {
|
|
740
|
+
if (error) {
|
|
741
|
+
logger_1.logger.info(`Port close: state: ${DriverState[this.driverState]}, reason: ${error}`, NS);
|
|
742
|
+
}
|
|
743
|
+
else {
|
|
744
|
+
logger_1.logger.debug(`Port closed in state: ${DriverState[this.driverState]}`, NS);
|
|
745
|
+
}
|
|
746
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
747
|
+
this.emit("close");
|
|
748
|
+
}
|
|
749
|
+
onPortError(error) {
|
|
750
|
+
logger_1.logger.error(`Port error: ${error}`, NS);
|
|
751
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
752
|
+
this.emit("close");
|
|
753
|
+
}
|
|
754
|
+
isOpen() {
|
|
755
|
+
if (this.serialPort)
|
|
756
|
+
return this.serialPort.isOpen;
|
|
757
|
+
if (this.socketPort)
|
|
758
|
+
return this.socketPort.readyState !== "closed";
|
|
759
|
+
return false;
|
|
760
|
+
}
|
|
761
|
+
openSerialPort(baudrate) {
|
|
762
|
+
return new Promise((resolve, reject) => {
|
|
763
|
+
if (!this.serialPortOptions.path) {
|
|
764
|
+
reject(new Error("Failed to open serial port, path is undefined"));
|
|
765
|
+
}
|
|
766
|
+
logger_1.logger.debug(`Opening serial port: ${this.serialPortOptions.path}`, NS);
|
|
767
|
+
const path = this.serialPortOptions.path || "";
|
|
768
|
+
if (!this.serialPort) {
|
|
769
|
+
this.serialPort = new serialPort_1.SerialPort({ path, baudRate: baudrate, autoOpen: false });
|
|
770
|
+
this.writer.pipe(this.serialPort);
|
|
771
|
+
this.serialPort.pipe(this.parser);
|
|
772
|
+
this.parser.on("parsed", this.onParsed);
|
|
773
|
+
this.serialPort.on("close", this.onPortClose.bind(this));
|
|
774
|
+
this.serialPort.on("error", this.onPortError.bind(this));
|
|
775
|
+
}
|
|
776
|
+
if (!this.serialPort) {
|
|
777
|
+
reject(new Error("Failed to create SerialPort instance"));
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
if (this.serialPort.isOpen) {
|
|
781
|
+
resolve();
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
this.serialPort.open((error) => {
|
|
785
|
+
if (error) {
|
|
786
|
+
reject(new Error(`Error while opening serialport '${error}'`));
|
|
787
|
+
if (this.serialPort) {
|
|
788
|
+
if (this.serialPort.isOpen) {
|
|
789
|
+
this.emitStateEvent(DriverEvent.ConnectError);
|
|
790
|
+
//this.serialPort!.close();
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
logger_1.logger.debug("Serialport opened", NS);
|
|
796
|
+
this.emitStateEvent(DriverEvent.Connected);
|
|
797
|
+
resolve();
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
async openSocketPort() {
|
|
803
|
+
if (!this.serialPortOptions.path) {
|
|
804
|
+
throw new Error("No serial port TCP path specified");
|
|
805
|
+
}
|
|
806
|
+
const info = (0, utils_1.parseTcpPath)(this.serialPortOptions.path);
|
|
807
|
+
logger_1.logger.debug(`Opening TCP socket with ${info.host}:${info.port}`, NS);
|
|
808
|
+
this.socketPort = new node_net_1.default.Socket();
|
|
809
|
+
this.socketPort.setNoDelay(true);
|
|
810
|
+
this.socketPort.setKeepAlive(true, 15000);
|
|
811
|
+
this.writer = new writer_1.default();
|
|
812
|
+
this.writer.pipe(this.socketPort);
|
|
813
|
+
this.parser = new parser_1.default();
|
|
814
|
+
this.socketPort.pipe(this.parser);
|
|
815
|
+
this.parser.on("parsed", this.onParsed);
|
|
816
|
+
return await new Promise((resolve, reject) => {
|
|
817
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
818
|
+
this.socketPort.on("connect", () => {
|
|
819
|
+
logger_1.logger.debug("Socket connected", NS);
|
|
820
|
+
});
|
|
821
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
822
|
+
this.socketPort.on("ready", () => {
|
|
823
|
+
logger_1.logger.debug("Socket ready", NS);
|
|
824
|
+
this.emitStateEvent(DriverEvent.Connected);
|
|
825
|
+
resolve();
|
|
826
|
+
});
|
|
827
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
828
|
+
this.socketPort.once("close", this.onPortClose);
|
|
829
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
830
|
+
this.socketPort.on("error", (error) => {
|
|
831
|
+
logger_1.logger.error(`Socket error ${error}`, NS);
|
|
832
|
+
reject(new Error("Error while opening socket"));
|
|
833
|
+
});
|
|
834
|
+
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
835
|
+
this.socketPort.connect(info.port, info.host);
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
close() {
|
|
839
|
+
return new Promise((resolve, reject) => {
|
|
840
|
+
if (this.serialPort) {
|
|
841
|
+
if (this.serialPort.isOpen) {
|
|
842
|
+
// wait until remaining data is written
|
|
843
|
+
this.serialPort.flush();
|
|
844
|
+
this.serialPort.close((error) => {
|
|
845
|
+
if (error) {
|
|
846
|
+
// TODO(mpi): monitor, this must not happen after drain
|
|
847
|
+
// close() failes if there is pending data to write!
|
|
848
|
+
this.emitStateEvent(DriverEvent.CloseError);
|
|
849
|
+
reject(new Error(`Error while closing serialport '${error}'`));
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
855
|
+
this.emit("close");
|
|
856
|
+
resolve();
|
|
857
|
+
}
|
|
858
|
+
else if (this.socketPort) {
|
|
859
|
+
this.socketPort.destroy();
|
|
860
|
+
this.socketPort = undefined;
|
|
861
|
+
this.emitStateEvent(DriverEvent.Disconnected);
|
|
862
|
+
resolve();
|
|
863
|
+
}
|
|
864
|
+
else {
|
|
865
|
+
resolve();
|
|
866
|
+
this.emit("close");
|
|
867
|
+
}
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
readParameterRequest(parameterId, parameter) {
|
|
871
|
+
const seqNumber = this.nextSeqNumber();
|
|
872
|
+
return new Promise((resolve, reject) => {
|
|
873
|
+
//logger.debug(`push read parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId}`, NS);
|
|
874
|
+
const ts = 0;
|
|
875
|
+
const commandId = constants_1.FirmwareCommand.ReadParameter;
|
|
876
|
+
const networkState = constants_1.NetworkState.Ignore;
|
|
877
|
+
const req = { commandId, networkState, parameterId, parameter, seqNumber, resolve, reject, ts };
|
|
878
|
+
queue.push(req);
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
writeParameterRequest(parameterId, parameter) {
|
|
882
|
+
const seqNumber = this.nextSeqNumber();
|
|
883
|
+
return new Promise((resolve, reject) => {
|
|
884
|
+
//logger.debug(`push write parameter request to queue. seqNr: ${seqNumber} paramId: ${parameterId} parameter: ${parameter}`, NS);
|
|
885
|
+
const ts = 0;
|
|
886
|
+
const commandId = constants_1.FirmwareCommand.WriteParameter;
|
|
887
|
+
const networkState = constants_1.NetworkState.Ignore;
|
|
888
|
+
const req = { commandId, networkState, parameterId, parameter, seqNumber, resolve, reject, ts };
|
|
889
|
+
queue.push(req);
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
sendChangeChannelRequest() {
|
|
893
|
+
const zdpSeq = this.nextTransactionID();
|
|
894
|
+
const scanChannels = 1 << this.networkOptions.channelList[0];
|
|
895
|
+
const scanDuration = 0xfe; // special value = channel change
|
|
896
|
+
const payload = Buffer.alloc(7);
|
|
897
|
+
let pos = 0;
|
|
898
|
+
pos = payload.writeUInt8(zdpSeq, pos);
|
|
899
|
+
pos = payload.writeUInt32LE(scanChannels, pos);
|
|
900
|
+
pos = payload.writeUInt8(scanDuration, pos);
|
|
901
|
+
pos = payload.writeUInt8(this.paramNwkUpdateId, pos);
|
|
902
|
+
const req = {
|
|
903
|
+
requestId: this.nextTransactionID(),
|
|
904
|
+
destAddrMode: constants_1.ApsAddressMode.Nwk,
|
|
905
|
+
destAddr16: constants_1.NwkBroadcastAddress.BroadcastRxOnWhenIdle,
|
|
906
|
+
destEndpoint: 0,
|
|
907
|
+
profileId: 0,
|
|
908
|
+
clusterId: 0x0038, // ZDP_MGMT_NWK_UPDATE_REQ_CLID
|
|
909
|
+
srcEndpoint: 0,
|
|
910
|
+
asduLength: payload.length,
|
|
911
|
+
asduPayload: payload,
|
|
912
|
+
txOptions: 0,
|
|
913
|
+
radius: constants_1.default.PARAM.txRadius.DEFAULT_RADIUS,
|
|
914
|
+
timeout: constants_1.default.PARAM.APS.MAX_SEND_TIMEOUT,
|
|
915
|
+
};
|
|
916
|
+
return this.enqueueApsDataRequest(req);
|
|
917
|
+
}
|
|
918
|
+
async writeLinkKey(ieeeAddress, hashedKey) {
|
|
919
|
+
const buf = Buffer.alloc(8 + 16);
|
|
920
|
+
if (ieeeAddress[1] !== "x") {
|
|
921
|
+
ieeeAddress = `0x${ieeeAddress}`;
|
|
922
|
+
}
|
|
923
|
+
buf.writeBigUint64LE(BigInt(ieeeAddress));
|
|
924
|
+
for (let i = 0; i < 16; i++) {
|
|
925
|
+
buf.writeUint8(hashedKey[i], 8 + i);
|
|
926
|
+
}
|
|
927
|
+
await this.writeParameterRequest(constants_1.ParamId.STK_LINK_KEY, buf);
|
|
928
|
+
}
|
|
929
|
+
readFirmwareVersionRequest() {
|
|
930
|
+
const seqNumber = this.nextSeqNumber();
|
|
931
|
+
return new Promise((resolve, reject) => {
|
|
932
|
+
//logger.debug(`push read firmware version request to queue. seqNr: ${seqNumber}`, NS);
|
|
933
|
+
const ts = 0;
|
|
934
|
+
const commandId = constants_1.FirmwareCommand.FirmwareVersion;
|
|
935
|
+
const networkState = constants_1.NetworkState.Ignore;
|
|
936
|
+
const parameterId = constants_1.ParamId.NONE;
|
|
937
|
+
const req = { commandId, networkState, parameterId, seqNumber, resolve, reject, ts };
|
|
938
|
+
queue.push(req);
|
|
939
|
+
});
|
|
940
|
+
}
|
|
941
|
+
readDeviceStatusRequest() {
|
|
942
|
+
const seqNumber = this.nextSeqNumber();
|
|
943
|
+
return new Promise((resolve, reject) => {
|
|
944
|
+
//logger.debug(`push read firmware version request to queue. seqNr: ${seqNumber}`, NS);
|
|
945
|
+
const ts = 0;
|
|
946
|
+
const commandId = constants_1.FirmwareCommand.Status;
|
|
947
|
+
const networkState = constants_1.NetworkState.Ignore;
|
|
948
|
+
const parameterId = constants_1.ParamId.NONE;
|
|
949
|
+
const req = { commandId, networkState, parameterId, seqNumber, resolve, reject, ts };
|
|
950
|
+
queue.push(req);
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
sendReadParameterRequest(parameterId, seqNumber, arg) {
|
|
954
|
+
let frameLength = 8; // starts with min. frame length
|
|
955
|
+
let payloadLength = 1; // min. parameterId
|
|
956
|
+
if (arg instanceof Buffer) {
|
|
957
|
+
payloadLength += arg.byteLength;
|
|
958
|
+
frameLength += arg.byteLength;
|
|
959
|
+
}
|
|
960
|
+
const buf = new buffalo_1.Buffalo(Buffer.alloc(frameLength));
|
|
961
|
+
buf.writeUInt8(constants_1.FirmwareCommand.ReadParameter);
|
|
962
|
+
buf.writeUInt8(seqNumber);
|
|
963
|
+
buf.writeUInt8(0); // reserved, shall be 0
|
|
964
|
+
buf.writeUInt16(frameLength);
|
|
965
|
+
buf.writeUInt16(payloadLength);
|
|
966
|
+
buf.writeUInt8(parameterId);
|
|
967
|
+
if (arg instanceof Buffer) {
|
|
968
|
+
buf.writeBuffer(arg, arg.byteLength);
|
|
969
|
+
}
|
|
970
|
+
return this.sendRequest(buf.getBuffer());
|
|
971
|
+
}
|
|
972
|
+
sendWriteParameterRequest(parameterId, value, seqNumber) {
|
|
973
|
+
// command id, sequence number, 0, framelength(U16), payloadlength(U16), parameter id, parameter
|
|
974
|
+
const param = constants_1.stackParameters.find((x) => x.id === parameterId);
|
|
975
|
+
if (!param) {
|
|
976
|
+
throw new Error("tried to write unknown stack parameter");
|
|
977
|
+
}
|
|
978
|
+
const buf = Buffer.alloc(128);
|
|
979
|
+
let pos = 0;
|
|
980
|
+
pos = buf.writeUInt8(constants_1.FirmwareCommand.WriteParameter, pos);
|
|
981
|
+
pos = buf.writeUInt8(seqNumber, pos);
|
|
982
|
+
pos = buf.writeUInt8(0, pos); // status: not used
|
|
983
|
+
const posFrameLength = pos; // remember
|
|
984
|
+
pos = buf.writeUInt16LE(0, pos); // dummy frame length
|
|
985
|
+
// -------------- actual data ---------------------------------------
|
|
986
|
+
const posPayloadLength = pos; // remember
|
|
987
|
+
pos = buf.writeUInt16LE(0, pos); // dummy payload length
|
|
988
|
+
pos = buf.writeUInt8(parameterId, pos);
|
|
989
|
+
if (value instanceof Buffer) {
|
|
990
|
+
for (let i = 0; i < value.length; i++) {
|
|
991
|
+
pos = buf.writeUInt8(value[i], pos);
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
else if (typeof value === "number") {
|
|
995
|
+
if (param.type === constants_1.DataType.U8) {
|
|
996
|
+
pos = buf.writeUInt8(value, pos);
|
|
997
|
+
}
|
|
998
|
+
else if (param.type === constants_1.DataType.U16) {
|
|
999
|
+
pos = buf.writeUInt16LE(value, pos);
|
|
1000
|
+
}
|
|
1001
|
+
else if (param.type === constants_1.DataType.U32) {
|
|
1002
|
+
pos = buf.writeUInt32LE(value, pos);
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
throw new Error("tried to write unknown parameter number type");
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
else if (typeof value === "bigint") {
|
|
1009
|
+
if (param.type === constants_1.DataType.U64) {
|
|
1010
|
+
pos = buf.writeBigUInt64LE(value, pos);
|
|
1011
|
+
}
|
|
1012
|
+
else {
|
|
1013
|
+
throw new Error("tried to write unknown parameter number type");
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
else {
|
|
1017
|
+
throw new Error("tried to write unknown parameter type");
|
|
1018
|
+
}
|
|
1019
|
+
const payloadLength = pos - (posPayloadLength + 2);
|
|
1020
|
+
buf.writeUInt16LE(payloadLength, posPayloadLength); // actual payload length
|
|
1021
|
+
buf.writeUInt16LE(pos, posFrameLength); // actual frame length
|
|
1022
|
+
const out = buf.subarray(0, pos);
|
|
1023
|
+
return this.sendRequest(out);
|
|
1024
|
+
}
|
|
1025
|
+
sendReadFirmwareVersionRequest(seqNumber) {
|
|
1026
|
+
/* command id, sequence number, 0, framelength(U16) */
|
|
1027
|
+
return this.sendRequest(Buffer.from([constants_1.FirmwareCommand.FirmwareVersion, seqNumber, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]));
|
|
1028
|
+
}
|
|
1029
|
+
sendReadDeviceStateRequest(seqNumber) {
|
|
1030
|
+
/* command id, sequence number, 0, framelength(U16) */
|
|
1031
|
+
return this.sendRequest(Buffer.from([constants_1.FirmwareCommand.Status, seqNumber, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00]));
|
|
1032
|
+
}
|
|
1033
|
+
sendRequest(buffer) {
|
|
1034
|
+
const frame = Buffer.concat([buffer, this.calcCrc(buffer)]);
|
|
1035
|
+
const slipframe = slip_1.default.encode(frame);
|
|
1036
|
+
if (frame[0] === 0x00) {
|
|
1037
|
+
throw new Error(`send unexpected frame with invalid command ID: 0x${frame[0].toString(16).padStart(2, "0")}`);
|
|
1038
|
+
}
|
|
1039
|
+
if (slipframe.length >= 256) {
|
|
1040
|
+
throw new Error("send unexpected long slip frame");
|
|
1041
|
+
}
|
|
1042
|
+
let written = false;
|
|
1043
|
+
if (this.serialPort) {
|
|
1044
|
+
if (!this.serialPort.isOpen) {
|
|
1045
|
+
throw new Error("Can't write to serial port while it isn't open");
|
|
1046
|
+
}
|
|
1047
|
+
for (let retry = 0; retry < 3 && !written; retry++) {
|
|
1048
|
+
written = this.serialPort.write(slipframe, (err) => {
|
|
1049
|
+
if (err) {
|
|
1050
|
+
throw new Error(`Failed to write to serial port: ${err.message}`);
|
|
1051
|
+
}
|
|
1052
|
+
});
|
|
1053
|
+
// if written is false, we also need to wait for drain()
|
|
1054
|
+
this.serialPort.drain(); // flush
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
else if (this.socketPort) {
|
|
1058
|
+
written = this.socketPort.write(slipframe, (err) => {
|
|
1059
|
+
if (err) {
|
|
1060
|
+
throw new Error(`Failed to write to serial port: ${err.message}`);
|
|
1061
|
+
}
|
|
1062
|
+
written = true;
|
|
1063
|
+
});
|
|
1064
|
+
// handle in upper functions
|
|
1065
|
+
// if (!written) {
|
|
1066
|
+
// await this.sleep(1000);
|
|
1067
|
+
// }
|
|
1068
|
+
}
|
|
1069
|
+
if (!written) {
|
|
1070
|
+
throw new Error(`Failed to send request cmd: ${frame[0]}, seq: ${frame[1]}`);
|
|
1071
|
+
}
|
|
1072
|
+
const result = { cmd: frame[0], seq: frame[1] };
|
|
1073
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandSend, result);
|
|
1074
|
+
return result;
|
|
1075
|
+
}
|
|
1076
|
+
processQueue() {
|
|
1077
|
+
if (queue.length === 0) {
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
if (exports.busyQueue.length > 0) {
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
if (this.txState !== TxState.Idle) {
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
const req = queue.shift();
|
|
1087
|
+
if (req) {
|
|
1088
|
+
req.ts = Date.now();
|
|
1089
|
+
try {
|
|
1090
|
+
switch (req.commandId) {
|
|
1091
|
+
case constants_1.FirmwareCommand.ReadParameter:
|
|
1092
|
+
logger_1.logger.debug(`send read parameter request from queue. parameter: ${constants_1.ParamId[req.parameterId]} seq: ${req.seqNumber}`, NS);
|
|
1093
|
+
this.sendReadParameterRequest(req.parameterId, req.seqNumber, req.parameter);
|
|
1094
|
+
break;
|
|
1095
|
+
case constants_1.FirmwareCommand.WriteParameter:
|
|
1096
|
+
if (req.parameter === undefined) {
|
|
1097
|
+
throw new Error(`Write parameter request without parameter: ${constants_1.ParamId[req.parameterId]}`);
|
|
1098
|
+
}
|
|
1099
|
+
logger_1.logger.debug(`Send write parameter request from queue. seq: ${req.seqNumber} parameter: ${constants_1.ParamId[req.parameterId]}`, NS);
|
|
1100
|
+
this.sendWriteParameterRequest(req.parameterId, req.parameter, req.seqNumber);
|
|
1101
|
+
break;
|
|
1102
|
+
case constants_1.FirmwareCommand.FirmwareVersion:
|
|
1103
|
+
logger_1.logger.debug(`Send read firmware version request from queue. seq: ${req.seqNumber}`, NS);
|
|
1104
|
+
this.sendReadFirmwareVersionRequest(req.seqNumber);
|
|
1105
|
+
break;
|
|
1106
|
+
case constants_1.FirmwareCommand.Status:
|
|
1107
|
+
//logger.debug(`Send read device state from queue. seqNr: ${req.seqNumber}`, NS);
|
|
1108
|
+
this.sendReadDeviceStateRequest(req.seqNumber);
|
|
1109
|
+
break;
|
|
1110
|
+
case constants_1.FirmwareCommand.ChangeNetworkState:
|
|
1111
|
+
logger_1.logger.debug(`Send change network state request from queue. seq: ${req.seqNumber}`, NS);
|
|
1112
|
+
this.sendChangeNetworkStateRequest(req.seqNumber, req.networkState);
|
|
1113
|
+
break;
|
|
1114
|
+
default:
|
|
1115
|
+
throw new Error("process queue - unknown command id");
|
|
1116
|
+
}
|
|
1117
|
+
exports.busyQueue.push(req);
|
|
1118
|
+
}
|
|
1119
|
+
catch (_err) {
|
|
1120
|
+
//console.error(err);
|
|
1121
|
+
req.reject(new Error(`Failed to process request ${constants_1.FirmwareCommand[req.commandId]}, seq: ${req.seqNumber}`));
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
processBusyQueueTimeouts() {
|
|
1126
|
+
let i = exports.busyQueue.length;
|
|
1127
|
+
while (i--) {
|
|
1128
|
+
const req = exports.busyQueue[i];
|
|
1129
|
+
const now = Date.now();
|
|
1130
|
+
if (10000 < now - req.ts) {
|
|
1131
|
+
//remove from busyQueue
|
|
1132
|
+
exports.busyQueue.splice(i, 1);
|
|
1133
|
+
this.timeoutCounter++;
|
|
1134
|
+
req.reject(new Error(`Timeout for queued command ${constants_1.FirmwareCommand[req.commandId]}, seq: ${req.seqNumber}`));
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
changeNetworkStateRequest(networkState) {
|
|
1139
|
+
const seqNumber = this.nextSeqNumber();
|
|
1140
|
+
return new Promise((resolve, reject) => {
|
|
1141
|
+
//logger.debug(`push change network state request to apsQueue. seqNr: ${seqNumber}`, NS);
|
|
1142
|
+
const ts = 0;
|
|
1143
|
+
const commandId = constants_1.FirmwareCommand.ChangeNetworkState;
|
|
1144
|
+
const parameterId = constants_1.ParamId.NONE;
|
|
1145
|
+
const req = { commandId, networkState, parameterId, seqNumber, resolve, reject, ts };
|
|
1146
|
+
queue.push(req);
|
|
1147
|
+
});
|
|
1148
|
+
}
|
|
1149
|
+
sendChangeNetworkStateRequest(seqNumber, networkState) {
|
|
1150
|
+
return this.sendRequest(Buffer.from([constants_1.FirmwareCommand.ChangeNetworkState, seqNumber, 0x00, 0x06, 0x00, networkState]));
|
|
1151
|
+
}
|
|
1152
|
+
checkDeviceStatus(deviceStatus) {
|
|
1153
|
+
this.deviceStatus = deviceStatus;
|
|
1154
|
+
this.configChanged = (deviceStatus >> 4) & 0x01;
|
|
1155
|
+
this.emitStateEvent(DriverEvent.DeviceStateUpdated, deviceStatus);
|
|
1156
|
+
}
|
|
1157
|
+
enqueueApsDataRequest(request) {
|
|
1158
|
+
const seqNumber = this.nextSeqNumber();
|
|
1159
|
+
return new Promise((resolve, reject) => {
|
|
1160
|
+
//logger.debug(`push enqueue send data request to apsQueue. seqNr: ${seqNumber}`, NS);
|
|
1161
|
+
const ts = Date.now();
|
|
1162
|
+
const commandId = constants_1.FirmwareCommand.ApsDataRequest;
|
|
1163
|
+
const req = { commandId, seqNumber, request, resolve, reject, ts };
|
|
1164
|
+
exports.apsQueue.push(req);
|
|
1165
|
+
this.emitStateEvent(DriverEvent.EnqueuedApsDataRequest, req.seqNumber);
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
processApsQueue() {
|
|
1169
|
+
if (exports.apsQueue.length === 0) {
|
|
1170
|
+
return;
|
|
1171
|
+
}
|
|
1172
|
+
if (this.txState !== TxState.Idle) {
|
|
1173
|
+
return;
|
|
1174
|
+
}
|
|
1175
|
+
const req = exports.apsQueue.shift();
|
|
1176
|
+
if (!req) {
|
|
1177
|
+
return;
|
|
1178
|
+
}
|
|
1179
|
+
if (req.request) {
|
|
1180
|
+
req.ts = Date.now();
|
|
1181
|
+
if (req.commandId !== constants_1.FirmwareCommand.ApsDataRequest) {
|
|
1182
|
+
// should never happen
|
|
1183
|
+
throw new Error("process APS queue - unknown command id");
|
|
1184
|
+
}
|
|
1185
|
+
try {
|
|
1186
|
+
this.sendEnqueueApsDataRequest(req.request, req.seqNumber);
|
|
1187
|
+
exports.apsBusyQueue.push(req);
|
|
1188
|
+
}
|
|
1189
|
+
catch (_) {
|
|
1190
|
+
exports.apsQueue.unshift(req);
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
sendReadApsConfirmRequest(seqNumber) {
|
|
1195
|
+
logger_1.logger.debug(`Request APS-DATA.confirm seq: ${seqNumber}`, NS);
|
|
1196
|
+
return this.sendRequest(Buffer.from([constants_1.FirmwareCommand.ApsDataConfirm, seqNumber, 0x00, 0x07, 0x00, 0x00, 0x00]));
|
|
1197
|
+
}
|
|
1198
|
+
sendReadApsIndicationRequest(seqNumber) {
|
|
1199
|
+
logger_1.logger.debug(`Request APS-DATA.indication seq: ${seqNumber}`, NS);
|
|
1200
|
+
return this.sendRequest(Buffer.from([constants_1.FirmwareCommand.ApsDataIndication, seqNumber, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01]));
|
|
1201
|
+
}
|
|
1202
|
+
sendEnqueueApsDataRequest(request, seqNumber) {
|
|
1203
|
+
const payloadLength = 12 + (request.destAddrMode === constants_1.ApsAddressMode.Group ? 2 : request.destAddrMode === constants_1.ApsAddressMode.Nwk ? 3 : 9) + request.asduLength;
|
|
1204
|
+
const frameLength = 7 + payloadLength;
|
|
1205
|
+
const cid1 = request.clusterId & 0xff;
|
|
1206
|
+
const cid2 = (request.clusterId >> 8) & 0xff;
|
|
1207
|
+
const asdul1 = request.asduLength & 0xff;
|
|
1208
|
+
const asdul2 = (request.asduLength >> 8) & 0xff;
|
|
1209
|
+
let destArray = [];
|
|
1210
|
+
let dest = "";
|
|
1211
|
+
if (request.destAddr16 !== undefined) {
|
|
1212
|
+
destArray[0] = request.destAddr16 & 0xff;
|
|
1213
|
+
destArray[1] = (request.destAddr16 >> 8) & 0xff;
|
|
1214
|
+
dest = request.destAddr16.toString(16);
|
|
1215
|
+
}
|
|
1216
|
+
if (request.destAddr64 !== undefined) {
|
|
1217
|
+
dest = request.destAddr64;
|
|
1218
|
+
destArray = this.macAddrStringToArray(request.destAddr64);
|
|
1219
|
+
}
|
|
1220
|
+
if (request.destEndpoint !== undefined) {
|
|
1221
|
+
destArray.push(request.destEndpoint);
|
|
1222
|
+
dest += " EP:";
|
|
1223
|
+
dest += request.destEndpoint;
|
|
1224
|
+
}
|
|
1225
|
+
logger_1.logger.debug(`Request APS-DATA.request: dest: 0x${dest} seq: ${seqNumber} requestId: ${request.requestId}`, NS);
|
|
1226
|
+
return this.sendRequest(Buffer.from([
|
|
1227
|
+
constants_1.FirmwareCommand.ApsDataRequest,
|
|
1228
|
+
seqNumber,
|
|
1229
|
+
0x00,
|
|
1230
|
+
frameLength & 0xff,
|
|
1231
|
+
(frameLength >> 8) & 0xff,
|
|
1232
|
+
payloadLength & 0xff,
|
|
1233
|
+
(payloadLength >> 8) & 0xff,
|
|
1234
|
+
request.requestId,
|
|
1235
|
+
0x00,
|
|
1236
|
+
request.destAddrMode,
|
|
1237
|
+
...destArray,
|
|
1238
|
+
request.profileId & 0xff,
|
|
1239
|
+
(request.profileId >> 8) & 0xff,
|
|
1240
|
+
cid1,
|
|
1241
|
+
cid2,
|
|
1242
|
+
request.srcEndpoint,
|
|
1243
|
+
asdul1,
|
|
1244
|
+
asdul2,
|
|
1245
|
+
...request.asduPayload,
|
|
1246
|
+
request.txOptions,
|
|
1247
|
+
request.radius,
|
|
1248
|
+
]));
|
|
1249
|
+
}
|
|
1250
|
+
processApsBusyQueueTimeouts() {
|
|
1251
|
+
let i = exports.apsBusyQueue.length;
|
|
1252
|
+
while (i--) {
|
|
1253
|
+
const req = exports.apsBusyQueue[i];
|
|
1254
|
+
const now = Date.now();
|
|
1255
|
+
let timeout = 60000;
|
|
1256
|
+
if (req.request != null && req.request.timeout != null) {
|
|
1257
|
+
timeout = req.request.timeout * 1000; // seconds * 1000 = milliseconds
|
|
1258
|
+
}
|
|
1259
|
+
if (now - req.ts > timeout) {
|
|
1260
|
+
//remove from busyQueue
|
|
1261
|
+
exports.apsBusyQueue.splice(i, 1);
|
|
1262
|
+
req.reject(new Error(`Timeout for APS-DATA.request, seq: ${req.seqNumber}`));
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
calcCrc(buffer) {
|
|
1267
|
+
let crc = 0;
|
|
1268
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
1269
|
+
crc += buffer[i];
|
|
1270
|
+
}
|
|
1271
|
+
const crc0 = (~crc + 1) & 0xff;
|
|
1272
|
+
const crc1 = ((~crc + 1) >> 8) & 0xff;
|
|
1273
|
+
return Buffer.from([crc0, crc1]);
|
|
1274
|
+
}
|
|
1275
|
+
macAddrStringToArray(addr) {
|
|
1276
|
+
if (addr.indexOf("0x") === 0) {
|
|
1277
|
+
addr = addr.slice(2, addr.length);
|
|
1278
|
+
}
|
|
1279
|
+
if (addr.length < 16) {
|
|
1280
|
+
for (let l = 0; l < 16 - addr.length; l++) {
|
|
1281
|
+
addr = `0${addr}`;
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
const result = [];
|
|
1285
|
+
let y = 0;
|
|
1286
|
+
for (let i = 0; i < 8; i++) {
|
|
1287
|
+
result[i] = Number.parseInt(addr.substr(y, 2), 16);
|
|
1288
|
+
y += 2;
|
|
1289
|
+
}
|
|
1290
|
+
const reverse = result.reverse();
|
|
1291
|
+
return reverse;
|
|
1292
|
+
}
|
|
1293
|
+
macAddrArrayToString(addr) {
|
|
1294
|
+
if (addr.length !== 8) {
|
|
1295
|
+
throw new Error(`invalid array length for MAC address: ${addr.length}`);
|
|
1296
|
+
}
|
|
1297
|
+
let result = "0x";
|
|
1298
|
+
let char = "";
|
|
1299
|
+
let i = 8;
|
|
1300
|
+
while (i--) {
|
|
1301
|
+
char = addr[i].toString(16);
|
|
1302
|
+
if (char.length < 2) {
|
|
1303
|
+
char = `0${char}`;
|
|
1304
|
+
}
|
|
1305
|
+
result += char;
|
|
1306
|
+
}
|
|
1307
|
+
return result;
|
|
1308
|
+
}
|
|
1309
|
+
/**
|
|
1310
|
+
* generalArrayToString result is not reversed!
|
|
1311
|
+
*/
|
|
1312
|
+
generalArrayToString(key, length) {
|
|
1313
|
+
let result = "0x";
|
|
1314
|
+
let char = "";
|
|
1315
|
+
let i = 0;
|
|
1316
|
+
while (i < length) {
|
|
1317
|
+
char = key[i].toString(16);
|
|
1318
|
+
if (char.length < 2) {
|
|
1319
|
+
char = `0${char}`;
|
|
1320
|
+
}
|
|
1321
|
+
result += char;
|
|
1322
|
+
i++;
|
|
1323
|
+
}
|
|
1324
|
+
return result;
|
|
1325
|
+
}
|
|
1326
|
+
nextSeqNumber() {
|
|
1327
|
+
this.seqNumber++;
|
|
1328
|
+
if (this.seqNumber > 254) {
|
|
1329
|
+
this.seqNumber = 1;
|
|
1330
|
+
}
|
|
1331
|
+
return this.seqNumber;
|
|
1332
|
+
}
|
|
1333
|
+
onParsed(frame) {
|
|
1334
|
+
if (frame.length >= 5) {
|
|
1335
|
+
// min. packet length [cmd, seq, status, u16 storedLength]
|
|
1336
|
+
const storedLength = (frame[4] << 8) | frame[3];
|
|
1337
|
+
if (storedLength + 2 !== frame.length) {
|
|
1338
|
+
// frame without CRC16
|
|
1339
|
+
return;
|
|
1340
|
+
}
|
|
1341
|
+
let crc = 0;
|
|
1342
|
+
for (let i = 0; i < storedLength; i++) {
|
|
1343
|
+
crc += frame[i];
|
|
1344
|
+
}
|
|
1345
|
+
crc = (~crc + 1) & 0xffff;
|
|
1346
|
+
const crcFrame = (frame[frame.length - 1] << 8) | frame[frame.length - 2];
|
|
1347
|
+
if (crc === crcFrame) {
|
|
1348
|
+
this.lastFirmwareRxTime = Date.now();
|
|
1349
|
+
this.emitStateEvent(DriverEvent.FirmwareCommandReceived, { cmd: frame[0], seq: frame[1] });
|
|
1350
|
+
this.emit("rxFrame", frame.slice(0, storedLength));
|
|
1351
|
+
}
|
|
1352
|
+
else {
|
|
1353
|
+
logger_1.logger.debug("frame CRC invalid (could be ASCII message)", NS);
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
else {
|
|
1357
|
+
logger_1.logger.debug(`frame length (${frame.length}) < 5, discard`, NS);
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
exports.default = Driver;
|
|
1362
|
+
//# sourceMappingURL=driver.js.map
|