[gelöst] Klammersetzung im notify

Begonnen von gestein, 31 Januar 2020, 21:03:03

Vorheriges Thema - Nächstes Thema

gestein

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

Otto123

Hallo Gerhard,

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

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

Thyraz

#2
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.'");;
}
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

gestein

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

Otto123

#4
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
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

gestein

Hallo Otto,

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

Vielen Dank!
lg, Gerhard