[gelöst] Zeitpunkte schalten nur innerhalb eines Datumsfensters

Begonnen von OiledAmoeba, 03 Januar 2024, 02:30:10

Vorheriges Thema - Nächstes Thema

OiledAmoeba

Moin,

derzeit habe ich eine Zeitschaltuhr realisiert, die zwischen SS und SR schaltet, mit einer Pause über Nacht.
([{twilight("twilight","ss","16:00","22:00")}-00:30] or [07:00-{twilight("twilight","sr","07:01","09:00")}])Jetzt möchte ich, dass diese Zeitschaltuhr nur dann schaltet, wenn die Zeiten innerhalb einer Kalenderzeitspanne liegen.
Irgendwie stelle ich mich zu doof an, da ein Datum einzubauen, oder geht das vielleicht sogar gar nicht? Im Wiki habe ich das Schalten nach Kalendereintrag gefunden, aber da wird nicht direkt auf eine Zeitspanne geprüft, sondern "nur" am Tag des Ereignisses geschaltet.
Das Labor habe ich jetzt zweckentfremdet und prüfe, ob der Status 1 oder 0 ist, um die Prüfung auf eine Datumsspanne hinzubekommen. Das müsste doch aber eleganter gehen, oder nicht?
aktuell:
(([{twilight("twilight","ss","16:00","22:00")}-00:30] or [07:00-{twilight("twilight","sr","07:01","09:00")}]) and [datumsbereich_Labor0] == 1)
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

Ellert

Was genau verstehst Du in diesem Zusammenhang unter eleganter?

Das ist nur anders:
(Deine Bedingung) and $year > Startjahr and $year < Endjahr and <usw. für alle Dir wichtigen Datumselemente>

OiledAmoeba

Unter "eleganter" meinte ich, eine Prüfung in der Art von
([von-bis Datum] and ([von-bis Uhrzeit1] or [von-bis Uhrzeit2]))Also ohne "Umweg" über das zweite DOIF, welches abhängig vom Datum 1 oder 0 liefert, auf das man prüfen kann.

Vielleicht ist das "$year < Endjahr" von Dir der Hinweis auf meinen Gedankenfehler. Ich dachte, man könnte eine Datumsspanne wie eine Zeitspanne im DOIF prüfen, aber eigentlich müsste ich prüfen, ob year, month und day zur Schaltzeit größer-gleich/kleiner-gleich des Start-/Enddatums ist, richtig?
Dann wäre die Prüfung nicht, wie von mir angenommen ($startdatum-$enddatum) sondern (($startdatum ge "$year-$month-$mday") and ($enddatum le "$year-$month-$mday"))Jetzt korrekt gedacht?
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

Damian

Dafür gibt es im DOIF die Variablen $md oder $ymd

Bsp.:

DOIF (("01-01" le $md le "05-31") and ...)
Bedeutet vom vom 1. Januar bis zum 31. Mai.

Zusätzlich braucht man in der Bedingung einen Trigger, da die zeitliche Abfrage selbst nicht triggert.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

OiledAmoeba

Danke Damian! Ich war kurz davor, auf die Perl-Eben zu schalten und mir was mit time_str2num zu basteln ;-)

Da die Uhrzeiten ja intern Timer im DOIF anlegen, sind das dann die Trigger, korrekt? Also, wenn einer der Timer erreicht ist, beginnt die Prüfung und wenn $md oder $ymd nicht im Zeitfenster liegt, springt er in den DOELSE-Zweig, da ich die Datumsabfrage mit einem "and" an die anderen Prüfungen getackert habe.

Also auf die Ausgangsfrage bezogen:
Mehrere Zeiten innerhalb eines Datumsfensters sähe nach meinem Verständnis so aus
(($startdatum le $ymd le $enddatum) and ([$start1-$ende1] or [$start2-$ende2]))
Wenn das Datum selbst nicht triggert, stellt sich mir gerade die Frage, was passiert, wenn ein Start- oder Endpunkt außerhalb des Datums liegt. In meinem Beispiel schaltet die erste Zeitbedingung ja über den Tageswechsel ([{twilight("twilight","ss","16:00","22:00")}-00:30]).

Case1, Startdatum erreicht: Schaltet cmd_1 dann 00:00 und cmd_2 um 00:30? Mein Tipp: Es passiert nix, da das DOIF im cmd_2 ist, es um 00:00 keinen Trigger gibt, der cmd_1 auslösen könnte und um 00:30 cmd_2 zutrifft.
Case2, Enddatum erreicht: Schaltet cmd_1 dann twilight:ss und cmd_2 um 24:00? Mein Tipp: Es schaltet um 00:30 von cmd_1 auf cmd_2, weil der triggernde Timer auf 00:30 steht und es um 00:00 keinen Auslöser gibt.
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

Damian

Es ist ganz einfach. Getriggert wird immer (also jeden Tag) beim Zeitpunkt-Start und Zeitpunkt-Ende. Wenn der Rest der Bedingung zum Startzeitpunkt nicht wahr ist, dann ist die ganze Bedingung nicht wahr, da es sich um ein UND-Verknüpfung handelt. Beim Zeitpunkt-Ende ist das dazugehörige Zeitintervall nicht wahr, dann hängt es davon ob die OR-Bedingung wahr ist oder nicht und das erste mit und verknüpfte Datumsintervall.

In der Konsequenz kann man sagen, wenn sich also die Zeitintervalle nicht überschneiden, dann ist immer zum Startzeitpunkt innerhalb der Datumsintervalls der Ausdruck wahr und zum Endzeitpunkt immer falsch.

 
 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

OiledAmoeba

Dann ist es ja, wie meine Tipps. Am Starttag wird erstmals morgens geschaltet (für die Schaltung über Nacht passt die Bedingung zum cmd_1 nicht) und am Enddatum läuft es bis zum nächsten morgen um 00:30, weil das Datum nicht triggert sondern erst der nächste Zeitpunkt (bei dem dann sogar beide and-Bedingungen falsch werden)

Vielen Dank! Ich mach dann mal ein gelöst dran.
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+