[gelöst] Trigger und zusätzliche Zustandsabfrage - wie geht das?

Begonnen von locodriver, 13 Februar 2022, 16:32:59

Vorheriges Thema - Nächstes Thema

locodriver

Hallo!

Das ursprüngliche Thema ist folgendes:

Zitat von: locodriver am 12 Februar 2022, 17:25:21
Ich habe mal etwas experimentiert...

Als erstes das Attribut "intervalvoice" mit dem Wert 8 - wie vorgeschlagen angelegt.

Dann ein DOIF hard codiert:

Internals:
   CFGFN     
   DEF        ([WZ_Echo_Dot:"^voice:.alexa.wie.ist.die.feuchtigkeit.im.arbeitszimmer$"]) (set WZ_Echo_Dot speak Im Arbeitszimmer beträgt die Luftfeuchtigkeit [AZ_Sensor:humidity] %)
DOELSEIF
([WZ_Echo_Dot:"^voice:.alexa.wie.ist.die.feuchtigkeit.im.wohnzimmer$"]) (set WZ_Echo_Dot speak Im Wohnzimmer beträgt die Luftfeuchtigkeit [WZ_Sensor:humidity] %)
   FUUID      6207cd15-f33f-b425-3566-5173ac44058f7453
   MODEL      FHEM
   NAME       Ask_states
   NOTIFYDEV  WZ_Echo_Dot,global
   NR         103626
   NTFY_ORDER 50-test2
   STATE      cmd_2
   TYPE       DOIF
   VERSION    25590 2022-01-30 11:30:21
   READINGS:
     2022-02-12 17:16:29   Device          WZ_Echo_Dot
     2022-02-12 16:44:00   cmd             2
     2022-02-12 16:44:00   cmd_event       WZ_Echo_Dot
     2022-02-12 16:44:00   cmd_nr          2
     2022-02-12 17:16:29   e_WZ_Echo_Dot_events microphone: false,deviceAddress: DE,timeZoneId: Europe/Berlin
     2022-02-12 16:43:30   mode            enabled
     2022-02-12 16:44:00   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       WZ_Echo_Dot:
         0:
           &STATE     ^WZ_Echo_Dot$
         1:
           &STATE     ^WZ_Echo_Dot$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('WZ_Echo_Dot',$hash,'^voice:.alexa.wie.ist.die.feuchtigkeit.im.arbeitszimmer$',1)
     1          ::EventDoIf('WZ_Echo_Dot',$hash,'^voice:.alexa.wie.ist.die.feuchtigkeit.im.wohnzimmer$',1)
   do:
     0:
       0          set WZ_Echo_Dot speak Im Arbeitszimmer beträgt die Luftfeuchtigkeit [AZ_Sensor:humidity] %
     1:
       0          set WZ_Echo_Dot speak Im Wohnzimmer beträgt die Luftfeuchtigkeit [WZ_Sensor:humidity] %
     2:
   helper:
     NOTIFYDEV  WZ_Echo_Dot,global
     event      microphone: false,deviceAddress
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   WZ_Echo_Dot
     timerevent voice: alexa wie ist die feuchtigkeit im wohnzimmer
     triggerDev WZ_Echo_Dot
     timerevents:
       voice: alexa wie ist die feuchtigkeit im wohnzimmer
       voice_timestamp: 1644680633915
       BrowserUserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
       BrowserLanguage: de,en-US;q=0.7,en;q=0.3
     timereventsState:
       voice: alexa wie ist die feuchtigkeit im wohnzimmer
       voice_timestamp: 1644680633915
       BrowserUserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
       BrowserLanguage: de,en-US;q=0.7,en;q=0.3
     triggerEvents:
       microphone: false
       deviceAddress:
       timeZoneId: Europe/Berlin
     triggerEventsState:
       microphone: false
       deviceAddress:
       timeZoneId: Europe/Berlin
   internals:
   readings:
   trigger:
     all         WZ_Echo_Dot
   uiState:
   uiTable:
Attributes:
   do         always
   room       Test


Das funzt schon mal. Alexa antwortet zwar erst mit "das wird noch nicht unterstützt", aber danach kommt die Ansage.

Wie kann man das generalisieren?

1. Das man nicht den genauen Wortlaut verwenden muss sondern nur die Räume und die Werte (z.B. Temp., Feuchte, Fenster, Rolas) aus der Anfrage extrahiert werden? In etwa Trigger auf Raum und zusätzliche Bedingung Art der Anfrage (s.o.).

2. Nur je einen Abfragezweig für die verschiedenen Wertearten und nicht für jede einzelne Abfrage einen eigenen?

und:

Zitat von: locodriver am 12 Februar 2022, 17:41:05
Eine Abwandlung in der Art funzt leider nicht:

([WZ_Echo_Dot:"voice:küche$"] and [?WZ_Echo_Dot:voice] =~"feuchtigkeit") (set WZ_Echo_Dot speak In der Küche beträgt die Luftfeuchtigkeit [KU_Sensor:humidity] %)

Kann man möglicherweise grundsätzlich das gleiche Reading nicht für Trigger und Abfrage in einem DOIF-Zweig nutzen? Würde dann eventuell ein userreading helfen...?

Da es meiner Meinung nach ein DOIF-Thema wird, poste ich meine Frage hier nochmals.

Ich will mit meiner Abfrage nicht unbedingt den festen Wortlaut verwenden und im DOIF checken lassen (dann würde auch eine Alexaroutine funzen...) sondern nur Schlüsselworte verifizieren (insbesondere Räume und Werte (Fenster, Feuchte, Rolas)).

Das obere DOIF funzt - triggert aber auf den genauen Wortlaut. Um das flexibler zu gestalten sollen - ähnlich wie im zweiten Beispiel - nur bestimmte Satzteile der Alexaanfrage ausgewertet werden. Entweder Trigger auf Raum und Check des Zustandes der Devices oder umgekehrt.

Wie kann das klappen?
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

locodriver

Jetzt habe ich mal wieder Zeit gefunden, mich mit dem Thema auseinander zu setzen...

O.g. DOIF habe ich jetzt folgendermaßen angepasst:

([WZ_Echo_Dot:voice] =~"küche|bad" and [?WZ_Echo_Dot:voice] =~"feucht|warm|grad|temperatur|status|zustand") (set WZ_Echo_Dot speak In der Küche beträgt die Luftfeuchtigkeit [KU_Sensor:humidity] %)

Das funzt soweit, es kommt zwar erst die Aussage: "Küche unterstützt das nicht", aber dann erfolgt die Ansage des Wertes der Feuchtigkeit.

Da das momentan hard codiert ist, müsste ich für jede Abfrage (Feuchte, Temp., Fenster, Rollladen) und jeden Raum separate DOELSEIF-Zweige anlegen.

Gibt es eine Möglichkeit, an die Bedingungen "heran zu kommen", welche den DOIF-Zweig triggern? Ziel ist, in Abhängigkeit davon, im Ausführungsteil automatisch den richtigen Raum und das richtige Reading zu bekommen.
Also im Text soll der Raum austauschbar sein und aus Raumangabe und der Bedingung soll das passende Gerät mit dem richtigen Reading bzw. STATE ausgegeben werden:
In der Küche beträgt die Luftfeuchtigkeit [KU_Sensor:humidity] %
Im Bad beträgt die Luftfeuchtigkeit [KU_Sensor:humidity] %
In der Küche beträgt die Temperatur  [KU_Sensor:temperature] °C
In der Küche ist der Rollladen [KU_Rola]
In der Küche ist das Fenster [KU_Fenster]
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

Alle Information, auf die du zugreifen kannst, kannst du auch auswerten. Allerdings wird das im FHEM-Modus umständlich. Daher solltest du so etwas im Perl-Modus programmieren. Die Angaben in der Bedingung wie hier [WZ_Echo_Dot:voice] oder [?WZ_Echo_Dot:voice] kannst du noch mal auswerten, um auf das Device zu schließen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

locodriver

Das Event (hier z.B. küche oder bad) bekomme ich ja in $DEVICE zur weiteren Verwendung zurück, mit den Bedingungen geht das so wohl nicht, nur über eine erneute Abfrage im Ausführungsteil, oder habe ich da etwas übersehen?

Mit dem Perlmodus habe ich mich noch nicht beschäftigt; gibt es da ein Beispiel, welches meiner Fragestellung gerecht wird - also Übergabe von Event und Bedingung?

Ansonsten werde ich je Raum einen DOIF-Zweig erstellen - immer noch besser, als >20 Zweige...
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

Zitat von: locodriver am 29 Mai 2022, 15:01:18
Das Event (hier z.B. küche oder bad) bekomme ich ja in $DEVICE zur weiteren Verwendung zurück, mit den Bedingungen geht das so wohl nicht, nur über eine erneute Abfrage im Ausführungsteil, oder habe ich da etwas übersehen?

Mit dem Perlmodus habe ich mich noch nicht beschäftigt; gibt es da ein Beispiel, welches meiner Fragestellung gerecht wird - also Übergabe von Event und Bedingung?

Ansonsten werde ich je Raum einen DOIF-Zweig erstellen - immer noch besser, als >20 Zweige...

Also in deinem Beispiel kann $DEVICE ja nur WZ_Echo_Dot sein, denn $DEVICE ist das triggernde Device - mehr sehe in deinem Bespiel nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

locodriver

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

locodriver

Ich habe das jetzt so gelöst, dass für jeden Raum ein DOIF-Zweig vorhanden ist und dann im Ausführungsteil eine sub aufgerufen wird. Es werden zwei Parameter übergeben: der Raumname und der Raumname als Präfix zur Bildung der Devicenamen. In der sub wird dann nach Gerätegruppen unterschieden und dann die entsprechende Ansage generiert.

Das funzt für mich ganz gut und ich muss keinen eigenen Skill erstellen...

([WZ_Echo_Dot:voice] =~"küche" and [?WZ_Echo_Dot:voice] =~"feucht|status|zustand|position|stellung|fenster|tür|geöffnet|offen|geschlossen|gekippt") ({AnswerStates("Küche","KU_",)})
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