FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Marko1976 am 31 März 2026, 09:37:03

Titel: [Gelöst] DOIF-Bedingung funktioniert nicht - Klammersetzung bei Berechnung
Beitrag von: Marko1976 am 31 März 2026, 09:37:03
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?
Titel: Aw: DOIF-Bedingung funktioniert nicht richtig - Bitte Zweimeinung
Beitrag von: Guybrush am 31 März 2026, 09:53:12
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
Titel: Aw: DOIF-Bedingung funktioniert nicht richtig - Bitte Zweimeinung
Beitrag von: Marko1976 am 31 März 2026, 10:56:46
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.
Titel: Aw: DOIF-Bedingung funktioniert nicht richtig - Bitte Zweimeinung
Beitrag von: Marko1976 am 31 März 2026, 11:08:25
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?
Titel: [Gelöst] DOIF-Bedingung funktioniert nicht richtig - Bitte Zweimeinung
Beitrag von: Marko1976 am 31 März 2026, 11:20:25
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.
Titel: Aw: DOIF-Bedingung funktioniert nicht richtig - Bitte Zweimeinung
Beitrag von: Per am 31 März 2026, 12:12:43
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.
Titel: Aw: [Gelöst] DOIF-Bedingung funktioniert nicht - Klammersetzung bei Berechnung
Beitrag von: Marko1976 am 31 März 2026, 12:25:06
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.