Integrar LoRa en Home Assistant

Integrar LoRa en Home Assistant

Si llevas tiempo queriendo utilizar tus dispositivos a larga distancia hoy vas a aprender a hacerlo al integrar LoRa en Home Assistant.

¿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.
LoRa Module
M5STACK

LoRa Module

4,0

Módulo de comunicación de largo alcance vía protocolo LoRa. Funciona en local, admite batería y se integra fácilmente en Home Assistant mediante ESPHome. Ideal para proyectos maker y domótica.Módulo de comunicación de largo alcance vía protocolo LoRa. Funciona en local, a...

LoRa32 -8%
LILYGO

LoRa32

5,0

Placa microcontroladora para proyectos DIY con WiFi, Bluetooth y LoRa. Ideal para comunicación de largo alcance, funciona en local y se integra fácilmente en Home Assistant mediante ESPHome.Placa microcontroladora para proyectos DIY con WiFi, Bluetooth y LoRa. Ideal par...

*Algún precio puede haber cambiado desde la ultima revision

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:

  1. En Home Assistant, ve a tu complemento de ESPHome, pulsa en “New device” y “Continue”.
  2. Dale un nombre a tu dispositivo (por ejemplo, “LoRa Gateway”) y pulsa en “Next”.
  3. Como tipo de dispositivo selecciona “ESP32-S3”. Observarás de fondo que se ha creado un nuevo bloque para tu dispositivo.
  4. Pulsa en “Skip” y haz clic en “Edit”, sobre el bloque de tu dispositivo.
  5. 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]
  1. Pulsa en “Save” e “Install”. Selecciona “Manual download” y espera a que se compile el código. 
  2. Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
  3. Conecta el M5Stack Core S3 SE con el cable USB-C de datos por el puerto que trae en un lateral a tu ordenador.
  4. Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
  5. Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 7. De nuevo, pulsa en “Install”.
  6. 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:

  1. En Home Assistant, ve a tu complemento de ESPHome, pulsa en “New device” y “Continue”.
  2. Dale un nombre a tu dispositivo (por ejemplo, “LoRa Node”) y pulsa en “Next”.
  3. Como tipo de dispositivo selecciona “ESP32”. Observarás de fondo que se ha creado un nuevo bloque para tu dispositivo.
  4. Pulsa en “Skip” y haz clic en “Edit”, sobre el bloque de tu dispositivo.
  5. 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]
  1. 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.
  2. Pulsa en “Save” e “Install”. Selecciona “Manual download” y espera a que se compile el código. 
  3. Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
  4. Conecta la placa con el cable Micro USB de datos por el puerto que trae en un lateral a tu ordenador.
  5. Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
  6. Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 8. De nuevo, pulsa en “Install”.
  7. 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).

  1. Verifica que tienes encendidos ambos dispositivos, y que están «online» en Home Assistant y ESPHome.
  2. Desde Home Assistant, ve a Configuración > Dispositivos y servicios > ESPHome y accede a uno de ellos (por ejemplo, al Gateway).
  3. 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).
  4. 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).

  1. 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
  1. 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
  1. 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.
  2. 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;
  1. 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.
  2. 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! 😎