Unterschiedliches IF im DOIF Ausführungsteil

Begonnen von Marko1976, 10 Dezember 2025, 17:50:50

Vorheriges Thema - Nächstes Thema

Marko1976

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?

Damian

Vergleiche mit Zeichenketten werden auch bei IF mit eq geschrieben und nicht mit =
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

#2
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?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

#4
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")"

Per

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")

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

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.