Zur graphischen Darstellung eignet sich recht gut FHEM Tablet-UI. Darin kann sowohl der Ertrag, als auch die Ertragsprognose graphisch gegenüber gestellt werden.
Ein Fazit zu diesem „kleinen Projekt“ darf natürlich nicht fehlen.
- Motivation / Anlagenaufbau
- Feature Engineering - Parameterauswahl
- Datenerfassung / Übernahme
- Modell Auswahl und Training
- Graphische Darstellung mit FHEM Tablet-UI
Die Vorhersageergebnisse werden über stored Prcedures in die Datenbank geschrieben und zusätzlich über das MQTT-Protokoll an FHEM übertragen. In der Datenbank sind hierfür separate Datenfelder vorgesehen (BrightnessFc und EnergyHourFc). Somit können später bei Bedarf die Vorhersagewerte mit den historischen Ist-Werten verglichen werden.
Die Übergabe an FHEM per MQTT erfolgt, um die Ergebnisse graphisch in FHEM darstellen zu können. Hier die wesentlichen Sequenzen aus dem FHEM MQTT-Device:
Internals:
NAME du_EnergyFc
IODev mq_Server
TYPE MQTT2_DEVICE
READINGS:
2024-07-15 12:10:08 D0 46.498
2024-07-15 06:10:05 D0_H04 0
2024-07-15 06:10:05 D0_H05 0
2024-07-15 06:10:06 D0_H06 0.028
2024-07-15 06:10:06 D0_H07 0.267
2024-07-15 06:10:06 D0_H08 1.029
2024-07-15 06:10:06 D0_H09 2.209
2024-07-15 06:10:06 D0_H10 3.726
2024-07-15 06:10:06 D0_H11 4.681
2024-07-15 06:10:06 D0_H12 5.341
2024-07-15 12:10:08 D0_H13 5.764
2024-07-15 12:10:08 D0_H14 5.754
2024-07-15 12:10:08 D0_H15 5.184
2024-07-15 12:10:08 D0_H16 4.742
2024-07-15 12:10:08 D0_H17 3.549
2024-07-15 12:10:08 D0_H18 2.278
2024-07-15 12:10:08 D0_H19 1.294
2024-07-15 12:10:08 D0_H20 0.493
2024-07-15 12:10:08 D0_H21 0.151
2024-07-15 12:10:08 D0_H22 0.008
2024-07-15 12:10:08 D0_H23 0
2024-07-15 12:10:08 D1 36.656
2024-07-15 12:10:08 D1_H04 0
2024-07-15 12:10:08 D1_H05 0
2024-07-15 12:10:08 D1_H06 0.004
2024-07-15 12:10:08 D1_H07 0.189
2024-07-15 12:10:08 D1_H08 0.503
2024-07-15 12:10:08 D1_H09 1.553
2024-07-15 12:10:08 D1_H10 2.065
2024-07-15 12:10:08 D1_H11 2.982
2024-07-15 12:10:08 D1_H12 4.027
2024-07-15 12:10:08 D1_H13 4.682
2024-07-15 12:10:08 D1_H14 4.739
2024-07-15 12:10:08 D1_H15 4.686
2024-07-15 12:10:08 D1_H16 3.861
2024-07-15 12:10:08 D1_H17 2.995
2024-07-15 12:10:08 D1_H18 2.368
2024-07-15 12:10:08 D1_H19 1.307
2024-07-15 12:10:08 D1_H20 0.491
2024-07-15 12:10:08 D1_H21 0.491
2024-07-15 12:10:08 D1_H22 0.002
2024-07-15 12:10:08 D1_H23 0
2024-06-18 18:12:05 IODev mq_Server
Attributes:
readingList du_EnergyFc:EnergyFc:.* { json2nameValue($EVENT) }
userReadings D0 {
my $D0 = 0;
for(my $i=0; $i<24; $i++) {
$D0 += ReadingsVal("du_EnergyFc","D0_H".sprintf("%02d",($i)),0);
}
$D0;
},
D1 {
my $D1 = 0;
for(my $i=0; $i<24; $i++) {
$D1 += ReadingsVal("du_EnergyFc","D1_H".sprintf("%02d",($i)),0);
}
$D1;
}
Die Vorhersage erfolgt zu Tagesbeginn und jeweils kurz nachdem der DWD seine Wetterdaten aktualisiert hat. Weitere Berechnungen zu dazwischenliegenden Stunden machen wenig Sinn, da sich die Ausgangsparameter nicht geändert haben.
An FHEM werden nur Ergebnisse übergeben, die in der Zukunft liegen. D.h. wenn die Berechnung z.B. um 12 Uhr erfolgt, dann werden nur die Ergebnisse ab 13 Uhr übergeben. Für die aktuelle Stunde und Zeiträume, die bereits in der Vergangenheit liegen, erfolgt keine Ergebnisübergabe. Für diese Zeiten existieren bereits Ist-Daten. Die Berechnung ist somit immer nach vorn in die Zukunft gerichtet.
Nachdem die numerischen Ergebnisse der Prognose in FHEM verfügbar sind, können daraus Graphiken erzeugt werden.
Das kann ganz normal über Plots erfolgen. Ich verwende als Frontend Tablet-UI.
Daher ist es naheliegend, in meine vorhandene Graphik des PV-Ertrages auch die Vorhersage durch einen weiteren Graph zu ergänzen.
Hier das dazugehörige HTML-Markup:
<div data-type="chart"
data-logdevice="lp"
data-logfile="HISTORY"
data-columnspec='["Func:mySolarForecastUtil_EnergyFc()","DbLog:lg_DB_HS1_all:KG_ws_WR_1:AcPower2","DbLog:lg_DB_HS1_all:KG_ws_WR_2:AcPower2","DbLog:lg_DB_HS1_all:du_KG_ws_WR_Ges:AcPower2"]'
data-style='["ftui l5dot", "ftui l2", "ftui l4", "ftui l0fill"]'
data-ptype='["lines","lines","lines","lines"]'
data-uaxis='["primary","primary","primary","primary"]'
data-legend='["Vorschau","SB 2100TL","SB 5000TL-20","Gesamt"]'
data-yunit=" kW"
data-ytext="Leistung"
data-minvalue="0"
data-maxvalue="auto"
data-width="90%"
data-height="700px"
data-yticks="auto"
data-crosshair="true"
data-cursorgroup="1"
data-scrollgroup="1"
data-showlegend="true"
data-xticks="auto"
class="nobuttons">
</div>
Die Funktion mySolarForecastUtil_EnergyFc() liefert den prognostizieren Ertrag des aktuellen Tages in einer Form, die von dem Tablet-UI Chart-Element verarbeitet werden kann.
sub mySolarForecastUtil_EnergyFc()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = $year+1900;
++$mon;
my $date = $year.'-'.sprintf("%02d",($mon)).'-'.sprintf("%02d",($mday)).'_';
my $ret = "";
for(my $i=0; $i< 24; $i++) {
$ret .= $date.sprintf("%02d",($i-1)).':30:00 '.ReadingsVal("du_EnergyFc","D0_H".sprintf("%02d",($i)),0)."\r\n";
}
return $ret;
}
Die daraus resultierende Graphik hat folgendes Aussehen:
Legende:
Die anfängliche Idee den PV-Ertrag per KI zu prognostizieren, hat sich im Nachhinein als relativ komplex erwiesen. Zumal es notwendig war, sich (als „Nicht-Data-Scientist“) recht tief in die Thematik einzuarbeiten. Aber das war ja eigentlich auch der Plan: KI an einem praktischen Beispiel auszuprobieren.
Auf die vielen Iterationsschritte und Ansätze, die ins Leere liefen, habe ich hier verzichtet und nur das Endergebnis beschrieben. Anderenfalls wären diese Ausführungen sicherlich zu lang(atmig) geworden.
Aktuell habe ich für die Prognose ca. ein Jahr an Daten in der Datenbank zur Verfügung. Das erscheint mir als recht wenig. Deshalb ist mein Modell nicht geschlossen. Es fließen täglich neue Eingangsdaten hinzu. Das erfordert natürlich einen gewissen Wartungsaufwand. Die neuen Eingangsdaten müssen einem Qualitätscheck unterzogen werden und das KI-Modell muss in regelmäßigen Abständen getuned und neu trainiert werden. Nur so können neue Eingangsdaten im Modell adäquat berücksichtigt werden.
Voll und ganz hat mich das Projekt allerdings noch nicht überzeugt. Es gibt zu viele Unwägbarkeiten im System, weshalb schon kritisch die Sinnfrage gestellt werden darf.
Wer sich durch diese kleine Serie gelesen hat, dem ist sicherlich aufgefallen, dass die Sourcen auch auf GitHub zur Verfügung stehen. Die Sourcen können gern als Basis für eigene Ansätze genommen werden.
Falls mir grobe Denkfehler unterlaufen sind oder auch in allen anderen Fällen, ist Feedback willkommen.
Fragen oder Anregungen nehme ich gern über die Kontaktbox entgegen oder direkt per Email.
kontakt@kaempf-nk.de