[Gelöst] Cascadierende Bedingungen

Begonnen von Superposchi, 21 Januar 2021, 08:12:27

Vorheriges Thema - Nächstes Thema

Superposchi

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

yersinia

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
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl


Damian

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

Superposchi

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?

Damian

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

Sany

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!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Superposchi

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