Home Sensor de humedad para plantas o «soil moisture sensor» con ESP32 integrado en Home Assistant (vía ESPHome)
Post
Cancel

Sensor de humedad para plantas o «soil moisture sensor» con ESP32 integrado en Home Assistant (vía ESPHome)

Vamos a integrar un sensor de ‘humedad’ para plantas (conocido como moisture sensor) mediante un ESP32 (con ESPHome) en Home Assistant.

Lista de componentes

  • ESP32 (también se puede usar un ESP8266 pero la «atenuación» no está disponible).
  • Sensor «soil moisture sensor» para Arduino que incluye el sensor propiamente dicho y un potenciómetro.
  • Nuestro sistema domótico con Home Assistant.
  • Una planta (bastante obvio); en mi caso estoy controlando la humedad de un pequeño cactus.
  • Suponemos el add-on de ESPHome ya instalado en Home Assistant pero si no es el caso, explico lo mismo en ESTA entrada.

Software

  • Home Assistant.
  • ESPHome del que ya hablamos aquí.

Conexiones

Vamos primero a conectar los pocos cables necesarios, estos son:

  • Del sensor en sí al potenciómetro: 1 cable a tierra y otro a corriente.
  • Del potenciómetro ahora salen cuatro pines pero solo hacemos uso de tres dependiendo de si usamos la salida digital o analógica. En principio voy a hacer uso de la salida digital y más adelante probaré la analógica. Para ello:
    • GND a GND del ESP32
    • VCC a 3.3V del ESP32
    • DO al pin 34 del ESP32 (ojo, en el ESP32, pueden usarse desde el 32 al 39 como pines digitales, yo uso el 34 por conveniencia).
    • El potenciómetro tiene una pequeña «ruleta» que nos permite ajustar la sensibilidad para la salida digital pero no vamos a tocarla todavía).

Conexiones realizadas al potenciómetro

ESPHome

Vamos a probar el voltaje que devuelve el sensor fuera y dentro del agua para saber que valores son los máximos/mínimos que devuelve. Para ello meto el sensor primero en un recipiente completamente seco, tomo medidas y luego llenamos el recipiente de agua hasta que quede (por lo menos la mitad del sensor) sumergido.

Antes que nada, vamos a flashear el ESP32 desde el add-on de Home Assitant porque si no, poca información vamos a sacar. El código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
esphome:
  name: planta
  platform: ESP32
  board: esp-wrover-kit

wifi:
  ssid: "Mi_red_wifi"
  password: "Mi_password"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Planta Fallback Hotspot"
    password: "Mi_password"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "Mi_password"

# OTA Access
ota:
  password: "Mi_password"

# Sensores:
sensor:
  - platform: adc
    pin: 34
    name: "Cactus"
    attenuation: 11db
    update_interval: 60s
    unit_of_measurement: '%'
    filters:
      - lambda: |-
          if (x > 3.9) {
            return 0;
          } else if (x < 0.11) {
            return 100;
          } else {
            return (3.9 - x) / (3.9 - 0.11) * 100.0;
          }

Por ahora, para los ESP32, con la mayoría de sensores la escala es sobre 3.9V y por tanto, de acorde a la documentación, es necesario que el parámetro «attenuation» esté a 11db.

Para el resto de parámetros:

  • name: Nombre que queramos; preferiblemente algo facilmente identificable.
  • update_interval: intervalo de medición; no es recomendable que la frecuencia de actualización sea muy alta, especialmente en sensores tan baratos.
  • pin: depende del que hayamos seleccionado, teniendo en cuenta que estamos usando la salida analógica, desde el 32 al 39 están disponibles.
  • unit_of_measuremente: podemos poner cualquier cosa; en mi caso voy a usar un porcentaje porque uso una lambda (función).
  • filters –> lambda –> función que convertirá los datos de entrada a un porcentaje. Estos valores numéricos aún no los conocemos así que podemos poner cualquier nº (recomedación: usa estos que aparecen aquí ahora y luego los cambias), y los modificaremos cuando midamos lo necesario.

Con todo esto escrito podemos generar el binario y pasar al punto siguiente donde conectaremos el ESP32 al ordenador para flashearlo. Si no tienes ni idea de a que me refiero, consulta ESTA entrada dónde vemos como flashear un ESP32.

Testing…

Una vez flasheado el binario sobre el ESP32, metemos el sensor en un recipiente seco y vacío y vamos a consultar los logs:

Estado del nodo en ESPHome Sensor en seco

En unos segundos deberíamos estar viendo por pantalla los valores leídos (dependiendo del valor del update_interval, se actualizarán con mayor/menor frecuencia).

LOGS I

Apuntamos el valor leído y, a continuación, llenamos el recipiente de agua hasta la mitad aproximadamente:

Sensor en mojado

A lo cual, los logs reportan el siguiente valor:

LOGS II

Ahora que ya sabemos los valores en seco y en agua, podemos volver al código anterior y modificar los parámetros, en mi caso, ya están en los valores de las imágenes.

1
2
3
4
5
6
7
8
9
filters:
      - lambda: |-
          if (x > VALOR_SECO) {
            return 0;
          } else if (x < VALOR_AGUA) {
            return 100;
          } else {
            return (VALOR_SECO - x) / (VALOR_SECO - VALOR_AGUA) * 100.0;
          }

Home Assistant

Ahora que ya tenemos los parámetros ajustados, podemos flashear por OTA (ya que nuestro ESP32 ya está conectado). Vamos a meter el sensor en la planta en cuestión y, si no lo hemos hecho ya, añadir la nueva entidad a Home Assistant.

Si por alguna razón el autodiscover no está habilitado y no ha saltado una notificación en HASS, vamos a Configuración > Integraciones > + > ESPHome y añadimos el nuevo dispositivo que en mi caso es planta.local.

Imagen del cáctus

Vamos a añadir la entidad al panel de Lovelace de HASS. Damos a editar panel y directamente a código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type: 'custom:stack-in-card'
mode: vertical
cards:
  - type: picture-glance
    image: local/cactus.png
    entities: []
    hold_action:
      action: none
    tap_action:
      action: more-info
    entity: sensor.cactus
    theme: Google Dark Theme
    aspect_ratio: '1'
  - type: entity
    entity: sensor.cactus
    name: Cactus Soil moisture

En mi caso, estoy usando una extensión de HACS que es stack-in-card para agrupar dos tarjetas y un tema personalizado Google Dark Theme, para mostrar una imagen junto a la entidad en sí; hablamos sobre personalización aquí. Para que la imagen se vea, hay que guardarla en la carpeta www que debe encontrarse en la carpeta config (si no teneis carpeta www, podeís crearla sin problema).

El resultado, sabiendo que la entidad se llama sensor.cactus, queda tal que así:

Resultado

Esto sería todo; ahora que Home Assistant está guardando los valores, podríamos también añadir un registro de la humedad en Grafana (cosa que expliqué AQUÍ) para generar gráficas más interesantes en base al tiempo.

This post is licensed under CC BY 4.0 by the author.

ESP32, ESPHome y Home Assistant (pero todo junto)

Configuramos el módulo de cámara ESP32-CAM en Home Assistant con ESPHome