Google Assistant FHEM Connect

Aus FHEMWiki
Wechseln zu: Navigation, Suche

Egal ob iOS, Android, Google Home oder WearOS, mit FHEM Connect kannst du deine FHEM Geräte per Google Assistant und Google Home App (Google PlayStore, Apple AppStore) von überall aus steuern.

NEWS: FHEM Connect ist ab sofort offiziell in der Google Home App verfügbar!

Ich würde mich über positive Bewertungen von FHEM Connect freuen:

https://assistant.google.com/services/a/uid/0000000062f42fd8?hl=de


Google Assistant FHEM Connect
Zweck / Funktion
Anbindung von FHEM an Google Assistant
Allgemein
Typ Inoffiziell
Details
Dokumentation Thema
Support (Forum) Frontends/Sprachsteuerung
Modulname 39_gassistant
Ersteller dominik
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


News

19.07.2019

  • Unterstützung mehrerer FHEM Instanzen in der gassistant-fhem.cfg

07.07.2019

  • PIN Abfrage wird für alle Geräte unterstützt, siehe Konfiguration
  • Timer wird für alle Geräte mit on-for-timer unterstützt

06.07.2019

  • FanSpeed wird nun für alle Geräte unterstützt, siehe Konfiguration

25.05.2019

  • gassistant-fhem 2.0.0 released
  • Bugfix: Mehrfache Befehlsausführung
  • Das Update beinhaltet ein paar Optimierungen und lädt die nodejs Files vom Server, damit sollte zukünftig bei Updates nur ein Neustart von gassistant-fhem notwendig sein

10.05.2019

02.05.2019

  • gassistant-fhem Client 1.3.6 released
  • Das Update beinhaltet einen Fix für das mehrmalige Ausführen des gleichen Commandos in FHEM

17.04.2019

  • gassistant-fhem Client 1.3.5 released

28.03.2019

  • FHEM Connect ist offiziell in der Google Home App verfügbar

17.03.2019

  • gassistant-fhem < 1.3.0 wird nicht mehr unterstützt
  • genericDeviceType contact, security wird als switch angelegt
  • ROOMMATE, GUEST wird als light unterstützt (als light deshalb, weil das in der Home App gruppiert angezeigt wird)
  • Rolläden werden ebenfalls ab sofort unterstützt, sind aber nicht über die App steuerbar (da muss Google noch nacharbeiten)

Hintergrundinfos

FHEM Connect basiert auf Google Firebase, welches die Plattform für die Kommunikation mit Google bietet. Der lokal installierte fhemconnect Client kommuniziert mit Google Firebase und übermittelt von dort die Daten an Google. Das hat 3 große Vorteile:

  • Keine Portfreigaben notwendig
  • Kommunikation läuft gesichert über HTTPS und die Authentifizierung über Auth0 mittels OAuth2
  • Neue Funktionalitäten, wie zum Beispiel die Unterstützung von neuen Devices, sind immer gleich verfügbar sobald diese im Firebase Projekt implementiert wurden. Man muss also nicht regelmäßig aktualisieren um in den Genuss von neuen Google Assistant Features zu kommen.
  • Aktuell wird die Installation von dominik betrieben. Nur Google und dominik haben administrative Berechtigungen auf Firebase und könnten daher theoretisch beliebige FHEM Kommandos schicken.
  • Jeder User agiert in einem eigenen Bereich der Firebase Datenbank.
  • europe-west1-fhem-ga-connector.cloudfunctions.net ist dominiks Firebase Cloud Functions Endpoint für die Aufrufe der Funktionen.

Unterstütze Geräte

Google unterscheidet zwischen Traits und Device Types. Traits sind Funktionen (on/off, dimmen, ...) die ein Geräte beliebigen Typs unterstützen kann. Device Types dienen nur zur Darstellung in der Home App und der Steuerung über den Gerätetyp per Sprache (z.B. "Schalte die Waschmaschine ein", der Name der Waschmaschine muss nicht genannt werden).

Die gesamte Liste der von Google bereitgestellten Traits findet man hier: https://developers.google.com/actions/smarthome/traits/

Folgende Traits werden durch Google Assistant FHEM Connect unterstützt:

  • ArmDisarm
  • Brightness
  • ColorSetting
  • Dock
  • FanSpeed
  • Locator
  • Modes (nur Englisch)
  • OnOff
  • Scene
  • StartStop
  • TemperatureSetting
  • Toggles (nur Englisch)

Die gesamte Liste der von Google unterstützten Device Types findet man hier: https://developers.google.com/actions/smarthome/guides/ Der Device Type muss im Normalfall nicht über genericDeviceType gesetzt werden, da FHEM Connect diesen in den meisten Fällen automatisch erkennt.

Um ein einfaches dummy Device in Google Assistant zu integrieren, benötigt es nur ein on,off Command (nicht webCmd, sondern setList!!).

Attribute

Folgende Attribute werden von Google Assistant FHEM Connect genutzt:

  • genericDeviceType
  • assistantName (Name des Devices bei Google, soll zukünftig auch von anderen Assistenten benutzt werden)
  • gassistantName (Name des Devices bei Google)
  • realRoom (Raum welcher beim ERSTEN Synchronisieren an Google übergeben wird)
  • homebridgeMapping (Bitte nur verwenden, wenn es ohne homebridgeMapping nicht funktioniert)

Installation

FHEM Connect in der Home App
  1. Vorraussetzung: Raspbian/Debian stretch mit installiertem nodejs, jessie wird nicht supported. Buster ist noch nicht getestet!
    $ npm -v
    6.9.0
    $ node -v
    v8.11.1
    
  2. FHEM mit update all auf den letzten Stand bringen. FHEM muss zwingend aktuell sein. Letztes Update sollte nicht älter als 03.02.2019 sein.
  3. gassistant-fhem installieren und einrichten:
    Dazu auf der Konsole folgenden Befehl ausführen
    sudo npm install -g gassistant-fhem --unsafe-perm
    
  4. Connector in FHEM definieren:
    Dazu in FHEM folgenden Befehl ausführen
    define gassistant gassistant
    
  5. Es wird automatisch ein Raum GoogleAssistant erstellt.
  6. Ca. 30s warten bis ein Reading gassistantFHEM.loginURL erscheint. Wenn der Link nicht erscheint, dann bitte in der Konsole einmal "gassistant-fhem" ausführen und die Fehlermeldung beachten. Gerne diese im Forum posten.
  7. Link öffnen und einloggen (Empfehlung: Login with Google)
  8. Den erhaltenen authcode in FHEM hinterlegen (set gassistant authcode ............)
  9. Falls ihr euren Webzugriff mit einer Authentifizierung sichert, dann ist noch das gassistantFHEM-auth Attribut auf username:passwort zu setzen
  10. Home App öffnen, + auswählen, Gerät einrichten, "Du hast bereits Geräte eingerichtet?" auswählen, FHEM Connect auswählen und wieder einloggen (Empfehlung: Login with Google)
  11. Paar Sekunden warten, danach sollte ein Testlight in der Home App steuerbar sein, welches in FHEM im Raum GoogleAssistant zu finden ist.


Wenn ihr danach neue Geräte dem Raum hinzufügt, werden diese automatisch von Google verarbeitet. Es dauert teilweise eine Minute bis die neuen Geräte in der Home App erscheinen.

Bitte achtet darauf, dass die Geräte bereits vor dem Hinzufügen in den Raum richtig benannt sind. Eine Namensänderung (alias) muss sonst über einen reload (set gassistant reload) getriggert werden.

Beim 'reload' wird alles für euch erledigt, ihr müsst/sollt keinen Sync zu Google manuell starten. Wartet einfach eine Minute und dann sollten alle Geräte in der Home App erscheinen.

Konfiguration

FHEM Connect ist so implementiert, dass möglichst wenig selbst konfiguriert werden muss. Es wird versucht alle Geräte ohne homebridgeMapping zu unterstützen und damit den Aufwand zur Einrichtung minimal zu halten.


Wenn ihr homebridgeMapping für Alexa oder Siri verwendet, bitte unbedingt einen Zeilenumbruch zwischen den Mappings verwenden und kein Leerzeichen!


Ein paar wenige Einstellungen lassen sich jedoch nicht automatisch erkennen und daher können diese bei Bedarf selbst eingerichtet werden, hier die Liste dazu:

Trait homebridgeMapping Default Beschreibung Beispiele Google Dokumentation
ArmDisarm ArmDisarm=exitAllowance=10 ArmDisarm=exitAllowance=60 Zeit bis zur Aktivierung der Alarmanlage Aktiviere die Alarmanlage https://developers.google.com/actions/smarthome/traits/armdisarm
FanSpeed Beispiel

FanSpeed={"reading": "state", "speeds": { "S1": { "cmd": "low", "value":"low", "synonyms": {"de": ["langsam", "stufe 1"], "en": ["slow", "speed 1"]}},"S2": { "cmd": "mid", "value":"balanced", "synonyms": {"de": ["mittel", "stufe 2"], "en": ["medium", "speed 2"]}},"S3": { "cmd": "high", "value":"high","synonyms": {"de": ["maximum", "stufe 3"], "en": ["maximum", "speed 3"]}}}, "ordered": true, "reversible": false}

Xiaomi Vacuum (leise, mittel, maximum) Es können beliebige Speed Namen und beliebig viele Speeds hinterlegt werden, wichtig ist nur, dass alles in einer Zeile steht! Stelle den Ventilator auf Maximum.

Stelle den Lüfter vom Saugroboter auf leise.

https://developers.google.com/actions/smarthome/traits/fanspeed
Timer - - Timer für alle Geräte mit on-for-timer Kommando. Bei dummy Devices müsst ihr nur das Attribut useSetExtensions auf 1 setzen. Starte den Ventilator für 2 Stunden. https://developers.google.com/actions/smarthome/traits/timer
PIN Beispiel

ArmDisarm=pin=1234

- Kann bei jedem Trait gesetzt werden. Gilt dann nur für diesen einen Trait. Deaktiviere die Alarmanlage. https://developers.google.com/actions/smarthome/develop/two-factor-authentication

Update

Es wird nur in seltenen Fällen ein Update benötigt, da der größte Teil der Anwendung in Firebase konfiguriert ist. Sollte der Client dennoch aktualisiert werden müssen, dann kann das mit folgenden Befehlen durchgeführt werden:

sudo npm install -g gassistant-fhem --unsafe-perm
  • gassistant über FHEM neu starten

Architektur

  • fhemconnect Client

Lokale installierter Client der die Verbindung zu FHEM herstellt.

  • Auth0

Auth0 wird sowohl von fhemconnect Client als auch von Google Assistant genutzt um den User zu authentifizieren. Damit erhält der User eine eindeutigen User ID.

  • Firebase ("zentralerer Server", obwohl es Server-less betrieben wird)
  • Firebase Firestore

Datenbank in welcher die Geräteinformationen gespeichert werden.

  • Firebase Realtime DB

Datenbank in welcher der aktuelle Status der Geräte gespeichert wird.

  • Firebase Cloud Functions

Die Cloud Function stellt einen Webaufruf im Internet zur Verfügung. Google ruft direkt eine solche Cloud Function auf. Des Weiteren wird diese auch für die Kommunikation vom fhemconnect Client zum Firebase Projekt ("Server") genutzt.

Datenfluss

Der Datenfluss und die Arbeitsweise von FHEM Connect wird anhand des folgenden Beispiels erklärt:

  • Bei der Verknüpfung des Google Accounts mit FHEM Connect wird der Service von auth0 herangezogen. Dieser authentifiziert den User und generiert einen Access und Refresh Token mit welchem Google sich gegenüber FHEM Connect (“dem zentralen Service”) authentifiziert.
  • Bei der Installation des fhemconnect Clients wird ebenso auth0 herangezogen. Der User wird auch dort über auth0 authentifiziert und damit kann sich auch fhemconnect am zentralen Service anmelden.
  • Durch dieses Verfahren kann FHEM Connect die User ID aus dem fhemconnect Client und die User ID die über Google kommt matchen und damit Befehle dem richtigen User zuordnen. Ein Faken dieser User ID ist nicht möglich, da der übertragene Token (JSON Web Token) signiert ist und bei jeder Übertragung von auth0 verifiziert wird.
  • Durch die Verknüpfung des Accounts weiß Google, dass es FHEM Connect gibt und es dorthin Smart Home Befehle schicken kann.
  • Ein Befehl wie "Schalte das Nachtlicht ein" wird von Google interpretiert
  • FHEM Connect (der zentrale Service der auf Firebase läuft) erhält den Befehl das Nachtlicht einzuschalten. Durch den von Google übertragenen Access Token, welcher die User ID beinhaltet, wird der User identifiziert.
  • FHEM Connect weiß durch die User ID, welche es dem verifizierten Access Token entnommen hat, welchem User der Befehl zuzuordnen ist und schickt dieser über Firebase an den fhemconnect Client.
  • Der fhemconnect Client schickt den Befehl direkt an FHEM weiter wo der Befehl ausgeführt wird.

FAQs

Ungültiger Maschinenbefehl auf RPi1 bzw. RP Zero

Die grpc Library muss auf diesen beiden Devices selbst kompiliert werden, dazu ist folgender Befehl auszuführen (kann ca. 2h dauern!):

npm rebuild --build-from-source --unsafe-perm grpc

FHEM Connect funktioniert bei mir nicht und ich weiß nicht weiter

Kein Problem, ich helfe gerne weiter. Bitte folgende Informationen in diesem Thread posten:

  • Logfile (links oben im gassistant Device zu finden) von Start bis zum Erreichen des Fehlers
  • Ersten 3 und letzten 3 Stellen des Readings gassistant-fhem-uid (...|AAA....BBB)
  • Name (Internals NAME) des betroffenen Gerätes
Ich kann in der Home App manche Geräte nicht steuern

Google entwickelt die Home App laufend weiter. Manche Funktionen, die zwar über Sprache funktionieren, sind in der Home App noch nicht steuerbar (z.B. Rollos).

Ich erhalte den Fehler Error: Rate limit reached - too many requests

Einfach 5 Minuten warten bis ihr das nächste Mal auf reload klickt.

Ich erhalte die Meldung, dass für mein Gerät ein Software Update nötig ist.

In diesem Fall ist ein Update für gassistant-fhem notwendig. Der Updateprozess ist im Abschnitt Update beschrieben.

Geräte werden in Google Home doppelt angezeigt oder der Sprachassistent fragt welches der Geräte verwendet werden soll.

Man erkennt den Fehler auch in dem man im gassistant-fhem Log die EXECUTE Logs ansieht. Erscheinen diese zu einem Befehl mehrfach, so liegt das Problem an doppelten Geräten bei Google. Lösung: Am Abend die Account Verknüpfung in der Google Home App auflösen. Am nächsten Tag kurz nach 9 Uhr die Account Verknüpfung wiederherstellen.

FHEM ist durch Username und Password gesichert (401: Authorization Required)

gassistant-fhem.cfg im fhem Installationsordner mit user/pass und wenn nötig SSL erweitern

"connections": [
   {
       "name": "FHEM",
       "server": "127.0.0.1",
       "auth": {"user": "fhemuser", "pass": "fhempassword"},
       "ssl": true,
       "port": "8083",
       "filter": "room=GoogleAssistant"
   }
]
"Method Not Allowed" Fehlermeldung bei der npm Installation?
sudo npm install -g npm
Geräte erneut an Google übertragen

"Hey Google, synchronisiere meine Geräte" sagen

Wie kann meine Familie auf die Geräte zugreifen?

In der Home App kann man mit den + Symbol auch Familienmitglieder hinzufügen. Damit haben dann die Familienmitglieder in deren Home App ebenfalls Zugriff auf die Geräte.

Beim Starten kommt ein Fehler in dem "async" hervorgehoben ist.

Stelle sicher, dass du die aktuelle nodejs Version hast. Es sollte zumindest >= 8 sein (node -v liefert dazu die Antwort).

sudo apt update && sudo apt install nodejs
Ich möchte den Raum meiner Geräte nicht ändern

Man kann die Ermittlung der über Google verfügbaren Geräte auch über die group durchführen. Dazu muss dann in den Verbindungseinstellungen der filter room=GoogleAssistant durch zB group=ghomeDevice ersetzt werden. Eine weiteren Möglichkeit ist das Zuordnen von zwei Räumen in FHEM für ein Gerät zB attr MediacenterKodi room Wohnzimmer,GoogleAssistant

Ich möchte gassistant-fhem nicht global installieren oder habe nicht die Berechtigung dazu

Um gassistant-fhem nur Änderungen am Ordner, in dem es installiert wurde, machen zu lassen muss der Installationsbefehl

npm install gassistant-fhem

sein. Gestartet wird es dann aus dem Installationsordner mit dem Befehl node_modules/gassistant-fhem/bin/gassistant-fhem Die Konfigurationsdatei für die FHEM-Verbindung ist dann unter ~/.fhemconnect/config.json

Kostenlos

Aktuell wird der Service kostenlos betrieben. Abhängig von der Auslastung, könnte es zukünftig der Fall sein, dass die freien Limits bei Firebase und Auth0 überstiegen werden und damit Kosten anfallen. Solange das nicht der Fall ist, wird der Service kostenlos zur Verfügung gestellt.

Wer das Projekt mit Spenden unterstützen will: https://paypal.me/todominik