5.8 KiB
Sistema de Riego Automático — ESP8266 + Docker
Stack completo para control y monitorización de riego con ESP8266/Tasmota, Mosquitto, Python controller, InfluxDB y Grafana.
Estructura del proyecto
└── docs/
├── tasmota-config.md # Comandos de configuración Tasmota
Hardware
| Dispositivo | IP | Detalle |
|---|---|---|
| ESP8266 (Tasmota 15.4.0) | 192.168.1.42 |
MAC 18:FE:34:D3:01:BA |
| Broker Mosquitto | 192.168.1.200:1883 |
Docker en este ordenador |
Cableado GPIO (verificado)
| Pin NodeMCU | GPIO | Función | Notas |
|---|---|---|---|
| D1 | GPIO5 | Relay_i → IN1 | Motor riego (Relay1) |
| D6 | GPIO12 | Relay_i → IN2 | Motor abastecimiento solución (Relay2) |
| D7 | GPIO13 | Relay_i → IN3 | Motor abastecimiento agua (Relay3) |
| D2 | GPIO4 | SR04 Trig | Directo, sin resistencias |
| D5 | GPIO14 | SR04 Echo | Con divisor de tensión 5V→3.3V |
⚠️ Tasmota estándar no incluye SR04 — instalar
tasmota-sensors.binprimero. La actualización OTA borra los GPIOs; hay que reconfigurarlos después. El módulo SunFounder es activo LOW → todos los relés usanRelay_i(inverted).
Lógica de riego — Tasmota Rules (autónoma)
Los tres motores se controlan mediante una Rule en el propio ESP8266, sin necesitar el broker MQTT.
Roles de cada motor:
| Relay | Pin | Motor | Función |
|---|---|---|---|
| Relay1 | D1/GPIO5 | Riego | Distribuye agua a las plantas |
| Relay2 | D6/GPIO12 | Abastecimiento sustrato | Aporta solución nutritiva al depósito |
| Relay3 | D7/GPIO13 | Abastecimiento agua | Aporta agua limpia al depósito |
Comportamiento:
| Condición SR04 | Acción |
|---|---|
| Distancia > 30 cm | Relay2 y/o Relay3 ON (según modo) |
| Distancia < 10 cm | Relay2 y Relay3 OFF (Relay1 sigue) |
Relay1 (riego) arranca y para por comando — independiente del sensor. Si se para el riego, los motores de abastecimiento siguen hasta que la distancia baje de 10 cm.
Rules activas en el ESP8266:
Rule1 — lógica de sensores y motores + gestión automática de Mem2:
Rule1 ON SR04#Distance>30 DO if (mem1==1) Backlog Power2 ON; Power3 ON elseif (mem1==2) Power3 ON elseif (mem1==3) Power2 ON endif ENDON ON SR04#Distance<10 DO Backlog Power2 OFF; Power3 OFF ENDON ON Power1#State=1 DO Mem2 1 ENDON ON Power1#State=0 DO Mem2 0 ENDON
Rule1 1
Rule2 — reanudación automática tras corte de luz:
Rule2 ON System#Boot DO if (mem2==1) Power1 ON endif ENDON
Rule2 1
Mem2 se gestiona automáticamente: se activa al encender el riego y se desactiva al apagarlo. No hace falta incluirlo en los comandos.
Comandos de operación:
| Acción | Comando |
|---|---|
| Encender modo completo (agua + sustrato) | Backlog Mem1 1; Power1 ON |
| Encender solo agua | Backlog Mem1 2; Power1 ON |
| Encender solo sustrato | Backlog Mem1 3; Power1 ON |
| Parar solo riego (abastecimiento sigue hasta <10 cm) | Power1 OFF |
| Parar todo | Backlog Power0 OFF; Mem1 0 |
Variables persistentes en flash:
| Variable | Función |
|---|---|
Mem1 |
Modo activo (1=completo, 2=solo agua, 3=solo sustrato, 0=parado) |
Mem2 |
Auto-reanudación tras corte de luz — gestionado automáticamente por Rule1 |
Arquitectura final: esta lógica es autónoma y funciona sin red. El objetivo es que el broker Mosquitto reciba la telemetría del sensor vía MQTT y el controller Python envíe los comandos
Power1/2/3con lógica adicional (franjas horarias, niveles mínimos, alertas). Las Rules y el broker coexisten: las Rules actúan como capa de seguridad local aunque el broker no esté disponible.
Antes de levantar el stack, configura Tasmota: ver docs/tasmota-config.md.
Servicios Docker
| Servicio | Puerto | Descripción |
|---|---|---|
| mosquitto | 1883 | Broker MQTT (accesible desde ESP8266) |
Variables de entorno clave
Ejemplo de programación:
[{"days":["mon","wed","fri"],"time":"07:00","duration_minutes":20}]
Documentación
Cómo se encontró el ESP8266
ESP8266 - Localizar dispositivo en la red local
Problema
Tienes un ESP8266 conectado a la red WiFi pero no recuerdas su IP.
Solución: escaneo de red
1. Identificar tu red
ip route | grep default
Esto muestra tu puerta de enlace y la IP de tu máquina. En este caso:
- Red:
192.168.1.0/24 - Tu PC:
192.168.1.41 - Router:
192.168.1.1
2. Ping sweep para descubrir dispositivos activos
for i in $(seq 1 254); do ping -c 1 -W 1 192.168.1.$i > /dev/null 2>&1 & done; wait
Envía un ping a cada IP posible de la red (192.168.1.1 hasta 192.168.1.254) en paralelo. Esto hace que tu sistema guarde en la tabla ARP la MAC de cada dispositivo que responde.
3. Consultar la tabla ARP
ip neigh show | grep -v FAILED | sort -t . -k 4 -n
Muestra todos los dispositivos detectados con su IP y dirección MAC. El truco está en identificar la MAC del ESP8266.
4. Identificar el ESP8266 por su MAC (OUI)
Los primeros 3 bytes de una MAC identifican al fabricante (OUI). Espressif Systems, el fabricante del ESP8266/ESP32, tiene estos prefijos conocidos:
| Prefijo MAC | Fabricante |
|---|---|
18:FE:34 |
Espressif Systems |
5C:CF:7F |
Espressif Systems |
60:01:94 |
Espressif Systems |
A0:20:A6 |
Espressif Systems |
84:F3:EB |
Espressif Systems |
En el escaneo apareció:
192.168.1.42 lladdr 18:fe:34:d3:01:ba REACHABLE
El prefijo 18:FE:34 confirma que es un dispositivo Espressif → es el ESP8266.
5. Verificar conectividad
ping -c 3 192.168.1.42
Responde correctamente con ~120ms de latencia (normal para WiFi).
Resultado
| Dato | Valor |
|---|---|
| IP del ESP8266 | 192.168.1.42 |
| MAC | 18:fe:34:d3:01:ba |
| Fabricante | Espressif Systems |