Arbeitsdetail

API Solar — Backend für Dateningestion, Normalisierung und Aggregation von Photovoltaikdaten

Diese Backend-API verwaltet reale Daten einer Photovoltaikanlage in Produktion.

Ihre Funktion ist es, verstreute Informationen aus mehreren externen Quellen zu zentralisieren, heterogene Formate zu normalisieren und konsolidierte Energiedaten bereitzustellen, die von Frontend-Anwendungen konsumiert werden können.

Das System ist durch Authentifizierung, Rollen und Berechtigungen geschützt, beinhaltet Mechanismen für Datensicherungen und ist für den Betrieb mit großen Mengen realer Daten ausgelegt.

Das Problem

Die Daten einer Photovoltaikanlage sind nicht zentralisiert:

  • Stromanbieter (Iberdrola)
  • Netzbetreiber (REE)
  • Wechselrichter der Anlage

Jede Quelle:

  • liefert unterschiedliche CSV-Dateien,
  • mit unterschiedlichen Strukturen, Feldern und Formaten,
  • und ohne gemeinsames Datenmodell.

Außerdem:

  • einige CSVs enthalten Messungen alle 5 Minuten, andere liefern stündliche Aggregationen,
  • und das Frontend benötigt konsistente, vergleichbare Daten, unabhängig von der Quelle.

Die Lösung

Ich habe eine API entworfen, die als Integrations-, Validierungs- und Normalisierungsschicht für Energiedaten fungiert und das Frontend von der Komplexität und Heterogenität der Datenquellen isoliert.

Erweiterte CSV-Ingestion

  • Unterstützt 4 verschiedene CSV-Formate von unterschiedlichen Anbietern.
  • Identifiziert automatisch den Dateityp und die Struktur.
  • Transformiert jede Quelle in ein vereinheitlichtes Datenmodell.

📊 Im realen Einsatz:

  • Es wurden mehr als 1.000 CSV-Dateien verarbeitet
  • Aus mehreren Quellen und Formaten
  • Mit vollständigen, erfolgreichen Imports in die Datenbank.

Normalisierung und Aggregation

Die Daten werden immer als stündliche Daten gelesen, transformiert und persistiert, unabhängig von Granularität oder ursprünglicher CSV-Struktur.

Beim Laden:

  • wird die erhaltene Datei analysiert,
  • redundante Informationen des CSV-Anbieters gefiltert,
  • und die stündliche Datenbasis konsolidiert, die in der Datenbank persistiert wird.

Diese Transformationslogik ist in der Datei-Upload-Schicht im Ordner uploads implementiert und nutzt die Python-Fähigkeiten zur Verarbeitung von Dateien und Daten.

Aus der persistierten Stundendatenbasis bietet die API verschiedene Ansichten je nach Abfrage:

  • Tägliche Daten

    Man fordert Jahr–Monat–Tag an und die API liefert 24 stündliche Werte.

  • Monatliche Daten

    Man fordert Jahr–Monat an und die API liefert 28, 29, 30 oder 31 tägliche Werte, je nach Monat und Jahr.

  • Jährliche Daten

    Man fordert Jahr an und die API liefert 12 monatliche Werte.

Die API und SQL-Views sind darauf vorbereitet, unterschiedlich auf dieselbe Abfrage zu reagieren, wie bei Monatsabfragen, wo die Anzahl der Ergebnisse dynamisch variiert.

Verwaltete Metriken

  • Verbrauch der Anlage
  • Photovoltaikproduktion
  • Energiebilanz mit dem Netz:
    • gekaufte Energie
    • exportierte Energie

Die Architektur ist für eine Batterie vorbereitet, auch wenn diese Anlage keine hat:

  • Energiebilanz mit Batterie:
    • gespeicherte Energie
    • verbrauchte Energie

Performance

  • es werden SQL-Views verwendet, die häufige Aggregationen beschleunigen,
  • konsolidierte Daten werden persistiert und vermeiden wiederholte Berechnungen,
  • die Datenbank fungiert als einzige Quelle der Wahrheit auf Basis der Stundendaten.

Sicherheit, Rollen und Zugriffskontrolle

Die API ist vollständig geschützt:

  • Authentifizierung über Login und JWT
  • Rollen- und Berechtigungsverwaltung

Nur Benutzer mit Administratorrolle dürfen:

  • die Datenbank verwalten
  • Daten laden oder wiederherstellen
  • sensible Operationen ausführen

Die Sicherheitslogik ist klar von der Geschäftslogik getrennt.

Backups und Datensicherung

Das System enthält explizite Mechanismen zum Schutz von Daten:

  • Export der Datenbank in JSON-Dateien
  • Import von JSON-Dateien für Wiederherstellung oder Migration
  • Diese Dateien dienen als Sicherungs-Kopien der verarbeiteten Informationen

Das ermöglicht:

  • historische Daten zu schützen,
  • Migrationen zu erleichtern,
  • und operative Risiken zu reduzieren.

Architektur und technischer Stack

  • Sprache: Python
  • Framework: Flask
  • Datenbank: MySQL
  • ORM: SQLAlchemy
  • Migrationen: Alembic / Flask-Migrate
  • Authentifizierung: Flask-JWT-Extended
  • Testing: pytest, pytest-mock

Abhängigkeiten werden via requirements.txt verwaltet.

Betrieb und Deployment

  • API deployed auf PythonAnywhere
  • Script deploy.sh zur Automatisierung von Deployments nach dem Update des Repos
  • System für reale Produktion ausgelegt, nicht als Demo

🔗 API in Produktion

🔗 GitHub-Repository

Was dieses Projekt zeigt

Dieses Projekt zeigt meine Fähigkeit,:

  • Entwurf von Backend-APIs für reale Daten
  • Integration heterogener externer Quellen
  • Verarbeitung großer Informationsmengen
  • Implementierung von Sicherheit, Rollen und Zugriffskontrolle
  • Entwurf von Systemen, die wachsen und sich entwickeln
  • Betrieb und Wartung von Software in Produktion

Projektbilder

API-Status in Produktion
API-Status in Produktion
Repository und Backend-Struktur
Repository und Backend-Struktur
Deployment-Umgebung auf PythonAnywhere
Deployment-Umgebung auf PythonAnywhere