Si llevas tiempo queriendo utilizar tus dispositivos a larga distancia hoy vas a aprender a hacerlo al integrar LoRa en Home Assistant.
Índice
¿Qué es LoRa y cómo funciona?
LoRa (acrónimo de «Long Range» o «Largo Alcance) es un protocolo de comunicación de radiofrecuencia que permite la transmisión de datos a larga distancia (hasta 10km en campo abierto) con muy bajo consumo energético. Por tanto, nos aporta dos grandes ventajas:
- Tiene mucho más alcance que los protocolos que utilizamos habitualmente (WiFi, Bluetooth, Zigbee…). Esto lo convierte en la opción ideal para sensores lejanos (trasteros, buzones, jardines amplios…).
- No depende de la red telefónica ni eléctrica para transmitir información, por lo que distintos dispositivos LoRa pueden comunicarse incluso durante un apagón.
Eso si, también tiene sus limitaciones, ya que la velocidad de transferencia de datos es baja. En la práctica, esto implica que es perfecto para el envío de datos sencillos (comandos a nuestros dispositivos, números o cadenas de texto), pero no es un protocolo adecuado para la transmisión de fotos o videos.
Además, debes tener en cuenta la frecuencia que utiliza LoRa en tu zona geográfica. Por ejemplo, en Europa es la de 868 MHz, mientras que en EEUU y la mayor parte de Latinoamérica es la de 915 MHz.
Requisitos previos
Para integrar LoRa en Home Assistant vas a necesitar los siguientes componentes:
- Un Gateway LoRa que reciba la información de los distintos nodos, y la transmita a Home Assistant. En mi caso voy a crear un Gateway con el M5Stack Core S3 SE (si, el mismo que ya usamos para controlar Assist), combinado con los módulos LoRa868 y batería externa (este es opcional).
- Un nodo LoRa que recoja y envíe información (por ejemplo, un sensor conectado). En mi caso voy a utilizar una placa con el chip SX1276 integrado, la LILYGO LoRa32 (que también sería un dispositivo válido para hacer de Gateway LoRa).
- Un cable USB para alimentar la placa de DATOS (con un cable de carga no vas a poder instalar el software).
- Haber instalado ESPHome en Home Assistant.
Montaje y configuración del Gateway LoRa
Como te decía, yo voy a utilizar el M5Stack Core S3 SE junto con el módulo LoRa868 V1.1. Este es un dispositivo modular muy fácil de expandir, esamblando los componentes.


Algo importante a tener en cuenta, es que el módulo LoRa tiene unos pequeños interruptores en la parte posterior (‘DIP switch’) que modifica la asignación de los pines, y lógicamente debe coincidir con lo que indiquemos en el código de ESPHome.
Para ello, asegúrate de que los interruptores estén en la siguiente posición (2, 6 y 7 encendidos y el resto apagados).


A partir de aquí, el proceso será similar con cualquier placa compatible (adaptando los pasos y esquema de conexión a las características de tu dispositivo). Los pasos que he seguido son los siguientes:
- En Home Assistant, ve a tu complemento de ESPHome, pulsa en “New device” y “Continue”.
- Dale un nombre a tu dispositivo (por ejemplo, “LoRa Gateway”) y pulsa en “Next”.
- Como tipo de dispositivo selecciona “ESP32-S3”. Observarás de fondo que se ha creado un nuevo bloque para tu dispositivo.
- Pulsa en “Skip” y haz clic en “Edit”, sobre el bloque de tu dispositivo.
- Añade las siguientes líneas al final de tu código (que proceden directamente del componente SX127x de ESPHome, adaptadas a nuestro dispositivo).
captive_portal:
spi:
clk_pin: GPIO36
mosi_pin: GPIO37
miso_pin: GPIO35
sx127x:
cs_pin: GPIO6
rst_pin: GPIO7
dio0_pin: GPIO10
pa_pin: BOOST
pa_power: 14
bandwidth: 125_0kHz
crc_enable: true
frequency: 868920000
modulation: LORA
rx_start: true
sync_value: 0x12
spreading_factor: 7
coding_rate: CR_4_5
preamble_size: 8
on_packet:
then:
- lambda: |-
ESP_LOGD("lambda", "packet %s", format_hex(x).c_str());
ESP_LOGD("lambda", "rssi %.2f", rssi);
ESP_LOGD("lambda", "snr %.2f", snr);
button:
- platform: template
name: "Transmit Packet"
on_press:
then:
- sx127x.send_packet:
data: [0xC5, 0x51, 0x78, 0x82, 0xB7, 0xF9, 0x9C, 0x5C]
- Pulsa en “Save” e “Install”. Selecciona “Manual download” y espera a que se compile el código.
- Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
- Conecta el M5Stack Core S3 SE con el cable USB-C de datos por el puerto que trae en un lateral a tu ordenador.
- Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
- Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 7. De nuevo, pulsa en “Install”.
- Vuelve a Home Assistant y ve a Configuración > Dispositivos y servicios. Lo normal es que tu dispositivo haya sido descubierto y aparezca en la parte superior, esperando únicamente a que pulses el botón de “Configurar”. De lo contrario pulsa en el botón de “Añadir integración”, busca “ESPHome” e introduce la IP de tu placa en el campo ‘Host’. Como siempre, te recomiendo que asignes una IP fija en tu router para evitar fallos en el futuro si esta cambia.
Configuración del nodo LoRa
Puesto que ya tenemos nuestro gateway LoRa, ahora vamos a configurar un nodo para que le envíe información. Para ello vamos a seguir unos pasos muy parecidos a los del apartado anterior:
- En Home Assistant, ve a tu complemento de ESPHome, pulsa en “New device” y “Continue”.
- Dale un nombre a tu dispositivo (por ejemplo, “LoRa Node”) y pulsa en “Next”.
- Como tipo de dispositivo selecciona “ESP32”. Observarás de fondo que se ha creado un nuevo bloque para tu dispositivo.
- Pulsa en “Skip” y haz clic en “Edit”, sobre el bloque de tu dispositivo.
- Añade las siguientes líneas al final de tu código (que en este caso coinciden con el ejemplo del componente SX127x de ESPHome).
captive_portal:
spi:
clk_pin: GPIO5
mosi_pin: GPIO27
miso_pin: GPIO19
# Example configuration entry
sx127x:
cs_pin: GPIO18
rst_pin: GPIO23
dio0_pin: GPIO26
pa_pin: BOOST
pa_power: 14
bandwidth: 125_0kHz
crc_enable: true
frequency: 868920000
modulation: LORA
rx_start: true
sync_value: 0x12
spreading_factor: 7
coding_rate: CR_4_5
preamble_size: 8
on_packet:
then:
- lambda: |-
ESP_LOGD("lambda", "packet %s", format_hex(x).c_str());
ESP_LOGD("lambda", "rssi %.2f", rssi);
ESP_LOGD("lambda", "snr %.2f", snr);
button:
- platform: template
name: "Transmit Packet"
on_press:
then:
- sx127x.send_packet:
data: [0xC5, 0x51, 0x78, 0x82, 0xB7, 0xF9, 0x9C, 0x5C]
- Observa que la asignación de pines es diferente (porque estamos usando un dispositivo distinto al que usamos para el Gateway), pero el resto de la configuración es exactamente igual que en el apartado anterior. Esto es importante para que se comuniquen entre ellos.
- Pulsa en “Save” e “Install”. Selecciona “Manual download” y espera a que se compile el código.
- Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
- Conecta la placa con el cable Micro USB de datos por el puerto que trae en un lateral a tu ordenador.
- Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
- Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 8. De nuevo, pulsa en “Install”.
- Vuelve a Home Assistant y ve a Configuración > Dispositivos y servicios. Lo normal es que tu dispositivo haya sido descubierto y aparezca en la parte superior, esperando únicamente a que pulses el botón de “Configurar”. De lo contrario pulsa en el botón de “Añadir integración”, busca “ESPHome” e introduce la IP de tu placa en el campo ‘Host’. Como siempre, te recomiendo que asignes una IP fija en tu router para evitar fallos en el futuro si esta cambia.
Comprueba la comunicación
Vamos a hacer una pequeña prueba para comprobar que ambos dispositivos se están comunicando correctamente (el Gateway y el nodo).
- Verifica que tienes encendidos ambos dispositivos, y que están «online» en Home Assistant y ESPHome.
- Desde Home Assistant, ve a Configuración > Dispositivos y servicios > ESPHome y accede a uno de ellos (por ejemplo, al Gateway).
- Abre una nueva ventana (sin cerrar la anterior), entra en el complemento de ESPHome y accede a los ‘logs’ del otro dispositivo (en este caso, el nodo).
- En la ventana de Home Assistant, pulsa sobre el botón «Transmit Packet». Inmediatamente verás el los ‘logs’ del segundo dispositivo que registra la entrada del paquete de información enviado.

Puedes hacer la prueba inversa para verificar que la comunicación funciona en ambos sentidos. Si todo ha ido bien, es que tus dispositivos ya se están comunicando.
Envío de información
Lógicamente, la gracia de integrar LoRa en Home Assistant es mandar algún tipo de información útil (como el valor de algún sensor conectado al nodo).
- El primer paso es añadir a la placa del nodo el sensor que te interese. Por ejemplo, yo voy a añadir un sensor PIR para conseguir el tan ansiado sensor de movimiento en el buzón. Para ello he añadido el siguiente fragmento al código:
binary_sensor:
- platform: gpio
pin: GPIO34
name: "PIR Sensor"
device_class: motion
id: pir_sensor
- Si observas el código superior, este es el mismo que usaríamos en cualquier caso «habitual». No obstante, para que la información se envíe a nuestro Gateway LoRa, necesitamos añadir algo más utilizando el componente ‘Packet Transport’.
packet_transport:
platform: sx127x
update_interval: 5s
encryption: "password"
rolling_code_enable: true
binary_sensors:
- pir_sensor
- Analiza el código anterior y observa lo siguiente:
- En el atributo ‘encryption’ tienes que indicar la clave de encriptación de tu mensaje (la que tú quieras), para que no pueda recibirlo cualquiera que esté en la misma frecuencia.
- He identificado el ‘id’ del sensor que quiero enviar (en mi caso, el ‘binary sensor’ con id «pir_sensor»). Aquí podrías añadir todos los que te interesasen.
- Ahora vamos a añadir lo siguiente en el código de nuestro Gateway LoRa, para que reciba la información.
packet_transport:
platform: sx127x
update_interval: 5s
providers:
- name: lora-node
encryption: "password"
binary_sensor:
- platform: packet_transport
id: pir_sensor
provider: lora-node
- platform: template
name: "Buzón"
device_class: motion
lambda: return id(pir_sensor).state;
- De nuevo, analiza el código y observa lo siguiente:
- Hemos indicado el nombre del dispositivo en ESPHome de nuestro nodo LoRa, como proveedor de información.
- En el atributo ‘encryption’ hemos indicado exactamente la misma clave que en el nodo.
- Para transformar la información recibida en un sensor del gateway, he utilizado la plataforma ‘packet_transport’. Le he asignado un ‘id’ (puede ser el que quieras) y he indicado de nuevo como proveedor el nombre del nodo LoRa. Este es un sensor interno de ESPHome.
- Para mostrar esta información en Home Assistant he creado un sensor template del mismo tipo, asignándole el valor del sensor interno creado en el punto anterior.
- Y ya está! Si ahora observas tu dispositivo gateway en Home Assistant comprobarás que ya muestra la información del nodo.

Personaliza tu Gateway
Aprovechando que hemos utilizado el M5Stack Core S3 SE para integrar LoRa en Home Assistant, podemos utilizar el resto de funcionalidades del dispositivo para personalizarlo! A continuación te dejo el código completo para crear una pantalla que te avise cuando recibes cartas en el buzón!

esphome:
name: lora-gateway
friendly_name: LoRa Gateway
libraries:
- m5stack/M5GFX@^0.1.11
- m5stack/M5Unified@^0.1.11
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
psram:
mode: octal
speed: 80MHz
external_components:
- source:
type: git
url: https://github.com/m5stack/M5CoreS3-Esphome
components: [ m5cores3_display ]
refresh: 0s
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "1QrsXUgryxlF6OGsIwLj7eijyy/OMhSobQQHYWPvpb0="
ota:
- platform: esphome
password: "4844c4205ab6ab665c2d1a4be82deb57"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Lora-Gateway Fallback Hotspot"
password: "6BRaaV17Iebb"
captive_portal:
spi:
clk_pin: GPIO36
mosi_pin: GPIO37
miso_pin: GPIO35
sx127x:
cs_pin: GPIO6
rst_pin: GPIO7
dio0_pin: GPIO10
pa_pin: BOOST
pa_power: 14
bandwidth: 125_0kHz
crc_enable: true
frequency: 868920000
modulation: LORA
rx_start: true
sync_value: 0x12
spreading_factor: 7
coding_rate: CR_4_5
preamble_size: 8
on_packet:
then:
- lambda: |-
ESP_LOGD("lambda", "packet %s", format_hex(x).c_str());
ESP_LOGD("lambda", "rssi %.2f", rssi);
ESP_LOGD("lambda", "snr %.2f", snr);
packet_transport:
platform: sx127x
update_interval: 5s
providers:
- name: lora-node
encryption: "password"
binary_sensor:
- platform: packet_transport
id: pir_sensor
provider: lora-node
- platform: template
name: "Buzón"
device_class: motion
lambda: return id(pir_sensor).state;
color:
- id: green
hex: 'bfea11'
- id: red
hex: 'ff0000'
font:
- file: "gfonts://Roboto"
id: font_title
size: 18
- file: "gfonts://Roboto"
id: font_text
size: 16
image:
- file: mdi:mailbox
id: buzon_off
resize: 100x100
type: grayscale
transparency: alpha_channel
- file: mdi:email-alert
id: buzon_on
resize: 100x100
type: grayscale
transparency: alpha_channel
display:
- platform: m5cores3_display
model: ILI9342
dc_pin: 15
update_interval: 1s
id: m5cores3_lcd
lambda: |-
// Obtener dimensiones de la pantalla
int screen_width = it.get_width();
int screen_height = it.get_height();
// Título en la parte superior con margen de 20px
it.print(screen_width/2, 20, id(font_title), id(green), TextAlign::TOP_CENTER, "LoRa Gateway by Aguacatec");
// Obtener estado del sensor del buzón
bool mailbox_open = id(pir_sensor).state;
if (mailbox_open) {
// Buzón abierto - icono rojo
it.image(110, 70, id(buzon_on), id(red));
it.print(screen_width/2, 200, id(font_text), id(red), TextAlign::CENTER, "Carta recibida!!");
} else {
// Buzón cerrado - icono verde
it.image(110, 70, id(buzon_off), id(green));
it.print(screen_width/2, 200, id(font_text), id(green), TextAlign::CENTER, "No hay correspondencia");
}
Agradecimientos
Para elaborar esta entrada nos ha venido genial este video de nuestro amigo Miguel Ángel de La Choza Digital, canal que te recomiendo totalmente! 😎

