„Alexa, Licht an“ – aber nur in diesem Zimmer!

Eine Lösung für Single-Room-Commands mit Alexa und ioBroker

Sag‘ zu Alexa einfach „Alexa, Licht an“ –  und das Licht geht an. Klar, kein Problem. Aber welches Licht in welchem Raum angeht, das ist nicht immer klar. Man kann sich behelfen mit „Alexa, schalte das Licht im Wohnzimmer an.“, „Alexa, schalte das Licht in der Küche an.“ usw. Aber richtig gut fühlt sich das nicht an.

Wenn man nur ein Amazon-Echo-Gerät hat, geht’s nicht anders. Wenn man aber mehrere Echo-Geräte einsetzt – in unserem Beispiel in Wohnzimmer, Küche, und Arbeitszimmer – brauchen wir Context Awareness für Alexa. Für Context Awareness gibt’s mit ioBroker eine flexible Lösung.

Kern der hier vorgestellten Lösung für Alexa Single Room Comands ist der ioBroker-Adapter Alexa2. Eigentlich hatte ich den Adapter für die Sprachausgabe von Hinweisen und Meldungen über Alexa installiert. Er bringt aber noch einige weitere interessante Eigenschaften mit. So kann ich über den Adapter feststellen, über welches Echo-Device ein Befehl  eingegangen ist. Und genau das brauche ich, um Befehle variabel für jedes Zimmer zu verarbeiten.

Wichtig zu wissen: Der Adapter Alexa2 benutzt die Amazon-Cloud im Wesentlichen so, wie es alle Echo-Geräte tun. Wir brauchen für diese Lösung also keine weitere Cloud! Man kann sich eine Registrierung für die ioBroker-Cloud oder eine andere Cloud sparen. 

Mehr über ioBroker

Mehr über den ioBroker-Adapter Alexa2

In einer Alexa2-Instanz steht das Objekt History.json zur Verfügung mit allen notwendigen Angaben zum letzten Aufruf des Echo-Geräts. Mit etwas Javascript können die Angaben ausgelesen und für die Ausführung gewünschter Tätigkeiten verwendet werden. Natürlich sind die Tätigkeiten dabei keineswegs auf „Licht an“ und „Licht aus“ beschränkt – es können fast alle Möglichkeiten von ioBroker benutzt werden: Rolllade hoch / Rolllade runter, Musik ein / aus usw.

Im Folgenden gehe ich davon aus, dass dir ioBroker in Verbindung mit Javascript in Grundzügen bekannt ist: Installieren von Adaptern, Anlegen von Instanzen, Auslesen und Schreiben von Objekten, Anlegen von Subskriptionen, grundlegende Javascript-Funktionalität usw.

Voraussetzungen für Single Room Commands mit Alexa und ioBroker

  1. Prüfen, ob auf allen Geräten eine aktuelle Software eingesetzt wird, und gegebenenfalls aktualisieren. Auf ioBroker sollten Instanzen für die Adapter Alexa2 und die Script Engine (für Javascript) angelegt sein.
  2. Die Einrichtung des Adapters Alexa2 ist in manchen Fällen wohl etwas tricky, aber bei mir hat es mit der YouTube-Anleitung von SchimmerMediaHD geklappt.
  3. Die gewünschten Lampen (oder andere zu steuernde Geräte) über ioBroker verfügbar machen.
    Das geht z.B. wie in den folgenden Beispielen über eine Homematic-Zentrale, ein Zigbee-Gateway und direkt über einen Commandline-Aufruf. Ich setze mal voraus, dass die hierfür benötigten Adapter installiert sind und die Instanzen einwandfrei starten.

Die Basis

Jetzt geht an’s Eingemachte: Unter dem Tab „Skripte“ in ioBroker wird eine neue Javascript-Datei im Ordner common (oder einem Unterordner) angelegt

Screenshot zum Erstellen einer neuen Datei
Zunächst ein Verzeichnis auswählen, ggf. Verzeichnis common. Dann auf „+“ klicken.
Screenshot zur Auswahl des Dateityps
Es soll eine Javascript-Datei werden!
Screenshot zum Eingeben des Namens der neuen Datei
Eingeben eines geeigneten Namens

Die Javascript-Datei wird nun erstellt und zur Bearbeitung geöffnet. Der folgende Code legt eine Subskription auf alexa2.0.History.json an. Die Subskription sorgt dafür, dass bei jeder Änderung von alexa2.0.History.json die angegeben Funktion ausgeführt wird. Als Parameter wird der Funktion das aktuelle Objekt alexa2.0.History.json übergeben.

Zum Testen lassen wir uns mit log() einfach mal nur den Inhalt des übergebenen Objekts ins Protokoll schreiben.

on('alexa2.0.History.json'/*json*/, function (obj) {
log(obj.state.val);
});

Damit das Skript ausgeführt werden kann, muss es aktiviert werden.

Screenshot zum Aktivieren und Speichern des Skripts
Nachdem der Schalter „Skript ausführen“ aktiviert worden ist, wird das Skript bei jedem Speichern ausgeführt.
Screenshot nach Ausführen des Skripts
Nach dem Ausführen des Skripts steht im Protokoll, dass 1 Subskription angelegt wurde.

Jetzt ist unser kleines Skript bereit für die ersten Live-Tests mit Alexa.

Autor: Rai

jahrelanger Homematic-Benutzer, öffnet sich mit Hilfe von Raspberry Pi und ioBroker für Neues im Internet of Things

11 Gedanken zu „„Alexa, Licht an“ – aber nur in diesem Zimmer!“

  1. Hi Rai, super Artikel! Danke für die super Anleitung!
    Ist es möglich Alex mehrere Stimmen anzulernen und dann per Skript auszuwerten wer den Befehl gegeben hat. Um z.B. zu umgehen das die Kinder die Heizung auf 30 Grad einstellen oder den TV einschalten, wenn sie es nicht sollen?

  2. Funktioniert alles,

    Man sollte dazu sagen (für Menschen wie mich die von Programmen 0 Plan haben) das:
    Man auf groß und Kleinschreibung achten muss bei dem Namen der Alexa z.b.
    Man die Routine zwingend benötigt bei mir z.b. die Routine Rollladen stopp (stop ging nicht)

    Aber ansonsten echt sehr übersichtlich wann man einmal durchgeblickt hat.

    Sehr gute Arbeit
    Danke

  3. Script läuft, Licht funktioniert schon, man muss dazu sagen ich hab absolut kein plan vom Programmieren und hab die groß und Kleinschreibung nicht beachtet (deswegen wurde am Anfang meine Alexa nicht gefunden) bis auf das was mein Fehler war top. Rolladen Steuerung wird heut Abend ausprobiert.

    Danke für das super script

  4. Hallöchen

    Super Lösung mit viel Hirnschmalz

    Habe 8 Echo´s im Einsatz. Mich interessieren folgende Werte: Letzter Befehl / welches Gerät / erfolgreich ja nein. Diese Werte brauche ich in drei IoBroker Objekten (Alexa_letzer_Befehl (Text)/ Alexa_Gerät (Text) / Alexa_erfolgreich (logisch). Leider bin ich, was Programmierung angeht, eine totale Niete. Kann mir hier jemand der Experten weiterhelfen und mir ggf ein Skript basteln?
    Würde mich riesig freuen

    Liebe Grüße Ulli

  5. Sehr gutes Beispiel, vielen Dank.
    Habe es um das Anlegen von Datenpunkten erweitert, sobald die Routine da ist, werde diese anhand des DeviceName angelegt, hier am Beispiel Wetter:

    Beim zweiten Start wird dann ein timestamp, DevideName und und das erste Commando eingefügt.

    Nutze diese Datenpunkte um die Logik in Node-Red auszuführen, somit wird das JavaScript nicht so unübersichtlich.

    case „wetter“:
    createState(„javascript.0.Script.Alexa_Device_abhängige_Ausführung.“ + deviceNameNew + „.Wetter“,“Neuer Datenpunkt“, function () {});
    setState(„javascript.0.Script.Alexa_Device_abhängige_Ausführung.“ + deviceNameNew + „.Wetter“, stamp + “ “ + deviceName + “ “ + commandArray[0] + “ “ + commandArray[1]);
    break;

    Weiterhin gefällt mir das mit dem Command Arrayx!
    Damit kann man wunderbar auf das erste Command den Case setzen,
    und dann aufgliedern nach den folgenden Befehlen, echt super deine Vorlage.

    case „spiele“:
    if (commandArray[1] = „musik“) {
    createState(„javascript.0.Script.Alexa_Device_abhängige_Ausführung.“ + deviceNameNew + „.Spiele_Musik“,“Neuer Datenpunkt“, function () {});
    setState(„javascript.0.Script.Alexa_Device_abhängige_Ausführung.“ + deviceNameNew + „.Spiele_Musik“, stamp + “ “ + deviceName + “ “ + commandArray[0] + “ “ + commandArray[1]);
    }
    break;

  6. ne coole Sache. Leider habe ich das Problem, dass ich in meinem ioBroker den State vom Schalter irgendwie nicht per checkbox switchen kann. D.h. ich muss den State im Dialogfenster per Text auf TRUE setzen, so dass die Lampe angeht. Warum auch immer.

    Wenn ich dann sage Alexa: Licht AN, wird die Routinenausführung bestätigt aber das Licht geht nicht an 🙁

    Hier mal das Log:
    avascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: {„name“:“Bad Echo Dot“,“serialNumber“:“xxxxxxsdf“,“summary“:““,“creationTime“:1585122686348,“status“:“SUCCESS“,“domainApplicationId“:““,“domainApplicationName“:““,“cardContent“:““,“card“:““,“answerText“:““}
    08:51:26.954 info javascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: Echo-Device bad echo dot:
    08:51:26.978 info javascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: {„name“:“Bad Echo Dot“,“serialNumber“:“xxxxxxx“,“summary“:“licht an“,“creationTime“:1585122686526,“status“:“SUCCESS“,“domainApplicationId“:““,“domainApplicationName“:““,“cardContent“:““,“card“:““,“answerText“:““}
    08:51:26.979 info javascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: Echo-Device bad echo dot: licht,an
    08:51:27.879 info javascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: {„name“:“Bad Echo Dot“,“serialNumber“:“xxxxx“,“summary“:“sprich mir nach ok befehl“,“creationTime“:1585122686975,“status“:“SUCCESS“,“domainApplicationId“:““,“domainApplicationName“:““,“cardContent“:““,“card“:““,“answerText“:““}
    08:51:27.881 info javascript.0 (962) script.js.LXSkript.jsCallFromEchoDevice: Echo-Device bad echo dot: sprich,mir,nach,ok

    1. Hallo Alex, am Log-File bemerke ich nichts Außergewöhnliches. Vielleicht kannst du mal dein JavaScript zum Licht-An/Ausschalten posten. Gruß Rai!

    1. Hallo Pavel, danke für deine Rückmeldung. Ja, wenn es möglich ist, ziehe ich Lösungen vor, die ohne Daten in der Cloud auskommen. Denk dran, dass, wenn Alexa im Spiel ist, auf jeden Fall die Amazon Cloud im Hintergrund steht. Ganz ohne Cloud geht es also nicht immer. Gruß Rai!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.