FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: gestein am 31 Januar 2020, 21:03:03

Titel: [gelöst] Klammersetzung im notify
Beitrag von: gestein am 31 Januar 2020, 21:03:03
Hallo,

ich verzweifle gerade an einem Notify.
Eigentlich möchte ich nur von einem ROOMMATE-Device (rr_Gerhard) per pushmsg benachrichtig werden, wenn derjenige geht oder kommt.

Dazu habe ich mir ein notify definiert:
defmod n_rr_Gerhard notify rr_Gerhard:presence:.* IF ("$EVTPART1" eq "present") (\
set pushmsg msg 'fhem' 'Gerhard ist Zuhause.'\
) ELSE (\
IF ("$EVTPART1" eq "abwesend") (\
set pushmsg msg 'fhem' 'Gerhard ist weggegangen.'\
)\
ELSE (\
{Log 1, "rr_Gerhard, $EVENT"},\
set pushmsg msg 'fhem' 'Gerhard ist $EVENT, $EVTPART1'\
)\
    )
attr n_rr_Gerhard addStateEvent 1
attr n_rr_Gerhard room Anwesenheiten
attr n_rr_Gerhard verbose 5


Das funktionierte auch gut, bis ich mir vorgenommen hatte einfach mal die Dauer des Aufenthaltes dazu zunehmen.
Wenn ich den Aufruf des pushmsg so ändere, dann kommt eine Fehlermeldung bei der Ausführung:
set pushmsg msg 'fhem' 'Gerhard ist Zuhause. Er war '.{ReadingsVal('$NAME','durTimerAbsence','??')}.' weg.'

Fehlermeldung im log-file:
2020.01.31 20:56:18.652 5 : Triggering n_rr_Gerhard
2020.01.31 20:56:18.653 4 : n_rr_Gerhard exec IF ("$EVTPART1" eq "present") ( set pushmsg msg 'fhem' 'Gerhard ist Zuhause. Er war '.{ReadingsVal('$NAME','durTimerAbsence','??')}.' weg.' ) ELSE ( IF ("$EVTPART1" eq "abwesend") ( set pushmsg msg 'fhem' 'Gerhard ist weggegangen. Er war '.{ReadingsVal('$NAME','durTimerPresence','??')}.' Zuhause.' ) ELSE ( {Log 1, "rr_Gerhard, $EVENT"}, set pushmsg msg 'fhem' 'Gerhard ist $EVENT, $EVTPART1' ) )
2020.01.31 20:56:18.655 3 : n_rr_Gerhard return value: IF: no right bracket: {ReadingsVal(\'rr_Gerhard\'


Wo ist da mein Denkfehler?
Danke für jede Hilfe.
lg, Gerhard
Titel: Antw:Klammersetzung im notify
Beitrag von: Otto123 am 31 Januar 2020, 21:11:57
Hallo Gerhard,

Du kannst so machen mit String:
ReadingsVal('Name des Gerätes','Reading','')
oder so mit Variable
ReadingsVal($NAME,'Reading','')

Gruß Otto
Titel: Antw:Klammersetzung im notify
Beitrag von: Thyraz am 31 Januar 2020, 21:18:49
Kann man wirklich einfach so einen Perl Teil mitten im FHEM Kommando einfügen?
Das Verbinden von Strings mit einem Punkt ist ja auch Perl Syntax...


edit: hätte es eher so versucht (ungetestet):

{
  my $absence = ReadingsVal("$NAME","durTimerAbsence","??");;
  fhem("set pushmsg msg 'fhem' 'Gerhard ist Zuhause. Er war $absence weg.'");;
}
Titel: Antw:Klammersetzung im notify
Beitrag von: gestein am 31 Januar 2020, 21:48:56
Hallo,

Danke für die Tipps.
Wenn ich nun das hier mache: set pushmsg msg 'fhem' 'Gerhard ist Zuhause. Er war '.{ReadingsVal($NAME,'durTimerAbsence','??')}.' weg.'
dann kommt der gleiche Fehler:
2020.01.31 21:30:40.907 5 : Triggering n_rr_Gerhard
2020.01.31 21:30:40.908 4 : n_rr_Gerhard exec IF ("$EVTPART1" eq "present") ( set pushmsg msg 'fhem' 'Gerhard ist Zuhause. Er war '.{ReadingsVal($NAME,'durTimerAbsence','??')}.' weg.' ) ELSE ( IF ("$EVTPART1" eq "abwesend") ( set pushmsg msg 'fhem' 'Gerhard ist weggegangen. Er war '.{ReadingsVal($NAME,'durTimerPresence','??')}.' Zuhause.' ) ELSE ( {Log 1, "rr_Gerhard, $EVENT"}, set pushmsg msg 'fhem' 'Gerhard ist $EVENT, $EVTPART1' ) )
2020.01.31 21:30:40.910 3 : n_rr_Gerhard return value: IF: no right bracket: {ReadingsVal(rr_Gerhard


Verstehen tue ich es nicht.

Mit der Methode von Thyraz klappt es.
Anscheinend kann fhem keine so komplexen Operationen in einem Rutsch.

Danke auf alle Fälle.
lg, Gerhard
Titel: Antw:Klammersetzung im notify
Beitrag von: Otto123 am 31 Januar 2020, 22:02:36
Sorry, hab ich vorhin nicht genau geschaut. 

Nein Du kannst in eine FHEM Befehl nicht so ohne weiteres Perl Code einbetten. Insgesamt kein leichtes Thema. concatenation geht an der Stelle nicht.
Mit all den Klemmern und ' und " ist es auch nicht so einfach.

Der set Befehl kann es über set magic.

Was gehen könnte:
set pushmsg msg fhem Gerhard ist Zuhause. Er war {(ReadingsVal($NAME,"durTimerAbsence","??"))} weg.
falls es so in der Kommandozeile von FHEM geht:
set pushmsg msg fhem Gerhard ist Zuhause. Er war {(ReadingsVal("rr_Gerhard","durTimerAbsence","??"))} weg.

Ich weiß aber nicht was pushmsg so braucht, die 'fhem' in deinem Code irritiert mich.

Insgesamt ist es aber einfacher und übersichtlicher, den gesamten Ausführungsteil im notify auf Perl umzustellen!

Gruß Otto
Titel: Antw:Klammersetzung im notify
Beitrag von: gestein am 31 Januar 2020, 22:22:22
Hallo Otto,

Da hast Du recht.
Auf perl umzustellen ist wesentlich sinnvoller!

Vielen Dank!
lg, Gerhard