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 (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
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