Google Home, die 433 MHz-Steckdosen, der Raspberry Pi und kein Zwischenserver

Ich habe neulich an dieser Stelle beschrieben, wie man mit dem Google Home 433 MHz-Steckdosen zum Laufen bringt und sie so mit der Sprache steuern kann. Aus den Kommentaren geht hervor, dass es einfach gehen sollte. Ich habe es inzwischen auch ohne Zwischenserver gelöst, das bedeutet, dass die Webhook bei ifttt.com direkt auf dem Raspberry die Info auslöst.

Einige Schritte sind gleich wie in der anderen Anleitung, andere unterscheiden sich. Damit man nicht zwischen den Schritten hin- und her wechseln muss, beschreibe ich hier den ganzen Ablauf, setze aber die identischen Stellen als Zitat. So sollte allen geholfen sein, nämlich sowohl den Lesern des “alten” Kapitels, als auch denen, die komplett von Vorne beginnen. Und los geht es:

 

Vorbereitungen auf dem Raspberry zu Hause

Da der Raspberry bei Euch zu Hause in diesem Beispiel die Befehle direkt erhalten soll, muss er aus dem Internet erreichbar sein und es muss ein Webserver (apache) darauf laufen. Diese Schritte führen wir als erstes durch.

Webserver auf dem Raspberry installieren

Dies geht am einfachsten über die Kommandozeile des Raspberry. Wir benötigen einen Webserver, der auch PHP beherrscht. Alternativ kann man es natürlich auch mit einer anderen, beliebigen Skriptsprache machen. Die Skripte später müssen dann nur in die jeweilige Sprache angepasst werden. Als Webserver nehmen wir den weitverbreiteten Server “Apache2” und das entsprechende PHP-Modul. Es wird über folgenden Befehl installiert:

sudo apt-get update sudo apt-get install apache2 php7

Dies installiert den Webserver und PHP. Mit dem Aufruf der IP-Adresse des Raspberry im eigenen Netz sollte nun ein Apache zu sehen sein. Ungefähr so:

Damit ist die Grundlage gelegt, um später unser Skript von ifttt.com aus starten zu lassen.

Raspberry Pi von außen erreichbar machen

Wichtig! Damit ist der Server von außen erreichbar. Es sollte nur HTTP freigeschaltet werden, trotzdem kann Software Bugs haben. Es ist also wichtig, immer die aktuelle Software zu benutzen. Geht also ab und an auf den Raspberry Pi und macht mit den folgenden Befehlen Softwareupdates:

sudo apt-get update sudo apt-get upgrade

Damit ihr immer unter der gleichen Adresse erreichbar seid, benötigt ihr einen Dienst wie zum Beispiel dyndns. Dieser sorgt dafür, dass ihr immer über eine Namensadresse trotzdem auf eurem Gerät landet, auch wenn sich eure IP-Adresse ändert. Eine genaue Beschreibung, wie ihr dyndns auf dem Raspberry einsetzen könnt, findet ihr bei raspberry.tips.

Der andere, wichtige Schritt ist, dass die Anfragen, die bei eurem Router ankommen auch an den Raspberry weitergeleitet werden. Das geschieht über Port-Forwarding. Ich gehe davon aus, dass ihr die IP-Adresse von eurem Raspberry kennt und beschreibe die Einstellung jetzt für Horizon von UnityMedia. Wie man es auf einer Fritz Box einrichtet, beschreibt auch raspberry.tips sehr gut. Bei Horiton meldet ihr euch im Admin-Interface an. Meistens ist das unter http://192.168.192.1 zu erreichen. Dort klickt ihr auf “Fortgrschritten” (oben) und “Weiterleitung” (links im Menü). Nun könnt ihr Weiterleitungen mit “Neue Zeile hinzufügen” einrichten. Wenn alles bei Standartd-Ports bleiben soll, sollte es so aussehen:

Jetzt sollte über den dyndns-Namen über das Smartphone ohne WLAN auch die Seite aufrubar sein. Dann ist alles richtig vorbereitet. Jetzt muss die Brücke vom Google Assistant / Google Home zu eurem Raspberry geschlagen werden. Und das geht mit ifttt.com.

Steuerbefehle über ifttt.com schicken

ifttt.com bietet die Möglichkeit verschiedene Schnittstellen miteinander zu verbinden. Auch der Google Assistant steht dort inzwischen zur Verfügung. Hier kann man Sprachbefehle hinterlegen und sie hinterher mit anderen Schnittstellen kombinieren. Für die Steuerung der Steckdosen habe ich folgendes Beispiel angelegt:

Wie man schon in der Konfiguration sehen kann, ist die Einstellung sehr leicht: man gibt an, auf welchen Satz hin Google Home reagieren soll. Das schöne ist: im Gegensatz zu Amazon Echo muss man keinen Skillnamen vorher sagen. Eigene Sätze werden einfach in das System integriert, als ob sie von Google selbst kommen. Entsprechend habe ich hinterlegt “Wohnzimmerlicht an”. ifttt.com legt diese Aussage im Google Assistant an. Das ist dann auch schon der erste Teil der Schnittstellenbrücke. Die zweite ist nun die Brücke zur Webschnittstelle aus dem obigen Artikel. Diese realisiert man als “Webhook”. Eine Webhook ist nichts anderes, als ein URL-Aufruf. Ich übergebe also an meinen Webserver per URL-Aufruf den Status, welche Steckdosennummer geschaltet werden soll und ob diese ein- oder ausgeschaltet werden soll. Also zum Beispiel so:

http://www.dyndns.org/input.php?steckdose=1&zustand=1

Statt der Steckdosennummer kann natürlich auch eine Reihenfolge definiert werden o.ä. Der Zustand ist an oder aus, als 1 oder 0. So kann man nun verschiedene Aussagen mit verschiedenen Schaltfolgen hinterlegen. Fehlt nur noch der letzte Schritt: das Skript, dass mit den übergebenen Informationen die Aktion zu Hause mit dem Funkmodul auslöst.

Mit PHP die Steckdosen steuern

Es geht nun also um die Datei “input.php” von oben. Diese muss auf dem Raspberry unter /var/www/html/ abgelegt werden. Benutzt dafür euren Libelingseditor. Wichtig ist, dass die Datei genau so heißen muss, wie bei der dyndns-Adresse bei ifttt.com angegeben. Meine Datei sieht dann wie folgt aus:


<?php $kommando = $_GET[steckdose]; $status = $_GET[status];

// Schaltet alle Steckdosen aus if($_GET[kommando]=="aus") { exec("/home/pi/raspberry-remote/send 10111 1 0"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 2 0"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 3 0"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 4 0"); sleep(1); exec("/home/pi/raspberry-remote/send 10011 4 0"); }

// Schaltet alle Steckdosen im Wohnzimmer an if($_GET[kommando]=="whzan") { exec("/home/pi/raspberry-remote/send 10111 3 1"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 4 1"); }

// Schaltet alle Steckdosen an if($_GET[kommando]=="allesan") { exec("/home/pi/raspberry-remote/send 10111 1 1"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 2 1"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 3 1"); sleep(1); exec("/home/pi/raspberry-remote/send 10111 4 1"); }

// Schaltet die Lichterkette an if($_GET[kommando]=="lichterkette") { exec("/home/pi/raspberry-remote/send 10011 4 $status"); }

// Steuerung komplett über ifttt.com if($kommando>0) { exec("/home/pi/raspberry-remote/send 10111 $kommando $status"); echo "/home/pi/raspberry-remote/send 10111 $kommando $status";} ?>

Besondere Infos: /home/pi/raspberry-remote/send Das ist der Aufruf zum Programm zur Steuerung der Steckdosen. Das kann bei euch an einer anderen Stelle liegen 10111 Hierbei handelt es sich um den Steckdosencode. Hier kann man sogar mehrere Steckdosen durch unterschiedliche Codes steuern

Verbesserungspotential

Wer die Sorge hat, dass Fremde, die die Adresse zu ihrem Gerät kennen, das Licht steuern könnten, können auch ein Passwort mit übergeben, auf das geprüft wird. Alternativ kann auch anhand des DNS-Namens der eingehenden URL überprüft werden, ob es sich um eine Webhook von ifttt.com handelt. Trotzdem nochmal der Hinweis: es sollten damit keine Geräte gesteuert werden, die gefährlich sein könnten, wenn sie unbeaufsichtigt eingeschaltet werden, wie zum Beispiel Wasserkocher, Herdplatten etc.