Seit dem 08.08.2017 ist der Google Home mit seinem Google Assistant nun auch in Deutschland erhältlich. Da AVM leider noch immer nicht plant Google Home oder Amazon Echo offiziell zu unterstützen, habe ich nach einem eigenen Weg gesucht um meine Smart Home Geräte von AVM per Sprache zu steuern.
Da ich es praktisch finde das keine weitere Basis benötigt wird wenn man eine FRITZ!Box verwendet und ich grundsätzlich die Hardware von AVM sehr mag, finde ich deren Einstellung beziehungsweise Entscheidungen diesbezüglich sehr schade. Abgesehen davon stellt sich mir auch die Frage wie gut man sich auf einem so stark wachsenden Markt behaupten kann wenn man solche Dinge nicht anbietet.
Doch kommen wir nun zu dem eigentlichen Thema: Die Steuerung von FRITZ!DECT 200 und FRITZ!DECT 300 Geräten mithilfe des Google Home. Das ganze funktioniert natürlich auch mit anderen AVM Geräten wie beispielsweise dem FRITZ!DECT 210. Aufgrund der langen Wege die zurück gelegt werden müssen gibt es jedoch eine recht hohe Verzögerung von im Schnitt etwa 5 Sekunden. Sollte jemand damit Probleme haben empfehle ich an dieser Stelle abzubrechen. Technisches Verständnis ist für diese Anleitung sehr empfehlenswert.
Vorgehensweise
Sprachkommando → Google Home → IFTTT (Google Assistent Service) → IFTTT (Maker Webhooks Service) → Aufruf einer URL → DDNS DynDNS Dienst → Raspberry Pi Webserver → fritzctl console → FRITZ!Box → FRITZ!Box AHA Gerät → Schalten
Hardware & Software
Hardware die ich verwendet habe:
- FRITZ!Box 6490 Cable mit neuster Firmware 6.83
- Raspberry PI 3 Modell B
- Diverse FRITZ!DECT 200 und FRITZ!DECT 300 Geräte
- Google Home
Software die ich verwendet habe:
- Raspian Stretch Lite vom 16.08.2017 (kostenlos)
- fritzctl – console AVM FRITZ!Box client (kostenlos)
- python-certbot-apache (kostenlos)
- Apache Webserver (kostenlos)
- PHP-Script (siehe unten – kostenlos)
Dienste die ich verwendet habe:
- IFTTT mit den Services Google Assistant und Maker Webhooks (kostenlos)
- DDNS DynDNS (kostenlos)
FRITZ!Box vorbereiten
Die FRITZ!Box sollte auf dem neusten Stand sein und somit über das aktuellste FRITZ!OS verfügen. Empfehlenswert wäre es zudem einen extra Benutzer für die Smart-Home Steuerung anzulegen. Um aus dem Internet über eure FRITZ!Box auf den Raspberry Pi zugreifen zu können, müsst ihr neben einem DynDNS Account auch eine Portfreigabe (HTTPS/443) in den Einstellungen hinterlegt haben. Als DynDNS Anbieter empfehle ich euch den kostenlosen und zuverlässigen DynDNS Service. Wie das alles in eurer FRITZ!Box eingerichtet wird, erfahrt ihr online im Service-Bereich von AVM.
Raspberry PI vorbereiten
Auf meinem Raspberry Pi läuft die neuste Version von Raspbian Stretch Lite, Apache sowie PHP. In diesem Howto werde ich aber nicht weiter auf die Grundeinrichtung eines Raspberry Pi und der bekannten Software eingehen. Alle benötigen Anleitungen und Informationen dazu findet ihr schnell über Google. Um jegliche Kommunikation verschlüsselt zu übertragen ist mein Webserver mit einem kostenlosen Let´s Encrypt SSL-Zertifikat ausgestattet. Wie ihr das schnell und einfach einrichten könnt erfahrt ihr hier.
Um unsere AVM Smart-Home Geräte zu steuern muss auf dem Raspberry Pi zusätzlich fritzctl verfügbar sein. Für die Installation fügen wir dem Betriebssystem das benötigte Repository sowie den dazugehörigen Signaturschlüssel hinzu.
echo "deb *ungültiger Link entfernt* stretch main" | sudo tee -a /etc/apt/sources.list wget -qO - *ungültiger Link entfernt* | sudo apt-key add -
Anschließend aktualisieren wir unser lokales Repository und installieren fritzctl.
sudo apt update sudo apt install fritzctl
Über den folgenden Befehl wird die Einrichtung des Scriptes gestartet:
sudo fritzctl configure
Sobald alle benötigten Informationen bereitgestellt wurden, könnt ihr eure Smart-Home Geräte bereits über die Kommandozeile steuern. Weitere Informationen dazu erhaltet ihr über den folgenden Befehl:
fritzctl --help
Zwischenstand kontrollieren
- Ist der Webserver auf eurem Raspberry Pi über die DynDNS Domain erreichbar?
- Funktioniert die Steuerung eurer Smart Home Geräte über die Kommandozeile?
Wenn alles bisher eingerichtete funktioniert kann sofort es weiter gehen. Andernfalls empfehle ich euch zuerst die Fehler zu beheben.
Script anpassen
Auch wenn das von mir erstellte Script nicht wirklich schön ist funktioniert es zuverlässig und ist sicher. ? Ladet euch das ZIP-Archiv mit den benötigten Dateien hier herunter (Version 1.1) und entpackt diese. Anschließend öffnet ihr die Datei “fritz-aha-connect.php” und nehmt die nachfolgend genannten und notwendigen Anpassungen vor.
// Erlaubte Geräte $erlaubtegeraete = array( "Geraetename1", "Geraetename2", "Thermostate", "GutenMorgen", "GuteNacht", );
Hier wird festgelegt welche Geräte durch dieses Script gesteuert werden dürfen. Die Namen müssen 1:1 aus der FRITZ!Box übernommen werden. Erlaubt sind jedoch nur Großbuchstaben, Kleinbuchstaben und Zahlen. Unter Umständen müsst ihr die Gerätenamen vorher in der FRITZ!Box diesbezüglich anpassen. “Thermostate” ist ein Platzhalter der es ermöglicht das alle Heizkörperregler gleichzeitig gesteuert werden können. Die beiden Platzhalter “GutenMorgen” und “GuteNacht” können dafür verwendet werden um mehrere Steckdosen gleichzeitig zu schalten. Sollten die Platzhalter nicht benutzt oder benötigt werden, könnt ihr diese einfach entfernen.
// Erlaubte Schlüssel $erlaubteschluessel = array( "KEYEINFÜGEN", );
Um die Sicherheit zu erhöhen wird im Script ein Schlüssel hinterlegt. Dieser muss bei jeder Anfrage übertragen und abgeglichen werden. Ersetzt “KEYEINFÜGEN” hier auf jeden Fall durch einen selbst erstellen Schlüssel der aus ca. 30 Zeichen besteht. Erlaubt sind hierbei Großbuchstaben, Kleinbuchstaben und Zahlen.
// Geräte abschalten verhindern $abschaltenverhindern = array( "Geraetename2", );
Wenn bestimmte Geräte nicht ausgeschaltet werden dürfen müsst ihr sie hier auflisten. Beispiel: Server & Computer
// Geräte umschalten verhindern $umschaltenverhindern = array( "Geraetename2", );
Wenn bestimmte Geräte nicht umgeschaltet werden dürfen müsst ihr sie hier auflisten. Beispiel: Server & Computer
// Befehl ausführen - Temp elseif( $typ == "300" && $geraet == "Thermostate" ) { shell_exec("fritzctl temperature '$status' Geraetename3 Geraetename4 Geraetename5 Geraetename6"); }
Solltet ihr den Platzhalter “Thermostate” benötigen beziehungsweise verwenden, könnt ihr an dieser Stelle die anzusteuernden FRITZ!DECT 300 Geräte mit Ihren Namen auflisten. Das selbe gilt für die Platzhalter “GutenMorgen” und “GuteNacht” im Bereich “Befehle ausführen” mit ihren FRITZ!DECT 200 Geräten.
Die Dateien müssen nach dem speichern in das Hauptverzeichnis des Webservers hochgeladen werden. Bei mir ist das “/var/www/html/”.
IFTTT vorbereiten
In eurem IFTTT Account benötigt ihr die aktivierten Services Google Assistant und Maker Webhooks.
Da es für unsere Zwecke keine passenden Applets gibt müssen wir uns diese selber erstellen. Hierfür gehen wir in den Maker Bereich der IFTTT Plattform und klicken unter “Applets” – “Private” auf den “New Applet” Button. Bei einfachem ein-, aus- oder umschalten müssen die grünen Optionen mit dem entsprechenden Status “on”, “off” oder “toggle” verwendet werden. Für mehrere Thermostate oder zum Übergeben eines Wertes sind es die blauen Optionen (Beispiele):
if
Trigger: Google Assistent
„Say a simple phrase“/„Say a phrase with a number“
What do you want to say (Value): Licht/Temperatur auf # Grad einstellen
What do you want the Assistant to say in response? (Value): Ok
Language (Value): German
then
Add action
Action: Webhooks
„Make a web request“
URL (Value): https:// Eure-DynDNS-Adresse .tld/fritz-aha-connect.php
Method (Value): POST
Content Type (Value): application/x-www-form-urlencoded
Body (Value): schluessel=KEYEINFÜGEN&geraet=Geraetename1&typ=200/300&status=toggle/{{NumberField}}
Applet title: Licht/Heizung
Applet description: Licht/Heizung
Nach dem speichern des Applets könnt ihr auf “Want to test or use this Applet yourself? Enable it on IFTTT” klicken um es zu aktivieren. Wenn ihr alles richtig gemacht habt sollte es auf dieser Seite zu sehen sein. Wenn das der Fall ist könnt ihr ab sofort den von euch eingerichteten Sprachbefehl nutzen. Bitte beachtet das es bei einigen Kombinationen von Wörtern Probleme geben kann da diese teilweise nicht von Google akzeptiert werden. Um solche Fehler auszuschließen empfehle ich, wie in den Beispielen, ganz einfach anzufangen. Solltet ihr ein Applet bearbeiten müsst ihr es unter Umständen erneut aktivieren.
Fertigstellung
Da solche Sachen immer zuverlässig, ohne Probleme und auf Anhieb funktionieren (?) gehe ich davon aus das alles bestens geklappt hat. Somit könnt ihr nun mit der finalen Einrichtung beginnen und euch alle benötigten Applets erstellen und gegebenenfalls Anpassungen am Script vornehmen.
Über euer Feedback in den Kommentaren würde ich mich freuen.
Pingback: FRITZ!Box Smart Home Geräte mit dem Google Assistent steuern – Randnotizen.org
Hallo.
Mich interessiert es stark, wie man die AVM Heimautomationsgeräte mit Google Home steuern kann.
Was ich bei dem Projekt allerdings nicht verstehe ist, warum das ganze über IFTTT laufen muss. Das Script arbeitet ja local auf dem Pi. In der Assistent App kann ich ja direkt eine Verknüpfung ala ‘If this Tha that’ anlegen. Warum also über einen dritten Dienst?
Hallo Stephan, diese Verknüpfungen sind leider nicht dafür ausgelegt. Sie dienen, soweit ich das erkennen kann und verstehe, lediglich dazu um verschiedene Sprachbefehle miteinander zu verknüpfen. Wie es in den Beispielen dort auch gezeigt wird. Beispielsweise: “Training starten” -> “Bei Google Play Musik zum Training abspielen” oder “Feierabend” -> “Sende eine WhatsApp an X ‘Ich komme nach Hause'”. Es sind lediglich kürzere Kommandos und vereinfachen einiges. Aber diese Funktion ist meines Wissens nach nicht in der Lage einen HTTP POST request durchzuführen bzw eine URL aufzurufen. – Leider.
Gefällt mir! Würde es sich bei dem Setup lohnen, eine Deployment Automatisierung ala ansible und co anzugehen?
Da ich das ganze vorerst nur für mich umgesetzt habe, würde ich zum jetzigen Zeitpunkt sagen das sich das auf keinen Fall lohnt. Sollte an diesem Projekt ein gewisses Interesse entstehen gäbe es auf jedenfall einiges zum automatisieren und verbessern. ? Mit deutlich mehr Aufwand wäre es wahrscheinlich auch möglich das ganze komplett, ohne IFTTT als Mittelsmann, auf einem Raspberry laufen zu lassen.