Hoy hablamos de cómo controlar dispositivos ESP sin Wi-Fi con ESP-NOW, un protocolo poco conocido con ventajas adicionales.
¿Qué es ESP-NOW y qué aporta?
ESP-NOW es un protocolo inalámbrico de Espressif que permite que placas ESP32 o ESP8266 se comuniquen directamente entre sí por radio. Cada dispositivo se identifica por su dirección MAC y puede enviar mensajes unidireccionales o bidireccionales.
Y precisamente ahí es donde está su ventaja. Puedes crear dispositivos que se comuniquen, incluso en instalaciones en las que no tienes red Wi-Fi, ni un router instalado. Piensa en trasteros o casas del pueblo donde te gustaría solucionar un problema con un dispositivo, pero no crear una instalación completa.
Este protocolo usa la radio Wi-Fi del chip en la banda de 2,4 GHz, pero no implementa todo el stack de una red Wi-Fi normal. Trabaja principalmente en la capa de enlace de datos, simplificando el proceso y reduciendo cabeceras, retrasos y consumo.

Esto hace que tenga una latencia muy baja (respuesta en milisegundos), sea de bajo consumo (por lo que es apto para usar con batería) y maneje mensajes de hasta 250 bytes por paquete, con un alcance teórico de hasta 100 metros.
Ejemplo práctico sencillo
Entendido lo anterior, cabe destacar que incluso existen dispositivos dedicados como este mando de IoTorero que vamos a utilizar para llevar a cabo un ejemplo práctico, junto con un controlador WLED de la misma marca.
Para controlar estos dispositivos ESP sin Wi-Fi con ESP-NOW, sigue estos pasos:
- Quita la tapa posterior del mando y mete dos pilas tipo AAA.
- Alimenta el controlador WLED con un cable USB-C, y conéctate al punto de acceso Wi-Fi que ha creado desde tu dispositivo móvil.
- Introduce las credenciales de tu red Wi-Fi y pulsa en «Save & Connect» para conectarlo. Desde este momento ya puedes controlar tu tira WLED desde Home Assistant, la interfaz de WLED o dispositivos compatibles.
- Accede a la interfaz de WLED introduciendo en tu navegador la IP del dispositivo, y ve a Config > Security & Updates, y comprueba que tengas la versión v16.0.0 de WLED o superior. De lo contrario, pulsa en «Manual OTA Update» y carga el fichero correspondiente de la última versión.
- Hecho esto, ve a Config > Wifi & Network > ESP-NOW Wireless, marca la casilla «Enable ESP-NOW» y pulsa en «Save & Connect».
- Pulsa cualquier botón del mando, y vuelve al apartado anterior. Verás que el dispositivo ha sido detectado por la placa de WLED, solo tienes que pulsar el botón «+» y guardar de nuevo para vincularlos.

Desde este momento, ya puedes usar el mando para controlar tu tira o bombilla WLED.

Implementación con ESPHome
Si bien lo anterior es útil y muy sencillo, también te interesa saber que existe un componente oficial de ESP-NOW en ESPHome, por lo que es compatible con los dispositivos que has creado anteriormente.
Para realizar el ejemplo, voy a usar una placa ESP32 cualquiera que he añadido a ESPHome, sin ningún código ni sensor adicional. El proceso sería el mismo en cualquiera de tus dispositivos:
- Añade temporalmente el siguiente código a tu dispositivo ESPHome y flashéalo de nuevo.
espnow:
auto_add_peer: true
on_broadcast:
- lambda: |-
char src_mac[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
char hex[256];
ESP_LOGD("espnow",
"Broadcast de %s, %u bytes, payload: %s, RSSI: %ddBm",
format_mac_addr_upper(info.src_addr, src_mac),
size,
format_hex_pretty_to(hex, data, size),
info.rx_ctrl->rssi);
- Cuando termine, observa el log del dispositivo y pulsa algún botón del mando. Verás mensajes de este tipo.

- Si observas el código, el primer dato que obtienes es la MAC del mando (20:9B:A9:05:4C:9C) y el segundo el payload del botón pulsado (91:88:00:00:00:20:01:01:5A:00:00:00:00).
- Tómate un minuto para anotar el payload de cada botón, y observa que algunos caracteres pueden cambiar con cada pulsación, pero generalmente habrá una constante.
- Ya puedes eliminar el código del primer paso en tu dispositivo y reemplazarlo por el siguiente (adaptando la dirección MAC de tu dispositivo y el payload de los botones).
espnow:
peers:
- "20:9B:A9:05:4C:9C"
on_broadcast:
- address: "20:9B:A9:05:4C:9C"
then:
- if:
condition:
lambda: |-
return size == 13 &&
data[0] == 0x91; // Botón 1
then:
- script.execute: accion_boton_1
script:
- id: accion_boton_1
mode: single
then:
- light.toggle: led_integrado
- delay: 800ms
Si observas el código, lo que he hecho es vincular la pulsación de un botón con la ejecución de un script que, a su vez, alterna el estado del LED integrado en la placa. No obstante, este es un mero ejemplo y tú puedes añadir tantos ejemplos como quieras y personalizar las acciones que quieres que sucedan.

También puedes crear tu propio «mando» o emisor, de una forma incluso más sencilla. Puesto que al vincular cualquier placa de ESPHome puedes consultar la MAC en los logs, te ahorrarás el primer paso. Además, puedes generar paquetes con la pulsación de botones, pero también con cualquier otro evento como la lectura de un sensor, usando la acción ‘espnow.send’.
on_...:
- espnow.send:
address: 11:22:33:44:55:66
data: "The big angry wolf awakens"
- espnow.send:
address: 11:22:33:44:55:66
data: !lambda "return {0x00, 0x00, 0x34, 0x5d};"
- espnow.send:
address: !lambda "return {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};"
data: [0x00, 0x00, 0x34, 0x5d]
- espnow.send:
address: !lambda "return {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};"
data: !lambda "return {0x00, 0x00, 0x34, 0x5d};"

