FHEM Forum

FHEM => Automatisierung => Thema gestartet von: sTaN am 19 Juli 2016, 18:36:58

Titel: Syntaxproblem für mehrere set Befehle
Beitrag von: sTaN am 19 Juli 2016, 18:36:58
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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: Ellert am 19 Juli 2016, 19:46:52
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


Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag 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:

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ß
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: Otto123 am 19 Juli 2016, 20:37:47
Eigentlich steht hier alles drin. (http://fhem.de/commandref_DE.html#command)
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 (http://www.fhemwiki.de/wiki/E-Mail_senden) nehme, fehlt bei Dir hinter jeder Zeile ein ";"

Ich habe auch wenig Ahnung von Perl    :-X

Gruß Otto
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: Ellert am 19 Juli 2016, 20:43:30
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. ;)
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag 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")
      }
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag 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.
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: sTaN am 20 Juli 2016, 23:25:49
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...
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: Otto123 am 20 Juli 2016, 23:44:23
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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: CoolTux am 21 Juli 2016, 00:06:11
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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: scooty am 21 Juli 2016, 08:49:27
Scheinst ja statt der von ellert vorgeschlagenen Lösung (https://forum.fhem.de/index.php/topic,55781.msg473729.html#msg473729) (in meinen Augen die eleganteste)  bei einem IF-Konstrukt bleiben zu möchten.
Du könntest auch statt des Perl-"if" das FHEM-"IF" (http://fhem.de/commandref.html#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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag 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.
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: Otto123 am 21 Juli 2016, 09:44:31
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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: scooty am 21 Juli 2016, 09:55:43
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
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: CoolTux am 21 Juli 2016, 10:10:10
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.
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: sTaN am 21 Juli 2016, 20:13:11
Zitat von: CoolTux am 21 Juli 2016, 10:10:10
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.

Nein ganz im Gegenteil. Ich bin euch unheimlich dankbar für die vielen Infos. Am Anfang war mir noch gar nicht bewusst, dass DOIF und Perl so unterschiedlich sind, weshalb ich den ersten Tip gar nicht so recht wahrgenommen habe bzw. unbewusst gemixxt habe.
Ich werde mal beide Varianten versuchen bzw. vielleicht sogar die Dritte mit FHEM-"IF".

Vielen Dank für den vielen Input! Sobald ich eine funktionierende Lösung habe, werde ich mich noch mal melden. Oder auch bei nicht funktionierenden Versuchen. ;-)
Spätestens am Wochenende.

Gruß
sTaN

Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: sTaN am 21 Juli 2016, 21:14:07
So nun habe ich doch den ersten Tip von Ellert umgesetzt bekommen, welcher auch funktioniert... ::)
Sorry, dass ich da wohl anfangs auf dem Schlauch stand.

Mein DEF sieht nun wie folgt aus:
([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dawn") (set Media on;set TVBacklight on)
DOELSEIF ([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dusk") (set Media on;set TVLampen on)
DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dawn") (set Media on;set TVBacklight off)
DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dusk") (set HUEGroup4 on;set Media off;set TVLampen off)


Als Attribut habe ich wait 0:0:10:10 gesetzt, sodass er beim Abschalten der Media Steckdose noch wartet, bis alle Geräte wie Dreambox etc. ordentlich ausgeschaltet wurden.

Leider scheint es nicht möglich zu sein, im DEF Kommentare zu setzen, da ich für die Bedingungen noch eine Beschreibung gemacht hatte:

#Wenn Aktivität auf FB gestartet wird und Tag ist, schalte Media Steckdose und TV Backlight an
([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dawn") (set Media on;set TVBacklight on)
#Wenn Aktivität auf FB gestartet wird und Abend ist, schalte Media Steckdose und TV Lampen (Couch- & Backlight) an
DOELSEIF ([harmonyhub:currentActivity] !~ "PowerOff" and [?DayNight] eq "dusk") (set Media on;set TVLampen on)
#Wenn Power off auf FB gedrückt wird und Tag ist, schalte Media Steckdose und TV Hintergrundlich aus
DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dawn") (set Media on;set TVBacklight off)
#Wenn Power off auf FB gedrückt wird und Abend ist, schalte Media Steckdose, TV Lampen (Couch- & Backlight) aus, sowie Schlafzimmerlicht an
DOELSEIF ([harmonyhub:currentActivity] eq "PowerOff" and [?DayNight] eq "dusk") (set HUEGroup4 on;set Media off;set TVLampen off)


Gibt es hier eine Möglichkeit Kommentare einzufügen?

Gruß
sTaN
Titel: Antw:Syntaxproblem für mehrere set Befehle
Beitrag von: scooty am 21 Juli 2016, 21:18:33
Nicht nur # sondern ##
Siehe "Lesbarkeit der Definitionen (http://fhem.de/commandref_DE.html#DOIF_Lesbarkeit_der_Definitionen)" im DOIF-Abschnitt der commandref.

Andreas