El sensor del patio que nunca llega

¿Tienes un sensor de temperatura, una ampolleta o un contacto de puerta que en Home Assistant aparece cada dos por tres como "no disponible"? Casi siempre no es el sensor: es que la señal Zigbee no alcanza a cruzar un muro de hormigón o el piso de arriba. La solución clásica es comprar un repetidor comercial de 15.000 a 30.000 pesos que solo sabe hacer una cosa: repetir. En este tutorial vas a hacer lo mismo (y más) con un ESP32-C6 que cuesta una fracción de eso.

Al terminar vas a tener un router Zigbee 3.0 propio, flasheado con ESPHome, sumado a tu red ZHA como un nodo más de la malla. Sin nube, sin suscripción, y con la puerta abierta para que después ese mismo board te entregue sus propios sensores como endpoints Zigbee. Vas a aprender por qué el C6 sirve para esto, cómo dejar la config YAML justa, cómo flashear por USB y cómo sortear el problema del huevo y la gallina al momento de emparejar.

Por qué un ESP32-C6 y no un repetidor de tienda

El ESP32-C6 es un microcontrolador RISC-V de Espressif que trae radio IEEE 802.15.4 nativa integrada. Ese es el detalle clave: 802.15.4 es exactamente la capa física que usa Zigbee. No estás emulando nada ni traduciendo protocolos; el chip habla el mismo idioma de radio que tu coordinador. Con ESPHome y unas pocas líneas de YAML, en minutos queda funcionando como un router Zigbee de verdad que se une a cualquier coordinador Zigbee 3.0, sea ZHA o Zigbee2MQTT, y se queda permanentemente como nodo de la malla.

La diferencia con un repetidor cerrado no es solo el precio. El firmware es abierto y editable (es tu YAML), y además es ampliable: el mismo board puede entregar sensores o botones como endpoints Zigbee, algo que una blackbox comercial jamás te va a permitir.

Característica ESP32-C6 (ESPHome) Repetidor Zigbee comercial
Precio XIAO ESP32 C6 (SKU GS3-5) $10.190 15.000 a 25.000 CLP equiv.
Firmware Abierto, editable (YAML) Cerrado
Ampliable Sí, suma sensores/botones como endpoints No, blackbox
Compatibilidad Zigbee 3.0 (ZHA y Zigbee2MQTT) Normalmente Zigbee 3.0

Lo que necesitas

  • Un board ESP32-C6 con USB-C (en este tutorial: Waveshare ESP32-C6-DEV KIT-N8).
  • Una red Zigbee ya funcionando en Home Assistant (ZHA) con su coordinador (por ejemplo un SONOFF ZBDongle-E).
  • El add on ESPHome Device Builder instalado en Home Assistant.
  • Un cable USB-C y un puerto USB libre en el computador desde donde vas a flashear.

Board Waveshare ESP32-C6-DEV KIT-N8 con USB-C y chip CH343 para USB y UART en un solo puerto

Antes de partir: dos limitaciones honestas

Hay dos cosas que conviene saber antes de flashear, porque explican decisiones raras que vamos a tomar en la config.

El C6 comparte antena y timing de radio entre WiFi y 802.15.4. Según la documentación de ESPHome, tener WiFi en modo estación y router Zigbee al mismo tiempo genera una red Zigbee inestable. Por eso vamos a armar el router deliberadamente sin WiFi: nada de wifi:, nada de api:, ni actualizaciones OTA por red. Las actualizaciones se hacen solo por cable USB. Para un aparato que después de la instalación inicial queda enchufado en un rincón repitiendo paquetes, es un compromiso más que razonable.

El C6 transmite con apenas ~+3 dBm, bastante menos que un chip Zigbee dedicado con antena externa. Para la mayoría de las casas alcanza de sobra, pero hay un detalle contraintuitivo: si el board queda demasiado pegado al coordinador puede dar problemas. La idea es que el router quede a medio camino entre el coordinador y la zona con mala señal, no al lado del coordinador.

Paso 1: Instala el add on ESPHome en Home Assistant

ESPHome Device Builder es un add on oficial, pero vive en su propio repositorio que no siempre queda registrado en cada instalación. Si no aparece en la tienda de add ons, abre Ajustes -> Complementos -> Tienda de complementos, arriba a la derecha entra al menú de tres puntos, elige Repositorios y agrega https://github.com/esphome/home-assistant-addon. Después busca ESPHome Device Builder en la tienda, instálalo e inícialo.

ESPHome Device Builder encontrado en la tienda de complementos de Home Assistant

Paso 2: Crea el dispositivo nuevo

Abre la interfaz (botón Abrir interfaz de usuario en la página del add on). En el primer arranque elige la vista de experto, que es la que nos sirve. Luego haz clic en Crear dispositivo -> Crear nuevo proyecto, y como board selecciona ESP32-C6, concretamente ESP32-C6 DevKitC-1: el board Waveshare es pin compatible con ese perfil, así que esa definición basta.

Selección del board ESP32-C6 DevKitC-1 en el asistente de ESPHome

Asigna un nombre al dispositivo, por ejemplo ESP32-C6-Zigbee-Router.

Ojo con el WiFi: aunque después lo vamos a sacar, el asistente de configuración inicial hoy no deja saltarse la pregunta de WiFi; exige SSID y contraseña para generar una primera config que compile. Ingresa tu WiFi normal y termina con Finalizar configuración. En el siguiente paso ese WiFi igual sale de la config.

Datos de WiFi ingresados en el asistente inicial de ESPHome, se quitan más adelante

Paso 3: Limpia la config y agrega el componente Zigbee

El asistente deja una config estándar con wifi:, api: y ota:. En el editor YAML de la derecha elimina esos tres bloques por completo y, en su lugar, agrega el Zigbee Component desde el navegador de dispositivo a la izquierda (Agregar componente -> Zigbee Component). La config final debe quedar así:

YAML
esphome:
  name: esp32-c6-zigbee-router
  friendly_name: ESP32-C6 Zigbee Router

esp32:
  board: esp32-c6-devkitc-1
  framework:
    type: esp-idf

logger:

zigbee:
  router: true

Editor YAML de ESPHome con la config final del router Zigbee

Qué hace cada línea:

  • board: esp32-c6-devkitc-1: el board Waveshare es pin compatible con el ESP32-C6-DevKitC-1 oficial, así que esa definición alcanza.
  • framework: esp-idf: el componente Zigbee nativo de ESPHome necesita el framework ESP IDF, no Arduino.
  • logger:: salida de depuración por la conexión serial USB, muy útil en la primera puesta a punto.
  • zigbee: router: true: sin más entradas de sensor o switch, el equipo se queda como router puro, sin endpoints Zigbee propios.

Paso 4: Flashea el board

Conecta el ESP32-C6 por USB-C al computador donde corre el navegador. Abajo a la derecha haz clic en Instalar y elige Conectar a este computador. La firmware se compila; la primera vez demora bastante más que un proyecto ESPHome normal por las librerías Zigbee y mbedTLS del build ESP IDF (varios minutos, es normal).

Después de compilar suele aparecer un aviso de que desde esa página no se puede flashear por USB. El motivo: Home Assistant corre en http://homeassistant.local:8123, o sea sin HTTPS, y el navegador solo permite WebSerial (la interfaz que necesita el flasheo por USB en el navegador) en sitios seguros. Por eso ESPHome abre automáticamente web.esphome.io en una pestaña nueva, que sí corre por HTTPS. Tranquilo: los datos de la firmware siguen viajando solo localmente entre el navegador y el board por USB; web.esphome.io solo entrega la interfaz de flasheo.

En web.esphome.io el navegador te pide el puerto serial por un diálogo WebSerial: elige el board. En la mayoría de los Windows aparece como "USB Single Serial (COMx)", nombrado según el chip CH343 del board. Haz clic en Conectar y el proceso corre solo hasta el mensaje de éxito.

Paso 5: Une el router a la red Zigbee

En Home Assistant entra a Ajustes -> Dispositivos y servicios -> ZHA y activa Permit new devices to join (por defecto hasta 254 segundos). El router intenta unirse solo, en segundo plano, cada pocos segundos apenas arranca; no necesitas gatillarlo manualmente.

Truco clave para el primer emparejamiento: Zigbee tiene acá un problema del huevo y la gallina. Para que un equipo nuevo entre a la red necesita contacto de radio directo con el coordinador (o con un router ya conectado), pero el router nuevo recién puede retransmitir una vez que ya está adentro. Como el C6 transmite con solo ~+3 dBm, si dejas el board en su ubicación final (la difícil) desde el principio, el emparejamiento puede fallar aunque esa posición después funcione perfecto como router. La solución: para el primer join deja el board en la misma pieza que el coordinador (a pocos metros), activa Permit Join y deja que entre. Recién después muévelo a su ubicación definitiva; una vez dentro de la malla, la conexión suele mantenerse estable incluso con señal más débil.

Cuando el join funciona, el log muestra la línea decisiva:

Text
[I][zigbee:081][Zigbee_main]: Joined network successfully (PAN ID: 0xfe63, Channel:25)

Y en ZHA (Ajustes -> Dispositivos y servicios -> ZHA -> Dispositivos) el router aparece como equipo propio. En una prueba junto al coordinador dio un LQI de 232 y -42 dBm. Después muévelo del lugar de prueba a la zona problemática: la conexión se mantiene aunque la señal baje.

Visualización ZHA en Home Assistant mostrando el router ESP32-C6 en la malla Zigbee

Toma algunas horas hasta que los equipos de la red se reorienten hacia el router nuevo. Después de varias horas el mapa se ve como uno espera: los sensores del sector con mala señal se cuelgan del nuevo nodo. Ese termómetro que a través de un piso de hormigón no reportaba nada, ahora entrega datos de forma confiable y a un costo mínimo.

Malla Zigbee en ZHA después de varias horas, con los equipos reconectados al nuevo router

Variantes y mejoras

El original se queda en el repetidor puro, pero el verdadero valor del C6 está en lo que puedes hacer después. Tres ideas para llevarlo más lejos:

  1. El router que además es sensor (endpoints Zigbee propios). El componente zigbee: de ESPHome permite declarar entidades adicionales (sensor, binary_sensor, switch) que ocupan sus propios endpoints Zigbee. En vez de gastar un board solo para repetir, conéctale un sensor de temperatura y humedad y expón esa lectura directo a ZHA, sin WiFi ni MQTT de por medio. Así el mismo aparato que extiende la malla también mide el ambiente del rincón donde lo pusiste: dos funciones, un board.

  2. Un botón físico como control Zigbee. Suma un pulsador a un GPIO libre y decláralo como binary_sensor dentro del bloque Zigbee. Queda como un mando físico barato para gatillar automatizaciones en Home Assistant (apagar luces, activar una escena), aprovechando que el nodo ya está en la malla.

  3. Varios routers para cubrir una casa grande. Como cada C6 cuesta muy poco, puedes armar dos o tres y repartirlos por la casa formando una malla propia. Regla de oro del emparejamiento: agrega uno a la vez, siempre haciendo el primer join cerca del coordinador o de un router ya conectado, y recién después muévelo a su posición final.

Personalización para Chile

Para este proyecto la lista real de materiales es corta. Puedes conseguir los componentes centrales en MechatronicStore; el catálogo maneja placas ESP32 y accesorios de conexión, aunque el modelo exacto de C6 puede variar según stock (confirma disponibilidad antes de comprar). Estos son los materiales del BOM real:

  • Board ESP32-C6 con USB-C (en el tutorial: Waveshare ESP32-C6-DEV KIT-N8). Es el corazón del proyecto: debe ser C6, porque es el que trae la radio 802.15.4 nativa. Un ESP32 clásico o un C3 no sirven para Zigbee router.
  • Cable USB-C para alimentar y flashear. Cualquier cable USB-C de datos (no solo carga) funciona.
  • Coordinador Zigbee (SONOFF ZBDongle-E), solo si todavía no tienes una red ZHA armada. Si ya corres Home Assistant con Zigbee, este ya lo tienes.

Si necesitas sumar el coordinador, agrega la referencia del ZBDongle-E aparte. Nota honesta: no todos los modelos exactos de board C6 están siempre en stock local, así que revisa el catálogo de MechatronicStore o pide el equivalente C6 con USB-C disponible.

Recursos

Versión chilena con componentes en stock local en MechatronicStore.