Bien, en el tutorial de hoy voy a hablar de cómo hacer un buzón inteligente basado en LoRa y Home Assistant para que si el cartero echa una carta, recibas una notificación. Lo cachondo de todo esto es que este mismo proyecto lo puedes utilizar para controlar un trastero, el coche aparcado en la calle o el gallinero de tu abuela Jacinta.
Y lo mismo alguien está pensando: a ver Luis, ya me cuesta llevar la WiFi hasta la habitación de los críos como para llevarla hasta el buzón o el trastero.
Tranquilo que no va a hacer falta tener cerca conexión WiFi, ni Bluetooth, ni Zigbee porque vamos a utilizar una tecnología inalámbrica que llega mucho más lejos, que permite tener dispositivos alimentados con pilas durante meses e incluso años y que además es compatible con Home Assistant.
Eso sí, para que este proyecto funcione de forma profesional vas a tener hacer exactamente lo que te digo en este tutorial.
Y mucho ojo con lo que haces porque, de no cumplir a rajatabla la Ley para usar esta tecnología, te puede llegar una buena dolorosa a tu casa. Ahora bien, gracias a este proyecto sabrás que te ha llegado la multa al buzón.
No me enrollo más y vamos al lío.
Indice de contenidos
Vídeo LoRa y buzón inteligente
Si quieres ir a tiro hecho con el vídeo, aquí te dejo los capítulos.
00:00 Introducción
01:07 ¿Qué es LoRa?
03:58 ¿Por qué LoRa llega tan lejos y consume tan poco?
06:29 Material buzón inteligente con LoRa
10:24 Programación nodo LoRa buzón inteligente
14:39 Programación recepto LoRa buzón inteligente
¿Qué es LoRa?
A ver, lo que pretendo con este proyecto es poder controlar un buzón, un garaje o un trastero utilizando un dispositivo que tiene un sensor de movimiento PIR y al que puedes conectar un sensor magnético para saber si han abierto una puerta o una ventana.
En realidad lo que vas a ver a continuación lo puedes aplicar en otras situaciones donde el objetivo sea controlar algún espacio cerrado donde no suele entrar mucha gente.
Y para conseguir todo esto es necesario que el proyecto cumpla con tres requisitos.
El primero es el alcance, porque ya sea un buzón, el trastero o el coche que aparcas en la calle vas a tener que recibir los datos desde muy lejos. Decenas de metros e incluso kilómetros.
El segundo requisito es el consumo. El dispositivo tiene que consumir lo menos posible para que las baterías duren meses e incluso años. Vamos, que lo instales y te olvides durante mucho tiempo.
Y el tercer requisito es que no cueste un riñón y parte del otro.
Y la tecnología que más se adapta a estos requerimientos es LoRa que, casualidad, es la tecnología que voy a utilizar para hacer este proyecto.
Pero empecemos por el principio, me refiero a entender qué es LoRa a grandes rasgo.
LoRa es una tecnología inalámbrica como pueda ser WiFi, Zigbee o Bluetooth, es decir, que no necesita un cable para enviar datos de un punto a otro porque los datos viajan a través del aire, como Supermán.
Eso sí, LoRa envía los datos de una forma muy diferente a como lo hacen otras tecnologías ya que esta diseñada para enviar pocos datos de forma esporádica consiguiendo así ser muy eficiente en términos de consumo de energía.
Una de las características más importantes, y peligrosa, es la frecuencia que usa LoRa para enviar los datos ya que está dentro de las bandas de radio ISM. Se trata de bandas de frecuencias libres reservadas internacionalmente para uso industrial, científico y médico.
Existe una regulación muy extricta que limita el uso del espectro de frecuencia en estas bandas. No cumplirlo puede acarrear multas que pueden ir desde los 30.000€ hasta el millón. Mucho ojo con esto.
Luego veremos cuál son esos límites y cómo calcularlo.
Dentro de esta banda de frecuencias libres también operan otras tecnologías como WiFi, Bluetooth o Zigbee. Vamos, que no es algo nuevo.
La diferencia es que con LoRa cada país o región determina las frecuencias permitidas para enviar los dtos ya que el espectro de radio está regulado de forma local. No hay un estándar global único. Esto no ocurre con otras tecnologías como las redes WiFi donde hay un consenso global para que todos los países utilicen la mimas frecuencias.
Por ejemplo en Europa, Argentina y Chile se utiliza la banda ISM de 868 MHz, en Estados Unidos, México y Colombia utilizan la banda de 915 MHz y en China, Ucrania y Sudáfrica utilizan la banda 433 MHz.
Por eso, antes de comprar ningún dispositivo es importante saber qué banda utiliza LoRa en tu país y comprar el dispositivo adecuado.
Bien, sigamos porque LoRa se enmarca dentro de las tecnologías de la comunicación que se conocen como LPWAN. Es el acrónimo de Low Power Wade Area Network que en cristiano significa Red de Área Amplia y Bajo Consumo.
Ya solo el nombre nos indica que va a cumplir dos de los requisitos que hemos impuesto para este proyecto: un largo alcance con consumo mínimo. Luego veremos que dispositivos tenemos que utilizar para cumpla con estos dos requisitos y que además este proyecto no nos cueste un riñón.
A nivel técnico más o menos está claro pero ¿Cómo es posible que sea capaz de enviar datos a cientos o miles de metros?
Cómo funciona LoRa
Para que entiendas cómo es capaz LoRa de transmitir datos a largas distancias consumiendo poco voy a poner una analogía muy sencilla. Imagina que estás en una fiesta y te acercas a la barra mientras tus colegas se quedan al otro lado de la sala.
¿Cómo les preguntarías si quieren tomarse una cerveza? Piensa que la música está a toda leche. Es una fiesta. La primera opción sería acercarte a tus colegas y gritarles al oído ¿Queréis una cerveza?
En esta situación has conseguido transmitir un mensaje bastante completo utilizando palabras, una distancia muy corta y gritando, es decir, consumiendo mucha energía. Así es como funcionan tecnologías como WiFi o Bluetooth. Tienen un corto alcance y un consumo elevado.
LoRa consigue resolver esta situación de una forma muy inteligente y sutil ya que, en vez de tener que acercarte a tus colegas y gritarle al oído, lo que hace LoRa es transmitir un mensaje desde la barra del bar muy corto peo eficaz y es haciendo el típico gesto de ¿Quieres tomar algo? Es más, podrías señalar a tu cerveza indicando si es lo que quieren e incluso con los dedos transmitir si quieren 1, 2 o 5.
Se ha conseguido enviar poca información pero suficiente, a una larga distancia y consumiendo lo mínimo posible. Así es como funciona LoRa.
Ahora hablemos de la limitación en cuanto al envío de datos. En muchos países, existen reglas llamadas “duty cycle” o ciclo de trabajo que limitan cuánto tiempo puede transmitir un dispositivo en un periodo determinado que en el caso de la normativa europea (ETSI) se aplica sobre una ventana de 1 hora.
En nuestro caso, en Europa, la banda de frecuencia que se utiliza el la de 868 MHz. La norma dice que el duty cycle máximo es del 1% de una ventana de 1 hora. Si una hora tiene 3.600 segundos quiere decir que podemos transmitir durante 36 segundos cada hora.
Veamos un ejemplo para que quede más claro. Imagina que tienes un sensor de temperatura. Cada vez que envía la temperatura a través de LoRa tarda 1 segundo lo que quiere decir que puedes hacer 36 transmisiones a la hora.
Cómo lo hagas da lo mismo. Me refiero a que puedes enviar los datos durante los primeros 36 segundos de esa hora y luego descansar el resto del tiempo o puedes repartirlo durante los 3.600 segundos que dura la hora.
Si en vez tardar 1 segundo en transmitir los datos tarda 0,5 segundos, entonces podrás hacer 72 transmisiones por hora.
Sea como sea, no puedes superar el duty cycle establecido por el organismo regulador de tu país. Debes ser consciente de esto e informarte porque las sanciones administrativas pueden ser muy grandes.
Una vez tenemos claro qué es LoRa, cómo funciona y las restricciones que tiene, vamos a ver el material.
Material buzón inteligente con LoRa
Antes de ver el material es interesante tener una perspectiva general de lo que queremos conseguir. La idea es instalar un módulo LoRa en el buzón, o en cualquier otro sitio, que sea capaz de detectar si echan una cara. Este módulo tiene que consumir muy poco porque se va a alimentar con baterías.
En el otro extremo vamos a necesitar un módulo que reciba la información del módulo que está en el buzón y que tenga conexión con la red de datos de nuestra casa a través de la WiFi. De este modo, cada vez que reciba un mensaje del nodo del buzón lo podrá enviar a Home Assistant donde lanzaremos una automatización.
A ver, en principio hay muchos módulos en el mercado que nos permiten trabajar con LoRa. Muchos de estos módulos utilizan un ESP32 lo que nos permite tener en la misma placa conexión LoRa, WiFi e incluso Bluetooth.
Y aunque en principio esto puede parecer una buena idea, el problema de estos módulos es que consumen demasiada energía para poder ser utilizados con pilas o baterías. Y no es por LoRa, es debido a que el ESP32 de por sí consume demasiado.
Porque aunque las especificaciones técnicas del ESP32 dicen que en modo deep sleep o sueño profundo consumo entorno a los 10 uA, la realidad es que muchas de las placas basadas en el ESP32 utilizan reguladores de voltaje poco eficientes, LEDs y circuitos USB-Serie que siguen consumiendo energía.
Es por eso que hay buscar una alternativa. Y aquí tenemos dos opciones. Si tenemos los conocimientos suficientes en electrónica nos podemos fabricar nuestras propias placas y si no, tenemos que buscar alternativas como la que nos ofrece la tienda de electrónica DIY y de hardware libre que se llama PricelessToolkit. Ya hablé de esta tienda en el tutorial que hablaba de cómo controlar el telefonillo de tu casa utilizando uno de sus dispositivos, el ESPBell.
En esta ocasión nos vamos a fijar en otro de sus dispositivos, el Mailbox Guard que NOOOOO, está agotado.
Espera que llamo a Jean Michel. ¿Cómo? ¿Qué vas a sacar una nueva versión mejorada y más asequible? ¿El PirBOX-Lite? Ok, lo pongo en las notas y en cuanto tengas uno me lo envías.
Sea como sea, lo que vamos a ver en este tutorial sirve también para la nueva versión de este dispositivo ya que tanto uno como otro viene con un sensor PIR integrado y existe la posibilidad de conectar un sensor de puerta o ventana externo.
Lo bueno de esta placa es que utiliza un microcontrolador que se llama Attiny1616 que consume mucho menos que cualquier ESP32. De hecho, la electrónica está pensada para que la mayor parte de tiempo el dispositivo esté en modo sueño profundo consumiendo una media de 0,28 uA.
Sí sí, 0,28 uA lo que equivale a 0,00028 mA. Un consumo que ni de coña podemos conseguir con placas basadas en el ESP32. Gracias a esto vamos a poder alimentar el dispositivo con una batería Li-Ion, de iones de litio, de 800 mAh recargable.
Sin embargo, tiene un inconveniente. Al tratarse de un microcontrolador que no es compatible con ESPHome no vamos a poder programarlo con esta plataforma. De hecho vamos a programarlo con código nativo de Arduino y para cargarlo en la memoria vamos a necesitar un programador especial que se llama UNIProg y que podemos encontrar también en la tienda de Pricelesstoolkit.
A ver, tampoco tiene mucho misterio, luego veremos cómo cargar el código en esta placa es bastante sencillo. Eso sí, como te vea tu cuñado se va a creer que eres un hacker.
Del otro lado vamos a necesitar una placa que pueda recibir los datos que se envíen por LoRa y que pueda conectarse a la red local de nuestra casa a través de la WiFi. Para esto podemos utilizar cualquier placa ESP32 compatible con LoRa ya que al estar en casa, podemos alimentarlo a través de la red eléctica.
En mi caso voy a utilizar es la placa de TTGO LoRa32 de la empresa Lilygo. Eso sí, algo muy importante es que compres las que son compatibles con la frecuencia de 868 MHz ya que es la frecuencia que se utiliza en Europa. Si vives en otro país asegúrate de cuál es la banda de frecuencias que utiliza LoRa en tu país porque no en todos es la misma.
La programación de este dispositivo también es bastante más sencilla ya que no necesitamos ningún programador externo.
Por lo tanto, en el buzón o en el trastero vamos a instalar el dispositivo de Princeslesstoolkit. Un dispositivo que ya está preparado para consumir muy poco y que nos va a permitir poder instalarlo lejos de nuestra casa y olvidarnos de él durante meses.
Y en casa lo que tenemos que tener es el receptor de los datos vía LoRa con conexión al a red WiFi para poder enviar los datos a Home Assistant. En este caso vamos a utilizar una placa TTGO LoRa32 de Lilygo aunque podrías utilizar cualquier otra.
Ahora vamos a darle vida a todo esto cargando el código a las placas.
Nodo LoRa buzón inteligente
Vamos a empezar por el nodo de LoRa en el buzón. El primer paso es conectar la placa al programador UNIProg. Esto se hace soldando 3 pines marcados como GND, 3V3 y UPD en la placa a los pines con el mismo nombre en el programador UNIProg.
Si no quieres soldar, venden unos conectores que se llaman pogo pin que te permite hacer las conexiones sin tener que sacar el soldador.
Una vez conectada la placa al programador, éste lo tienes que conectar al ordenador a través del puerto USB. No tiene pérdida.
Ahora viene la parte de cargar el código y lo primero es descargar el IDE de Arduino de la página oficial e instalarlo en tu ordenador personal. Ya sabes siguiente, siguiente y siguiente.
Una vez descargado lo abres e instala la compatibilidad con las placas AVR. Esto habilitará un grupo de nuevas placas bajo la opción MegaTinyCore. Selecciona el tipo donde aparece el microcontrolador que vamos a utilizar Attiny1616.
En la configuración del microcontrolador asegúrate que tienes seleccionado el chip Attiny1616, UPDI no reset pin y el programador Serial UPDI 230400 baud. Por último selecciona el puerto en el que está conectado el programador UNIPRog.
El código que vamos a cargar lo encontramos en la web de GitHub de PricelessToolkit porque, por si no lo he dicho antes, esta tienda utiliza hardware y software abierto. Esto quiere decir que en su GitHub tienes todos los esquemas eléctricos y códigos para que los consultes y los utilices como quieras. Gracias Jean Michel.
El código que vamos a utilizar es el que está dentro de MQTT JSON. Verás dos directorios. Abre el que corresponde con el MailboxGuard. Dentro verás un archivo .ino. Copia el código, llévatelo al IDE de Arduino y guárdalo en tu disco duro.
Si miramos el código, es bastante sencillo. Lo que hace es enviar dos veces el mensaje cada vez que se despierta el microcontrolador. Imagino que esto lo hace para asegurar que llega a su destino. Una vez se ha enviado pone tanto el chip LoRa como el microcontrolador Attiny1616 en el modo sueño.
El pin donde está conectado el sensor PIR y el sensor de puerta o ventana está configurado para que, cuando detecte algo despierte el microcontrolador. Y aquí un problema gordo que debemos atajar y es que, este código, según está, no respeta el duty cicle.
A ver, no tiene porqué pasar nada, me refiero a que lo normal es que, como mucho el cartero se pase una vez al día y de vez en cuando algún repartidor de publicidad. Pero es difícil que el dispositivo se active muchas vece al día.
Eso sí, en estos casos donde te pueden multar más vale prevenir que curar, como la transmisión no cumpla el duty cicle, ya sabes, multa al canto.
Esto se puede evitar añadiendo un delay en el código justo después de echar a dormir el módulo LoRa. Lo que hace el delay es parar la ejecución del código durante un tiempo configurable pero ¿Durante cuánto tiempo? El tiempo necesario para que se ajuste al duty cicle.
Imagina que el código que vamos a cargar tarda en transmitir los datos un segundo. Como ya vimos, el duty cicle en la frecuencia de 868 MHz es de 1%. Esto quiere decir que puedes transmitir, como máximo, 36 veces cada hora o, lo que es lo mismo, 1 vez cada 100 segundos.
Por lo tanto, el delay o el tiempo de espera debería ser 100 segundos que es el peor de los casos. Esta es la idea pero ¿Cómo sabemos cuál es el tiempo real que tarda en enviar los datos?
Calcular este tiempo no es tan fácil porque depende de varios factores. Por un lado depende de cómo se configuren los parámetros de LoRa como el Spreading Factor, el Coding Rate, el preámbulo o el ancho de banda de la señal.
Modificar estos parámetros no solo hace que el tiempo de transmisión aumente o disminuya, también afecta al consumo de la batería, al alcance y cómo de robusta va a ser la señal. Por ejemplo, cuanto menor es el spreading factor, más rápido se transmite, menos consume pero el alcance es menor y la señal no es tan robusta.
En esta tabla puedes ver cómo afecta los diferentes parámetros en el tiempo de transmisión, el consumo, la batería, el alcance y la robustez de la señal. Puedes comprobar cómo tener un coding rate alto puede hacer que la transmisión sea más lenta pero las señal será más robusta o como el preámbulo no afecta al alcance y cómo aumentar el ancho de banda tiene un impacto negativo en el consumo.
Por otro lado, un factor a tener en cuenta es la carga útil o payload, es decir, los datos que vamos a transmitir. No es lo mismo transmitir 1 bit que 32 bytes. Esto afecta de forma directa al tiempo de transmisión. En el caso del código que estamos utilizando, si reducimos el nombre del nodo y la clave del gateway, conseguimos una carga útil de 36 bytes.
Por último, algo que no podemos pasar por alto es la ubicación del dispositivo. Me refiero a que no es lo mismo que esté en visión directa, que el dispositivo esté metido en un buzón metálico o que quieras controlar un trastero que está 8 pisos por debajo de tu casa.
Todo influye. La parametrización del proyecto dependerá de cada situación concreta. En mi caso, he utilizado los siguientes parámetros.
- Spreding Factor: 11
- Condin Rate: 6
- Preamble Length: 12
- Signa Bandwidth: 125 kHz
Que con la carga útil de 36 bytes, el resutlado es que tarda entorno a los 1,20 segundos en transmitir cada vez que envía el estado. Esto quiere decir que para cumplir el duty cicle en el peor de los casos, puedo enviar un dato cada dos minutos por lo tanto, bastaría con poner un delay de 120 segundos o 120.000 ms.
Y voy terminando con esta parte. Que cada vez que se despierte el microcontrolador tenga que estar 2 minutos encendidos sí o sí para respetar el duty cicle afecta de forma negativa al consumo. Aunque esta es la forma más rápida y sencilla de respetar esta restricción, no es la más óptima.
Teniendo en cuenta el consumo de la placa tanto en modo dormido como en modo transmisión, los parámetros y suponiendo que 2 veces al día alguien echa algo en buzón una batería de 800 mAh podría durar más de 1 año y medio sin recargar.
Bien, solo queda una cosa y es cargar el código a la placa. Conecta el programador al USB del ordenador, selecciona el puerto y da al botón de subir la placa.
Una vez haya terminado de cargar puedes desconectar los cables del programador e instalar la batería de Li-Ion de 800 mAh. Mucho ojo, porque empezará a detectar movimiento y a transmitir la información.
El siguiente paso es configurar el receptor.
Programación TTGO LoRa32
Ahora toca programar la placa TTGO LoRa32 que va instalamos en casa. Recuerda, esta placa se alimenta de la red eléctrica así que nada de rollos de baterías. Su función es la de recibir los mensajes enviados por LoRa desde el nodo que está instalado en el buzón y enviar la información vía WiFi a Home Assistant.
Luego, en Home Assistant, haremos que nos muestre un aviso en el panel de control y que nos envíe una notificación al móvil.
La programación la vamos a hacer igual que hemos hecho con el nodo del buzón, a través del IDE de Arduino. En este caso hay que instalar la compatibilidad con las placas ESP32 a través del gestor de placas. Una vez instalada selecciona la placa genérica ESP32 Dev Module. Conecta la placa TTGO LoRa32 al ordenador y selecciona el puerto.
El código lo obtenemos de la web de GitHub de PriceLess Toolkit. Si con el nodo que va en el buzón hemos copiado el código del Mailbox Guard, en este caso vamos a copiar el código que está en LoRa Gateway. En este caso tenemos 3 archivos.
El código principal, lo copiamos en el IDE de Arduino y lo guardamos. Y luego tenemos 2 códigos más. Uno para configurar la placa, board.h y otro, config.h, para configurar la conexión a la red WiFi, al servidor MQTT de Home Assistant y la configuración de LoRa.
Dentro del IDE de Arduino creamos dos nuevos archivos con los mismos nombres que los archivos de configuración a través de la opción New tab.
Vamos a configurar primero la placa. Tienes que averiguar qué versión es tu placa TTGO LoRa32. En mi caso es la versión 1.6 así que marco esta versión como 1 y el resto a 0. En la configuración de la red WiFi tienes que configurar el SSI y la contraseña.
En la configuración de MQTT configura el usuario, la contraseña y la IP del servidor de Home Assistant donde tienes instalado el broker MQTT.
Respecto a la configuración de LoRa no improvises ya que tienes que poner la misma configuración que utilizas en el nodo que va en el buzón. El mismo ancho de banda, spreding factor, coding rate y preámbulo.
No te olvides también de configurar la frecuencia que en mi caso es 868 MHz. Ahhh, y algo importante es que al principio verás la clave del gateway que tiene que coincidir con la clave que has configurado en el nodo del buzón. En mi caso es x.
Ya está, no tienes que tocar nada más. Si no habías conectado la placa al ordenador hazlo ahora y selecciona el puerto correspondiente. Haz clic en el botón para cargar el código.
Y una vez ha cargado el código, si todo está configurado correctamente, habrá aparecido un nuevo dispositivo dentro del a integración MQTT. Ese es el gateway o receptor LoRa. Para comprobar que todo funciona bien conecta el nodo LoRa que va en el buzón y haz que detecte movimiento.
Aparecerá un nuevo dispositivo en la integración MQTT que corresponde con el nodo LoRa del buzón donde podemos ver su estado, al detectar movimiento manda el estado mail y si no detecta es empty, el nivel de batería y el estado de la señal.
Recuerda que hemos puesto en delay de 2 minutos lo que quiere decir que cada vez que detecte movimiento estará dos minutos con el LED azul encendido.
A partir de aquí puedes crear una automatización para que cuando hay un cambio de estado en el nodo avise mediante una notificación a tu móvil. Incluso puedes añadir un ayudante interruptor para que cuando recibas una carta se active y cuando recojas lo que hay en buzón lo deactives rollo banderita de buzón americano.
Y para nota, puedes imprimir una carcasa con la impresora 3D para el nodo LoRa del buzón, tienes los archivos en el GitHub y otra carcasa para el receptor TTGO LoRa32.