Mezclado industrial (HMI táctil)TouchBerry PiFicherosDatalogging
Exportación a USB del histórico de activaciones con un toque
Los departamentos de calidad siguen adorando el pendrive. Este ejemplo añade un botón de exportación a USB de un toque a un dashboard de Node-RED en una TouchBerry Pi: un nodo exec lista /media/pi para detectar una unidad montada, una función construye un comando de copia con fecha para el log CSV de activaciones, y las notificaciones en pantalla confirman el éxito o explican el fallo. Procede de un despliegue real en una línea de mezclado industrial, donde los supervisores recogen el histórico sin tocar la red.
Detectar el pendrive con un nodo exec
Raspberry Pi OS automonta las unidades USB bajo /media/pi/
Una copia con fecha más sync
La función construye el comando de shell completo para un segundo nodo exec: cp del CSV a log_activaciones_YYYY-MM-DD.csv en la unidad, seguido de sync. Ese sync importa — vacía la caché de escritura para que el fichero esté de verdad en el pendrive antes de que el operario lo saque dos segundos después. El punto de montaje va entre comillas por si la etiqueta de la unidad contiene espacios.
Dile al operario qué ha pasado
cp guarda silencio cuando tiene éxito, así que el flujo habla por él: la rama de stdout levanta una notificación verde con la ruta de destino y un claro "ya puedes retirar la unidad", mientras que la rama de stderr muestra el mensaje de error en bruto (pendrive de solo lectura, sin espacio en el dispositivo) para un diagnóstico rápido. El fichero original queda intacto en el panel, donde sigue alimentando la tabla de histórico en vivo.
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el TouchBerry Pi — cópialo libremente:
const SOURCE = "/home/pi/logs/log_activaciones.csv";
const devices = (msg.payload || "")
.split("\n")
.map(d => d.trim())
.filter(d => d.length > 0);
if (devices.length === 0) {
msg.payload = "Insert a USB drive and try again";
return [null, msg];
}
// Use the first mounted device; quotes in case the USB
// label contains spaces.
const destDir = "/media/pi/" + devices[0];
// Dated file name: log_activaciones_2026-06-12.csv
const today = new Date().toISOString().slice(0, 10);
const destination = destDir + "/log_activaciones_" + today + ".csv";
// 'sync' guarantees the data is written before the operator
// pulls out the USB stick.
msg.payload = `cp ${SOURCE} "${destination}" && sync`;
msg.destination = destination; // reused by the notification
return [msg, null];
// ============================================================
// function 2: notifyOk (stdout of exec 2)
// ------------------------------------------------------------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 detecta Node-RED una unidad USB en Raspberry Pi?
La forma más simple es un nodo exec ejecutando "ls /media/pi", ya que Raspberry Pi OS automonta ahí las unidades. Cada línea de la salida es un dispositivo montado.
¿Puede el operario corromper el pendrive si lo saca demasiado pronto?
Añadir "&& sync" al comando de copia vacía los búferes antes de que aparezca la notificación de éxito, así que retirar la unidad tras el mensaje verde es seguro.
¿Y si hay dos pendrives conectados?
El ejemplo usa el primer punto de montaje devuelto. También puedes presentar la lista en un desplegable del dashboard y dejar que el operario elija el destino.