Regex in triggernden Devices und Ausführung im triggernden Device

Begonnen von locodriver, 15 Januar 2024, 12:00:15

Vorheriges Thema - Nächstes Thema

locodriver

Hallo!

Ich versuche mich an einer Regex, die mehrere Geräte abfragen soll (Echo-Dots) und auf dem angesprochenen Echo-Dot die Antwort ausgibt.
Bisher hatte ich einen Echo und das funzt wunderbar; ich triggere auf ein Wort im Reading "voice" und werte dann weitere in der gleichen Abfrage in "voice" aus:


([AZ_Echo_Dot:voice] =~"rollladen|rollläden" and [?AZ_Echo_Dot:voice] =~"öffnet|öffnen")
(set AZ_Echo_Dot speak Alle Rollläden öffnen um {(substr( ReadingsVal("AZ_Rola_move","timer_01_c01",""),11,5))} Uhr.)

Jetzt habe ich einen zweiten Echo und ich möchte die Abfrage verallgemeinern. D.h., "AZ" muss im Trigger und in der Abfage verallgemeinert werden und die Sprachausgabe soll nur auf dem auslösenden Echo erfolgen.
Außerdem ist mir jetzt noch eingefallen, dass die Zustandsabfrage (hier öffnen...) sich dann genau auf den triggernden Echo beziehen muss... Es könnte ja sein, dass im anderen Echo aus einer vorherigen Abfrage ebenfalls noch "öffnen steht.


Die Echos heißen AZ_Echo_Dot und WZ_Echo_Dot.

Meine Versuche waren leider nicht von Erfolg gekrönt, sodass ich hier um Ideen nachfrage...

Dankeschön.
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

locodriver

Hallo Damian, danke für deine Hinweise.

Mit dem Perl-Modus habe ich  mich noch nicht beschäftigt. Ereignisabfragen hatte ich probiert, allerdings bekomme ich die Regex dafür nicht hin und bei meinen Versuchen hatte ich mir sogar die ganze DOIF-Def. zerlegt...

Ich habe es jetzt als "Zwischenlösung" so gelöst:

(([AZ_Echo_Dot:voice] =~"rollladen|rollläden" or [WZ_Echo_Dot:voice] =~"rollladen|rollläden") and [?$DEVICE:voice] =~"öffnet|öffnen")
(set $DEVICE speak Alle Rollläden öffnen um {(substr( ReadingsVal("AZ_Rola_move","timer_01_c01",""),11,5))} Uhr.)

Allerdings befriedigt mich das nicht so richtig. Bei zwei Dots mag das ja noch gehen - aber falls es mehr werden sollten, dann ist das nicht mehr so übersichtlich.

Noch eine Frage zu $DEVICE: ich verwende diese Variable ja in der Abfrage des Zustands "öffnen". Ist die dort schon vom Modul entgültig definiert oder hat diese Lösung nur zufällig funktioniert?

Da dieses DOIF viel mehr ähnliche Zweige hat und es auch noch andere in ähnlicher Art betrifft, wollte ich gerne eine "elegante" Lösung haben.

Dankeschön.
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Damian

Der Platzhalter $DEVICE wird immer gegen das triggernde Device getauscht, das funktioniert auch bei verschiedenen Devices.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

locodriver

Dann habe ich das ja schon mal richtig gemacht... ;)

In DOIF-Zweigen, in denen die Sprachausgabe in subs generiert wird, übergebe ich das $DEVICE an die sub und dort wird die Variable mit dem angesprochenen Echodot belegt und am Ende die Antwort am entsprechenden Echodot ausgegeben:

(([AZ_Echo_Dot:voice] =~"rollladen|rollläden" or [WZ_Echo_Dot:voice] =~"rollladen|rollläden") and [?$DEVICE:voice] =~"schließt|schließen")({alexaRolaDriveTimes("$DEVICE")})
sub:
sub alexaRolaDriveTimes($) {
my ($echo_dot) = @_;

...

{fhem("set $echo_dot speak $textAlexa")};
}

Das klappt soweit.
Allerdings scheitere ich nach wie vor an der RegEx für beide Echodots - deshalb die "or"-Verknüpfung in der Triggerabfrage.
Meine Versuche endeten meist in einer Fehlermeldung, die den Inhalt der Abfrage offenbar als Zeitangabe interpretiert...

Könnt ihr mir dahingehend auf die Sprünge helfen?

Es soll im obigen Beispiel der jeweils angesprochene Dot triggern wenn im Voice-Reading "rollladen" bzw. "rollläden" vorkommt.

Dankeschön!
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster