76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

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

Vorheriges Thema - Nächstes Thema

peterboeckmann

Zitat von: DS_Starter am 02 August 2026, 14:41:15Aber grundsätzlich wäre deine Erwartung auch hier, dass der AUS-Zustand den du manuell herbeigeführt hast, beibehalten wird und NICHT wieder automatisch eingeschaltet, richtig?

Zumindest hatte ich deine Beschreibung weiter oben so verstanden.
Aus Anwendersicht fände ich es auch verständlich, wenn die Automatik immer schaltet, wenn sie aktiviert ist - unabhängig von irgendwelchen manuellen bzw. externen Schaltvorgängen.

Ich will nur verstehen, wie SF tickt. Leben kann ich mit beiden Varianten.

Viele Grüße,
Peter
MQTT,Modbus,HTTPMod,DbLog,LaCrosse,SolarForecast,TelegramBot,Twilight,vitoconnect,withings
fhem,fhempy,debmatic
Debian
RaspberryPi5,HomeMatic,HomeMaticIP,Shelly,JeeLink,SignalDuino,ZWDongle,SONOS,alexa,Hue,tradfri,MobileAlerts,Siemens Home Connect,Roborock S50,Wallbox,Harmony,Tuya Smartlife

DS_Starter

#6781
Hallo Peter,

jetzt ist mir dein Fall klar geworden und es ist strukturell bedingt.

Du hast den Consumer ausgeschaltet und er war bis 13:55:10 im Status continued:

2026.08.02 13:55:10 1: SolarForecast DEBUG> ############### consumerSwitching consumer "03" ###############
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - ConsumptionRecommended calc method: default, surplus: 8575
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - current Grid power consumption: 0 W
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - Power splitting - Grid: 0 W, PV: 300 W
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - additional consumption after switching on (if currently 'off'): 300 W
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - current planning state: continued
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - physical Switchstate before switching: off
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - logical Switchstate before switching: off
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - priority=0
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - general switching parameters => auto mode=1, Household con=-5367 W, nompower=300 W, surplus=8575 W, Mode=can, planstate=continued:, starttime=02.08.2026 06:26:10
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - isInLocktime=0
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch on' => swoncond=1, on-command=on
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOnCond Info=value "0" matches the Regex "0"
-> Check successful
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info=value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - device 'MQTT2_Spelunkenentfeuchter' is used as switching device
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - Interrupt Characteristic value: 1 -> simple true
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch off' => swoffcond: 0, off-command: off
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - is Consumption recommended: 1
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info: value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - current planning state: continued
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - physical Switchstate after switching: off
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - logical Switchstate after switching: off
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - cycleDayNum: 18
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - last cycle start time: 2026-08-02 13:41:52
2026.08.02 13:55:10 1: SolarForecast DEBUG> consumer "03" - last cycle end time: 2026-08-02 13:46:59


Dann 13:55:18 geht er in den Status interrupting wegen Unterschreitung Überschuß (effective surplus 0 W < required 300 W) -> SF sendet Ausschaltkommando:

2026.08.02 13:55:18 1: SolarForecast DEBUG> ############### consumerSwitching consumer "03" ###############
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - ConsumptionRecommended calc method: default, surplus: 0
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - current Grid power consumption: 3930 W
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - Power splitting - Grid: 0 W, PV: 300 W
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - additional consumption after switching on (if currently 'off'): 300 W
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - current planning state: interrupting
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - physical Switchstate before switching: off
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - logical Switchstate before switching: off
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - priority=0
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - general switching parameters => auto mode=1, Household con=8255 W, nompower=300 W, surplus=0 W, Mode=can, planstate=interrupting:, starttime=02.08.2026 06:26:10
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - isInLocktime=0
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch on' => swoncond=1, on-command=on
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOnCond Info=value "0" matches the Regex "0"
-> Check successful
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info=value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - device 'MQTT2_Spelunkenentfeuchter' is used as switching device
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - Interrupt Characteristic value: 1 -> simple true
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - start deferred: effective surplus 0 W < required 300 W (committed: 0 W)
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch off' => swoffcond: 0, off-command: off
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - is Consumption recommended: 0
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info: value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - send switch command now: "set MQTT2_Spelunkenentfeuchter off"
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - current planning state: interrupting
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - physical Switchstate after switching: off
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - logical Switchstate after switching: off
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - cycleDayNum: 18
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - last cycle start time: 2026-08-02 13:41:52
2026.08.02 13:55:18 1: SolarForecast DEBUG> consumer "03" - last cycle end time: 2026-08-02 13:46:59

Nebenbei, es kommt sehr oft das Ausschaltkommando bis 13:55:42:
send switch command now: "set MQTT2_Spelunkenentfeuchter off"aber dein Consumer wird nicht als off erkannt (oder schaltet nicht), der Befehl feuert immer wieder. Vllt. mal checken.

Dann kommt 13:55:47 der Wechsel weil wieder genug Überschuß da ist und die Automatik schaltet ein:

2026.08.02 13:55:42 1: SolarForecast DEBUG> ############### consumerSwitching consumer "03" ###############
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - ConsumptionRecommended calc method: default, surplus: 0
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - current Grid power consumption: 2391 W
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - Power splitting - Grid: 0 W, PV: 300 W
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - additional consumption after switching on (if currently 'off'): 300 W
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - current planning state: interrupting
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - physical Switchstate before switching: off
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - logical Switchstate before switching: off
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - priority=0
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - general switching parameters => auto mode=1, Household con=8810 W, nompower=300 W, surplus=0 W, Mode=can, planstate=interrupting:, starttime=02.08.2026 06:26:10
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - isInLocktime=0
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch on' => swoncond=1, on-command=on
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOnCond Info=value "0" matches the Regex "0"
-> Check successful
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info=value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - device 'MQTT2_Spelunkenentfeuchter' is used as switching device
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - Interrupt Characteristic value: 1 -> simple true
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - start deferred: effective surplus 0 W < required 300 W (committed: 0 W)
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch off' => swoffcond: 0, off-command: off
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - is Consumption recommended: 0
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info: value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - send switch command now: "set MQTT2_Spelunkenentfeuchter off"
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - current planning state: interrupting
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - physical Switchstate after switching: off
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - logical Switchstate after switching: off
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - cycleDayNum: 18
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - last cycle start time: 2026-08-02 13:41:52
2026.08.02 13:55:42 1: SolarForecast DEBUG> consumer "03" - last cycle end time: 2026-08-02 13:46:59

....

2026.08.02 13:55:47 1: SolarForecast DEBUG> ############### consumerSwitching consumer "03" ###############
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - ConsumptionRecommended calc method: default, surplus: 1024
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - current Grid power consumption: 0 W
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - Power splitting - Grid: 0 W, PV: 300 W
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - additional consumption after switching on (if currently 'off'): 300 W
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - current planning state: interrupting
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - physical Switchstate before switching: off
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - logical Switchstate before switching: off
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - priority=0
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - general switching parameters => auto mode=1, Household con=5798 W, nompower=300 W, surplus=1024 W, Mode=can, planstate=interrupting:, starttime=02.08.2026 06:26:10
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - isInLocktime=0
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch on' => swoncond=1, on-command=on
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOnCond Info=value "0" matches the Regex "0"
-> Check successful
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info=value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - device 'MQTT2_Spelunkenentfeuchter' is used as switching device
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - Interrupt Characteristic value: 1 -> simple true
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - send switch command: "set MQTT2_Spelunkenentfeuchter on"
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - Check Context 'switch off' => swoffcond: 0, off-command: off
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - is Consumption recommended: 1
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - isAddSwitchOffCond Info: value "0" doesn't match the Regex "1"
(the effect depends on the switch context)
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - current planning state: continuing
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - physical Switchstate after switching: off
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - logical Switchstate after switching: off
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - cycleDayNum: 18
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - last cycle start time: 2026-08-02 13:41:52
2026.08.02 13:55:47 1: SolarForecast DEBUG> consumer "03" - last cycle end time: 2026-08-02 13:46:59

Der Punkt ist, dass es einen weiteren wesentlichen Fakt gibt.
Der entscheidende Mechanismus: Sobald die Automatik den Consumer einmal selbst "berührt" – und sei es nur, weil 
er wegen zu wenig Überschuß unterbrochen wird - und dadurch der manuell herbeigeführte Status (AUS) gleich dem automatischen SF-Sollstatus (AUS) ist (implizierter internen Tabellensynch), übernimmt die Automatik wieder wenn sie aktiv ist. Genau das war bei dir der Fall.

Ich muß also die Fälle der Automatikeinrastung ergänzen:

- wenn NACH manueller Schaltung der Zustand VOR dem manuellen Eingriff wiederhergestellt wird, wobei die
  Automatik nicht deaktiviert wurde (wie bisher)

- Sobald die Automatik den Consumer einmal selbst "berührt" – und sei es nur, weil 
  er wegen zu wenig Überschuß kurz unterbrochen wird - und dadurch der manuell herbeigeführte Status (z.B. AUS)
  gleich dem automatischen SF-Sollstatus (z.B. AUS) gleich ist (implizierter internen Tabellensynch),
  übernimmt die Automatik wieder wenn sie aktiv ist.

- bei einer AUS-> EIN Flanke des Automatikmodus, unabhängig ob der Schaltzustand vor dem manuellen
  Eingriff wiederhergestellt wurde

Ich denke das vergisst man. Werde es im Wiki passend hinterlegen zum Nachlesen.

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

Hallo Heiko,

Danke für den Hinweis bzgl. des verzögerten Schaltens.
Das device selbst wird per MQTT über WLAN gesteuert. Die WLAN-Verbindung ist zu diesem device vielleicht nicht die beste.
Wenn ich das richtig überblicke, steht das device solange auf set_on bzw. set_off.
Prüft SF diesen Status oder nur on und off?

Viele Grüße,
Peter
MQTT,Modbus,HTTPMod,DbLog,LaCrosse,SolarForecast,TelegramBot,Twilight,vitoconnect,withings
fhem,fhempy,debmatic
Debian
RaspberryPi5,HomeMatic,HomeMaticIP,Shelly,JeeLink,SignalDuino,ZWDongle,SONOS,alexa,Hue,tradfri,MobileAlerts,Siemens Home Connect,Roborock S50,Wallbox,Harmony,Tuya Smartlife

DS_Starter

ZitatWenn ich das richtig überblicke, steht das device solange auf set_on bzw. set_off.
Prüft SF diesen Status oder nur on und off?
Es wird geprüft was du als Regex im Schlüssel swstate für on bzw. off angibst.
Per default ist es on und off.
Aber bei dir wäre es vermutlich so abzuändern:

swstate=state:.*on:.*off
wenn das nicht reicht:

swstate=state:.*on.*:.*off.*
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

Im Wiki gibt es jetzt einen extra Abschnitt der sich mit der Consumer-Automatiksteuerung befasst.
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

#6785
@all,

in meinem contrib liegt ein Update der V 2.9.4 (inzwischen eingecheckt).

Inhalt:

- Resync Consumer Schaltstatus an der Flanke Automatik AUS→EIN beim Umlegen des Automatik-Schalters

- CHANGE: Mitteilungssystem:
  * es wird immer das Icon für die Severity der letzten/aktuellsten Mitteilung angezeigt und nicht mehr
    die höchste Severity aller vorhandenen Mitteilungen
  * Post-Icon für Schweregrad '2' geändert

- FIX: die Attribute graphicBeamXContent können fehlerfrei in den graphicHeaderOwnspec-Bereich integriert werden 
  (Bugfix: Regexfilter für statische Platzhalter korrigiert)

Ich hatte einen kleinen Bug im Code für graphicHeaderOwnspec festgestellt, der aber die Integration von graphicBeamXContent verhindert hat. Das funktioniert jetzt und man kann sich über die GUI bequem Dropdown-Listen zur Auswahl des Content für die Balken in der Grafik einbauen.

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

#6786
Guten Abend,

ich habe die Version 2.9.4 soeben eingecheckt. Sie ist morgen früh wie gewöhnlich im Update enthalten.

Als nächsten Schritt werde ich mir den Batterieladecontroller von Parallix näher anschauen und - wenn es sich anbietet und sinnvoll ist - eine entsprechende Unterstützung dafür in SF implementieren.

Parallix hatte seinen Controller bereits in #5467 und in #5199 beschrieben. Ich hatte schon die ganze Zeit ein schlechtes Gewissen mich nicht eher darum gekümmert zu haben.
Das möchte ich nun nachholen und hoffe, dass nun etwas Zeit dafür ist.

Wer zu der Thematik etwas beitragen möchte, kann das gern tun. Die Jahreszeit bietet sich für Fragen der Batteriesteuerung an, da wir keine Probleme haben unsere Batterien voll geladen zu bekommen. Das ist Voraussetzung für Experimente mit dem Batterieladecontroller.

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

TheTrumpeter

Ich habe mal wieder den Fall, dass die Prognose für heute 22 und 23 Uhr Verbräuche deutlich unter 100 Wh vorhersagt.

Wenn ich mit der neuen Suchfunktion in den "circularData" nach Verbräuchen < 100 Wh suche, wird nix gefunden.
Die habe ich gestern nämlich alle gelöscht und dann neu trainiert.
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=03 key=con_all wday=Sun pos=11 value=0
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=09 key=con_all wday=Thu pos=13 value=55
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=09 key=con_all wday=Wed pos=10 value=0
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=11 key=con_all wday=Sat pos=16 value=41
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=11 key=con_all wday=Sun pos=19 value=97
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=11 key=con_all wday=Wed pos=18 value=2
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=12 key=con_all wday=Sat pos=16 value=30
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=12 key=con_all wday=Sun pos=19 value=40
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=13 key=con_all wday=Sat pos=16 value=1
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=13 key=con_all wday=Thu pos=16,18 value=70,4
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=14 key=con_all wday=Sat pos=22 value=85
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=15 key=con_all wday=Sun pos=27 value=4
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=16 key=con_all wday=Sat pos=25 value=86
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=17 key=con_all wday=Sun pos=25 value=2
2026.08.03 08:22:40 1: mySolarForecast - Circular data found - hod=18 key=con_all wday=Thu pos=14,18 value=44,0
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=03 key=con_all wday=Sun pos=11 value=0
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=09 key=con_all wday=Thu pos=13 value=55
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=09 key=con_all wday=Wed pos=10 value=0
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=11 key=con_all wday=Fri pos=16 value=100
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=11 key=con_all wday=Sat pos=16 value=41
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=11 key=con_all wday=Sun pos=19 value=97
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=11 key=con_all wday=Wed pos=18 value=2
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=12 key=con_all wday=Sat pos=16 value=30
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=12 key=con_all wday=Sun pos=19 value=40
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=13 key=con_all wday=Sat pos=16 value=1
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=13 key=con_all wday=Thu pos=16,18 value=70,4
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=14 key=con_all wday=Sat pos=22 value=85
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=15 key=con_all wday=Sun pos=27 value=4
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=16 key=con_all wday=Sat pos=25 value=86
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=17 key=con_all wday=Sun pos=25 value=2
2026.08.03 08:24:50 1: mySolarForecast - Circular data deleted - hod=18 key=con_all wday=Thu pos=14,18 value=44,0

Debug=aiData liefert:
026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 15
2026.08.04 14:35:05 1: mySolarForecast DEBUG> No AI decision delivered
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 15, Rad1h: 2688, pvfc: 10696 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 16
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 16, Rad1h: 2414, pvfc: 9058 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 17
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 17, Rad1h: 1983, pvfc: 7324 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 18
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 18, Rad1h: 1417, pvfc: 4827 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 19
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 19, Rad1h: 794, pvfc: 2585 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 20
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 750
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 750
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 750 (hod: 20, sunaz: 287.00, sunalt: 10, Rad1h: 235, wcc: 49, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 150, hod: 20, Rad1h: 235, pvfc: 750 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 21
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 21, Rad1h: 12, pvfc: 21 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 22
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 22, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 23
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 23, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 24
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 24, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 01
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 01, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 02
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 02, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 03
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 03, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 04
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 04, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> no rad1h for hod: 05
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 05, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 06
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 80
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 80 (hod: 06, sunaz: 65.90, sunalt: 5, Rad1h: 14, wcc: 0, rr1c: 0.00, temp: 25)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 151, hod: 06, Rad1h: 14, pvfc: 80 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 07
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 1400
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 1030
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 1215 (hod: 07, sunaz: 73.20, sunalt: 10, Rad1h: 266, wcc: 0, rr1c: 0.00, temp: 25)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 107, hod: 07, Rad1h: 266, pvfc: 1215 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 08
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 08, Rad1h: 764, pvfc: 3520 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 09
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 2230
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 2230 (hod: 09, sunaz: 95.20, sunalt: 30, Rad1h: 1346, wcc: 0, rr1c: 0.00, temp: 25)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 36, hod: 09, Rad1h: 1346, pvfc: 2230 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 10
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 10170
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 10170
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 10170 (hod: 10, sunaz: 107.70, sunalt: 40, Rad1h: 1924, wcc: 0, rr1c: 0.00, temp: 30)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 114, hod: 10, Rad1h: 1924, pvfc: 10170 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 11
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 11, Rad1h: 2403, pvfc: 10293 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 12
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 11700
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 11190
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 11445 (hod: 12, sunaz: 142.00, sunalt: 55, Rad1h: 2750, wcc: 0, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 99, hod: 12, Rad1h: 2750, pvfc: 11445 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 13
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 13, Rad1h: 2925, pvfc: 12367 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 14
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 10880
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 10880
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 10880 (hod: 14, sunaz: 193.70, sunalt: 60, Rad1h: 2622, wcc: 0, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 103, hod: 14, Rad1h: 2622, pvfc: 10880 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 15
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 15, Rad1h: 2678, pvfc: 10666 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 16
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 16, Rad1h: 2395, pvfc: 10203 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 17
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 17, Rad1h: 1998, pvfc: 7384 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 18
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 5380
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 5380
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 5380 (hod: 18, sunaz: 264.80, sunalt: 30, Rad1h: 1436, wcc: 0, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 110, hod: 18, Rad1h: 1436, pvfc: 5380 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 19
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 19, Rad1h: 834, pvfc: 2377 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 20
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 1310
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 1310
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 1310
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 1310 (hod: 20, sunaz: 286.80, sunalt: 10, Rad1h: 292, wcc: 0, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 239, hod: 20, Rad1h: 292, pvfc: 1310 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 21
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 50
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 50 (hod: 21, sunaz: 294.10, sunalt: 0, Rad1h: 14, wcc: 0, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 109, hod: 21, Rad1h: 14, pvfc: 50 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 22
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 22, Rad1h: 1, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 23, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 24
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 24, Rad1h: 1, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 01, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 02, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 03, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 04
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 04, Rad1h: 2, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 05, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 06
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 06, Rad1h: 13, pvfc: 38 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 07
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 07, Rad1h: 257, pvfc: 1094 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 08
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 3930
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 2: 3930
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 3930
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 3930 (hod: 08, sunaz: 84.20, sunalt: 20, Rad1h: 755, wcc: 0, rr1c: 0.00, temp: 25)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 113, hod: 08, Rad1h: 755, pvfc: 3930 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 09
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 09, Rad1h: 1335, pvfc: 6234 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 10
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 10, Rad1h: 1892, pvfc: 8788 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 11
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 11, Rad1h: 2370, pvfc: 10154 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 12
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 12, Rad1h: 2700, pvfc: 11294 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 13
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 13, Rad1h: 2876, pvfc: 12122 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 14
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 1: 12550
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 9780
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 11165 (hod: 14, sunaz: 193.60, sunalt: 60, Rad1h: 2898, wcc: 28, rr1c: 0.00, temp: 35)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 98, hod: 14, Rad1h: 2898, pvfc: 11165 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 15
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 15, Rad1h: 2700, pvfc: 9699 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 16
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 16, Rad1h: 2290, pvfc: 8889 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 17
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 17, Rad1h: 1768, pvfc: 5784 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 18
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 18, Rad1h: 1256, pvfc: 4916 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 19
2026.08.04 14:35:05 1: mySolarForecast DEBUG> got AI result from Tree number 3: 1340
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI accurate result found: pvaifc: 1340 (hod: 19, sunaz: 275.80, sunalt: 20, Rad1h: 598, wcc: 100, rr1c: 0.00, temp: 30)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI Hit - accurate result used -> aiRulesNum: 8423, variance: 57, hod: 19, Rad1h: 598, pvfc: 1340 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 20
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 20, Rad1h: 194, pvfc: 815 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI result check for hod: 21
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 21, Rad1h: 11, pvfc: 42 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 22, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 23, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> use PV from API (no AI or AI result tolerance overflow) -> hod: 24, Rad1h: 0, pvfc: 0 Wh
2026.08.04 14:35:05 1: mySolarForecast DEBUG> Start AI FANN consumption result check
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN - using profile: v1_heatpump_active_pv
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 14, hod: 15 -> AI=933, legacy=1368, final: 880 Wh (alpha=1, tot_corr=-53 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 15, hod: 16 -> AI=348, legacy=1185, final: 328 Wh (alpha=1, tot_corr=-20 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 16, hod: 17 -> AI=753, legacy=516, final: 710 Wh (alpha=1, tot_corr=-43 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 17, hod: 18 -> AI=638, legacy=356, final: 602 Wh (alpha=1, tot_corr=-36 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 18, hod: 19 -> AI=1140, legacy=332, final: 1075 Wh (alpha=1, tot_corr=-65 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 19, hod: 20 -> AI=362, legacy=297, final: 341 Wh (alpha=1, tot_corr=-21 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 20, hod: 21 -> AI=322, legacy=324, final: 179 Wh (alpha=1, tot_corr=-143 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 21, hod: 22 -> AI=361, legacy=305, final: 341 Wh (alpha=1, tot_corr=-21 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 22, hod: 23 -> AI=203, legacy=224, final: 66 Wh (alpha=1, tot_corr=-137 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 23, hod: 24 -> AI=199, legacy=216, final: 63 Wh (alpha=1, tot_corr=-136 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 00, hod: 01 -> AI=202, legacy=224, final: 202 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 01, hod: 02 -> AI=205, legacy=214, final: 205 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 02, hod: 03 -> AI=206, legacy=207, final: 206 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 03, hod: 04 -> AI=207, legacy=206, final: 207 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 04, hod: 05 -> AI=206, legacy=208, final: 206 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 05, hod: 06 -> AI=202, legacy=216, final: 202 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 06, hod: 07 -> AI=280, legacy=394, final: 139 Wh (alpha=1, tot_corr=-141 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 07, hod: 08 -> AI=516, legacy=376, final: 486 Wh (alpha=1, tot_corr=-29 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 08, hod: 09 -> AI=410, legacy=1046, final: 387 Wh (alpha=1, tot_corr=-23 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 09, hod: 10 -> AI=1085, legacy=1270, final: 1023 Wh (alpha=1, tot_corr=-62 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 10, hod: 11 -> AI=1358, legacy=1672, final: 1281 Wh (alpha=1, tot_corr=-77 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 11, hod: 12 -> AI=1523, legacy=950, final: 1437 Wh (alpha=1, tot_corr=-87 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 12, hod: 13 -> AI=2234, legacy=2149, final: 2107 Wh (alpha=1, tot_corr=-127 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 13, hod: 14 -> AI=1443, legacy=1898, final: 1361 Wh (alpha=1, tot_corr=-82 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 14, hod: 15 -> AI=1823, legacy=1368, final: 1719 Wh (alpha=1, tot_corr=-104 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 15, hod: 16 -> AI=767, legacy=1185, final: 723 Wh (alpha=1, tot_corr=-44 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 16, hod: 17 -> AI=872, legacy=516, final: 823 Wh (alpha=1, tot_corr=-50 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 17, hod: 18 -> AI=1383, legacy=356, final: 1304 Wh (alpha=1, tot_corr=-79 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 18, hod: 19 -> AI=999, legacy=332, final: 942 Wh (alpha=1, tot_corr=-57 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 19, hod: 20 -> AI=927, legacy=297, final: 875 Wh (alpha=1, tot_corr=-53 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 20, hod: 21 -> AI=345, legacy=324, final: 325 Wh (alpha=1, tot_corr=-20 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 21, hod: 22 -> AI=296, legacy=305, final: 154 Wh (alpha=1, tot_corr=-142 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 22, hod: 23 -> AI=244, legacy=224, final: 105 Wh (alpha=1, tot_corr=-139 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-05 23, hod: 24 -> AI=174, legacy=216, final: 39 Wh (alpha=1, tot_corr=-135 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 00, hod: 01 -> AI=202, legacy=224, final: 202 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 01, hod: 02 -> AI=226, legacy=214, final: 226 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 02, hod: 03 -> AI=299, legacy=207, final: 299 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=3/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 03, hod: 04 -> AI=356, legacy=206, final: 356 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=-/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 04, hod: 05 -> AI=318, legacy=208, final: 318 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=-/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 05, hod: 06 -> AI=350, legacy=216, final: 350 Wh (alpha=1, tot_corr=0 Wh, bias/drift zone=-/-)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 06, hod: 07 -> AI=300, legacy=394, final: 158 Wh (alpha=1, tot_corr=-142 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 07, hod: 08 -> AI=537, legacy=376, final: 506 Wh (alpha=1, tot_corr=-31 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 08, hod: 09 -> AI=2079, legacy=1046, final: 1960 Wh (alpha=1, tot_corr=-118 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 09, hod: 10 -> AI=1335, legacy=1270, final: 1259 Wh (alpha=1, tot_corr=-76 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 10, hod: 11 -> AI=2872, legacy=1672, final: 2708 Wh (alpha=1, tot_corr=-164 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 11, hod: 12 -> AI=2638, legacy=950, final: 2487 Wh (alpha=1, tot_corr=-150 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 12, hod: 13 -> AI=1893, legacy=2149, final: 1785 Wh (alpha=1, tot_corr=-108 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 13, hod: 14 -> AI=1461, legacy=1898, final: 1377 Wh (alpha=1, tot_corr=-83 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 14, hod: 15 -> AI=1978, legacy=1368, final: 1866 Wh (alpha=1, tot_corr=-113 Wh, bias/drift zone=-/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 15, hod: 16 -> AI=1476, legacy=1185, final: 1391 Wh (alpha=1, tot_corr=-84 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 16, hod: 17 -> AI=1115, legacy=516, final: 1052 Wh (alpha=1, tot_corr=-64 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 17, hod: 18 -> AI=2120, legacy=356, final: 1999 Wh (alpha=1, tot_corr=-121 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 18, hod: 19 -> AI=788, legacy=332, final: 743 Wh (alpha=1, tot_corr=-45 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 19, hod: 20 -> AI=797, legacy=297, final: 752 Wh (alpha=1, tot_corr=-45 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 20, hod: 21 -> AI=351, legacy=324, final: 331 Wh (alpha=1, tot_corr=-20 Wh, bias/drift zone=-/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 21, hod: 22 -> AI=212, legacy=305, final: 75 Wh (alpha=1, tot_corr=-137 Wh, bias/drift zone=3/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 22, hod: 23 -> AI=210, legacy=224, final: 73 Wh (alpha=1, tot_corr=-137 Wh, bias/drift zone=3/3)
2026.08.04 14:35:06 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-06 23, hod: 24 -> AI=196, legacy=216, final: 60 Wh (alpha=1, tot_corr=-136 Wh, bias/drift zone=3/3)

Wenn ich es richtig interpretiere, sind das die relevanten Zeilen:
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 22, hod: 23 -> AI=203, legacy=224, final: 66 Wh (alpha=1, tot_corr=-137 Wh, bias/drift zone=3/3)
2026.08.04 14:35:05 1: mySolarForecast DEBUG> AI FANN con fc - 2026-08-04 23, hod: 24 -> AI=199, legacy=216, final: 63 Wh (alpha=1, tot_corr=-136 Wh, bias/drift zone=3/3)
Sehe ich das richtig, dass die KI eigentlich 203 bzw. 199 Wh vorhersagt (legacy wären 224 bzw. 216 Wh), diese Werte aber dann noch irgendwie mit den Drift-Werten "verwurschtet" werden, sodass sich am Ende die 66 bzw. 63 Wh ergeben?

Wie ist da die Logik dahinter?
Ich vermute, dass die aufgezeichneten Realverbräuche zwischen 22 und 24 Uhr eine sehr geringe Varianz aufweisen (jedenfalls deutlich unter den 136 bzw. 137 Wh), woher kommen diese Korrekturwerte?
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

TheTrumpeter

Bei der Gelegenheit fände ich es gut, wenn VOR den Ausgaben im Log-File zu den Such/Lösch-Vorgängen auch noch der aufgerufene Befehl (bzw. zumindest die Parameter) ausgegeben werden. Dann könnte man nachträglich leichter nachvollziehen wonach man gesucht bzw. was man gelöscht hat.
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

DS_Starter

#6789
ZitatSehe ich das richtig, dass die KI eigentlich 203 bzw. 199 Wh vorhersagt (legacy wären 224 bzw. 216 Wh), diese Werte aber dann noch irgendwie mit den Drift-Werten "verwurschtet" werden, sodass sich am Ende die 66 bzw. 63 Wh ergeben?

Wie ist da die Logik dahinter?
Ja, das ist richtig.
In den späten Abendstunden ist der tatsächliche Verbrauch vergleichsweise niedrig gegenüber den Tagesstunden und stark von zufälligem Nutzerverhalten abhängig (Standby-Geräte, kurze Gerätezyklen, keine feste Routine usw.). Das System hat in der Vergangenheit gelernt, dass die KI-Prognose gerade in diesem Bereich tendenziell zu hoch liegt, und korrigiert deshalb automatisch stärker nach unten. Da der Grundwert selbst schon klein ist (~200 Wh), wirkt die Korrektur prozentual dramatisch – in absoluten Wh ist sie aber ganz normal begrenzt (auf maximal den durchschnittlichen Vorhersagefehler des Modells). Es handelt sich also nicht um einen Fehler, sondern um eine bewusst vorsichtige Reaktion des Systems auf einen strukturell schwer vorhersagbaren Verbrauchsbereich.

Auffällig ist aber der Punkt: drift_zone=3 ist hier über den gesamten Forecast-Lauf konstant (nicht pro Stunde unterschiedlich wie bias_zone) – es ist eine globale Modellbewertung.
Dass sie direkt nach frischem Training schlecht ausfällt - du schreibst ja du hast frisch trainiert - irritiert.


Kannst du bitte einen Screenshot der KI-Metriken inkl. der Driftkennzahl posten?
Und aktiviere bitte ctrlDebug=aiProcess. Im Log werden zur vollen Stunde Auswertungen der Drift geschrieben. Lass das bis morgen laufen und poste dann die stündlichen Ausgaben. Besonders interessant werden dann die relevanten Abendstunden sein.

2026.08.04 17:00:06.320 1: SolCast DEBUG> DRIFT [con]: Flag=mild | WindowSize=144 | Block=0 | SlopeLive=0.189 | DriftSlope=0.222 | BiasLive=554.05 | DriftBias=-19.78 | RMSErelLive=49.4 | RMSErelRatio=1.90 | BiasVarNorm=0.20 | DriftIndex=1.55 | DriftScore=1.09 | Zone3Hours=4 | Zone3Reset=0 | Hist=[mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild,mild] | Retrain=none (-)


ZitatBei der Gelegenheit fände ich es gut, wenn VOR den Ausgaben im Log-File zu den Such/Lösch-Vorgängen auch noch der aufgerufene Befehl (bzw. zumindest die Parameter) ausgegeben werden. Dann könnte man nachträglich leichter nachvollziehen wonach man gesucht bzw. was man gelöscht hat.
Das lässt sich sicherlich machen.
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