Hallo zusammen, ich brauche etwas Denkhilfe 😁
Für meine Rolläden habe ich ein DOIF, welches diese Abends herunter fährt. Zudem habe ich ein dummy der quasi als Ein-/Ausschalter für die Zeitschaltuhr bzw. den Automatismus dient. Auf einer Weboberfläche gebe ich die Zeit an, wann die Rolläden das nächste Mal fahren wird (reading "Zeit" vom dummy "Zeitschaltuhr_Rolladen_Abends").
define di_Rolladen_Abend DOIF ([{sunset("HORIZON=-6",0,"12:00","23:00")}] and [Zeitschaltuhr_Rolladen_Abends] eq "on") (\
IF ([Fenster_Buero] eq "closed") (set Rolladen_Buero close),\
IF ([Fenster_Balkon] eq "closed") (set Rolladen_Wohnzimmer_Zusammen close),\
sleep 5,\
{fhem "setreading Zeitschaltuhr_Rolladen_Abends Zeit ".substr ReadingsVal("di_Rolladen_Abend", "timer_01_c01", ""), 11, 5}\
)
attr di_Rolladen_Abend do always
Mein Problem ist, dass beim DOIF das setzen der Zeit (aus dem Reading "timer_01_c01") in dem dummy "Zeitschaltuhr_Rolladen_Abends" immer der Wert vom heutigen Lauf verwendet wird und nicht der für den morgigen Lauf. Heißt, wenn der Rolladen heute um 18:08 runter fährt, wird die "18:08" via setreading in den Dummy geschrieben... obwohl der Rolladen morgen dann z.B. erst um 18:10 fährt.
Ist das Doif gelaufen und ich lade die Seite neu, dann steht im Reading "timer_01_c01" die richtige Zeit für die nächste Ausführung (z.B. "09.02.2022 18:10:01").
Meine Vermutung ist, dass FHEM hin geht, die Befehle ausführt und dazu die Werte verwendet die beim Start der Aktion galten. Da hilft wohl auch kein sleep.
Wie kann ich das Problem lösen? 🤔
Das sieht ja gruslig aus... Warum machst Du das nicht einfach mit einem wiederholenden at?
Den Sinn des readings timer_01_c01 habe ich noch nicht verstanden.
timer_01_c01 scheint das Resultat von [{sunset("HORIZON=-6",0,"12:00","23:00")}] zu sein. Das ist jedenfalls die Uhrzeit, wann das Doif das nächste ausgeführt wird.
Wie kann man die Logik zum Schließen der Rolläden bei geschlossenen Fenstern (also die ersten drei Zeilen) in einem "at" schöner umsetzen?
Die Timerangaben der Art timer_01_c01 haben nur einen informativen Charakter, sie können nicht per setreading sinnvoll gesetzt werden. Wenn du Zeitvorgaben haben willst, die man von außen verändern kann, dann schau dir indirekte Timer beim DOIF an, hier wird die Zeit aus einem Reading übernommen.
Zitatbeim DOIF das setzen der Zeit (aus dem Reading "timer_01_c01") ... immer der Wert vom heutigen Lauf
Fast richtig, es ist der nächste Lauf.
Du möchtest (in einem Dummy das Ergebnis) von [{sunset("HORIZON=-6",0,"12:00","23:00")}] für morgen haben, dann musst Du das auch berechnen.
Zitat von: rabehd am 08 Februar 2022, 17:12:29
Du möchtest (in einem Dummy das Ergebnis) von [] für morgen haben, dann musst Du das auch berechnen.
Danke. Das hier wäre dann die richtige Lösung:
{fhem "setreading Zeitschaltuhr_Rolladen_Abends Zeit ".substr sunset("HORIZON=-6",0,"12:00","23:00"), 0, 5}
Vielen Dank! :)