Hallo, ich habe vor einiger Zeit meine Hausarbeiten als DOIF angelegt und mit zeitlichen Intervallen so gestatet, dass beim Abhaken ab Tablet der Zähler auf den aktuellen Tag im Jahr gestellt und dieser im Reading "Execution" gespeichert wird. Dies erfolgt über das setreading im Code des ersten DOIF-Zweigs weiter unten, der nur manuell ausgelöst werden kann (im Beispiel über eine FTUI3-Oberfläche). Im Reading "Intervall" habe ich je nach Aufgabe verschiedene Zeiten stehen, von 3 bis hin zu 7 (Tagen).
Die Bedingung selbst sieht so aus:
(xxx)
{Ansage("Heizungsbefeuchtung aufgefüllt", "Echo_Wohnzimmer,Echo_Schlafzimmer,Echo_Kueche")} (setreading $SELF execution {(int(POSIX::strftime("%j", localtime)))})
DOELSEIF (([?$SELF:switch] eq "on") and [00:01] and (($yday + [$SELF:Intervall]) >= [?$SELF:execution]))
()die Readings wie folgt:
Intervall 5 2026-03-29 10:21:28
cmd 2 2026-03-31 00:01:00
cmd_event timer_1 2026-03-31 00:01:00
cmd_nr 2 2026-03-31 00:01:00
e_Aufgabe_Heizungsluft_Intervall 5 2026-03-29 10:21:28
execution 88 2026-03-29 17:36:21
mode enabled 2026-03-27 16:13:01
notification_push on 2026-03-10 13:07:28
notification_voice on 2026-03-10 13:07:51
state aktiv 2026-03-31 00:01:00
switch on 2026-02-25 15:55:02
timer_01_c02 01.04.2026 00:01:00 2026-03-31 00:01:00
workingLabel Heizungsbefeuchter auffüllen 2026-02-25 13:46:13
workingState aktiv 2026-03-31 00:01:00
Also nach meinem dafürhalten und unter vernachlässigung der ersten beiden Bedingungsteile sollte die Bedingung eintreten wenn der aktuelle Tag im Jahr (im Beispiel 89) + das Intervall (im Beispiel 5) größer oder gleich der letzten gespeicherte Ausführungstag im Jahr (im Beispiel 88) ist. Also letzte Ausführung gestern, nächste Ausführung in vier Tagen von heute an gerechnet. Dennoch schlägt die Bedingung heute schon an. Also offenbar so als wenn er das Intervall nicht dazu addiert.
Kann bitte mal jemand nachschauen ob ich da nicht einen dummen Logikfehler drin habe den ich selbst nicht mehr finde?
ohne die anderen bedingungen zu kennen würde ich ein ? vor $SELF:Intervall mal zum testen setzen. liesst sich jedenfalls so, dass das doif sich vielleicht selbst triggert. log doch mal die events, die in den doif blöcken ausgeführt werden. so sieht mans dann ja
Hab das Fragezeichen gesetzt und die Uhr testweise auf 11 Uhr umgestellt, so dass der Auslösezeitpunkt in ca. 5 Minuten erreicht wird.
Bedingungen gibt es keine anderen als oben im Code zu sehen sind.
Das DOIF hat zwei Zweige. Der Erste kann nur manuell ausgelöst werden weil als Bedingung lediglich (XXX) angegeben ist, was ja so nie wahr werden kann. Dieser Zweig gibt eine kurze Ansage aus und schreibt den aktuellen Tag des Jahres eben in das Reading.
Als zweiten Zweig gibt es dann eben wie oben zu sehen die Bedingung. Der Switch dient nur dazu um das ganze per FTUI ein-/ausschalten zu können, dazu ein fester Zeitpunkt, damit es nicht mehrmals am Tag geschaltet werden kann und dann eben die eigentliche rechnerische Bedingung bei der geprüft wird ob der aktuelle Tag + die Intervall-Angabe größer oder gleich der letzten Ausführung (ebenfalls Tag des Jahres) sind.
Was mir allerdings aufgefallen ist:
{(int(POSIX::strftime("%j", localtime)))} und
{$yday}geben nicht das gleiche zurück. Anders als im Netz geschrieben wird, scheint strftime offenbar nicht bei 0 an zu rechnen sondern bei 1, was bedeutet, dass entweder bei localtime noch 1 abgezogen werden muss oder das Intervall um einen Tag verkürzt ausgeführt wird.
Rückmeldung:
Die Änderung hat es nicht gebracht, der DOIF-Zweig wurde um 11:01 wieder ausgelöst.
Aber ich glaube ich habe einen einfachen Denkfehler:
Der aktuelle Tageswert + das Interval >= der Tageswert der letzten Ausführung
Beispiel: 89 + 5 >= 88
Das muss ja wahr werden.
Es muss eigentlich so lauten:
Der Tageswert der letzten Ausführung + das Interval >= der aktuelle Tageswert
Beispiel: 88 + 5 >= 89
Oder bin ich jetzt komplett blind?
Obwohl da offensichtlich ein Logikfehler in der Berechnung vorhanden war, lag der Fehler offenbar in der Klammersetzung.
Falsch:
(($yday + [$SELF:Intervall]) >= [?$SELF:execution])
Richtig:
($yday >= [?$SELF:execution] + [?$SELF:Intervall])
Offenbar war die Klammersetzung um die Addition das Problem, werde es jetzt mal die nächsten Tage testen und bei weiteren Fehlern noch mal Rückmeldung geben, ansonsten kann hier dichtgemacht werden.
Mach doch in den Cmd Teil ein Logging der einzelnen Werte rein inkl Berechnung rein.
Außer $yday wird alles jetzt schon geloggt, also zumindest den Wert solltest du prüfen.
Du meinst in den Commandteil der 2. Zweigs die Berechnung manuell ins Log schreiben?
Ich bin generell eher weniger ein Freund von langen unübersichtlichen Logs, weshalb bei mir auch die meisten Devices bei Verbose auf 0 stehen. Das Log sehe ich als Problemlöser an und schalter es dann ein wenn es mit einem bestimmten Device ein Problem gibt.
Temporär wäre dass also vielleicht sinnvoll, aber dauerhaft eher nicht. Gott sei Dank ist das Problem aber ja offenbar bereits gelöst wie ich weiter oben ausgeführt habe.