Ir al contenido

← Todas las funcionalidades

Mezclado industrial (HMI táctil)TouchBerry PiFicherosDatalogging

Registro CSV de solo anexado con tabla de histórico que se refresca sola

A veces la base de datos correcta es un fichero de texto. Este ejemplo registra cada activación de la máquina — fecha, usuario, motivo, comentario — en un fichero CSV de solo anexado en una TouchBerry Pi, y un nodo watch refresca una tabla del dashboard en cuanto el fichero cambia. El mismo fichero se exporta después a USB para los registros de calidad. Reproduce un despliegue real en una línea de mezclado industrial, donde esta traza de auditoría responde a "quién arrancó la máquina, cuándo y por qué".

Una línea por activación

Un nodo function formatea la marca de tiempo, toma el usuario de msg.topic y el motivo y el comentario del formulario de activación, y emite una única línea CSV terminada en \n. El nodo file trabaja en modo append con su propio salto de línea desactivado, de modo que la función controla el formato por completo. Los campos de texto libre se sanean antes — las comas se convierten en puntos y comas y los saltos de línea en espacios — para que el fichero siga siendo parseable para siempre.

El nodo watch cierra el círculo

En lugar de empujar filas a la tabla directamente, el flujo vigila el propio fichero CSV. Cualquier cambio — una activación desde el dashboard, incluso una edición manual por SSH — dispara una relectura, y una función parser convierte el fichero completo en el array de objetos que espera ui-table, de más reciente a más antiguo y limitado a 200 filas. El fichero es la única fuente de verdad; la tabla es solo una vista de él.

Por qué un CSV y no una base de datos

Para unas decenas de eventos al día, un CSV plano gana a una base de datos en todos los ejes que aquí importan: cero infraestructura que instalar o mantener, legible por humanos por SSH, exportable a un pendrive de forma trivial y abrible en Excel por el departamento de calidad. Cuando el proyecto necesitó además almacenamiento central, los mismos eventos se reenviaron por MQTT a SQL Server — sin tocar este log local.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el TouchBerry Pi — cópialo libremente:

const d = new Date();
const pad = n => String(n).padStart(2, "0");
const formattedDate =
    `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
    `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;

// Sanitize: the separator is the comma, so remove it from free-text fields
const sanitize = t => String(t || "").replace(/,/g, ";").replace(/\r?\n/g, " ");
const reason  = sanitize(msg.payload.reason);
const comment = sanitize(msg.payload.comment);

msg.payload = formattedDate + "," + msg.topic + "," + reason + "," + comment + "\n";
msg.filename = "/home/pi/logs/log_activaciones.csv";  // file node in append mode
return msg;


// ============================================================
// function 2: csvToTable
// ------------------------------------------------------------
// Receives the full CSV (string) read by the read-file node and
// converts it into the array of objects expected by ui-table.
// The most recent activations are shown first.
// ============================================================
const MAX_ROWS = 200;                  // do not overload the HMI table

const lines = (msg.payload || "")
    .split("\n")
    .map(l => l.trim())
    .filter(l => l.length > 0);

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

Preguntas frecuentes

¿Cómo muestro un fichero CSV como tabla en el dashboard de Node-RED?

Lee el fichero con un nodo read-file, separa las líneas y mapéalas a objetos cuyas claves sean los nombres de columna, y pasa ese array a un nodo ui-table.

¿Se actualizará la tabla si otro proceso modifica el fichero?

Sí. El nodo watch se dispara con cualquier modificación del fichero, sin importar quién lo escribió, así que la tabla siempre refleja el fichero en disco.

¿Crece el fichero CSV para siempre?

En este despliegue el volumen es pequeño, así que sí, por diseño. Añade una rotación mensual de fichero en la función del nombre si esperas tasas de eventos altas.

Funcionalidades relacionadas