Startseite>Mit Amazon Echo und dem Raspberry Pi das Haus per Sprachkommando steuern
Aus Raspberry Pi Geek 08/2018

Mit Amazon Echo und dem Raspberry Pi das Haus per Sprachkommando steuern

© designleo, 123RF

Es werde Licht

Martin Mohr

Es fällt nicht allzu schwer, über Amazon Echo die GPIOs des Raspberry Pi anzusteuern. Dabei kommt das auf Python basierende Flask-Framework zum Einsatz, um passende Alexa-Skills zu entwickeln.

Zuerst einmal benötigen Sie einen Amazon Echo [1]. Mit dem Echo bietet Amazon einen Mini-Computer an, der dazu dient, Sprachbefehle entgegenzunehmen und darauf zu reagieren. Den entsprechenden virtuellen Assistenten – er ähnelt Apples Siri oder Googles OK Google – nennt Amazon Alexa. Der amerikanische Konzern bietet den Echo Dot der zweiten Generation für knapp 40 Euro an. Wenn Sie sich für die genaue Funktionsweise des Amazon Echo interessieren, werfen Sie einen Blick in den Kasten “Amazon Echo: Funktionsweise”.

Amazon Echo: Funktionsweise

Da der Rechner im Echo über wenig Ressourcen verfügt, achtet das Gerät selbst nur auf Signalwörter wie etwa “Alexa”, “Echo”, “Amazon” oder “Computer”. Das darauf folgende Sprachkommando schickt der Echo (analog zu den Sprachassistenten von Google oder Apple) an eine Server-Farm im Internet zur Dekodierung. Um die Funktionsweise der Dekodierungssoftware zu verbessern, nutzt Amazon die Eingaben, um ein Sprachprofil zu erstellen.

Auf der Oberseite des Echo befinden sich vier Taster. Mit zwei davon regeln Sie die Lautstärke des Lautsprechers. Der Taster mit dem Punkt dient als Aktionsbutton, er aktiviert wie das gesprochene “Alexa”-Kommando die Spracherkennung. Mit dem vierten Taster lassen sich die internen Mikrofone (sieben an der Zahl) komplett deaktivieren.

Von Haus aus beherrscht der Echo nur relativ wenige Aktionen, zum Beispiel Musik abspielen oder Begriffe erklären. Wirklich interessant wird es, sobald Sie sogenannte Skills aktivieren. Skills stammen wie Apps auf dem Smartphone in der Regel von Drittanbietern und können viele verschiedene Funktionen übernehmen. Als Beispiele seien hier Hausautomationsanwendungen oder auch Bankgeschäfte genannt.

Außerdem benötigen Sie einen Raspberry Pi, an den Sie für erste Tests acht LEDs anschließen. Abbildung 1 zeigt den entsprechenden Schaltplan. Die LEDs sollen die Funktionsweise des Flask-Frameworks veranschaulichen, später steuern Sie anstelle der LEDs andere Geräte über die Ports an. In Abbildung 2 sehen Sie den Versuchsaufbau, alternativ demonstriert ein Youtube-Video [2] die Funktion.

Abbildung 1: Der Schaltplan für die acht LEDs, die für erste Tests die Funktionsweise des Flask-Frameworks veranschaulichen.

Abbildung 1: Der Schaltplan für die acht LEDs, die für erste Tests die Funktionsweise des Flask-Frameworks veranschaulichen.

Abbildung 2: Der komplette Versuchsaufbau mit einem Raspberry Pi und einem Amazon Echo.

Abbildung 2: Der komplette Versuchsaufbau mit einem Raspberry Pi und einem Amazon Echo.

Für das Experiment genügt ein Raspberry Pi der ersten Generation, auf dem Sie die neueste Version von Raspbian “Stretch” Lite installieren. Die Lite-Variante verzichtet auf eine grafische Benutzeroberfläche und kommt daher gut mit den knappen Ressourcen zurecht. Für dieses Projekt benötigen wir auf dem Raspberry Pi die GUI ohnehin nicht.

Flash-Framework

In der Lite-Variante von Raspbian fehlen allerdings einige Bibliotheken und Tools, die Sie vor der Installation von Flask auf das System bringen müssen (Listing 1, erste drei Zeilen). Die Installation mit Pip, dem Verwaltungswerkzeug für Python-Module, nimmt einige Zeit in Anspruch (letzte Zeile) – Sie dürfen währenddessen getrost einen Kaffee trinken gehen.

Listing 1

 

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install python2.7-dev python-dev python-pip wiringpi
$ sudo pip install flask-ask

Nun benötigen Sie auf dem Raspberry Pi ein Werkzeug, das einen sicheren Tunnel zwischen dem Echo-RasPi und den Amazon-Servern aufbaut. Dazu bietet sich Ngrok [3] an, das sich sehr leicht installieren und konfigurieren lässt. Bei der kostenlosen Version ändert sich allerdings nach jedem Neustart die URL des Tools. Ist Ihnen das lästig, müssen Sie in den sauren Apfel beißen und eine kommerzielle Variante verwenden.

Zur Installation laden Sie die Version für Linux ARM von der Ngrok-Webseite herunter und übertragen das Zip-Archiv auf den RasPi. Anschließend entpacken Sie die Datei und rufen Ngrok direkt aus dem Terminal heraus auf (Listing 2).

Listing 2

 

$ unzip /home/pi/ngrok-stable-linux-arm.zip
$ ./ngrok http 5000

Dabei weisen Sie es an, den Port 5000 von Localhost weiterzuleiten und dort auf HTTP-Anfragen zu lauschen. Die Ausgabe sollte dabei Abbildung 3 ähneln. Bei jedem Verbindungsaufbau generiert Ngrok neue, zufällige URLs. Die markierte Adresse benötigen Sie dann später noch, um sie in den Alexa-Skills als Kommunikationsendpunkt zu verwenden.

Abbildung 3: Ausgabe von Ngrok. Die HTTPS-URL benötigen wir später noch.

Abbildung 3: Ausgabe von Ngrok. Die HTTPS-URL benötigen wir später noch.

Da der Ngrok-Server jetzt das aktuelle Terminal blockiert, öffnen Sie ein zweites. Dort erstellen Sie nun eine Textdatei haus.py mit dem Inhalt von Listing 3. Dieses Python-Programm rufen Sie dann später mit dem Alexa-Skill auf.

Listing 3

 

# haus.py
import logging
import time
import RPi.GPIO as GPIO
from flask import Flask, render_template
from flask_ask import Ask, statement, question, session
GPIO.setmode(GPIO.BCM)
app = Flask(__name__)
ask = Ask(app, "/")
logging.getLogger("flask_ask").setLevel(logging.DEBUG)
@ask.launch
def gruss():
  GPIO.setup(17, GPIO.OUT) # GPIO 0
  GPIO.setup(18, GPIO.OUT) # GPIO 1
  GPIO.setup(27, GPIO.OUT) # GPIO 2
  gruss = render_template('gruss')
  return question(gruss)
@ask.intent("FernseherIntent",mapping={'status': 'status'})
def fernseher(status):
  print 'test=>{}'.format (status)
  if status == "an":
      print 'AN'
      GPIO.output(17, GPIO.HIGH) # GPIO 0
  if status == "aus":
      print 'AUS'
      GPIO.output(17, GPIO.LOW) # GPIO 0
  status = render_template('fernseher', status=status)
  return question(status)
@ask.intent("LichtIntent",mapping={'status': 'status'})
def licht(status):
  if status == "an": GPIO.output(18, GPIO.HIGH) # GPIO 1
  if status == "aus": GPIO.output(18, GPIO.LOW) # GPIO 1
  status = render_template('licht', status=status)
  return question(status)
@ask.intent("SteckdoseIntent")
def steckdose(status):
  if status == "an": GPIO.output(27, GPIO.HIGH) # GPIO 2
  if status == "aus": GPIO.output(27, GPIO.LOW) # GPIO 2
  status = render_template('dose', status=status)
  return question(status)
if __name__ == '__main__':
  app.run(debug=True)

Das Programm stellt einen Server bereit, der drei Geräte kontrolliert: einen Fernseher, eine Lampe und eine Steckdose. Für jedes Gerät gibt es im Programm einen sogenannten Intent, der genau diese eine Funktion steuert. Die Dekoratoren @ask.intent() definieren die Funktionen, die der jeweilige Intent dann beim Aufruf als Aktion ausführt.

Passende Begrüßung

Der Dekorator @ask.launch initiiert einen Begrüßungstext, im Beispiel das hessische “Guude”, das zu jeder Tageszeit passt. In den Funktionen werden die zur Ansteuerung der GPIOs nötigen Kommandos ausgeführt. Das Flask-Framework kapselt die Komplexität, die sich hinter einem Skill verbirgt, sehr gut.

Weitere Daten stehen in der Ressourcendatei templates.yaml. Sie muss im selben Verzeichnis liegen wie das Python-Programm, das mit dem Skill kommuniziert. In dieser Datei legen Sie die Texte ab, die der Skill verwenden soll. Das erleichtert es, die Sprachausgaben anzupassen, um etwa den Gruß umzustellen oder andere Geräte einzutragen. Die Ressourcendatei für das Beispiel im Artikel sehen Sie in Listing 4.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland