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