Wie gestalte ich die Bedingung für jede zweite oder dritte Wochen am Besten?

Begonnen von Marko1976, 16 Februar 2026, 17:34:56

Vorheriges Thema - Nächstes Thema

Marko1976

Hallo,
mal eine Frage an die Profis.
Ich möchte gerne eine Aufgabe jede zweite oder dritte Woche ausführen lassen.
Für ungrade Wochen kann ich ja folgenden Code nutzen:
int(($mday-1)/7)==2))
Aber wie kann ich das zum Beispiel für jeden 2. Sonntag schreiben, also der 2., der 4., der 6. Sonntag etc.?

Das einzige was ich gefunden habe ist "$week". Mein Ansatz wäre jetzt die Kalenderwoche durch 2 und dann zu prüfen ob das Ergebnis eine Ganzzahl ist, also 2/2=1, 4/2=2, 6/2=3, aber 1/2=0,5, 3/2=1,5 etc.
Zur Prüfung ob es sich um eine Ganzzahl handelt habe ich dies gefunden:
if ($variable eq int($variable)) {
    Log 1, "Ist eine Ganzzahl";
}
Doch wie bekomme ich das kombiniert und beides dann in die Bedingungsabfrage des DOIF?
Außerdem wäre das keine Lösung für die 3. Woche, die 4. Woche Woche etc..

Gibt es keine einfachere Alternative?

rabehd

Bei DOIF würde ich damit mal Überlegungen anstellen.
https://forum.fhem.de/index.php?msg=951310
Vermutlich brauchst Du die Startwoche als Reading.
Auch funktionierende Lösungen kann man hinterfragen.

betateilchen

Grundsätzliches Vorgehen (Vorschlag):

  • ermittle den ersten Sonntag des Jahres
  • ermittle die Differenz zwischen "heute" und dem ersten Sonntag des Jahres
  • rechne Differenz%14, ist das Ergebnis 0, hast Du einen "jeden zweiten" Sonntag



Alternativ kannst Du auch mit $yday rechnen.

Wenn Du $yday%21 rechnest und dabei 3 rauskommt, hast Du einen "jeden dritten" Sonntag. Der Wert "3" zum Vergleichen gilt aber nur für 2026, da es davon abhängig ist, mit welchem Wochentag das Jahr begonnen hat. Aber auch das lässt sich ja leicht herausfinden, indem man den Wochentag zu 01.01.$year ermittelt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Marko1976

Ich würde eher die zweite Methode favorisieren, da ich es gerne so genrisch wie möglich halten möchte um unabhängig zu bleiben. Außerdem war der Sonntag nur als Beispiel gedacht und noch nicht der endgültig gewählte Tag. Mir war nicht bewusst, dass der Tag so einen Unterschied machen kann, da ich den ja im Trigger mit der Uhrzeit festlege (Meine Idee ).

Zitat von: betateilchen am 16 Februar 2026, 19:12:29Der Wert "3" zum Vergleichen gilt aber nur für 2026, da es davon abhängig ist, mit welchem Wochentag das Jahr begonnen hat.
Wieso macht der erste Wochentag einen Unterschied?

Hab es mit einem Test-DOIF mit einer KI-Lösung wie folgt probiert:
([00:01|2] and ($week % 2 == 0))Zumindest das aktivieren hat schon mal funktioniert. Frage ist, ob das DOIF morgen oder wann auch immer wieder zurück auf einen anderen Zweig schaltet. Das darf nämlich nicht passieren, da es sich um einen Alarmgeber handelt, der nur durch manuelle Aktion zurückgesetzt werden darf.

betateilchen

Zitat von: Marko1976 am 17 Februar 2026, 00:23:05Wieso macht der erste Wochentag einen Unterschied?

Weil sich daraus die Differenz zum ersten Sonntag im Jahr ergibt.
Und darauf wird in der Modulo-Rechnung getestet.


01.01.2026 -> Donnerstag -> $yday=0 -> erster Sonntag: $yday=3
01.01.2027 -> Freitag    -> $yday=0 -> erster Sonntag: $yday=2


Zitat von: Marko1976 am 17 Februar 2026, 00:23:05mit einer KI-Lösung wie folgt

🤮

Sowas ist nie eine "intelligente" Lösung, sondern immer nur eine statistische Annahme.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: Marko1976 am 17 Februar 2026, 00:23:05Ich würde eher die zweite Methode favorisieren, da ich es gerne so genrisch wie möglich halten möchte um unabhängig zu bleiben. Außerdem war der Sonntag nur als Beispiel gedacht und noch nicht der endgültig gewählte Tag. Mir war nicht bewusst, dass der Tag so einen Unterschied machen kann, da ich den ja im Trigger mit der Uhrzeit festlege (Meine Idee ).

Zitat von: betateilchen am 16 Februar 2026, 19:12:29Der Wert "3" zum Vergleichen gilt aber nur für 2026, da es davon abhängig ist, mit welchem Wochentag das Jahr begonnen hat.
Wieso macht der erste Wochentag einen Unterschied?

Hab es mit einem Test-DOIF mit einer KI-Lösung wie folgt probiert:
([00:01|2] and ($week % 2 == 0))Zumindest das aktivieren hat schon mal funktioniert. Frage ist, ob das DOIF morgen oder wann auch immer wieder zurück auf einen anderen Zweig schaltet. Das darf nämlich nicht passieren, da es sich um einen Alarmgeber handelt, der nur durch manuelle Aktion zurückgesetzt werden darf.


Dein DOIF wird jeden Tag getriggert, danach wird geschaut, welcher Wochentag es ist, wenn die Bedingungen wahr sind, geht es in die Auswertung der ganzen Bedingung. Wenn die Wochenabfrage nicht wahr ist (hier bei ungerader Woche), wird der Zweig nicht ausgeführt und es geht weiter mit der nächsten DOELSEIF-Abfrage bzw. zu DOELSE am Ende.

Möchtest du die Zweige unabhängig voneinander haben, musst du mehrere DOIFs definieren oder DOIF-Perl verwenden.


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

Marko1976

Zitat von: betateilchen am 17 Februar 2026, 08:47:33Weil sich daraus die Differenz zum ersten Sonntag im Jahr ergibt.
Und darauf wird in der Modulo-Rechnung getestet.
Dann ist es ja auch keine endgültige Lösung sondern muss jedes Jahr angepasst werden. Ich wüsste jedenfalls keinen Weg die Differenz automatisch zu bestimmen. Bin aber in Perl auch nicht wirklich fit.
Zitat von: betateilchen am 17 Februar 2026, 08:47:33Sowas ist nie eine "intelligente" Lösung, sondern immer nur eine statistische Annahme.
Ich bin davon auch nicht begeistert, aber wenn man gar keine Idee hat ist es als Stichwort- oder Ideengeber nicht schlecht.
Außerdem wird man gerade hier im Forum immer wieder darauf verwiesen, nach dem Motto schau doch erst mal bei KI ehe du hier fragst.
Wenn ich "{$yday%21}" in der Eingabezeile ausführe, bekomme ich heute den Wert 5 zurückgegeben, doch für was steht diese 5 genau? Ist das der Tag in der Woche, die Woche im Monat oder oder oder? Ich weiß auch nicht wofür das % steht ich kenne nur / als Divisor. Oder ist das %21 eine interne Funktion in Perl? Am einfachsten nachzuvollziehen fände ich eine Funktion die sich auf die Kalenderwoche bezieht, aber ist Kalenderwoche=2, =4, etc. würde natürlich eine Unmenge an Abfragen bilden.

Zitat von: Damian am 17 Februar 2026, 08:50:22Dein DOIF wird jeden Tag getriggert, danach wird geschaut, welcher Wochentag es ist, wenn die Bedingungen wahr sind, geht es in die Auswertung der ganzen Bedingung. Wenn die Wochenabfrage nicht wahr ist (hier bei ungerader Woche), wird der Zweig nicht ausgeführt und es geht weiter mit der nächsten DOELSEIF-Abfrage bzw. zu DOELSE am Ende.
Ok, hätte vielleicht besser das gesamte DEF gepostet als nur die einzelne Abfrage.
Also der erste Zweig dient ausschließlich zum Zurücksetzen und soll nur manuell oder per FTUI3 ausgelöst werden ohne automatischen Trigger, entspricht also dem Standardwert. Nur wenn dann die Bedingung des zweiten Zweigs zutreffend ist soll das DOIF umspringen und dann diesen Wert beibehalten bis er manuell zurückgesetzt wird.
Hier mal das gesamte DEF:
(xxx)
    (setreading Hausarbeit_Test Wert 0)
DOELSEIF ([00:01|2] and ($week % 2 == 0))
    (setreading Hausarbeit_Test Wert Toilette putzen)
Wie gesagt, erstmal alles nur zum testen.
Aber wenn du schreibst gerade/ungerade Woche ist das ja genau das was ich nicht will. Bei der Fragestellung war auch explizit jede zweite Woche und nicht gerade/ungerade wochen bei der KI angegeben. Klar, jede 2. Woche trifft natürlich auf eins der beiden zu, aber ich möchte das Gleiche durch kleine Anpassungen auch genauso für jede 3. Woche oder jede 4. Woche nutzen können. Das geht ja dann offenbar nicht.

Das Ganze soll eine Aufgabenerinnerung steuern und eben für diverseste Aufgaben funktionieren. wobei die eine Aufgabe eben alle zwei Wochen eintritt, eine andere alle drei Wochen und wieder eine andere an festen Terminen (dafür habe ich bereits eine Lösung).

Damian

Zitat von: Marko1976 am 17 Februar 2026, 10:05:16Aber wenn du schreibst gerade/ungerade Woche ist das ja genau das was ich nicht will. Bei der Fragestellung war auch explizit jede zweite Woche und nicht gerade/ungerade wochen bei der KI angegeben. Klar, jede 2. Woche trifft natürlich auf eins der beiden zu, aber ich möchte das Gleiche durch kleine Anpassungen auch genauso für jede 3. Woche oder jede 4. Woche nutzen können. Das geht ja dann offenbar nicht.


Das ist offenbar das Problem der KI-Anwendung. Die hast du offenbar nicht hinterfragt, denn dann wüsstest du was "$week % 2" wirklich bedeutet ;)

Dass man immer stärker an KI-Aussagen glaubt, ohne sie wirklich zu verstehen, ist eine traurige Entwicklung.

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

Marko1976

Zitat von: Damian am 17 Februar 2026, 10:18:12hast du offenbar nicht hinterfragt, denn dann wüsstest du was "$week % 2" wirklich bedeutet
hinterfragt schon, doch ohne Perl zu lernen bringt mir das hinterfragen ja auch nichts. wie oben noch ergänzt kenne ich zum Beispiel das % nicht als Rechen-/Funktionszeichen.
Außerdem sollte dann erstmal aufgehört werden hier im Forum darauf zu verweisen, oder denkst du nicht?

Damian

Zitat von: Marko1976 am 17 Februar 2026, 10:23:15
Zitat von: Damian am 17 Februar 2026, 10:18:12hast du offenbar nicht hinterfragt, denn dann wüsstest du was "$week % 2" wirklich bedeutet
hinterfragt schon, doch ohne Perl zu lernen bringt mir das hinterfragen ja auch nichts. wie oben noch ergänzt kenne ich zum Beispiel das % nicht als Rechen-/Funktionszeichen.

Dann frag doch mal die KI, was in Perl $week % 2 wirklich bedeutet, dann wirst du feststellen, dass du den mathematischen Hintergrund schon in der Grundschule gelernt hast :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RalfRog

Zitat von: Marko1976 am 17 Februar 2026, 10:23:15Außerdem sollte dann erstmal aufgehört werden hier im Forum darauf zu verweisen, oder denkst du nicht?

...bitte nicht wieder falsch abbiegen...
FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Marko1976

Das ist das genaue Ergebnis meiner Frage an die KI:
ZitatErstelle eine DOIF-Bedingung die durch anpassung jede zweite Woche, jede dritte Woche oder auch jede vierte Woche sonntags zutrifft
Das Grundprinzip
Die Bedingung prüft, ob die aktuelle Woche geteilt durch das Intervall einen bestimmten Rest ergibt.
Formel: $week % Intervall == 0 (oder 1, 2, etc.)
Zusatz: Damit das DOIF nur einmal am Tag (z.B. montags um 08:00 Uhr) prüft, kombinieren wir dies mit einer Zeitangabe.
Die DOIF-Varianten
Intervall    DOIF-Bedingung (Beispiel Montags 08:00)
Jede 2. Woche    [[08:00|0] and $week % 2 == 0]
Jede 3. Woche    [[08:00|0] and $week % 3 == 0]
Jede 4. Woche    [[08:00|0] and $week % 4 == 0]

Als weitere Hinwes steht dann da noch:
Zitat
  • Der Startzeitpunkt: Wenn ($week % 2 == 0) in der aktuellen Woche nicht zutrifft, die Aktion aber diese Woche starten soll, ändere die Bedingung einfach auf ($week % 2 == 1). Damit verschiebst du den Rhythmus um eine Woche.
  • Wochentage: Das |0 hinter der Uhrzeit stellt sicher, dass der Befehl nur am Sonntags ausgeführt wird. Ohne diesen Zusatz würde das DOIF bei $week % 2 == 0 jeden Tag in dieser Woche um 08:00 Uhr triggern.

Da ist für mich nicht herauslesbar das es sich auf gerade/ungerade Wochen bezieht, abegesehen davon, dass die Aufzählung %3 und %4 eher auf das Gegentel hinweist. Für mich deutet das eher auf eine Ja/Nein-Ergebnis hin, also trifft die Bedingung zu ist das Ergebnis 0, trifft es nicht zu ist es 1 oder 2 oder 3 - abhängig der Anzahl der Wochen zwischen dem Ja-Zustand.

Marko1976

Zitat von: betateilchen am 17 Februar 2026, 08:47:3301.01.2026 -> Donnerstag -> $yday=0 -> erster Sonntag: $yday=3
01.01.2027 -> Freitag    -> $yday=0 -> erster Sonntag: $yday=2
Das verstehe ich, aber ist das nicht egal wenn ich nur die Woche bestimmen will? Ob diese nur einen Tag früher oder später "beginnt" ist ja vernachlässigbar. Es geht mir einfach um den Abstand der zwei/drei/vier Wochen zwischen dem Auslösen.

Also das die Bedingung für die dritte Woche (damit nicht wieder Verwechslung mit gerade/ungerade besteht) Sonntags um 00:01 Uhr in der 3., der 6., der9. Woche etc. zutrifft. Ich kann dabei vernachlässigen wenn das nicht exakt mit der Kalenderwoche übereinstimmt. Von mir aus kann der Prüfzeitraum genauso am Fr. der KW2 beginnen und am Do. der KW3 enden, wenn das dann ebenfalls für den drei Wochen späteren Zeitraum gillt, also Fr. der KW5 bis Do. der KW6 etc..

betateilchen

Zitat von: Marko1976 am 17 Februar 2026, 10:51:14Also das die Bedingung für die dritte Woche (damit nicht wieder Verwechslung mit gerade/ungerade besteht) Sonntags um 00:01 Uhr in der 3., der 6., der9. Woche etc. zutrifft.

Nun, man kann das Ganze auf Basis von Wochen rechnen oder auf Basis von Tagen.
Meine Berechnung geht von Tagen aus, damit kann man am flexibelsten arbeiten.

Es könnte ja mal einen Fall geben, wo Du "an jedem 17. Tag" etwas ausführen möchtest.
Das wird mit wochenweiser Rechnung ziemlich schwierig...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!