elsif mag nicht. Syntaxfehler...

Begonnen von Frank_Huber, 21 September 2016, 11:27:20

Vorheriges Thema - Nächstes Thema

Frank_Huber

Hallo,

findet hier jemand den Syntaxfehler?
define Licht_Bad_OG1_Test notify Licht_Bad_1_Test:on.* {\
if (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "on")  {\
  fhem ("set OUT_2 PortA1 off")\
}\
elsif (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "off")   {\
   fhem ("set OUT_2 PortA1 off" ;; "set OUT_2 PortA2 off")\
}\
elsif Value("OUT2_A1") eq "off" {\
   fhem ("set OUT_2 PortA1 on" ;; "set OUT_2 PortA2 on")\
}\
}\
}


Hab das ganze von hier rausgeholt und modifiziert: http://www.fhemwiki.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen

im Log bekomme ich:
Zitat2016.09.21 11:20:18 1: PERL WARNING: Bareword found where operator expected at (eval 1545) line 7, near "" ; "set"
2016.09.21 11:20:18 3: eval: my $TYPE='dummy';my $NAME='Licht_Bad_1_Test';my $EVTPART0='on';my $SELF='Licht_Bad_OG1_Test';my $EVENT='on';{
if (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "on")  {
  fhem ("set OUT_2 PortA1 off")
}
elsif (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "off")   {
   fhem ("set OUT_2 PortA1 off" ; "set OUT_2 PortA2 off")
}
elsif Value("OUT2_A1") eq "off" {
   fhem ("set OUT_2 PortA1 on" ; "set OUT_2 PortA2 on")
}
}
}
2016.09.21 11:20:18 3: Licht_Bad_OG1_Test return value: Can't find string terminator '"' anywhere before EOF at (eval 1545) line 7.

Wers findet bekomt nen Bier. :-)

/Frank

DeeSPe

Beim zweiten elsif fehlen die Klammern!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

MadMax-FHEM

Zitat von: Frank_Huber am 21 September 2016, 11:27:20
Hallo,

findet hier jemand den Syntaxfehler?
define Licht_Bad_OG1_Test notify Licht_Bad_1_Test:on.* {\
if (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "on")  {\
  fhem ("set OUT_2 PortA1 off")\
}\
elsif (Value("OUT2_A1") eq "on") && (Value("OUT2_A3") eq "off")   {\
   fhem ("set OUT_2 PortA1 off" ;; "set OUT_2 PortA2 off")\
}\
elsif Value("OUT2_A1") eq "off" {\
   fhem ("set OUT_2 PortA1 on" ;; "set OUT_2 PortA2 on")\
}\
}\
}


Hab das ganze von hier rausgeholt und modifiziert: http://www.fhemwiki.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen

im Log bekomme ich:
Wers findet bekomt nen Bier. :-)

/Frank

Was schon mal auffällt: eine '}' zuviel und evtl. mal statt 'elsif Value("OUT2_A1") eq "off"' -> 'elsif (Value("OUT2_A1") eq "off")'
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

FHEMAN

Zitat von: Frank_Huber am 21 September 2016, 11:27:20
fhem ("set OUT_2 PortA1 on" ; "set OUT_2 PortA2 on")
Hallo Frank, das mit dem Semikolon zwischen Anführungsstrichen finde ich persönlich komisch, ist aber sicher nicht falsch. Ich würde sowas ohne die Anführungsstriche schreiben und besser noch zusammengefasst:
fhem ("set OUT_2 PortA1,OUT_2 PortA2 on")
Dies nur als Tip, denn syntaktisch ist das ja nicht falsch.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

DeeSPe

#4
Zitat von: FHEMAN am 21 September 2016, 11:49:22
Hallo Frank, das mit dem Semikolon zwischen Anführungsstrichen finde ich persönlich komisch, ist aber sicher nicht falsch. Ich würde sowas ohne die Anführungsstriche schreiben und besser noch zusammengefasst:
fhem ("set OUT_2 PortA1,OUT_2 PortA2 on")
Dies nur als Tip, denn syntaktisch ist das ja nicht falsch.

Das ist in der Tat einfacher! Am Besten noch mit FILTER verwenden um die Last gering zu halten.
Das mit der einen geschweiften Klammer zu viel stimmt auch!
Des Weiteren hat sich im ersten fhem noch ein falsches " dawischen gemogelt!

So sollte es gehen:
define Licht_Bad_OG1_Test notify Licht_Bad_1_Test:on.*{\
if (Value("OUT2_A1") eq "on" && Value("OUT2_A3") eq "on")\
{\
  fhem ("set OUT_2 PortA1 off")\
}\
elsif (Value("OUT2_A1") eq "on" && Value("OUT2_A3") eq "off")\
{\
   fhem ("set OUT_2 PortA1 off" ;; "set OUT_2 PortA2 off")\
}\
elsif (Value("OUT2_A1") eq "off")\
{\
   fhem ("set OUT_2 PortA1 on" ;; "set OUT_2 PortA2 on")\
}\
}


Gruß
Dan

EDIT: Sorry, war noch nicht richtig! Hatte etwas zwischendurch übersehen im Code. Ist nun berichtigt.
Das mit FILTER ist hier leider doch nicht so einfach wie ich dachte...

EDIT2: Hab noch ein paar zu viele Klammern entdeckt und entfernt!
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Frank_Huber

Danke euch allen!
mit den Formatierungen, Klammern und all dem tu ich mich manchmal noch schwer,
super dass hier dann immer so super schnell geholfen wird!

Die Anführungsstriche ums Semikolon hatte ich mal rein zum Test. man probiert ja erstmal rum wenns ned geht. :-)
Die set Befehle habe ich jetzt auch zusammengefasst. und eine Leerstelle eingefügt nach :on.*

Hintergrung des Ganzen ist ein Bad mit zwei Zugängen. in der Mitte als "Raumteiler" die Dusche.
Ich will an jeder Tür nen Licht-Taster und das Licht der Dusche in Abhängigkeit zu den Beiden Seiten mit an oder ausschalten. :-)

Jetzt gibts dann noch den zweiten Notify für die andere Seite und dann wird getestet.

define Licht_Bad_OG1_Test notify Licht_Bad_1_Test:on.* {\
if (Value("OUT2_A1") eq "on" && Value("OUT2_A3") eq "on")\
{\
  fhem ("set OUT_2 PortA1 off")\
}\
elsif (Value("OUT2_A1") eq "on" && Value("OUT2_A3") eq "off")\
{\
   fhem ("set OUT_2 PortA1,A2 off")\
}\
elsif (Value("OUT2_A1") eq "off")\
{\
   fhem ("set OUT_2 PortA1,A2 on")\
}\
}

DeeSPe

Als gut gemeinten Tipp kann ich Dir dazu nur Folgendes mitgeben:

  • NIEMALS die fhem.cfg manuell bearbeiten! Meine fhem.cfg ist innerhalb FHEMs gar nicht editierbar/speicherbar.
  • Alle Definitionen über die FHEM Eingabezeile anlegen und über DEF manuell verändern, das spart auch die ganzen doppelten Semikolon und Zeilenabschlüsse, da diese dann automatisch ergänzt werden. Finde es auch sehr müßig ständig überlegen zu müssen ob nun doppeltes Semikolon oder Zeilenabschluss oder oder oder...
  • Am besten bearbeiten lässt sich Code immer noch in einem dafür geeigneten Editor. Als Beispiel nenne ich hier "Sublime Text" da ich mit diesem aufgrund anderer Code-Schreibereien am besten umgehen kann. Dieser hat auch eine Autovervollständigung mit drin und Code-Folding und und und.....

Meine 99_myUtils.pm bearbeite ich ausschließlich mit dem externen Editor. Wenn ich fertig bin wird alles innerhalb der Datei kopiert und dann in FHEM->edit files in die Datei eingefügt und gespeichert.
Für komplexere notify(s) oder at(s) mache ich das genau so. Den Code aus der DEF holen, im externen Editor bearbeiten und dann wieder in DEF einfügen und speichern.

Vielleicht hilft Dir das etwas besser mit der Materie klar zu kommen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe