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í.
“PATROCINADO - Prueba los productos de Proton Privacy para proteger tu privacidad y seguridad y estarás contribuyendo al desarrollo de este sitio web sin ningún costo adicional - Proton Mail - Proton Drive - Proton Pass - Proton VPN”
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).
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:
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).
Apuntamos el valor leído y, a continuación, llenamos el recipiente de agua hasta la mitad aproximadamente:
A lo cual, los logs reportan el siguiente valor:
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.
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í:
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.
“Los enlaces a productos de Amazon que encuentras en esta página son enlaces de afiliado. Esto significa que si decides realizar una compra a través de estos enlaces, recibiré una pequeña comisión sin ningún costo adicional para ti. Estas comisiones ayudan a mantener y apoyar mi trabajo en este sitio web. ¡Gracias por tu apoyo!”
“PATROCINADO - Prueba los productos de Proton Privacy para proteger tu privacidad y seguridad y estarás contribuyendo al desarrollo de este sitio web sin ningún costo adicional - Proton Mail - Proton Drive - Proton Pass - Proton VPN”