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 19 Mai 2026, 15:11:02@Peter, bitte nochmal aus dem contrib ziehen, sollte nun passen.

LG,
Heiko

Ja, sieht bei mir auch gut aus.  :)

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

300P

Zitat von: DS_Starter am 19 Mai 2026, 13:12:32@all,

wegen der AI Profilproblematik habe ich mich mit dem Profil v1_common_active_pv beschäftigt und einen Fehler gefunden und beseitigt.


Sicherheitsfrage:
"Gehe ich recht in der Annahme" das dies dann auch für
v1_heatpump_active_pv - Haushalt mit stärkerer Gewichtung der PV-Anlage, Wärmepumpe und starkem Tagesrhythmus
gilt wegen dem Ende des Namens .....active_pv  ::) ?

Gruß
300P

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

DS_Starter

ZitatSicherheitsfrage:
"Gehe ich recht in der Annahme" das dies dann auch für
v1_heatpump_active_pv
Nein, die fehlende Komponente betraf NUR v1_common_active_pv.
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

Gisbert

Zitat von: 300P am 19 Mai 2026, 18:28:52
Zitat von: DS_Starter am 19 Mai 2026, 13:12:32@all,

wegen der AI Profilproblematik habe ich mich mit dem Profil v1_common_active_pv beschäftigt und einen Fehler gefunden und beseitigt.


Sicherheitsfrage:
"Gehe ich recht in der Annahme" das dies dann auch für
v1_heatpump_active_pv - Haushalt mit stärkerer Gewichtung der PV-Anlage, Wärmepumpe und starkem Tagesrhythmus
gilt wegen dem Ende des Namens .....active_pv  ::) ?

Meine Beobachtung nach einigen Tagen mit "v1_heatpump_pv" ist, dass die Vorhersage für den nächsten Tag bei +66% über dem aktuellen Tag liegt. Ich hab jetzt einen Trainingslauf mit "v1_heatpump" durchgeführt. Das Ergebnis ist jetzt schon etwas besser bei +50% für den nächsten Tag. Die Wärmepumpe wird nicht abhängig von der PV-Vorhersage gesteuert. Im Gegensatz läuft sie hauptsächlich wegen der Trägheit der FBH nachts.

Ich beobachte das weiter und berichte ggf., wenn es sinnvoll erscheint.

Viele Grüße Gisbert

Proxmox | UniFiRHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF

300P

Statusmeldung 20:21 Uhr:

Da sind bei uns zufällig mal alle nicht den ganzen Tag zuhause anwesend und schon ist die ganze KI-Planung ist im "Eimer" :)

PV Abweichung fortlaufend: 32,4 %, gestern: -11,7 %    (hier 32,4 % zu wenig Ertrag - Regenwetter als Einflusfaktor)
CON Abweichung fortlaufend: 31,2 %, gestern: 2,3 %     (hier 31,2 % weniger Verbrauch als der Forecast sagt)
Gruß
300P

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

DS_Starter

Da hilft entweder nur zu Hause bleiben oder noch öfter wegfahren damit die KI endlich lernt was es bedeutet.  :D
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

Moin Heiko,

ich habe heute Morgen das Contrib-Update von Dienstag geladen und shutdown/restart von FHEM

2026.05.20 08:29:14 0: Featurelevel: 6.4
2026.05.20 08:29:14 0: Server started with 443 defined entities (fhem.pl:30992/2026-03-21 perl:5.036000 os:linux user:fhem pid:1993803)
2026.05.20 08:32:01 1: PERL WARNING: Argument "" isn't numeric in sprintf at (eval 12610) line 1.
2026.05.20 08:34:18 2: AttrTemplates: got 272 entries
2026.05.20 08:34:18 1: PERL WARNING: Use of uninitialized value $cakeyval in concatenation (.) or string at ./FHEM/76_SolarForecast.pm line 21034.

Das erste Auftreten hab ich in meinem "Trainingroutinen" übersehen... :-[
Insgesamt 2 x aufgetreten bislang
2026.05.18 15:01:35 1: Forecast DEBUG> AI FANN training data successfully written to file: ./FHEM/FhemUtils/NeuralNet_SolarForecast_Forecast
2026.05.18 15:01:35 1: Forecast DEBUG> AI FANN con Training BlockingCall PID '1664256' finished
2026.05.18 15:24:35 1: PERL WARNING: Use of uninitialized value $cakeyval in concatenation (.) or string at ./FHEM/76_SolarForecast.pm line 21019.
2026.05.18 15:24:44 1: Forecast DEBUG> AI FANN Training for Consumption Forecast BlockingCall PID "1672753" with Timeout 86400 s started
2026.05.18 15:24:45 1: Forecast DEBUG> AI FANN - Target-Norm: raw_max=6638, p99=4306, p99.5=5984, targmaxval=6970
Gruß
300P

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

DS_Starter

Moin,

@300P, das etwas mit deinen Definitionen graphicHeaderOwnspec zu tun. Da scheint etwas zu fehlen bzw. wird in einem Schlüssel nichts geliefert.
Kannst mal zeigen was du alles drin stehen hast.
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

dieter114

Moin Heiko,
wie lange muss das FC Modul eigentlich laufen bevor ein KI Training erfolgen kann?
Ich habe vor 2 Tagen alles resettet und neu gestartet.
Bei COn  kommt immer noch
The AI for forecasting con is not yet operational.
Cause: the neural network for consumption forecasting is just being trained

LG WDS
RPi II+III+V,OWX, HM Zisterne, MAPLESDuino(adv), ESPEasy, Tasmota, MQTT2Server, WU-Upload, TabletUI, Poolsteuerung fhem, Fronius, BYD Solaranlage

300P

Zitat von: DS_Starter am 20 Mai 2026, 09:14:25Kannst mal zeigen was du alles drin stehen hast.

Danke für den Hinweis - hier meine "kleine Einstellung"

#aktuelle Werte
Netz aktuell:Current_GridConsumption
Einspeisung aktuell:Current_GridFeedIn
Netz Heute bis jetzt:special_todayGridConsumption
Einspeisung Heute bis jetzt:special_todayGridFeedIn
#Verbrauch
Heute bis jetzt:special_todayConsumption
Heute erwartet:special_todayConsumptionForecastDay
Heute bis Sonnenuntergang:special_todayConForecastTillSunset
Heute bis Sonnenaufgang :special_conForecastTillNextSunrise
#
:
:
:
Sonnenuntergang bis Sonnenaufgang :special_conForecastComingNight
#PV
Heute bis jetzt:Today_PVreal
Heute erwartet:Today_PVforecast
Morgen erwartet:Tomorrow_PVforecast
Übermorgen erwartet:special_dayAfterTomorrowPVforecast
#Batterie Gesamt
Ladung aktuell:special_BatPowerIn_Sum
Entladung aktuell:special_BatPowerOut_Sum
Ladung heute:special_todayBatInSum
Entladung heute:special_todayBatOutSum
#Batterie01 | 02
Bat01-Ladeanforderung:Battery_ChargeRequest_01
Bat01-Ladung empfohlen:Battery_ChargeUnrestricted_01
Bat02-Ladeanforderung:Battery_ChargeRequest_02
Bat02-Ladung empfohlen:Battery_ChargeUnrestricted_02
#
MaxPVForecastTime:Today_MaxPVforecastTime
Bat01-Ladeabbruch empfohlen:Battery_ChargeAbort_01
 :
Bat02-Ladeabbruch empfohlen:Battery_ChargeAbort_02
#
Bat01-Ladung heute:special_todayBatIn_01
Bat01-Entladung heute:special_todayBatOut_01
Bat02-Ladung heute:special_todayBatIn_02
Bat02-Entladung heute:special_todayBatOut_02
#
Bat01-Ladeleistung aktuell:Current_PowerBatIn_01
Bat01-Entladeleistung aktuell:Current_PowerBatOut_01
Bat02-Ladeleistung aktuell:Current_PowerBatIn_02
Bat02-Entladeleistung aktuell:Current_PowerBatOut_02
#
Bat01-Ladestatus aktuell:Current_BatCharge_01
Bat01-Restapazität aktuell:Current_CapBat_01
Bat02-Ladestatus aktuell:Current_BatCharge_02
Bat02-Restapazität aktuell:Current_CapBat_02
#Settings
Autokorrektur:pvCorrectionFactor_Auto
Wetter:graphicShowWeather
History:graphicHistoryHour
ShowNight:graphicShowNight
#
Beam1:graphicBeam1Content
Beam2:graphicBeam2Content
Überschuss:Current_Surplus
Heater:userFn_HeaterManagement
#
Beam3:graphicBeam3Content
Beam4:graphicBeam4Content
Aussen-T:boiler_data_outdoortemp@MQTT_EMSwp
Set aiDecTree:aiDecTree
#
Beam5:graphicBeam5Content
Beam6:graphicBeam6Content
Debug:ctrlDebug
ContribUpdate:userFn_LoadContribcUpdate
#aiControl
Activate:aiControl->aiConActivate
Alpha:aiControl->aiConAlpha
TrainStart:aiControl->aiConTrainStart
:
#
ActFunc:aiControl->aiConActFunc
HiddenLayers:aiControl->aiConHiddenLayers
LearnRate:aiControl->aiConLearnRate
Momentum:aiControl->aiConMomentum
#
ShuffleMode:aiControl->aiConShuffleMode
ShufflePeriod:aiControl->aiConShufflePeriod
Steepness:aiControl->aiConSteepness
TrainAlgo:aiControl->aiConTrainAlgo
#
Profile:aiControl->aiConProfile
BitFailLimit:aiControl->aiConBitFailLimit
ConAbsOversample:aiControl->aiConAbsOversample
:
#Drift
Retrain Empfehlung:userFn_DriftRetrainRecommendation
:
:
:
#Test
Driftstatus:userFn_driftAmpel
:
:
CentralTask:special_runTimeCentralTask
#WP-Warmwasser
Temperatur aktuell:boiler_data_dhw_curtemp@MQTT_EMSwp
aktuelle max Stoptemperatur:boiler_data_dhw_settemp@MQTT_EMSwp
Programm:thermostat_data_dhw_modetype@MQTT_EMSwp
Mode:thermostat_data_dhw_mode@MQTT_EMSwp

Dazu noch sicherheitshalber meine UserReading:


Current_BatCharge999 {((ReadingsNum("SBS37","chargestatus",0) * 10 * ReadingsNum("SBS37","bat_rated_capacity",0))  + (ReadingsNum("SBS25_2","chargestatus",0) * 10 * ReadingsNum("SBS25_2","bat_rated_capacity",0))) / ( (ReadingsNum("SBS37","bat_rated_capacity",0) * 1000)  + (ReadingsNum("SBS25_2","bat_rated_capacity",0)*1000))*100},
Current_CapBat_01 {ReadingsNum("SBS37","bat_residual_cap",0)*1},
Current_CapBat_02 {ReadingsNum("SBS25_2","bat_residual_cap",0)*1},

user_presence {if(ReadingsVal("Handy_Guenter","state","") eq "present") {return "present"} elsif (ReadingsVal("Handy_Barbara","state","") eq "present") {return "present"} else {return 0}},

user_wpmodus {if(ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "heating") {return "heating"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "defrost") {return "defrost"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "hot water") {return "hotwater"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "off") {return "off"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "cooling") {return "cooling"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "pool") {return "pool"} elsif (ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "pool heating") {return "poolheating"} else {return 0}},

userFn_DriftBias,
userFn_DriftBiasLive,
userFn_DriftFlag,
userFn_DriftIndex,
userFn_DriftLastRecalTime,
userFn_DriftRefBias,
userFn_DriftRefSlope,
userFn_DriftRmseRelRatio,
userFn_DriftScore,
userFn_DriftSlope,
userFn_DriftSlopeLive,
userFn_DriftWindowsize,
userFn_ModelAgeHours,
userFn_RetrainReason,
userFn_RetrainRecommendation

und auch der zugehörige ctrlUserExitFn -Bereich

# BEGIN ############# Driftdaten ###################
{
  my $fanntyp = 'con';
 
  my $drift_window     = AiNeuralVal ($name, $fanntyp, 'DriftWindowSize',    '0');
  $drift_window          = (sprintf("%.2f", $drift_window));
  my $drift_score        = AiNeuralVal ($name, $fanntyp, 'DriftScore',         '0');
  $drift_score = (sprintf("%.2f", $drift_score));
  my $drift_index      = AiNeuralVal ($name, $fanntyp, 'DriftIndex',         '0');
  $drift_index = (sprintf("%.2f", $drift_index));
  my $drift_rmserel    = AiNeuralVal ($name, $fanntyp, 'DriftRmseRelRatio',  '0');
  $drift_rmserel = (sprintf("%.2f", $drift_rmserel));
  my $bias_ref         = AiNeuralVal ($name, $fanntyp, 'DriftRefBias',       '0');
  $bias_ref = (sprintf("%.2f", $bias_ref));
  my $drift_bias_live  = AiNeuralVal ($name, $fanntyp, 'DriftBiasLive',      '0');         
  $drift_bias_live = (sprintf("%.2f", $drift_bias_live));
  my $drift_bias       = AiNeuralVal ($name, $fanntyp, 'DriftBias',          '0');         
  $drift_bias = (sprintf("%.2f", $drift_bias));
  my $drift_flag       = AiNeuralVal ($name, $fanntyp, 'DriftFlag',          '0');
  ##$drift_flag = (sprintf("%.2f", $drift_flag));
  my $slope_ref        = AiNeuralVal ($name, $fanntyp, 'DriftRefSlope',      '0');
  $slope_ref = (sprintf("%.2f", $slope_ref));
  my $slope_live       = AiNeuralVal ($name, $fanntyp, 'DriftSlopeLive',     '0');         
  $slope_live = (sprintf("%.2f", $slope_live));
  my $drift_slope      = AiNeuralVal ($name, $fanntyp, 'DriftSlope',         '0');
  $drift_slope = (sprintf("%.2f", $drift_slope));
  my $model_age        = AiNeuralVal ($name, $fanntyp, 'ModelAgeHours',      'fresh_modell');
  $model_age = (sprintf("%.2f", $drift_slope));
  my $last_recaltm     = AiNeuralVal ($name, $fanntyp, 'DriftLastRecalTime', '0');
  $last_recaltm = (sprintf("%.2f", $last_recaltm));
  my $drift_retrecomd  = AiNeuralVal ($name, $fanntyp, 'RetrainRecommendation', 'keine');
  my $drift_retreason  = AiNeuralVal ($name, $fanntyp, 'RetrainReason',         'keiner');
 

  storeReading ('userFn_DriftWindowsize', $drift_window);
  storeReading ('userFn_DriftRmseRelRatio', $drift_rmserel);
  storeReading ('userFn_DriftRefSlope', $slope_ref);
  storeReading ('userFn_DriftSlopeLive', $slope_live);
  storeReading ('userFn_DriftSlope', $drift_slope);
  storeReading ('userFn_DriftRefBias', $bias_ref);
  storeReading ('userFn_DriftBiasLive', $drift_bias_live);
  storeReading ('userFn_DriftBias', $drift_bias);
  storeReading ('userFn_DriftScore', $drift_score);
  storeReading ('userFn_DriftIndex', $drift_index);
  storeReading ('userFn_DriftFlag', $drift_flag);
  storeReading ('userFn_DriftModelAgeHours', $model_age);
  storeReading ('userFn_DriftLastRecalTime', $last_recaltm);
  storeReading ('userFn_DriftRetrainRecommendation', $drift_retrecomd);
  storeReading ('userFn_DriftRetrainReason', $drift_retreason);
}
# END ################# Driftdaten Ende


Gruß
300P

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

DS_Starter

Hallo Wolfdieter,

Zitatwie lange muss das FC Modul eigentlich laufen bevor ein KI Training erfolgen kann?
Es werden aktuell mindestens 2000 Input Datensätze vorausgesetzt. Jede Stunde erzeugt das System einen neuen Datensatz.
D.h. 2000 Stunden -> das sind rund 84 Tage -> also fast 3 Monate bei 30 Tagen pro Monat.

Warum hast du alles gelöscht?
Ich meine das ist ja nicht schlimm, man muß jetzt nur etwas warten.  ;)

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

@300P,

 :o ... is jetzt nicht dein Ernst  ;)

Da kann ich nichts finden. Vllt. gibt es mehr Infos wenn du global stacktrace=1 setzt.
Ansonsten mal schrittweise die letzten Änderungen in dem Attr zurücknehmen und testen damit es etwas eingekreist werden kann wo das Problem zu suchen ist.
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

...sowas hatte ich mir als Antwort schon gedacht bei meiner "kleine Einstellung".......

Im einem WP-Forum hatte mal einer geschrieben "Haben ist besser als Brauchen"  ;)


Jetzt weisst du auch warum ich zwischen 0.5- 2.0 Sekunden special_runTimeCentralTask habe.  8)

Diese Woche habe ich darin eigentlich eigentlich nur das mit Drift eingebaut.
#Test
Driftstatus:userFn_driftAmpel
:
:
CentralTask:special_runTimeCentralTask

Ich schaue mal ob es auch passiert wenn das "raus" ist - aber erst wenn ich wieder @home bin... ;D
Gruß
300P

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

peterboeckmann

Hallo zusammen,

ich habe mal eine allgemeine Frage zur Einplanung eines Verbrauchers.

TL;DR: Wie bekomme ich den consumer16 sauber so konfiguriert, dass er bei ausreichender PV-Prognose maximal zwischen 9:30 und 19:00 läuft?

Langtext:

Hier geht es um einen Skimmer (Oberflächenabsauger) am Gartenteich.
Da ich die Fische zu festen Zeiten füttere (morgens ca. 9 Uhr, abends ca. 19 Uhr), darf der Skimmer nicht vor 9:30 und nicht nach 19:00 laufen.
Ich hatte gehofft, das mit folgendem attr hinzubekommen. Insbesondere die Schlüssel notbefore und notafter.
attr SolarForecast consumer16 HM_56E0D2_Sw_02
type=other
power=40
on=on
off=off
auto=Automatik
icon=debian
mode=can
mintime=SunPath:60:-60
interruptable=1
notbefore=09:30
notafter=19:00
locktime=300:300

Das notbefore wird auch sauber berücksichtigt. Zumindest habe ich noch nicht bemerkt, dass da was schief gelaufen wäre.
Das notafter scheint aber mit einer der anderen Einstellungen (vermutlich mintime=SunPath?) zu kollidieren.
Selbst wenn ich den Skimmer 19 Uhr "extern" ausschalte, wird er danach manchmal von der Logik wieder angeschaltet.

Vielen Dank für jeden Tipp!

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

Hallo Peter,

Hinweis!  Die Schlüssel notbefore, notafter beziehen sich auf den Startzeitpunkt der Einplanung!, nicht auf einen Schaltzeitpunkt oder ein Einplanungsende.
Überzogenes Beispiel .... notbefore=08, notafter=10  mit mintime=600 (10 Stunden). Dann wird der Consumer Startzeitpunkt zwischen 8 und 10 Uhr eingeplant, kann dann aber laufen gemäß mintime bis 18 oder 20 Uhr.

notbefore=09:30 passt für dich, denn es impliziert auch kein Laufen vor X Uhr.
notafter=19:00 passt nicht, denn es bezieht sich auf die Planung. Wenn es nicht ganz kritisch ist dann notafter=10:00 setzen, der Rest kann so bleiben.
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