Autoriego inteligente de plantas mediante IoT, HomeAssistant, OpenWeatherMap y NodeRed

Autoriego inteligente de plantas mediante IoT, HomeAssistant, OpenWeatherMap y NodeRed

Verano, sinónimo de vacaciones… Como habréis notado por la baja de frecuencia de posts, ya estamos en época estival.

Las vacaciones que tanto nos gustan se convierten en un quebradero de cabeza para los que, como a mí, nos encantan las plantas. Una buena forma de solucionar cualquier problema es que algún vecino, amigo o familiar pase por tu casa de forma frecuente para regar las plantas que más sed tengan, pero si quieres evitar comprar una botella de vino como agradecimiento, sigue leyendo.

Antes de empezar este post, voy a dar por supuesto que lees de forma habitual nuestro blog, estás suscrito a nuestro canal de telegram y que ya tienes Home Assistant instalado, así como un broker MQTT, un gateway ZigBee, una base de datos InfluxDB y Grafana en nuestro servidor unraid.

(Foto de portadaAnnie Spratt en Unsplash)

TOC

Plantas sensorizadas

Me encantaría poder ofreceros cientos de alternativas pero la realidad actual es que apenas existen sensores de plantas que sean económicos, duraderos y fiables. Existe la opción de que te los fabriques tú mismo usando unos ESP y sensores de humedad, pero no es nada fiable y menos para su uso en exteriores.

Mi recomendación es que utilices los sensores o macetas sensorizadas de Xiaomi, ya que los puedes encontrar muy baratos si tienes paciencia y esperas a ofertas, son bastante fiables y son robustos.

Sensores 1

Las características principales de estos sensores son:

  • Pila de botón 2032: con unas baterías desechables CR2032 podrás aguantar no más de 6 meses, ya que vamos a realizar lecturas periódicas cada hora. Te recomiendo que te hagas con unas pilas recargables de litio LIR2032 y un cargador, que aunque su duración es menor (unos 3 meses) ya que su densidad energética es menor, ecológicamente es más sostenible.
  • Bluetooth BLE 4.1: consumos bajos y alto rango.
  • Sensor de humedad: mide la conductividad de la tierra. Bastante preciso, aunque conviene mover el sensor de vez en cuando (cada vez que cambias la pila, por ejemplo) para que los valores sean más exactos ya que a veces se queda algo de tierra pegada a las bornas.
  • Sensor de fertilidad: muy poco útil ya que depende mucho de la humedad de la tierra. Cuanta más humedad, mayor concentración de sales y por tanto mayor fertilidad. Yo personalmente no le hago caso, el abonado de las plantas lo hago siguiendo los ciclos de cada planta o árbol.
  • Sensor de temperatura: podríamos utilizarlo para crear alertas en las plantas que no aguanten bien el frío, como los cítricos.
  • Sensor de luz: podríamos usarlo para medir la intensidad de luz que reciben, pero en mi caso prefiero utilizar los pronósticos de tiempo junto a la humedad de la tierra para decidir si riego o no.
  • Sensor de batería: nos dice cuando un sensor se queda sin batería (bueno, si está sin batería no nos podrás decir nada…no es muy útil)

Para poder comunicarnos con estos sensores, necesitaremos saber su número MAC bluetooth. Para poder conocerlo utilizaremos la aplicación BLE Scanner en nuestro teléfono.

Introducimos la pila en el sensor, lo colocamos al lado del teléfono y en el listado buscando por el Flower Care con la señal más fuerte (el -XXdB más bajo) o el único que haya :) :

Sensores 2

Anotamos en un block de notas la planta en la vamos a colocar el sensor y la MAC correspondiente (y colocamos ya el sensor para no liarnos si vamos a configurar más de uno). Hacemos esto con todos los sensores que vayamos a colocar.

MiFlora Daemon en Raspberry Pi

Casi seguro que tu servidor con unraid con pincho Bluetooth no tenga suficiente cobertura para cubrir la totalidad de tu casa/piso y tu terraza o jardín. Mi recomendación es que distribuyas una serie de Raspberry Pi Zero W por las diferentes estancias y cerca de las ventanas o puertas en caso de que quieras obtener datos de plantas del exterior.

Daemon 2

Estos microordenadores son de muy bajo consumo y puedes disimularlos fácilmente con unas pequeñas cajas impresas en 3D.

Podrías incluso meterlos en una caja estanca y alimentarlos con una placa solar y una batería. Si haces esto último por favor déjalo en los comentarios para que lo podamos replicar.

Bueno, vamos a ello. Para obtener los datos de los sensores vamos a instalar en cada una de las Raspberry un pequeño script de Python que irá preguntando a cada planta su estado con el intervalo que nosotros definamos y lo publicará por MQTT contra nuestro Broker. Esta publicación será recogida automáticamente por Home Assistant ya que configuraremos el topic de forma que la función autodiscovery de Hass capte estos dispositivos sin intervención por nuestra parte.

Para poner en marcha la primera Raspberry, vamos a descargarnos la imagen oficial de la distro de Raspberry Pi OS Lite. Una vez descargado, utilizando Balena Etcher vamos a “quemar” la imagen en una tarjeta microSD (te recomiendo que utilices algo decente y de unos 16gb):

Daemon 1

Al finalizar la instalación, en la carpeta boot de la tarjeta microSD añadimos estos dos archivos.

  • Este sirve para habilitar la conexión remota por SSH.

  • Este archivo sirve para que la Raspberry se conecte de forma automática a nuestra WiFi. Para ello debes cambiar la SSID y contraseña con las tuyas:

Daemon 3

Introducimos la tarjeta microSD en la Raspberry y enchufamos el microordenador a la corriente con un adaptador micro USB.

Ahora vamos a nuestro router y vamos a buscar la IP de la Raspberry que se acabará de unir a la red.

Abrimos nuestro editor de código VsCode e instalamos la extensión SSH Client, así podremos conectarnos de forma remota y modificar los archivos de la Raspberry sin salir de nuestro editor preferido:

Daemon 4

Añadimos la configuración de SSH y nos conectamos:

Daemon 5
  • Name: el nombre para saber que raspi es
  • Host: la IP de la raspi
  • Port: el puerto ssh, el 22 por defecto
  • Username: pi
  • Password: raspberry

Si hacemos click en el nombre accederemos al explorador de archivos remoto de la raspberry. Si hacemos click en el icono de la consola, abrimos una sesión remota.

Daemon 6

Lo primero que vamos a hacer en la consola SSH es actualizar la raspberry mediante los siguientes comandos:

sudo apt update
sudo apt upgrade

También es conveniente que cambies la clave SSH, para ello hacemos:

sudo raspi-config

Y en el menú vamos a System Options > Password, tecleamos la contraseña por defecto “raspberry” y la cambiamos por la que más nos guste, usando por ejemplo el generador de contraseñas de nuestro gestor de contraseñas (y aprovechamos para guardar los datos de acceso):

Daemon 7 Daemon 8

Reiniciamos con:

sudo reboot

Y en VsCode, en la configuración de conexión de esta Raspberry cambiamos la contraseña de SSH que habíamos puesto por la nueva que acabamos de meter.

Ahora sí, ya podemos instalar Miflora Daemon. Los pasos son los que aparece en la documentación de GitHub del proyecto:

Instalamos las dependencias y librerías necesarias y descargamos el proyecto:

sudo apt install git python3 python3-pip bluetooth bluez

git clone https://github.com/ThomDietrich/miflora-mqtt-daemon.git /opt/miflora-mqtt-daemon

cd /opt/miflora-mqtt-daemon
sudo pip3 install -r requirements.txt

Creamos un archivo de configuración copiando el de por defecto:

cp /opt/miflora-mqtt-daemon/config.{ini.dist,ini}

Ahora, en el explorador de archivos remoto de VsCode vamos a la carpeta /opt/miflora-mqtt-daemon de nuestra raspi y con doble click abrimos el archivo para editarlo:

Daemon 9

Los cambios a realizar son:

El metodo de reporte lo ponemos a homeassistant mqtt, así funcionará el autodiscovery:

[General]
reporting_method = homeassistant-mqtt 

Hacemos que el script funcione de forma ininterrumpida con una frecuencia de lectura de los sensores de 3600s (1 hora) por ejemplo:

[Daemon]
enabled = true
period = 3600

Añadimos los datos de nuestro servidor MQTT y el juego de user/pass que hayamos creado para este acceso:

[MQTT]
hostname = la ip del broker MQTT
port = puerto del broker MQTT, por defecto 1883
username = usuario creado en el Broker para este equipo
password = el password para este usuario en el Broker MQTT

Y finalmente añadimos los sensores de las plantas que tenga que leer esta raspberry, añadiendo como nombre el que queramos que aparezca en Home Assistant y a su lado el número MAC del sensor:

[Sensors]

cerezo = C4:7C:8D:6A:XX:XX 
manzano = C4:7C:8D:6A:XX:XX 
dracaena = C4:7C:8D:67:XX:XX 
orquidea = C4:7C:8D:66:XX:XX 
hedera = C4:7C:8D:6A:XX:XX

Guardamos el archivo y vamos a probar que todo funcione. Para eso vamos a lanzar los comandos:

python3 /opt/miflora-mqtt-daemon/miflora-mqtt-daemon.py
Daemon 10

Y ahora esperamos que no arroje errores. Si todo va bien, iremos viendo cómo el script hace lo que se supone que debe hacer, ir preguntando a cada planta su estado y publicar esos datos por MQTT. SI todo va bien, podremos ir a Home Assistant y en la lista de entidades veremos que se han creado las entidades correspondientes a cada planta y que los datos de cada sensor han llegado:

Daemon 11

De nuevo en la consola, paramos el script con ctrl+c y ahora convertimos el script en un servicio que funcione solo y que arranque solo al reiniciar el aparato haciendo lo siguiente:

sudo cp /opt/miflora-mqtt-daemon/template.service /etc/systemd/system/miflora.service

sudo systemctl daemon-reload

sudo systemctl start miflora.service
sudo systemctl status miflora.service

sudo systemctl enable miflora.service

InfluxDB y Grafana en Home Assistant

En este momento los datos generados por las plantas son suficientes para pasar directos a la automatización del siguiente paso, pero ya que tenemos instalada la base de datos de Influxdb y Grafana, con muy poco esfuerzo vamos a aprovecharlo y visualizar de forma automática los valores de estos sensores en una gráficas más chulas que las que nos ofrece Hass.

Vamos a nuestra interfaz de nuestro Chronograf y creamos un bucket llamado hass con la política de retención que queramos (en mi caso, 7 días) y creamos un token con acceso en escritura a este bucket:

Influx 1

Para empezar a historizar los datos de las plantas y el resto de sensores de hass en nuestro influxDB, solo debes añadir lo siguiente a tu archivo de configuración de home assistant:

influxdb:
  api_version: 2
  ssl: false
  host: ip del servidor
  port: 8086
  token: token_creado
  organization: main
  bucket: hass
  tags:
    source: HA
  tags_attributes:
    - friendly_name
  default_measurement: units
  include:
    domains:
      - sensor

Ahora en grafana, con otro token en lectura, deberás añadir este bucket como nuevo origen de datos. Para ayudarte un poco, he creado este dashboard para ti que te permitirá ver los valores de todos los sensores de todas las plantas que tengas configuradas de forma automática:

Influx 2

Pronósticos de lluvia con IA con OpenWeatherMap

Utilizando únicamente los datos de los sensores de las plantas nos puede ocurrir que realicemos un riego cuando ya está lloviendo o está a punto de hacerlo, corriendo el riesgo de ahogar nuestras plantas (de hecho, mi experiencia es que la mayoría de plantas toleran mejor la falta que el exceso de riego).

Para tener unos pronósticos de lluvias fiables vamos a implementar el plugin the OpenWeatherMap en Hass, que es un servicio gratuito(con limitaciones) con API pública que utiliza modelos de Inteligencia Artificial para, en base a las mediciones de estaciones de tiempo profesionales de cada zona, ofrecer un pronóstico muy certero del tiempo en las siguientes horas.

Weather 1

Para poder empezar a utilizar este servicio debemos crearnos una cuenta en su página web:

Weather 2

En el apartado de API Keys, creamos una:

Weather 3

Ahora en Home Assistant vamos a Configuración > Integraciones y añadimos la integración de OpenWeatherMap:

Weather 4

Añadimos nuestra API token ya que la latitud y longitud las cogerá automáticamente de nuestra configuración de Hass y dejamos la llamada en onecall_daily ya que nuestra cuenta/token es gratuita y tiene la cantidad de llamadas diarias limitada si no queremos pagar:

Weather 5

Esto nos creará una serie de sensores con el tiempo actual y los pronósticos:

Weather 6

y una entidad de tipo Weather que podremos usar para poner bonito nuestro dashboard de Home Assistant:

Weather 7

Riego automático con ZigBee

De la misma forma que podemos automatizar las luces de casa con Zigbee2MQTT vamos a automatizar el riego de nuestras plantas creando un control avanzado de lazo cerrado.

Para hacerlo de forma segura y barata lo mejor es adquirir un aparato como los que vende Lidl (agotadísimo en todas partes hasta el verano que viene) o este de Woox (que vale el doble…). En ambos casos funcionarán automáticamente si los emparejamos con nuestro Zigbee2MQTT, exactamente igual que como funciona cualquier enchufe o bombilla ZigBee.

Riego 1

Para montar el circuito de riego no necesitas conocimientos avanzados de hidráulica, solo un poco de maña y de lógica. Yo he optado por pasar por la tienda de la cadena Leroy Merlin más cercana ya que tienen una sección dedicada al riego por goteo en el que encontrarás todo lo que necesitas.

Mi sistema consiste en un tubo principal de distribución de 16mm de diámetro (tubo gordo, mucho caudal) del cual cuelgan pequeños tubos de 4mm (tubos finos, poco caudal y más presión) que llegan a cada maceta y expulsan agua con un difusor/gotero regulable. De esta manera puedo regular en cada riego la cantidad de agua dependiendo del tamaño de la maceta y las necesidades de agua generales de cada planta.

Esto es importante tenerlo en cuenta ya que el riego que vamos a implementar será de un único canal, esto es, cuando alguna de las plantas necesite agua tendremos que regarlas todas.

Node-Red, la aplicación definitiva para automatizaciones

Como vimos en el post inicial de Home Assistant, crear automatizaciones simples es fácil con su interfaz web, pero si la cosa se complica con muchos triggers, condicionantes, etc deja de ser amigable ya que la propia interfaz nos complica mucho las cosas.

Por suerte para nosotros, existe una herramienta de programación visual por bloques llamada Node-Red con el cual podremos hacer prácticamente cualquier cosa que se nos ocurra:

Node red 1

Esta herramienta se está poniendo cada vez más de moda en el mundo del IoT ya que es muy flexible e intuitivo para usar y además es muy robusto en su funcionamiento.

Para instalar Node-Red en nuestro unraid debemos ir como siempre a la pestaña apps y buscamos la aplicación con el mismo nombre:

Node red 2

En la plantilla a priori no hace falta cambiar nada, pero ojo, ya que si seguiste los pasos del tutorial de instalación del Proxy Reverso, el puerto 1880 lo tendrás ya ocupado por dicho mircroservicio por lo que deberás cambiarlo a otro, como por ejemplo, el 2880:

Node red 3

Una vez instalado vamos a la interfaz web http://ip-de-unraid:2880 y veremos esto:

Node red 4

En la parte izquierda vemos los bloques que podemos añadir, a la derecha el entorno de configuración y en el centro el lienzo donde crear nuestros flujos.

Para que entienda cómo funciona Node-Red lo mejor es hacer primero un pequeño flujo muy simple. Selecciona un bloque Inject y arrastralo al lienzo. Después hacemos lo mismo con un bloque debug. Ahora conectamos los dos extremos con un “cable” y hacemos clic en Deploy arriba a la derecha:

Node red 5

Para ponernos en modo debug, hacemos click en el icono del bug en el lado derecho. Ahora, si hacemos click en el botón de inject. Veremos que en el debugger aparece esto:

Node red 6

Como ves, Node-Red funciona haciendo viajar la información en forma de mensajes desde el bloque que inicia el flujo hasta el último de forma dirigida, esto es, cada bloque con salidas emitirá un topic/payload, y los bloques con entradas harán caso a topics específicos de entrada.

Vamos a crear un pequeño flujo que nos permita leer el valor de un sensor de una de las plantas que tenemos ya en Home Assistant y dependiendo de su valor activaremos el riego. Lo vamos a hacer en cuatro pasos:

Instalar el palette

Lo primero que vamos a hacer es instalar los bloques de Home Assistant ya que no vienen instalados en Node-Red por defecto. Para ello vamos a manage palette:

Node red 7

Pestaña install, buscamos “node-red-contrib-home-assistant-websocket” y lo instalamos:

Node red 8

Ahora ya aparecerán los bloques azules de Hass en el lado izquierdo:

Node red 9

Creamos un token de acceso a la API de home assistant

En Hass, accedemos a nuestro perfil de usuario y abajo del todo generamos un token:

Node red 10

Guardamos el token en un bloc de notas para el siguiente paso.

Señal de la planta

Cogemos un bloque Poll state que lo que hará es iniciar un flujo con una frecuencia específica que nosotros indiquemos emitiendo en el mensaje el valor del sensor. Hacemos doble click sobre el bloque para que nos abra el configurador y donde pone Add new server hacemos click en el lápiz y rellenamos los datos con la IP local de hass y puerto, el token que acabamos de generar:

Node red 11

Aceptamos y ahora nos volverá a mostrar la configuración del bloque poll state. Aquí vamos a buscar el sensor de humedad de nuestra planta, cambiamos la frecuencia a una hora, indicamos que solo nos devuelva el valor del sensor si es menor al valor numérico mínimo que queramos y seleccionamos que nos devuelva un valor al hacer deploy.

Node red 12

Activación del riego

Para el aparato de riego, vamos a añadir un bloque de call service y lo rellenamos con los datos del switch que nos ha generado Zigbee2MQTT al emparejar el aparato de riego:

Node red 13

Juntamos el extremo del Poll con el del Call y hacemos Deploy. En ese momento y cada hora, si se cumplen las condiciones de que el valor del sensor sea menor que el que hayamos fijado, se iniciará el riego.

De acuerdo, esto no tiene nada de inteligente. No estamos usando ni OpenWeatherMaps ni nada de lo que hemos preparado en los pasos anteriores. Bien, para el siguiente paso vas a tener que instalar el palettes “node-red-contrib-combine” que nos servirá para hacer operaciones lógicas booleanas de tipo AND, OR, XOR etc. además de poder sacar deltas y tener un gang-bang (histéresis).

Una vez instalado el palette, ya puedes importar el flow que yo te he preparado para facilitarte el trabajo:

Node red 14

Una vez importado, tendrás que modificar el servidor de Hass haciendo click en alguno de los bloques azules, y revisar que cada uno de los sensores indicados coincide con alguno tuyo. El flujo como ves, se activa tres veces al día y si no hay previsiones de lluvia y alguno de los sensores indica falta de agua, se activa el riego. Además he incluido un control de temperatura para evitar activar el riego si la temperatura es inferior a 0 grados ya que corremos el riesgo de romper nuestro circuito de riego si se ha congelado.


A partir de aquí ya es cuestión de que juegues un poco con Node-Red para dejar el flujo a tu gusto, y si te atreves, ir migrando las automatizaciones de luces etc que tengas hechas a esta nueva herramienta que es mucho más amigable.

Aqui te dejo algunos ejemplos de mis automatizaciones actuales:

Node red 15 Node red 16 Node red 17

Suscríbete, que es gratis

Nota: algunos de los enlaces a productos o servicios pueden ser enlaces referidos con los que podemos obtener una comisión de venta.

Similar Posts