in ,

Photovoltaikanlage Daten visualisieren – Teil 1: Daten importieren

Einleitung

Da die Haussanierung so weit abgeschlossen ist, wurde noch über die Möglichkeit einer Photovoltaikanlage diskutiert.

Durch die 0% Umsatzsteuer („Nullsteuersatz“) für Photovoltaikanlagen sind diese im Moment nach wie vor durchaus interessant.

Die Begutachtung und Planung erfolgte durch den Energieversorger, ebenso die Beauftragung an die Montagefirma.

Also wurde für den Haushalt eine 8kWp Anlage über den lokalen Energieversorger bestellt.

Eckdaten:

  • 20 Solarmodule mit 440Wp (entsprechen 8,8 kWp)

kWp gibt an, welche Höchstleistung in Kilowatt (kW) eine Photovoltaikanlage erbringen kann.

  • Ausrichtung: Ost/West, jeweils 10 Solarmodule mit einer Dachschräge von ~ 30°

Vorteile (gegenüber Südausrichtung): mehr Eigenverbrauch, früher & länger Strom

Nachteile (gegenüber Südausrichtung): weniger Gesamtertrag

  • Wechselrichter mit 8kW

Eine Ost/West Ausrichtung wird nie das ganze Potential der Module ausnutzen können, daher reicht ein 8kWp Wechselrichter.

 

Beispiel eines sonnigen Tages im Juli (bis auf ein paar Wolken zwischendurch):

MPP1 ist die Ostseite, MPP2 die Westseite – beide liefern jeweils in Spitze ~ 3,4kW, gemeinsam dann knapp über 6kW.

  • Batteriespeicher

Es wurde sich gegen einen Batteriespeicher (11kWh) entschieden, da dieser nochmals 50% Mehrkosten verursacht hätte.

Durch die Ost/Westausrichtung sollte im Sommer eine gute Autarkie (Unabhängigkeit vom Stromnetz) gegeben sein, auch da der Haushalt tagsüber belebt ist.

Es wären Einsparungen für die Wärmepumpe im Herbst/Frühling möglich, aber vermutlich nicht in dem Ausmaß, dass sich die Investition rechnen würde.

Es wurden jedoch bei der Installation Vorkehrungen getroffen, damit man einen Batteriespeicher einfach nachrüsten kann, sollte sich nach einem Jahr zeigen, dass er vielleicht doch sinnvoll wäre.

Der Wechselrichter liefert die aktuellen Daten über Produktion, Eigenverbrauch etc. an die Herstellerwebseite, von dort können wir uns per Web oder App die Daten ansehen und die täglichen Daten auch exportieren.

Die Funktion werden wir nutzen, um unsere Daten aufzubereiten und entsprechend zu Visualisieren.

Was ist geplant?

  • Wir werden uns am Monatsersten die täglichen Daten des Vormonates als csv Datei exportieren, aufbereiten und in unsere MariaDB importieren
  • Die Daten übernehmen wir dann in unsere Doris Datenbank
  • Wir pflegen die Bezugs- und Einspeisetarife in eine Tabelle ein, um eine Übersicht über die Stromkosten/Einsparungen zu erstellen
  • Zusätzlich erstellen wir noch eine Tabelle für die astronomischen Jahreszeiten

die astronomischen Jahreszeiten haben keinen fixen Beginn oder Ende im Vergleich zu den meteorologischen Jahreszeiten

  • Erstellen einer (oder mehrerer) Views und Erstellen von Charts und Dashboards in Superset

 

Aufbau der csv Exports

Unsere exportierten csv Dateien beinhalten

  • Datum (Format [dd.MM.yyyy])
  • Gesamt Erzeugung (in Wh mit 4 Nachkommastellen)
  • Gesamt Verbrauch (in Wh mit 4 Nachkommastellen)
  • Eigenverbrauch (in Wh mit 4 Nachkommastellen)
  • Energie ins Netz eingespeist (in Wh mit 4 Nachkommastellen)
  • Energie vom Netz bezogen (in Wh mit 4 Nachkommastellen)

 

Export und aufbereiten der Wechselrichter Daten

Die Daten exportieren wir uns über die Website – Zugangsdaten haben wir bei der Installation der PV-Anlage erhalten.

Wir erhalten ein csv mit folgenden Daten:

Diese Daten bereiten wir jetzt noch bisschen auf, um uns den Import in unsere MariaDB zu erleichtern:

  • Ersetzen der Trennzeichen „,“ durch „;“
    sed -i ’s/,/;/g‘ PV-Anlage_01092024_30092024.csv
  • Datum ins Format [YYYY-MM-DD] bringen und Überschriften entfernen
    awk -F‘;‘ ‚{ $1 = substr($1,7,4)“-„substr($1,4,2)“-„substr($1,1,2); print }‘ OFS=‘;‘ PV-Anlage_01092024_30092024.csv |tail -n +3 > pv_anlage.csv

Unser csv pv_anlage.csv sieht jetzt folgendermaßen aus und ist bereit für den Import:

Anlegen der MariaDB Tabellen

Unsere Tabelle für die PV-Anlagen Daten legen wir entsprechend dem Aufbau der Exports an:

CREATE TABLE bme280.pv_anlage
(
Datum_und_Uhrzeit DATE NULL,
Gesamt_Erzeugung DECIMAL(10,4) NULL,
Gesamt_Verbrauch DECIMAL(10,4) NULL,
Eigenverbrauch DECIMAL(10,4) NULL,
Energie_ins_Netz_eingespeist DECIMAL(10,4) NULL,
Energie_vom_Netz_bezogen DECIMAL(10,4) NULL,
PRIMARY KEY (Datum_und_Uhrzeit)
);

Für unsere Stromtarife legen wir uns die Tabelle pv_anlage_stromtarife an:

CREATE TABLE bme280.pv_anlage_stromtarife
(
Tarif VARCHAR(20) NULL,
Datum_Von DATE NULL,
Datum_Bis DATE NULL,
Preis DECIMAL(10,6) NULL,
EVN DECIMAL(10,6) NULL,
Netznutzungsentgelt DECIMAL(10,6) NULL,
Netzverlustentgelt DECIMAL(10,6) NULL,
Elektrizitaetsabgabe DECIMAL(10,6) NULL,
PRIMARY KEY (Tarif, Datum_Von, Datum_Bis)
);

Für die Jahreszeiten legen wir die Tabelle jahreszeiten an:

CREATE TABLE bme280.jahreszeiten
(
Jahreszeit VARCHAR(20) NULL,
Beginn DATE NULL,
Ende DATE NULL,
PRIMARY KEY (Jahreszeit, Beginn, Ende)
);

Import der PV-Anlagen csv Dateien

Unsere csv Datei importieren wir mit dem Befehl:

  • mysqlimport –lines-terminated-by=’\n‘ –fields-terminated-by=‘;‘ –verbose –local -h192.168.42.10 -ubme280 -pXXXXXX bme280 pv_anlage.csv

Die Daten in der Tabelle überprüfen wir jetzt noch mit:

  • mariadb -h192.168.42.10 -ubme280 -pXXXXXX -Dbme280
  • select * from pv_anlage where Datum_und_Uhrzeit like ‚2024-09-0%‘;

Der Import sieht korrekt aus, also können wir weitermachen

Einfügen der Stromtarife

Die Tarife und Abgaben können wir bei unserem Energieversorger bzw. Stromverteilnetzbetreiber raussuchen.

Einfügen können wir die Daten mit den Inserts (Beispiele):

  • insert into bme280.pv_anlage_stromtarife
    values
    (‚Bezugstarif‘,’2024-09-01′,’2025-08-31′, 0.256116, 0.176280, 0.069240, 0.009396, 0.001200);
  • insert into bme280.pv_anlage_stromtarife
    values
    (‚Einspeisetarif‘,’2024-09-01′,’2024-09-30′,0.0472, NULL,NULL,NULL,NULL);

Wenn wir das erledigt haben, ist unsere Tarife Tabelle schon gut befüllt:

Die Einspeisetarife ändern sich monatlich, die Bezugstarife 1x jährlich, da es sich hier um Tarife mit 12 Monaten Preisgarantie (und Bindung) handelt.

 

Einfügen der Jahreszeiten

Da die astronomischen Jahreszeiten keinen fixen Beginn oder Ende haben, werden wir die Daten über eine Webseite bis ins Jahr 2099 erstellen lassen.

Die Ergebnisse bereiten wir noch weiter auf. Für die Sortierung in Superset fügen wir bei den Jahreszeiten noch „01-“ bis „04-“ an.

Importiert werden die Daten in unsere Tabelle mit:

  • mysqlimport –lines-terminated-by=’\n‘ –fields-terminated-by=‘;‘ –verbose –local -h192.168.42.10 -ubme280 -pXXXXXX bme280 jahreszeiten

Meteorologischen Jahreszeiten haben fixen Daten, diese können wir uns beim Erstellen der View ermitteln:

  • Frühling: 1. März–31. Mai
  • Sommer: 1. Juni–31. August
  • Herbst: 1. September–30. November
  • Winter: 1. Dezember–28./ 29. Februar

 

Anlegen der DorisDB Tabellen

Da wir unsere MariaDB Tabellen fertig und befüllt habe, legen wir unsere DorisDB Tabellen analog zu den MariaDB Tabellen an, um die Daten einfach einfügen zu können:

  • pv_anlage
CREATE TABLE bme280.pv_anlage (
    Datum_und_Uhrzeit DATE NULL,
    Gesamt_Erzeugung DECIMAL(10,4) NULL,
    Gesamt_Verbrauch DECIMAL(10,4) NULL,
    Eigenverbrauch DECIMAL(10,4) NULL,
    Energie_ins_Netz_eingespeist DECIMAL(10,4) NULL,
    Energie_vom_Netz_bezogen DECIMAL(10,4) NULL,
    )
UNIQUE KEY (Datum_und_Uhrzeit)
DISTRIBUTED BY HASH(Datum_und_Uhrzeit) BUCKETS 1
PROPERTIES("replication_num" = "1");
  • pv_anlage_stromtarife
CREATE TABLE bme280.pv_anlage_stromtarife (
    Tarif VARCHAR(20) NULL,
    Datum_Von DATE NULL,
    Datum_Bis DATE NULL,
    Preis DECIMAL(10,6) NULL,
    EVN DECIMAL(10,6) NULL,
    Netznutzungsentgelt DECIMAL(10,6) NULL,
    Netzverlustentgelt DECIMAL(10,6) NULL,
    Elektrizitaetsabgabe DECIMAL(10,6) NULL,
    )
UNIQUE KEY (Tarif, Datum_Von, Datum_Bis)
DISTRIBUTED BY HASH(Tarif, Datum_Von, Datum_Bis) BUCKETS 1
PROPERTIES("replication_num" = "1");

  • jahreszeiten
CREATE TABLE bme280.jahreszeiten
(
Jahreszeit VARCHAR(20) NULL,
Beginn DATE NULL,
Ende DATE NULL
)
UNIQUE KEY (Jahreszeit, Beginn, Ende)
DISTRIBUTED BY HASH(Jahreszeit, Beginn, Ende) BUCKETS 1
PROPERTIES("replication_num" = "1");

Übernehmen der Daten von MariaDB in die DorisDB

Also root verbinden wir uns auf unsere DorisDB und refreshen unseren MariaDB Catalog – sonst sehen wir die neuen Tabellen nicht:

  • mysql -h pi5b -P 9030 -uroot
    REFRESH CATALOG asusn100_mysql;

Nun können wir unsere Daten über die Befehlszeile übernehmen:

  • PV-Anlagen Daten:

mysql -h pi5b -P 9030 -ubme280 -pXXXXXX -e ‚insert into bme280.pv_anlage select * from asusn100_mysql.bme280.pv_anlage where Datum_und_Uhrzeit > (select coalesce(max(Datum_und_Uhrzeit),“1900-01-01″) from bme280.pv_anlage);‘

  • Stromtarife:

mysql -h pi5b -P 9030 -ubme280 -pXXXXXX -e ‚insert into bme280.pv_anlage_stromtarife select * from asusn100_mysql.bme280.pv_anlage_stromtarife where Tarif=“Einspeisetarif“ and Datum_Von > (select coalesce(max(Datum_Von),“1900-01-01″) from bme280.pv_anlage_stromtarife where Tarif=“Einspeisetarif“);‘

mysql -h pi5b -P 9030 -ubme280 -pXXXXXX -e ‚insert into bme280.pv_anlage_stromtarife select * from asusn100_mysql.bme280.pv_anlage_stromtarife where Tarif=“Bezugstarif“ and Datum_Von > (select coalesce(max(Datum_Von),“1900-01-01″) from bme280.pv_anlage_stromtarife where Tarif=“Bezugstarif“);‘

  • Jahreszeiten:

mysql -h pi5b -P 9030 -ubme280 -pbme280 -e ‚insert into bme280.jahreszeiten select * from asusn100_mysql.bme280.jahreszeiten;‘

Diese Befehle können wir am Monatsersten per cronjob ausführen lassen, um die neu in die MariaDB eingefügten Daten automatisch in unsere DorisDB einzufügen.

Anlegen der View

Unsere View erstellen wir in unserer DorisDB, da wir über Superset auf diese zugreifen werden.

Dazu verknüpfen wir unsere PV-Anlagen Tabelle mit den Tabellen der Stromtarife und Jahreszeiten.

Die Wh Werte rechnen wir auf kWh um. Zusätzlich berechnen wir uns z.B. Autarkie, kWh_pro_kWp, etc.

Mit den Stromtarifen können wir uns für jeden Tag die Kosten/Ersparnisse berechnen.

Für Sortierungen in Superset fügen wir beim Monat noch „01-“ bis „12-“ als extra Spalte an.

select
Datum_und_Uhrzeit as Datum,
cast(YEAR(Datum_und_Uhrzeit) as varchar(4)) as Jahr,
cast(case MONTHNAME(Datum_und_Uhrzeit)
when ‚January‘ then ‚Jänner‘
when ‚February‘ then ‚Februar‘
when ‚March‘ then ‚März‘
when ‚April‘ then ‚April‘
when ‚May‘ then ‚Mai‘
when ‚June‘ then ‚Juni‘
when ‚July‘ then ‚Juli‘
when ‚August‘ then ‚August‘
when ‚September‘ then ‚September‘
when ‚October‘ then ‚Oktober‘
when ‚November‘ then ‚November‘
when ‚December‘ then ‚Dezember‘
Else ‚Fehler‘
end as varchar(10)) as Monat,
cast(case MONTHNAME(Datum_und_Uhrzeit)
when ‚January‘ then ’01-Jänner‘
when ‚February‘ then ’02-Februar‘
when ‚March‘ then ’03-März‘
when ‚April‘ then ’04-April‘
when ‚May‘ then ’05-Mai‘
when ‚June‘ then ’06-Juni‘
when ‚July‘ then ’07-Juli‘
when ‚August‘ then ’08-August‘
when ‚September‘ then ’09-September‘
when ‚October‘ then ’10-Oktober‘
when ‚November‘ then ’11-November‘
when ‚December‘ then ’12-Dezember‘
Else ‚Fehler‘
end as varchar(13)) as Monat_Sort,
— Astronomische Jahreszeiten —
j.Jahreszeit as Jahreszeit_Astronomisch,
— Meteorologische Jahreszeiten —
case
when date_format(Datum_und_Uhrzeit,’%m-%d‘) between ’03-01′ and ’05-31′ then ’01-Frühling‘
when date_format(Datum_und_Uhrzeit,’%m-%d‘) between ’06-01′ and ’08-31′ then ’02-Sommer‘
when date_format(Datum_und_Uhrzeit,’%m-%d‘) between ’09-01′ and ’11-30′ then ’03-Herbst‘
when date_format(Datum_und_Uhrzeit,’%m-%d‘) between ’12-01′ and ’02-29′ then ’04-Winter‘
end as Jahreszeit_Meteorologisch,
— PV Daten
round(Gesamt_Erzeugung/1000,2) as Produktion,
round(Gesamt_Verbrauch/1000,2) as Gesamtverbrauch,
round(Eigenverbrauch/1000,2) as Eigenverbrauch,
round(Energie_ins_Netz_eingespeist/1000,2) as Netzeinspeisung,
round(Energie_vom_Netz_bezogen/1000,2) as Netzbezug,
round(Eigenverbrauch/Gesamt_Verbrauch*100,2) as Autarkie,
round(Eigenverbrauch/Gesamt_Erzeugung*100,2) as Eigenverbrauchsquote,
round(Energie_ins_Netz_eingespeist/Gesamt_Erzeugung*100,2) as Einspeisungsquote,
round(Gesamt_Erzeugung/8000,2) as kWh_pro_kWp,
round((Gesamt_Erzeugung/8000)/8.0*100,2) as Auslastung_pro_kWp,
–Stromkosten/ersparnisse
round(Eigenverbrauch/1000*b.Preis,6) as Stromkostenersparnis,
round(Energie_vom_Netz_bezogen/1000*b.Preis,6) as Strombezugskosten,
round(Energie_ins_Netz_eingespeist/1000*e.Preis,6) as Einspeisevergütung
from pv_anlage p
left outer join jahreszeiten j on p.Datum_und_Uhrzeit between j.Beginn and j.Ende
left outer join bme280.pv_anlage_stromtarife b on p.Datum_und_Uhrzeit between b.Datum_Von and b.Datum_Bis and b.Tarif=’Bezugstarif‘
left outer join bme280.pv_anlage_stromtarife e on p.Datum_und_Uhrzeit between e.Datum_Von and e.Datum_Bis and e.Tarif=’Einspeisetarif‘;

Beispieldaten aus unserer View (wurden in Excel importiert zur besseren Darstellung)

Im nächsten Blog-Artikel gibt es die Fortsetzung mit der Datendarstellung mit Superset.

SSIS-Ablauf mit SQL-Server-Agent automatisieren

Photovoltaikanlage Daten visualisieren – Teil 2: Superset