Hallo,
wie würdet Ihr denn folgende(s) bisher umgesetztes Suchmuster des notify umsetzen, wenn jetzt als mögliches wakeword noch ziggy dazugekommen ist ?
Muss ich für jeden Fall (das wakeword kommt mal mit mal nicht, je nachdem wie schnell man gesprochen hat) wieder alles angeben (ja die "Liste" ist nicht komplett, deswegen frag ich ja ob man es besser, logischer/korrekter umsetzen könnte) ?
defmod not_Echos_timer_del notify EG_Echo_Kueche:voice:.echo.timer.abbrechen|EG_Echo_Kueche:voice:.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.echo.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.timer.abbrechen|EG_Echo_Kueche:voice:.echo.timer.aus|EG_Echo_Kueche:voice:.timer.aus|EG_Echo_Kueche:voice:.stopp|EG_Echo_Kueche:voice:.echo.stopp|OG_Echo_Wohnzimmer:voice:.echo.timer.aus|OG_Echo_Wohnzimmer:voice:.timer.aus|OG_Echo_Wohnzimmer:voice:.stopp|OG_Echo_Wohnzimmer:voice:.echo.stopp {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;;}
attr not_Echos_timer_del room Sprachsteuerung
setstate not_Echos_timer_del 2022-04-13 20:43:25
setstate not_Echos_timer_del 2022-04-09 21:09:58 state active
setstate not_Echos_timer_del 2022-04-13 20:43:25 triggeredByDev OG_Echo_Wohnzimmer
setstate not_Echos_timer_del 2022-04-13 20:43:25 triggeredByEvent voice: timer abbrechen
Gruß
Thomas
Achtung mit "oder" (das | Zeichen) im Regexp: da notify das Regexp automatisch mit ^ und $ ergaenzt, sollte man Ausdruecke mit "oder" klammern, sonst kommt nicht das raus, was man wuenscht.
Ich wuerde das so umformulieren:
(EG_Echo_Kueche|OG_Echo_Wohnzimmer):voice:.(echo.)?(stopp|timer.abbrechen|timer.aus)
Gut das der Vorschlag von dir kommt.
Weil zuvor hab ich mich am Change Wizard, an den Internals NOTIFYDEV und REGEXP orientiert und demnach hat mMn. eigentlich alles gepasst.
Internals:
.COMMAND {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
DEF EG_Echo_Kueche:voice:.echo.timer.abbrechen|EG_Echo_Kueche:voice:.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.echo.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.timer.abbrechen|EG_Echo_Kueche:voice:.echo.timer.aus|EG_Echo_Kueche:voice:.timer.aus|EG_Echo_Kueche:voice:.stopp|EG_Echo_Kueche:voice:.echo.stopp|OG_Echo_Wohnzimmer:voice:.echo.timer.aus|OG_Echo_Wohnzimmer:voice:.timer.aus|OG_Echo_Wohnzimmer:voice:.stopp|OG_Echo_Wohnzimmer:voice:.echo.stopp {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
FUUID 5f61d850-f33f-78f5-43cd-fa4de425d00605f6
NAME not_Echos_timer_del
NOTIFYDEV OG_Echo_Wohnzimmer,EG_Echo_Kueche
NR 260
NTFY_ORDER 50-EG_Echo_Wohnzimmer_notify
REGEXP EG_Echo_Kueche:voice:.echo.timer.abbrechen|EG_Echo_Kueche:voice:.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.echo.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.timer.abbrechen|EG_Echo_Kueche:voice:.echo.timer.aus|EG_Echo_Kueche:voice:.timer.aus|EG_Echo_Kueche:voice:.stopp|EG_Echo_Kueche:voice:.echo.stopp|OG_Echo_Wohnzimmer:voice:.echo.timer.aus|OG_Echo_Wohnzimmer:voice:.timer.aus|OG_Echo_Wohnzimmer:voice:.stopp|OG_Echo_Wohnzimmer:voice:.echo.stopp
STATE active
TRIGGERTIME 1649875405.30736
TYPE notify
.attraggr:
.attrminint:
READINGS:
2022-04-14 12:36:11 state active
2022-04-13 20:43:25 triggeredByDev OG_Echo_Wohnzimmer
2022-04-13 20:43:25 triggeredByEvent voice: timer abbrechen
Attributes:
comment EG_Echo_Kueche:voice:.echo.timer.abbrechen|EG_Echo_Kueche:voice:.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.echo.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.timer.abbrechen|EG_Echo_Kueche:voice:.echo.timer.aus|EG_Echo_Kueche:voice:.timer.aus|EG_Echo_Kueche:voice:.stopp|EG_Echo_Kueche:voice:.echo.stopp|OG_Echo_Wohnzimmer:voice:.echo.timer.aus|OG_Echo_Wohnzimmer:voice:.timer.aus|OG_Echo_Wohnzimmer:voice:.stopp|OG_Echo_Wohnzimmer:voice:.echo.stopp {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
room Sprachsteuerung
Mit deinem Vorschlag und den Klammern "passt" jetzt der Change Wizard nicht mehr, es gibt kein NOTIFYDEV und bei REGEXP gibts jetzt das Ausrufezeichen, aber es klappt alles, ich meine es ist praktisch wie ich es damals angegangen bin bevor ich mich von dem NOTIFYDEV-Wahn hab verführen lassen und den Bandwurm draus gemacht hab.
Internals:
.COMMAND {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
DEF (EG_Echo_Kueche|OG_Echo_Wohnzimmer):voice:.(echo.|ziggy.)?(stopp|timer.abbrechen|timer.aus) {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
FUUID 5f61d850-f33f-78f5-43cd-fa4de425d00605f6
NAME not_Echos_timer_del
NR 260
NTFY_ORDER 50-EG_Echo_Wohnzimmer_notify
REGEXP (EG_Echo_Kueche|OG_Echo_Wohnzimmer):voice:.(echo.|ziggy.)?(stopp|timer.abbrechen|timer.aus)
STATE 2022-04-14 12:51:16
TRIGGERTIME 1649933476.3086
TYPE notify
.attraggr:
.attrminint:
READINGS:
2022-04-14 12:45:42 state active
2022-04-14 12:51:16 triggeredByDev OG_Echo_Wohnzimmer
2022-04-14 12:51:16 triggeredByEvent voice: ziggy stopp
Attributes:
comment EG_Echo_Kueche:voice:.echo.timer.abbrechen|EG_Echo_Kueche:voice:.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.echo.timer.abbrechen|OG_Echo_Wohnzimmer:voice:.timer.abbrechen|EG_Echo_Kueche:voice:.echo.timer.aus|EG_Echo_Kueche:voice:.timer.aus|EG_Echo_Kueche:voice:.stopp|EG_Echo_Kueche:voice:.echo.stopp|OG_Echo_Wohnzimmer:voice:.echo.timer.aus|OG_Echo_Wohnzimmer:voice:.timer.aus|OG_Echo_Wohnzimmer:voice:.stopp|OG_Echo_Wohnzimmer:voice:.echo.stopp {return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}') if ReadingsNum($NAME,'timer_remainingtime','0') == 0;}
room Sprachsteuerung
Eine Frage zur Performance-Einschätzung noch...
Wenn man den Trigger so notiert, solle NOTIFYDEF ermittelt werden können und die Zahl der effektiv dann in die "Ausführung" übergebenen Events trotzdem eher gering halten:
EG_Echo_Kueche:voice:.*|OG_Echo_Wohnzimmer:voice:.*
Dann müßte man halt danach noch auf die Perl-Ebene runter und $EVENT nochmal anschauen, ob das "zum Rest" paßt. Wenn nein => return.
(Die Einschränkung auf "voice" sollte eigentlich ausreichen, um zu vermeiden, dass man sich den gesamten Eventstapel anschauen muss).
Das wäre die Lösung, die ich hier eher favorisiert hätte (gg. der "nimm erst mal alle Events"-Variante). Kann aber natürlich auch sein, dass das "Holzweg" ist...
Mir gefällt der von Rudi genannte Vorschlag eigentlich sehr gut, wenn keine Einwände mehr kommen (von wem ;D) würd ich das gerne beibehalten wollen.
Was anderes was mir gerade auffällt:
Warum klappt das denn eigentlich, warum wird $NAME in den einfachen Quotes aufgelöst ?
return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}')
Zitat von: TomLee am 14 April 2022, 13:53:31
Warum klappt das denn eigentlich, warum wird $NAME in den einfachen Quotes aufgelöst ?
return fhem ('set $NAME notifications_delete {(sprintf("fw@". ReadingsVal("$NAME","timer_id",0)))}')
Weil da eine "andere" Ersetzungslogik vorgeschaltet ist (EvalSpecials), notify#119:
my $exec = EvalSpecials($ntfy->{".COMMAND"}, %specials);
und danach dann "AnalyzeCommandChain()" aufgerufen wird, in dem dann die %specials auch wieder bekannt sind...
Das ist eher eine "Textersetzungslogik" den Perl-Funktionslogik, was da vorab stattfindet ;) .
U.A. deshalb ist es auch sinnvoll/effektiver, ggf. dann einfach Parameter in myUtils-Code zu übergeben.