Syntaxproblem für mehrere set Befehle

Begonnen von sTaN, 19 Juli 2016, 18:36:58

Vorheriges Thema - Nächstes Thema

sTaN

Hallo liebe community,

ich habe meine Logitech Harmony Elite soweit erfolgreich konfiguriert und in FHEM eingebunden. Ich scheitere allerdings vermutlich gerade an der Syntax, um beim Ausschalten meiner Geräte mehrere set-Befehler auszuführen.

Mein aktueller Code der funktioniert und bei der Aktion Power Off auf der Harmony FB meine Geräte, sowie Funksteckdose für Geräte und TV Lampen ausschaltet:

#Auf den Schaltvorgang des Harmony Hubs reagieren
define Multimedia_Automatik DOIF ([harmonyhub:currentActivity] !~ /PowerOff/) ({\
   if (Value("DayNight") eq "dawn") {\
      fhem("set Media,TVBacklight on")\
   } else {\
   if (Value("DayNight") eq "dusk"){\
      fhem("set Media,TVLampen on") }\
   }\
}) DOELSEIF ([harmonyhub:activity] eq "PowerOff") ({\
   if (Value("DayNight") eq "dawn") {\
      fhem("set Media,TVBacklight off")\
   } else {\
   if (Value("DayNight") eq "dusk"){\
     fhem("set Media,TVLampen off") }\
   }\
})
attr Multimedia_Automatik wait 0:10


Sobald ich nun Versuche in der letzten if-Kondition noch meine Schlafzimmerlampen zu schalten, funktioniert der ganze Ausschaltvorgang scheinbar nicht mehr:

Zitat#Auf den Schaltvorgang des Harmony Hubs reagieren
define Multimedia_Automatik DOIF ([harmonyhub:currentActivity] !~ /PowerOff/) ({\
   if (Value("DayNight") eq "dawn") {\
      fhem("set Media,TVBacklight on")\
   } else {\
   if (Value("DayNight") eq "dusk"){\
      fhem("set Media,TVLampen on") }\
   }\
}) DOELSEIF ([harmonyhub:activity] eq "PowerOff") ({\
   if (Value("DayNight") eq "dawn") {\
      fhem("set Media,TVBacklight off")\
   } else {\
   if (Value("DayNight") eq "dusk"){\
     fhem("set Media,TVLampen off"); fhem("set HUEGroup4 on") }\
   }\
})
attr Multimedia_Automatik wait 0:10

Diese Zeile:

fhem("set Media,TVLampen off"); fhem("set HUEGroup4 on") }\

muss also dann der Übeltäte sein. Ich habe auch folgende Syntax versucht:

fhem("set Media,TVLampen off ;; set HUEGroup4 on") }\

Beides bringt keinen Fehler, außer, dass er Media und TVLampen nicht mehr schaltet.

Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Ellert

#1
Ein Vorteil von DOIF ist, dass Du auf Perl fast verzichten kannst, das macht es übersichtlicher.
Im eingebauten Editor codemirror ist eine Syntaxprüfung eingebaut: https://forum.fhem.de/index.php/topic,45373.0.html

Wenn Du in der Detail-Ansicht des Gerätes im WEB-Frontend auf DEF klickst und dann auf modify findet die Syntaxprüfung statt.

Ohne Perl sieht es im DEF-Editor etwa so aus:

DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dawn") (set ...)
DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dusk") (set ...)
DOELSEIF ([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dawn") (set ...)
DOELSEIF ([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dusk") (set ...)

mit dem Attribut
wait 10:10:0:0



sTaN

Das ist natürlich cool, danke!
Allerdings wird mir auch dort kein Syntax Fehler angezeigt. :-/

Habe es jetzt mal so im DEF definiert:

([harmonyhub:currentActivity] !~ /PowerOff/) ({
   if (Value("DayNight") eq "dawn") {
      fhem("set Media,TVBacklight on")
   } else {
   if (Value("DayNight") eq "dusk"){
      fhem("set Media,TVLampen on") }
   }
}) DOELSEIF ([harmonyhub:activity] eq "PowerOff") ({
   if (Value("DayNight") eq "dawn") {
      fhem("set Media,TVBacklight off")
      } else {
      if (Value("DayNight") eq "dusk"){
          fhem("set Media,TVLampen off")
          fhem("set HUEGroup4 on")
      }
   }
})


Sobald ich fhem("set HUEGroup4 on") wieder rausnehme, schaltet er mir Media und TVLampen aus. Mit dieser Zeile passiert gar nichts und ich bekomme den Fehler im Event Monitor:

Zitat016-07-19 20:25:09 DOIF Multimedia_Automatik error: {    if (Value("DayNight") eq "dawn") {       fhem("set Media,TVBacklight off")       } else {       if (Value("DayNight") eq "dusk"){           fhem("set Media,TVLampen off")           fhem("set HUEGroup4 on")       }    } }: syntax error at (eval 327328) line 1, near ")           fhem" 
2016-07-19 20:25:09 DOIF Multimedia_Automatik cmd_2

Wie bekomme ich zwei sets in der Funktion definiert?

Gruß
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

#3
Eigentlich steht hier alles drin.
Nur bei DOIF ist es etwas anders.
Für DOIF gilt: (Auszug Commandref)
ZitatEnthält ein Befehl Kommata, ist er zusätzlich in runde Klammern einzuschliessen (<Befehlsteil a>, <Befehlsteil b> ... )

Wenn ich das mal als Beispiel nehme, fehlt bei Dir hinter jeder Zeile ein ";"

Ich habe auch wenig Ahnung von Perl    :-X

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

#4
Zitat von: sTaN am 19 Juli 2016, 20:28:58
Das ist natürlich cool, danke!
Allerdings wird mir auch dort kein Syntax Fehler angezeigt. :-/

Habe es jetzt mal so im DEF definiert:

([harmonyhub:currentActivity] !~ /PowerOff/) ({
   if (Value("DayNight") eq "dawn") {
      fhem("set Media,TVBacklight on")
   } else {
   if (Value("DayNight") eq "dusk"){
      fhem("set Media,TVLampen on") }
   }
}) DOELSEIF ([harmonyhub:activity] eq "PowerOff") ({
   if (Value("DayNight") eq "dawn") {
      fhem("set Media,TVBacklight off")
      } else {
      if (Value("DayNight") eq "dusk"){
          fhem("set Media,TVLampen off")
          fhem("set HUEGroup4 on")
      }
   }
})


Sobald ich fhem("set HUEGroup4 on") wieder rausnehme, schaltet er mir Media und TVLampen aus. Mit dieser Zeile passiert gar nichts und ich bekomme den Fehler im Event Monitor:

Wie bekomme ich zwei sets in der Funktion definiert?

Gruß

Mit PERL im DOIF habe ich kaum Erfahrung und in der direkten Bearbeitung der Konfigurationsdatei auch nicht.

Die Fehlermeldung sagt wo der Fehler liegen könnte: line 1, near ")           fhem"

Für das perlfreie DOIF würde es so aussehen:
((set Media,TVLampen off), set HUEGroup4 on)

Edit: Mir fällt gerade auf, dass Du sehr sparsam mit dem Semikolon um gehst. ;)

RomanticBoy83

Es fehlt min. ein ';' in dem letzten Block. Das würde auch zu dem Fehler passen.

if (Value("DayNight") eq "dusk"){
          fhem("set Media,TVLampen off");
          fhem("set HUEGroup4 on")
      }

CoolTux

Also ich an Deiner Stelle würde meine Anfrage ja besser in die DOIF Sektion schieben. Da finden sich dann auch Wissende.
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

sTaN

Zitat von: RomanticBoy83 am 20 Juli 2016, 20:18:47
Es fehlt min. ein ';' in dem letzten Block. Das würde auch zu dem Fehler passen.

if (Value("DayNight") eq "dusk"){
          fhem("set Media,TVLampen off");
          fhem("set HUEGroup4 on")
      }


Trotz Semikolon und genau so funktioniert es nicht und er schaltet dann gar nichts mehr aus. Sobald ich die Zeile fhem("set HUEGroup 4 on") wieder rausnehme, funktioniert das Ausschalten wieder.

Ich verstehs nicht...
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

Wenn Du ; in der Kommandozeile von FHEM eingibst musst Du ;; schreiben.
Wenn Du ; in der DEF eingibst musst Du nur ; schreiben.
Du brauchst auch nicht zweimal fhem() aufrufen, das geht kürzer:
Für die DEF
fhem("set Media,TVLampen off;set HUEGroup4 on")
Für die Kommandozeile also beim define
fhem("set Media,TVLampen off;;set HUEGroup4 on")

Abgesehen davon würde ich nicht innerhalb eines DOIF wieder so exzessive mit if arbeiten. Das geht doch sicher alles auf DOIF Ebene.
Verschieb Deine Frage am Besten ins DOIF Unterforum.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

Zitat von: CoolTux am 20 Juli 2016, 20:32:07
Also ich an Deiner Stelle würde meine Anfrage ja besser in die DOIF Sektion schieben. Da finden sich dann auch Wissende.

Mein Reden  ;D
Guts Nächtle
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

scooty

Scheinst ja statt der von ellert vorgeschlagenen Lösung (in meinen Augen die eleganteste)  bei einem IF-Konstrukt bleiben zu möchten.
Du könntest auch statt des Perl-"if" das FHEM-"IF" verwenden. Damit umgeht man die Perl-Ebene auch.
Also ungefähr so:
([harmonyhub:currentActivity] !~ /PowerOff/) (
   IF ([DayNight] eq "dawn") (
      (set Media,TVBacklight on)
   )
   ELSE (
      IF ([DayNight] eq "dusk") (
         (set Media,TVLampen on)
       )
   )
)
DOELSEIF
usw.

Code für DEF des DOIF

Andreas
Fhem auf Gigabyte Brix
CUL V3 HM / CUL V3 MAX / MaxCube aFW Homematic&MAX / ZWave.me ZME_UZB1 / SDuino 433 / Velux KLF200
Homematic / MAX / Logitech Hub / ZWave / Wifi LED / div. 433 Temperatursensoren / pywws WH1080 / IO Homecontrol

CoolTux

@scooty
Könnten wir uns bitte entscheiden zwischen if und IF? Das eine ist ein FHEM Hilfsmodul das andere ist Perlsyntax.
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

Otto123

Moin,
Ein guter Freund hat mal zu mir gesagt: wenn Du ein großes Problem nicht lösen kannst, teile es auf in lauter kleine Teilprobleme und löse die alle EINZELN.
Deswegen diese Empfehlungen von mir an sTaN: Lerne die kleine Details:
- mehrere set Befehle kombinieren. Kann man prima und schnell in der FHEM Kommandozeile testen und lernen,
- Umgang mit Semikolon in verschiedenen Situationen
- Entscheide dich für DOIF oder Perl, beides führt zur Lösung!
DOIF wurde eigentlich geschaffen, um mit einfachen Ausdrücken ohne Perl auszukommen.

Viel Erfolg
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

scooty

Zitat von: CoolTux am 21 Juli 2016, 09:24:54
@scooty
Könnten wir uns bitte entscheiden zwischen if und IF? Das eine ist ein FHEM Hilfsmodul das andere ist Perlsyntax.
Genau, die Qual der Wahl hat nun sTaN.  ;)

Andreas
Fhem auf Gigabyte Brix
CUL V3 HM / CUL V3 MAX / MaxCube aFW Homematic&MAX / ZWave.me ZME_UZB1 / SDuino 433 / Velux KLF200
Homematic / MAX / Logitech Hub / ZWave / Wifi LED / div. 433 Temperatursensoren / pywws WH1080 / IO Homecontrol

CoolTux

Das ist das Problem, der arme Kerl ist so durch den Wind und Unwissend das es eher eine Qual ist wenn hier noch 5 andere Varianten kommen.
Mal davon ab das er nicht viel von Vorschlägen hält die Sinn ergeben. Otto und ich hatten dazu schon was geschrieben.
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