FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Marko1976 am 10 Dezember 2025, 17:50:50

Titel: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Marko1976 am 10 Dezember 2025, 17:50:50
Hallo, ich möchte gerne in einem DOIF das für die Steuerung des Presence-Moduls zuständig unterschiedliche Rückmeldungen ausführen.
Wenn die Person anwesend ist soll je nachdem ob der vorherige Status (state_old) abwesend oder schläft war eine andere Begrüßung ausgegeben werden.
Ich habe es mit verschiedenen Schreibvarianten probiert, doch bisher wurde keine Ansage ausgegeben.
Meine letzten Versuche (Auszug aus dem kompletten DOIF):
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
(set rr_Marko zuhause, IF ([rr_Marko:state_old] = "schläft") ({Ansage("Guten Morgen, Marko", "Echo_Schlafzimmer")}), IF ([rr_Marko:state_old] = "abwesend") ({Ansage("Willkommen zu Hause Marko", "Echo_Schlafzimmer")}))
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
(set rr_Marko zuhause, IF ([rr_Marko:state_old] = "schläft") ({Ansage("Guten Morgen, Marko", "Echo_Schlafzimmer")}))
(set rr_Marko zuhause, IF ([rr_Marko:state_old] = "abwesend") ({Ansage("Willkommen zu Hause Marko", "Echo_Schlafzimmer")}))
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
(set rr_Marko zuhause)
(IF ([rr_Marko:state_old] = "schläft") ({Ansage("Guten Morgen, Marko", "Echo_Schlafzimmer")}))
(IF ([rr_Marko:state_old] = "abwesend") ({Ansage("Willkommen zu Hause Marko", "Echo_Schlafzimmer")}))

Leider hat bisher keine Variante funktioniert. Geht das überhaupt und falls ja kann mir jemand einen Tipp geben wo der Denkfehler ist?
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Damian am 10 Dezember 2025, 18:06:45
Vergleiche mit Zeichenketten werden auch bei IF mit eq geschrieben und nicht mit =
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Marko1976 am 10 Dezember 2025, 18:52:26
Ok, grundsätzlich scheint es zu funktionieren, nur die Audioausgabe funktioniert noch nicht, sprich das IF wird nicht ausgeführt obwohl es zutrifft. Aber es schaltet zumindest.

Welche der drei Varianten wären denn richtig?
Oder macht das keinen Unterschied?
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Damian am 10 Dezember 2025, 19:07:41
Es sind alle Varianten richtig, die funktionieren. Die Auftrennung in mehrere Sequenzen () () ...  macht inbs. dann Sinn, wenn man Anweisungen verzögern will. Siehe wait in der Commandref.
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Marko1976 am 10 Dezember 2025, 19:17:57
Dann kann es ja nur daran liegen, dass das IF nicht als True erkannt wird.
Gibt es irgendwelche Möglichkeiten das zu prüfen?

Kann ich den zu prüfenden Begriff noch ein Oder verpassen?
Das Presence-Modul gibt teilweise deutsche Begriffe und teilweise englische Begriffe zurück - nicht das im Abfragemoment die falsche Sprache anliegt.

Also beispielweise so:
    (set rr_Marko zuhause)
    (IF ([rr_Marko:state_old] = "schläft" or "sleep") ({Ansage("Guten Morgen, Marko", "Echo_Schlafzimmer")}))
    (IF ([rr_Marko:state_old] = "abwesend" oder "absent") ({Ansage("Willkommen zu Hause Marko", "Echo_Schlafzimmer")}))

Ich habe einfac mal die zwei IF's mit den englischen Begriffen hinzugefügt.
Dann wurde ein Error angezeigt. Doch damit kann ich nichts anfangen:
IF ([rr_Marko:state_old] = "absent") ({Ansage("Willkommen zu Hause Marko", "Echo_Schlafzimmer")}): Can't modify non-lvalue subroutine call of &main::ReadingValIf in scalar assignment at (eval 324574) line 1, near ""absent")"
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Per am 10 Dezember 2025, 20:09:43
Davon abgesehen, dass "oder" (soweit mir bekannt ist) nur bei deutschen Excel funktioniert, sollte dieser Wert
IF ([rr_Marko:state_old] = "schläft" or "sleep")immer true sein, da "sleep" vorhanden, also true ist und dank "or" den anderen Wert überstimmt.
Was du wahrscheinlich meintest ist
IF ([rr_Marko:state_old] eq "schläft" or [rr_Marko:state_old] eq "sleep")
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Damian am 10 Dezember 2025, 20:13:21
Zitat von: Damian am 10 Dezember 2025, 18:06:45Vergleiche mit Zeichenketten werden auch bei IF mit eq geschrieben und nicht mit =

Offenbar ist mein Hinweis, dass "=" nicht funktioniert nicht angekommen.
Titel: Aw: Unterschiedliches IF im DOIF Ausführungsteil
Beitrag von: Marko1976 am 10 Dezember 2025, 20:55:22
Danke @Per, das habe ich gesucht, hatte es aber schon gelöst indem ich aus den zwei Abfragen 4 gemacht habe und einfach jeweils einmal den deutschen Begriff und einmal den englischen genommen habe. So ist es natürlich übersichtlicher.

@Damian
Doch, der war angekommen. Aber offenbar hat sich da ein Kopierfehler eingeschlichen als ich die englischen Begriffe ergänzt habe.

Jetzt funktioniert es offenbar.