Klammern in fhem

Begonnen von sven.scherf, 16 März 2019, 16:58:31

Vorheriges Thema - Nächstes Thema

sven.scherf

Hallo zusammen,

ich weiß es gibt hier genügend tasks und auch ein Wiki aber ich kommen einfach nicht dahinter.
Vielleicht kann mir einer das verständlich erklären mit dem Klammern in Fhem.

Das Wiki(https://wiki.fhem.de/wiki/Klammerebenen) erklärt, dass wenn man in fhem die Perl Ebenen mit {} aufruft.
In Perl selber werden Fhem commands mit {} aufgerufen.

If else Konstrukte innerhalb von Perl werden mit {} definiert, dass ist genau mein Problem in meinem Code.


define n_Radio_test notify Schalter_1 { \
{ fhem ("set Schalter_4 on") } \
if(ReadingsVal('SATReceiver','mute','off') eq 'on') \
{ fhem ('define at_SATReceiver_input_test at +00:00:05 { \
if(ReadingsVal("SATReceiver","input","tv") eq "radio") { fhem ("set Schalter_2 on") } \
if(ReadingsVal("SATReceiver","power","on") eq "on") { fhem ("sleep 2;;;;set Schalter_3 on") } \
} \
') \
} \
else \
{ fhem ("set Schalter_5 on") } \
}


Dieser Code ist funktional.

Die erste { ich gehe auf die Perl Ebene. = notify Schalter_1 { \
Die zweite { ich führe das Fhem Command Schalter_4 on aus. = { fhem ("set Schalter_4 on") } \
Die dritte { ich führe das Fhem Command define at_ aus. = { fhem ('define at_SATRe
Die vierte { ich gehe hier im fhem at Befehl auf die Perl Ebene zurück. = at +00:00:05 { \
Die fünfte und sechste { ich führe Fhem Befehle auf der Perl Ebene aus. = { fhem ("set Schalter_2 on") } und { fhem ("sleep 2;;;;set Schalter_3 on") }

Die fünfte } (vor dem else) schließt die dritte { wo der Fhem at Befehl definiert wurde wieder. = } \

Wenn ich nun, da Perl if else mit {} funktioniert else nun so definiere } else { funktioniert das ganze nicht mehr.
und ich bekomme diesen Fehler in Fhem wenn ich es dort editiere
syntax error at (eval 1139712) line 10, near "} else"
syntax error at (eval 1139712) line 12, near "}
}"


Die siebte { führt ja wieder einen Fhem Befehl auf der Perl Ebene aus.

Wo ist hier mein Denkfehler ?

Vielen Dank und Grüße

Sven





Raspi 3 mit CUL Stick 433/868MHZ, Homematic

zwiebert

Warum postest du nicht den Code der *nicht* funktioniert?

Bin auf diesen Code gekommen:


defmod n_Radio_test notify Schalter_1 { \
{ fhem ("set Schalter_4 on") } \
if(ReadingsVal('SATReceiver','mute','off') eq 'on') \
{ fhem ('defmod at_SATReceiver_input_test at +00:00:05 { \
if(ReadingsVal("SATReceiver","input","tv") eq "radio") { fhem ("set Schalter_2 on") } \
if(ReadingsVal("SATReceiver","power","on") eq "on") { fhem ("sleep 2;;;;set Schalter_3 on") } \
} \
') \
} else { fhem ("set Schalter_5 on") } \
}


...aber der funktioniert ja. Oder was meintest du mit }else{ ?

mfg Bert

sven.scherf

Hi,

wenn ich es so schreibe

defmod n_Radio_test notify Schalter_1 { \
{ fhem ("set Schalter_4 on") } \
if(ReadingsVal('SATReceiver','mute','off') eq 'on') \
{ fhem ('defmod at_SATReceiver_input_test at +00:00:05 { \
if(ReadingsVal("SATReceiver","input","tv") eq "radio") { fhem ("set Schalter_2 on") } \
if(ReadingsVal("SATReceiver","power","on") eq "on") { fhem ("sleep 2;;;;set Schalter_3 on") } \
} \
') \
}
} else {
{ fhem ("set Schalter_5 on") } \
}



Hier habe ich vor und nach else die {} gesetzt wie es laut Perl eigentlich sein sollte.
Dies { fhem ("set Schalter_5 on") } ist ja der fhem Aufruf in Perl.

Diese scheinen aber nicht so zu stimmen.

Warum ?

Viele Grüße

Sven
Raspi 3 mit CUL Stick 433/868MHZ, Homematic

CoolTux

mit { } gehst Du auf Perlebene. Danach arbeitest Du komplett mit Perl.
fhem() ist eine Funktion, Funktionen ruft man mit fnName() auf. Und nicht mit { fnName() }

Ich empfehle ein klein bisschen Grundladen im Netz zum Thema Perl zu suchen. Oder du verwendest FHEM Befehle/Module IF zum Beispiel.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

FHEM trennt Befehle (egal welcher Sorte, FHEM, Shell, Perl) beim ; (aka Strichpunkt).
Falls man im Befehl selbst ein Strichpunkt braucht, dann schreibt man ;;
Beispiel:define a at +00:01 set Lampe off; set Lampe onschaltet Lampe _jetzt_ an, und in einer Minute aus. Dagegen schaltet
define a at +00:01 set Lampe off;; set Lampe ondie Lampe in einer Minute aus und _dann_ sofort an.

Das wird komplizierter, wenn man Befehle schachtelt, z.Bsp. wenn ein notify ein at definiert, was wiederum zwei Befehle absetzen will.
Im Wiki/etc hat sich vmtl. deswegen durchgesetzt, Perl-Befehle einzeln in {} zu packen, statt (wie ueblich) diese mit ; abzuschliessen.
Der Perl-Programmierer kriegt bei den vielen {} grosse Augen, und wendet sich ab, auch wenn es zu funktionieren scheint.

Ich empfehle an Stellen, wo man ueber das Schuetzen der ; nachdenken muss, eine eigene Perl-Funktion in 99_myUtils.pm anzulegen, dann kann man in Ruhe nach jedem Befehl genau 1 Strichpunkt schreiben, und auch die Syntax-Fehlermeldungen werden verstaendlicher.

zwiebert

#5
...da fehlen nur ein paar klammern


defmod n_Radio_test notify Schalter_1 { \
{ fhem ("set Schalter_4 on") } \
if(ReadingsVal('SATReceiver','mute','off') eq 'on') { \
{ fhem ('defmod at_SATReceiver_input_test at +00:00:05 { \
if(ReadingsVal("SATReceiver","input","tv") eq "radio") { fhem ("set Schalter_2 on") } \
if(ReadingsVal("SATReceiver","power","on") eq "on") { fhem ("sleep 2;;;;set Schalter_3 on") } \
} \
') \
} \
} else { \
{ fhem ("set Schalter_5 on") } \
} \
}


Im Raw-Definiton Editor  zeigt er die matchenden Klammern an.

...hab auch erst mit FHEM angefangen, und mein erstes DOIF war eine zeitraubende Angelegenheit und am Ende hab ich dann doch nach einigen Tagen alles nach 99_myUtils.pm verfrachtet.  Bei so vielen Klammern braucht man wirklich einen Editor der einem dabei hilft. In Lisp ist das ganz extrem.

edit: Weiß nicht mehr genau, aber für Syntax-Highlighting im Raw-Definition Fenster musste man glaub ich erst ein Attribut vom WEB Gerät setzen. Ich glaube das wurde interaktiv oder automatisch gemacht als ich "Edit Files" zum ersten mal benutzt habe.?

attr WEB JavaScripts codemirror/fhem_codemirror.js


mfg Bert

sven.scherf

Hallo,

Viele Dank. Ich werde es versuchen umzusetzen und die Perlbefehle erst einmal mit ; abzusetzen.

Später werde ich es dann auslagern.


Viele Grüße

Sven
Raspi 3 mit CUL Stick 433/868MHZ, Homematic