Polling de varias estaciones PLC y clasificación de alertas en Node-RED
Un inject, cuatro peticiones
msg.url apuntando a POST /esp32plc14_XX/status. El nodo http request toma la URL del mensaje, así que un solo nodo sirve a toda la flota. Las peticiones salen escalonadas 200 ms para no estresar la red ni el event loop.El silencio es una alerta de nivel 4
status. Si una estación no devuelve JSON o responde con un código distinto de 200, la función fuerza msg.alerta = 4 — una estación que deja de responder en un talud se trata como crítica, no como dato ausente. Cada lectura válida se cachea además en el contexto de flujo para el dashboard.Cinco salidas, cinco reacciones
msg.alerta con cinco reglas de igualdad. Los niveles 0-2 solo refrescan el dashboard y el log; los niveles 3 y 4 alimentan además una función que formatea asunto y cuerpo para el script de alertas SMTP. Añadir una quinta estación es añadir una línea a una constante — el flujo no cambia.Un fragmento de la implementación
Tal cual del ejemplo desplegado en el ESP32 PLC 14 (×4, Ethernet) — cópialo libremente:
const STATIONS = [
{ id: 31, ip: "10.10.10.31" },
{ id: 32, ip: "10.10.10.32" },
{ id: 33, ip: "10.10.10.33" },
{ id: 34, ip: "10.10.10.34" }
];
const msgs = STATIONS.map(sta => ({
url: `http://${sta.ip}/esp32plc14_${sta.id}/status`,
method: "POST",
payload: {}, // empty body: we only request status
station: sta.id, // travels with the msg for traceability
topic: `station/${sta.id}`
}));
// Send the 4 messages staggered (200 ms) to avoid flooding
msgs.forEach((m, i) => setTimeout(() => node.send(m), i * 200));
return null;
// ======================================================================
// FUNCTION NODE "classify alert" (1 input, 1 output)
// Wire it to the http request output. Normalizes the response and computes
// msg.alert (0=normal ... 4=critical) feeding the 5-output switch.
// ======================================================================
/*
let data;
try {
data = typeof msg.payload === "string" ? JSON.parse(msg.payload) : msg.payload;
} catch (e) {
data = null;El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Por qué polling en lugar de que los PLC empujen sus datos?
En realidad hacemos ambas cosas. El polling da al concentrador el control del intervalo de medida, mientras que un push periódico desde cada estación actúa como watchdog. Cualquiera de los dos lados puede detectar que el otro ha enmudecido.
¿Cuántas estaciones puede sondear una instancia de Node-RED?
Decenas sin problema. El nodo http request procesa los mensajes secuencialmente, así que 4 estaciones a intervalos de 60 s es una carga mínima incluso en una Raspberry Pi. Escalona las peticiones si pasas de 20-30 estaciones.
¿Qué ocurre si una petición supera el timeout?
La función clasificadora trata los timeouts y el JSON inválido como nivel 4, de modo que el fallo sigue el mismo camino que una lectura crítica de sensor y acaba en un email al buzón de soporte.