If/ElseIf edingung funktioniert nicht.

Begonnen von wuast94, 28 Dezember 2016, 19:28:43

Vorheriges Thema - Nächstes Thema

wuast94

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 :)
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

Devender

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?
FHEM 5.8 auf RasPi mit Jessy - CUL868, JeeLink Lacrosse
Komponenten: HM, IT, ELV, FB7390, FritzPL543,Sonos Play3
Mehrere Wandtablets sowie einen Smart Mirror
https://wiki.fhem.de/wiki/Anwesenheitserkennung#PRESENCE-Modul

Puschel74

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)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

wuast94

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
Zigbee  Temp+Luftdruck+Humi Bewegungsmeldern Tür Kontakte, Klingel, TV, Denon, Schaltbare Steckdosen mit leistungsmessung, und weiteres

Homeassistant mit Nodered

Puschel74

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.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Devender

Ü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
FHEM 5.8 auf RasPi mit Jessy - CUL868, JeeLink Lacrosse
Komponenten: HM, IT, ELV, FB7390, FritzPL543,Sonos Play3
Mehrere Wandtablets sowie einen Smart Mirror
https://wiki.fhem.de/wiki/Anwesenheitserkennung#PRESENCE-Modul