PV Ertragsprognose mit KI - Darstellung in FHEM Tablet-UI

Sie befinden sich hier:
Smart Home Lösungen
»
PV Ertragsprognose mit KI
»
Darstellung in FHEM Tablet-UI

Graphische Darstellung der PV-Prognose

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.

Schritte zu einer KI-basierten PV Ertragsprognose

  1. Motivation / Anlagenaufbau
  2. Feature Engineering - Parameterauswahl
  3. Datenerfassung / Übernahme
  4. Modell Auswahl und Training
  5. Graphische Darstellung mit FHEM Tablet-UI

Ergebnisübergabe an FHEM

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;
	}
  • D0_Hnn ... entspricht dem Vorhersagewert der Stunde nn des aktuellen Tages [kW/h]
  • D1_Hnn ... entspricht dem Vorhersagewert der Stunde nn des Folgetages [kW/h]
  • D0 ... entspricht der kumulierten Ertragserwartung des aktuellen Tages [kW/h]
  • D1 ... entspricht der kumulierten Ertragserwartung des Folgetages [kW/h]

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.

Darstellung der PV Ertragsprognose in FHEM mit Tablet-UI

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>

  • Func:mySolarForecastUtil_EnergyFc() ... PV-Prognose [kW]
  • DbLog:lg_DB_HS1_all:KG_ws_WR_1:AcPower ... Leistung des Wechselrichters 1 [kW]
  • DbLog:lg_DB_HS1_all:KG_ws_WR_2:AcPower ... Leistung des Wechselrichters 2 [kW]
  • DbLog:lg_DB_HS1_all:du_KG_ws_WR_Ges:AcPower ... kumulierten Leistung beider Wechselrichter kW]

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: PV Ertrag in FHEM

Legende:

  • SB2100-TL = KG_ws_WR_1 (Wechselrichter 1) = rote Linie
  • SB 5000TL-20 = KG_ws_WR_2 (Wechselrichter 2) = grüne Linie
  • Gesamt = du_KG_ws_WR_Ges (Summe aus beiden Wechselrichtern) = goldene Fläche
  • Vorschau = du_EnergyFc (Prognose) = blau gepunktete Linie

Fazit

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.

  • Wenn die Wettervorhersage des DWD z.B. signalisiert, dass heute die Sonne scheint und letztendlich scheint sie doch nicht, dann liegt die PV-Ertragsprognose schon arg daneben.
  • Vielleicht ist das Ganze auch viel zu detailliert gedacht. Im Sommer kommt i.d.R. genug PV-Ertrag vom Dach. Da muss man nicht groß überlegen, ob man die Verbraucher gleichzeitig oder gestaffelt in Betrieb nimmt. Notfalls reicht ein Blick aus dem Fenster oder der gesunde Menschenverstand.
  • Im Winter kommt fast kein Ertrag vom Dach. Da kann man seine Großverbraucher im Zeitfenster hin und her schieben wie man will. Das Einsparpotential hält sich in Grenzen oder geht gegen Null.
  • Inwiefern sich diese Gedankenspiele ändern würden, wenn eine Wärmepumpe vor dem Haus stünde oder ein Batteriespeicher Einzug hält, nachdem die PV-Anlage ausgefördert ist, wird die Zukunft zeigen. Bis dahin bleibt noch genügend Zeit, um das aktuelle KI-Modell zu optimieren.

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.


Kontakt

Fragen oder Anregungen nehme ich gern über die Kontaktbox entgegen oder direkt per Email.

kontakt@kaempf-nk.de

Fragen / Anregungen?

Sicherheitsabfrage:
Hinweise zur Datenerfassung finden Sie unter: Datenschutz