El lado servidor: un concentrador Node-RED multiplanta
Validar y deduplicar en la puerta
Todo acaba en disco, dos veces
Saber quién se ha quedado callado
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el Servidor (Node-RED) — cópialo libremente:
const PLANT = env.get("PLANT") || "plant1"; // same logic in both plants
let data;
try {
data = (typeof msg.payload === "string") ? JSON.parse(msg.payload) : msg.payload;
} catch (e) {
msg.error = "invalid JSON: " + e.message;
return [null, msg]; // output 2: discards
}
// Minimum fields sent by the firmware
if (data.id === undefined) {
msg.error = "missing PLC id";
return [null, msg];
}
// Deduplication by id_msg (the PLC re-sends after reconnection / SD replay)
if (data.id_msg) {
const seen = context.get("seen") || {};
if (seen[data.id_msg]) {
msg.error = "duplicate: " + data.id_msg;
return [null, msg];
}
seen[data.id_msg] = Date.now();
// Purge: keep only the last hour of IDs so the map does not grow unbounded
const oneHourAgo = Date.now() - 3600 * 1000;
for (const k in seen) if (seen[k] < oneHourAgo) delete seen[k];
context.set("seen", seen);
}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é deduplicar en el servidor y no en el PLC?
El PLC favorece deliberadamente la entrega at-least-once — prefiere enviar dos veces antes que perder datos tras una reconexión. El concentrador mantiene el conjunto reciente de id_msg de forma centralizada, algo barato en el contexto de Node-RED e imposible de hacer entre reinicios en el dispositivo.
¿Debe cada planta tener su propio concentrador?
En este despliegue, sí — un broker más Node-RED por planta mantiene el flujo de datos durante fallos del enlace entre sedes. Los flujos son idénticos; una variable de entorno fija el nombre de la planta, y un sistema central puede consumir ambos.
¿Cómo llegan los datos a una base de datos desde aquí?
Añade un nodo de base de datos tras la salida de validación — los mensajes ya son JSON limpio, deduplicado y enriquecido. Los backups en fichero quedan como pista de auditoría y fuente de replay si la base de datos hubiera que reconstruirla algún día.