Alles auf einen Blick
ToggleIntegration von Alexa mit Home Assistant
Wer Home Assistant nutzt und zufällig die eine oder andere Alexa bei sich zuhause stehen hat, weiß sicherlich auch, dass beides wunderbar miteinander kombiniert werden kann.
Aber unabhängig davon, dass man mit Alexa die rudimentären Funktionen steuern kann, wie „Schalte Licht an und aus“ und sich Alexa dabei direkt auf den Raum bezieht in dem man sich mit dem Alexa Gerät auch befindet, lassen sich hier auch noch ganz andere tolle Sachen umsetzen.
Beispielsweise gibt es eine Möglichkeit, Alexa mit einem vollständigem Satz nach etwas zu befragen und dann Home Assistant etwas tun zu lassen.
In meinem Beispiel möchte ich das einmal an einer Integration mit meinem „Smarten“ Katzenklo zeigen.
Alexa teilt mir zwar (initiiert durch Home Assistant und TTS) regelmäßig mit, wie oft das Katzenklo benutzt worden ist. Aber was ist, wenn ich zufällig abseits der stündlichen Erinnerung wissen möchte, wie oft das Klo benutzt worden ist? Dann bleibt mir nur der Weg in die Counter-Variable im Home Assistand Dashboard zu sehen, richtig? Falsch ;). Ich möchte Alexa fragen können und eine Antwort dazu erhalten.
Das erkläre ich euch heute einmal, wie sich das umsetzen lässt.
Voraussetzungen
Was muss Alexa und Home Assistant erfüllen, damit wir das erreichen können, was wir wollen?
Nicht viel: Der allgemeine Alexa-Skill sollte funktionieren. Das heißt, ihr solltet in Alexa eure Geräte, Szenen und ggf. Schalter von Home Assistant sehen können.
Ich nutze hierfür die Home Assistant Cloud. Einerseits, weil es mir das Geld wert ist, die Entwickler zu unterstützen und andererseits, weil es problemlos funktioniert (zugegeben, der Start damals war etwas holprig, aber seitdem hatte ich nie wieder Probleme mit Alexa und Home Assistant).
Es gibt auch noch Alternativen um den Alexa-Skill mit Home Assistant zu nutzen, diese habe ich aber nicht ausprobiert.
Wichtig ist: Diese Basis sollte erstmal funktionieren.
Danach könnt Ihr ganz easy loslegen.
Auf Los geht’s Los:
Als erstes erstellt Ihr euch ein Skript, dieses wird später Alexa als Szene bekannt gemacht um darauf zugreifen zu können. Dieses Skript funktioniert grundsätzlich wie eine normale Automatisierung, enthält jedoch keine Trigger die es auslösen (wie z.B. ein gedrückter Schalter), sondern wird einfach gestartet und macht dann etwas.
Finden könnt Ihr die Skripte auch im Bereich der Automatisierungen. Jedoch findet sich oben ein extra Reiter „Skripte“. Dort erstellt Ihr erst einmal nein neues Skript.
In meinem Fall sieht das Skript folgendermaßen aus:
alias: Anzahl Katzenklobesuche
sequence:
- service: notify.alexa_media
data_template:
target:
- " {%- for group in states.media_player | groupby('state') -%} {%- for entity in group.list -%} {%- if is_state_attr(entity.entity_id, 'last_called', true) %} {{ entity.entity_id }} {%- endif -%} {%- endfor -%} {%- endfor -%}"
data:
type: tts
method: speak
message: >
{% set alexa_text_vor = [ "Das Katzenklo wurde ",
"Es wurde bisher ",
"Seit der letzten Reinigung wurde es " ] | random %}
{% set alexa_text_nach = [ "mal benutzt.",
"mal verunstaltet.",
"mal bekackt." ] | random %}
{{ '{} {} {}'.format( alexa_text_vor,
states('counter.katzenklobesuche'), alexa_text_nach ) }}
mode: single
Recht überschaubar, oder?
Es wird lediglich eine Sequenz abgearbeitet.
Das Target ist das Alexa-Gerät, dass Ihr angesprochen habt. Hier könnte auch z.B. eine feste Alexa hinterlegt werden anstatt des Skriptes. Aber was macht das Skript als Target?
Über die verschiedenen Variablen, lässt sich abfragen, welche Alexa gerade zuletzt benutzt worden ist. In der Regel ist das die Alexa, mit der Ihr gerade gesprochen habt. Am Ende – wenn das Skript durch ist – wird dort z.B. der Name von eurem letzten Alexa auftauchen. Sprich: Die Alexa, die Ihr befragt habt bekommt auch den Input als TTS von Home Assistant zurück. Praktisch oder? So kann ich im Wohnzimmer nach dem Katzenklo fragen und bekomme auch dort die Antwort. Oder wenn ich selbst auf Klo bin, kann ich Alexa im Bad fragen und bekomme dort die Rückmeldung.
Der Rest ist nicht mehr als ein paar Random Variablen (es wird also ein Text ausgewählt, in zwei Variablen gelegt (hier alexa_text_vor und alexa_text_nach und zuletzt ausgegeben: alexa_text_vor, status des Counters und alexa_text_nach). Hier kommt dann z.B. „Das Katzenklo wurde 3 mal verunstaltet“ heraus.
Das ist dann die Antwort, die Alexa uns wiederum vorliest.
Aber das ist ein Skript, Alexa kann keine Skripte!
Absolut richtig. Alexa kann keine Skripte aufrufen (warum, weiß ich nicht, wird aber sicherlich Gründe geben). Daher machen wir die Skripte Alexa als Szene bekannt. Sie tauchen dann einfach im Alexa Skill als Szene auf und können aufgerufen werden (wie z.B. jede andere Licht-Szene auch).
Dazu kommt folgendes in eure configuration.yaml (oder in eine externe .yaml, je nachdem wie Ihr euer Home Assistant pflegt):
#-> configuration.yaml
alexa: !include ownconfig/alexa.yaml
#-> ownconfig/alexa.yaml
smart_home:
filter:
include_entities:
- script.anzahl_katzenklobesuche
Ich lagere die Dinge in unterschiedliche .yaml’s aus. Daher wird in der configuration.yaml nur inkludiert und der extra Teil landet dann in der alexa.yaml.
Home Assistant benötigt jetzt noch einen Restart um die Configs neu einzulesen (vorher natürlich nicht den obligatorischen Syntax-Check vergessen ;D) und schon sollten euch die „Szenen“ ala Skripte in der Alexa App erscheinen.
Wenn Ihr die Szene dort ausführt, dann wird euch die letzte Alexa, die ihr genutzt habt, sehr wahrscheinlich eine Antwort präsentieren. Glückwunsch, das klappt schon mal!
Nun wollen wir nur noch, dass wir Alexa auch fragen können. Dazu erstellen wir eine Routine in Alexa:
Den Namen der Routine könnt ihr frei wählen.
Unter „Wenn“ wählt Ihr „Stimme“ und tragt dort die Sätze ein, die Ihr Alexa um die Mikrofons schmeißen möchtet. Ich habe da eine kleine Auswahl und ergänze diese, wenn ich merke, dass ich eine Formulierung nutze, die ich so nicht eingetragen habe. Es soll ja intuitiv bleiben.
Als Aktion wählt ihr nun die aus Home Assistant stammende Szene aus.
Fertig. Ihr könnt Alexa nun fragen und bekommt eine Antwort als Sprache zurück. Egal, welche Alexa Ihr in eurem Zuhause und Home Assistant Netz fragt =).
Und das ist unser Ergebnis:
(Achtung: Ich spreche Alexa an, das heißt eure Alexas könnten hellhörig werden!)
Oha, ich glaub da muss ich dann wohl mal ran 😉
Und euren Fantasien im Bereich auf die Skripte und Alexa abfragen, sind nun keine Grenzen mehr gesetzt.
Viel Spaß beim basteln!
Tipp & Credit
Als kleinen Tipp kann ich euch empfehlen, die Antworten von Alexa auf die Kurzform zu stellen.
Mich hat immer das „OK“ von Alexa gestört, wenn ich ihr etwas gesagt habe. Mir reicht ein kurzer Hinweis-Ton, dass sie mich verstanden hat.
Das könnt ihr in der Alexa App unter „Einstellungen“ -> „Allgemein“ -> „Alexa-Sprachantworten“ konfigurieren. Wählt dort einfach den Kurzmodus aus. Ab sofort gibt euch Alexa keine Antwort in Sprache, sondern nur ein kurzen Signalton als Quittung.
Credit: Das Target-Ziel ist nicht auf meinen Mist gewachsen. Es ist aus verschiedenen Quellen entstanden, da ich selbst nach einer Lösung gesucht habe, aber über Stunden schier verzweifelt bin. Ich konnte mir aus verschiedenen Foren und Beiträgen eine funktionsfähige Lösung zurecht basteln. Wenn sich hier jemand in seinen eigenen Gehirnzellen wiederfindet: Melde dich kurz, gerne mache ich deinen geistigen Schmalz kenntlich :).
Bildquellen
- Globe Internet Icon Line Connection of Circuit Board: Hintergrund Foto erstellt von natanaelginting - de.freepik.com | Image by Freepik
1 Kommentar
Steve Landisch · 30. Dezember 2023 um 0:39
Statt dem langen target Code könntest du vorher den Dienst alexa_media.update_last_called davor aufrufen, dieser gibt die message auf dem vorher angesprochenem Gerät wieder. Deweiteren fehlt für Leihen ein Hinweis auf counter.katzenklobesuche und wie dieser mit Daten gefüllt wird 🙂 Trotzdem Super Arbeit