Extend Your Zigbee Network Coverage with an Affordable ESP32-C6!
This ESPHome configuration turns an ESP32-C6 board into a Zigbee router that seamlessly integrates with your Zigbee network to expand coverage and improve connectivity for your Zigbee devices.
| Requirement | Description |
|---|---|
| π§ Hardware | ESP32-C6 board (tested with Seeed Studio XIAO ESP32C6) |
| π Network | Zigbee Coordinator in your network (e.g., Home Assistant with Zigbee2MQTT or ZHA) |
| π» Software | ESPHome installed |
| π Cable | USB cable for initial flashing |
| π¦ Optional | 3D-printed case - XIAO ESP32-C6 Case |
A Zigbee router is a mains-powered device that:
- β Relays Zigbee signals between devices (mesh network)
- β Extends the range of your Zigbee network
- β Improves stability and reliability
- β Connects battery-powered devices (End Devices) to the Coordinator
The default configuration works right away! You can optionally customize:
esp32-c6-zigbee-router.yaml:
substitutions:
device_name: esp32-c6-zigbee-router # Unique name
friendly_name: ESP32-C6 Zigbee Router # Display nameEnable WiFi (optional):
# Uncomment lines in the YAML file:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphomeConnect your ESP32-C6 via USB and flash the firmware using local ESPHome:
esphome run esp32-c6-zigbee-router.yaml --device=/dev/ttyACM0π‘ Note: Replace
/dev/ttyACM0with your device path (see troubleshooting below)
π Important Notes & Troubleshooting
| OS | Typical Paths |
|---|---|
| π§ Linux | /dev/ttyUSB0, /dev/ttyACM0, /dev/ttyUSB1 |
| π macOS | /dev/cu.usbserial-*, /dev/cu.wchusbserial* |
| πͺ Windows | COM3, COM4, etc. |
Check available ports:
- Linux/macOS:
ls /dev/tty* - Windows: Device Manager
Standard Linux - Add user to dialout group:
sudo usermod -a -G dialout $USER
# Then log out and back inFedora Atomic/Bazzite with rootless Docker/Podman:
The dialout group doesn't work reliably on immutable systems. You need to fix permissions before each flash:
# Check permissions
ls -la /dev/ttyACM0
# Output: crw-rw----. 1 root dialout 166, 0 ...
# Fix temporarily (resets on USB reconnect)
sudo chmod 666 /dev/ttyACM0
# If using Docker/Podman, restart the container
docker-compose restart
β οΈ Note: You need to runsudo chmod 666each time you reconnect the USB device.
π³ Alternative: Using Docker/Podman
β οΈ Important: When using Docker/Podman (rootless), you need to fix USB permissions before flashing.
# 1. Start container
docker-compose up -d
# 2. Flash the firmware
docker-compose exec esphome esphome run /config/zigbee/esp32-c6-zigbee-router.yaml --device=/dev/ttyACM0π Note: The docker-compose.yml mounts the parent
config/directory to/configin the container. That's why you need/config/zigbee/in the path above. This is necessary so ESPHome can find the build files in.esphome/.
π Alternative: Web Dashboard (GUI)
Choose between local or hosted dashboard:
Docker Dashboard:
# Start container if not already running
docker-compose up -d
# Start the dashboard
docker-compose exec esphome esphome dashboard /configThen open http://localhost:6052 in your browser and navigate to the zigbee folder.
Local Dashboard (requires local ESPHome):
esphome dashboard .Then open http://localhost:6052 in your browser and use the web interface.
Hosted Dashboard (no installation needed):
π No installation needed! Flash directly from your browser.
- Visit https://web.esphome.io/
- Click "Connect" and select your ESP32-C6 device
- Upload your
esp32-c6-zigbee-router.yamlconfiguration file - Click "Install" to compile and flash
Perfect for: Users who prefer GUI over command line, or quick flashing without local ESPHome installation.
After flashing is complete, enable pairing mode on your Zigbee Coordinator:
Zigbee2MQTT:
- Open the Zigbee2MQTT Web UI
- Click "Permit join (All)" button (top right)
- Pairing mode stays active for 4-5 minutes
- The ESP32-C6 will automatically appear in the device list
ZHA (Home Assistant):
- Go to Settings β Devices & Services β ZHA
- Click "Add Device"
- Select "Add Zigbee device"
- The ESP32-C6 will be discovered and added
β±οΈ Note: The device will search for and join the network automatically within 30-60 seconds after boot. Keep pairing mode active until the device appears!
Logging Options:
π Option A: Serial Connection (USB)
- Always available - Connect via USB cable
π‘ Option B: Over WiFi (OTA)
- Only works when WiFi is enabled
esphome logs esp32-c6-zigbee-router.yamlYou should see:
- No continuous error messages
[zigbee:xxx] Device Type: Router- Successful connection to Zigbee network
Zigbee2MQTT:
- Open the Zigbee2MQTT Web UI
- Go to "Map"
- The ESP32-C6 should be visible as a router
- Check the Link Quality to other devices
ZHA (Home Assistant):
- Go to Settings β Devices & Services β ZHA
- Click "Visualize"
- The ESP32-C6 should be displayed as a router
- Go to Settings β Devices & Services
- The ESP32-C6 should appear as a discovered device
- Add it to Home Assistant (use
esp32-c6-zigbee-router.localor IP address) - Check device status - should show "Online"
To flash multiple ESP32-C6 devices and use them as separate routers in the same Zigbee network:
For each additional device, create a new YAML file (e.g., esp32-c6-zigbee-router-2.yaml):
Each device will join the same Zigbee network and act as an independent router, extending your mesh coverage.
esphome run esp32-c6-zigbee-router-2.yaml --device=/dev/ttyACM0.
βββ esp32-c6-zigbee-router.yaml # Main ESPHome configuration
βββ esp32-c6-zigbee-router-2.yaml # Optional: Second router
βββ esp32-c6-zigbee-router-3.yaml # Optional: Third router
βββ partitions_zb.csv # Custom Partition Table for Zigbee
βββ secrets.yaml # Shared credentials (not in git)
βββ .gitignore # Excludes secrets and build artifacts
βββ docker-compose.yml # Docker/Podman setup for ESPHome
βββ README.md # This file
| Resource | Description |
|---|---|
| π ESPHome Zigbee Component | External Zigbee component for ESPHome |
| π Zigbee Alliance | Learn the basics of Zigbee networking |
| π Home Assistant Zigbee Integration | How Zigbee works in Home Assistant |
| π‘ Zigbee2MQTT | Alternative Zigbee bridge |
Made by the open source community
β Star us on GitHub β’ π Report a Bug β’ π‘ Request a Feature