FHEM Connector für Amazon Alexa: Unterschied zwischen den Versionen

Aus FHEMWiki
(1. Rewrite)
Zeile 1: Zeile 1:
'''Alexa FHEMlazy''' ist eine Erweiterung von [[Alexa-Fhem|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 auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).
== WARNUNG ==
Diese Seite ist im Wartungsmodus und wird soeben überarbeitet!
 
== WARNUNG ==
 
'''Alexa FHEMlazy''' ist historisch ein Fork des Original [[Alexa-Fhem|Alexa FHEM]], der im Januar 2019 mit dem Original zusammengeführt wurde. Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo-Gerät. Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software zwangsweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, 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.  
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 Software integriert einen 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
* 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.
* Als Skill bei Amazon wird der (z.Zt. noch im Beta-Test befindliche) Skill "FHEMlazy" verwendet.
Zeile 19: Zeile 24:


===Arbeitsweise und Datenfluss===
===Arbeitsweise und Datenfluss===
FHEMlazy ist vorläufig ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].
Vorläufig ist alexa-fhem im "LazyModus" ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].
SmartHome-Skills 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.
SmartHome-Skills 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.


Zeile 39: Zeile 44:
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.
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:
=== root werden ===
* Du hast einen Linux-artigen Server, auf dem FHEM läuft, und kannst halbwegs sicher Kommandos auf der Shell absetzen.
Logge Dich auf dem System ein. Da offizielle Software (nodejs etc.) installiert wird, muss Du root werden
* 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 ====
<syntaxhighlight lang="bash" style="width:50%;">
ps -ef | grep fhem
</syntaxhighlight>
 
sollte Dir ein oder zwei Zeile(n) wie


<syntaxhighlight lang="bash" style="width:50%;">
<syntaxhighlight lang="bash" style="width:50%;">
fhem    27602    1  3 10:50 ?        00:03:35 /usr/bin/perl fhem.pl fhem.cfg
sudo /bin/bash
</syntaxhighlight>
</syntaxhighlight>
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:
<syntaxhighlight lang="bash" style="width:50%;">
sudo apt-get install git
</syntaxhighlight>
==== SSH prüfen ====
Sicherheitshalber bitte auch einmal prüfen, ob ssh bzw. ssh-keygen gefunden werden
<syntaxhighlight lang="bash" style="width:50%;">
which ssh-keygen
</syntaxhighlight>
Wenn hier etwas wie
<syntaxhighlight lang="bash" style="width:50%;">
/usr/bin/ssh-keygen
</syntaxhighlight>
zurück kommt, ist auch hier alles grün.


===node.js installieren===
===node.js installieren===
Zeile 98: Zeile 68:




=== Alexa-FHEMlazy installieren ===
=== Alexa-FHEM installieren ===


====Erstinstallation====
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:


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
<syntaxhighlight lang="bash" style="width:50%;">
<syntaxhighlight lang="bash" style="width:50%;">
sudo -u fhem bash
npm install -g alexa-fhem
</syntaxhighlight>
</syntaxhighlight>
jetzt erfolgreich eine solche auf. Wechsele mit "cd" ins Home-Verzeichnis:
<syntaxhighlight lang="bash" style="width:50%;">
cd
</syntaxhighlight>
Kontrolliere das Verzeichnis:
<syntaxhighlight lang="bash" style="width:50%;">
pwd
</syntaxhighlight>
sollte Dir jetzt etwas wie /opt/fhem ausgeben, und mit
<syntaxhighlight lang="bash" style="width:50%;">
cp fhem.cfg fhem.cfg_vor_fhemlazy
</syntaxhighlight>
fertigst Du ein letztes Backup Deiner Konfiguration an.


Lade jetzt die Software mit *einem* der folgenden Kommandos (siehe oben):
Der Vorgang benötigt etwas Zeit.  
===== git =====
<syntaxhighlight lang="bash" style="width:50%;">
git clone https://github.com/gvzdus/alexa-fhem
</syntaxhighlight>
 
===== wget =====
<syntaxhighlight lang="bash" style="width:50%;">
wget https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz
</syntaxhighlight>


===== curl =====
=== Alexa-FHEM aktivieren ===
<syntaxhighlight lang="bash" style="width:50%;">
curl -O https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz
</syntaxhighlight>


Wechsele in das neu erstellte Verzeichnis:
Wechsele jetzt in FHEM-Web!


<syntaxhighlight lang="bash" style="width:50%;">
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gebe dafür in der FHEMWeb-Kommandozeile
cd alexa-fhem
</syntaxhighlight>


Lade die für die Software benötigten NodeJS-Bibliotheken nach:
<syntaxhighlight lang="bash" style="width:50%;">
<syntaxhighlight lang="bash" style="width:50%;">
npm install
define alexa alexa
</syntaxhighlight>
</syntaxhighlight>


Der Vorgang benötigt etwas Zeit. Am Ende sollte maximal die Meldung von einer "low severity vulnerability" ein einer Bibliothek kommen.
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:
 
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":
 
<syntaxhighlight lang="bash" style="width:50%;">
bin/alexa -A
</syntaxhighlight>


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. Sofern FHEM ohne Passwortabfrage auf localhost:8083 läuft, werden Dir keine Fragen gestellt, ansonsten nach Username/Passwort (wie bei der Webanmeldung).
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.
* Du wirst auf dem Server "va-fhem.fhem.de" des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines
Secret-Key dort abgelegt.


Findet der Installer den Server nicht automatisch, wird darum gebeten, einmal komplett die URL aus dem Browser, mit dem Du im heimatlichen LAN auf FHEM zugreifst, in die Konsole zu kopieren.
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und
perfekterweise so aussehen:


Und an späterer Stelle heisst es:
<syntaxhighlight lang="bash" style="width:90%;">
<syntaxhighlight lang="bash" style="width:90%;">
This is your registration key:
This is your registration key:
Zeile 244: Zeile 180:
Sollte etwas nicht grün sein, und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.
Sollte etwas nicht grün sein, und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.


Wegen meiner herausragenden HTML-Kenntnisse findet sich ganz rechts der Button "Activate FHEMlazy". Klicke hier, Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.
Ist alles okay, klicke rechts den Button "Activate Skill". Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.


Amazon wird unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.
Amazon wird unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.

Version vom 10. Januar 2019, 19:17 Uhr

WARNUNG

Diese Seite ist im Wartungsmodus und wird soeben überarbeitet!

WARNUNG

Alexa FHEMlazy ist historisch ein Fork des Original Alexa FHEM, der im Januar 2019 mit dem Original zusammengeführt wurde. Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo-Gerät. Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software zwangsweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, 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 integriert einen 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

Vorläufig ist alexa-fhem im "LazyModus" ein reiner SmartHome-Skill. SmartHome-Skills 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.

root werden

Logge Dich auf dem System ein. Da offizielle Software (nodejs etc.) installiert wird, muss Du root werden

sudo /bin/bash

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-FHEM installieren

Nun installieren wir Alexa-fhem aus dem offiziellen Repository:

npm install -g alexa-fhem

Der Vorgang benötigt etwas Zeit.

Alexa-FHEM aktivieren

Wechsele jetzt in FHEM-Web!

Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gebe dafür in der FHEMWeb-Kommandozeile

define alexa alexa

an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:

  • Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert
  • Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.
  • Du wirst auf dem Server "va-fhem.fhem.de" des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines

Secret-Key dort abgelegt.

Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und perfekterweise so aussehen:

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

Sofern Du die Forumsversion von 39_alexa.pm benutzt, an der justme1968 gerade entwickelt, findest Du nur das MyAlexa-Device. Bitte suche dann im Folgenden bei MyAlexa statt Alexa.FHEM. Sobald der aktuellste FHEM diese Version verwendet, wird die Anleitung umgestellt.

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

Start und Stop starten bzw. beenden die (NodeJS)-Software. Mit Reload kannst Du nach Änderungen von Geräten im FHEM auslösen, dass die Software die Geräteliste von FHEM neu abholt. Bei einer anschließenden Suche nach neuen Geräten in Alexa sollten die Geräte dann sichtbar werden. Aber nun klicke bitte auf "Start". Leider sagt das Angehen des Lampensymbols nicht allzu viel über den tatsächlichen Erfolg.

Deswegen prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:

ps -ef | egrep '(alexa|ssh)'

sollte Dir idealerweise so etwas anzeigen:

fhem     31322     1 99 13:56 ?        00:00:03 alexa                              
fhem     31332 31322  8 13:56 ?        00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:3000 -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de

"alexa" ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.

Wenn Du diese Prozesse nicht siehst, dann ist leider der Start nicht glatt verlaufen. Mit

cat /tmp/alexa.stdout.log

findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.

Auf der Seite fällt Dir vielleicht auf, dass unten unter "Readings" ein "skillRegistrationKey" und ein "bearerToken" auftauchen.

Sollte der Schlüssel immer noch nicht im Editor sein, weißt Du jetzt, wo Du ihn findest. Mit etwas gesundem Sicherheitsbewusstsein kannst Du ihn aber auch löschen, sofern Du wirklich weisst, wo Du ihn sonst findest. Das "bearerToken" hingegen zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.

Geräte im FHEM-Webfrontend zuweisen

Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus - wird keins der FHEM-Geräte automatisch Alexa zugewiesen!

Wähle die Geräte aus, rufe sie auf und setze das Attribut "alexaName". Hierbei in Kürze nur der Hinweis:

  • Keine Angst vor Leerzeichen und Umlauten, funktioniert.
  • Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern "handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal".

Lade die Geräte neu in die Software, indem Du bei "FHEM.Alexa" auf "Reload" klickst!

Finale: Skill verknüpfen

Zum Zeitpunkt des Beta-Tests muss noch jeder Benutzer einzeln zur Nutzung des Skills eingeladen werden. Schreibe mir - ohne lange Umstände und Huldigungen - eine Email an

gvz-fhembeta@garnix.de

In dieser Email sollte aber Dein Anmeldename bei Amazon enthalten sein, wie Du ihn für Alexa nutzt: Denn genau dieser Account wird freigegeben!

Mit dem Aufruf der erhaltenen URL solltest Du jetzt den Skill hinzufügen können, und nutze bitte hierfür das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.

Amazon erwartet zunächst, dass Du Dich normal bei Amazon anmeldest. Sobald Du FHEMlazy verknüpfst, öffnet sich ein Browser-Tab mit folgender Maske:
FHEMlazy login.png

Hier kopierst Du Deinen Anmeldeschlüssel hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:
FHEMlazy check.png


Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).

Sollte etwas nicht grün sein, und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.

Ist alles okay, klicke rechts den Button "Activate Skill". Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.

Amazon wird unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.

Sicherheitskonzept und Secrets

Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt "Arbeitsweise" im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, "irgendwie sicherer" ist. Andererseits möchte man nicht blind vertrauen.

SSH

SSH - macht das nichts Gefährliches?

SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte "Reverse-Tunnel" implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: "Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.". Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.

Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination

ssh -R 1234:localhost:3000 zielserver

erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu Port 3000 auf Deinem Server aufgebaut werden. Du kannst also z.B. mit einem

sudo /usr/sbin/tcpdump -X -s 0 -i lo port 3000

vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.

Wie wird bei SSH verschlüsselt?

Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie "LetsEncrypt" unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: "Willst Du jetzt und künftig diesem Schlüssel vertrauen?" Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: "Das ist definitiv wieder derjenige, der sich damals "registriert" hat". Und an dieser Stelle kann ich auch den ersten Teil des 3-teiligen Registrierungskeys erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.

Die Rolle der Secrets

Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen: 1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:

  • Das Anmelde-Secret
  • Das Bearer-Token

Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der Hashwert des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.

Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann "sieht" der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.

2) Das zweite Problem ist: Wie soll Amazon "beweisen", dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf "Mit FHEM-Lazy verbinden" den dritten Teil des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine "User-ID" enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token "stimmt".

Updaten

1) Im Web-Frontend "FHEM.Alexa" suchen und auf "Stop" klicken.

2) Auf die Konsole und wie anfangs bei der Installation

Mit dem richtigen Nutzer eine Shell starten:

sudo -u fhem bash

Für git-Nutzer:

Wechsele ins Software-Verzeichnis:

cd ~/alexa-fhem
git pull

Für curl/wget-Nutzer:

cd ~/
wget https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz

bzw:

cd ~/
curl -O https://va.fhem.de/alexa-fhem.tar.gz
tar xzf alexa-fhem.tar.gz

Ggf. die für die Software benötigten NodeJS-Bibliotheken nachladen:

npm install

3) Im Web-Frontend auf "Start" klicken.

Weitergehende Informationen