Ir al contenido

← Todas las funcionalidades

Monitorización geotécnica de taludServidor (Node-RED)HTTPHMI / Dashboard

Un dashboard multiestación con gauges y LEDs en Node-RED

Un dashboard de Node-RED puede sustituir a un pequeño SCADA cuando lo que necesitas es visibilidad, no control. Este ejemplo representa cuatro estaciones ESP32 PLC 14 Ethernet remotas en una sola pantalla: un gauge por estación con el nivel de alerta 0-4, widgets de texto para cada canal de entrada y un LED por estación que se pone rojo cuando dejan de llegar datos. Replica un despliegue real de monitorización de talud que ejecuta 60 widgets ui-text, 31 gauges y 4 LEDs en una Raspberry Pi.

Un nodo function, tres tipos de widget

La función "preparar dashboard" tiene tres salidas. La salida 1 alimenta el ui-gauge con el nivel de alerta numérico; la salida 2 envía un array de mensajes, uno por canal de entrada, de modo que un solo nodo refresca todos los widgets ui-text a la vez; la salida 3 gobierna el ui-led con msg.color. Topics como estacion/31/gauge mantienen el enrutado explícito.

El LED que vigila al vigilante

El LED de cada estación es verde, amarillo o rojo según el nivel de alerta — pero también comprueba el timestamp de la última lectura guardada en el contexto de flujo. Más de tres minutos de silencio y el LED se pone rojo sin importar el último nivel conocido. Un dashboard congelado que sigue mostrando verde es el modo de fallo más peligroso de cualquier HMI.

Escalar pestañas, no flujos

Cada estación tiene su propia pestaña del dashboard, más una pestaña de resumen que muestra el peor nivel de toda la flota. Como los widgets filtran por topic, añadir una estación consiste en clonar una pestaña y añadir una entrada a la lista de polling — el código de la función no se toca.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Servidor (Node-RED) — cópialo libremente:

const station = msg.station;
const level   = msg.alert ?? 0;
const inputs  = msg.inputs || {};
const ts      = msg.ts || new Date().toISOString();

// --- Output 1: alert level gauge (range 0-4) --------------------------
const msgGauge = {
    topic: `station/${station}/gauge`,
    payload: level
};

// --- Output 2: one ui-text per input + summary text --------------------
// node.send() accepts arrays: every element of the inner array goes out
// the same output, so we feed several ui-text widgets at once.
const textMsgs = Object.keys(inputs).map(channel => ({
    topic: `station/${station}/text/${channel}`,
    payload: inputs[channel] ? "ACTIVE" : "idle"
}));

textMsgs.push({
    topic: `station/${station}/text/summary`,
    payload: `Level ${level} — ${ts.substring(11, 19)}`
});

// --- Output 3: station status LED ---------------------------------------
// Green = normal (0-1), yellow = attention (2-3), red = critical (4).
// If the station has not reported in >3 min, the LED blinks red.
const COLORS = ["green", "green", "yellow", "yellow", "red"];

const states = flow.get("states") || {};

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

Preguntas frecuentes

¿Qué paquete de dashboard usa este ejemplo?

node-red-dashboard para gauges y texto, más node-red-contrib-ui-led para los LEDs de estado. Ambos se instalan desde el gestor de paleta en un clic.

¿Aguanta una Raspberry Pi más de 90 widgets?

Sí. Los widgets solo se actualizan cuando llega un mensaje, así que cuatro estaciones reportando cada 60 segundos es una carga muy ligera. El navegador que renderiza el dashboard trabaja más que la Pi que lo sirve.

¿Cómo muestro que una estación está offline y no simplemente en calma?

Guarda el timestamp de cada lectura en el contexto de flujo y compáralo con el reloj al refrescar. En este ejemplo el LED se pone rojo y el estado del nodo muestra SIN DATOS tras tres minutos sin reporte.

Funcionalidades relacionadas