[Gelöst] DOIF-Bedingung funktioniert nicht - Klammersetzung bei Berechnung

Begonnen von Marko1976, 31 März 2026, 09:37:03

Vorheriges Thema - Nächstes Thema

Marko1976

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?

Guybrush

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

Marko1976

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.

Marko1976

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?

Marko1976

#4
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.

Per

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.

Marko1976

Du meinst in den Commandteil der 2. Zweigs die Berechnung manuell ins Log schreiben?