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?
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]
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.
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...
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.
Ja hast recht, habe ich auch gerade bemerkt...
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_",)})