76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

Begonnen von DS_Starter, 11 Februar 2024, 14:11:00

Vorheriges Thema - Nächstes Thema

DS_Starter

ZitatJetzt ist mir aufgefallen das meine configdb-Datenbank sehr groß geworden ist weil in der fhemb64filesave
eine Unmenge an PVH_SolarForecast_Solar_Cast_datum und PVC_SolarForecast_Solar_Cast_datum Dateien befinden.
Habe ich etwas falsch eingestellt? Kann ich die Daten entfernen?
Ja, die kannst du löschen. Es sind Sicherungsdateien, die du bei Nutzung von configdb im Prinzip nicht brauchst.
Deswegen kannst du bei dir

plantControl->backupFilesKeep=0

einstellen. Dann werden die Dateien nicht mehr geschrieben.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

peterboeckmann

Hallo Heiko,

Zitat von: DS_Starter am 30 Januar 2026, 08:31:18bitte nochmal ziehen.

ich hatte die Version gezogen. Zeitstempel der Datei ist 30.01.2026 08:26:15.
FHEM habe ich nach dem Download neu gestartet.

Damit habe ich immer noch den Eindruck, dass der Anteil der aktuellen Stunde fehlt.
Hier mal einige Auszüge aus dem List mit meinen Berechnungen danach:

     2026-01-30 09:35:34   RestOfDayPVforecast 2763 Wh
     2026-01-30 09:35:34   Today_PVdeviation -71.56 %
     2026-01-30 09:35:34   Today_PVforecast 2981 Wh
     2026-01-30 09:35:34   Today_PVreal    63 Wh
   
    bisher vorhergesagt: 2981-2763 = 218
    63/218 = x/100
    63/218*100 = 28,8
    100-28,8 = 71,2

     2026-01-30 09:38:59   RestOfDayPVforecast 2759 Wh
     2026-01-30 09:38:59   Today_PVdeviation -67.43 %
     2026-01-30 09:38:59   Today_PVforecast 2977 Wh
     2026-01-30 09:38:59   Today_PVreal    71 Wh
    bisher vorhergesagt: 2977-2759 = 218
    71/218 = x/100
    71/218*100 = 32,6
    100-32,6 = 67,4
   
     2026-01-30 09:46:33   RestOfDayPVforecast 2749 Wh
     2026-01-30 09:46:33   Today_PVdeviation -57.34 %
     2026-01-30 09:46:33   Today_PVforecast 2967 Wh
     2026-01-30 09:46:33   Today_PVreal    95 Wh
    bisher vorhergesagt: 2967-2749 = 218
    95/218 = x/100
    95/218*100 = 43,6
    100-43,6 = 57,4

     2026-01-30 09:50:45   RestOfDayPVforecast 2991 Wh
     2026-01-30 09:50:45   Today_PVdeviation -50.92 %
     2026-01-30 09:50:45   Today_PVforecast 3209 Wh
     2026-01-30 09:50:45   Today_PVreal    107 Wh
    bisher vorhergesagt: 3209-2991 = 218
    107/218 = x/100
    107/218*100 = 49,1
    100-49,1 = 50,9

     2026-01-30 09:56:06   RestOfDayPVforecast 2944 Wh
     2026-01-30 09:56:06   Today_PVdeviation -42.66 %
     2026-01-30 09:56:06   Today_PVforecast 3162 Wh
     2026-01-30 09:56:06   Today_PVreal    125 Wh
    bisher vorhergesagt: 3162-2944 = 218
    125/218 = x/100
    125/218*100 = 57,3
    100-57,3 = 42,7

     2026-01-30 10:01:27   RestOfDayPVforecast 3023 Wh
     2026-01-30 10:01:27   Today_PVdeviation -79.37 %
     2026-01-30 10:01:27   Today_PVforecast 3716 Wh
     2026-01-30 10:01:27   Today_PVreal    143 WhWh
    bisher vorhergesagt: 3716-3023 = 693
    143/693 = x/100
    143/693*100 = 20,6
    100-20,6 = 20,6
   
Fazit: Die Berechnung kann ich nachvollziehen.
Aber: Today_PVforecast steigt, genau wie RestOfDayPVforecast, deren Differenz bleibt innerhalb der Stunde konstant.

Viele Grüße,
Peter

DS_Starter

Hallo Peter,

nein, der Eindruck täuscht.
Aber ich habe mich gestern zu einer Maßnahme hinreißen lassen, die falsch war jedoch im ersten Moment logisch erschien.
Die Tagesvorhersage wird immer von dem Datenlieferanten vorgegeben. Die vergangenen Stunden logischerweise dabei nicht mehr berücksichtigt.
D.h. die bisherige Berechnung ist absolut richtig. Allerdings müsste ich dafür sorgen, dass RestOfDayPVforecast nie größer als
Today_PVforecast werden kann da systembedingt vergangene Tagesstunden nicht mehr verändert werden.
Das hätte aber wieder andere Konsequenzen, da RestOfDayPVforecast ein wichtiger Faktor für andere Dinge ist wie z.B. Consumer- oder Batteriesteuerung
die einen höheren Stellenwert haben als eine Korrekturdifferenz zur Anziege die obendrein nur in bestimmten Fällen wie beschrieben auftritt.
Ich habe die Änderung von gestern Abend zurückgenommen und ins contrib gestellt. Vllt. fällt mir noch etwas dazu ein, mal schauen.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Habe eine Änderung ins contrib gestellt, die sich im Bedarfsfall NUR auf die Azeige auswirkt.
Die Readings bleiben unverändert.
Liegt im contrib.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

peterboeckmann

Hallo Heiko,

ich habe mir die Readings nochmal angesehen und nachgerechnet:

Du darfst diesen Dateianhang nicht ansehen.

Es scheint, als wäre der Stundenanteil auf die Today_PVforecast addiert worden und nicht auf die RestOfDayPVforecast?

Viele Grüße,
Peter

DS_Starter

Ja genau und das hatte mich irritiert, ist aber falsch dies zu tun weil Today_PVforecast anders ermittelt wird wie beschrieben.
Deswegen Rolle rückwärts und wieder raus. Bei RestOfDayPVforecast ist der Anteil richtigerweise schon immer integriert.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

peterboeckmann

Ok, ich hab die neue Version gezogen und schaue nachher mal drauf.

Parallix

#5092
Zitat von: DS_Starter am 29 Januar 2026, 19:41:16@Parallix,

ZitatDa "noSchedule" auch kein wirklicher Typ ist, schlage ich vor, noSchedule als Attributwert für "mode" zu entfernen und die Maßnahmen für "noSchedule" dann anzuwenden, wenn der "mode"-Attributwert auf "mustNot" steht, bzw. aus einem Reading bezogen wird.
noSchedule gibt es als Option für "mode" nicht und kann somit dort nicht entfernt werden.
Wahrscheinlich meinst du vielmehr noSchedule als "type" zu entfernen und statt dessen "mode" zu ergänzen, sodass dann "mode" die Optionen can, must und noSchedule bekommen kann.
Ja, in der Tat meinte ich "noSchedule" als "type".

ZitatIn der Realität würde das dann bedeuten der Consumer kann, muß oder wird nicht (noSchedule) eingeplant.
Ja, genau! Und da "mode" auch aus einem Reading bezogen werden kann, kann der Consumer dann auch dynamisch in der Planung einbezogen werden oder aber dort herausgelassen werden.

ZitatProgramtechnisch würde ich dann sehr wahrscheinlich den type nicht entfernen, sondern nur den "mode" um diese Option ergänzen, je nachdem wie gut es umsetzbar ist ohne zu tief in den Code einzugreifen.
..
Die Ergänzung der "mode"-Werte um "mustNot" ist in der Tat völlig ausreichend!
FHEM: Debian/Testing BananaPro - AVM: 7490 (7.62) und 7591 (8.21) - Goodwe: GW25K-ET (DSP V10 / ARM V12) - Trina TSM 405: (#East, #South, #West) = (12,16,12) - BYD: 2 x HVS 7.7 (BMS V3.31-B, BMU V3.26-B) - EnOcean - Z-Wave - FS20/HMS

peterboeckmann

Moin Heiko,

Zitat von: peterboeckmann am 30 Januar 2026, 12:27:11Ok, ich hab die neue Version gezogen und schaue nachher mal drauf.


Heute Morgen sieht es nicht besser aus als gestern vor den Reparaturversuchen:

2026-01-31 08:58:07   RestOfDayPVforecast 3018 Wh
   
     2026-01-31 08:58:07   Today_PVdeviation 1050 %
     2026-01-31 08:58:07   Today_PVforecast 3016 Wh
     2026-01-31 08:58:07   Today_PVreal    23 Wh

Viele Grüße,
Peter

DS_Starter

Hallo Peter,

ich mache erstmal ein paar Tage Urlaub.
Wenn du magst, kannst du ja mal überlegen wie diese aktuelle Formel verändert werden könnte um im Grenzwertbereich besser zu funktionieren und Werte RestOfDayPVforecast > Today_PVreal zu eliminieren:

my $pvfc = ReadingsNum ($name, 'Today_PVforecast', 0);
my $pvre = ReadingsNum ($name, 'Today_PVreal',     0);
my $pvfcrod = ReadingsNum ($name, 'RestOfDayPVforecast', 0) - $pvfc;              # PV Prognose bis jetzt
$pvfcrod    = min ($pvfc, abs ($pvfcrod));                                       
$dpv        = sprintf "%.2f", ( 100 - (100 * ($pvre / ($pvfcrod || 1))) );

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

peterboeckmann


mannil

Auch von mir nen schönen  Urlaub.

Ich bin begeistert von der Genauigkeit der KI-Prognose.
Du darfst diesen Dateianhang nicht ansehen.
HP Elitedesk G4, Intel i5-8500t, 16GB RAM, 256GB SSD
diverse Shellys, HM Rolladensteuerungen und sonst viel zusammengewürfelter Kram ;-.)
PV 9,75kWp Ost-West  an E3DC S10 mit 9,6kWh Speicher, Wärmepumpe Stiebel Eltron WPL-A10 HK premium 400
Tesla Model Y BYD SR an go-e Charger gemini flex 11kW

peterboeckmann

Hallo Heiko,

für nach Deinem Urlaub, ich hoffe er war erholsam.

<TL;DR>
Die Formel passt, aber das Reading RestOfDayPVforecast nicht.
</TL;DR>

Zitat von: DS_Starter am 31 Januar 2026, 10:30:12Wenn du magst, kannst du ja mal überlegen wie diese aktuelle Formel verändert werden könnte um im Grenzwertbereich besser zu funktionieren und Werte RestOfDayPVforecast > Today_PVreal zu eliminieren

Ich habe mir die Formel angesehen. Die ist vollkommen in Ordnung so und bedarf keiner Veränderung.

Die Ursache für die (bei mir) unplausiblen Werte des Readings Today_PVdeviation habe ich in den eingehenden Werten gefunden.
Dafür habe ich die folgenden (User-)Readings aufgezeichnet und in einem SVG plotten lassen:
- Today_PVdeviation
- Today_PVforecast
- Today_PVreal
- RestOfDayPVforecast
- Today_PVforecast_SoFar {return ReadingsVal("SolarForecast", "Today_PVforecast_Num", "0")-ReadingsVal("SolarForecast", "RestOfDayPVforecast_Num", "0");}

Das sah am 01.02. so aus:
Du darfst diesen Dateianhang nicht ansehen.
Wie man hier sieht, ist RestOfDayPVforecast gelegentlich größer als Today_PVforecast, was ja inhaltlich nicht vorkommen dürfte.
Dadurch wird mein UserReading Today_PVforecast_SoFar (und der in die Formel eingehende Wert für die bisherige Prognose) negativ, was mit dem abs in der Formel nicht weiter auffällt.
Allerdings führt der extrem kleine Wert von Today_PVforecast_SoFar (nahe 0) zu einer riesigen Today_PVdeviation.
In diesem Diagramm ist auch ganz gut zu erkennen, wie groß der Abstand zwischen Today_PVreal und Today_PVforecast ist.

Ganz ähnlich das Bild am 02.02.:
Du darfst diesen Dateianhang nicht ansehen.

Ich habe dann den Code zur Ermittlung der Today_PVdeviation so umgestellt, dass RestOfDayPVforecast hier nicht berücksichtigt wird:
my ($sec, $min, $hour) = localtime();
my $currentHour = $hour + 1;

my $pvfcd = 0; # PV Prognose am Tagesanfang
if ($currentHour > 5) {$pvfcd += ReadingsNum ($name, 'Today_Hour05_PVforecast', 0)} # PV Prognose nach Stunde 5
if ($currentHour > 6) {$pvfcd += ReadingsNum ($name, 'Today_Hour06_PVforecast', 0)} # PV Prognose nach Stunde 6
if ($currentHour > 7) {$pvfcd += ReadingsNum ($name, 'Today_Hour07_PVforecast', 0)} # PV Prognose nach Stunde 7
if ($currentHour > 8) {$pvfcd += ReadingsNum ($name, 'Today_Hour08_PVforecast', 0)} # PV Prognose nach Stunde 8
if ($currentHour > 9) {$pvfcd += ReadingsNum ($name, 'Today_Hour09_PVforecast', 0)} # PV Prognose nach Stunde 9
if ($currentHour > 10) {$pvfcd += ReadingsNum ($name, 'Today_Hour10_PVforecast', 0)} # PV Prognose nach Stunde 10
if ($currentHour > 11) {$pvfcd += ReadingsNum ($name, 'Today_Hour11_PVforecast', 0)} # PV Prognose nach Stunde 11
if ($currentHour > 12) {$pvfcd += ReadingsNum ($name, 'Today_Hour12_PVforecast', 0)} # PV Prognose nach Stunde 12
if ($currentHour > 13) {$pvfcd += ReadingsNum ($name, 'Today_Hour13_PVforecast', 0)} # PV Prognose nach Stunde 13
if ($currentHour > 14) {$pvfcd += ReadingsNum ($name, 'Today_Hour14_PVforecast', 0)} # PV Prognose nach Stunde 14
if ($currentHour > 15) {$pvfcd += ReadingsNum ($name, 'Today_Hour15_PVforecast', 0)} # PV Prognose nach Stunde 15
if ($currentHour > 16) {$pvfcd += ReadingsNum ($name, 'Today_Hour16_PVforecast', 0)} # PV Prognose nach Stunde 16
if ($currentHour > 17) {$pvfcd += ReadingsNum ($name, 'Today_Hour17_PVforecast', 0)} # PV Prognose nach Stunde 17
if ($currentHour > 18) {$pvfcd += ReadingsNum ($name, 'Today_Hour18_PVforecast', 0)} # PV Prognose nach Stunde 18
if ($currentHour > 19) {$pvfcd += ReadingsNum ($name, 'Today_Hour19_PVforecast', 0)} # PV Prognose nach Stunde 19
if ($currentHour > 20) {$pvfcd += ReadingsNum ($name, 'Today_Hour20_PVforecast', 0)} # PV Prognose nach Stunde 20
if ($currentHour > 21) {$pvfcd += ReadingsNum ($name, 'Today_Hour21_PVforecast', 0)} # PV Prognose nach Stunde 21
if ($currentHour > 22) {$pvfcd += ReadingsNum ($name, 'Today_Hour22_PVforecast', 0)} # PV Prognose nach Stunde 22

if ($currentHour == 5) {$pvfcd += ReadingsNum ($name, 'Today_Hour05_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 6) {$pvfcd += ReadingsNum ($name, 'Today_Hour06_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 7) {$pvfcd += ReadingsNum ($name, 'Today_Hour07_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 8) {$pvfcd += ReadingsNum ($name, 'Today_Hour08_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 9) {$pvfcd += ReadingsNum ($name, 'Today_Hour09_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 10) {$pvfcd += ReadingsNum ($name, 'Today_Hour10_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 11) {$pvfcd += ReadingsNum ($name, 'Today_Hour11_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 12) {$pvfcd += ReadingsNum ($name, 'Today_Hour12_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 13) {$pvfcd += ReadingsNum ($name, 'Today_Hour13_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 14) {$pvfcd += ReadingsNum ($name, 'Today_Hour14_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 15) {$pvfcd += ReadingsNum ($name, 'Today_Hour15_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 16) {$pvfcd += ReadingsNum ($name, 'Today_Hour16_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 17) {$pvfcd += ReadingsNum ($name, 'Today_Hour17_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 18) {$pvfcd += ReadingsNum ($name, 'Today_Hour18_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 19) {$pvfcd += ReadingsNum ($name, 'Today_Hour19_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 20) {$pvfcd += ReadingsNum ($name, 'Today_Hour20_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 21) {$pvfcd += ReadingsNum ($name, 'Today_Hour21_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde
if ($currentHour == 22) {$pvfcd += ReadingsNum ($name, 'Today_Hour22_PVforecast', 0) * (($min*60) + $sec) / 3600} # PV Prognose + Anteil der aktuellen Stunde

$pvfcd = sprintf "%.1f", $pvfcd;
storeReading ('Today_PVforecast_ByNow', $pvfcd.' Wh');

$dpv        = sprintf "%.2f", ( 100 - (100 * ($pvre / ($pvfcd || 1))) );
$dosave_dpv = 1;

Wie Du siehst, habe ich zur Nachverfolgung das Reading Today_PVforecast_ByNow eingeführt.
Im folgenden Diagramm ist das auch mit dargestellt:
Du darfst diesen Dateianhang nicht ansehen.

Hier sieht man, wie nah sich dieses Reading (gestrichelte Linie) an der Today_PVreal (grüne Linie) bewegt.
Dafür einen riesigen Glückwunsch an die PV-Prognose an sich!!!

Vielleicht ist mein Code da wo er ist, an einer ungünstigen Stelle.
Bestimmt ist es auch sinnvoller, die Ursache für die aus meiner Sicht falsche RestOfDayPVforecast zu ermitteln und zu korrigieren.

Ich würde mich aber sehr freuen, wenn Du die entsprechende Korrektur vornehmen könntest.


Vielen Dank mal wieder für Deinen großartigen Support und dafür, dass Du Dich auch mit noch so geringfügigen Problemen auseinandersetzt!

Viele Grüße,
Peter

DS_Starter

Hallo zusammen,

vielen Danke für euro Urlaubswünsche :)  ... es waren wirklich nur einige wenige Tage Auszeit und nun steige ich langsam auch wieder ein.


@Peter,

erstmal vielen Dank für die Mühe und intensive Ursachenforschung.

Tatsächlich ist die Differenz aus RestOfDayPVforecast und Today_PVforecast problematisch wie du auch festgestellt hast.

ZitatWie man hier sieht, ist RestOfDayPVforecast gelegentlich größer als Today_PVforecast, was ja inhaltlich nicht vorkommen dürfte.
Ja so ist es. Wieso es ab und an vorkommt, werde ich noch ergründen müssen. Vermutlich ist es aber ein zeitlicher Zusammenhang der sich aus dem Zeitpunkt der
Speicherung des Prognosewertes der aktuellen Stunde in der pvHistory (wird für Today_PVforecast  genutzt) und der zeitlichen Gewichtung inkl. der laufenden Stunde
für RestOfDayPVforecast ergibt.
Aber grundsätzlich ist es besser die von dir skizzierte Vorgehensweise zu nutzen, nämlich statt der bisher verwendeten Differenzmethode zur Ermittlung des
bisher aufgelaufenen Prognosewertes eine Summierung bis zum aktuellen Zeitpunkt durchzuführen und diesen Wert mit Today_PVreal ins Verhältnis zu setzen.

Werde ich kurzfristig implemnetieren und meled mich wieder.

LG,
Heiko



Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter