Ich möchte bestimmten devices einen live-timer hinzufügen, der anzeigt, wie lange der aktuelle Status schon aktiv ist.
Dieses Beispiel
define n_FBCallmonitor_timer notify \
FBCallmonitor:call|FBCallmonitor:ring|FBCallmonitor:connect|FBCallmonitor:disconnect \
{if (ReadingsVal($NAME,'event','') eq 'disconnect') \
{fhem 'delete a_'.$NAME.'_timer';;} \
else \
{fhem 'setreading '.$NAME.' duration_live 0';;\
fhem 'define a_'.$NAME.'_timer at +*00:00:01 {fhem "setreading '.$NAME.' duration_live ".eval(ReadingsVal("'.$NAME.'","duration_live","0") + 1)}';;\
fhem 'attr a_'.$NAME.'_timer room System';;}}
funktioniert einwandfrei. Nun wollte ich das Ganze optimieren und für die häufigere Verwendung etwas erleichtern. Da passiert leider gar nichts mehr - ich finde aber den Fehler nicht. Was kann ich tun?
define n_FBCallmonitor_timer notify FBCallmonitor:call|FBCallmonitor:ring|FBCallmonitor:connect|FBCallmonitor:disconnect
{if (ReadingsVal('$NAME','event','') eq 'disconnect')
{fhem 'attr a_'.$NAME.'_timer' disable 1';;}
else
{fhem 'setreading '.$NAME.' duration_live 0';;
fhem 'delete a_'.$NAME.'_timer';;
fhem 'define a_'.$NAME.'_timer at +*00:00:01 {fhem "setreading '.$NAME.' duration_live ".eval(ReadingsVal("'.$NAME.'","duration_live","0") + 1)}';;
fhem 'attr a_'.$NAME.'_timer room System';;}}
Es passiert offensichtlich gar nichts!
Das mit $NAME passt schon. Das steht dir im notify zur Verfügung. Allerdings machst du es unnötig kompliziert:
define n_FBCallmonitor_timer notify FBCallmonitor:.*(call|ring|connect|disconnect)
{if ($EVENT =~/event:.disconnect/)
{fhem 'attr a_'.$NAME.'_timer' disable 1';;}
else
{fhem 'setreading '.$NAME.' duration_live 0';;
fhem 'delete a_'.$NAME.'_timer';;
fhem 'define a_'.$NAME.'_timer at +*00:00:01 {fhem "setreading '.$NAME.' duration_live ".eval(ReadingsVal("'.$NAME.'","duration_live","0") + 1)}';;
fhem 'attr a_'.$NAME.'_timer room System';;}}
So ähnlich funktioniert es bei mir.
Dank Dir! Leider ist im $EVENT kein Hinweis auf disconnect enthalten, es wird immer nur die call_id gemeldet.
define n_FBCallmonitor_timer notify
FBCallmonitor:call|FBCallmonitor:ring|FBCallmonitor:connect|FBCallmonitor:disconnect
{if (ReadingsVal($NAME,'event','') eq 'disconnect')
{fhem 'delete a_'.$NAME.'_timer';;}
else
{fhem 'setreading '.$NAME.' duration_live 0';;
fhem 'define a_'.$NAME.'_timer at +*00:00:01 {fhem "setreading '.$NAME.' duration_live ".eval(ReadingsVal("'.$NAME.'","duration_live","0") + 1)}';;
fhem 'attr a_'.$NAME.'_timer room System';;}}
Nun funktioniert es auch bei mir.
Hast du "event" eventuell per event-on-...-reading ausgeschlossen?
Der Code oben funktkioniert bei mir in meiner Version einwandfrei. Ich kann auf alle events per
if ($EVENT =~/event:.EVENTNAME/
reagieren.
Das war der richtige Tipp, nur andersherum, ich musste erst event_on_change reading event setzen, damit auch ein event generiert wird. Vielen Dank!
Noch anders: Ich hatte - warum auch immer - mal verbose 1 gesetzt, da wurde nur noch die call_id gemeldet... gelöscht, gelöst!