FHEM Connector für Amazon Alexa

Aus FHEMWiki
Version vom 2. Januar 2019, 13:48 Uhr von Gvzdus (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „'''Alexa FHEMlazy''' ist eine Erweiterung von Alexa FHEM, die idealerweise innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Alexa FHEMlazy ist eine Erweiterung von Alexa FHEM, die idealerweise innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo-Gerät ermöglicht. Gegenüber der Originalversion ergeben sich Einschränkungen, so läuft die Software zwangsweise unter dem gleichen Benutzer wie FHEM, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden). Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig.

  • Die Software kommt mit einem Installer, der die Erstkonfiguration und Anmeldung übernimmt
  • Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server
  • Als Skill bei Amazon wird der (z.Zt. noch im Beta-Test befindliche) Skill "FHEMlazy" verwendet.

Der Thread im Forum zur Software ist Thema.


FHEM Connector für Amazon Alexa
Zweck / Funktion
Anbindung von FHEM an Amazon Assistent Alexa
Allgemein
Typ Inoffiziell
Details
Dokumentation siehe Forum
Support (Forum) Frontends/Sprachsteuerung
Modulname
Ersteller gvzdus
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Einführung

Arbeitsweise und Datenfluss

Die Alexa-API von Amazon kennt als eigene Gruppe die Vorlage:Https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html. Skills, die die SmartHome-API implementieren, erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann "Alexa, wie ist die Temperatur im Wohnzimmer?", während andere Skills zunächst explizit angesprochen werden müssen ("Alexa, frage FHEM nach der Temperatur im Wohnzimmer"). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.

Gehen wir den Datenfluss bei der konkreten Frage "Wie ist die Temperatur im Wohnzimmer?" durch:

  • Alexa hat bei der Skillinstallation gelernt, dass FHEMlazy bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von "Alexa Voice Service" in der Cloud erkannt, dass eine Abfrage an FHEMlazy erfolgversprechend ist.
  • Zunächst wird die zentrale "Lambda-Funktion" von FHEMlazy aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte "Bearer-Token".
  • Der "Vereinsserver" prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.
  • Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.
  • Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf Port 3000 auf Requests "lauscht". In der Original-Version Alexa FHEM kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei FHEMlazy kommen sie ausschließlich aus dem SSH-Tunnel von lokal.
  • Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.
  • FHEM führt den Befehl aus

Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.

Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.

Installation

Du wirst bei der Installation einmal auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.

Folgende Voraussetzungen sollten erfüllt sein: - Du hast einen Linux-artigen Server, auf dem FHEM läuft, und kannst halbwegs sicher Kommandos auf der Shell absetzen. - Du hast mindestens ein Gerät, dass Du über FHEM erfolgreich im Web steuern kannst - Du hast Alexa eingerichtet und Zugriff zu den Credentials - Du hast in FHEM Deine Konfiguration gesichert

FHEM-Benutzer und Environment klären

Logge Dich auf dem System ein. I.d.R. läuft FHEM unter dem Benutzer "fhem", aber das sollte sichergestellt sein.

FHEM-Benutzer

ps -ef | grep fhem

sollte Dir ein oder zwei Zeile(n) wie

fhem     27602     1  3 10:50 ?        00:03:35 /usr/bin/perl fhem.pl fhem.cfg

anzeigen. Der Nutzer, unter dem FHEM läuft, findet sich in der ersten Spalte. Wenn hier nicht "fhem" steht, ist es wichtig, dass Du im Folgenden bei der "sudo"-Zeile den entsprechenden, anderen Benutzer angibst!

Download-Utility

Zum Download der Software empfehlen sich "git", "wget" oder "curl". Mit "git" ist das Updaten besonders einfach, dafür ist das Werkzeug komplexer. Probiere der Reihe nach die Kommandos "git", "wget" und "curl" aus, falls nichts davon funktioniert, informiere Dich, wie Du sie auf Deinem System installierst.

Beispiel "git" auf Raspbian Jessy:

sudo apt-get install git

SSH prüfen

Sicherheitshalber bitte auch einmal prüfen, ob ssh bzw. ssh-keygen gefunden werden

which ssh-keygen

Wenn hier etwas wie

/usr/bin/ssh-keygen

zurück kommt, ist auch hier alles grün.

node.js installieren

Bei Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor. Mit

sudo apt-get install nodejs

kannst Du es installieren. Mit

node --version

erfährst Du die aktuelle Version - wenn hier etwas mit "8" vorneweg erscheint, ist alles gut. Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.


Alexa-FHEMlazy installieren

Erstinstallation

Wir werden nun eine Kommandos unter dem Benutzer von FHEM ausführen. Auch, wenn aus Sicherheitsgründen keine Shell für den FHEM-Nutzer eingerichtet wurde, rufst Du mit

sudo -u fhem bash

jetzt erfolgreich eine solche auf. Wechsele mit "cd" ins Home-Verzeichnis:

cd

Kontrolliere das Verzeichnis:

pwd

sollte Dir jetzt etwas wie /opt/fhem ausgeben, und mit

cp fhem.cfg fhem.cfg_vor_fhemlazy

fertigst Du ein letztes Backup Deiner Konfiguration an.

Lade jetzt die Software mit *einem* der folgenden Kommandos (siehe oben):

git
git clone https://github.com/gvzdus/alexa-fhem
wget
wget https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz
curl
curl -O https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz

Wechsele in das neu erstellte Verzeichnis:

cd alexa-fhem

Lade die für die Software benötigten NodeJS-Bibliotheken nach:

npm install

Der Vorgang benötigt etwas Zeit. Am Ende sollte maximal die Meldung von einer "low severity vulnerability" ein einer Bibliothek kommen.

Und nun wird es wirklich ernst, denn im nächsten Schritt werden Deine geheimen Keys erzeugt, die FHEM-Konfiguration modifziert, Dein SSH-Key ggf. erzeugt und der öffentliche Teil des Schlüssels ebenso wie ein Hash (= nicht auflösbare "Prüfsumme") Deines Keys an den Vereinsserver übertragen: Starte den Installer durch den Aufruf mit "-A":

bin/alexa-fhem -A

Eigentlich musst Du im Optimalfall immer nur Enter drücken. An einer Stelle kommt die Aufforderung, der Datenschutzerklärung zuzustimmen, und natürlich sollst Du sie wirklich lesen. Und an späterer Stelle heisst es:

This is your registration key:


>>>>>>>>>        1106AC-5F82623F069901AA-623991DE37124AE8        <<<<<<<<

Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal in ein Editor-Fenster wegsichern.

Durch alle Schritte durch und wieder gesund auf der Kommandozeile? Dann lasse sie noch offen, aber primär geht es jetzt im FHEM-Webfrontend weiter.

Alexa-FHEMlazy im FHEM-Webfrontend starten

Das Script hat Dir nun u.a. 4 FHEM-Devices angelegt, sofern sie nicht schon existierten. Zunächst die erst einmal weniger spannenden:

  • "MyAlexa" ist ein Device, um das von Original-Modul "Alexa" von FHEM zu aktivieren. Es stellt Dir u.a. die neuen Attribute wie "alexaName" zur Verfügung.
  • "FHEM.Alexa.DOIF" definiert die Aktionen beim Starten und Stoppen der (NodeJS)-Software
  • "FHEM.Alexa.autostart" sorgt dafür, dass beim Neustart von FHEM auch die NodeJS-Software gestartet wird

Wichtig für Dich ist "FHEM.Alexa". Suche das Device und rufe es auf:



Alexa-Fhem testen

Node.Js stellt einen Web-Server am Port 3000 bereit, das oben erzeugte Zertifikat sichert diesen Zugang per SSL ab. Durch Aufruf der Adresse https://<IP-Adresse des Servers>:3000 kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit {"header":{"name":"UnsupportedOperationError"...

Alexa Device anlegen

Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.

Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:

define MyAlexa alexa

Alexa Skills

Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein

  1. Anmeldung auswählen
    Amazon Developer.jpg
  2. Anmeldedaten eingeben
    LogIn.jpg

Einrichtung in der Alexa App

Nachdem die Alexa Skills angelegt wurden, müssen diese noch in der Alexa App eingerichtet werden. Dafür jeweils per Desktop-Browser auf alexa.amazon.de anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.

Alexa Skill

  1. Auf Skills klicken
    Alexa.amazon.de-01-startseite.png
  2. Oben rechts Meine Skills bzw. Ihre Skills auswählen
    Alexa.amazon.de-03-meine skills.png
  3. In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken
    Alexa.amazon.de-02-liste skills.png
  4. Oben Rechts in den Details des Skills auf Skill aktivieren klicken
    Alexa.amazon.de-04-skill details.png
  5. In dem neu geöffneten Fenster die Autorisierung bestätigen
    Alexa.amazon.de-05-amazon auth.png
  6. Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein
    Alexa.amazon.de-06-success.png


=

Weitergehende Informationen