zigbee-on-host
    Preparing search index...

    zigbee-on-host

    ZigBee on Host

    Version CI CodeQL

    Open Source ZigBee stack designed to run on a host and communicate with a radio co-processor (RCP).

    Current implementation aims for compatibility with OpenThread RCP firmware. That base provides compatibility with any chip manufacturer that supports it (Silabs, TI, etc.) with the only requirements being proper implementation of the STREAM_RAW mechanism of the Spinel protocol (which allows to send raw 802.15.4 frames, including... ZigBee!) and hardware MAC ACKing.

    This library can also serve as a base for pentesting ZigBee networks thanks to the ability to easily craft various payloads at any layer of the specification and send them through the raw stream using any network parameters.

    Important

    Work in progress! Expect breaking changes without backwards compatibility for a while!

    Some quick guidelines to keep the codebase maintainable:

    • No external production dependencies
    • Mark TODO / XXX / @deprecated in code as needed for quick access
    • Performance in mind (with the goal to eventually bring the appropriate layers to a lower language as needed)
      • No expensive calls (stringify, etc.)
      • Bail as early as possible (no unnecessary parsing, holding waiters, etc.)
      • Ability to no-op expensive "optional" features
      • And the usuals...
    • Keep MAC/ZigBee property naming mostly in line with Wireshark for easier debugging
    • Keep in line with the ZigBee 3.0 specification, but allow optimization due to the host-driven nature and removal of unnecessary features that won't impact compatibility
    • Focus on "Centralized Trust Center" implementation (at least at first)

    [~] Partial feature, [?] Uncertain feature

    • [x] Encoding/decoding of Spinel & HDLC protocols
    • [x] Encoding/decoding of MAC frames
    • [x] Encoding/decoding of ZigBee NWK frames
      • [ ] Lacking reference sniffs for multicast (group)
    • [x] Encoding/decoding of ZigBee NWK GP frames
    • [x] Encoding/decoding of ZigBee NWK APS frames
    • [x] Network forming
    • [x] Network state saving (de facto backups)
    • [x] Network state reset
    • [x] Joining/Rejoining
      • [x] APS TC link key update mechanism (global)
      • [x] Direct child router
      • [x] Direct child end device
      • [x] Nested device
    • [x] Indirect transmission mechanism
    • [x] Source routing
    • [ ] Route repairing
    • [x] Coordinator LQI/Routing tables (for network map data on coordinator side)
    • [x] LQI reporting
      • [ ] Refining
    • [ ] Install codes
    • [?] APS APP link keys
    • [ ] InterPAN / Touchlink
    • [ ] R23 (need reference sniffs...)
    • [~] Security
    • [ ] Metrics/Statistics
    • [ ] Big cleanup of unused / never will use!

    And likely more, and of course a bunch of TODOs in the code!

    You can also contribute by submitting sniffs/captures. More information here.

    • [Texas Instruments] Does not currently implement PHY_CCA_THRESHOLD (cannot read or write value)
    • CI: ~70% coverage
    • Stress-testing: pending
    • Firmware stability:
      • Silicon Labs: ongoing
      • Texas Instruments: ongoing
      • Nordic Semiconductor: pending
    • Usage in test networks: ongoing
    • Usage in live networks: pending

    Use the appropriate OpenThread RCP firmware for your adapter:

    Zigbee2MQTT 2.1.3-dev (after PR #26742) and later versions should allow the use of the zoh adapter. Make sure you followed the above steps to get the proper firmware, then configure your configuration.yaml, including:

    Tip

    It is currently recommended you use Zigbee2MQTT latest-dev (edge) to get the latest fixes when testing this implementation!

    serial:
    port: /dev/serial/by-id/my-device-id-here
    adapter: zoh
    # unused for TCP-based coordinator
    baudrate: 460800
    # as appropriate for your coordinator/firmware, unused for TCP-based coordinator
    rtscts: true
    Tip

    ZigBee on Host saves the current state of the network in the file zoh.save. It is similar to the NVRAM of an NCP coordinator. This file contains everything needed to re-establish the network on start, hence, a coordinator_backup.json is never created by Zigbee2MQTT. It is located alongside the database.db in the data folder.

    Tip

    The EUI64 (IEEE address) in the firmware of the coordinator is ignored in this mode. A static one is used instead (set by Zigbee2MQTT), allowing you to change coordinators at will on the same network (although you may encounter device-related troubles when radio specs vary wildly).

    Clone the repository.

    git clone https://github.com/Nerivec/zigbee-on-host
    cd zigbee-on-host

    Install dev dependencies and build:

    npm ci
    npm run build
    Important

    Running npm run build:prod omits the src/dev directory (for production). If you do, you will not be able to use dev:* commands.

    Tip

    If having issues with building, try removing the *.tsbuildinfo incremental compilation files (or run npm run clean first).

    npm run dev:z2z ./path/to/data/
    
    Tip

    This allows you to quickly take over a network created with zstack or ember. You then just need to change the configuration.yaml to adapter: zoh and baudrate: 460800 (and port as appropriate).

    npm run dev:z2r ./path/to/data/
    

    Get a list of supported commands with:

    npm run dev:cli help
    
    Tip

    dev:cli commands can be configured in more details using the file dist/dev/conf.json. Some environment variables are also available to quickly configure the adapter & wireshark. The effective config is printed at the start of every command (help included).

    git clone https://github.com/Nerivec/zigbee-on-host
    cd zigbee-on-host
    docker compose -f docker/compose.dev.yaml up -d --pull never
    docker compose -f docker/compose.dev.yaml exec zigbee-on-host npm ci
    docker compose -f docker/compose.dev.yaml exec zigbee-on-host npm run build

    Create 'zoh.save' (details above):

    docker compose -f docker/compose.dev.yaml exec zigbee-on-host npm run dev:z2z ./path/to/data
    

    Print readable 'zoh.save' content (details above):

    docker compose -f docker/compose.dev.yaml exec zigbee-on-host npm run dev:z2r ./path/to/data
    

    CLI:

    docker compose -f docker/compose.dev.yaml exec zigbee-on-host npm run dev:cli help
    
    Tip

    dev:cli commands can be configured in more details using the file dist/dev/conf.json. Some environment variables are also available to configure the adapter & wireshark from the compose file. The effective config is printed at the start of every command (help included).

    docker compose -f docker/compose.dev.yaml down