76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

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

Vorheriges Thema - Nächstes Thema

300P

Zitat von: DS_Starter am 01 Januar 2026, 18:32:56Zur Zeit fehlt zum Bsp. der Anwesenheitsindikator der aktuell 0 sein müsste und demzufolge weniger Verbrauch indiziert wäre.

Das wäre bei mir (und evtl. anderen) ja schon vorhanden :)
(Fritzbox mit PRESENCE - hier Netzwerkweit über mehrere Fritzboxen)

defmod Handy_XY PRESENCE function {checkAllFritzMACpresent("xy:xy:xy:xy:xy:xy")} 60 60
attr Handy_XY event-min-interval presence:900
attr Handy_XY event-on-change-reading presence
attr Handy_XY group Anwesenheit
attr Handy_XY room Presence
Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast|DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP|ESP32-Digitizer-AI_on_the_Edge|ESP32CAM usw.

lorisurfen

#4681
Hallo zusammen,
ich habe meine Anlage (Plenticore 23kW-Peak mit Varta family Speicher 6kWh) in SF konfiguriert und möchte nun 2 consumer mit folgender Prio ansteuern
Prio1 Batteriespeicher soll spätestens bis Sonnenuntergang voll sein
Prio2 consumer01: Heizstab 3 kWh
Prio3 consumer02: Elektroheizung 1 kWh (Shelly)

SF schaltet consumer0x nach meinem Verständnis wenn Current_Surplus>power ist, bezüglich Prio1 würde ich also von Current_Surplus Current_PowerBatIn_01 abziehen, damit erst die Batterie geladen wird:
Ist die nachfolgende Implementierung so sinvoll oder gibt es eine einfachere Lösung über SF ?

Frage2: Wenn der Überschuss 1-2,9 kWh ist (also zuwenig Überschuss für consumer01), wird dann der consumer02 trotzdem angeschaltet obwohl consumer01 aus ist? Falls nicht wie könnte ich das über SF lösen, also wenn Überschuss < 3kWh, consumer02 angeschalten wird?

Shelly_EG_3 type=heater power=3000 icon=IR pcurr=power:W etotal=energy:Wh mode=can mintime=SunPath on=on off=off interruptable=1 swoncond=calcEnergieManager:sf_true:{main::Check_swoncond}sub
Check_swoncond{
my $consumer_id = sprintf "%02d", 1;
my $nom_power = FHEM::SolarForecast::ConsumerVal("SF01", $consumer_id, 'power', '');
my $SF01_Current_Surplus = ReadingsVal("SF01","Current_Surplus",0);
($SF01_Current_Surplus) = split(/\s+/, $SF01_Current_Surplus);
my $SF01_BatIn = ReadingsVal("SF01","Current_PowerBatIn_01",0);
($SF01_BatIn) = split(/\s+/, $SF01_BatIn);
my $surplusMinBat = $SF01_Current_Surplus - $SF01_BatIn;
if($surplusMinBat>$nom_power) {
        Log 3, "Check_swoncond: surplusMinBat=$surplusMinBat -> return 1";
return 1;}
else {
        Log 3, "check swoncond Surplus: $SF01_Current_Surplus BatIn $SF01_BatIn surplusMinBat: $surplusMinBat -> return 0 nomPower: $nom_power";
return 0;}
}

Danke und LG
Markus

DS_Starter

@Dieter,

Zitatsag mal, (wie) kann man denn mit einer Instanz von SolarForecast zwischen der alten und der neuen KI-basierten Verbrauchsprognose wechseln - oder macht das keinen Sinn?
Ja, kann man und macht durchaus Sinn (vor allem in der Test/Findungsphase) bzw. ist nicht schädlich.
Dazu einfach von:

 attr <Name> aiControl aiConActivate=1
nach

 attr <Name> aiControl aiConActivate=2
wechseln wie jetzt im Wiki beschrieben.

Oder als 2. Variante mit dem

 attr <Name> aiControl aiConAlpha <Wert>
die Gewichtung zwischen 0 und 1 wechseln.


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

300P

Zitat von: DS_Starter am 01 Januar 2026, 18:32:56Im contrib befindet sich ein Update der 2.0.0.
Hauptaugenmerk liegt auf FANN.

Rückmeldung :
CPU beim RPI4 so um die 50-60 % ausgelastet beim Training
(normal waren es bislang so 20-30 %

"falsche" Fehlermeldung (Ist ja eigentlich Standardeinstellung)
The key 'aiConHiddenLayers=80‑40‑20' is not specified correctly. Please refer to the command reference.hab den Eintrag erst einmal außen vor gelassen.


attr-Eintrag:
aiTrainStart=3
aiStorageDuration=3600
aiTreesPV=30
aiConActivate=1
aiConAlpha=1
aiConHiddenLayers=80‑40‑20
aiConTrainStart=3:2
aiConActFunc=GAUSSIAN
aiConLearnRate=0.001
aiConMomentum=0.7
aiConShuffleMode=1
aiConShufflePeriod=10
aiConSteepness=0.9
aiConTrainAlgo=RPROP

Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast|DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP|ESP32-Digitizer-AI_on_the_Edge|ESP32CAM usw.

DS_Starter

#4684
@300P,

ZitatThe key 'aiConHiddenLayers=80‑40‑20' is not specified correctly.
Das ist putzig. Wenn ich diesen Teil aus deiner Meldung herauskopiere, wird tatsächlich gemeckert. Nehme ich aiConHiddenLayers mit Copy/Paste aus der Onlinehilfe und ergänze =80-40-20 klappt es wie gewohnt. Da ist irgendein Steuerzeichen drin.

CPU Auslastung bei Training wird es geben. Nicht wundern. Da geht es rund.
FANN ist eine C-Bibliothek für neuronale Netze. Wen es interessiert, kann sich auch mal Optimierungsstrategien anschauen: https://leenissen.dk/fann/wp/optimizing-your-fann-models-tips-and-tricks-for-improved-performance/. Nicht alles ist momentan über SF einstellbar. Man verrennt sich auch schnell.

ZitatDas wäre bei mir (und evtl. anderen) ja schon vorhanden :)
Bei mir auch, aber es fehlt ja die Integration und Werthaltung in SF. Alles noch zu  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

grappa24

Zitat von: 300P am 31 Dezember 2025, 16:37:38
Zitat von: grappa24 am 31 Dezember 2025, 16:03:09Cause: Perl Modul AI::FANN is missing
Versuch es mal so in der Reihenfolge - bei meinem RPI4 hat es so geklappt.
sudo su
apt-get update && apt-get upgrade
sudo apt-get install gcc
sudo apt-get install libfann-dev
sudo cpan AI::FANN
Damit läuft jetzt mein AI::FANN  ;) und die neue KI ist am Trainieren  :D

Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

DS_Starter

Hallo lorisurfen,

erstmal willkommen im Club.  :)

Es ist heute schon spät und dein Anliegen wahrscheinlich nicht ganz schnell abzuarbeiten.

ZitatSF schaltet consumer0x nach meinem Verständnis wenn Current_Surplus>power ist, bezüglich Prio1 würde ich also von Current_Surplus Current_PowerBatIn_01 abziehen, damit erst die Batterie geladen wird:
Ist die nachfolgende Implementierung so sinvoll oder gibt es eine einfachere Lösung über SF ?
....
Prio1 Batteriespeicher soll spätestens bis Sonnenuntergang voll sein
Prio2 consumer01: Heizstab 3 kWh
Prio3 consumer02: Elektroheizung 1 kWh (Shelly)
Grundsätzlich kannst du im attr ... plantControl->batteryPreferredCharge=X vorgeben, dass deine Batterie bis zu X% geladen sein muß bevor Consumer geschaltet werden dürfen:

batteryPreferredCharge    Verbraucher mit dem Mode can werden erst dann eingeschaltet, wenn die angegebene Batterieladung (%) erreicht ist.
    Verbraucher mit dem Mode must beachten die Vorrangladung der Batterie nicht.
    Wert: Ganzzahl 0..100, default: 0


Beachte die Einschränkung bei must.
Damit die Bat so schnell wie möglich voll wird, bietet sich an ctrlBatSocManagementXX->loadStrategy=loadRelease (der default) zu nutzen. Zur Batteriesteuerung gibt es jede Menge Lesestoff im Wiki.

Wenn man eine eigene Steuerung verwenden möchte kann man mit CurrentVal den Wert "batsoctotal" auslesen und wenn er unter einem Wunschwert ist die Consumersteuerung solange blockieren. Eine einfache Variante ist z.B. das Reading des Schlüssels "auto" in den Consumern zu nutzen. Einfach 1 oder 0 setzen per Script und durch SF auswerten lassen:

auto    Reading im Verbraucherdevice welches das Schalten des Verbrauchers freigibt bzw. blockiert (optional)
    Ist der Schlüssel switchdev angegeben, wird das Reading in diesem Device gesetzt und ausgewertet.
    Readingwert = 1 - Schalten freigegeben (default), 0: Schalten blockiert

ZitatFrage2: Wenn der Überschuss 1-2,9 kWh ist (also zuwenig Überschuss für consumer01), wird dann der consumer02 trotzdem angeschaltet obwohl consumer01 aus ist?
Ja, wird gemacht. Die Consumer sind voneinander nicht abhängig. Die Prio ist "locker". Erst wird Consumer01 abgearbeitet. Kann er nicht geschaltet werden (gibt viele Gründe dafür), kommt Consumer2 an die Reihe usw.

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

ZitatDamit läuft jetzt mein AI::FANN  ;) und die neue KI ist am Trainieren  :D
Kannst gern mal einen Logauszug vom Training posten. Interessiert mich wie es in anderen System läuft.
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

grappa24

hier mein Log der ersten Minuten KI-Training:
2026.01.01 23:23:44 1: solErtrag DEBUG> AI FANN Training for Consumption Forecast BlockingCall PID "5934" with Timeout 86400 s started
2026.01.01 23:23:48 1: solErtrag DEBUG> AI FANN - There are 5302 Records skipped due to incomplete or invalid data. Index:
   <skipped records>
2026.01.01 23:23:51 1: solErtrag - DBG F[7914]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7915]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7916]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7917]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7918]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7919]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7920]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7921]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7922]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7923]: lag1=0.000 lag2=0.000 lag24=0.001 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7924]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7925]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7926]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7927]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7928]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7929]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7930]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7931]: lag1=0.001 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7932]: lag1=0.000 lag2=0.001 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7933]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag DEBUG> First attempt 0 with Seed=383712
2026.01.01 23:23:51 1: solErtrag DEBUG> AI FANN Training started with Params:
num input datasets=7928,
training algo=FANN_TRAIN_INCREMENTAL,
output AF=LINEAR,
hidden AF=SIGMOID,
hidden Neurons=50,25,
hidden steepness=0.9,
Epoches=15000,
mse_error=0.001,
learning rate=0.00500,
learning momentum=0.5,
Data sharing=split after shuffle of training data and use AI internal shuffle (Train=6342, Test=1585),
Data shuffle=2 (period=10)
2026.01.01 23:23:52 1: solErtrag DEBUG> Epoche 1: Train MSE=0.000127, Val MSE=0.000001, Val MAE=0.000659, Val MedAE=0.000560, Bit_Fail=0 -> Snap saved (bit improved)
2026.01.01 23:25:32 1: solErtrag DEBUG> Epoche 100: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000441, Val MedAE=0.000323, Bit_Fail=0
2026.01.01 23:27:18 1: solErtrag DEBUG> Epoche 200: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000477, Val MedAE=0.000385, Bit_Fail=0
2026.01.01 23:29:06 1: solErtrag DEBUG> Epoche 300: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000451, Val MedAE=0.000376, Bit_Fail=0
2026.01.01 23:30:50 1: solErtrag DEBUG> Epoche 400: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000434, Val MedAE=0.000364, Bit_Fail=0
2026.01.01 23:32:34 1: solErtrag DEBUG> Epoche 500: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000444, Val MedAE=0.000376, Bit_Fail=0
2026.01.01 23:34:19 1: solErtrag DEBUG> Epoche 600: Train MSE=0.000127, Val MSE=0.000000, Val MAE=0.000446, Val MedAE=0.000365, Bit_Fail=0
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

DS_Starter

Interesse halber .... hast du einen recht gleichmäßigen Stundenverbrauch? und wie hoch etwa?
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

grappa24

#4690
gleichmäßiger Stundenverbrauch: Würde ich schon sagen, aktuell ja

Allerdings hab ich wegen des updates buster->bullseye mein System vor drei Tagen um eine Woche "zurückgesetzt", so krass gleichmäßig war es vorher nicht.

Um 19:00 Uhr heute, das war die Spülmaschine  ;) Unsere Spitzen liegen täglich so gegen 9:00 und 12:00 Uhr.
Laden des PHEV kommt später noch dazu,
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

DS_Starter

#4691
Ja, mit den (vermutlich) typischen Hochs zu Mittag / Früh / Abends. Es sieht eigentlich aus wie bei mir.
Das NN würde z.B. die Verbrauchsspitzen als Ausreißer identifizieren wenn ihm keine weitere semantische Verknüpfung wie z.B. es ist "hoch & Mittag" oder "hoch und PV Ertrag" usw. Diese Verknüpfungen habe ich die letzte Zeit eingearbeitet. Bin gespannt. Da ist sicherlich noch einiges zu tun.

ZitatUm 19:00 Uhr heute, das war die Spülmaschine
Ja das ist so ein Punkt. Wenn es keine weitere Semantik gibt, kann FANN nicht viel damit anfangen außer dem zeitlichen Zusammnhang,der aber eigentlich rein zufällig ist. Solche Sachen wie Anwesenheit zu Hause wäre dann noch eine Semantik.

ZitatLaden des PHEV kommt später noch dazu,
Das wird noch spannend. Wenn die Marschrichtung passt, werde ich bald bei den Consumer einen EV Typ einbauen, damit wir die wesentlichen Kennwerte wie aktuelle Batterieladung erfassen können -> ein Sematikpunkt zu einem Ladeevent.

ZitatAllerdings hab ich wegen des updates buster->bullseye mein System vor drei Tagen um eine Woche "zurückgesetzt"
Was mich auch wundert ist die außerordentlich hohe Anzahl von invaliden Datensätzen -> There are 5302 Records skipped. Ich meine kann schon sein wenn es viele alte Daten in valDecTree->aiRawData aus der Anfangszeit gibt wo benötigte Trainingsdaten fehlen.
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

#4692
Ein Indiz, dass Triggerpunkte fehlen, ist dieser Logteil:

2026.01.01 23:23:51 1: solErtrag - DBG F[7914]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7915]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7916]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7917]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7918]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7919]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7920]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7921]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7922]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7923]: lag1=0.000 lag2=0.000 lag24=0.001 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7924]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7925]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7926]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7927]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7928]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7929]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7930]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.000 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7931]: lag1=0.001 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7932]: lag1=0.000 lag2=0.001 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 23:23:51 1: solErtrag - DBG F[7933]: lag1=0.000 lag2=0.000 lag24=0.000 d1p=0.000 d1n=0.000 rollstd=0.001 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0

Wenn du mit meinem Auszug vergleichst:

2026.01.01 18:04:05.592 1: SolCast - DBG F[7920]: lag1=0.055 lag2=0.064 lag24=0.059 d1p=0.003 d1n=0.000 rollstd=0.022 up=0 down=0 upS=0.003 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.593 1: SolCast - DBG F[7921]: lag1=0.057 lag2=0.055 lag24=0.056 d1p=0.005 d1n=0.000 rollstd=0.010 up=1 down=0 upS=0.005 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.593 1: SolCast - DBG F[7922]: lag1=0.060 lag2=0.057 lag24=0.060 d1p=0.000 d1n=0.009 rollstd=0.007 up=0 down=1 upS=0.000 downS=0.009 vol=0 pvX=0 break=0
2026.01.01 18:04:05.593 1: SolCast - DBG F[7923]: lag1=0.054 lag2=0.060 lag24=0.051 d1p=0.000 d1n=0.004 rollstd=0.007 up=0 down=0 upS=0.000 downS=0.004 vol=0 pvX=0 break=0
2026.01.01 18:04:05.594 1: SolCast - DBG F[7924]: lag1=0.051 lag2=0.054 lag24=0.047 d1p=0.000 d1n=0.001 rollstd=0.010 up=0 down=0 upS=0.000 downS=0.001 vol=0 pvX=0 break=0
2026.01.01 18:04:05.594 1: SolCast - DBG F[7925]: lag1=0.051 lag2=0.051 lag24=0.063 d1p=0.006 d1n=0.000 rollstd=0.006 up=1 down=0 upS=0.006 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.595 1: SolCast - DBG F[7926]: lag1=0.055 lag2=0.051 lag24=0.056 d1p=0.013 d1n=0.000 rollstd=0.006 up=1 down=0 upS=0.013 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.595 1: SolCast - DBG F[7927]: lag1=0.063 lag2=0.055 lag24=0.054 d1p=0.000 d1n=0.009 rollstd=0.011 up=0 down=1 upS=0.000 downS=0.009 vol=0 pvX=0 break=0
2026.01.01 18:04:05.595 1: SolCast - DBG F[7928]: lag1=0.057 lag2=0.063 lag24=0.065 d1p=0.000 d1n=0.000 rollstd=0.010 up=0 down=0 upS=0.000 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.596 1: SolCast - DBG F[7929]: lag1=0.058 lag2=0.057 lag24=0.047 d1p=0.000 d1n=0.002 rollstd=0.010 up=0 down=0 upS=0.000 downS=0.002 vol=0 pvX=0 break=0
2026.01.01 18:04:05.596 1: SolCast - DBG F[7930]: lag1=0.056 lag2=0.058 lag24=0.053 d1p=0.000 d1n=0.007 rollstd=0.008 up=0 down=1 upS=0.000 downS=0.007 vol=0 pvX=0 break=0
2026.01.01 18:04:05.597 1: SolCast - DBG F[7931]: lag1=0.052 lag2=0.056 lag24=0.060 d1p=0.004 d1n=0.000 rollstd=0.007 up=0 down=0 upS=0.004 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.597 1: SolCast - DBG F[7932]: lag1=0.054 lag2=0.052 lag24=0.036 d1p=0.000 d1n=0.011 rollstd=0.007 up=0 down=1 upS=0.000 downS=0.011 vol=0 pvX=0 break=0
2026.01.01 18:04:05.598 1: SolCast - DBG F[7933]: lag1=0.048 lag2=0.054 lag24=0.052 d1p=0.025 d1n=0.000 rollstd=0.008 up=1 down=0 upS=0.025 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.598 1: SolCast - DBG F[7934]: lag1=0.063 lag2=0.048 lag24=0.052 d1p=0.000 d1n=0.005 rollstd=0.013 up=0 down=1 upS=0.000 downS=0.005 vol=0 pvX=0 break=0
2026.01.01 18:04:05.598 1: SolCast - DBG F[7935]: lag1=0.060 lag2=0.063 lag24=0.064 d1p=0.000 d1n=0.012 rollstd=0.014 up=0 down=1 upS=0.000 downS=0.012 vol=0 pvX=0 break=0
2026.01.01 18:04:05.599 1: SolCast - DBG F[7936]: lag1=0.053 lag2=0.060 lag24=0.059 d1p=0.007 d1n=0.000 rollstd=0.015 up=1 down=0 upS=0.007 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.599 1: SolCast - DBG F[7937]: lag1=0.057 lag2=0.053 lag24=0.061 d1p=0.000 d1n=0.013 rollstd=0.014 up=0 down=1 upS=0.000 downS=0.013 vol=0 pvX=0 break=0
2026.01.01 18:04:05.600 1: SolCast - DBG F[7938]: lag1=0.049 lag2=0.057 lag24=0.045 d1p=0.007 d1n=0.000 rollstd=0.017 up=1 down=0 upS=0.007 downS=0.000 vol=0 pvX=0 break=0
2026.01.01 18:04:05.600 1: SolCast - DBG F[7939]: lag1=0.053 lag2=0.049 lag24=0.065 d1p=0.014 d1n=0.000 rollstd=0.013 up=1 down=0 upS=0.014 downS=0.000 vol=0 pvX=0 break=0

ist bei mir deutlich mehr Dynamik drin. Das könnte im Ergebnis zu einer recht "flachen" Prognose führen. Warten wir es ab.

Es kann auch sein, dass die im Jahresverlauf deutliche Verbrauchshochs im Netz hast. Also im Normalfall wie in der Grafik zu sehen, dann aber vllt. Stundenverbräuche von 15000 Wh o.ä.?
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

Moin,

meine Verbrauchsprognose läuft jetzt komplett KI basiert wie im Anhang.
Die Kennzahlen sind noch nicht so berauschend. Es gibt mit Sicherheit noch Potential zu heben:
 
 get ... valDecTree aiNeuralNetConState

letztes KI-Training: 01.01.2026 18:26:00 / Laufzeit in Sekunden: 1316
KI Abfragestatus: ok
letzte KI-Ergebnis Generierungsdauer: 9.97 ms

=== Modellparameter ===

Normierungsgrenzen: PV=9276 W, Hausverbrauch: Min=0 W / Max=8938 W
Trainingsdaten: 7934 Datensätze (Training=6347, Validierung=1587)
Architektur: Inputs=34, Hidden Layers=80-40-20, Outputs=1
Hyperparameter: Learning Rate=0.005, Momentum=0.5, BitFail-Limit=0.35
Aktivierungen: Hidden=SIGMOID, Steilheit=0.9, Output=LINEAR
Zufallsgenerator: Mode=2, Periode=10

=== Trainingsmetriken ===

bestes Modell bei Epoche: 1231 (von max. 15000)
Training MSE: 0.000185
Validation MSE: 0.000282
Validation MSE Average: 0.000288
Validation MSE Standard Deviation: 0.000004
Validation Bit_Fail: 0
Model Bias: 109 Wh
Model Slope: 0.8
Trainingsbewertung: Retrain

=== Fehlermaße der Prognosen ===

MAE: 96.26 Wh
MedAE: 61.31 Wh
RMSE: 150.17 Wh
RMSE relative: 24 %
RMSE Rating: weak
MAPE: 15.51 %
MdAPE: 9.06 %
R²: 0.89
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

grappa24

letztes KI-Training: 02.01.2026 01:45:11 / Laufzeit in Sekunden: 8484
KI Abfragestatus: ok
letzte KI-Ergebnis Generierungsdauer: 69.16 ms

=== Modellparameter ===

Normierungsgrenzen: PV=13080 W, Hausverbrauch: Min=0 W / Max=3012497.8 W
Trainingsdaten: 7928 Datensätze (Training=6342, Validierung=1586)
Architektur: Inputs=34, Hidden Layers=50-25, Outputs=1
Hyperparameter: Learning Rate=0.005, Momentum=0.5, BitFail-Limit=0.35
Aktivierungen: Hidden=SIGMOID, Steilheit=0.9, Output=LINEAR
Zufallsgenerator: Mode=2, Periode=10

=== Trainingsmetriken ===

bestes Modell bei Epoche: 1 (von max. 15000)
Training MSE: 0.000125
Validation MSE: 0.000001
Validation MSE Average: 0.000000
Validation MSE Standard Deviation: 0.000000
Validation Bit_Fail: 0
Model Bias: 176 Wh
Model Slope: 0.2
Trainingsbewertung: Retrain

=== Fehlermaße der Prognosen ===

MAE: 2106.61 Wh
MedAE: 1938.61 Wh
RMSE: 2568.08 Wh
RMSE relative: 617 %
RMSE Rating: very bad
MAPE: 461.89 %
MdAPE: 381.75 %
R²: -12.47

=== Drift-Kennzahlen ===

Drift Score: -
Drift RMSE relative: -
Drift Bias: -
Drift Slope: -
Drift Bewertung: -

 Erläuterung der Kennzahlen
Train MSE / Validation MSE → wie gut das Netz trainiert und generalisiert. Daumenregel:
   MSE < 0.01 → sehr gut
   MSE 0.01–0.05 → gut
   MSE > 0.1 → schwach
   Interpretation Verhältnis Train MSE zu Validation MSE:
      Validation ≈ Train → gute Generalisierung
      Validation deutlich größer → Überfitting
      Validation kleiner → Validierungsdaten sind einfacher oder Split begünstigt

Validation Bit_Fail → Anzahl der Ausreißer

MAE (Mean Absolute Error) → mittlere absolute Abweichung in Wh. Richtwerte bei typischem Verbrauch 500–1500 Wh:
   < 100 Wh → sehr gut
   100–300 Wh → gut
   > 300 Wh → schwach

MedAE (Median Absolute Error) → Median der absoluten Fehler in Wh (toleriert einzelne Ausreißer besser)
   < 100 Wh → sehr gut
   100–200 Wh → gut
   200–300 Wh → mittelmäßig
   > 300 Wh → schwach

RMSE relative (Root Mean Squared Error) → mittlere quadratische Abweichung relativ zum Medianverbrauch in %
   Richtwerte:
   < 5% → sehr gut, das Modell trifft fast perfekt
   5–10% → gut, das Modell ist zuverlässig
   10–20% → akzeptabel, das Modell ist brauchbar
   > 20% → schwach, das Modell hat starke Ausreißer
   > 35% → katastrophal, das Modell ist unbrauchbar

MAPE (Mean Absolute Percentage Error) → relative Abweichung in %
   Richtwerte:
   < 10 % → sehr gut - Modell liegt fast immer sehr nah an den echten Werten
   10–20 % → gut - Prognosen sind solide, kleine Abweichungen sind normal
   20–30 % → mittelmäßig / akzeptabel - Modell ist brauchbar, aber nicht präzise – für grobe Trends ok
   > 30 % → schwach - Modell verfehlt die Werte deutlich, oft durch Ausreißer oder fehlende Features
   ⚠️ Vorsicht: bei kleinen Werten (<200 Wh) kann MAPE stark verzerren → MdAPE heranziehen

MdAPE (Median Absolute Percentage Error) → Median der prozentualen Fehler in % (robuster gegenüber kleinen Werten)
   Richtwerte:
   < 10 % → sehr gut
   10–20 % → gut
   20–30 % → mittelmäßig
   > 30 % → schwach

R² (Bestimmtheitsmaß) → Maß für die Erklärungskraft des Modells. Je näher R² an 1 liegt, desto besser.
   R² = 1.0 → perfekte Vorhersage, alle Punkte liegen exakt auf der Regressionslinie
   R² > 0.8 → sehr gut - Modell erfasst den Großteil der Streuung → sehr zuverlässige Prognosen
   R² = 0.6 – 0.8 → gut - Modell erklärt einen soliden Teil der Varianz → brauchbar für viele Anwendungen
   R² = 0.5–0.6 → mäßig / grenzwertig - Modell liegt knapp über ,,zufällig" → Muster erkannt, Prognosen nur eingeschränkt nützlich
   R² < 0.5 → schwach - Modell erklärt weniger als die Hälfte der Varianz → deutlicher Verbesserungsbedarf
   R² = 0.0 → Modell erklärt gar nichts, es ist nicht besser als der Mittelwert der Daten
   R² < 0.0 → Modell ist schlechter als einfach immer den Mittelwert vorherzusagen
   ⚠️ R² ist sehr empfindlich gegenüber Ausreißern und Varianz in den Daten.
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye