Suchmuster für mehrere Devices mit x-möglichen auslösenden Werten :o

Begonnen von TomLee, 13 April 2022, 21:04:09

Vorheriges Thema - Nächstes Thema

TomLee

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

rudolfkoenig

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)

TomLee

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

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TomLee

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)))}')

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors