Mastodon

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

26.11.2017 | Digital, Sprachassistenten, Tutorial | 10 Kommentare

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.

About Sebastian
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.

10 Kommentare

  1. Wenn ich die PHP im Browser aufrufe passiert nicht, wenn ich aber über die Konsole „php -f input.php“ eingebe schaltet sich die Steckdose. Hat das irgendwas mit den Berechtigungen zu tun?

    und noch eine Sache, die Anführungsstriche sind falsch bei
    exec(“/home/pi/raspberry-remote/send 10111 1 0”);
    das sind die richtigen
    exec(„/home/pi/raspberry-remote/send 10111 1 0“);
    hab dafür länger gebraucht als ich eigentlich wollte :D

  2. Hi,

    das mit dem Zeichenfehler tut mir echt leid. Es hängt anscheinend mit der Schrift zusammen, die ich da verwendet habe. Ich habe es nun korrigiert, damit es niemandem gleich geht, wie dir.
    Es klingt in der Tat nach einem Rechteproblem. Das kann man aber sehr leicht herausfinden:

    Du änderst die Datei „/etc/sudoers“ mit folgender Ergänzung ab:
    %www-data ALL=(ALL) NOPASSWD: /home/pi/raspberry-remote/send

    In der PHP-Datei stellst Du vor jede Kommandoausführung ein „sudo“. Schau mal, ob das dazu führt, dass es funktioniert.

    Viele Grüße
    Sebastian

  3. Hallo,

    viele wichtige Informationen, aber den Server unverschlüsselt und ohne password von aussen zugänglich zu machen…. das geht im Jahr 2017 nun wirklich nicht mehr.

    HTTPS + Letsencrypt und Passwort-Authentifizerung sind absolute pflicht und können sehr Leicht oben ergänzt werden.

    Ich suche aber lieber noch nach einem Weg das ganze rein intern zu betreiben – aber das wird wohl leider nicht gehen :-(

    VG

    Prefect

  4. Hallo,
    Deine Anleitungen sind klasse, funktionieren bei mir nur leider nicht. Gibt es keine möglichkeit ohne das der Raspberry von aussen erreichbar sein muss? Ich habe leider nur eine von aussen erreichbare IPV6 Adresse da ich bei Unitymedia unter DSLite leide, und UM sich strikt weigert mir eine richtige IPV4 Adresse zu geben. Sprich ich bräuchte eine Lösung wo ich den Rasp innerhalb den Heimnetzes per Googlehome steuern kann.
    Grüssle
    MAtze

  5. Hallo Matze,

    das IPv6-Problem ist in der Tat sehr betrüblich. Ich bin mir nicht sicher und müsste es mir noch genau ansehen, aber ich fürchte tatsächlich, dass ifttt.com keinen ipv6-Server nutzt, um die Adressen zu nutzen.

    Dein Ansinnen, es am liebsten Lokal haben zu wollen, kann ich verstehen und war auch mein erster Wunsch. Ich fürchte aber, dass Du immer einen „Mittelsmann“ brauchen wirst. Die Assistenten sind darauf angewiesen, online zu verstehen, was man gesagt hat. Und auf den Servern befinden sich auch die entsprechenden Schnittstellen. Google und Amazon müssten einen kleinen, lokalen Server in ihre Systeme einbauen, der dann die Aufgaben übernimmt, nachdem die Anweisung online verarbeitet wurde. Und ich fürchte, das werden sie nicht machen.

    Eine Lösung mit der Zwischenbrücke wäre wahrscheinlich, noch einen ipv4 zu ipv6-Tunnel zu bauen, der dann die Anfragen weiterleitet. Das sprengt aber auf jeden Fall hier den Rahmen. Die einzig andere Variante wäre dann, dass auf einem Webserver die Anfrage gespeichert wird und der Raspberry diese regelmäßig (alle 5 Sekunden) abholt um sie dann abzuholen. Das führt dann natürlich zu Verzögerungen, löst aber das ipv6-Problem. Die richtige Ideallösung habe ich also auch noch nicht. Vielleicht fällt mir ja noch etwas ein….

    Bis dahin viele Grüße
    Sebastian

  6. Danke für die schnelle Antwort. Bin grad auch dabei im Sinne einer anderen Verknüpfung an dem Problem zu basteln. Mittlerweile hab ich es zumindest soweit, dass ich zumindest in Teilen von aussen an meine Fritzbox heran komme (Es kommen nicht alle Daten an). Leider klappt das noch nicht ganz. Wenn ich aber das zum laufen bekomme, müsste es hier ja genauso klappen. Lösungsansatz ist der Portmapper von Feste-Ip.net und die MyFritz!Freigabe der Fritzbox.

  7. Hallo Prefect,

    die von dir angesprochenen Besserungen lassen sich ja relativ schnell und einfach einbauen, sind aber ein eigenes Thema. Die Verschlüsselung hilft allerdings in dem Fall wenig, da die Befehlsstandteile in der URL stehen und somit nicht verschlüsselt werden. Wenn dann muss alles zum Beispiel mit SOAP oder JSON-Requests laufen, weil die enthaltenden Befehle im Paket verschlüsselt sind.

    Der Ansatz, dass die Informationen gar nicht erst die eigenen 4 Wände verlassen wäre mir auch lieber, ist aber aufgrund der Struktur von Google Home (und auch Amazon Echo) nicht vorgesehen. Deswegen benötigen selbst Philips Hue und Co einen Hub in der Wohnung, der die Befehle entgegen nimmt und auf deren Produkte überträgt. Ich bezweifle auch, dass sich das in naher Zukunft ändern wird. Aber hoffen kann man sicher :)

    Viele Grüße
    Sebastian

  8. Hallo Sebastian,

    ich versuche gerade deine Idee bei mir umzusetzen habe jedoch noch etwas Probleme das zum laufen zu bekommen.
    Frage:
    * welche Adresse (URL) muss ich unter IFTTT-Webhooks eingeben wenn ich kein dyndns-Dienst nutzen möchte?

    Aktuell habe ich http://192.168.0.XX/input.php?steckdose=1&zustand=1 eingegeben. Google Home gibt mir zwar eine Rückinfo das die Funktsteckdose an ist jedoch wird nichts geschaltet. Also habe ich wohl einen Fehler in meiner Verknüpfung oder im PHP-Skript.

    Ich bin noch sehr neu im Thema Webserver & PHP daher bernötige ich wohl eine etwas feiner Beschreibung wie ich zum Ziel komme.

    Gruß Katsche

  9. Hallo Katsche,

    die interessante Frage ist erstmal, was passiert, wenn Du die Adresse in Deinem Browser eingibst? Schaltet dann etwas oder nicht? Falls es schaltet, dann liegt es nur an dem nachfolgenden. Ansonsten gibt es auch noch ein Problem im Skript.

    Grundsätzlich ist diese Adresse von außen nicht erreichbar. IFTTT versucht aber diese Adresse aus dem Internet heraus anzusprechen. Deswegen funktioniert es nicht. Adressen, die mit 192.168.* anfangen, sind private Adressen, die es nur intern in Heimnetzen und Firmennetzen gibt. Deswegen wird dyndns oder eine feste IP-Adresse sowie eine Portweiterleitung benötigt, damit der Raspberry aus dem Internet ansprechpar ist.

    Viele Grüße
    Sebastian

Einen Kommentar abschicken

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