Google Home/Assistant FHEM Connector
ghome-fhem verbindet FHEM mit Google Assistant und erlaubt dadurch die Nutzung der FHEM Geräte in Verbindung mit jedem Google Assistant fähigem Gerät. Dies ist ein Fork des ursprünglich von yanniks bereitgestellten Repositories. Ein großes Danke für seine Entwicklung!
Vorbereitende Arbeiten
-
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
#pwgen - optional zum generieren von Passwörtern
sudo apt-get -qq install pwgen
sudo apt-get -qq install curl
#NPM installieren -- Achtung, sudo curl bis sudo -E bash - ist eine Zeile
sudo curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get -qq install nodejs
- Ein (Test)-Gerät in Fhem anlegen In FHEM ein Gerät dem Google Home Raum zuordnen
attr Office 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 Office genericDeviceType switch
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)
- Account bei ddnss.de anlegen
- Autoupdate der IP einrichten
sudo crontab -e
39 * * * * /usr/bin/wget -q -O - "https://ddnss.de/upd.php?key=CHANGEME&host=CHANGEME.ddnss.de"
- 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)
- https://console.actions.google.com/ Add/import project auswählen
- Projektname FHEM-Connector
- Home Control auswählen
- Smart home auswählen
- 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
- 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
- Add Action - Add your first Action
Zertifikat erstellen
Wenn bereits Zertifikate vorhanden sind können diese verwendet werden. Ansonsten können diese mit Letsencrypt erstellt werden.
Letsencrypt installieren
- 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
- Eigentliche Installation
sudo apt-get -qq install certbot
letsencrypt Zertifikat für diesen Host erstellen (unbedingt notwendig, ohne gültiges Zertifikat geht nichts!)
- 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 >
- 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.
- Port 80 Weiterleitung entfernen
- 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
- 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.
- Im Ordner folgendes Kommando ausführen:
cd $HOME/ghome-fhem
npm install
- config.json kopieren
cd $HOME
mkdir .ghome
cp ghome-fhem/config-sample.json .ghome/config.json
- /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": "<change_me___oauthClientId>",
"oauthClientSecret": "<change_me___oauthClientSecret>",
"oauthUsers": {
"<change_me___oauthUser>": {
"password": "<change_me___password>",
"authtoken": "<change_me___authtoken>"
}
}
},
"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"
}
]
}
- letsencrypt Zertifikat kopieren
cd $HOME/.ghome
sudo cp /etc/letsencrypt/live/<change_me___domain>/privkey.pem $HOME/.ghome/key.pem
sudo cp /etc/letsencrypt/live/<change_me___domain/fullchain.pem $HOME/.ghome/cert.pem
sudo chown pi *.pem
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
#Gruppe für Letsencrypt
sudo addgroup lecert
#ghome-User der Gruppe zuweisen
usermod -a -G lecert ghomeUsr
#Gruppe setzen
chown -R root:lecert /etc/letsencrypt/
#Letsencrypt der Gruppe lecert erlauben (lesen)
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 >>>>
- Frontend mit folgenden Befehlen installieren
cd $HOME/ghome-fhem/frontend
sudo npm install -g bower
bower install
cd ..
-
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.
-
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": "<change_me__domain>"
}
},
"locale": "de"
}
- 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/gactions
chmod +x gactions
./gactions update --action_package action.json --project <change_me__google_project_ID>
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, schalte <gerät> ein”
- “ok google, schalte das Licht im Raum aus”
- “ok google, stell die Temperatur in auf Grad”
- “ok google, dimme das Licht in Raum auf Prozent”
- “ok google, wie warm ist es in ?“
- “ok google, ist das Licht in an?“