Ich habe ja schon davon berichtet, wie man alleinstehend mit einem Raspberry Pi Funksteckdosen steuern kann. Das kann zum Beispiel genutzt werden, um zu einem bestimmten Zeitpunkt eine Steckdose einzuschalten oder auszuschalten. Aber wen eine Alexa hat, hat sicher auch das Interesse daran, dass man Alexa mit einem Sprachbefehl dazu bringen kann, dass sie die Funksteckdosen aus- oder einschalten kann.
Das Grundproblem ist, dass Alexa nicht im 433 MHz-Bereich funken kann, sondern lediglich Objekte im WLAN selbst ansprechen kann. Funksteckdosen sind aber nicht im WLAN, sondern bedienen sich wirklich ganz klassisch der alten Funktechnologie. Genau genommen geben die Funksteckdosen noch nicht mal ein Feedback, ob sie umgeschaltet haben, sondern der Sender schickt das Signal zum Einschalten und entweder schaltet sich etwas ein oder nicht.
Vorüberlegung: Wie bekommt man Alexa dazu, die Funksteckdosen zu schalten?
Grundsätlich gar nicht, weil Alexa nicht mit 433 MHZ-Modulen ausgestattet werden kann. Im Grundsatz muss man also überlegen, welche Möglichkeit man hat, über Umwege den Befehl zum Schalten weiter zu geben. Wenn man einen Raspberry Pi hat, der Funksteckdosen steuern kann, ist das schon die halbe Miete. Denn dann muss man nur noch schauen, wie man die Lücke zwischen Alexa und dem Raspberry PI schließt. Dazu habe ich folgendes überlegt: man müsste Alexa dazu bringen, irgendwo eine Notiz oder einen Hinweis zu hinterlegen, was passieren soll. Dieser Hinweis müsste vom Raspberry Pi gefunden werden und er löst darauf hin dann die Schaltung aus, die das Licht einschaltet. Also ganz knapp gehalten:
„Alexa, schalte das Licht an“ -> schriebt den Befehl auf und legt ihn im Internet ab -> Raspberry Pi findet den Befehl und führt ihn aus.
Auf Theorie folgt Praxis
Soweit ist alles gut. Los geht es in die Umsetzung:
Der schwere Weg: Alexa-Skill programmieren
Meine eigene Lösung basiert auf einem Alexa Custom Skill. Das schöne ist, dass jeder ein Custom Skill haben kann, den er nicht selber veröffentlichen muss aber die komplette Flexibilität anbietet.
Das ist etwas kniffliger, aber nicht unmöglich. Dazu gibt es einige Tutorials, die auch mir dabei geholfen haben. Dazu benötigt man dann noch einen eigenen Webspace auf dem man dann die Datei ablegen kann. Ich habe mir tatsächlich ein kleines Skript geschrieben, dass in JSON die Anfrage von Alexa annimmt, daraus einen Datenbankeintrag schreibt, mit der Info, was zu tun ist. Zum Beispiel: „0001 01“ für Steckdose 1 einschalten. Dazu gibt dieses Skript an Alexa das Feedback, was sie antworten soll. Wenn ich zum Beispiel das Kommando zum Einschalten des TV gebe, dann wird der Befehl „10111 0002 01“ in die Datenbank geschrieben und Alexa gesagt, dass sie sagen soll: „TV wird eingeschaltet“. Die ausführlichen Skripte werde ich in Zukunft in einem anderen Post veröffentlichen. Ansonsten helfen prinzipiell auch alle Alexa-Programmiertutorials hier weiter.
Der Raspberry Pi fragt alle 5 Sekunden nach, ob ein neuer Befehl in der Datenbank liegt. Wenn ja, wird dieser ausgeführt und in der Datenbank gelöscht. Wenn nein, passiert nichts. Aber das programmieren eines eigenen Skills ist natürlich nicht für alle erstrebenswert, nur damit zuhause ein Licht aufgeht.
Wer also nicht gerne programmiert, der sollte sich einen leichteren Weg ansehen:
Der leichtere Weg: IFTTT-Schaltung
Wer ifttt.com nicht kennt, sollte das jetzt nachholen. Dieser Dienst ist darauf spezialisiert, dass wenn etwas bestimmtes ausgelöst wird, er es an andere Dienste weiterleitet. Er ist also von sich aus schon die Brücke zur Lösung und enthält auch tatsächlich die Möglichkeit, Alexa-Sprachbefehle anzunehmen und beliebig weiter zu leiten. Man geht nach dem Login einfach auf „My Applets“ -> „New Applet“ und klickt auf das erste PLUS-Zeichen. In der Suche sucht man dann nach „Alexa“ und wählt dann „Say a speciffic phrase“ aus. Wie das Feld schon sagt, muss man jetzt angeben, was man sagen möchte, damit die Aktion ausgelöst wird. Wichtig: vorweg muss man schon immer sagen: „Alexa, trigger….“ und dann kommt das, was ihr dazu sagen wollt. Also zum Beispiel „… das Wohnzimmerlicht an“. Dann klickt man auf „Create Trigger“. Jetzt kommt der komplizierte Teil: wohin soll das ganze gehen.
Dafür klickt man nun wieder auf das PLUS-Zeichen und erhält eine lange Liste von Aktionen. Die Frage ist nun, welche der Aktionen man sinnvollerweise nutzt. Ich finde Twitter fast schon am praktischsten. Hier kann man sich individuelle Nachrichten zuschicken lassen, das geschieht nahezu in Echtzeit und man kann die Twittermeldungen auch in der Konsole des Raspberry Pi abrufen und auswerten. Möglich wäre aber auch zum Beispiel per E-Mail oder ein anderer, beliebiger Dienst, der auf dem Raspberry ausgewertet werden kann. Um bei Twitter als Beispiel zu bleiben, würde ich wie folgt weiter vorgehen:
Twitter auswählen und die Option „Send a direct Message to yourself“. Jetzt kann man die Nachricht eingeben, zum Beispiel: „Alexa sagt, Wohnzimmerlicht=1“. Dahinter würde ich dann noch direkt ohne Leerzeichen schreiben „={{TriggeredAt}}“. Dies teilt dann nämlich mit, wann dieser Befehl gekommen ist. Das ist auf dem Raspberry Pi wichtig um hinterher zu merken, welchen Befehl man ausgeführt hat. Dann klickt man auf Finish und das Ding ist gespeichert. Im meinem Beispiel sieht das jetzt so aus:
Man kann es aber auch mit Webhooks machen, die eine URL aufrufen, die dann irgendwo einen Flag setzt, mit der Raspberry aufrufen und entsprechend schalten kann.
Damit ist der erste Teil der Brücke fertig. Nun kommt der zweite Teil:
Der Raspberry muss die Botschaft empfangen
Hierfür muss man am Raspberry das oben angesprochene 433 MHz-Modul haben. Außerdem muss man auf dem Raspberry ein Linux laufen haben und kann die Anleitung von Tony befolgen. Dieser erklärt sehr gut, wie man grundsätzlich ein 433 MHz-Modul ansteuert und damit auch Steckdosen schalten kann. Wenn das funktioniert, gibt es nur noch zwei Dinge zu tun:
Man benötigt ein Skript, das regelmäßig eure Zwischenschnittstelle aus Schritt 1 abfragt und prüft, ob es zu tun ist. Wenn das der Fall ist, wir die Steckdose geschaltet und der Befehl auf dem Server gelöscht und wenn nicht, dann passiert eben nichts. In meinem Skript wird automatisch bei jeder Anfrage an meinen Server der älteste Befehl gelöscht. So sollte nicht immer wieder der gleiche Befehl abgerufen werden.
Die Ausgabe, die ich bekomme, ist immer die Nummer der Steckdose und ob sie eingeschaltet werden soll (1) oder ausgeschaltet werden soll (0). Wenn also Steckdose 3 eingeschaltet werden soll, dann erhalte ich als Feedback vom Server den Code:
„3 1“.
Diesen setze ich an meinen eigentlichen Befehl aus der Anleitung von Tony oben. Der Befehl lautet also:
„./send 10111 3 1“.
Im ganzen lautet mein Skript, das automatisch die Steckdosen schaltet, so:
Bei jeder Ausführung erhalte ich also so das Kommando, das ausgelöst werden soll und führe es lokal aus. Liegt nichts vor oder es hinterliegt nichts passendes, dann passiert einfach nichts.
Die Abrufabfrage läuft über einen Cronjob, der so aussieht:
* * * * * /home/pi/cron_rasp.sh
Der Inhalt von cron_rasp.sh sieht so aus:
for i in { 1 2 3 4 5 6 7 8 9 10 11 12}
do
/home/pi/command.sh
sleep 5
done
Damit wird alle 5 Sekunden auf dem Webserver geprüft, ob ein neuer Befehl vorliegt und dieser verarbeitet.
Dieser kleine Einblick in die Programmierung soll zeigen, was möglich ist, selbst wenn man nur „OldSchool“-Steckdosen schalten möchte, die normalerweise nur per altem Funk und nicht per WLAN gesteuert werden können. Die Grenzen sind die Vorstellungen im Kopf und nicht die Möglichkeiten, die heute einem zur Verfügung stehen.
Das hier ist nur mehr oder weniger eine unkonkrete Skizze. Wenn es Fragen im Detail gibt, dann freue ich mich darüber in den Kommentaren. Momentan kann ich noch nicht so einschätzen, wie groß das Interesse an solchen Bastelprojekten im Detail ist :) Evtl. entsteht ja noch der ein oder andere Post aus den Nachfragen.
Medieninteressierter Kölner mit einem Hang zum allen neueren, technischen Möglichkeiten mit einer großen Vorliebe zum Fortbewegen mit Bus, Straßenbahn und Bahn. Dies ist sein privater Blog, in dem er sich genau im Schwerpunkt mit diesen großen Themenbereichen beschäftigt.
4 Kommentare
Jonas
am Freitag, 18.08.2017 um 13:52:39
Ich versuche das Setup gerade mit Google Home und verstehe nicht ganz, wie der Raspi die Twitter Nachricht empfangen soll!?
Kannst du mir da auf die Sprünge helfen?
Sebastian
am Samstag, 19.08.2017 um 10:11:01
Hallo Jonas,
tatsächlich braucht man auch an der Stelle etwas Programmierkönnen. Der Schlüssel ist die Twitter-API. Mit dieser kann man sowohl Direktnachrichten als auch Tweets auslesen. Der Raspberry muss per kleinem Skript die Nachrichten oder den Channel auslesen und aufgrund des Nachrichteninhalts dann den entsprechenden Befehl im Raspberry ausführen. Dabei könnte zum Beispiel diese Schnittstelle helfen: https://dev.twitter.com/rest/reference/get/direct_messages/events/list
Helfen kann da nach einer kurzen Suche wahrscheinlich auch folgendes Tool für den Raspberry: http://www.instructables.com/id/Raspberry-Pi-Twitterbot/. Dort wird Twython genutzt, welches auch viele Schnittstellen zur einfachen Kommunikation mit Twitter anbietet, ohne das man das ganze große Rad neu programmieren muss. Kannst Du damit etwas anfangen?
Viele Grüße
Sebastian
DK
am Freitag, 20.10.2017 um 21:33:40
Ich nutze ein Script das auf dem raspi läuft und im Netzwerk wemo Steckdosen vorgaukelt. Der dann auszuführende Befehl ist dann beliebig. Kann dann auch Netzwerk Befehle sender oder der gleichen. Funktioniert bei mir super. https://www.hackster.io/gowthamgowda/pi-zero-ir-blaster-amazon-echo-35ae8e
Tobias
am Montag, 05.03.2018 um 19:43:47
Hallo Sebastian!
Erstmal vielen Dank fuer die super Erklärung.
Werde es die Tage mal ausprobieren via ifttt.
Würde es aber gerne auch über einen eigenen Skill machen. Kannst du hier mal dein Skill und Schritte Posten als Hilfestellung? Du hattest das ja auch schon oben erwähnt, das du diese zur Verfügung stellen würdest.
Ich versuche das Setup gerade mit Google Home und verstehe nicht ganz, wie der Raspi die Twitter Nachricht empfangen soll!?
Kannst du mir da auf die Sprünge helfen?
Hallo Jonas,
tatsächlich braucht man auch an der Stelle etwas Programmierkönnen. Der Schlüssel ist die Twitter-API. Mit dieser kann man sowohl Direktnachrichten als auch Tweets auslesen. Der Raspberry muss per kleinem Skript die Nachrichten oder den Channel auslesen und aufgrund des Nachrichteninhalts dann den entsprechenden Befehl im Raspberry ausführen. Dabei könnte zum Beispiel diese Schnittstelle helfen: https://dev.twitter.com/rest/reference/get/direct_messages/events/list
Helfen kann da nach einer kurzen Suche wahrscheinlich auch folgendes Tool für den Raspberry: http://www.instructables.com/id/Raspberry-Pi-Twitterbot/. Dort wird Twython genutzt, welches auch viele Schnittstellen zur einfachen Kommunikation mit Twitter anbietet, ohne das man das ganze große Rad neu programmieren muss. Kannst Du damit etwas anfangen?
Viele Grüße
Sebastian
Ich nutze ein Script das auf dem raspi läuft und im Netzwerk wemo Steckdosen vorgaukelt. Der dann auszuführende Befehl ist dann beliebig. Kann dann auch Netzwerk Befehle sender oder der gleichen. Funktioniert bei mir super.
https://www.hackster.io/gowthamgowda/pi-zero-ir-blaster-amazon-echo-35ae8e
Hallo Sebastian!
Erstmal vielen Dank fuer die super Erklärung.
Werde es die Tage mal ausprobieren via ifttt.
Würde es aber gerne auch über einen eigenen Skill machen. Kannst du hier mal dein Skill und Schritte Posten als Hilfestellung? Du hattest das ja auch schon oben erwähnt, das du diese zur Verfügung stellen würdest.
Vielen Dank!
Tobias