Alexa-Fhem: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Textkorrektur)
K (Disclaimer: Platzierung und Formatierung geändert)
 
(304 dazwischenliegende Versionen von 24 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Alexa-Fhem''' ist eine in JavaScript und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im [https://forum.fhem.de/index.php/topic,60244.0.html Forum] veröffentlicht.
{{Hinweis|'''ACHTUNG''': Diese Seite beschreibt nicht mehr exakt die jeweils nötigen Amazon Seiten. Es ist etwas Interpretation und Verständnis nötig.
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.
 
Für alle, die neu einsteigen und sich mit dem FHEM Vereinsserver als Proxy anfreunden können, empfiehlt es sich, über die Beschreibung '''''[[FHEM Connector für Amazon Alexa]]''''' einzusteigen.}}
<!-- Ende Disclaimer -->
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa
|ModType=x
|ModType=x
|ModTechName=
|ModTechName=
|ModForumArea=Sonstige Systeme
|ModForumArea=Frontends/Sprachsteuerung
|ModOwner=justme1968
|ModOwner=justme1968
}}  
}}
'''alexa-fhem''' ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im {{Link2Forum|Topic=60244|LinkText=Forum}} veröffentlicht.
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.
 
==Einführung==
===Glossar===
{{Randnotiz|RNTyp=r|RNText=Für die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen. }}
*Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems '''BILDER EINSTELLEN - Achtung Urheberrecht'''
*AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.
*AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion '''WARUM ? Nachlesen bei Amazon'''.
*Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht, sowie weitergehende Informationen über die Reaktion von Alexa enthält und Rückmeldung an Amazon erlaubt.
*Skill (engl. für Fertigkeit, Können) ist die Bezeichnung für eine per Spracherkennung zu bedienende Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, Wettervorhersage oder zur Steuerung von FHEM
 
===Arbeitsweise und Datenfluss===
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]
Echo → AVS → AWS Lambda → alexa-fhem → AWS Lambda → AVS → Echo
*Der Echo (oder ein anderes Alexa/AVS fähiges Gerät)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten
:*Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben
:*Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem ''Interaction Model'' der Alexa Skills Configuration
*Das Event wird an den unter ''Configuration'' in der Alexa Skills Configuration hinterlegten Endpoint geschickt
:*Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine
:*Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein
*Das Event wird vom <code>lambda.js</code> code an alexa-fhem weitergeleitet
*alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück
*<code>lambda.js</code> nimmt diese Antwort entgegen und gibt sie an AVS zurück
*AVS sogt dafür das der Echo 'antwortet' und dass die Card in der Alexa App erscheint
 
===Anmerkungen===
*Ein Skill hat keinen Zugriff auf die Audiodaten
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und 'einfach' Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.
*Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.


=== Abgrenzung des '''Alexa Smart Home Skills''' und des '''Alexa Custom Skills''' ===
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der nur Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein "Alexa, schalte die Wohnzimmerlampe an" um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik "Smart Home" als Skill angezeigt.
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist ein individuell entwickelter Skill, so wie die meisten anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik "Smart Home" angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. "Alexa, starte [Name des Skills]") oder direkt angesprochen wird (z.B. "Alexa, frage [Name des Skills] wie ist der Status von [Device] "). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch können anspruchsvollere Steuerungsmöglichkeiten auf diese Weise verwirklicht werden.


==Installation==
==Installation==
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen. }}
Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.


Grundvoraussetzung für alle folgenden Schritte ist, dass ein Amazon-Account vorhanden ist. Es wird davon ausgegangen, dass bereits für alle folgenden Amazon-Dienste vorab das Konto jeweils eingerichtet wurde, die Einrichtung dieser ist nicht Bestandteil dieser Anleitungen.
===node.js installieren===
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:
<syntaxhighlight lang="bash" style="width:50%;">
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential libssl-dev</syntaxhighlight>


=== Voraussetzungen ===
Nun muss Node.js installiert werden. Versuchen Sie dies erst mit
Folgende grundlegende Voraussetzungen sollten erfüllt sein, bevor du mit der Einrichtung beginnst:
<syntaxhighlight lang="bash" style="width:50%;">
* Amazon Echo oder Amazon Dot
sudo apt-get install nodejs
* node.js (vermutlich ab Version 0.12, getestet mit 4.2.6. Kann in Debian z.B. mit <source lang="bash" style="width:50%;">apt-get install nodejs-legacy</source> installiert werden)
</syntaxhighlight>
* Weiterleitung von Port 3000 vom Router aus auf den Rechner, auf dem Alexa-Fhem läuft
Überprüfen Sie dann die Version mit
<syntaxhighlight lang="bash" style="width:50%;">
dpkg-query -W nodejs
</syntaxhighlight>
Sollte die Versionsnummer kleiner als 8.10 sein, müssen Sie einen Umweg gehen, dazu wird mit den folgenden Befehlen das Node Repository hinzugefügt und node.js (in der LTS Version) entsprechend installiert:
<syntaxhighlight lang="bash" style="width:50%;">
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
</syntaxhighlight>
 
===node.js updaten===
Um node.js aus einer vorherigen Installation zu updaten (Version 4 ist deprecated und in AWS Amazon nicht mehr unterstützt):
<syntaxhighlight lang="bash" style="width:50%;">
# Zuerst alexa-fhem stoppen, dann
sudo apt-get remove nodejs
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install npm@latest -g
 
#--> in Amazon Konsole NodeJs auf 8.1 umstellen (Funktion in AWS Konsole editieren, im Pulldown-Menü "Runtime" eine neuere Version auswählen, und speichern)
#--> Raspi Reboot (vielleicht nicht nötig)
</syntaxhighlight>


=== Alexa-Fhem installieren ===
=== Alexa-Fhem installieren ===
# Die tgz-Datei entpacken (Quelle: https://forum.fhem.de/index.php/topic,60244.0.html)
'''Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM.''' Also erst die Grundlagen lernen, und dann mit Alexa beginnen!
# Verzeichnis ''package'' in ''alexa-fhem'' umbenennen
 
# Durch <source lang="bash" style="width:50%;">cd alexa-fhem</source> in das Verzeichnis wechseln
Die aktuelle Version ist jeweils  {{Link2Forum|Topic=81324|Message=733986|LinkText=hier}} zu finden.
# Mit <source lang="bash" style="width:50%;">npm install</source> alle Abhängigkeiten installieren
Wer bisher noch keinen Alexa-FHEM Skill angelegt hat, bitte {{Link2Forum|Topic=81324|Message=733986|LinkText=diesen Forumsbeitrag}} beachten!
# SSL Zertifikat erzeugen durch Aufruf von <source lang="bash" style="width:50%;">./createKey.sh</source>. Hierbei beachten, dass ein Kennwort vergeben werden soll, das mindestens aus 4 Zeichen besteht.
 
# Die Datei ''config.json.sample'' nach ''~/.alexa/config.json'' kopieren und die Werte auf die eigene Umgebung hin anpassen. Der Filter funktioniert hierbei wie bei [http://www.fhemwiki.de/wiki/Homebridge_einrichten#Einstellungen_f.C3.BCr_homebridge homebridge-fhem]
====Erstinstallation====
# Durch Aufruf von <source lang="bash" style="width:50%;">bin/alexa</source> den Dienst starten
Hier wird die Erstinstallation von Alexa-Fhem beschrieben.
===== Linux =====
# Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise <code>/opt/fhem</code>) entpacken (''nicht'' unter Windows, das zerstört die Rechteeinstellungen).<syntaxhighlight lang="bash" style="width:50%;">tar -xvzf dateiname.tgz</syntaxhighlight>
# Das dabei entstandene Verzeichnis ''package'' in ''alexa-fhem'' umbenennen <syntaxhighlight lang="bash" style="width:50%;">mv package alexa-fhem</syntaxhighlight>
# Durch <syntaxhighlight lang="bash" style="width:50%;">cd alexa-fhem</syntaxhighlight> in das Verzeichnis wechseln
# Mit <syntaxhighlight lang="bash" style="width:50%;">npm install</syntaxhighlight> alle Abhängigkeiten installieren (kein sudo!).
{{Randnotiz|RNTyp=[g|Info]|RNText=createKey.sh erzeugt ein Zertifikat, das 365 Tage gültig ist. Dies muss deswegen jedes Jahr erneuert werden }}
# SSL Zertifikat erzeugen durch Aufruf von <syntaxhighlight lang="bash" style="width:50%;">./createKey.sh</syntaxhighlight> (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.
# Das Verzeichnis ''.alexa'' anlegen, ''und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.'' Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das ''nicht'' der User fhem, sondern der User ''pi''. Das Symbol ''~/'' verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.
# Die Datei ''config-sample.json'' nach ''.alexa/config.json'' kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol ''~/'' auf ''/root'' - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.
===== Windows =====
''Vor'' der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:
* Node.js (die aktuelle Version findet man unter https://nodejs.org/en/download/)
* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html oder https://www.heise.de/download/product/win32-openssl-47316/download)
Erst dann fängt man mit Alexa-Fhem an.
 
 
# Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. <code>С:\Program Files (x86)\fhem</code>) entpacken.
# Das dabei entstandene Verzeichnis ''package'' in ''alexa-fhem'' umbenennen
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. "Start" -> "Ausführen" (oder [Windows-Taste]+[R]) -> cmd -> Ok. Durch <syntaxhighlight lang="bash" style="width:50%;">cd "<FHEM-Hauptverzeichis>\alexa-fhem"</syntaxhighlight> in das Verzeichnis wechseln. <br />Dabei ist natürlich das <FHEM-Hauptverzeichis> durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es <code>cd "С:\Program Files (x86)\fhem\alexa-fhem"</code>
# Mit <syntaxhighlight lang="bash" style="width:50%;">npm install</syntaxhighlight> alle Abhängigkeiten installieren.<br /> Bei der Fehlermeldung wie "Der Befehl "npm" ist entweder falsch geschrieben oder konnte nicht gefunden werden." ist die Installation von Node.js zu überprüfen.
# SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript ''createKey.sh'' nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl <code>mv</code> ist durch <code>move /y</code> zu ersetzen:<syntaxhighlight lang="bash" style="width:50%;">openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365</syntaxhighlight><syntaxhighlight lang="bash" style="width:50%;">openssl rsa -in key.pem -out newkey.pem</syntaxhighlight><syntaxhighlight lang="bash" style="width:50%;">move /y newkey.pem key.pem</syntaxhighlight> Eventuelle Fehlermeldung "can't open config file: /usr/local/ssl/openssl.cnf" o.Ä. lässt sich durch Befehl <code>set OPENSSL_CONF=<OpenSSL-Verzeichnis>\bin\openssl.cfg</code> beheben, wobei <OpenSSL-Verzeichnis> durch den entsprechenden Installationspfad (typischerweise <code>c:\OpenSSL-Win32</code>) zu ersetzen ist.
# Das Verzeichnis ''.alexa'' anlegen, ''und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll.'' In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter <code>C:\Users\<Benutzername></code>, also z.B. für Benutzer "Administrator" - unter <code>C:\Users\Administrator</code>.<br />Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:<syntaxhighlight lang="bash" style="width:50%;">cd "C:\Users\<Benutzername>"</syntaxhighlight><syntaxhighlight lang="bash" style="width:50%;">
mkdir ".alexa"</syntaxhighlight>
# Die Datei ''config-sample.json'' nach ''C:\Users\<Benutzername>\.alexa\config.json'' kopieren.
# Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis (<code>"<FHEM-Hauptverzeichis>\alexa-fhem\bin</code>) kopiert werden.
 
====Update====
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben
===== Linux =====
# Das Verzeichnis ''alexa-fhem'' im Hauptverzeichnis von FHEM (typischerweise <code>/opt/fhem</code>) umbenennen in ''alexa-fhem.old''.
# Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise <code>/opt/fhem</code>) entpacken (''nicht'' unter Windows, das zerstört die Rechteeinstellungen).
# Das dabei entstandene Verzeichnis ''package'' in ''alexa-fhem'' umbenennen, in das Verzeichnis wechseln
# Mit <syntaxhighlight lang="bash" style="width:50%;">npm install</syntaxhighlight> alle Abhängigkeiten installieren (kein sudo!).
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis ''alexa-fhem.old'' ins neue Verzeichnis ''alexa-fhem'' kopieren.
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis ''alexa-fhem.old'' gelöscht werden.
===== Windows =====
# Das Verzeichnis ''alexa-fhem'' im Hauptverzeichnis von FHEM (z.B. <code>С:\Program Files (x86)\fhem</code>) umbenennen in ''alexa-fhem.old''.
# Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.
# Das dabei entstandene Verzeichnis ''package'' in ''alexa-fhem'' umbenennen
# Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. "Start" -> "Ausführen" (oder [Windows-Taste]+[R]) -> cmd -> Ok. Durch <syntaxhighlight lang="bash" style="width:50%;">cd "<FHEM-Hauptverzeichis>\alexa-fhem"</syntaxhighlight> in das Verzeichnis wechseln. <br />Dabei ist natürlich das <FHEM-Hauptverzeichis> durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es <code>cd "С:\Program Files (x86)\fhem\alexa-fhem"</code>
# Mit <syntaxhighlight lang="bash" style="width:50%;">npm install</syntaxhighlight> alle Abhängigkeiten installieren.
# Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis ''alexa-fhem.old'' ins neue Verzeichnis ''alexa-fhem'' kopieren.
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis ''alexa-fhem.old'' gelöscht werden.
 
==== Alexa-Fhem konfigurieren ====
Der Inhalt der Datei ''~/.alexa/config.json'' muss an die eigene Umgebung angepasst werden.
# ''nat-pmp'' -> wenn nat-pmp verwendet werden soll: die ip des eigenen routers, sonst die Zeile löschen!
# ''nat-upnp'' -> wenn nat-upnp verwendet werden soll: ''true'', sonst die Zeile löschen!
# ''applicationId''
#:* Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.
#:* Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]]
# ''oauthClientID'' -> ''Client ID'' dem Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1
# ''server'' -> IP-Adresse des eigenen FHEM-Servers
# ''port'' -> Portnummer des eigenen FHEM-Servers
 
 
Beispiel a) Offenes fhem - System ohne Absicherung:
{
    "alexa": {
        "name": "Alexa TEST",
        "keyFile": "./key.pem",
        "certFile": "./cert.pem",
        "applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "connections": [
        {
            "name": "FHEM",
            "server": "192.168.0.xxx.xxx",
            "port": "8083",
            "filter": "room=AlexaRoom"
        }
    ]
}
 
 
Beispiel b) Abgesichertes fhem - System mit TLS/SSL und HTTP Basic-Authentication:
{
    "alexa": {
        "name": "Alexa TEST",
        "keyFile": "./key.pem",
        "certFile": "./cert.pem",
        "applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "connections": [
        {
            "name": "FHEM",
            "server": "192.168.0.xxx.xxx",
            "auth": {"user": "fhemuser", "pass": "fhempassword"},
            "ssl": true,
            "port": "8083",
            "filter": "room=AlexaRoom"
        }
    ]
}
 
Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen
        "applicationId": [ "amzn1.ask.skill.1" , "amzn1.ask.skill.2" ],
        "oauthClientID": [ "amzn1.application-oa2-client.1" , "amzn1.application-oa2-client.1" ]
 
Danach durch Aufruf von <syntaxhighlight lang="bash" style="width:50%;">./bin/alexa</syntaxhighlight> den Dienst starten (kein sudo!)
 
 
Unter Windows startet man den Alexa-Dienst durch <syntaxhighlight lang="bash" style="width:50%;">node alexa</syntaxhighlight> aus der <code>alex-fhem/bin</code> (also erst z.B. durch <code>cd "<FHEM-Hauptverzeichis>\alexa-fhem\bin"</code> ins richtige Verzeichnis kommen)
 
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.
 
==== Alexa-Fhem aus FHEM heraus starten ====
Hierbei muss man zunächst herausfinden, welche der folgenden Startvarianten sein LINUX - OS zum Einsatz kommen:
initd.d oder systemd.
 
Auf keinen Fall darf man "sicherheitshalber" beide Varianten installieren, dies zu Fehler(-meldungen) führt.
 
===== Vorgehen bei Linux-Versionen mit init.d =====
Diese Variante kommt unter anderem auf dem Raspberry Pi mit dem OS-Varianten "Wheezy" zum Einsatz
 
Zunächst das Start-up-Skript aus diesem Post herunterladen {{Link2Forum|Topic=60244|Message=517271|LinkText=https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271}} und unter /etc/init.d/alexa speichern.
 
Das Script geht davon aus, das das alexa-fhem Skript unter /opt/fhem/alexa-fhem liegt, und die Logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.
 
Nun folgende Kommandos ausführen:
<syntaxhighlight lang="bash" style="width:50%;">sudo chmod 755 /etc/init.d/alexa
sudo update-rc.d alexa defaults</syntaxhighlight>
 
In der Datei <code>/etc/sudoers</code> den User fhem für die Nutzung von sudo zulassen (<code>sudo nano /etc/sudoers</code>), z.B. durch Anfügen der nachfolgenden Zeile:
<code>fhem ALL=(ALL) NOPASSWD: ALL</code>
 
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):
<syntaxhighlight lang="bash" style="width:75%;">define FHEM.Alexa.Status dummy
 
define FHEM.Alexa dummy
attr FHEM.Alexa event-on-change-reading state
attr FHEM.Alexa webCmd status:start:stop:restart
 
define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq "start")
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa start > /dev/null 2>&1 &")})
DOELSEIF ([FHEM.Alexa] eq "stop")
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa stop > /dev/null 2>&1 &")})
DOELSEIF ([FHEM.Alexa] eq "restart")
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa restart > /dev/null 2>&1 &")})
DOELSEIF ([FHEM.Alexa] eq "status")
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa status > /dev/null 2>&1 &")})</syntaxhighlight>
 
===== Vorgehen bei Linux-Versionen mit systemd =====
Diese Variante kommt unter anderem auf dem Raspberry Pi ab/seit der OS-Variante "Jessie" zum Einsatz
 
Bei systemd Systemen funktioniert das obengenannte vorgehen leider nicht, man kann das gleiche aber mit dem Modul
[https://forum.fhem.de/index.php/topic,79952.0.html 98_serviced.pm - systemd und initd Dienste steuern] umsetzen.
Wichtig ist das der User unter dem alexa ausgeführt wird ohne Passwort abfrage sudo ausführen darf, dazu muss er in der <code>/etc/sudoers</code> eingetragen werden, z.b. so <code>fhem ALL=(ALL) NOPASSWD: ALL</code>
 
Sollte es dann nicht funktionieren kann das an einem Gruppen eintrag unterhalb der User definition in der <code>/etc/sudoers</code>, in diesem Fall den user am ende der <code>/etc/sudoers</code> eintragen, dann sollte es funktionieren
 
==== Alexa-Fhem als Service (systemd) installieren ====
Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.
 
Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:
 
<code style="width:75%;" lang="bash">
sudo useradd -M --system alexa
</code>
 
Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe <code>dialout</code> hinzufügen (<code>sudo usermod -a -G dialout alexa</code>)
 
Datei "alexa.service" unter <code>/etc/systemd/system</code> anlegen:
 
[Unit]
Description=Node.js Alexa Server
After=syslog.target network-online.target
[Service]
Type=simple
User=alexa
WorkingDirectory=/opt/fhem/alexa-fhem
ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target


=== Alexa Smart Home Skill anlegen ===
Den Pfad <code>/home/alexa/.alexa</code> an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo.
 
Im WorkingDirectory wird der alexa Dienst die Zertifikate suchen.
 
Achtung: Natürlich muss der Benutzer auch Zugriff sowohl auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis und das WorkingDirectory haben.
 
Um den Service zu aktiveren und zu starten helfen folgende Befehle:
sudo systemctl daemon-reload
sudo systemctl enable alexa
sudo systemctl start alexa
 
Status abfragen mit
sudo systemctl status alexa
 
Sollte sich der Service nicht starten lassen und endet die Ausgabe ähnlich wie hier:
<code>Feb 02 09:47:25 inet alexa[2738]: STDIN EOF</code>
kann eine Anpassung der ExecStart Zeile aus der alexa.service Datei helfen:
ExecStart=/opt/fhem/alexa-fhem/bin/alexa --dockerDetached -U /home/alexa/.alexa
Log einsehen?
sudo journalctl -u alexa
 
(mit <code>-f</code> kann man den follow Modus aktivieren, wie <code>tail -f</code>).
Bei einen reboot startet alexa-fhem jetzt automatisch.
 
==== 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
<code>https://<IP-Adresse des Servers>:3000</code> kann man testen, ob der Alexa-Fhem Service läuft - der Seitenaufruf liefert eine Zeile JSON-Code, beginnend mit
<code>{"header":{"name":"UnsupportedOperationError"...</code>
 
=== 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:
<syntaxhighlight lang="bash" style="width:70%;">define MyAlexa alexa</syntaxhighlight>
 
<hr />
 
=== Alexa Skills ===
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein
# Anmeldung auswählen<br />[[Datei:Developer.amazon.com-01-login2.png|200px]]
# Anmeldung auswählen<br />[[Datei:Amazon Developer.jpg||200px]]
# Anmeldedaten eingeben<br />[[Datei:Developer.amazon.com-02-userpass2.png|200px]]
# Anmeldedaten eingeben<br />[[Datei:LogIn.jpg||200px]]
 
==== Security Profile anlegen ====
Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.
# Nach der Anmeldung Auswahl von ''APPS & SERVICES''<br />[[Datei:Apps1.jpg|200px]]
# Anschließend auswählen ''Security Profiles''<br />[[Datei:Security.jpg|200px]]
# Auswählen ''Create a New Security Profile'' aus<br />[[Datei:Newsecurity.jpg|200px]]
# Dann einen Namen und eine Beschreibung für das Profil eingeben und mit ''Save'' bestätigen<br />[[Datei:SecurityName.jpg|200px]]
# Anschließend den die Daten unter ''Gneral'' merken oder Kopieren <br />[[Datei:SecurityGenerl.jpg|200px]]
# Im Anschluß daran auf ''Web Settings'' klicken und dort auf ''Edit'' <br />[[Datei:WebSettings.jpg|200px]]
# Und nun die im Bild gezeigten Daten eintragen <br />[[Datei:WebSettingsDaten.jpg|200px]]
## https://layla.amazon.co.uk/api/skill/link/xxx
## https://pitangui.amazon.com/api/skill/link/xxx
## https://layla.amazon.com/api/skill/link/xxx
# Das xxx muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten SmartHome Skill anlegen bzw. Custom Skill anlegen jeweils unter Punkt 4 (Seite Configuration) bei Redirect Urls am Ende der URLs angezeigt wird
# Im anschluß daran oben auf ''Login with Amazon'' <br />[[Datei:LoginwithAlexa.jpg|200px]]
 
===== Login with Amazon =====
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo ''Client Id'' und ''Client Secret'' zu finden sind}}
# In der neu geladenen Seite im Dropdown Menü das vorher angelegte Profil unter ''Select a Security Profil'' auswählen und mit ''Confirm'' bestätigen<br />[[Datei:LoginwithAlexaSelect.jpg|200px]]
# Im folgenden Fenster die Adresse https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 eingeben und mit ''Save'' bestätigen. '''Todo Erklärungsbedarf: WARUM diese Adresse'''<br />[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]
# Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und ''Web Settings'' auswählen<br />[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]
 
==== Skills bearbeiten (Gilt für den SmartHome wie auch den Customer Skill)====
# Im Menü den Punkt ''ALEXA'' auswählen und anschließend im Dropdown Menü ''Alexa Skills Kit'' auswählen<br />[[Datei:AlexaSkill.jpg|200px]]
 
===== SmartHome Skill anlegen =====
# Rechts ''Create Skill'' auswählen<br />[[Datei:AlexaSkillCreate.jpg|200px]]
# Auf der folgenden Seite die folgenden Daten eingeben und dann mit ''Next'' bestätigen:
#:* ''Skill Name'' -> beliebiger Name, z.B. "MySmartHome Basic")
#:* ''Default Language'' -> ''German''
#:* ''Choose a model to add to your skill'' -> ''SmartHome '' anklicken
#:* ''Anschließend rechts oben auf ''Create Skill'' <br />[[Datei:AlexaSkillCreateSmart.jpg|200px]]''
# Nun auf die Seite https://signin.aws.amazon.com/ wechseln und dort einloggen <br />[[Datei:AWSAnmelden.jpg|200px]]
# Nach dem Login links oben auf ''Services'' klicken und anschließend auf ''Lambda'' <br /> [[Datei:AWSLambda.jpg|200px]]
# Auf der ''Lambda'' Seite "Funktion' auswählen links im Menü und dann rechts auf ''Funktion erstellen'' klicken <br /> [[Datei:LamdbaFunktion.jpg|200px]]
# Auf der Seite ''Funktion erstellen'' dann auf ''Ohne Vorgabe erstellen' klicken''
#:* Unter ''Name'' einen Beliebigen Namen eingeben
#:* Bei ''Laufzeit'' ''Nodejs 8.10'' auswählen
#:* Unter ''Rolle'' ''Erstellen einer benutzerdefinierten Rolle'' auswählen, im anschluß daran sollte sich automatisch ein neues Fenster öffnen, in diesem alles unverändert lassen und auf ''Allow'' klicken wodurch sich das Fenster wieder schließen sollte<br /> [[Datei:IAM.jpg|200px]]
#:*Jetzt noch rechts unten auf ''Funktion erstellen klicken''<br /> [[Datei:OhneVorgabe.jpg|200px]]
 
# Auf der jetzt geöffneten Seite rechts oben die ''arn'' Nummer aufschreiben/kopieren und links aus dem Menü ''Alexa Smart Home'' hinzufügen <br />[[Datei:Arn.jpg|200px]]
# Unten auf der Seite unter ''Auslöser konfigurieren'' muss die Skill ID eingetragen werden, diese findet man im developer account unter dem Skill. <br /> [[Datei:Auslöser.jpg|200px]]
# Anschließend noch rechts unten auf ''Hinzufügen'' klicken und danach rechts oben auf ''Speichern''
 
# Nun auf ''Test'' (Bezeichnung im Screenshot) klicken und unten auf der Seite unter ''Funktionscode'' den vorhanden Code löschen und den Code aus der ''Lambda.js'' welche sich in dem ''alexa-fhem-0.4.4'' Paket befindet einfügen <br /> [[Datei:Arn2.jpg|200px]]
<br /> [[Datei:Code.jpg|200px]]
# Im Code müsst ihr den ''Hostname'' anpassen, also eure DynDns z.b. einfügen, anschließen rechts oben wieder auf ''Speichern''
 
# Nun wieder zurück in den Alexa developer Account und hier folgende Daten eintragen
{{Randnotiz|RNTyp=r|RNText=Es funktioniert nur noch die v3 api (v2 ist deprecated). Die Version hierfür gibt es im {{Link2Forum|Topic=81324|LinkText=Forum}}. bitte die hinweise dort lesen und beachten.}}
#:* ''Payload Version'' -> ''v3(preferred)'' auswählen  <br />
#:* ''Default endpoint'' -> Hier die ''arn'' Nummer von oben eintragen/einfügen
#:* Dann den Haken setzen bei ''Europe, India'' und nochmals die ''arn'' eintragen und anschließend rechts oben auf ''Save''
# Links im Menü ''Account Linking'' auswählen und dort folgende Daten eintragen
#:* ''Authorization URI'' -> ''https://www.amazon.com/ap/oa''
#:* ''Access Token URI'' ->  ''https://api.amazon.com/auth/o2/token''
#:* ''Client ID'' -> ''Eure Client ID, fängt mit amzn......an'', zu finden unter ''https://developer.amazon.com'' -> '' Apps & Services'' -> ''Security Profiles'' -> Profil auswählen  -> ''Web Settings''
#.* ''Client Secret'' -> ''Euer Client Secret'', siehe ''Client ID''
#:* ''Scope'' -> ''Add Scope'' auswählen und ''profile:user_id''  (wörtlich 1:1 eintragen)  eintragen
#:* ''Redirect URLs'' -> Diese 3 Adressen merken/kopieren
# Alles andere auf dieser seite kann gleich bleiben, jetzt noch rechts oben wieder auf ''Save'' klicken <br /> [[Datei:Account.jpg|200px]]
 
# Anschließend wieder zurück zum ''Amazon developer Account'' https://developer.amazon.com , dort wieder das ''Security Profile'' aufrufen und die drei Links unter ''Allowed Return URLs'' (wo eingangs am Schluss 3 XXX gesetzt wurden) mit den Links von Oben ''Redirect URLs'' ersetzen
# Nun geht es weiter in der ''Amazon Alexa developer Konsole'' https://developer.amazon.com/alexa/console/ask wo oben auf ''Distribution'' geklickt werden muss.
# Hier sind alle angaben Freiwillig bzw. können Frei gewählt werden bis auf die ''Privacy Policy URL'' , diese muss eingetragen werden, anschließend links unten auf ''Save and continue''<br />[[Datei:German.jpg|200px]]


==== Apps & Services ====
# Auf der kommenden Seite ''Privacy & Compliance'' entsprechend anklicken und wieder unter auf ''Save and continue''
# Klicke nach der Anmeldung auf ''APPS & SERVICES''<br />[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]
# Unter ''Availability'' alles so lassen und wieder auf ''Save and continue''
# Klicke anschließend auf ''Security Profiles''<br />[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]
# Nun den Alexa Service auf dem Fhem Rechner neustarten, den Skill in der Alexa App aktivieren und nach geräten suchen lassen
# Wähle anschließend ''Create a New Security Profile'' aus<br />[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]
# Gebe dann ein Namen und eine Beschreibung für das Profil ein und bestätige die Eingaben durch anklicken von ''Save''<br />[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]


==== Login with Amazon ====
===== Custom Skill anlegen =====
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo ''Client Id'' und ''Client Secret'' zu finden ist}}
<ol>
# Nachdem du die vorherigen Schritte befolgt hast, siehst du im Browser das Profil dass du angelegt hast. Klicke jetzt oben rechts auf ''Login with Amazon''<br/>[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]
<li> Oben rechts ''Add a New Skill'' auswählen<br />[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]</li>
# Auf der neu geladenen Seite klickst du dann auf ''Sign up''<br/>[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]
<li> Auf der folgenden Seite (''Skill Information'') die nachstehenden Daten eingeben und dann mit ''Next'' bestätigen:
# Wähle anschließend im Dropdown Menü das vorher angelegte Profil aus und bestätige das anschließend mit ''Confirm''<br/>[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]
<ul>
# Im folgenden Fenster gibst du dann die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] ein und bestätigst die Eingabe mit ''Save''<br/>[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]
<li> ''Skill Type'' -> ''Custom Interaction Model'' </li>
# Klicke dann bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad und wähle ''Web Settings'' aus<br/>[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]
<li> ''Language'' -> ''German''</li>
# Im neu geladenen Fenster klickst du dann auf ''Edit''<br/>[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]
<li> ''Name'' -> beliebiger Name, z.B. "MySmartHome Advanced". Dieser wird in der Alexa App unter "Meine Skills" angezeigt.</li>
# Füge zuletzt dann bei ''Allowed Return URLs'' die Adresse [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx], [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx], und [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx] hinzu. xxx muss hierbei durch den Wert ersetzt werden, der bei Punkt 6 '''Skill Kit einrichten''' unter '''Redirect Urls''' am Ende der URLs angezeigt wird.<br/>[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]
<li> ''Invocation Name'' -> Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. "Alexa, starte James"<br />[[Datei:CustomSkill_2.PNG|400px]]</li>
</ul></li>
<li>Auf der Seite ''Interaction Model'' folgende Eingaben tätigen und mit ''Next'' abschließen
<ul>
<li>In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando <code>get MyAlexa interactionModel</code> aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.
<li>In die Box ''Intent Schema'' kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:<br /><blockquote>
{
  "intents" : [
    <hier ziemlich viele Zeilen> 
  ]
}
</blockquote></li>
<li>Nun die ''Custom Slot Types'' einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. <code>FHEM_article</code>) in das Feld ''TYPE'' eingetragen werden, das nach dem Anklicken von ''Add Slot Type'' erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit ''Save'' sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot
FHEM_article der | die | das | den
d.h., die Zeilenumbrüche bei den möglichen Werten werden als "|" dargestellt.</li>
<li>Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device <code>get MyAlexa customSlotTypes</code> ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)
<li>Anschließend erneut die FHEM-Ausgabe schließen und erneut  für das bereits definierte Alexa-Gerät das Kommando <code>get MyAlexa interactionModel</code> aufrufen.
<li>Unter ''Sample Utterances'' nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren<br />[[Datei:CustomSkill_5.PNG|400px]]</li>
</ul></li>
<li>Auf der Seite ''Configuration'' Folgendes eingeben und mit ''Next'' bestätigen:
<ul>
<li>''Service Endpoint Type'' -> ''AWS Lambda'' auswählen</li>
<li>''Geographical Region'' -> ''Europe'' auswählen und im Textfeld den Wert aus Abschnitt [[#AWS_Lambda_Funktion_anlegen | AWS Lambda Funktion anlegen]] (Punkt 12) eintragen. </li>
<li>''Do you allow users to create an account or link to an existing account with you?'' -> ''Yes''</li>
<li>''Authorization URL'' -> <code>https://www.amazon.com/ap/oa</code></li>
<li>''Client ID'' -> ''Client ID'' aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1</li>
<li>''Scope'' -> '''<code>profile:user_id</code>''' (wörtlich 1:1 eintragen)</li>
<li>''Redirect URLs'' - sollten vorbelegt sein</li>
<li>''Authorization Grant Type'' -> ''Auth Code Grant'' auswählen</li>
<li>''Access Token URI'' -> <code>https://api.amazon.com/auth/o2/token</code></li>
<li>''Client Secret'' -> ''Client Secret'' aus Abschnitt [[#Login_with_Amazon | Login with Amazon]], Punkt 1</li>
<li>''Client Authentication Scheme'' -> ''HTTP Basic''</li>
<li>''Privacy Policy URL'' -> <code>https://www.amazon.com/gp/help/customer/display.html?nodeId=468496</code></li>
</ul>
Beim Sichern dieser Seite mit ''Next'' kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die [[#AWS_Lambda-Funktion | AWS Lambda Funktion]] nachgetragen werden, dies wird in Abschnitt [[#Trigger_f.C3.BCr_Custom_Skill_hinzuf.C3.BCgen | Trigger für Custom Skill hinzufügen]] beschrieben.
<br />[[Datei:CustomSkill_6.PNG|400px]] [[Datei:CustomSkill_7.PNG|400px]]</li>


==== Skill Kit einrichten ====
==== Testen ====
# Wähle im Menü den Punkt ''Alexa'' aus<br />[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]
Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite ''All Skills'' den Button ''Edit'' des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links ''Test''.  
# Klicke dann ''Get started'' beim Punkt ''Alexa Skills Kit'' an<br />[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]
Die Testseite enthält
# Wähle dann auf der neu geladenen Seite oben rechts ''Add a New Skill'' aus<br />[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]
* ein Feld ''Voice Simulator'', mit dem man die Sprachsausgabe testen kann,  
# Auf der folgenden Seite wählst du ''Smart Home Skill API'' sowie ''German'' als Sprache aus und gibst ein Name für den Skill ein was du dann mit ''Next'' bestätigst.<br />[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]
* ein Feld ''Service Simulator'', mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen
# Die folgende Seite klickst du mit ''Next'' dann weiter<br />[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]
"Alexa, sage <Custom Skill Invocation Name>: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr"
# Auf der Seite Configuration gibst du dann unter ''Authorization URL'' die Adresse [https://www.amazon.com/ap/oa https://www.amazon.com/ap/oa] an, bei Scope ''profile:user_id'' und bei ''Access Token URI'' [https://api.amazon.com/auth/o2/token https://api.amazon.com/auth/o2/token] sowie bei ''Privacy Policy URL'' die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496]<br /><br />Folgende Felder müssen individuell ausgefüllt werden:<br />* ''Service Endpoint Type'' -> Europe auswählen und im Textfeld den Wert aus Punkt 12 '''AWS Lambda Funktion anlegen''' eintragen<br />* ''Client Id'' -> ''Client Id'' aus Punkt 1. '''Login with Amazon'''<br />* ''Client Secret'' -> ''Client Secret'' aus Punkt 1. '''Login with Amazon'''<br /><br /><br />[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]]
"Alexa, frage <Custom Skill Invocation Name> nach dem Status von Weckzeit"
# <br />[[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]


Dabei ist natürlich der ''Custom Skill Invocation Name'' durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.
==== Skill Id bestimmen ====
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die ''Alexa Skill Id'' zu finden ist}}
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die ''Alexa Skill Id'' zu finden ist}}
Zur späteren Verwendung unter Punkt 7 '''AWS Lambda Funktion anlegen''' wird noch die Application Id benötigt. An diese kommt man wie folgt:
Für das [[#AWS_Lamba_Funktion_anlegen | Anlegen einer ''AWS Lambda Funktion'']] bzw für die [[#Alexa-Fhem_konfigurieren | Konfiguration von Alexa-Fhem]] wird die ''Alexa Skill Id'' benötigt. An diese kommt man wie folgt:
# Wähle im Menü den Punkt ''Alexa'' aus<br />[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]
# Anmelden wie unter [[#Alexa_Skills | Alexa Skills]] beschrieben.
# Klicke dann ''Get started'' beim Punkt ''Alexa Skills Kit'' an<br />[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]
# Menüpunkt ''ALEXA'' auswählen, wie [[#Skills_bearbeiten | Skills bearbeiten]] erklärt.
# Beim vorher angelegten Eintrag auf ''Edit'' klicken<br />[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]
# Beim gewünschten Eintrag auf ''Edit'' klicken<br />[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]
# Die Id, die nun oben angezeigt wird, ist die gesuchte <br />[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]
# Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format <code>amzn1.ask.skill.[Zahlen und Bindestriche]</code><br />[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]


=== AWS Lambda Funktion anlegen ===
<hr />
 
=== AWS Lambda Funktion ===
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein
# Anmeldung auswählen<br />[[Datei:Aws.amazon.com-01-site.png|200px]]
# Anmeldung auswählen<br />[[Datei:Aws.amazon.com-01-site.png|200px]]
# Anmeldedaten eingeben<br />[[Datei:Aws.amazon.com-02-login.png|200px]]
# Anmeldedaten eingeben<br />[[Datei:Aws.amazon.com-02-login.png|200px]]
# Den Punkt ''Lambda'' links auf der Startseite auswählen<br />[[Datei:Aws.amazon.com-03-lambda.png|200px]]
# Den Punkt ''Lambda'' links auf der Startseite auswählen, bzw. im Menü ''Services'' unter ''Compute'' den Menüpunkt ''Lambda'' auswählen<br />[[Datei:Aws.amazon.com-03-lambda.png|200px]]
# Anschließend den Punkt ''Get Started Now'' auswählen<br />[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]
 
==== AWS Lambda Funktion anlegen ===={{Randnotiz|RNTyp=r|RNText=Die AWS Seiten sehen inzwischen etwas anders aus. Eine angepasste Beschreibung findet sich im  {{Link2Forum|Topic=81790|Message=739211|LinkText=Forum}}. Bitte auch die Hinweise dort lesen.}}
# Für eine erste Lambda-Funktion den Punkt ''Get Started Now'' auswählen<br />[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]
# Den Blueprint ''Blank function'' auswählen<br />[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]
# Den Blueprint ''Blank function'' auswählen<br />[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und ''Alexa Skills Kit'' auswählen und mit ''Next'' bestätigen<br />[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und ''Alexa Smart Home'' auswählen und mit ''Next'' bestätigen<br />[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]
# Bei ''Application Id'' den Wert eintragen, dessen Ermittlung unter '''Skill Kit einrichten''' in der zusätzlichen Beschreibung beschrieben wird, den Haken bei ''Enable trigger'' setzen und mit ''Next'' bestätigen <br />[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]
## Achtung, es ist möglich, dass dabei ''Alexa Smart Home'' überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, ''Ireland'' auszuwählen. Dann erscheint bei den Funktionen auch ''Alexa Smart Home''.
# Auf der Konfigurationsseite bei ''Name'' den Wert FHEM eingeben, bei ''Runtime'' Node.js 4.3. Bei ''Role'' den Wert ''Choose an existing role'' wählen und bei ''Existing role'' dann ''x'' wählen. Der Quellcode der Datei lambda.js aus dem Quellpaket wird dann an die Stelle des großen Textfeldes vollständig eingefügt. Dann noch den Hostname im Quellcode an den eigenen anpassen. Anschließend alles mit ''Next'' bestätigen.<br />[[Datei:Aws.amazon.com-07-configure_function.png|200px]]
# Bei ''Application Id'' den Wert eintragen, dessen Ermittlung im Abschnitt [[#Skill_Id_bestimmen | Skill Id bestimmen]] beschrieben wird, den Haken bei ''Enable trigger'' setzen und mit ''Next'' bestätigen <br />[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]
# Auf der Konfigurationsseite eingeben:
## ''Name'' -> ''FHEM''
## ''Runtime'' -> Node.js 6.10 (oder 8.10).
## ''Role'' -> ''Choose an existing role''  
### Achtung: wenn es noch keine existing role gibt, zuerst ''Create a custom role'' -> in dem Popup dann ''lambda_basic_execution'' auswählen und auf ''Allow'' klicken sowie bei ''Existing role'' dann ''x'' wählen.
# Auf der Code-Seite ist im großen Textfeld dann der Code aus der Datei ''lambda.js'' im Paket [[#Alexa-Fhem_installieren | Alexa-Fhem]] vollständig einzufügen. Dabei muss der vorhandene Code im Texteil komplett gelöscht, der Teil aus der ''lamda.js'' eingefügt und noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden.  
# Anschließend alles mit ''Next'' bestätigen.<br />[[Datei:Aws.amazon.com-07-configure_function.png|200px]]
# Auf der Übersichtsseite dann ''Create function'' anklicken<br />[[Datei:Aws.amazon.com-08-review.png|200px]]
# Auf der Übersichtsseite dann ''Create function'' anklicken<br />[[Datei:Aws.amazon.com-08-review.png|200px]]
# Klicke dann auf der Übersichtsseite oben links auf ''Function''<br />[[Datei:Aws.amazon.com-09-go_overview.png|200px]]
# Wähle dann die angelegte Funktion aus und klicke dann im Menü ''Action'' auf den Punkt ''Show ARN''<br />[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]
# Es wird nun eine ARN Adresse angezeigt, die für den Punkt 6 bei '''Skill Kit einrichten''' benötigt wird<br />[[Datei:Aws.amazon.com-10-2-arn.png|200px]]


=== Alexa Skill einrichten ===
==== Trigger für Custom Skill hinzufügen ====
# Auf http://alexa.amazon.de anmelden
Editiert man eine Lambda-Funktion, werden auf der Seite ''Triggers'' diejenigen Dienste angezeigt, die diese Funktion aufrufen.
* Hier taucht der Trigger ''Alexa Smart Home'' zusammen mit der ''Application Id'' auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.
* Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von ''Add Trigger'' wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und ''Alexa Skills Kit' auswählen und mit ''Next'' bestätigen''
 
==== ARN der AWS Lambda Funktion bestimmen ====
# Auf der Übersichtsseite oben links den Menüpunkt ''Functions'' aúswählen<br />[[Datei:Aws.amazon.com-09-go_overview.png|200px]]
# Anschließend den Radiobutton der angelegten Funktion ''FHEM'' markieren und im Menü ''Action'' den Punkt ''Show ARN'' auswählen<br />[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]
# Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt [[#SmartHome_Skill_anlegen| SmartHome Skill anlegen]] benötigt wird<br />[[Datei:Aws.amazon.com-10-2-arn.png|200px]]
 
=== Absichern des Zugriffs ===
Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter "Portfreigaben").
 
==== Absicherung direkt in Alexa-FHEM ====
Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:
* Die Verbindung erfolgt per HTTPS
* Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird.
* Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.   
* Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.
* Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.
 
Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.
 
==== Absicherung per ReverseProxy ====
<s>Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt:</s> Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.
 
'''Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit.''' Im Folgenden gehen wir davon aus, dass
* Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind
* Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz ''tausende'' von Anleitungen dafür...)
* Ein Servername von einem DynDNS-Anbieter - sagen wir ''myhome.is-my-castle.com'' - bereits von ''außen'' auf unser SmartHome zeigt.
* Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf <code>https://myhome.is-my-castle.com:3000</code> ergibt, wie im Punkt [[#Alexa-Fhem_testen|Alexa-Fhem testen]] beschrieben, eine Antwort des Node.js Servers.
 
Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit <code>a2enmod</code> aktiviert werden, hierzu sei auf [https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension diese Anleitung] verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm
htpasswd <passwdfile> <username>
 
ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile ''/etc/apache2/htpasswd'' ist, der gesetzte Username ''alexa'' lautet und das Passwort ''my_smarthome'' ist.
 
Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname ''/alexa''. '''Achtung:''' Dieser Code soll '''nicht''' in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. "fhem"), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.
 
<VirtualHost *:443>
  ServerName myhome.is-my-castle.com
  SSLEngine on
  SSLProxyEngine on
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  SSLCertificateKeyFile /etc/apache2/mycert/server.key
  SSLCertificateFile /etc/apache2/mycert/server.crt
<Location /alexa>
  AuthType Basic
  AuthName "Authentication Required"
  AuthUserFile "/etc/apache2/htpasswd"
  Require valid-user
  ProxyPass https://<hier IP-Adresse des Alexa-Fhem-Rechners>:3000/
  ProxyPassReverse https://<hier IP-Adresse des Alexa-Fhem-Rechners>:3000/
  Order deny,allow
  Allow from All
</Location>
(... Hier eventuell weitere Umleitungen)
</VirtualHost>
 
Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von <code>https://myhome.is-my-castle.com/alexa</code> und verlangt unmittelbar die Eingabe von Username und Passwort.
 
Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern
'''const PORT=443;'''
const HOST='myhome.is-my-castle.com';
'''const PATH='/alexa';'''
'''const AUTH='alexa:my_smarthome';'''
// entry
exports.handler = function(event, context, callback) {
  console.log(`EVENT: ${event}`);
  console.log(`CONTEXT: ${context}`); 
  var post_data = JSON.stringify(event);
  var options = {
    hostname: HOST,
    port: PORT,
    //family: 6,
    '''path: PATH,'''
    method: 'POST',
    '''auth: AUTH,'''
    rejectUnauthorized: false, // accept self-signed
(etc., Rest des Codes wie gehabt)
 
Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.
 
== 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 [http://alexa.amazon.de alexa.amazon.de] anmelden, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.
 
=== Alexa Skill ===
# Auf ''Skills'' klicken<br />[[Datei:Alexa.amazon.de-01-startseite.png|200px]]
# Auf ''Skills'' klicken<br />[[Datei:Alexa.amazon.de-01-startseite.png|200px]]
# Oben rechts ''Meine Skills''  auswählen<br />[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]
# Oben rechts ''Meine Skills''  bzw. ''Ihre Skills'' auswählen<br />[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken<br />[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken<br />[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]
# Oben Rechts in den Details des Skills auf ''Skill aktivieren'' klicken<br />[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]
# Oben Rechts in den Details des Skills auf ''Skill aktivieren'' klicken<br />[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]
# In dem neu geöffneten Fenster die Authorisierung bestätigen<br />[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]
# In dem neu geöffneten Fenster die Autorisierung bestätigen<br />[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein <br />[[Datei:Alexa.amazon.de-06-success.png|200px]]
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein <br />[[Datei:Alexa.amazon.de-06-success.png|200px]]


=== Geräteeinrichtung ===
=== Geräte ===
# Auf http://alexa.amazon.de anmelden
# Auf http://alexa.amazon.de anmelden
# Auf ''Smart Home'' klicken<br />[[Datei:Alexa.amazon.de-01-startseite.png|200px]]
# Auf ''Smart Home'' klicken<br />[[Datei:Alexa.amazon.de-01-startseite.png|200px]]
Zeile 97: Zeile 583:


Tip: Es macht Sinn, unter ''Meine Gruppen'' Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. "Licht") haben.
Tip: Es macht Sinn, unter ''Meine Gruppen'' Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. "Licht") haben.
== Einrichtung unter FHEM ==
Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.
Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute ''alexaMapping'' und ''homebridgeMapping'' Sprachbefehle ("Intents") in gerätespezifische Kommandos.
* Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut ''alexaMapping'' keine Bedeutung, sondern nur der ''genericDeviceType'' des zu steuernden Gerätes.
* Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:
** Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik
** Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von "=" und einer kommaseparierten Liste von Parametern.
  attr <device> homebridgeMapping <Characteristic1>=<param1.1>,<param1.2>,... <Characteristic2>=<param2.1>,<param2.2>,...
** Jeder Parameter besteht entweder aus
*** <code><cmd>:<device>:<reading></code>, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.
*** <code><name>=<value></code>, hier kann <code><value></code> entweder ein Wert oder semikolonseparierte Liste sein.
*** Oder dem schlüsselwort <code>clear</code>, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. <code>clear</code> kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen
Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html
=== Einfacher Schalter ===
* Ein einfacher Schalter, der die set-Kommandos ''on'' und ''off'' kennt, kann direkt mit Alexa-Fhem gekoppelt werden
* Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen.
Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen
define Alexa.Party dummy
'''attr Alexa.Party alexaName party'''
'''attr Alexa.Party alexaRoom alexaroom'''
'''attr Alexa.Party genericDeviceType switch'''
attr Alexa.Party group AlexaGeräte
attr Alexa.Party room AlexaRoom
attr Alexa.Party setList on off
Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen.
Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.
Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name ''party'' bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt [[##Custom_Skill_anlegen | Custom Skill Anlegen]]).
=== Wecker ===
Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also '''nicht''' im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:
define Alexa.Weckzeit dummy
'''attr Alexa.Weckzeit alexaName weckzeit'''
'''attr Alexa.Weckzeit alexaRoom alexaroom'''
attr Alexa.Weckzeit genericDeviceType clock
attr Alexa.Weckzeit group AlexaGeräte
'''attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+'''
attr Alexa.Weckzeit room AlexaRoom
'''attr Alexa.Weckzeit setList Weckzeit:time'''
Das Attribut ''genericDeviceTye'' ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut ''homebridgeMapping''
Für das Gerät ''MyAlexa'', das in Abschnitt definiert wurde, muss im Attribut ''alexaMapping'' auftauchen
Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr
Darüber hinaus muss der Alexa-Name ''weckzeit'' bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]]).
Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen
<pre style="width:50%;">
"Alexa, sage <Custom Skill Invocation Name>: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig"
"Alexa, frage <Custom Skill Invocation Name> nach dem Status von Weckzeit"
</pre>
Dabei ist natürlich der ''Custom Skill Invocation Name'' durch den Wert zu ersetzen, den man im Abschnitt [[#Custom_Skill_anlegen | Custom Skill Anlegen]] unter Punkt 2 eingetragen hat.
Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins "echte" FHEM weiterleiten.
 
define Alexa.Weckzeit.N DOIF (["Alexa.Weckzeit:.*"])({AlexaHelper("Alexa.Weckzeit","$EVENT")})
Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine ''changeWakeTime'' weiter (dokumentiert in den [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks]).
sub AlexaHelper($$){
  my ($name,$event)=@_;
  if( $name eq "Alexa.Weckzeit" ){
    my ($nc,$nt);
    #-- volle Stunde----------------------------------------
    if( $event =~ /(\d+):00/ ){
      $nc=sprintf("%d Uhr",$1);
      $nt=sprintf("%02d:00:00",$1);
    #-- nicht volle Stunde---------------------------------
    }elsif( $event =~ /(\d+):(\d+)/ ){
      $nc=sprintf("%d Uhr %d",$1,$2);
      $nt=sprintf("%02d:%02d:00",$1,$2);
    }
    changeWakeTime(\'GalaxyTab.EG\',\'$nc\',\'$nt\');
  }
}
<hr />
=== Lichtszene ===
Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.
* Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann
<pre>
"Alexa, schalte (die) Beleuchtung an" -> LightScene Alle_An wird ausgewählt
"Alexa, schalte (die) Beleuchtungsitzgruppe an" -> LightScene Sitzgruppe wird ausgewählt
...
"Alexa, schalte (die) Beleuchtung aus" -> LightScene Alle_Aus wird ausgewählt
</pre>
* Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten
<pre>
"Alexa, sage <Custom Skill Invocation Name>: schalte (die) Beleuchtung an" -> LightScene Alle_An wird ausgewählt
</pre>
Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.
Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:
define Alexa.Beleuchtung dummy
attr Beleuchtung setList on off
'''attr Alexa.Beleuchtung alexaName beleuchtung'''
'''attr Alexa.Beleuchtung alexaRoom alexaroom'''
'''attr Alexa.Beleuchtung genericDeviceType switch'''
Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:
define Alexa.Beleuchtung.Sitzgruppe dummy
attr Beleuchtung setList on off
'''attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe'''
'''attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom'''
'''attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch'''
Die eigentliche Steuerung übernimmt dann ein DOIF
define Alexa.Beleuchtung.N DOIF
(["Alexa.Beleuchtung.Sitzgruppe:on"])
(set <devicename der Lichtszene> scene Sitzgruppe,
  set Alexa.Beleuchtung off,
  ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
)
DOELSIF
... <weitere on-Events der anderen Szenen werden abgefangen>
DOELSEIF
(["Alexa.Beleuchtung:on"])
(set <devicename der Lichtszene> scene Alle_An,
  set Alexa.Beleuchtung.Sitzgruppe off,
  ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
)
DOELSEIF
(["Alexa.Beleuchtung:off"])
(set <devicename der Lichtszene> scene Alle_Aus,
  set Alexa.Beleuchtung.Sitzgruppe off,
  ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
)
Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden.
Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.
Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:
* Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum  [[Harmony#Button_f.C3.BCr_eine_bestimmte_Activity_im_Frontend_und_Homekit_.C3.BCber_readingsProxy|diesem Beispiel für harmony aktivitäten]] verwenden.
* Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:
define <dummy> dummy
attr <dummy> setList on off
attr <dummy> genericDeviceType switch
attr <dummy> homebridgeMapping On=<light scene>::state,valueOn=<szene>,cmdOn=scene+<szene>,cmdOff=scene+<szene aus>
Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.
=== Harmony Hub ===
Ein [https://forum.fhem.de/index.php/topic,60244.msg550298.html#msg550298 HowTo-Beitrag im Forum] beschreibt die Ansteuerung von Harmony-Aktionen über den Custom Skill, beispielsweise für eine Aktion ''ARD'': „Alexa, sage FHEM stelle Anlage auf ARD“.


== Nutzung ==
== Nutzung ==
=== Sprachkommandos ===
Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:
Nach erfolgreicher Einrichtung sollte Alexa mit den Befehlen
* das alexaName Attribut
* das alias Attribut
* das NAME Internal
Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.
 
=== SmartHome Skill ===
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.
 
Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:
<pre style="width:50%;">
“alexa, schalte <gerät/gruppe> ein”
“alexa, schalte <gerät/gruppe> aus”
“alexa, stelle <gerät/gruppe> auf <wert> prozent”
“alexa, stelle <gerät/gruppe> auf <anzahl> grad”
“alexa, erhöhe <gerät/gruppe> um <anzahl> prozent”
“alexa, reduziere <gerät/gruppe> um <anzahl> prozent”
“alexa, erhöhe <gerät/gruppe> um <anzahl> grad”
“alexa, reduziere <gerät/gruppe> um <anzahl> grad”
</pre>
 
=== Custom Skill ===
Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos. Die Dokumentation ist aktuell noch über diverse Artikel im Wiki verstreut:
 
*Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=hier}} beschrieben.
*Die erste Umsetzung ist {{Link2Forum|Topic=60244|Message=540117|LinkText=hier}} beschrieben.
*Mehr zu FHEM-Intents und deren Möglichkeiten gibt es {{Link2Forum|Topic=67490|Message=589378|LinkText=hier}}.
*Wie man die Alexa TTS-Engine bei den Antworten auf FHEM-Intents beeinflussen kann {{Link2Forum|Topic=77421|Message=693631|LinkText=hier}}.
 
 
 
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions), alles hier sammeln.
 
== Troubleshooting ==
 
====Allgemeiner Hinweis====
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter '''AWS Lambda Funktion anlegen''' Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein ''http://'' davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:
<pre style="width:50%;">
<pre style="width:50%;">
“alexa, schalte <gerät> ein”
const PORT=3000;
“alexa, schalte <gerät> aus”
const HOST='mein.host.name';
“alexa, stelle <gerät> auf <wert> prozent”
“alexa, stelle <gerät/raum> auf <anzahl> grad”
</pre>
</pre>
nutzbar sein


=== Optimierung ===
====Freigabe von Port 3000====
Normalerweise wird von Alexa-Fhem der Wert im Feld ''NAME'' verwendet, mit dem ein Gerät angesprochen werden kann via Alexa. Ist ein anderer "Rufname" gewünscht, kann das Feld ''Alias'' gesetzt werden. Der hier gesetzte Wert wird dann als alternativer Name verwendet.
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von <b>UnityMedia</b> z.B. funktionieren derzeit leider nicht. Eine möglicher "Workaround" wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}
 
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.
 
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde.
 
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter ''Internet -> Freigaben -> Portfreigaben'' statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.
 
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: ''https://mein.hostname:3000''. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.
 
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.
 
====Probleme mit node.js - npm install====
 
Falls eine Fehlermeldung auftritt, dass "npm" nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [[Homebridge_einrichten#NodeJS_installieren|NodeJS installieren]] sowie [[Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren|Python, g++, MDNS installieren]], siehe auch folgenden Abschnitt.
 
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====
Wenn man auf der Konsole angemeldet ist, den Befehl<syntaxhighlight lang="bash" style="width:50%;">node -v</syntaxhighlight>eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter [[Homebridge_einrichten#NodeJS_installieren]] nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter [[Alexa-Fhem#Voraussetzungen]] erfüllt sind! Keine Experimente mit Versionen die darunter liegen.
 
====Fehlermeldung ''NAT-PMP failed: Error: timeout'' Fehler angezeigt beim Start von alexa-fhem====
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: ''NAT-PMP failed: Error: timeout'', lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.
 
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder.
 
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der <code>~/.alexa/config.json</code> die folgenden Zeilen rauslöschen:
 
<pre>
        "nat-pmp": "10.0.1.1",
        "nat-upnp": true,
</pre>
 
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.
 
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut ''genericDeviceType switch'' hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut ''alias'' einen besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.
 
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen
* wenn bei lambda.js nichts ankommt: den trigger prüfen
 
 
Zunächst sollte man sich unter ''http://aws.amazon.com'' das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf ''Triggers'' klicken und mit ''Add trigger'' erneut einen anlegen. Hier muss, wie in der Anleitung unter '''AWS Lambda Funktion anlegen''' Punkt 7, die ''Application Id'' stehen und der Haken bei ''Enable trigger'' gesetzt sein. Dann alexa-fhem neu starten.
Wenn ihr Änderungen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt. Fürs Debugging empfiehlt es sich, alexa-fhem in einer Konsole laufen zu lassen, um eingehende Anfragen mitverfolgen zu können.
 
 
Es kann sein, dass immer noch keine Log im Cloudwatch ([http://docs.aws.amazon.com/de_de/lambda/latest/dg/monitoring-functions-logs.html]) zu sehen ist. In dem Fall hilft es, eine neue Role Policy anzulegen.
* in der AWS Console [https://console.aws.amazon.com] oben links auf Services klicken, und in der Gruppe "Security, Identity & Compliance" auf IAM klicken
* links auf Roles klicken
* Auf dem Knopf "Create Role" klicken
* AWS Services > Lambda auswählen, unten auf Next:Permissions klicken
* im Filter / Policy Type,  "log" eintragen (ohne quotes)
* CloudWatchLogsFullAccess hacken, auf Next:Review unten klicken
* Name vergeben und mit "Create role" bestätigen
* Oben links auf Services klicken, und in der Gruppe "Compute", auf Lambda klicken
* auf den Name der Funktion klicken
* Reiter Configuration auswählen
* in Existing Role, den neukreierten Role auswählen
* oben auf Save (und Testen wenn gewünscht) klicken.
Schon sollte eine neue Gruppe im Cloudwatch sichtbar sein. Die Suche von den Devices in Alexa wiederholen, und die Logs analysieren
 
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====
{{Randnotiz|RNTyp=[g|Info]|RNText=Der User in der User= Directive von alexa.service muss Ausführungsrecht auf dem alexa binary haben (x), so wie auch mind. Lesezugriff auf dem Verzeichnis nach -U Option in der ExecStart= Directive und auch auf dem WorkingDirectory }}
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei ''alexa'' muss ausführbar sein. Also z.B. so:
<syntaxhighlight lang="bash" style="width:70%;">2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa</syntaxhighlight>
Sollte dies nicht der Fall sein bitte mit:
<syntaxhighlight lang="bash" style="width:70%;">chmod +x alexa</syntaxhighlight>
die Datei ausführbar machen. Sofern der User "pi" Eigentümer ist, ist kein sudo erforderlich.
 
Eine lauffähige Konfiguration ist {{Link2Forum|Topic=71612|Message=668383|LinkText=hier}} zu sehen.
 
Ein Fehler in der Rechtekonfiguration führt in der Regel zu folgendem Ergebnis nach <code>sudo systemctl status alexa</code>:
 
<syntaxhighlight lang="bash">  Loaded: loaded (/etc/systemd/system/alexa.service; enabled)
  Active: activating (auto-restart) (Result: exit-code) since mer. 2017-09-06 02:33:23 CEST; 3s ago
  Process: 18332 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa (code=exited, status=217/USER)
Main PID: 18332 (code=exited, status=217/USER)</syntaxhighlight>
 
====Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?====
 
Hierzu muss die Datei <code>~/.alexa/config.json</code> geöffnet werden und der Abschnitt "connections" um folgende Zeile ergänzt werden:<pre>
        "auth": {"user": "fhem", "pass": "fhempassword"},</pre>
Bei Verwendung von SSL bei FHEM muss auch noch <pre>
        "ssl": true,</pre> hinzugefügt werden
 
==Weitergehende Informationen==
*[[Alexa_und_Mappings]]
*[[Alexa_Tipps_und_Kniffe]]
[[Kategorie:HOWTOS]]
[[Kategorie:Sprachsteuerung]]

Aktuelle Version vom 14. Februar 2021, 12:04 Uhr

Info blue.png
ACHTUNG: Diese Seite beschreibt nicht mehr exakt die jeweils nötigen Amazon Seiten. Es ist etwas Interpretation und Verständnis nötig. Für alle, die neu einsteigen und sich mit dem FHEM Vereinsserver als Proxy anfreunden können, empfiehlt es sich, über die Beschreibung FHEM Connector für Amazon Alexa einzusteigen.


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

alexa-fhem ist eine in JavaScript geschriebene und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von justme1968 im Forum veröffentlicht. Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.

Einführung

Glossar

X mark.svgFür die Nutzung der Amazon AWS-Dienste müssen zwingend die Daten einer Kreditkarte angegeben werden. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen. Die Autoren dieser Anleitung und der darin beschriebenen Module übernehmen keine Haftung für eventuelle Kosten, die aus der Nutzung der AWS entstehen.
  • Echo bzw. Echo Dot (im Folgenden maskulin bezeichnet) sind die derzeit verfügbaren Geräte des Alexa-Systems BILDER EINSTELLEN - Achtung Urheberrecht
  • AVS ist der Amazon Voice Service, d.h. die Spracherkennungskomponente des Systems.
  • AWS sind die Amazon Web Services, also per URL erreichbare Dienste zur Ausführung von Berechnungen etc. Im Rahmen von Alexa-Fhem wird bei AWS eine eigene JavaScript-Funktion hinterlegt, die zur Kommunikation mit dem FHEM-Server dient. Im Jargon von Amazon ist dies eine so genannte Lambda-Funktion WARUM ? Nachlesen bei Amazon.
  • Card bezeichnet einen Eintrag in der Alexa-App, der die erkannte Sprachnachricht, sowie weitergehende Informationen über die Reaktion von Alexa enthält und Rückmeldung an Amazon erlaubt.
  • Skill (engl. für Fertigkeit, Können) ist die Bezeichnung für eine per Spracherkennung zu bedienende Funktionalität des Alexa-Systems, z.B. zur Nachrichtenansage, Wettervorhersage oder zur Steuerung von FHEM

Arbeitsweise und Datenfluss

Grafische Darstellung der beteiligten Komponenten

Echo → AVS → AWS Lambda → alexa-fhem → AWS Lambda → AVS → Echo

  • Der Echo (oder ein anderes Alexa/AVS fähiges Gerät) nimmt Audiodaten auf und schickt diese an AVS (Amazon Voice Service) zur Erkennung
  • AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den erkannten Daten
  • Beim Alexa SmartHome Skill sind die möglichen Sätze für die Spracherkennung relativ fest vorgegeben
  • Beim Alexa Custom Skill kommen die dazu nötigen Informationen aus dem Interaction Model der Alexa Skills Configuration
  • Das Event wird an den unter Configuration in der Alexa Skills Configuration hinterlegten Endpoint geschickt
  • Beim Alexa SmartHome Skill ist das zwingend eine AWS Lambda Routine
  • Beim Alexa Custom Skill kann das im Prinzip auch ein eigener Web Service sein
  • Das Event wird vom lambda.js code an alexa-fhem weitergeleitet
  • alexa-fhem steuert FHEM und sendet ein Antwort-Event zurück
  • lambda.js nimmt diese Antwort entgegen und gibt sie an AVS zurück
  • AVS sogt dafür das der Echo 'antwortet' und dass die Card in der Alexa App erscheint

Anmerkungen

  • Ein Skill hat keinen Zugriff auf die Audiodaten
  • Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und 'einfach' Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.
  • Wenn man berücksichtigt welchen Weg die Daten insgesamt gehen, ist es erstaunlich, wie schnell die Reaktion auf einen gesprochenen Satz erfolgt.

Abgrenzung des Alexa Smart Home Skills und des Alexa Custom Skills

Der Alexa Smart Home Skill ist ein Amazon-Alexa-Standard-Skill, der nur Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein "Alexa, schalte die Wohnzimmerlampe an" um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik "Smart Home" als Skill angezeigt.

Der Alexa Custom Skill ist ein individuell entwickelter Skill, so wie die meisten anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik "Smart Home" angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. "Alexa, starte [Name des Skills]") oder direkt angesprochen wird (z.B. "Alexa, frage [Name des Skills] wie ist der Status von [Device] "). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch können anspruchsvollere Steuerungsmöglichkeiten auf diese Weise verwirklicht werden.

Installation

Info green.pngDa die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Während der Konfiguration sollten alle nachfolgenden Abschnitte parallel in gleichzeitig geöffneten Browserfenstern durchgeführt werden, die jeweils bis zum Abschluss geöffnet bleiben müssen.

Grundvoraussetzung für alle folgenden Schritte ist das Vorhandensein eines Amazon-Accounts. Es wird davon ausgegangen, dass die Konten für alle im Folgenden genutzten Amazon-Dienste eingerichtet wurden.

node.js installieren

Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential libssl-dev

Nun muss Node.js installiert werden. Versuchen Sie dies erst mit

sudo apt-get install nodejs

Überprüfen Sie dann die Version mit

dpkg-query -W nodejs

Sollte die Versionsnummer kleiner als 8.10 sein, müssen Sie einen Umweg gehen, dazu wird mit den folgenden Befehlen das Node Repository hinzugefügt und node.js (in der LTS Version) entsprechend installiert:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

node.js updaten

Um node.js aus einer vorherigen Installation zu updaten (Version 4 ist deprecated und in AWS Amazon nicht mehr unterstützt):

# Zuerst alexa-fhem stoppen, dann
sudo apt-get remove nodejs
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install npm@latest -g

#--> in Amazon Konsole NodeJs auf 8.1 umstellen (Funktion in AWS Konsole editieren, im Pulldown-Menü "Runtime" eine neuere Version auswählen, und speichern)
#--> Raspi Reboot (vielleicht nicht nötig)

Alexa-Fhem installieren

Aus gegebenem Anlass: Dies ist weder eine Einführung in Linux, noch eine Anfängerdokumentation für FHEM. Also erst die Grundlagen lernen, und dann mit Alexa beginnen!

Die aktuelle Version ist jeweils hier zu finden. Wer bisher noch keinen Alexa-FHEM Skill angelegt hat, bitte diesen Forumsbeitrag beachten!

Erstinstallation

Hier wird die Erstinstallation von Alexa-Fhem beschrieben.

Linux
  1. Die tgz-Datei unter Linux im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) entpacken (nicht unter Windows, das zerstört die Rechteeinstellungen).
    tar -xvzf dateiname.tgz
    
  2. Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen
    mv package alexa-fhem
    
  3. Durch
    cd alexa-fhem
    
    in das Verzeichnis wechseln
  4. Mit
    npm install
    
    alle Abhängigkeiten installieren (kein sudo!).
Info green.pngcreateKey.sh erzeugt ein Zertifikat, das 365 Tage gültig ist. Dies muss deswegen jedes Jahr erneuert werden
  1. SSL Zertifikat erzeugen durch Aufruf von
    ./createKey.sh
    
    (kein sudo!). Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken.
  2. Das Verzeichnis .alexa anlegen, und zwar im Home-Verzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll. Insbesondere ist zu beachten, dass dieser Nutzer u.U. im Startskript explizit gesetzt wird. Mit dem untenstehenden Skript ist das nicht der User fhem, sondern der User pi. Das Symbol ~/ verweist auf das Home-Verzeichnis des Benutzers, der gerade die Installation vornimmt.
  3. Die Datei config-sample.json nach .alexa/config.json kopieren. Achtung: Installiert man alexa-fhem als root-user, zeigt das Symbol ~/ auf /root - und die Konfigurationsdatei wird ggf. bei einem manuellen Start von Alexa-Fhem nicht gefunden.
  4. Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis kopiert werden.
Windows

Vor der Installation von Alexa-Fhem muss man folgende Anwendungen installieren:

Erst dann fängt man mit Alexa-Fhem an.


  1. Die tgz-Datei im Hauptverzeichnis von FHEM (z.B. С:\Program Files (x86)\fhem) entpacken.
  2. Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen
  3. Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. "Start" -> "Ausführen" (oder [Windows-Taste]+[R]) -> cmd -> Ok. Durch
    cd "<FHEM-Hauptverzeichis>\alexa-fhem"
    
    in das Verzeichnis wechseln.
    Dabei ist natürlich das <FHEM-Hauptverzeichis> durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es cd "С:\Program Files (x86)\fhem\alexa-fhem"
  4. Mit
    npm install
    
    alle Abhängigkeiten installieren.
    Bei der Fehlermeldung wie "Der Befehl "npm" ist entweder falsch geschrieben oder konnte nicht gefunden werden." ist die Installation von Node.js zu überprüfen.
  5. SSL Zertifikat erzeugen. Dafür muss man alle Befehle aus dem Skript createKey.sh nacheinander manuell ausführen. Hierbei beachten, dass ein Kennwort vergeben werden muss, das mindestens aus 4 Zeichen besteht, dieses Kennwort bitte merken. Der Windows-Welt unbekannter Befehl mv ist durch move /y zu ersetzen:
    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
    
    openssl rsa -in key.pem -out newkey.pem
    
    move /y newkey.pem key.pem
    
    Eventuelle Fehlermeldung "can't open config file: /usr/local/ssl/openssl.cnf" o.Ä. lässt sich durch Befehl set OPENSSL_CONF=<OpenSSL-Verzeichnis>\bin\openssl.cfg beheben, wobei <OpenSSL-Verzeichnis> durch den entsprechenden Installationspfad (typischerweise c:\OpenSSL-Win32) zu ersetzen ist.
  6. Das Verzeichnis .alexa anlegen, und zwar im Benutzerverzeichnis desjenigen Benutzers, unter dem Alexa-Fhem laufen soll. In aktuellen Versionen von Windows (ab Windows 7 bzw. ab Windows Server 2008 R2) liegt das Verzeichnis unter C:\Users\<Benutzername>, also z.B. für Benutzer "Administrator" - unter C:\Users\Administrator.
    Falls Windows sich weigert das Verzichniss mit dem Punkt am Anfang zu erstellen, kann man das aus der Kommandozeile machen:
    cd "C:\Users\<Benutzername>"
    
    mkdir ".alexa"
    
  7. Die Datei config-sample.json nach C:\Users\<Benutzername>\.alexa\config.json kopieren.
  8. Achtung: Ggf. müssen auch die Dateien key.pem und cert.pem ins entsprechende Verzeichnis ("<FHEM-Hauptverzeichis>\alexa-fhem\bin) kopiert werden.

Update

Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben

Linux
  1. Das Verzeichnis alexa-fhem im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) umbenennen in alexa-fhem.old.
  2. Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) entpacken (nicht unter Windows, das zerstört die Rechteeinstellungen).
  3. Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen, in das Verzeichnis wechseln
  4. Mit
    npm install
    
    alle Abhängigkeiten installieren (kein sudo!).
  5. Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis alexa-fhem.old ins neue Verzeichnis alexa-fhem kopieren.

Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis alexa-fhem.old gelöscht werden.

Windows
  1. Das Verzeichnis alexa-fhem im Hauptverzeichnis von FHEM (z.B. С:\Program Files (x86)\fhem) umbenennen in alexa-fhem.old.
  2. Die tgz-Datei der neuen Alexa-Fhem-Version im Hauptverzeichnis von FHEM entpacken.
  3. Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen
  4. Windows-Shell (Kommandozeile, Eingabeaufforderung usw.) öffnen. "Start" -> "Ausführen" (oder [Windows-Taste]+[R]) -> cmd -> Ok. Durch
    cd "<FHEM-Hauptverzeichis>\alexa-fhem"
    
    in das Verzeichnis wechseln.
    Dabei ist natürlich das <FHEM-Hauptverzeichis> durch den entsprechenden Pfad aus dem Schritt 1 zu ersetzen. Im o.g. Beispiel wäre es cd "С:\Program Files (x86)\fhem\alexa-fhem"
  5. Mit
    npm install
    
    alle Abhängigkeiten installieren.
  6. Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis alexa-fhem.old ins neue Verzeichnis alexa-fhem kopieren.

Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis alexa-fhem.old gelöscht werden.

Alexa-Fhem konfigurieren

Der Inhalt der Datei ~/.alexa/config.json muss an die eigene Umgebung angepasst werden.

  1. nat-pmp -> wenn nat-pmp verwendet werden soll: die ip des eigenen routers, sonst die Zeile löschen!
  2. nat-upnp -> wenn nat-upnp verwendet werden soll: true, sonst die Zeile löschen!
  3. applicationId
    • Wenn man nur den SmartHome-Skill verwenden möchte, kann dieser Eintrag leer bleiben.
    • Ansonsten ist er mit der SkillID des Alexa Custom Skills zu belegen, siehe Abschnitt Skill Id bestimmen
  4. oauthClientID -> Client ID dem Abschnitt Login with Amazon, Punkt 1
  5. server -> IP-Adresse des eigenen FHEM-Servers
  6. port -> Portnummer des eigenen FHEM-Servers


Beispiel a) Offenes fhem - System ohne Absicherung:

{
   "alexa": {
       "name": "Alexa TEST",
       "keyFile": "./key.pem",
       "certFile": "./cert.pem",
       "applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
       "oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
   },
   "connections": [
       {
           "name": "FHEM",
           "server": "192.168.0.xxx.xxx",
           "port": "8083",
           "filter": "room=AlexaRoom"
       }
   ]
}


Beispiel b) Abgesichertes fhem - System mit TLS/SSL und HTTP Basic-Authentication:

{
   "alexa": {
       "name": "Alexa TEST",
       "keyFile": "./key.pem",
       "certFile": "./cert.pem",
       "applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
       "oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
   },
   "connections": [
       {
           "name": "FHEM",
           "server": "192.168.0.xxx.xxx",
           "auth": {"user": "fhemuser", "pass": "fhempassword"},
           "ssl": true,
           "port": "8083",
           "filter": "room=AlexaRoom"
       }
   ]
}

Mehrere Custom Skills lassen sich mit der folgenden Syntax eintragen

        "applicationId": [ "amzn1.ask.skill.1" , "amzn1.ask.skill.2" ],
        "oauthClientID": [ "amzn1.application-oa2-client.1" , "amzn1.application-oa2-client.1" ]

Danach durch Aufruf von

./bin/alexa

den Dienst starten (kein sudo!)


Unter Windows startet man den Alexa-Dienst durch

node alexa

aus der alex-fhem/bin (also erst z.B. durch cd "<FHEM-Hauptverzeichis>\alexa-fhem\bin" ins richtige Verzeichnis kommen)

Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.

Alexa-Fhem aus FHEM heraus starten

Hierbei muss man zunächst herausfinden, welche der folgenden Startvarianten sein LINUX - OS zum Einsatz kommen: initd.d oder systemd.

Auf keinen Fall darf man "sicherheitshalber" beide Varianten installieren, dies zu Fehler(-meldungen) führt.

Vorgehen bei Linux-Versionen mit init.d

Diese Variante kommt unter anderem auf dem Raspberry Pi mit dem OS-Varianten "Wheezy" zum Einsatz

Zunächst das Start-up-Skript aus diesem Post herunterladen https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271 und unter /etc/init.d/alexa speichern.

Das Script geht davon aus, das das alexa-fhem Skript unter /opt/fhem/alexa-fhem liegt, und die Logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.

Nun folgende Kommandos ausführen:

sudo chmod 755 /etc/init.d/alexa
sudo update-rc.d alexa defaults

In der Datei /etc/sudoers den User fhem für die Nutzung von sudo zulassen (sudo nano /etc/sudoers), z.B. durch Anfügen der nachfolgenden Zeile: fhem ALL=(ALL) NOPASSWD: ALL

Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):

define FHEM.Alexa.Status dummy

define FHEM.Alexa dummy
attr FHEM.Alexa event-on-change-reading state
attr FHEM.Alexa webCmd status:start:stop:restart

define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq "start") 
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa start > /dev/null 2>&1 &")}) 
DOELSEIF ([FHEM.Alexa] eq "stop")
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa stop > /dev/null 2>&1 &")}) 
DOELSEIF ([FHEM.Alexa] eq "restart") 
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa restart > /dev/null 2>&1 &")}) 
DOELSEIF ([FHEM.Alexa] eq "status") 
(set FHEM.Alexa on, {system ("sudo /etc/init.d/alexa status > /dev/null 2>&1 &")})
Vorgehen bei Linux-Versionen mit systemd

Diese Variante kommt unter anderem auf dem Raspberry Pi ab/seit der OS-Variante "Jessie" zum Einsatz

Bei systemd Systemen funktioniert das obengenannte vorgehen leider nicht, man kann das gleiche aber mit dem Modul 98_serviced.pm - systemd und initd Dienste steuern umsetzen. Wichtig ist das der User unter dem alexa ausgeführt wird ohne Passwort abfrage sudo ausführen darf, dazu muss er in der /etc/sudoers eingetragen werden, z.b. so fhem ALL=(ALL) NOPASSWD: ALL

Sollte es dann nicht funktionieren kann das an einem Gruppen eintrag unterhalb der User definition in der /etc/sudoers, in diesem Fall den user am ende der /etc/sudoers eintragen, dann sollte es funktionieren

Alexa-Fhem als Service (systemd) installieren

Auf neueren Installationen (z.B. RPi Jessie) wird init.d durch systemd ersetzt. Folgend die Anleitung um alexa-fhem als Service zu installieren auf einem Raspberry Pi mit Jessie.

Zunächst einen neuen Benutzer anlegen unter dem alexa-fhem laufen soll, falls man nicht möchtet dass alexa-fhem z.B. mit dem fhem User ausgeführt wird:

sudo useradd -M --system alexa

Eigentlich braucht der Benutzer keine Gruppen, aber man kann den Benutzer auch der Gruppe dialout hinzufügen (sudo usermod -a -G dialout alexa)

Datei "alexa.service" unter /etc/systemd/system anlegen:

[Unit]
Description=Node.js Alexa Server 
After=syslog.target network-online.target

[Service]
Type=simple
User=alexa 
WorkingDirectory=/opt/fhem/alexa-fhem
ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target 

Den Pfad /home/alexa/.alexa an die Systemgegebenheiten anpassen. Letztendlich kann die config.json irgendwo liegen, hauptsache alexa-fhem weiß wo.

Im WorkingDirectory wird der alexa Dienst die Zertifikate suchen.

Achtung: Natürlich muss der Benutzer auch Zugriff sowohl auf das Verzeichnis mit der config als auch das alexa-fhem Verzeichnis und das WorkingDirectory haben.

Um den Service zu aktiveren und zu starten helfen folgende Befehle:

sudo systemctl daemon-reload
sudo systemctl enable alexa
sudo systemctl start alexa

Status abfragen mit

sudo systemctl status alexa

Sollte sich der Service nicht starten lassen und endet die Ausgabe ähnlich wie hier:

Feb 02 09:47:25 inet alexa[2738]: STDIN EOF

kann eine Anpassung der ExecStart Zeile aus der alexa.service Datei helfen:

ExecStart=/opt/fhem/alexa-fhem/bin/alexa --dockerDetached -U /home/alexa/.alexa

Log einsehen?

sudo journalctl -u alexa

(mit -f kann man den follow Modus aktivieren, wie tail -f). Bei einen reboot startet alexa-fhem jetzt automatisch.

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

Security Profile anlegen

Die Erzeugung eines Sicherheitsprofils muss nur einmal erfolgen, es wird dann für alle weiteren Skills verwendet.

  1. Nach der Anmeldung Auswahl von APPS & SERVICES
    Apps1.jpg
  2. Anschließend auswählen Security Profiles
    Security.jpg
  3. Auswählen Create a New Security Profile aus
    Newsecurity.jpg
  4. Dann einen Namen und eine Beschreibung für das Profil eingeben und mit Save bestätigen
    SecurityName.jpg
  5. Anschließend den die Daten unter Gneral merken oder Kopieren
    SecurityGenerl.jpg
  6. Im Anschluß daran auf Web Settings klicken und dort auf Edit
    WebSettings.jpg
  7. Und nun die im Bild gezeigten Daten eintragen
    WebSettingsDaten.jpg
    1. https://layla.amazon.co.uk/api/skill/link/xxx
    2. https://pitangui.amazon.com/api/skill/link/xxx
    3. https://layla.amazon.com/api/skill/link/xxx
  8. Das xxx muss hierbei durch den Wert ersetzt werden, der in den beiden Abschnitten SmartHome Skill anlegen bzw. Custom Skill anlegen jeweils unter Punkt 4 (Seite Configuration) bei Redirect Urls am Ende der URLs angezeigt wird
  9. Im anschluß daran oben auf Login with Amazon
    LoginwithAlexa.jpg
Login with Amazon
Info green.pngHier wird beschrieben, wo Client Id und Client Secret zu finden sind
  1. In der neu geladenen Seite im Dropdown Menü das vorher angelegte Profil unter Select a Security Profil auswählen und mit Confirm bestätigen
    LoginwithAlexaSelect.jpg
  2. Im folgenden Fenster die Adresse https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 eingeben und mit Save bestätigen. Todo Erklärungsbedarf: WARUM diese Adresse
    Developer.amazon.com-12-login with amazon - enter consent screen information.png
  3. Anschließend bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad klicken und Web Settings auswählen
    Developer.amazon.com-13-login with amazon - web settings.png

Skills bearbeiten (Gilt für den SmartHome wie auch den Customer Skill)

  1. Im Menü den Punkt ALEXA auswählen und anschließend im Dropdown Menü Alexa Skills Kit auswählen
    AlexaSkill.jpg
SmartHome Skill anlegen
  1. Rechts Create Skill auswählen
    AlexaSkillCreate.jpg
  2. Auf der folgenden Seite die folgenden Daten eingeben und dann mit Next bestätigen:
    • Skill Name -> beliebiger Name, z.B. "MySmartHome Basic")
    • Default Language -> German
    • Choose a model to add to your skill -> SmartHome anklicken
    • Anschließend rechts oben auf Create Skill
      AlexaSkillCreateSmart.jpg
  3. Nun auf die Seite https://signin.aws.amazon.com/ wechseln und dort einloggen
    AWSAnmelden.jpg
  4. Nach dem Login links oben auf Services klicken und anschließend auf Lambda
    AWSLambda.jpg
  5. Auf der Lambda Seite "Funktion' auswählen links im Menü und dann rechts auf Funktion erstellen klicken
    LamdbaFunktion.jpg
  6. Auf der Seite Funktion erstellen dann auf Ohne Vorgabe erstellen' klicken
    • Unter Name einen Beliebigen Namen eingeben
    • Bei Laufzeit Nodejs 8.10 auswählen
    • Unter Rolle Erstellen einer benutzerdefinierten Rolle auswählen, im anschluß daran sollte sich automatisch ein neues Fenster öffnen, in diesem alles unverändert lassen und auf Allow klicken wodurch sich das Fenster wieder schließen sollte
      IAM.jpg
    • Jetzt noch rechts unten auf Funktion erstellen klicken
      OhneVorgabe.jpg
  1. Auf der jetzt geöffneten Seite rechts oben die arn Nummer aufschreiben/kopieren und links aus dem Menü Alexa Smart Home hinzufügen
    Arn.jpg
  2. Unten auf der Seite unter Auslöser konfigurieren muss die Skill ID eingetragen werden, diese findet man im developer account unter dem Skill.
    Auslöser.jpg
  3. Anschließend noch rechts unten auf Hinzufügen klicken und danach rechts oben auf Speichern
  1. Nun auf Test (Bezeichnung im Screenshot) klicken und unten auf der Seite unter Funktionscode den vorhanden Code löschen und den Code aus der Lambda.js welche sich in dem alexa-fhem-0.4.4 Paket befindet einfügen
    Arn2.jpg


Code.jpg

  1. Im Code müsst ihr den Hostname anpassen, also eure DynDns z.b. einfügen, anschließen rechts oben wieder auf Speichern
  1. Nun wieder zurück in den Alexa developer Account und hier folgende Daten eintragen
X mark.svgEs funktioniert nur noch die v3 api (v2 ist deprecated). Die Version hierfür gibt es im Forum. bitte die hinweise dort lesen und beachten.
    • Payload Version -> v3(preferred) auswählen
    • Default endpoint -> Hier die arn Nummer von oben eintragen/einfügen
    • Dann den Haken setzen bei Europe, India und nochmals die arn eintragen und anschließend rechts oben auf Save
  1. Links im Menü Account Linking auswählen und dort folgende Daten eintragen
  2. .* Client Secret -> Euer Client Secret, siehe Client ID
    • Scope -> Add Scope auswählen und profile:user_id (wörtlich 1:1 eintragen) eintragen
    • Redirect URLs -> Diese 3 Adressen merken/kopieren
  3. Alles andere auf dieser seite kann gleich bleiben, jetzt noch rechts oben wieder auf Save klicken
    Account.jpg
  1. Anschließend wieder zurück zum Amazon developer Account https://developer.amazon.com , dort wieder das Security Profile aufrufen und die drei Links unter Allowed Return URLs (wo eingangs am Schluss 3 XXX gesetzt wurden) mit den Links von Oben Redirect URLs ersetzen
  2. Nun geht es weiter in der Amazon Alexa developer Konsole https://developer.amazon.com/alexa/console/ask wo oben auf Distribution geklickt werden muss.
  3. Hier sind alle angaben Freiwillig bzw. können Frei gewählt werden bis auf die Privacy Policy URL , diese muss eingetragen werden, anschließend links unten auf Save and continue
    German.jpg
  1. Auf der kommenden Seite Privacy & Compliance entsprechend anklicken und wieder unter auf Save and continue
  2. Unter Availability alles so lassen und wieder auf Save and continue
  3. Nun den Alexa Service auf dem Fhem Rechner neustarten, den Skill in der Alexa App aktivieren und nach geräten suchen lassen
Custom Skill anlegen
  1. Oben rechts Add a New Skill auswählen
    Developer.amazon.com-18-alexa - alex skills kit - add a new skill.png
  2. Auf der folgenden Seite (Skill Information) die nachstehenden Daten eingeben und dann mit Next bestätigen:
    • Skill Type -> Custom Interaction Model
    • Language -> German
    • Name -> beliebiger Name, z.B. "MySmartHome Advanced". Dieser wird in der Alexa App unter "Meine Skills" angezeigt.
    • Invocation Name -> Aufruf des Skills, unter dem dieser später gestartet wird. Z.B. "Alexa, starte James"
      CustomSkill 2.PNG
  3. Auf der Seite Interaction Model folgende Eingaben tätigen und mit Next abschließen
    • In einem separaten Browserfenster FHEM aufrufen, und für das bereits definierte Alexa-Gerät das Kommando get MyAlexa interactionModel aufrufen. Es erscheint ein Popup-Fenster mit ziemlich vielen Zeilen.
    • In die Box Intent Schema kopiert man den ersten Teil dieser FHEM-Ausgabe hinein, also:

      { "intents" : [ <hier ziemlich viele Zeilen> ] }

    • Nun die Custom Slot Types einrichten. Dazu muss aus dem zweiten Teil der FHEM-Ausgabe jeweils der Slot-Type (z.B. FHEM_article) in das Feld TYPE eingetragen werden, das nach dem Anklicken von Add Slot Type erscheint. In das darunter liegende größere Textfeld kommen die möglichen Werte für diesen Slot, so wie sie aus der FHEM-Ausgabe abzulesen sind. Dann mit Save sichern. Als Custom Slot Type erscheint dann für diesen Beispiel-Slot FHEM_article der | die | das | den d.h., die Zeilenumbrüche bei den möglichen Werten werden als "|" dargestellt.
    • Hier muss nun ein Bruch im Arbeitsfluss durchgeführt werden, denn bei der Erstellung des Custom Skills kommt es auf die Reihenfolge der Einträge an. Deshalb zunächst diese FHEM-Ausgabe schließen, und für dasselbe FHEM-Device get MyAlexa customSlotTypes ausführen. Auch diese Ausgabe wird, wie oben beschriebeen, in Custom Slot Types eingetragen (erst der TYPE, dann die möglichen Werte)
    • Anschließend erneut die FHEM-Ausgabe schließen und erneut für das bereits definierte Alexa-Gerät das Kommando get MyAlexa interactionModel aufrufen.
    • Unter Sample Utterances nun den Text aus dem dritten Teil dieser FHEM-Ausgabe hineinkopieren
      CustomSkill 5.PNG
  4. Auf der Seite Configuration Folgendes eingeben und mit Next bestätigen:

    Beim Sichern dieser Seite mit Next kann es zu einer Fehlermeldung kommen, wenn man seine Skill-Definitionen mit dem einfachen SmartHome-Skill begonnen hat. Deshalb muss noch der entsprechende Trigger für die AWS Lambda Funktion nachgetragen werden, dies wird in Abschnitt Trigger für Custom Skill hinzufügen beschrieben.


    CustomSkill 6.PNG CustomSkill 7.PNG
  5. Testen

    Hat man den Custom Skill angelegt, bietet dieser auch eine komfortable Testmöglichkeit. Dazu wählt man in der Übersichtsseite All Skills den Button Edit des Alexa Custom Skill aus. Auf der nachfolgenden Seite dann links Test. Die Testseite enthält

    • ein Feld Voice Simulator, mit dem man die Sprachsausgabe testen kann,
    • ein Feld Service Simulator, mit dem die Verarbeitung von Alexa-Kommandois getestet werden kann. Hier kann man z.B. eintragen
    "Alexa, sage <Custom Skill Invocation Name>: Stelle Weckzeit auf Neunzehn Siebenundzwanzig Uhr"
    "Alexa, frage <Custom Skill Invocation Name> nach dem Status von Weckzeit"
    

    Dabei ist natürlich der Custom Skill Invocation Name durch den Wert zu ersetzen, den man im Abschnitt Custom Skill Anlegen unter Punkt 2 eingetragen hat.

    Skill Id bestimmen

    Info green.pngHier wird beschrieben, wo die Alexa Skill Id zu finden ist

    Für das Anlegen einer AWS Lambda Funktion bzw für die Konfiguration von Alexa-Fhem wird die Alexa Skill Id benötigt. An diese kommt man wie folgt:

    1. Anmelden wie unter Alexa Skills beschrieben.
    2. Menüpunkt ALEXA auswählen, wie Skills bearbeiten erklärt.
    3. Beim gewünschten Eintrag auf Edit klicken
      Developer.amazon.com-23-alexa - alex skills kit - overview.png
    4. Die Id, die nun oben angezeigt wird, ist die gesuchte. Sie hat typischerweise das Format amzn1.ask.skill.[Zahlen und Bindestriche]
      Aws.amazon.com-06-configure triggers2.png

    AWS Lambda Funktion

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

    1. Anmeldung auswählen
      Aws.amazon.com-01-site.png
    2. Anmeldedaten eingeben
      Aws.amazon.com-02-login.png
    3. Den Punkt Lambda links auf der Startseite auswählen, bzw. im Menü Services unter Compute den Menüpunkt Lambda auswählen
      Aws.amazon.com-03-lambda.png
    ==== AWS Lambda Funktion anlegen ====
    X mark.svgDie AWS Seiten sehen inzwischen etwas anders aus. Eine angepasste Beschreibung findet sich im Forum. Bitte auch die Hinweise dort lesen.
    1. Für eine erste Lambda-Funktion den Punkt Get Started Now auswählen
      Aws.amazon.com-04-get started now.png
    2. Den Blueprint Blank function auswählen
      Aws.amazon.com-05-select blueprint.png
    3. Im neuen Fenster dann auf den gestrichelten Kasten klicken und Alexa Smart Home auswählen und mit Next bestätigen
      Aws.amazon.com-06-configure triggers1.png
      1. Achtung, es ist möglich, dass dabei Alexa Smart Home überhaupt nicht angeboten wird. Dann bitte ganz rechts oben in der Ecke nachsehen, welche Region bzw. welches Land ausgewählt ist. Empfohlen wird, Ireland auszuwählen. Dann erscheint bei den Funktionen auch Alexa Smart Home.
    4. Bei Application Id den Wert eintragen, dessen Ermittlung im Abschnitt Skill Id bestimmen beschrieben wird, den Haken bei Enable trigger setzen und mit Next bestätigen
      Aws.amazon.com-06-configure triggers3.png
    5. Auf der Konfigurationsseite eingeben:
      1. Name -> FHEM
      2. Runtime -> Node.js 6.10 (oder 8.10).
      3. Role -> Choose an existing role
        1. Achtung: wenn es noch keine existing role gibt, zuerst Create a custom role -> in dem Popup dann lambda_basic_execution auswählen und auf Allow klicken sowie bei Existing role dann x wählen.
    6. Auf der Code-Seite ist im großen Textfeld dann der Code aus der Datei lambda.js im Paket Alexa-Fhem vollständig einzufügen. Dabei muss der vorhandene Code im Texteil komplett gelöscht, der Teil aus der lamda.js eingefügt und noch der Hostname im Quellcode an den eigenen Hostnamen angepasst werden.
    7. Anschließend alles mit Next bestätigen.
      Aws.amazon.com-07-configure function.png
    8. Auf der Übersichtsseite dann Create function anklicken
      Aws.amazon.com-08-review.png

    Trigger für Custom Skill hinzufügen

    Editiert man eine Lambda-Funktion, werden auf der Seite Triggers diejenigen Dienste angezeigt, die diese Funktion aufrufen.

    • Hier taucht der Trigger Alexa Smart Home zusammen mit der Application Id auf, der bei der Einrichtung des SmartHome-Skills eingetragen wurde.
    • Zur Verbindung mit dem Custom Skill ist es nötig, einen zweiten Trigger hinzuzufügen. Durch Anklicken von Add Trigger wird eine Auswahlseite eingeblendet. Im neuen Fenster dann auf den gestrichelten Kasten klicken und Alexa Skills Kit' auswählen und mit Next bestätigen

    ARN der AWS Lambda Funktion bestimmen

    1. Auf der Übersichtsseite oben links den Menüpunkt Functions aúswählen
      Aws.amazon.com-09-go overview.png
    2. Anschließend den Radiobutton der angelegten Funktion FHEM markieren und im Menü Action den Punkt Show ARN auswählen
      Aws.amazon.com-10-1-show arn.png
    3. Es wird nun eine ARN Adresse angezeigt, die für den Abschnitt SmartHome Skill anlegen benötigt wird
      Aws.amazon.com-10-2-arn.png

    Absichern des Zugriffs

    Natürlich muss der Zugriff auf den von Alexa-Fhem verwendeten Port (default: 3000, Bestandteil des Codes in der AWS Lambda-Funktion) durch die Firewall freigeschaltet werden (auf einer FritzBox unter "Portfreigaben").

    Absicherung direkt in Alexa-FHEM

    Die Kommunikation zwischen Amazon AWS und Alexa-FHEM ist auf die folgenden Arten gesichert:

    • Die Verbindung erfolgt per HTTPS
    • Es werden nur Verbindung angenommen auf denen ein gültiges Alexa-Event gesendet wird.
    • Es werden nur Verbindungen angenommen die ein gültiges und noch nicht abgelaufenes OAuth-Token enthalten. Jedes neue Token wird live bei Amazon auf Gültigkeit geprüft.
    • Es werden nur Verbindungen mit lokal konfigurierter Skill-ID angenommen.
    • Es ist nicht möglich von außen beliebige FHEM Kommandos zu senden. Die FHEM Kommandos werden nur lokal erzeugt.

    Wer möchte kann Alexa-FHEM natürlich noch weiter absichern. Es gilt aber, dass nicht jedes zusätzliche Glied in der Kette die Sicherheit sondern unter Umständen nur die Angriffsfläche erhöht. Ein falsch konfigurierter und nach aussen offener Apache (oder anderer ReverseProxy) ist unter Umständen ein größeres Risiko als Alexa-FHEM alleine.

    Absicherung per ReverseProxy

    Die Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt: Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen. Nicht nur ist der Apache eine hervorragend stabile und seit Jahrzehnten getestete Software, sondern die Konfiguration als ReverseProxy erlaubt auch, den Zugriff auf den Alexa-Fhem-Rechner auf die Amazon-Maschinen zu beschränken.

    Achtung: Dies ist keine allgemeine Anleitung in Sachen Computersicherheit. Im Folgenden gehen wir davon aus, dass

    • Grundbegriffe wie Firewall, IP-Ports, SSL und Dynamic DNS vertraut sind
    • Ein Apache Webserver (idealerweise auf einer zweiten Maschine) bereits installiert ist und die Konfiguration verstanden wurde (wenn nicht: Es gibt im Netz tausende von Anleitungen dafür...)
    • Ein Servername von einem DynDNS-Anbieter - sagen wir myhome.is-my-castle.com - bereits von außen auf unser SmartHome zeigt.
    • Alexa-Fhem in einer der oben beschriebenen Basiskonfigurationen läuft, d.h. der Zugriff auf https://myhome.is-my-castle.com:3000 ergibt, wie im Punkt Alexa-Fhem testen beschrieben, eine Antwort des Node.js Servers.

    Als erster Schritt zur Absicherung muss das ReverseProxy Modul für den Apache installiert und mit a2enmod aktiviert werden, hierzu sei auf diese Anleitung verwiesen. Der zweite Schritt besteht darin, den SSL-Zugriff durch ein Passwort abzusichern. Dazu wird auf dem Apache-Rechner das Programm

    htpasswd <passwdfile> <username>

    ausgeführt, das Programm fragt dann nach dem gewünschten Passwort. Wir nehmen im Folgenden an, dass das Passwortfile /etc/apache2/htpasswd ist, der gesetzte Username alexa lautet und das Passwort my_smarthome ist.

    Im dritten Schritt wird nun in das Apache-Konfigurationsfile die Weiterleitung auf den eigentlichen Alexa-Fhem-Rechner eingetragen. Dazu wählen wir, dass von außen der Standard-SSL-Port 443 benutzt werden soll, sowie als Verzeichnisname /alexa. Achtung: Dieser Code soll nicht in die Default-Konfiguration des Apache-Webservers. Sondern in eine separate Datei (Dateiname z.B. "fhem"), die ins Unterverzeichnis /etc/apache2/conf.d gestellt wird.

    <VirtualHost *:443>
     ServerName myhome.is-my-castle.com
     SSLEngine on
     SSLProxyEngine on
     SSLProxyCheckPeerCN off
     SSLProxyCheckPeerName off
     SSLCertificateKeyFile /etc/apache2/mycert/server.key
     SSLCertificateFile /etc/apache2/mycert/server.crt
    <Location /alexa>
     AuthType Basic
     AuthName "Authentication Required"
     AuthUserFile "/etc/apache2/htpasswd"
     Require valid-user
     ProxyPass https://<hier IP-Adresse des Alexa-Fhem-Rechners>:3000/
     ProxyPassReverse https://<hier IP-Adresse des Alexa-Fhem-Rechners>:3000/
     Order deny,allow
     Allow from All
    </Location>
    (... Hier eventuell weitere Umleitungen)
    </VirtualHost>
    

    Nach einem Neustart des Apache-Servers, dem Schließen des Ports 3000 in der Firewall sowie dem Öffnen des Ports 443 ist der Alexa-Fhem-Rechner von außen nur noch erreichbar durch den Aufruf von https://myhome.is-my-castle.com/alexa und verlangt unmittelbar die Eingabe von Username und Passwort.

    Der vierte Schritt ist nun, den Code der AWS Lambda-Funktion an fünf Stellen zu verändern

    const PORT=443;

    const HOST='myhome.is-my-castle.com';

    const PATH='/alexa';

    const AUTH='alexa:my_smarthome';
    // entry
    exports.handler = function(event, context, callback) {
     console.log(`EVENT: ${event}`);
     console.log(`CONTEXT: ${context}`);  
     var post_data = JSON.stringify(event);
     var options = {
       hostname: HOST,
       port: PORT,
       //family: 6,
       path: PATH,
       method: 'POST',
       auth: AUTH,
       rejectUnauthorized: false, // accept self-signed
    (etc., Rest des Codes wie gehabt)
    

    Natürlich muss der Zugriff getestet werden. Bei Beachtung aller dieser Schritte werden alle un-autorisierten Zugriffe von außen abgewehrt. Eine noch weiter gehende Sicherung ist möglich, dazu kann in der Serverkonfiguration der Zugriff auf die Amazon-Domains beschränkt werden. Das ganze Alexa-System ist aber noch in konstanter Weiterentwicklung, diese Domain-Namen können sich also noch ändern.

    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

    Geräte

    1. Auf http://alexa.amazon.de anmelden
    2. Auf Smart Home klicken
      Alexa.amazon.de-01-startseite.png
    3. Anschließend den Punkt Geräte suchen anklicken
      Alexa.amazon.de-07-Gerätesuche.png
    4. Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.

    Tip: Es macht Sinn, unter Meine Gruppen Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. "Licht") haben.

    Einrichtung unter FHEM

    Im Folgenden werden exemplarisch ein paar Geräte beschrieben, die man nutzbringend mit FHEM einsetzen kann.

    Bei Verwendung des Custom Skills übersetzt die Kombination der Attribute alexaMapping und homebridgeMapping Sprachbefehle ("Intents") in gerätespezifische Kommandos.

    • Das Attribut alexaMapping wird am Alexa-Device gesetzt und dient dazu, erkannte Sprachkommandos in abstrakte Characteristiken zu überführen. Für den einfacheren SmartHome Skill hat darum das Attribut alexaMapping keine Bedeutung, sondern nur der genericDeviceType des zu steuernden Gerätes.
    • Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:
      • Das Attribut enthält eine durch Leerzeichen getrennte Liste aus Konfigurationen für jeweils eine Characteristik
      • Jede einzelne der Characteristik-Konfigurationen besteht aus dem Namen der Characteristik, gefolgt von "=" und einer kommaseparierten Liste von Parametern.
     attr <device> homebridgeMapping <Characteristic1>=<param1.1>,<param1.2>,... <Characteristic2>=<param2.1>,<param2.2>,...
    
      • Jeder Parameter besteht entweder aus
        • <cmd>:<device>:<reading>, hier können nicht verwendete Elemente von links nach rechts weg gelassen werden.
        • <name>=<value>, hier kann <value> entweder ein Wert oder semikolonseparierte Liste sein.
        • Oder dem schlüsselwort clear, welches alle vorhandenen (default) Parameter dieser Characteristik löscht. clear kann auch an Stelle einer ganzen Characteristik-Konfiguration stehen

    Weiter führende Dokumentation zum homebridgeMapping findet sich unter https://forum.fhem.de/index.php/topic,48558.0.html

    Einfacher Schalter

    • Ein einfacher Schalter, der die set-Kommandos on und off kennt, kann direkt mit Alexa-Fhem gekoppelt werden
    • Für kompliziertere Aktionen, etwa das Übermitteln eines spezifischen Schaltbefehls an FHEM, ist die Einrichtung eines Dummies zu empfehlen.

    Ob Dummy oder nicht, wichtig sind die drei fett gedruckten Zeilen

    define Alexa.Party dummy

    attr Alexa.Party alexaName party

    attr Alexa.Party alexaRoom alexaroom

    attr Alexa.Party genericDeviceType switch
    attr Alexa.Party group AlexaGeräte
    attr Alexa.Party room AlexaRoom
    attr Alexa.Party setList on off
    

    Selbstverständlich kann man diesen Dummy mit einem notify oder DOIF abfangen, um die gewünschte Schaltaktion auszuführen.

    Ein Alternative zum Dummy ist das Anlegen eines readingsProxy, dem die entsprechenden Attribute gegeben werden.

    Weil es sich hierbei um eines der einfachen Geräte handelt, die Alexa selbst im SmartHome Skill bearbeiten kann, ist auch der zweite Schritt bei der Einrichtung in der Alexa App sinnvoll: Der Schalter wird dann im Bereich Smart Home der Alexa App erkannt. Wer ihn auch mit dem Custon Skill bedienen möchte, muss natürlich Sorge tragen, dass der Alexa-Name party bei den FHEM_Devices auftaucht und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sind (siehe Abschnitt Custom Skill Anlegen).

    Wecker

    Dieses Gerät kann man nur mit dem Custom Skill bedienen, es wird also nicht im Bereich Smart Home der Alexa App auftauchen. Wir richten einen Dummy ein, wichtig sind wieder die fett gedruckten Zeilen:

    define Alexa.Weckzeit dummy

    attr Alexa.Weckzeit alexaName weckzeit

    attr Alexa.Weckzeit alexaRoom alexaroom

    attr Alexa.Weckzeit genericDeviceType clock
    attr Alexa.Weckzeit group AlexaGeräte
    attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+
    attr Alexa.Weckzeit room AlexaRoom
    attr Alexa.Weckzeit setList Weckzeit:time
    

    Das Attribut genericDeviceTye ist nicht wichtig, weil es ein generisches Device dieser Art gar nicht gibt. Wichtig hingegen ist das Attribut homebridgeMapping

    Für das Gerät MyAlexa, das in Abschnitt definiert wurde, muss im Attribut alexaMapping auftauchen

    Weckzeit=verb=stelle,valuePrefix=für;auf,values=AMAZON.TIME,valueSuffix=uhr

    Darüber hinaus muss der Alexa-Name weckzeit bei den FHEM_Devices auftauchen und die entsprechenden weiteren Slot Types und Example Utterances in der Konfiguration des Custom Skills vorhanden sein (siehe Abschnitt Custom Skill Anlegen).

    Der Aufruf dieses Gerätes mit Alexa erfolgt dann z.B. mit den Sätzen

    "Alexa, sage <Custom Skill Invocation Name>: Stelle Weckzeit auf Neunzehn Uhr Siebenundzwanzig"
    "Alexa, frage <Custom Skill Invocation Name> nach dem Status von Weckzeit"
    

    Dabei ist natürlich der Custom Skill Invocation Name durch den Wert zu ersetzen, den man im Abschnitt Custom Skill Anlegen unter Punkt 2 eingetragen hat.

    Zur weiteren Bearbeitung kann man jetzt mit einem DOIF Statusänderungen des Dummies abfangen und durch eine kleine Helperfunktion ins "echte" FHEM weiterleiten.

    define Alexa.Weckzeit.N DOIF (["Alexa.Weckzeit:.*"])({AlexaHelper("Alexa.Weckzeit","$EVENT")})

    Die Helperfunktion (z.B. in 99_myUtils.pm) stellt aus der übergebenen Zeit (immer im Format dd:mm) eine sprachkompatible Nachricht $nc und einen mit den FHEM-Zeitangaben kompatiblen String $nt zusammen und reicht beide an eine Routine changeWakeTime weiter (dokumentiert in den Smart Home Hacks).

    sub AlexaHelper($$){
     my ($name,$event)=@_;
     if( $name eq "Alexa.Weckzeit" ){ 
       my ($nc,$nt);
       #-- volle Stunde----------------------------------------
       if( $event =~ /(\d+):00/ ){
         $nc=sprintf("%d Uhr",$1);
         $nt=sprintf("%02d:00:00",$1);
       #-- nicht volle Stunde---------------------------------
       }elsif( $event =~ /(\d+):(\d+)/ ){
         $nc=sprintf("%d Uhr %d",$1,$2);
         $nt=sprintf("%02d:%02d:00",$1,$2);
       }
       changeWakeTime(\'GalaxyTab.EG\',\'$nc\',\'$nt\');
     }
    }
    

    Lichtszene

    Eine Lichtszene wird mit dem Modul LightScene angelegt. Wir gehen davon aus, dass in der Lichtszene die beiden Szenen Alle_An und Alle_Aus, sowie mindestens eine weitere Szene (hier: Sitzgruppe) definiert wurde.

    • Nachfolgend wird ein Beispiel beschrieben, wie man eine Lichtszene mit dem einfachen SmartHome Skill steuern kann. Die verwendeten Kommandos sind dann
    "Alexa, schalte (die) Beleuchtung an" -> LightScene Alle_An wird ausgewählt
    "Alexa, schalte (die) Beleuchtungsitzgruppe an" -> LightScene Sitzgruppe wird ausgewählt
    ...
    "Alexa, schalte (die) Beleuchtung aus" -> LightScene Alle_Aus wird ausgewählt
    
    • Künftig wird man LightScene mit dem Custom Skill eventuell direkt steuern können - allerdings hat das einen geringeren WAF, als die Steuerung über den SmartHome Skill: Der Einschaltsatz muss dann mindestens lauten
    "Alexa, sage <Custom Skill Invocation Name>: schalte (die) Beleuchtung an" -> LightScene Alle_An wird ausgewählt
    

    Dafür wird es aber auch möglich sein direkt die SzenenNamen im gesprochenen Kommando zu verwenden und so auf die Umwege über dummys und ähnliches zu verzichten.


    Im ersten Schritt wird ein Dummy für die Gesamtbeleuchtung eingerichtet:

    define Alexa.Beleuchtung dummy

    attr Beleuchtung setList on off

    attr Alexa.Beleuchtung alexaName beleuchtung

    attr Alexa.Beleuchtung alexaRoom alexaroom
    attr Alexa.Beleuchtung genericDeviceType switch
    

    Anschließend wird für jede vorhandene Lichtszene (außer Alle_An und Alle_Aus) ein weiterer Dummy angelegt:

    define Alexa.Beleuchtung.Sitzgruppe dummy

    attr Beleuchtung setList on off

    attr Alexa.Beleuchtung.Sitzgruppe alexaName beleuchtungsitzgruppe

    attr Alexa.Beleuchtung.Sitzgruppe alexaRoom alexaroom
    attr Alexa.Beleuchtung.Sitzgruppe genericDeviceType switch 
    

    Die eigentliche Steuerung übernimmt dann ein DOIF

    define Alexa.Beleuchtung.N DOIF

    (["Alexa.Beleuchtung.Sitzgruppe:on"])

    (set <devicename der Lichtszene> scene Sitzgruppe,

     set Alexa.Beleuchtung off,
      ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
    )
    DOELSIF
    ... <weitere on-Events der anderen Szenen werden abgefangen>
    DOELSEIF
    (["Alexa.Beleuchtung:on"])
    (set <devicename der Lichtszene> scene Alle_An,
     set Alexa.Beleuchtung.Sitzgruppe off,
     ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
    )
    DOELSEIF
    (["Alexa.Beleuchtung:off"])
    (set <devicename der Lichtszene> scene Alle_Aus,
     set Alexa.Beleuchtung.Sitzgruppe off,
     ...<weitere dummies der anderen Szenen werden ebenfalls ausgeschaltet>
    )
    

    Mit diesem DOIF wird ein Radiobutton simuliert, d.h. wie bei den Stationstasten vor Uralt-Radios sorgt die Auswahl einer Szene immer dafür, dass alle anderen Dummies ausgeschaltet werden. Natürlich kann man das auch mit einem kleinen Perl-Programm erreichen.


    Zwei andere Ansätze Lichtszenen zu schalten die ohne DOIF auskommen sind im Folgenden beschrieben:

    • Wenn es von Interesse ist die Steuerung mit einer Darstellung in FTUI zu verbinden: Statt der oben beschriebenen dummy Devices kann man readingsProxy Devices mit passenden setFn und valueFn analog zum diesem Beispiel für harmony aktivitäten verwenden.
    • Für jede zu schaltende Szene wird ein dummy angelegt dessen homebridgeMapping direkt auf das LightScene Device zeigt:
    define <dummy> dummy
    attr <dummy> setList on off
    attr <dummy> genericDeviceType switch
    attr <dummy> homebridgeMapping On=<light scene>::state,valueOn=<szene>,cmdOn=scene+<szene>,cmdOff=scene+<szene aus>
    

    Bei der zweiten Variante wird davon ausgegangen das der aktuelle status nicht abgefragt oder angezeigt werden soll. Deshalb gibt es keine direkte RadioButton Funktionalität.

    Harmony Hub

    Ein HowTo-Beitrag im Forum beschreibt die Ansteuerung von Harmony-Aktionen über den Custom Skill, beispielsweise für eine Aktion ARD: „Alexa, sage FHEM stelle Anlage auf ARD“.

    Nutzung

    Um den Namen zu bestimmen, unter dem ein Gerät mit Alexa angesprochen wird, verwendet Alexa-Fhem mit absteigender Priorität:

    • das alexaName Attribut
    • das alias Attribut
    • das NAME Internal

    Damit Alexa ein Gerät eindeutig identifizieren kann, sollten eindeutige Gerätenamen verwendet werden, bestehed möglichst aus einem Wort und ohne Ziffern. Wenn Alexa einen Namen nicht versteht, kann man unter [1] nachsehen was tatsächlich verstanden wurde und den Gerätenamen ggf. anpassen.

    SmartHome Skill

    Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.

    Nach erfolgreicher Einrichtung des SmartHome Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:

    “alexa, schalte <gerät/gruppe> ein”
    “alexa, schalte <gerät/gruppe> aus”
    “alexa, stelle <gerät/gruppe> auf <wert> prozent”
    “alexa, stelle <gerät/gruppe> auf <anzahl> grad”
    “alexa, erhöhe <gerät/gruppe> um <anzahl> prozent”
    “alexa, reduziere <gerät/gruppe> um <anzahl> prozent”
    “alexa, erhöhe <gerät/gruppe> um <anzahl> grad”
    “alexa, reduziere <gerät/gruppe> um <anzahl> grad”
    

    Custom Skill

    Der Custom Skill erlaubt im Gegensatz zum SmartHome Skill eine weitreichende Konfiguration der möglichen Kommandos. Die Dokumentation ist aktuell noch über diverse Artikel im Wiki verstreut:

    • Das Prinzip der Kommandokonfiguration ist hier beschrieben.
    • Die erste Umsetzung ist hier beschrieben.
    • Mehr zu FHEM-Intents und deren Möglichkeiten gibt es hier.
    • Wie man die Alexa TTS-Engine bei den Antworten auf FHEM-Intents beeinflussen kann hier.


    TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions), alles hier sammeln.

    Troubleshooting

    Allgemeiner Hinweis

    Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter AWS Lambda Funktion anlegen Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein http:// davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:

    const PORT=3000;
    const HOST='mein.host.name';
    

    Freigabe von Port 3000

    X mark.svgDerzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von UnityMedia z.B. funktionieren derzeit leider nicht. Eine möglicher "Workaround" wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276


    Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können. Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.

    Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde.

    Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter Internet -> Freigaben -> Portfreigaben statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.

    Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: https://mein.hostname:3000. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.

    Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.

    Probleme mit node.js - npm install

    Falls eine Fehlermeldung auftritt, dass "npm" nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: NodeJS installieren sowie Python, g++, MDNS installieren, siehe auch folgenden Abschnitt.

    Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich

    Wenn man auf der Konsole angemeldet ist, den Befehl
    node -v
    
    eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter Homebridge_einrichten#NodeJS_installieren nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter Alexa-Fhem#Voraussetzungen erfüllt sind! Keine Experimente mit Versionen die darunter liegen.

    Fehlermeldung NAT-PMP failed: Error: timeout Fehler angezeigt beim Start von alexa-fhem

    Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: NAT-PMP failed: Error: timeout, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.

    Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder

    Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder.

    Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der ~/.alexa/config.json die folgenden Zeilen rauslöschen:

            "nat-pmp": "10.0.1.1",
            "nat-upnp": true,
    

    Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.

    Was ist zu tun, wenn alexa-fhem keine Geräte findet?

    Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut genericDeviceType switch hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut alias einen besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann. Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.

    Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?

    Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:

    • wenn nichts bei alexa-fhem ankommt: port forwarding prüfen
    • wenn lambda.js nichts los wird: im cloudwatch log nachsehen
    • wenn bei lambda.js nichts ankommt: den trigger prüfen


    Zunächst sollte man sich unter http://aws.amazon.com das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger. Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf Triggers klicken und mit Add trigger erneut einen anlegen. Hier muss, wie in der Anleitung unter AWS Lambda Funktion anlegen Punkt 7, die Application Id stehen und der Haken bei Enable trigger gesetzt sein. Dann alexa-fhem neu starten. Wenn ihr Änderungen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt. Fürs Debugging empfiehlt es sich, alexa-fhem in einer Konsole laufen zu lassen, um eingehende Anfragen mitverfolgen zu können.


    Es kann sein, dass immer noch keine Log im Cloudwatch ([2]) zu sehen ist. In dem Fall hilft es, eine neue Role Policy anzulegen.

    • in der AWS Console [3] oben links auf Services klicken, und in der Gruppe "Security, Identity & Compliance" auf IAM klicken
    • links auf Roles klicken
    • Auf dem Knopf "Create Role" klicken
    • AWS Services > Lambda auswählen, unten auf Next:Permissions klicken
    • im Filter / Policy Type, "log" eintragen (ohne quotes)
    • CloudWatchLogsFullAccess hacken, auf Next:Review unten klicken
    • Name vergeben und mit "Create role" bestätigen
    • Oben links auf Services klicken, und in der Gruppe "Compute", auf Lambda klicken
    • auf den Name der Funktion klicken
    • Reiter Configuration auswählen
    • in Existing Role, den neukreierten Role auswählen
    • oben auf Save (und Testen wenn gewünscht) klicken.

    Schon sollte eine neue Gruppe im Cloudwatch sichtbar sein. Die Suche von den Devices in Alexa wiederholen, und die Logs analysieren

    Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?

    Info green.pngDer User in der User= Directive von alexa.service muss Ausführungsrecht auf dem alexa binary haben (x), so wie auch mind. Lesezugriff auf dem Verzeichnis nach -U Option in der ExecStart= Directive und auch auf dem WorkingDirectory

    Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei alexa muss ausführbar sein. Also z.B. so:

    2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa
    

    Sollte dies nicht der Fall sein bitte mit:

    chmod +x alexa
    

    die Datei ausführbar machen. Sofern der User "pi" Eigentümer ist, ist kein sudo erforderlich.

    Eine lauffähige Konfiguration ist hier zu sehen.

    Ein Fehler in der Rechtekonfiguration führt in der Regel zu folgendem Ergebnis nach sudo systemctl status alexa:

       Loaded: loaded (/etc/systemd/system/alexa.service; enabled)
       Active: activating (auto-restart) (Result: exit-code) since mer. 2017-09-06 02:33:23 CEST; 3s ago
      Process: 18332 ExecStart=/opt/fhem/alexa-fhem/bin/alexa -U /home/alexa/.alexa (code=exited, status=217/USER)
     Main PID: 18332 (code=exited, status=217/USER)
    

    Wie kann ich via Alexa-FHEM auf FHEM zugreifen, wenn der Port mit Benutzername/Kennwort geschützt ist?

    Hierzu muss die Datei ~/.alexa/config.json geöffnet werden und der Abschnitt "connections" um folgende Zeile ergänzt werden:
            "auth": {"user": "fhem", "pass": "fhempassword"},
    Bei Verwendung von SSL bei FHEM muss auch noch
            "ssl": true,
    hinzugefügt werden

    Weitergehende Informationen