API Solar — Backend para ingesta, normalización y agregación de datos fotovoltaicos
Esta API backend gestiona datos reales de una instalación fotovoltaica en producción.
Su función es centralizar información dispersa en múltiples fuentes externas, normalizar formatos heterogéneos y ofrecer datos energéticos consolidados listos para consumo por aplicaciones frontend.
El sistema está protegido mediante autenticación, roles y permisos, incluye mecanismos de respaldo de datos y está diseñado para operar con grandes volúmenes de información real.
El problema
Los datos de una instalación fotovoltaica no están centralizados:
- Comercializadora eléctrica (Iberdrola)
- Operador del sistema eléctrico (REE)
- Inversor de la propia instalación
Cada fuente:
- ofrece archivos CSV distintos,
- con estructuras, campos y formatos diferentes,
- y sin un modelo común de datos.
Además:
- algunos CSV contienen lecturas cada 5 minutos, otros ofrecen agregaciones horarias,
- y el frontend necesita datos coherentes y comparables, independientemente del origen.
La solución
Diseñé una API que actúa como capa de integración, validación y normalización de datos energéticos, aislando al frontend de la complejidad y heterogeneidad de las fuentes de datos.
Ingesta avanzada de CSV
- Soporta 4 formatos diferentes de CSV procedentes de distintos proveedores.
- Identifica automáticamente el tipo de archivo y su estructura.
- Transforma cada origen a un modelo de datos unificado.
📊 En uso real:
- Se han procesado más de 1.000 archivos CSV
- Procedentes de múltiples orígenes y formatos
- Con cargas completas y satisfactorias en base de datos.
Normalización y agregación
Los datos se leen, transforman y persisten siempre como datos horarios, independientemente de la granularidad o estructura original del CSV.
Durante la carga:
- se analiza el archivo recibido,
- se filtra información redundante entregada por el proveedor del CSV,
- y se consolida el dato horario, que es el que se persiste en base de datos.
Esta lógica de transformación se implementa en la capa de carga de archivos, ubicada en la carpeta uploads, aprovechando las capacidades de Python para el tratamiento de ficheros y datos.
A partir del dato horario persistido, la API ofrece distintas vistas según la consulta realizada:
- Datos diarios
Se solicita año–mes–día y la API devuelve 24 valores horarios.
- Datos mensuales
Se solicita año–mes y la API devuelve 28, 29, 30 o 31 valores diarios, según el mes y el año.
- Datos anuales
Se solicita año y la API devuelve 12 valores mensuales.
La API y las vistas SQL están preparadas para responder de forma distinta a una misma consulta, como ocurre en las peticiones mensuales, donde el número de resultados varía dinámicamente.
Métricas gestionadas
- consumo de la instalación
- producción fotovoltaica
- balance energético con la red:
- energía comprada
- energía exportada
La arquitectura está preparada para gestionar batería, aunque esta instalación no la tenga implementada:
- balance energético con batería:
- energía almacenada
- energía consumida
Rendimiento
- se utilizan vistas SQL que aceleran agregaciones frecuentes,
- los datos consolidados se persisten, evitando cálculos repetidos,
- la base de datos actúa como fuente única de verdad a partir del dato horario.
Seguridad, roles y control de acceso
La API está completamente protegida:
- Autenticación mediante login y JWT
- Gestión de roles y permisos
Solo los usuarios con rol administrador pueden:
- gestionar la base de datos
- cargar o restaurar datos
- ejecutar operaciones sensibles
La lógica de seguridad está claramente separada de la lógica de negocio.
Copias de seguridad y salvaguarda de datos
El sistema incluye mecanismos explícitos de protección de datos:
- Exportación de la base de datos a archivos JSON
- Carga de archivos JSON para restauración o migración
- Estos archivos actúan como copias de seguridad de la información procesada
Esto permite:
- proteger datos históricos,
- facilitar migraciones,
- y reducir riesgos operativos.
Arquitectura y stack técnico
- Lenguaje: Python
- Framework: Flask
- Base de datos: MySQL
- ORM: SQLAlchemy
- Migraciones: Alembic / Flask-Migrate
- Autenticación: Flask-JWT-Extended
- Testing: pytest, pytest-mock
Dependencias gestionadas vía requirements.txt.
Operación y despliegue
- API desplegada en PythonAnywhere
- Script deploy.sh para automatizar despliegues tras actualizar el repositorio
- Sistema pensado para uso real en producción, no como demo
Qué demuestra este proyecto
Este proyecto demuestra mi capacidad para:
- Diseñar APIs backend orientadas a datos reales
- Integrar fuentes externas heterogéneas
- Procesar grandes volúmenes de información
- Implementar seguridad, roles y control de acceso
- Diseñar sistemas preparados para crecer y evolucionar
- Operar y mantener software en producción
Imágenes del proyecto



