ghome-fhem ist ein eigenständig gestartetes Programm, das eine vom Google-Assistant aufgerufenen Webschnittstelle bereitstellt und die darüber empfangenen Befehle in natürlicher Sprache als fhem Befehle an fhem weiterleitet. Es ermöglicht damit die Nutzung der FHEM Geräte in Verbindung mit jedem Google Assistant fähigem Gerät (Google Home, Handy mit Google Assistant, Smartwatch mit WearOS, usw.). Dies ist ein Fork des ursprünglich von yanniks bereitgestellten Repositories. Ein großes Danke für seine Entwicklung!
Sicherung der aktuellen Installation. Beim Raspberry die SD-Karte, ansonsten Backup zum System passend.
Fehlende Pakete installieren. Je nach Distribution können Pakete fehlen.
sudo apt-get -qq install git
sudo apt-get -qq install pwgen
sudo apt-get -qq install curl
sudo curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get -qq install nodejs
3. Ein (Test)-Gerät in Fhem (>= Version 5.9!!!) dem GoogleHome Raum hinzufügen
In FHEM ein Gerät dem Google Home Raum zuordnen. Über den Raum erfolgt später die Filterung der von ghome-fhem angesteuerten Geräte. Es werden nur Geräte erkannt, die diesem Raum (GoogleHome) zugeordnet sind.
attr Kaffeemaschine room GoogleHome
userattr genericDeviceType in FHEM anlegen
attr global userattr genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock
den zu schaltenden Devices das Attribut genericDeviceType zuordnen
attr Kaffeemaschine genericDeviceType switch
Die Geräte können über den Devicename, den im alias Attribut definierten Namen oder einem in der Google Home App hinterlegten Spitznamen bei der Steuerung verwendet werden. Ich empfehle hier das alias Attribut zu verwenden und nicht die Spitznamen in der Google Home App. Das erspart Arbeit wenn man die Geräte einmal komplett neu synchronisiert.
## Passwörter und Benutzernamen (mit pwgen) erstellen
Im Beispiel wird pwgen verwendet. Es kann auch jeder Passwortgenerator online verwendet werden.
| Feldame in der Anleitung | pwgen Befehl | Beispiel |
|---|---|---|
|<change_me___oauthClientId>|pwgen -N 1 -s 42 | m5taWv7ZSZL9ROJ3D1wY12s9V6VKckkluHtdKMxQsd |
|<change_me___oauthClientSecret>|pwgen -N 1 -s 42 |G9T0TKc0qdrzWwYHurecO0IZYUf93qB80nJPZ4XAcx |
|<change_me___oauthUser>|pwgen -N 1 -s 8 | wDgsn36x|
|<change_me___password>|pwgen -N 1 -s 42 | WqoHFS0FzNzeEfPPwvC5gRAnZCt5vvM8LVEF3aL4LQ |
|<change_me___authtoken>| pwgen -N 1 -s 42 | agUACUoaCFQt2qFLcKzY2J0FDAOyIcjsGcOckpVBEo |
## Domain registrieren z.B. bei ddnss.de (gratis)
1. Account bei ddnss.de anlegen
2. Autoupdate der IP einrichten
sudo crontab -e
39 * * * * /usr/bin/wget -q -O - "https://ddnss.de/upd.php?key=CHANGEME&host=CHANGEME.ddnss.de"
2. Alternativ kann den Update der IP auch der Router übernehmen wenn er diese Funktion bietet (z. B. Fritzbox). Anleitungen bieten die Anbieter des dyndns-Dienstes (FAQ).
Diese Domain wird in nachfolgender Anleitung <change_me__domain> genannt.
## Google Action Projekt erstellen
Hierfür werden die ersten beiden Werte (Hashwerte) von oben benötigt
| Feldame in der Anleitung | pwgen Befehl | Beispiel |
|---|---|---|
|<change_me___oauthClientId>|pwgen -N 1 -s 42 | m5taWv7ZSZL9ROJ3D1wY12s9V6VKckkluHtdKMxQsd |
|<change_me___oauthClientSecret>|pwgen -N 1 -s 42 |G9T0TKc0qdrzWwYHurecO0IZYUf93qB80nJPZ4XAcx |
Screenshots der einzelnen Schritte im "doc"-Ordner ([Google_Actions.docx](docs/Google_Actions.docx))
1. https://console.actions.google.com/ Add/import project auswählen
2. Projektname FHEM-Connector
3. Home Control auswählen
4. Smart home auswählen
5. Overview - Quick Setup
- Name your Smart Home action: FHEM Connector
- Add account linking
- Account creation: No, I only want to allow account creation on my website
- Linking type: OAuth, Authorization code
- Client information: ClientID (oauthClientId) und ClientSecret (oauthClientSecret) aus der config.json verwenden
- Client information: Authorization URL (https://CHANGEME.ddnss.de/oauth), Token URL (https://CHANGEME.ddnss.de/token)
- Testing instructions: "Schalte das Licht ein" eintragen
6. Overview - Build your Action
- Add Action - Add your first Action
- Create smart home action: URL https://CHANGEME.ddnss.de
- Test Actions in the simulator
- Testing rechts oben aktivieren, wenn nicht automatisch passiert
## Zertifikat erstellen
Wenn bereits Zertifikate vorhanden sind können diese verwendet werden. Ansonsten können diese mit Letsencrypt erstellt werden.
Letsencrypt installieren
1. Source zu apt hinzufügen
echo "deb http://ftp.debian.org/debian stretch-backports main" | sudo tee -a /etc/apt/sources.list.d/letsencrypt.list sudo apt-get -qq update
2. Eigentliche Installation
sudo apt-get -qq install certbot
letsencrypt Zertifikat für diesen Host erstellen (unbedingt notwendig, ohne gültiges Zertifikat geht nichts!)
1. Port 80 auf RPi weiterleiten. Das muss am Router (z. B. Fritzbox) gemacht werden. Hierzu den externen Port 80 zum internen Port 80 auf den Raspberry weiterleiten. < Internet > -->Port 80--> < Router > -->Port 80--> < Raspberry >
2. certbot ausführen und Fragen beantworten. Der Parameter "--standalone" startet einen eigenen, temporären Webserver. Wenn nginx oder apache auf dem Server läuft diesen entweder beenden, oder certbot für den entsprechenden Webserver aufrufen. Anleitungen hierzu auf der Herstellerseite https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx.html
sudo certbot certonly --standalone --agree-tos
Fragen bestätigen bzw. Informationen eintragen. Hier wird auch die <change_me___domain> benötigt.
3. Port 80 Weiterleitung entfernen
4. Bei jedem Zertifikatsrenew (certbot renew) muss Port 80 wieder weitergeleitet werden (alle 3 Monate)
https://certbot.eff.org/lets-encrypt/debianstretch-other
## ghome-fhem installieren
1. GitHub repo lokal auschecken
cd $HOME git clone https://github.com/dominikkarall/ghome-fhem
Jetzt sollte es Ordner /home/pi/ghome-fhem mit dem Inhalt des Git-Projektes geben. Wenn das Setup nicht mit dem User pi ist der Username "pi" durch den enstsprechenden Namen zu ersetzen.
2. Im Ordner folgendes Kommando ausführen:
cd $HOME/ghome-fhem npm install
3. config.json kopieren
cd $HOME mkdir .ghome cp ghome-fhem/config-sample.json .ghome/config.json
4. /home/pi/.ghome/config.json anpassen
Im Beispiel alle <change_me__xxxx> durch generierte Zeichenfolge ersetzen. So stellt ihr sicher, dass der Zugang für unbefugte Personen zumindest erschwert wird.
{
"ghome": {
"port": 3000,
"name": "Google Home",
"keyFile": "/home/pi/.ghome/key.pem",
"certFile": "/home/pi/.ghome/cert.pem",
"nat-pmp": "",
"nat-upnp": false,
"oauthClientId": "
"connections": [
{
"name": "FHEM",
"server": "127.0.0.1",
"port": "8083",
"webname": "fhem",
"filter": "room=GoogleHome"
}
]
}
Mit den Beispielwerten von oben würde die Datei so aussehen ...
{ "ghome": { "port": 3000, "name": "Google Home", "keyFile": "/home/pi/.ghome/key.pem", "certFile": "/home/pi/.ghome/cert.pem", "nat-pmp": "", "nat-upnp": false, "oauthClientId": "m5taWv7ZSZL9ROJ3D1wY12s9V6VKckkluHtdKMxQsd", "oauthClientSecret": "G9T0TKc0qdrzWwYHurecO0IZYUf93qB80nJPZ4XAcx", "oauthUsers": { "wDgsn36x": { "password": "WqoHFS0FzNzeEfPPwvC5gRAnZCt5vvM8LVEF3aL4LQ", "authtoken": "agUACUoaCFQt2qFLcKzY2J0FDAOyIcjsGcOckpVBEo" } } },
"connections": [
{
"name": "FHEM",
"server": "127.0.0.1",
"port": "8083",
"webname": "fhem",
"filter": "room=GoogleHome"
}
]
}
4. letsencrypt Zertifikat kopieren
cd $HOME/.ghome
sudo cp /etc/letsencrypt/live/
Hinweis: Bei jeder Erneuerung der Zertifikate müssen diese wieder in /home/pi/.ghome kopiert werden.
4b. letencrypt Zertifikate ohne kopieren einbinden
<<<<--A L T E R N A T I V--Z U--4 >>>>
Linux know-how nötig
Hierzu nur ein paar Ansätze .. es ist empfohlen in diesem Falle ghome unter einem eigenen User (nicht pi) zu starten.
Annahme:
- User unter dem ghome läuft ghomeusr
- Gruppe nur für den lesenden Zugriff auf die Zertifikate lecert
sudo addgroup lecert
usermod -a -G lecert ghomeUsr
chown -R root:lecert /etc/letsencrypt/
chmod g+r -R /etc/letsencrypt/
Einschränkung des Users ghomeUsr
- normaler User
- kein, oder eingeschränkte sudo
- kein passwort (logon nicht möglich)
- keine Shell hinterlegt (/bin/false, somit auch kein su)
Vorteil: Zertifikat muss beim Erneuern nicht jedes mal kopiert werden.
In der config.json müssen dann die Zeilen "keyFile" und "certFile" angepasst werden.
"keyFile": "/etc/letsencrypt/<change_me__domain>/privkey.pem" ,
"certFile": "/etc/letsencrypt/<change_me__domain>/fullchain.pem",
<<<< A L T E R N A T I V--Z U--4 ---- E N D E >>>>
5. Frontend mit folgenden Befehlen installieren
cd $HOME/ghome-fhem/frontend sudo npm install -g bower bower install cd ..
6. Port 443 (extern) auf 3000 (intern, auf Raspberry oder Server) weiterleiten. Auch das muss wieder am Router gemacht werden. Hier ist zu beachten, dass sich externer und interner Port unterscheidet.
7. Systemd Dienst einrichten
cd $HOME sudo cp ghome-fhem/ghome-sample.service /lib/systemd/system/ghome.service
Inhalt des Scripts (bereits vorhanden). Wenn ghome unter einem anderen User laufen soll, muss pi durch den Usernamen ersetzt werden (3 mal enthalten)
[Unit] Description=Google Assistant FHEM Connector After=network-online.target
[Service] Type=simple User=pi WorkingDirectory=/home/pi/ghome/ghome-fhem ExecStart=/home/pi/ghome/ghome-fhem/bin/ghome Restart=on-failure
[Install] WantedBy=multi-user.target Alias=ghome.service
Service aktivierte damit ghome bei einem Systemstart mitgestartet wird
sudo systemctl enable ghome.service
Testen mit start (starten), stop (stoppen), status (Status wird angezeigt. Wenn der Diest läuft sollte ein grüner Punkt vor dem Prozess sein)
sudo systemctl start ghome sudo systemctl status ghome sudo systemctl stop ghome
## Google action und lokalen Server bekannt machen
Den Inhalt der action.json kopieren und <change_me__domainname> durch die Domain die registriert wurde ersetzen (im Beispiel ddnss.de). Unter welcher der Dienst bei euch erreichbar ist.
action.json kopieren
cd $HOME cp ghome-fhem/action-sample.json .ghome/action.json
Inhalt von .ghome/action.json anpassen - <change_me__domain>
{
"actions": [
{
"name": "actions.devices",
"deviceControl": {
},
"fulfillment": {
"conversationName": "automation"
}
}
],
"conversations": {
"automation": {
"name": "automation",
"url": "
8. gactions downloaden und ausführen
Download von hier: https://developers.google.com/actions/tools/gactions-cli
In diesem Codeblock wird die ARM Version (Raspberry) mit wget heruntergeladen.
<change_me_project_ID> ist der technische Name der Action bei Google. Letze Seite im Word Dokument (doc/Google_Actions.docx)
cd $HOME/.ghome
wget -c https://dl.google.com/gactions/updates/bin/linux/arm/gactions
chmod +x gactions
./gactions update --action_package action.json --project
Verknüpfung bestätigen
pi@debian964:~/.ghome$ ./gactions update --action_package action.json --project fhem-connector-a99ds Gactions needs access to your Google account. Please copy & paste the URL below into a web browser and follow the instructions there. Then copy and paste the authorization code from the browser back here. Visit this URL: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=257807841406-o6vu1tgkq8oqjub8jilj6vuc396e2d4d.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Factions.builder&state=state Enter authorization code:
Link in einem Browser öffnen. Zugriff von actions.cli auf Google-Account erlauben.
Es erscheint eine Erfolgsmeldung und der authorization code (Beispiel: 4/TAcdJS4FZJw9J_5V0SKrGYdhi67e5t8fVZvujgdaJg2-9a_AP-8OiTa
Diesen in der Konsole bei "Enter authorization code:" eintragen.
Erfolgsmeldung
"Your app for the Assistant for project fhem-connector-940ff was successfully updated with your actions."
Fertig.
Bei Fehler kann folgendes geprüft werden:
- Zeritifikat gültig: https://<replace_me___domain> im Browser öffnen. Neben dem Link sollte ein grünes Schloss (je nach Browser) erscheinen. Wenn statt dessen eine Zertifikatswarnung erscheint --> Zertifikatsproblem
- Richtige project_id eingetragen?
## Google Home App einrichten
In der Google Home-App auf einem Smartphone oder Tablet lässt sich nun im Smart Home-Bereich ein neuer Gerätetyp hinzufügen. In der Liste aller Typen taucht jetzt auch euer eigener auf, er beginnt mit [test].
Eventuell müsst ihr euer Konto mehrmals verknüpfen, bei mir hat es nicht immer beim ersten mal geklappt.
Login
<change_me___oauthUser>
<change_me___password>
Accounts now linked.
## Mögliche Kommandos
* "ok google, synchronisiere meine Geräte" - Damit werden neu hinzugefügte Geräte in Google Assistant erkannt.
* “ok google, schalte <gerät> ein”
* “ok google, schalte das Licht im Raum <raum> aus”
* “ok google, stell die Temperatur in <raum> auf <wert> Grad”
* “ok google, dimme das Licht in Raum <raum> auf <anzahl> Prozent”
* “ok google, wie warm ist es in <raum>?“
* “ok google, ist das Licht in <raum> an?“