Seite 2 von 3

Re: Alexa soll antworten die angesprochen wird

Verfasst: 17. Feb 2022 16:00
von udo1toni
Es muss im Vergleich == heißen.

Code: Alles auswählen

a   = b -> weise der Variablen a den Wert von b zu.
a  == b -> wahr, wenn a gleich b ist.
a === b -> wahr, wenn a identisch mit b ist.
a  >= b -> wahr, wenn a größer oder gleich b ist.
a  <= b -> wahr, wenn a kleiner oder gleich b ist.
a  != b -> wahr, wenn a ungleich b ist.
a !== b -> wahr, wenn a nicht identisch mit b ist.
identisch: Spielt bei openHAB nur im Zusammenhang mit null eine Rolle (bitte nicht mit NULL verwechseln).
Intern funktionieren Variablen über Zeiger auf Speicherzellen. Enthält eine Variable keinen Wert, so wird der Zeiger dieser Variablen auf den Zeiger auf den Wert null gesetzt. Beispiel: a = null. Damit verweist a dann auf die Speicherzelle, welche den null-Wert enthält. Sie repräsentiert nicht einfach den gleichen Wert, sondern sie verweist auf exakt diesen Wert.

Re: Alexa soll antworten die angesprochen wird

Verfasst: 9. Mär 2022 12:01
von tommesd
Nachdem mein Modell jetzt geändert wurde (In der Gruppe Fenster sind jetzt alle Gruppen der Räume enthalten und darin die eigentlichen Fenster) und der Zustand der Fenster in der dazugehörigen Gruppe gespeichert wird, kann man die Rule soweit anpassen, dass sie noch funktioniert?
gFenster_alle enthält gFenster_Raum1, gFenster_Raum2 etc
gFenster_Raum1 enthält alle Fenster von Raum 1 als String Item
gFenster_Raum1 ist OPEN sobald 1 Fenster im Raum offen ist
gFenster_alle ist OPEN sobald 1 Fenster im Haus offen ist
Theoretisch würde ich mir das so vorstellen:
Wenn gFenster_alle CLOSED dann Alexa, alle Fenster sind zu
Wenn gFenster_alle OPEN, dann werden alle Gruppen gesucht die auf OPEN stehen, und dann die enthaltenen offenen Fenster in eine Liste geschrieben, die dann von Alexa vorgelesen wird.
Könntest Du mir da nochmal helfen wie das funktionieren würde?

Re: Alexa soll antworten die angesprochen wird

Verfasst: 9. Mär 2022 16:26
von udo1toni
Die Frage ist, in welcher Form Du die Antwort haben willst. Über alle Räume? Dann müsstest Du einfach als Gruppe gFenster_alle verwenden, aber statt .members nutzt Du nun .allMembers.
Achtung! .allMembers enthält alle Items, welche keine Group Items sind, aber irgendwo die Gruppe gFenster_alle als Elter haben. Entsprechend ist der Status hier jeweils vom Typ String.

Re: Alexa soll antworten die angesprochen wird

Verfasst: 10. Mär 2022 11:39
von tommesd
funktioniert, danke

Re: Alexa soll antworten die angesprochen wird

Verfasst: 3. Apr 2022 16:30
von salexes
Hi tommesd & openhabforum community,

Ich nutze zum ersten Mall das Echo Control Binding und versuche gerade folgendes umzusetzen.

Ich habe ein Switch Item mit Alexa verbunden und wenn es ausgelöst wird will ich die Antwort auf dem Alexa Gerät bekommen bei dem ich gefragt habe.

Ich habe drei verschiedene Alexa Geräte, diese heißen folgendermaßen:
Wohnzimmer
Schlafzimmer
Küche

Ich bin ziemlich verwirrt und kann nicht ganz nachvollziehen wie deine Regel funktioniert um zu erkennen welches Alexa Gerät gerade gefragt wurde.

Wäre es möglich das du mir erklären könntest wie genau das funktioniert? Würde das gerne bei mir zuhause nutzen nur komme ich alleine gerade irgendwie nicht weiter.

LG

Re: Alexa soll antworten die angesprochen wird

Verfasst: 5. Apr 2022 15:22
von iceman
Hallo,
bin da auch gerade dabei und es funktioniert sehr gut!
Ich habe 6 Echo's wo ich jeweils das Lastvoice und das Sprich-Item in eine Gruppe gepackt habe.
Die Regel sieht dann ganz simpel so aus bei mir.

Code: Alles auswählen

rule "Das ist ein Test"

when
        Member of group_alexa_lastvoice changed to "heimkino t. v. einschalten"
then
    val String strRaum = triggeringItem.name.split("_").get(0) 
    val iAlexa = group_alexa_sprich.members.filter[i|i.name.split("_").get(0) == strRaum].head
       
  
   iAlexa.sendCommand("Ich schalte das Heimkino zum TV gucken ein.")
    

end
Hoffe das ist dir eine Hilfe

Re: Alexa soll antworten die angesprochen wird

Verfasst: 12. Apr 2022 11:37
von salexes
tommesd hat geschrieben: 17. Feb 2022 08:51 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
Hi, ich versuche auch gerade fest zustellen welche Fenster offen sind und hätte da eine frage, wie genau funktioniert dieser Befehl?

val OffeneFenster = Fenster.members.filter[ i | i.state.toString == "OPEN" ].map[ label ].reduce[ s, label | s + ", " + label ]

Soweit ich das verstanden habe, hast du eine Fenstergruppe in der alle deine Fenster sind, dann checkst du nach dem OPEN status aber was macht der rest des befehls genau also alles ab .map ?

Re: Alexa soll antworten die angesprochen wird

Verfasst: 12. Apr 2022 12:35
von udo1toni
Also, .members liefert eine Liste (von Items). .filter liefert einen Teil dieser Liste, ebenfalls als Liste.
.map nimmt diese Liste und erstellt eine Liste, in der ein bestimmter Aspekt aller Listenelemente dargestellt wird. Hier ist es das Label aller Listenelemente.
.reduce erzeugt aus der Liste einen String. s ist dabei die Variable, in der der vollständige String erzeugt wird., label ist die Variable, die jeweils das aktuelle Listenelement enthält.
Die Liste wird nun durchlaufen und der String wird dergestalt aufgebaut, dass jeweils der bisherige String (s), gefolgt von der Zeichenfolge ", " (also ein Komma und ein Leerzeichen), gefolgt vom aktuellen Listenelement eingebaut wird.
Das Ergebnis ist also ein String, in dem alle Label aller Items enthalten sind, die den Zustand OPEN haben.
Ich nutze das selbst nicht und bin mir deshalb nicht sicher, ob der Ergebnisstring nun mit ", " beginnt, oder s zunächst mit dem 1. Listenelement vorbelegt wird.

Re: Alexa soll antworten die angesprochen wird

Verfasst: 19. Apr 2022 15:40
von salexes
Perfekt danke für die Erklärung, es funktioniert nun perfekt für mich!

Gibt es die Möglichkeit das statt das das letzte Item das genannt wir mit einem Komma genannt wird mit einem und beendet wird?

Sprich so:
Folgende Fenster sind geöffnet: Küchenfenster, Wohnzimmerfenster, Schlafzimmerfenster und Esszimmerfenster.
bzw.
Folgende Fenster sind geöffnet: Küchenfenster, Wohnzimmerfenster, Schlafzimmerfenster & Esszimmerfenster.

Re: Alexa soll antworten die angesprochen wird

Verfasst: 19. Apr 2022 20:46
von udo1toni
:) die einfachste Variante wäre, den String, nachdem er mal aufgebaut wurde, einer weiteren Funktion zuzuführen, in der das letzte "," durch die Zeichenfolge " und" ersetzt wird.