Einfaches DOIF mit Klammerebenen

Begonnen von Luco, 27 Juni 2015, 11:50:35

Vorheriges Thema - Nächstes Thema

Luco

Hallo,

ich habe heute eine allgemeine Frage zur Programmierung. Eigentlich bin ich bei der Programmierung nicht ganz Laie, doch irgendwie will FHEM nicht wie ich möchte.
Zum Thema Klammerebenen habe ich mir natürlich einiges angelesen z.B. http://www.fhemwiki.de/wiki/Klammerebenen

Ich möchte ein einfaches DOIF, dass jedoch bei der Ausführung noch einen Value prüft. Dieser Value soll eben nicht Trigger für den ganzen DOIF werden
Daher muss ich wohl FHEM und Perl verschachteln. Hier ein sehr einfaches Beispiel mit drei dummys die jeweils den Status An und Aus kennen.


define di_beschattung DOIF ([dummy1] eq "An")( \
   { \
      if(Value("dummy2") eq "An") { fhem ("set dummy2 Aus;;set dummy3 Aus") } \
   } \
)


Wenn dummy1 an geht sollen die anderen beiden ausgehen, sofern sie denn überhaupt an sind. Ob dummy2 Aus ist, soll aber kein Trigger sein, daher die Verschachtelung.
DOIF Blöcke sind meiner Info nach in runden Klammern, da es dann mit Perl weiter geht muss ich alles zusätzlich in geschweifte Klammern setzen.
Das ganze bereitet keine Probleme, wenn ich nur einen FHEM Befehl sende also set dummy2 Aus statt set dummy2 Aus;;set dummy3 Aus

Bei mehr als einem Befehl gibt es folgenden Fehler:
di_beschattung: {       if(Value("dummy2") eq "An") { fhem ("set dummy2 Aus;set dummy3 Aus") }    }: Unknown command {, try help.

Ich weiß, dass fhem(" ") im Prinzip unnötig sind, da ich mit den geschweiften Klammern der if-Abfrage ja wieder im FHEM Modus bin.

Ein

define di_beschattungx DOIF ([dummy1] eq "An")( \
   { \
      if(Value("dummy2") eq "An") { set dummy2 Aus;;set dummy3 Aus } \
   } \
)


führt aber zum gleichen Fehler.

Ich befürchte ich seh gerade den Wald vor lauter Bäumen nicht, weshalb ich für den Schubser in die richtige Richtung sehr danbkar wäre.
Bin nur so unschlüssig, warum quasi die ;; das Problem auslösen, da es mit einem Befehl klappt. Ein set dummy2,dummy3 Aus ist hier leider keine Lösung. Letztlich sollen verschiedene Rolladen unterschiedlich geschaltet werden, ich hatte es zum Testen und zur einfachen Veranschaulichung hier im Forum auf ein einfaches Beispiel reduziert.

Vielen Dank für eure Hilfe

igami

Hallo Luco,

DOIF kann eine Abfrage ohne Triggern
Zitat
Rekursionen vermeiden

Das Verändern des Status eines Devices z. B. durch set-Befehl, welches in der Bedingung bereits vorkommt, würde das Modul erneut triggern. Solche Rekursionen (Loops) werden zwar von FHEM unterbunden, können jedoch elegant durch Abfragen mit Fragezeichen [?...] gelöst werden:
Dein Code sollte wie folgt funktionieren:

([dummy1]  eq "An" and [?dummy2] eq "An")
  ((set dummy2, dummy3 Aus))


DOIF ist sehr mächtig, daher die Commandref auch lang. Am besten noch mal in Ruhe durchlesen. Habe ich auch schon öfter als ein Mal gemacht ;) Aber an Beispielen mangelt es eigentlich nicht, manchmal muss man nur kombinieren.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED