FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: wuast94 am 28 Dezember 2016, 19:28:43

Titel: If/ElseIf edingung funktioniert nicht.
Beitrag von: wuast94 am 28 Dezember 2016, 19:28:43
Ich habe gerade folgende bedingung geschrieben:

define act_on_denon notify denon {\
if (ReadingsVal("denon", "signal ", "$EVENT") eq "Dolby TrueHD")\
{fhem("set denon surroundMode Movie")}\
elseif{(ReadingsVal("denon", "signal ", "$EVENT") eq "DTS")\
{fhem("set denon AllZoneStereo on")}}\
}


das hier ist die Fhem Log/event ausgabe: (Bzw ein auschnitt aber ich denke es sind alle nötigen Infos vorhanden

2016.12.28 18:58:15 1 : PERL WARNING: elseif should be elsif at (eval 24050) line 4.
2016.12.28 18:58:15 3 : eval: my $SELF='act_on_denon';my $EVENT='signal: Dolby TrueHD';my $EVTPART0='signal:';my $NAME='denon';my $TYPE='DENON_AVR';my $EVTPART2='TrueHD';my $EVTPART1='Dolby';{ if (ReadingsVal("denon", "signal ", "$EVENT") eq "Dolby TrueHD") {fhem("set denon surroundMode Movie")} elseif{(ReadingsVal("denon", "signal ", "$EVENT") eq "DTS") {fhem("set denon AllZoneStereo on")}} }
2016.12.28 18:58:15 3 : act_on_denon return value: syntax error at (eval 24050) line 5, near ") {" syntax error at (eval 24050) line 6, near "} }"
2016-12-28 18:58:15 DENON_AVR denon lowFrequencyEffects: 0 dB
2016-12-28 18:58:15 DENON_AVR denon signal: Dolby TrueHD


Tabelle (Wenn signal dann befehl)





Musik/Videosignalnötiger set befehl
MusikPCMset denon AllZoneStereo on
FilmDolby TrueHDset denon surroundMode Movie

Was soll Passieren ?

ich möchte gerne das meine anlage bei stereo signalen (PCM) automatisch in den AllZoneStereo modus geht (signal wird auf alle boxen verteilt)und wenn ich filme gucke aus diesem modus auch wieder von alleine raus geht

wenn ich jetzt einen film an mache ändert sich das reading "signal" in "Dolby TrueHD" dann soll (entweder wenn AllZoneStereo = on oder einfach generell) "set denon AllZoneStereo off" und "set denon surroundMode Movie" ausgeführt werden.

wenn musik angemacht wird ändert sich das reading in "PCM" dann soll "set denon AllZoneStereo on" ausgeführt werden

Für weitere Infos stehe ich gerne berreit und freue mich über jede hilfe :)
Titel: Antw:If/ElseIf edingung funktioniert nicht.
Beitrag von: Devender am 28 Dezember 2016, 19:47:20
Korrigieren bitte mal dein else Zweig so wie das Log es auch schreibt.
Nicht elseif sondern elsif.

Dann schauen wir mal was uebrig bleibt.
Btw. Das Leerzeichen nach "Signal " ist korrekt?
Titel: Antw:If/ElseIf edingung funktioniert nicht.
Beitrag von: Puschel74 am 28 Dezember 2016, 20:01:22
Wie Devender schon geschrieben hat -
elsif und nicht elseif

Aber:
if (ReadingsVal("denon", "signal ", "$EVENT")
ReadingsVal möchte 3 Argumente - hast du zwar aber die Argumente teilen sich so auf:
(ReadingsVal("Device", "Reading", "Ersatzwert")
Abgesehen davon das ein "$EVENT" nicht als $EVENT interpretiert wird - in " " wird $EVENT nicht aufgelöst -
bringt das $EVENT als Ersatzwert vermutlich nicht viel - je nachdem was denon so an Events drauf hat  ;)

Besser wäre mMn
(ReadingsVal("denon", "signal", "undef")
Warum?
Sollte das Reading signal im Device denon nicht gelesen werden können wird undef verwendet - bei dir $EVENT (und zwar wirklich $EVENT und nicht der Inhalt der Variable).

Besser wäre aber das RegExp enger zu fassen.
denon {
triggert auf alles was das Device denon so um sich wirft.
Wenn du nur auf das Reading signal triggern willst wäre vermutlich
denon:signal {
besser da das notify nur noch triggert wenn das Reading signal vom Device denon was zu melden hat.

Noch besser wäre es die fhem.cfg zu vergessen und nur im DEF zu arbeiten - aber das soll jeder machen wie er will.
Und der absolute Highlander wäre es im Eventmomitor zu schauen was das Device denon zu bieten hat - und das dann auch zu posten.

OT: Was ich gerne mache wenn ich ein neues notify erstelle -
Ich lass mir per
Log(0,"$NAME - $EVENT");
erstmal im Logfile von FHEM zeigen was das Device so drauf hat und passe dann entsprechend meine Codes an  ;)
$EVENT lässt sich manchmal (wenn es Leerzeichen enthält) auch mit $EVTPART1 --- $EVTPARTx (x=2-weitere je nach Leerzeichen) aufspliten.
Das lässt sich auch wunderbar loggen bis man findet was man sucht  8)
Titel: Antw:If/ElseIf edingung funktioniert nicht.
Beitrag von: wuast94 am 28 Dezember 2016, 20:15:46
so habe das ganze mal (wenn richtig verstanden) nach euren verbesserungen angepasst:

define act_on_denon notify denon:signal {\
if (ReadingsVal("denon", "signal", "undef") eq "Dolby TrueHD")\
{fhem("set denon surroundMode Movie")}\
elsif{(ReadingsVal("denon", "signal ", "undef") eq "DTS")\
{fhem("set denon AllZoneStereo on")}}\
}


den code poste ich auf der fhem.cfg weil da alles zusammen hängt und alle infos drin sind :)

jetzt passiert immer noch nichts bei der anlage und im fhem log/event monitor sehe ich nur noch das die anlage die readings ändert und das wars
Titel: Antw:If/ElseIf edingung funktioniert nicht.
Beitrag von: Puschel74 am 28 Dezember 2016, 20:19:50
Zitatden code poste ich auf der fhem.cfg weil da alles zusammen hängt und alle infos drin sind
Also dann musst du dich noch einlesen wie wo und welche Zeichen zu setzen sind damit Zeilen abgeschlossen werden oder diverse Zeichen maskiert werden.
Weiters dann auch noch was zu beachten ist wenn die fhem.cfg direkt bearbeitet wird.
Titel: Antw:If/ElseIf edingung funktioniert nicht.
Beitrag von: Devender am 28 Dezember 2016, 20:32:39
Über ein list act_on_denon in der fhem Eingabezeile bekommst du auch alles zusammen.
Was sagt den dein Log im Verbose 5? Notify mal das Attribute Verbose 5 setzen.

Wenn du sagst, dass die Readings sich aendern aber nichts passiert dann hast noch was nicht richtig im notify.
Wenn dein set nicht ausgeführt wird kannst du auch mal ein setstate meindummy xxxxblabla (vorher dummy anlegen) einbauen um zu sehen, ob die if/else Geschichte funktioniert