Almacenar y mostrar datos en Node-RED Dashboard con Raspberry PLC

Usando el nodo flogger para almacenar datos e importarlos en un gráfico
15 de junio de 2026 por
Almacenar y mostrar datos en Node-RED Dashboard con Raspberry PLC
Boot & Work Corp. S.L, Bernat Brunet Pedra

Este artículo muestra cómo registrar datos de sensores en un archivo del Raspberry PLC con Node-RED y el nodo flogger, para luego leer ese archivo y mostrar los datos como gráfico en el Dashboard de Node-RED. Esta estrategia de dos pasos permite capturar datos durante un período de tiempo y consultarlos más tarde sin necesidad de una base de datos remota.

Requisitos

Almacenar datos con el nodo flogger

Instala el nodo flogger desde el menú Gestionar Paleta de Node-RED, o desde la terminal:

npm install node-red-contrib-flogger

Después de instalarlo, arrastra un nodo flogger al flujo. En la configuración del nodo, escribe la ruta absoluta del archivo de log en el campo Log Config y el nombre del archivo en el campo Logfile. En la sección de log selecciona "Select object > msg.payload". Cada valor entrante se escribirá en el archivo con este formato:

{"time":"2022/09/09 08:52:19","level":"INFO","var":"msg.payload","message":24}

Coloca antes del nodo flogger el nodo que produce el valor que quieres registrar (un nodo de pin, un nodo function o similar). En el ejemplo siguiente, un nodo function incrementa un contador en 1 cada segundo:

[{"id":"3a929739eb41cb12","type":"function","z":"9f1476fcd060809d","name":"","func":"var num = flow.get('num') | 0;\nmsg.payload = num;\nflow.set('num', num + 1);\nreturn msg;","outputs":1,"noerr":0,"initialize":"flow.set('num', 0);\n","finalize":"","libs":[],"x":600,"y":240,"wires":[[]]},{"id":"f4170ac623623680","type":"inject","z":"9f1476fcd060809d","name":"","props":[{"p":"payload"}],"repeat":"1","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":450,"y":240,"wires":[["3a929739eb41cb12"]]}]

Despliega el flujo y déjalo funcionar unos minutos para recopilar datos. Deténlo cuando tengas suficientes filas en el archivo.

Leer el archivo y construir el gráfico

Para mostrar los datos registrados, crea un segundo flujo con los siguientes nodos en orden: inject > read file > function (parseo) > join > function (formato) > chart.

Configura el nodo read file con la ruta absoluta del archivo de log y establece "Output" en "a msg per line".

Añade un nodo function a continuación para parsear cada línea JSON y extraer x (tiempo) e y (valor):

try {
    msg = JSON.parse(msg.payload);
    msg.payload = {x: msg.time, y: msg.message};
    return msg;
} catch (err) {
    return msg;
}

Añade un nodo join configurado para construir un array con todos los mensajes entrantes (modo: manual, construir: array, cuenta: dejar en blanco para recoger todos).

Añade un segundo nodo function para dar formato al array para el nodo chart:

msg.payload = [{
    "series": ["Counter"],
    "data": [msg.payload],
    "labels": [""]
}];
return msg;

Por último, conecta un nodo chart de node-red-dashboard y confíguralo según tus preferencias. Despliega el flujo y activa el nodo inject. El Dashboard mostrará los valores registrados como gráfico de línea.

El JSON del flujo completo listo para importar:

[{"id":"9778be14.2a9f4","type":"file in","z":"9f1476fcd060809d","name":"Read file","filename":"path/to/file","filenameType":"str","format":"lines","chunk":false,"sendError":false,"allProps":false,"x":360,"y":380,"wires":[["15397051.3f513"]]},{"id":"15397051.3f513","type":"function","z":"9f1476fcd060809d","name":"","func":"try {\n   msg = JSON.parse(msg.payload);\n   msg.payload = { x: msg.time, y: msg.message };\n   return msg;\n} catch (err) {\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":380,"wires":[["b8953dea.692a5"]]},{"id":"b8953dea.692a5","type":"join","z":"9f1476fcd060809d","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"x":670,"y":380,"wires":[["37a6c7e0.ee0df8"]]},{"id":"37a6c7e0.ee0df8","type":"function","z":"9f1476fcd060809d","name":"","func":"msg.payload = [{\n  \"series\": [\"Counter\"],\n  \"data\": [msg.payload],\n  \"labels\": [\"\"]\n}];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":380,"wires":[["e0bb31c9.d2379"]]},{"id":"e0bb31c9.d2379","type":"ui_chart","z":"9f1476fcd060809d","name":"","group":"d4c392ad32a37c94","order":1,"width":0,"height":0,"label":"Chart","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"40","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":950,"y":380,"wires":[[]]},{"id":"e4243650d81af7d5","type":"inject","z":"9f1476fcd060809d","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":380,"wires":[["9778be14.2a9f4"]]},{"id":"d4c392ad32a37c94","type":"ui_group","name":"Chart","tab":"bce747bd77dec32e","order":1,"disp":true,"width":19,"collapse":false},{"id":"bce747bd77dec32e","type":"ui_tab","name":"Logs","icon":"dashboard","disabled":false,"hidden":false}]

Buscar en nuestro blog

Almacenar y mostrar datos en Node-RED Dashboard con Raspberry PLC
Boot & Work Corp. S.L, Bernat Brunet Pedra 15 de junio de 2026
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs