Hallo, ich habe mal eine Frage zu DOIF weil ich im Wiki und der CommandRef nicht wirklich was dazu gefunden habe.
Man kann ja bei DOIF Bedingungen mit logischen Ausdrücken wie and und or verknüpfen und so Abfragen mit ziemlich spezifischem Inhalt erstellen.
Aber ist es auch möglich Abfragen in Abfragen einzubauen? Also praktisch ein weiteres DOIF in einem anderen DOIF?
Beispiel:
Wenn xyz = wahr und zyx = wahr dann
wenn abc = wahr dann
Command
wenn def = wahr dann
Command
mach doch einfach zwei abfragen draus DOIF DOELSEIF usw:
Wenn xyz = wahr und zyx = wahr und abc = wahr dann
Command
DOELSEIF xyz = wahr und zyx = wahr und def = wahr dann
Command
DOELSE
Zitat von: Superposchi am 21 Januar 2021, 08:12:27weil ich im Wiki und der CommandRef nicht wirklich was dazu gefunden habe.
https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur)
https://fhem.de/commandref_DE.html#DOIF_Anwendungsbeispiele_im_Perlmodus
Zitat von: Superposchi am 21 Januar 2021, 08:12:27
Hallo, ich habe mal eine Frage zu DOIF weil ich im Wiki und der CommandRef nicht wirklich was dazu gefunden habe.
Man kann ja bei DOIF Bedingungen mit logischen Ausdrücken wie and und or verknüpfen und so Abfragen mit ziemlich spezifischem Inhalt erstellen.
Aber ist es auch möglich Abfragen in Abfragen einzubauen? Also praktisch ein weiteres DOIF in einem anderen DOIF?
Beispiel:
Wenn xyz = wahr und zyx = wahr dann
wenn abc = wahr dann
Command
wenn def = wahr dann
Command
Im DOIF-FHEM-Modus kannst du DOIF mit dem IF-Befehl kombinieren.
Zitatmach doch einfach zwei abfragen draus DOIF DOELSEIF
Das ist schon klar, aber was fällt dabei auf? Man hat jede Menge doppelten Code und somit auch doppelte Fehlermöglichkeiten. Beim Programmieren versucht man nicht umsonst so wenig Code wie möglich zu nutzen.
ZitatIm DOIF-FHEM-Modus kannst du DOIF mit dem IF-Befehl kombinieren.
Das wäre eine Möglichkeit, aber damit ist nur eine einfache eingeschlossene Bedingung möglich, soweit ich das verstehe. Also so wie mein Beispiel geschrieben war. Aber man könnte keine Funktion ala DOELSEIF innerhalb der Cascadierung nutzen, richtig?
Zitat von: Superposchi am 21 Januar 2021, 19:10:37
Das ist schon klar, aber was fällt dabei auf? Man hat jede Menge doppelten Code und somit auch doppelte Fehlermöglichkeiten. Beim Programmieren versucht man nicht umsonst so wenig Code wie möglich zu nutzen.
Das wäre eine Möglichkeit, aber damit ist nur eine einfache eingeschlossene Bedingung möglich, soweit ich das verstehe. Also so wie mein Beispiel geschrieben war. Aber man könnte keine Funktion ala DOELSEIF innerhalb der Cascadierung nutzen, richtig?
Du kannst beliebig IF-ELSE Fälle schachteln. Trigger können natürlich nur in der Bedingung von DOIF und DOELSEIF vorkommen.
oder direkt im DOIF-Perl-Modus? Da ist doch alles, was in Perl geht, möglich, mit dem Vorteil der DOIF-Syntax für Devices/Readings. Ich nutze das mehr und mehr, finde es wesentlich übersichtlicher als notify/at mit Routinen in der 99_myUtils.pm
Man sollte sich nur sehr genau die Unterschiede zum DOIF-FHEM-Modus anschauen, da die Zustandsbehandlung beim "Programmierer" liegt. Dafür bist Du völlig frei mit Timern und Variablen.
Aus der cref:
DOIF
{ if (<Bedingung>) {
if (<Bedingung>) {
if (<Bedingung mit Triggern>...
...
}
}
}
}
sowas in der Art suchst Du doch, oder?
Viel Erfolg!
Ja, das kommt dem Gedanken ziemlich nahe.
Ursprünglich meinte ich zwar
DOIF
{ if (<Bedingung>) {
if (<Bedingung>) {
}
else {
}
}
}
Aber da muss ich einfach mal die Perl-Funktionen genauer in Augenschein nehmen.
Danke