FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Superposchi am 21 Januar 2021, 08:12:27

Titel: [Gelöst] Cascadierende Bedingungen
Beitrag 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
Titel: Antw:Cascadierende Bedingungen
Beitrag von: yersinia am 21 Januar 2021, 08:29:44
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)
Titel: Antw:Cascadierende Bedingungen
Beitrag von: kjmEjfu am 21 Januar 2021, 08:46:10
https://fhem.de/commandref_DE.html#DOIF_Anwendungsbeispiele_im_Perlmodus
Titel: Antw:Cascadierende Bedingungen
Beitrag von: Damian am 21 Januar 2021, 16:15:58
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.
Titel: Antw:Cascadierende Bedingungen
Beitrag von: Superposchi am 21 Januar 2021, 19:10:37
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?
Titel: Antw:Cascadierende Bedingungen
Beitrag von: Damian am 21 Januar 2021, 19:19:05
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.
Titel: Antw:Cascadierende Bedingungen
Beitrag von: Sany am 21 Januar 2021, 20:35:25
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!
Titel: Antw:Cascadierende Bedingungen
Beitrag von: Superposchi am 22 Januar 2021, 08:06:43
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