Differences

This shows you the differences between two versions of the page.

Link to this comparison view

iothings:laboratoare:2025:lab5 [2025/10/22 09:27]
dan.tudose [Lab 5. Zigbee]
iothings:laboratoare:2025:lab5 [2025/10/22 11:33] (current)
dan.tudose [Zigbee Router + End Device]
Line 28: Line 28:
  
  
-{{:​iothings:​laboratoare:​2025:​zigbee-stack-diagram.png?​600| }}+{{ :​iothings:​laboratoare:​2025:​zigbee-stack-diagram.png?​600 |}}
  
  
Line 48: Line 48:
   * **Mesh:** Ad hoc multi‑hop routing using variants of AODV; resilient against single‑node failures.   * **Mesh:** Ad hoc multi‑hop routing using variants of AODV; resilient against single‑node failures.
  
-{{:​iothings:​laboratoare:​2025:​zigbee-network-topologies.png?​600|}}+{{ :​iothings:​laboratoare:​2025:​zigbee-network-topologies.png?​600 |}}
  
  
Line 96: Line 96:
  
  
-===== Example: Forming & Joining (Pseudo CLI) ===== 
-<​code>​ 
-# Coordinator 
-radio set channel 20 
-nwk set extpanid 0x1122334455667788 
-nwk set panid 0x1A2B 
-sec set tc install_codes on 
-nwk start 
-nwk permit-join 120   # seconds 
  
-# Router or End Device +====== Zigbee ​End Device ​Example ====== 
-scan active + 
-join 0x1122334455667788 +In this example we will be setting up the ESP32-C6 Sparrow node to act as a Zigbee End Device, registering to the network and sending periodic temperature,​ humidity and pressure readings to the Coordinator. 
-tcbinding establish ​   # using install ​code or pre-shared link key+As a coordinator we will be using a [[https://​www.home-assistant.io/​green/​|Home Assistant Green]] gateway with a [[https://​www.home-assistant.io/​connectzbt1|Connect ZBT-1]] Zigbee Coordinator attached. 
 + 
 + 
 +You will need to edit platformio.ini and add these compile flags and libraries:​ 
 + 
 +<code bash platformio.ini>​ 
 +[env:esp32-c6-sparrow] 
 +platform = https://​github.com/​pioarduino/​platform-espressif32/​releases/​download/​54.03.20/​platform-espressif32.zip 
 +board = esp32-c6-devkitm-1 
 +framework = arduino 
 +; use SPIFFS for on-board files 
 +;​board_build.filesystem = spiffs 
 +  
 +build_flags = 
 +  -D ARDUINO_USB_MODE=1 
 +  -D ARDUINO_USB_CDC_ON_BOOT=1 
 +  -D ESP32_C6_env 
 +  -D ZIGBEE_MODE_ED 
 +  ; (optional) more logs while bringing up Zigbee 
 +  -D CORE_DEBUG_LEVEL=5 
 + 
 +; Use a partitions.csv that contains Zigbee NV partitions 
 +board_build.partitions = partitions.csv 
 + 
 +monitor_speed = 115200 
 +  
 +lib_deps = 
 +  adafruit/​Adafruit BME680 Library@^2.0.3 
 +  adafruit/​Adafruit Unified Sensor@^1.1.14 
 +  adafruit/​Adafruit NeoPixel@^1.12.0 
 </​code>​ </​code>​
  
 +Also, in the project root (same level as platformio.ini) you will need to create a .csv file that specifies the Zigbee partitions for the ED.
  
 +<code C partitions.csv>​
 +# Name,     Type, SubType, Offset, ​  ​Size, ​   Flags
 +nvs,        data, nvs,      0x9000, ​  ​0x5000,​
 +otadata, ​   data, ota,      0xE000, ​  ​0x2000,​
 +app0,       ​app, ​ ota_0, ​   0x10000, ​ 0x140000,
 +app1,       ​app, ​ ota_1, ​   0x150000, 0x140000,
 +spiffs, ​    data, spiffs, ​  ​0x290000,​ 0x15B000,
 +zb_storage, data, fat,      0x3EB000, 0x4000,
 +zb_fct, ​    data, fat,      0x3EF000, 0x1000,
 +coredump, ​  data, coredump, 0x3F0000, 0x10000,
 +
 +</​code>​
 +
 +
 +Then you can add the main.cpp contents. ​
 +
 +[[iothings:​laboratoare:​2025_code:​lab5_1| Click here to get the code sample.]]
 +
 +
 +This code sets up a Zigbee End Device on ESP32-C6 Sparrow that periodically reads environmental data from a BME680 sensor (temperature,​ humidity, and pressure) and reports it via Zigbee using two custom endpoints. ​ It also handles Zigbee identify mode with blinking the neopixel LED and allows factory reset by holding the BOOT button for 3 seconds.
 +
 +The device registers itself on the Zigbee network with manufacturer and model identifiers,​ sets reporting intervals and tolerances for each sensor type, and reacts to identify commands by blinking its LED. If Zigbee fails to initialize or connect, it restarts the ESP32. ​
 + 
 +====== Zigbee Router + End Device ======
 +
 +In this next example we will simulate a Zigbee smart lightbulb controlled by a Zigbee light switch, using two ESP32-C6 Sparrow nodes.
 +
 +=== Node 1: Zigbee End Device – Light Switch Profile ===
 +
 +  * Acts as a Zigbee switch (e.g. On/Off Switch cluster).
 +  * GPIO 9 (BOOT button) acts as a toggle input.
 +  * Sends On or Off commands via Zigbee to a bound target (another Zigbee device).
 +  * Minimal power draw = good for battery operation.
 +
 +=== Node 2: Zigbee Router – Lightbulb Profile ===
 +
 +  * Acts as a Zigbee Router (always powered).
 +  * Implements On/Off Light Device cluster.
 +  * Toggles onboard NeoPixel based on received commands.
 +
 +
 +When the ED button is pressed it sends an On or Off Zigbee command to the bound router device. The router receives the command and toggles the NeoPixel accordingly. Zigbee binding or group addressing links the two.
 +
 +
 +=== Platformio Project Setup ===
 +
 +You will need to modify platformio.ini with this dual-environment file:
 +
 +<code bash platformio.ini>​
 +; PlatformIO Project Configuration File
 +;
 +;   Build options: build flags, source filter
 +;   ​Upload options: custom upload port, speed and extra flags
 +;   ​Library options: dependencies,​ extra library storages
 +;   ​Advanced options: extra scripting
 +;
 +; See https://​docs.platformio.org/​page/​projectconf.html for details.
 +
 +[platformio]
 +default_envs = sparrow-switch
 +
 +[env]
 +platform = https://​github.com/​pioarduino/​platform-espressif32/​releases/​download/​54.03.20/​platform-espressif32.zip
 +board = esp32-c6-devkitm-1
 +framework = arduino
 +; use SPIFFS for on-board files
 +;​board_build.filesystem = spiffs
 +build_flags =
 +  -D ARDUINO_USB_MODE=1
 +  -D ARDUINO_USB_CDC_ON_BOOT=1
 +  -D ESP32_C6_env
 +  ; (optional) more logs while bringing up Zigbee
 +  ;-D CORE_DEBUG_LEVEL=5
 +
 +; Use a partitions.csv that contains Zigbee NV partitions (see step 2)
 +board_build.partitions = partitions.csv
 +
 +monitor_speed = 115200
 +
 +[env:​sparrow-switch]
 +build_flags =
 +  ${env.build_flags}
 +  -D ZIGBEE_MODE_ED
 +  -D SPARROW_SWITCH
 +  -D CONFIG_ZB_ENABLED=1
 +  -L$PLATFORMIO_PACKAGES_DIR/​framework-arduinoespressif32-libs/​esp32c6/​lib
 +  -lesp_zb_api.ed
 +  -lzboss_stack.ed
 +  -lzboss_port.native
 +  -lzboss_port.remote
 +
 +[env:​sparrow-light]
 +build_flags =
 +  ${env.build_flags}
 +  -D ZIGBEE_MODE_ROUTER
 +  -D SPARROW_LIGHT
 +  -D CONFIG_ZB_ENABLED=1
 +  -L$PLATFORMIO_PACKAGES_DIR/​framework-arduinoespressif32-libs/​esp32c6/​lib
 +  -lesp_zb_api.zczr
 +  -lzboss_stack.zczr
 +  -lzboss_port.native
 +  -lzboss_port.remote
 +lib_deps =
 +  adafruit/​Adafruit NeoPixel@^1.12.0
 +
 +
 +</​code>​
  
 +When building and deploying on the two nodes, switch ''​default_envs''​ between ''​sparrow-switch''​ and ''​sparrow-light''​.
  
 +Keep the same partitions.csv file.
  
 +The main is a dual one, depending on which type of device you are building for from platformio.ini.
  
 +[[iothings:​laboratoare:​2025_code:​lab5_2|Click here to get the code for this example.]]
  
iothings/laboratoare/2025/lab5.1761114442.txt.gz · Last modified: 2025/10/22 09:27 by dan.tudose
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0