Hauptmenü

Frage zu Zeitereignissen

Begonnen von Superposchi, 18 März 2022, 14:40:02

Vorheriges Thema - Nächstes Thema

Superposchi

Ich würde gerne wissen ob es mit einem DOIF möglich ist als Auslöseereigniss regelmäßige Termine wie z.b. "jeden zweiten Samstag" oder "jeden 3. Sonntag im Monat" umzusetzen.

Aus der Doku kann ich dazu leider nichts erkennen.

Damian

Nur indirekt z. B. [00:00|Sa] and .... irgendeine Berechnung mit $mday (Tag des Monats) oder $yday (Tag des Jahres) oder selber einen Counter hochzählen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

Es gibt auch noch andere Möglichkeiten, das zu berechnen - aber man muss es halt selbst tun.

Für "jede 2. Woche" könnte man die Ausführung beispielsweise auf die geraden Wochennummern einschränken


(in der bash shell)
$(( $(date +%U) % 2 ))


liefert 0 oder 1 zurück, die Ausführung wird sich aber beim Jahreswechsel ab und zu mal verschieben, da die Anzahl Tage pro Jahr nicht glatt durch 7 teilbar ist.

Alternativ kann man auch die Epochen-Sekunden verwenden und gegen 604800 Sekunden (7*24*3600) prüfen:


(in der bash shell)
$(( $(date +%s) / 604800 % 2 ))


verwenden, das bleibt "ewig" im 2-Wochen-Rhythmus korrekt und liefert auch 0 oder 1 zurück.

Für "3. Sonntag im Monat" wird es komplizierter.
Da könnte man sich an das Beispiel "tzdata" anlehnen, dort werden ja über eine bestimmte Syntax (letzter Sonntag im März bzw. letzter Sonntag im Oktober) die Umstellungstermine für Sommer-/Winterzeit ermittelt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Jede x-Woche geht in der DOIF-Bedingung mit:

$week % x == 0

z. B. jeder 2. Sonntag um 08:00 Uhr:

([08:00|So] and $week % 2 == 0)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

Zitat von: Damian am 18 März 2022, 15:37:19
z. B. jeder 2. Sonntag um 08:00 Uhr:

genauer: jeden Sonntag in einer geraden Kalenderwoche ;)

Beim Jahreswechsel von KW53 zu KW1 findet dann drei Wochen lang keine Ausführung statt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Superposchi

Da es sich dabei um eine Benachrichtigung für einen Service am Auto handelt (Check Öl, Scheibenwischer etc.) wäre es nicht tragisch.

Kann man mit mday den Monatsersten bestimmen? Kenne die Funktion nicht.
Wenn ja, könnte man in die Abfrage einen Zähler einbauen, der Sonntags zwischen 15 und 21 greift.

Gisbert

Hallo Superposhi,

der Beitrag von Damian liefert ja schon fast alles. Wenn du es noch mit dem Wochentag kombinierst ($wday == 0), z.b. 12 < $mday <= 19  and $wday == 0 and [12:00] - oder halt wie Damian es vorgeschlagen hat.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

DetlefR

#7
Hallo Superposchi,

ausgehend von Damian seinem Beispiel probier das mal.

([08:00|So] and int(($mday-1)/7)==X)

Das X steht dann für das Auftreten des Wochentages im Monat. 0 ist das erste mal.

Gruß Detlef

Superposchi

([08:00|So] and int(($mday-1)/7)==X)
Zwei Fragen:
Wenn ich Sonntag auf Samstag ändere, muss ich dann auch das -1 hinter mday anpassen?
Ist das Fhem- oder Perl-Code? buw. kann ich das X auch aus einem Reading holen?

(in der bash shell)
$(( $(date +%U) % 2 ))

Was meinst du mit "in der bash-datei"?

DetlefR

Hallo,

den Wochentag änderst du im ersten Teil. Also aus ([08:00|Sa] wird dann ([08:00|So]. int(($mday-1)/7)==X Wenn es am ersten Sonntag, Montag.. passieren soll, dann kommt anstelle  von X eine 0. Beim zweiten Sonntag eine 1 usw.
ZitatIst das Fhem- oder Perl-Code?
Das ist DOIF spezifisch. Aber wozu ein Reading. Sinnvoll ist sowieso nur 0-3. Bei 4 kann der Monat schon um sein.

Einfach mal probieren.

Superposchi

Das mit dem Reading kommt einfach daher, dass ich versuche alles so universell wie möglich zu schreiben.
Also überall da wo es geht Einstellungen aus Readings zu holen die ich über FTUI verändern kann. Einfach eine dumme Angewohnheit.

Genauso wie ich in jeden Auslöser einen Dummy einbaue mit dem ich die Funktion per FTUI ein-/ausschalten kann.

Damian

Zitat von: Superposchi am 23 März 2022, 21:58:04
Das mit dem Reading kommt einfach daher, dass ich versuche alles so universell wie möglich zu schreiben.
Also überall da wo es geht Einstellungen aus Readings zu holen die ich über FTUI verändern kann. Einfach eine dumme Angewohnheit.

Genauso wie ich in jeden Auslöser einen Dummy einbaue mit dem ich die Funktion per FTUI ein-/ausschalten kann.

Du kannst in jede Bedingung ein Reading einsetzen, das ist der Normalfall. Die einzige Frage ist: Mit oder ohne Trigger?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF