Ir al contenido

← Todas las funcionalidades

Riego agrícola automatizadoRaspberry Pi (Docker)HTTPControl

Riego condicionado por la meteorología con OpenWeather y Node-RED

Regar justo antes de una tormenta desperdicia energía y ahoga el cultivo. Este flujo de riego inteligente para Node-RED en una Raspberry Pi consulta la API de OpenWeather antes de cada ciclo: los programadores de mañana y tarde (cron-plus) lanzan una petición de previsión, y un nodo function cancela el ciclo si se espera lluvia en las próximas 24 horas o las temperaturas se acercan a la helada. Un modo manual permite al agricultor saltarse la comprobación meteorológica. Es el núcleo de decisión de un despliegue real de riego automatizado.

Dos programadores, una sola cadena de decisión

Dos nodos cron-plus (07:00 y 19:00) y un inject manual convergen en la misma cadena — construir la URL de previsión, llamar a OpenWeather, decidir. El nodo function suma la lluvia prevista en ocho bloques de 3 horas y sigue la temperatura mínima pronosticada. Por encima de 2 mm de lluvia esperada o por debajo de 1 °C, msg.regar es false y el ciclo se omite con un motivo explícito.

El modo manual respeta al humano

Cuando el disparo llega desde el inject manual (o desde el comando /regar de Telegram), msg.modo se pone a manual y la comprobación de lluvia se omite: el agricultor ha decidido y el sistema obedece. Los datos meteorológicos siguen viajando en msg.meteo, así que el dashboard y las notificaciones muestran lo que decía la previsión aunque se haya ignorado — útil para ganar confianza en la automatización.

Motivos, no solo booleanos

Cada decisión lleva un msg.motivo legible ("Lluvia prevista: 5,2 mm en 24 h") que acaba en el estado del nodo, en la notificación de Telegram y en el registro del ciclo. La duración del ciclo depende de la franja horaria — más largo por la mañana, más corto por la tarde — y la orden de arranque se entrega a la pestaña Modbus que gobierna el Schneider Altivar 320.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry Pi (Docker) — cópialo libremente:

const LAT = 41.6000;                       // latitude of the farm (placeholder)
const LON = 1.8000;                        // longitude of the farm (placeholder)
const API_KEY = env.get("OPENWEATHER_API_KEY");

msg.mode = msg.mode || "auto";             // "auto" (scheduler) or "manual"
msg.url =
    "https://api.openweathermap.org/data/2.5/forecast" +
    `?lat=${LAT}&lon=${LON}&appid=${API_KEY}&units=metric&cnt=8`;
// cnt=8 -> next 24 h in 3-hour blocks

return msg;


// ===========================================================================
// FUNCTION 2 — "Decide irrigation"
// Analyzes the OpenWeather response: cancels if rain is forecast or there
// is frost risk. Manual mode ignores the rain (the farmer's decision).
// ===========================================================================
/*
const RAIN_THRESHOLD_MM = 2.0;    // mm accumulated in 24 h that cancel the cycle
const FROST_THRESHOLD_C = 1.0;    // forecast minimum in ºC that cancels the cycle

const blocks = msg.payload.list || [];
let totalRain = 0;
let minTemp = 99;

for (const b of blocks) {
    totalRain += (b.rain && b.rain["3h"]) ? b.rain["3h"] : 0;
    minTemp = Math.min(minTemp, b.main.temp_min);
}

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Qué endpoint de OpenWeather usa el flujo?

El endpoint de previsión de 5 días/3 horas con cnt=8, que cubre las próximas 24 horas y está disponible en el plan gratuito. La API key se lee de la variable de entorno OPENWEATHER_API_KEY del contenedor de Node-RED, nunca se guarda en el flujo.

¿Qué pasa si la API de OpenWeather no está disponible?

El nodo http request devuelve un error y la función de decisión nunca llega a poner msg.regar, así que el valor seguro por defecto es omitir el ciclo automático y avisar por Telegram. El agricultor siempre puede forzar un ciclo manual.

¿Puedo cambiar los umbrales sin editar el flujo?

En el ejemplo son constantes al principio del nodo function por claridad. En producción los movemos a contexto de flujo o a variables de entorno para que los umbrales de lluvia y helada sean editables desde el dashboard.

Funcionalidades relacionadas