Seite 1 von 3

Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 11:40
von tommesd
Hallo zusammen,
ich nutze mehrere HmIP Fenstergriffsensoren in unserem Haus. Ich habe mit freundlicher Unterstützung hier im Forum mit folgender Rule hinbekommen, dass mir offene Türen bzw Fenster über einen Amazon Echo angesagt werden.

Code: Alles auswählen

rule "Welche Türen sind offen"
when
    Item Tuerenabfrage received command
then
    val OffeneTueren = Tueren.members.filter[ i | i.state.toString == "OPEN" ].map[ label ].reduce[ s, label | s + ", " + label ]
      
    if(Tueren.state.toString == "OPEN" )   {
        EchoBuro_Sprich.sendCommand("Folgende Türen sind geöffnet. " + OffeneTueren)
    }
    else
        {
            EchoBuro_Sprich.sendCommand("Alle Türen sind zu")
        }
end
Das funktioniert wunderbar, wenn ich den Befehl von EchoBuro absende.
Kann man diese Rule so erweitern, dass sie jeweils von der Alexa beantwortet wird, von der aus der Befehl entgegengenommen wird?
Gruß
Thomas

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 13:36
von udo1toni
Du benötigst für jede Alexa ein eigenes Item, über das der Befehl ankommt. Ich habe selbst kein Alexa, deshalb die Frage: geht das?
Falls ja, packst Du einfach all diese Items in eine Gruppe. Allerdings musst Du dafür sorgen, dass am NAmen des Items auszumachen ist, um welche Alexa es sich handelt. Weiterhin packst Du die Items, an die Du den Befehl zum sprechen schickst, in eine zweite Gruppe, nennen wir sie hier mal gFrage und gSprich. Wie gesagt musst Du darauf achten, dass die Items passend benannt sind, z.B. EchoBuro_Frage und EchoBuro_Sprich.

Nun lässt Du die Rule auf Member of gFrage received command triggern.
Innerhalb der Rule gibt es nun die implizite Variable triggeringItem, und Du kannst über triggeringItem.name erfahren, welche Alexa gefragt wurde.

Code: Alles auswählen

val String strRaum = triggeringItem.name.split("_").get(0) // der erste Teil des Itemnamens
val iAlexa = gSprich.members.filter[i|i.name.split("_").get(0) == strRaum].head // das erste Item der Gruppe, welches zum gleichen Raum gehört
iAlexa.sendCommand(was auch immer)

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 14:04
von tommesd
Super danke. Es gibt ein Iteam EchoBuro_LetzterSprachbefehl. Ich versuche es heute Abend mal zu bauen.

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 18:31
von udo1toni
openHAB muss halt irgendwie erkennen können, welche Alexa es ansprechen soll :)

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 19:52
von tommesd
Jetzt habe ich doch noch ein Problem. In meiner rule ist das triggering item ein Dummy Schalter, den ich über eine Alexa Routine anspreche. Wie mache ich das dann mit dem lastvoicecommand aus der Gruppe?

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 22:09
von udo1toni
Ja, das musst Du dann anders lösen. openHAB kann nicht hellsehen. Es braucht irgendwoher die Information, welche Alexa angesprochen wurde. Wie wird denn das Dummy Item ausgelöst?

Re: Alexa soll antworten die angesprochen wird

Verfasst: 16. Feb 2022 22:36
von tommesd
wie im Anfangspost geschrieben ist es ein Switch, den ich über Alexa auf ON stelle. Kann man nicht irgendwie abfragen, welche Alexa das letzte Kommando erhalten hat und die soll dann auch die Antwort ausgeben?

Re: Alexa soll antworten die angesprochen wird

Verfasst: 17. Feb 2022 07:12
von sihui
tommesd hat geschrieben: 16. Feb 2022 22:36 Kann man nicht irgendwie abfragen, welche Alexa das letzte Kommando erhalten hat und die soll dann auch die Antwort ausgeben?
Dein Problem wird unter "room awareness" behandelt und die Lösung findest du hier, ist aber leider auch nur ein Workaround:

https://community.openhab.org/t/alexa-v ... a-oh/80480

Re: Alexa soll antworten die angesprochen wird

Verfasst: 17. Feb 2022 07:31
von tommesd
Ich habe es jetzt so gelöst und es funktioniert. Ihr könnte ja mal schauen ob es einen Haken gibt.

Code: Alles auswählen

rule "Welche Türen sind offen"
when
    Member of AlleEchoFrag changed from "alexa" to "welche türen sind offen"
then
    val OffeneTueren = Tueren.members.filter[ i | i.state.toString == "OPEN" ].map[ label ].reduce[ s, label | s + ", " + label ]
    val String strRaum = triggeringItem.name.split("_").get(0) // der erste Teil des Itemnamens
    val iAlexa = AlleEchoAntworten.members.filter[i|i.name.split("_").get(0) == strRaum].head // das erste Item der Gruppe, welches zum gleichen Raum gehört
//    iAlexa.sendCommand(was auch immer)
      
    if(Tueren.state.toString == "OPEN" )   {
        iAlexa.sendCommand("Folgende Türen sind geöffnet. " + OffeneTueren)
    }
    else
        {
            iAlexa.sendCommand("Alle Türen sind zu")
        }
end
Danke für die Hilfe

Re: Alexa soll antworten die angesprochen wird

Verfasst: 17. Feb 2022 08:51
von tommesd
Anbei meine Rule für die Fenster, unterteilt nach offenen und gekippten Fenstern. Wenn mind ein Fenster offen oder gekippt ist funktioniert es, aber wenn alle zu sind nicht. Im Log hat er ein Problem mit dem UND in der letzten IF Abfrage.

Code: Alles auswählen

rule "Welche Fenster sind offen"
when
        Member of AlleEchoFrag changed from "alexa" to "fensterabfrage"
then
    val OffeneFenster = Fenster.members.filter[ i | i.state.toString == "OPEN" ].map[ label ].reduce[ s, label | s + ", " + label ]
    val KippFenster = Fenster.members.filter[ i | i.state.toString == "TILTED" ].map[ label ].reduce[ s, label | s + ", " + label ]
    val String strRaum = triggeringItem.name.split("_").get(0) 
    val iAlexa = AlleEchoAntworten.members.filter[i|i.name.split("_").get(0) == strRaum].head
       
if (Fenster.members.filter[ i | i.state.toString == "OPEN" ].size > 0)   
   {iAlexa.sendCommand("Folgende Fenster sind geöffnet. " + OffeneFenster)}
    
if (Fenster.members.filter[ i | i.state.toString == "TILTED" ].size > 0)   
   {iAlexa.sendCommand("Folgende Fenster sind gekippt. " + KippFenster)}        

if (Fenster.members.filter[ i | i.state.toString == "OPEN" ].size = 0 && Fenster.members.filter[ i | i.state.toString == "TILTED" ].size = 0)
   {iAlexa.sendCommand("Alle Fenster sind zu")}

end