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

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

Damit wir die Vorgehensweise besser verstehen, führen wir jetzt einige Tests mit Alexa und ioBroker durch.

Der erste Live-Test mit Alexa

Wir wollen das Licht anschalten. Darum sagen wir zu Alexa: „Alexa, Licht an!“ Was passiert? Probiere es aus und schau‘ dir dann im Protokoll das ausgegebene Objekt an!

Also bei mir meckert Alexa gleich los: Mal mit „Da bin ich mir nicht sicher“, mal mit „Das Gerät Licht unterstützt das nicht“. Sie kennt den Befehl einfach nicht. Falls Alexa bei dir den Befehl bereits kennt und irgendetwas einschaltet, nimm zum Testen etwas anderes, zum Beispiel „Alexa, Lampe an“ oder meinetwegen „Alexa, Tür auf“.

Bei mir finde ich jetzt im Protokoll:

javascript.0 script.js.common.Lösungen.jsCallFromEchoDevice: {"name":"Drei", "serialNumber":"A012B345678901DE", "summary":"alexa licht an", "creationTime":1555328342509, "status":"FAULT", "domainApplicationId":"domainApplicationName":"", "cardContent":"", "card":""}

Die mich interessierenden Eigenschaften des Objekts sind:

status
Gibt vor allem wieder, ob der Aufruf erfolgreich war, d.h. von Alexa erkannt und verarbeitet wurde.
Hier steht FAULT, weil Alexa nichts mit dem Befehl anzufangen weiß.

name
Das ist Alexas Name.
Hier ist der Name „Drei“. Vielleicht etwas fantasielos, dafür flexibel: Die Alexas in meiner Umgebung heißen „Eins“, „Zwei“ und „Drei“ . Anmerkung: Wenn Alexa zum Beispiel „Wohnzimmer“ heißt, ist der Name nicht so passend, wenn sie dann mal im Arbeitszimmer stehen sollte.

summary
Das ist die „Zusammenfassung“ dessen, was Alexa als Befehl erkannt hat. Das ist dann auszuwerten, um über ioBroker die gewünschten Tätigkeiten anzustoßen.

Das Problem, was sich zunächst stellt ist, dass Alexa den neuen Befehl nicht kennt und diesen Fehler nicht nur ins Protokoll schreibt sondern auch noch laut in den Raum spricht. Nicht sehr hübsch – auch wenn das Licht dann angeht!

Die Lösung ist einfach: Wir definieren eine Routine für „Alexa, Licht an“

Einrichten der Routinen „Licht an“
und „Licht aus“.

Routinen werden auf einem Tablet oder Smartphone mit der Alexa-App erstellt. Nach dem Start der App Menüpunkt „Routinen“ auswählen und „+“ anklicken.

Unter „wenn Folgendes passiert“ den Sprachdienst auswählen und den Befehlssatz „Licht an“ bzw. „Licht aus“ eingeben.

Wer will, kann in der Routine noch eine Sprachausgabe, z.B. „ok“ einrichten. Dann gibt Alexa beim Aufruf des neuen Befehls eine Rückmeldung. Zurzeit geht es aber auch ohne. Das heißt, dass Alexa auch Routinen ausführt, die keine Aktionen beinhalten.

Das war’s schon! Wenn wir nun „Alexa, Licht an“ befehlen, erhalten wir den Status „SUCCESS“ und hören keine Fehlermeldung von Alexa.

javascript.0 script.js.common.Lösungen.jsCallFromEchoDevice: {"name":"Drei", "serialNumber":"A123A123456789AB", "summary":"alexa licht an", "creationTime":1555328451339, "status":"SUCCESS", "domainApplicationId":"","domainApplicationName":"", "cardContent":"", "card":""}

Alles prima! Jetzt werden wir im nächsten Teil definieren, was Alexa nun genau tun soll, wenn sie „Licht an“ oder „Licht aus“ hört.

Bevor du weiterklickst, empfehle ich dir noch einen Test: Ruf‘ Alexa auf und warte dann einen Moment, bis Alexa sich verbunden hat. Erst dann gib den Befehl „Licht an“.

Schau‘ dir jetzt das Protokoll an. Es sollten zwei Ausgaben erzeugt worden sein. Eine für „Alexa“ und eine für „Licht an“.

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.