Entrega de datos de sensores a una plataforma oficial por FTP
Un formato de fichero estricto, generado con seguridad
canal_001 a canal_169 y escribe una columna vacía para cualquier canal sin datos, de modo que la caída de un sensor nunca desplaza las columnas de los que sí reportaron. Los nombres de fichero incorporan la marca de tiempo completa, lo que hace cada entrega única y trazable.Doce líneas de ftplib
FTP(host), login, cwd y storbinary dentro de un try/finally que garantiza el quit(). Las credenciales son placeholders (FTP_USER, FTP_PASS) que en producción se cargan desde variables de entorno — nunca las dejes hardcodeadas en un script que vive en un repositorio.Los fallos dejan evidencia
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el Servidor (Node-RED) — cópialo libremente:
def read_readings(path):
"""Loads the JSON with the latest readings aggregated by Node-RED.
Expected format: {"channel_001": 12.34, "channel_002": -0.07, ...}
"""
try:
with open(path) as f:
return json.load(f)
except (OSError, ValueError) as e:
print(f"ERROR reading readings: {e}")
return {}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é FTP en lugar de una API REST?
Porque la interfaz la define la plataforma receptora, y en monitorización geotécnica el depósito de ficheros por FTP sigue siendo el estándar. Es un patrón con décadas de uso, amigable con los firewalls y trivial de auditar desde el propio listado de ficheros.
¿De dónde salen los datos de los canales?
Node-RED consulta cada estación PLC por HTTP, fusiona las lecturas en un fichero JSON en disco y lanza este script con un nodo exec en cada intervalo de medida. El script y los flujos permanecen desacoplados.
¿Cómo deben gestionarse las credenciales en producción?
Mantén FTP_USER y FTP_PASS fuera del código. Cárgalas desde variables de entorno o desde un fichero de configuración con permisos restringidos fuera del repositorio, y rótalas si el equipo lo mantienen terceros.