Google Assistant FHEM Connect: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „'''FHEM Connect''' ist eine Weiterentwicklung von Alexa FHEM speziell für den Google Assistant. Mit FHEM Connect ist die Verknüpfung von FHEM…“) |
|||
(152 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
FHEM Connect verbindet FHEM mit dem Google Assistant ohne mühsame Konfiguration mit wenigen Klicks. Du kannst FHEM Connect am iPhone, Android Device, Google Home, Google Nest, WearOS Smartwatch, Chromebook und mit vielen anderen Devices mit integrierten Google Assistant nutzen. Mit FHEM Connect kannst du deine FHEM Geräte per Google Assistant und Google Home App ([https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app Google PlayStore], [https://itunes.apple.com/de/app/google-home/id680819774?mt=8 Apple AppStore]) von überall aus steuern. | |||
'''FHEM Connect ist von Google zertifiziert und offiziell in der Google Home App verfügbar! Local Home SDK wird ebenfalls unterstützt.''' | |||
Ich ([[Benutzer:Dominik|Dominik Karall]]) würde mich über positive Bewertungen von [https://assistant.google.com/services/a/uid/0000000062f42fd8?hl=de FHEM Connect] freuen. | |||
{{Infobox Modul | {{Infobox Modul | ||
|ModPurpose=Anbindung von FHEM an Google Assistant | |ModPurpose=Anbindung von FHEM an Google Assistant | ||
|ModType= | |ModType=h | ||
|ModTechName= | |ModCmdRef=gassistant | ||
|ModTechName=39_gassistant.pm | |||
|ModForumArea=Frontends/Sprachsteuerung | |ModForumArea=Frontends/Sprachsteuerung | ||
|ModOwner=dominik | |ModFTopic=96696 | ||
|ModOwner=dominik ({{Link2FU|15803|Forum}} / [[Benutzer Diskussion:Dominik|Wiki]]) | |||
}} | }} | ||
[[Datei:XPM_BADGING_GoogleAssistant_VER.png|rechts|rahmenlos]] | |||
==Hintergrundinfos== | ==Hintergrundinfos== | ||
Zeile 16: | Zeile 20: | ||
* Kommunikation läuft gesichert über HTTPS und die Authentifizierung über Auth0 mittels OAuth2 | * 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. | * 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). | |||
<syntaxhighlight lang="bash" style="width:70%;"> | Die gesamte Liste der von Google bereitgestellten Traits findet man hier: https://developers.google.com/actions/smarthome/traits/ | ||
sudo apt- | |||
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!!). | |||
Es werden alle Geräte unterstützt die ein on/off Command besitzen. Weitere Funktionalitäten sind für verschiedene Geräte (SamsungAV, BOSEST, SONOS, ...) implementiert. Falls ein Gerät nicht funktioniert oder zu wenig Funktionalität beinhaltet, poste bitte dein jsonlist2 DEVICE in diesem Thread: https://forum.fhem.de/index.php/topic,96696.0.html | |||
==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== | |||
[[Datei:FHEM Connect.png|600x400px|mini|rechts|FHEM Connect in der Home App]] | |||
# Voraussetzung: Aktuelle NodeJS Version installieren. libjson-perl ebenfalls, wobei das wahrscheinlich schon installiert ist.<syntaxhighlight lang="bash" style="width:70%;">$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - | |||
$ sudo apt install -y nodejs libjson-perl | |||
</syntaxhighlight> | |||
# gassistant-fhem installieren und einrichten: <br />Dazu auf der Konsole folgenden Befehl ausführen<syntaxhighlight lang="bash" style="width:70%;">sudo npm install -g gassistant-fhem --unsafe-perm</syntaxhighlight> | |||
# Connector in FHEM definieren:<syntaxhighlight lang="bash" style="width:70%;">define gassistant gassistant</syntaxhighlight> | |||
# Es wird automatisch ein Raum GoogleAssistant erstellt. | |||
# Falls ihr euren Webzugriff mit einer Authentifizierung sichert, dann muss noch das gassistantFHEM-auth Attribut auf username:passwort gesetzt werden. | |||
# Ca. 30s warten bis ein Reading gassistantFHEM.loginURL erscheint. Wenn der Link nicht erscheint, dann bitte im Log nachsehen woran es liegt (/opt/fhem/log/gassistant-fhem-*). Gerne dann im Forum posten wenn du nicht weiter kommst. | |||
# Link öffnen und einloggen (Empfehlung: Login with Google) | |||
# Den erhaltenen authcode in FHEM hinterlegen (<code>set gassistant authcode ............</code>) | |||
# 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) | |||
# 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 ein Gerät bei euch nicht funktioniert, dann bitte im Forum (Link siehe Infobox rechts oben) posten. Mein Ziel ist es so viele Geräte wie möglich ohne weitere Konfiguration zu unterstützen. | |||
'''Wenn ihr homebridgeMapping für Alexa oder Siri verwendet, bitte unbedingt einen Zeilenumbruch zwischen den Mappings verwenden und kein Leerzeichen!''' | |||
Wer mehr konfigurieren möchte oder ein paar Einstellungen selbst vornehmen will, kann folgende homebridgeMappings verwenden: | |||
{| class="wikitable" | |||
|- | |||
! Trait !! homebridgeMapping Beispiel !! Default !! Beschreibung !! Google Assistant Sprachkommandos !! Google Dokumentation | |||
|- | |||
| 2-Factor || 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 | |||
|- | |||
| ArmDisarm || ArmDisarm=exitAllowance=10 || ArmDisarm=exitAllowance=60 || Zeit bis zur Aktivierung der Alarmanlage || Aktiviere die Alarmanlage||https://developers.google.com/actions/smarthome/traits/armdisarm | |||
|- | |||
| Brightness ||<syntaxhighlight lang="json"> | |||
{ | |||
"Brightness": { | |||
"reading": "pct", | |||
"cmd": "pct" | |||
} | |||
} | |||
</syntaxhighlight>|| Wird im Normalfall automatisch erkannt. || Das Brightness Reading wird im Normalfall automatisch erkannt und muss nicht konfiguriert werden. || Stelle die Helligkeit im Wohnzimmer auf 50 Prozent. ||https://developers.google.com/actions/smarthome/traits/brightness | |||
|- | |||
| CameraStream ||<syntaxhighlight lang="json"> | |||
{ | |||
"CameraStream": { | |||
"reading": "streamurl" | |||
} | |||
} | |||
</syntaxhighlight>Wenn du eine fixe URL definieren möchtest, geht das mit<syntaxhighlight lang="json"> | |||
{ | |||
"CameraStream": { | |||
"fixedValue": "https://das.ist.die.url/zum.mp4" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| - || Die URL muss von außen erreichbar sein und in einem der folgenden Formate vorliegen: hls, dash, smooth_stream, progressive_mp4 || Zeige die Eingangskamera am Fernseher. ||https://developers.google.com/actions/smarthome/traits/camerastream | |||
|- | |||
|Channel | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"SimpleChannel": { | |||
"ORF 1": "0_macro tv,1,enter", | |||
"ORF 2,ORF zwei,ORF2": "0_macro tv,4,6,0,enter", | |||
"ServusTV,Servus TV": "0_macro tv,5,enter" | |||
} | |||
} | |||
</syntaxhighlight>oder wenn man es umfangreicher konfigurieren will<syntaxhighlight lang="json"> | |||
{ | |||
"Channel": { | |||
"availableChannels": [ | |||
{ | |||
"key": "ORF1", | |||
"names": [ | |||
"ORF 1", | |||
"ORF eins", | |||
"ORF" | |||
], | |||
"number": "1" | |||
}, | |||
{ | |||
"key": "ORF2", | |||
"names": [ | |||
"ORF 2", | |||
"ORF zwei" | |||
], | |||
"number": "2" | |||
} | |||
], | |||
"cmds": ["ORF1:channel 1", "ORF2:channel 2"] | |||
} | |||
</syntaxhighlight>Relativer Kanalwechsel<syntaxhighlight lang="json"> | |||
{ | |||
"ChannelRelativeChannel": { | |||
"params": { | |||
"relativeChannelChange": { | |||
"cmdUp": "channelUp", | |||
"cmdDown": "channelDown" | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Letzte Kanal<syntaxhighlight lang="json"> | |||
{ | |||
"ChannelReturnChannel": { | |||
"cmd":"lastChannel" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|SamsungAV wird automatisch erkannt, zumindest SimpleChannel muss selbst hinterlegt werden, da die Kanalnamen im SamsungAV Modul nicht vorliegen. | |||
|Erlaubt das Umschalten auf vordefinierte TV Kanäle. Google empfiehlt nicht mehr als 30 Kanäle zu konfigurieren! | |||
|Schalte den Fernseher auf ORF 1. | |||
|https://developers.google.com/assistant/smarthome/traits/channel | |||
|- | |||
| ColorSetting || - || - || Wird im Normalfall automatisch erkannt. || Stelle die Wohnzimmerlampe auf warm-weiß. ||https://developers.google.com/actions/smarthome/traits/colorsetting | |||
|- | |||
|Cook | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"CookCurrentCookingMode": { | |||
"fixedValue": "BREW" | |||
}, | |||
"CookCurrentFoodPreset": { | |||
"fixedValue": "coffee" | |||
}, | |||
"CookCurrentFoodQuantity": { | |||
"fixedValue": 2 | |||
}, | |||
"CookCurrentFoodUnit": { | |||
"fixedValue": "NO_UNITS" | |||
}, | |||
"SimpleCookSynonyms": { | |||
"coffee": ["Kaffee", "Schwarze Brühe"], | |||
"cappuccino": ["Capu", "Capuci"] | |||
}, | |||
"SimpleCook": { | |||
"supportedCookingModes": ["BREW"], | |||
"foodPresets": [{ | |||
"food_preset_name": ["coffee","kaffee"], | |||
"supported_units": ["CUPS","NO_UNITS"] | |||
}, { | |||
"food_preset_name": ["cappuccino"], | |||
"supported_units": ["CUPS","NO_UNITS"] | |||
}], | |||
"params": { | |||
"foodPreset": { | |||
"cmds": ["coffee:selectProgram Brew.Coffee"], | |||
"delayAfter": 3 | |||
} | |||
}, | |||
"cmdFunction": "function (mapping, params) { var cmds = []; if (params.start) { cmds.push(\"startProgram\"); else { cmds.push(\"stopProgram\"); } } return cmds; }" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| HomeConnect CoffeeMaker wird automatisch erkannt. | |||
|Cook Trait wird für Kaffeemaschinen oder Geräte mit Kochfunktion verwendet. Die Variablen für supported_units und supportedCookingModes müssen den von Google unterstützten entsprechen. Siehe Google Doku. | |||
SimpleCookSynonyms braucht nur verwendet werden wenn das Device automatisch erkannt und angelegt wird, dann hat man mit diesem Mapping die Möglichkeit sperrige Namen oder englische Bezeichnungen auf Deutsch zu übersetzen ohne ein gesamtes SimpleCook anlegen zu müssen. | |||
|Brew a cup of coffee. | |||
Mach mir einen Kaffee. | |||
|https://developers.google.com/assistant/smarthome/traits/cook | |||
|- | |||
|Dispense | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"DispenseAmountRemaining": [ | |||
{ | |||
"itemName": "water", | |||
"fixedValue": 3, | |||
"unit": "CUPS" | |||
} | |||
], | |||
"DispenseAmountLastDispensed": { | |||
"itemName": "water", | |||
"fixedValue": 1, | |||
"unit": "CUPS" | |||
}, | |||
"DispenseIsCurrentlyDispensing": { | |||
"itemName": "water", | |||
"reading": "state", | |||
"values": "/dispense/1:/.*/0", | |||
"format": bool | |||
}, | |||
"SimpleDispense": { | |||
"supportedDispenseItems": [{ | |||
"itemName": [ | |||
"water", | |||
"Wasser" | |||
], | |||
"units": [ | |||
"CUPS", | |||
"MILLILITERS" | |||
], | |||
"defaultAmount": 1, | |||
"defaultUnit": "CUPS" | |||
}], | |||
"supportedDispensePresets": [ | |||
"water bowl" | |||
], | |||
"params": { | |||
"preset": { | |||
"cmd": "waterbowl" | |||
} | |||
}, | |||
"cmd": "dispense {amount} {unit} {item}" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| - (UNTESTED!) | |||
|Mit diesem Trait kann z.B. ein Wasserspender, Futterspender oder ähnliches betrieben werden. | |||
|Dispense a cup of water. | |||
|https://developers.google.com/assistant/smarthome/traits/dispense | |||
|- | |||
| Dock ||<syntaxhighlight lang="json"> | |||
{ | |||
"Dock": { | |||
"reading": "state", | |||
"cmd": "charge", | |||
"values": ["/^Docked/:true", "/^Charging/:true", "/.*/:false"] | |||
} | |||
} | |||
</syntaxhighlight>|| XiaomiVacuum, BOTNAV wird unterstützt. || Saugroboter in zur Ladestation schicken. || Schicke den Saugroboter in die Ladestation. ||https://developers.google.com/actions/smarthome/traits/dock | |||
|- | |||
|EnergyStorage | |||
|Mapping um Prozentwerte in sprachliche Kategorien (LOW, FULL, ...) umzuwandeln.<syntaxhighlight lang="json"> | |||
{ | |||
"EnergyStorageDescriptive": { | |||
"queryOnlyEnergyStorage": true, | |||
"reading": "battery", | |||
"values": ["/^[0]?[0-9]$/:CRITICALLY_LOW", | |||
"/^[1][0-9]$/:LOW", | |||
"/^[2-7][0-9]$/:MEDIUM", | |||
"/^[8][0-9]$/:HIGH", | |||
"/^[1]?[0,9][0-9]$/:FULL", | |||
"/low/:CRITICALLY_LOW", | |||
"/.*/:FULL"] | |||
} | |||
} | |||
</syntaxhighlight>Mapping für Prozentwerte, statt PERCENTAGE können auch andere Units verwendet werden. Siehe dazu die verlinkte Trait Doku.<syntaxhighlight lang="json"> | |||
{ | |||
{ | |||
"EnergyStorageExact": [{ | |||
"queryOnlyEnergyStorage": true, | |||
"reading": "batteryPercentage", | |||
"unit": "PERCENTAGE" | |||
}] | |||
} | |||
} | |||
</syntaxhighlight> | |||
|Alle Devices die ein battery Reading haben. | |||
|Wird für den Batteriestatus von Device betnutzt. | |||
|Wie ist der Batteriestatus meines Thermostats? | |||
|https://developers.google.com/assistant/smarthome/traits/energystorage | |||
|- | |||
| FanSpeed || <syntaxhighlight lang="json"> | |||
{ | |||
"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 | |||
} | |||
} | |||
</syntaxhighlight> | |||
|| Aktuell nicht automatisch konfiguriert. | |||
|| 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 Wohnzimmerventilator auf leise. | |||
|| https://developers.google.com/actions/smarthome/traits/fanspeed | |||
|- | |||
|HumiditySetting | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"CurrentRelativeHumidity": { | |||
"reading": "humidity" | |||
}, | |||
"TargetRelativeHumidity": { | |||
"reading": "targetHumidity", | |||
"cmd": "humidity" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| - | |||
|Luftfeuchtigkeit einstellen und auslesen. | |||
|Stelle die Luftfeuchtigkeit auf 40%. | |||
|https://developers.google.com/assistant/smarthome/traits/humiditysetting | |||
|- | |||
|InputSelector | |||
|<syntaxhighlight lang="json"> | |||
"SimpleInputSelector": { | |||
"reading": "input", | |||
"cmd": "source", | |||
"voicecmds": { | |||
"HDMI 1, Spielkonsole": "hdmi1", | |||
"HDMI 2, Chromecast": "hdmi2", | |||
"TV": "tv" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|SamsungAV, VIERA, BOSEST, ONKYO wird automatisch ünterstützt. | |||
|Ermöglich das Setzen des Inputs (Source) für das Gerät. | |||
|Stelle den TV Eingang auf HDMI 2. | |||
Stelle den TV Eingang auf Spielkonsole. | |||
|https://developers.google.com/assistant/smarthome/traits/inputselector | |||
|- | |||
| LightEffects ||<syntaxhighlight lang="json"> | |||
{ | |||
"LightEffectsColorLoop": { | |||
"reading": "effect", | |||
"values": ["/colorloop/:colorLoop", "/.*/:none"], | |||
"cmds": ["colorLoop:effect colorloop", "none:effect none"] | |||
}, | |||
"LightEffectsSleep": { | |||
"reading": "pct", | |||
"values": ["/0/:none", "/100/:none", "/.*/:sleep"], | |||
"cmd": "pct 0" | |||
}, | |||
"LightEffectsWake": { | |||
"reading": "pct", | |||
"values": ["/0/:none", "/100/:none", "/.*/:wake"], | |||
"cmd": "pct 100" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|| Hue Devices werden unterstützt. || Google unterstützt aktuell nur colorloop, andere Effekte sind leider noch nicht möglich. || Starte das Farbspiel auf der Wohnzimmerlampe. | |||
Stoppe das Farbspiel auf der Wohnzimmerlampe. | |||
||https://developers.google.com/actions/smarthome/traits/lighteffects | |||
|- | |||
| Locator ||<syntaxhighlight lang="json"> | |||
{ | |||
"Locate": { | |||
"cmd": "locate" | |||
} | |||
} | |||
</syntaxhighlight>|| XiaomiVacuum wird unterstützt. || Startet die Sprachausgabe "Hier bin ich" am Saugroboter. || Wo ist der Saugroboter? ||https://developers.google.com/actions/smarthome/traits/locator | |||
|- | |||
|LockUnlock | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"LockCurrentState": { | |||
"reading": "lock", | |||
"values": ["/uncertain/:JAMMED", "/^locked/:SECURED", "/.*/:UNSECURED"] | |||
}, | |||
"LockTargetState": { | |||
"reading": "lock", | |||
"values": ["/^locked/:SECURED", "/.*/:UNSECURED"], | |||
"cmds": ["SECURED:lock", "UNSECURED:unlock"] | |||
} | |||
} | |||
</syntaxhighlight> | |||
| HM-SEC-KEY wird unterstützt. | |||
|Für Türschlösser geeignet, sollte mit 2-Factor in Kombination verwendet werden. Dazu muss in LockTargetState noch ein "pin": "1234" eingefügt werden. | |||
|Sperre die Eingangstür zu. | |||
|https://developers.google.com/assistant/smarthome/traits/lockunlock | |||
|- | |||
| Modes ||<syntaxhighlight lang="json"> | |||
{ | |||
"SimpleModes": { | |||
"reading": "state", | |||
"name": "sender", | |||
"ORF1": "0_macro tv,1", | |||
"ORF2": "0_macro tv,4,4,5" | |||
} | |||
} | |||
</syntaxhighlight> | |||
oder | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"Modes":[ | |||
{ | |||
"reading":"state", | |||
"cmds":[ | |||
"ORF1:1", | |||
"ORF2:4;4;5" | |||
], | |||
"mode_attributes":{ | |||
"name":"sender", | |||
"name_values":[ | |||
{ | |||
"name_synonym":[ | |||
"sender", | |||
"programm" | |||
], | |||
"lang":"de" | |||
} | |||
], | |||
"settings":[ | |||
{ | |||
"setting_name":"ORF1", | |||
"setting_values":[ | |||
{ | |||
"setting_synonym":[ | |||
"ORF1", | |||
"ORF 1", | |||
"ORF eins" | |||
], | |||
"lang":"de" | |||
} | |||
] | |||
}, | |||
{ | |||
"setting_name":"ORF2", | |||
"setting_values":[ | |||
{ | |||
"setting_synonym":[ | |||
"ORF2", | |||
"ORF 2", | |||
"ORF zwei" | |||
], | |||
"lang":"de" | |||
} | |||
] | |||
} | |||
] | |||
} | |||
} | |||
] | |||
} | |||
</syntaxhighlight> | |||
|| XiaomiVaccum und BOTNAV werden unterstützt. || Sehr mächtiges Instrument. Kann jegliche Modes verwenden, siehe das Beispiel mit TV Umschaltung (im Beispiel ORF1=>Kanal 1, ORF2=>Kanal 445). Wird aktuell nur als JSON homebridgeMapping unterstützt, daher beginnt es mit { und endet mit }. || | |||
Stelle den Saugroboter auf Turbo. | |||
Schalte den Fernseher auf ORF1. | |||
||https://developers.google.com/actions/smarthome/traits/modes | |||
|- | |||
|NetworkControl | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"GuestNetwork":{ | |||
"cmdOn":"guest on", | |||
"cmdOff":"guest off", | |||
"reading":"gueststatus", | |||
"valueOff":"off" | |||
}, | |||
"GuestNetworkSettings":{ | |||
"reading":"guestssid" | |||
}, | |||
"NetworkEnabled":{ | |||
"reading":"enabled" | |||
}, | |||
"NetworkSettings":{ | |||
"reading":"ssid" | |||
}, | |||
"NetworkProfile":{ | |||
"profiles":[ | |||
"kids", | |||
"main" | |||
], | |||
"cmds": ["kids-on:kids on", "kids-off:kids off", "main-on:main on", "main-off:main off"] | |||
}, | |||
"GuestNetworkPassword":{ | |||
"reading":"guestpassword" | |||
}, | |||
"TestNetworkSpeed":{ | |||
"cmd":"speedtest" | |||
}, | |||
"ConnectedDevices":{ | |||
"reading":"connecteddevices" | |||
}, | |||
"NetworkUsageMB":{ | |||
"reading":"usage" | |||
}, | |||
"NetworkUsageLimitMB":{ | |||
"reading":"usagelimit" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|Fritzbox wird unterstützt. | |||
|Zur Steuerung von Routern und Netzwerken oder auch nur Netzwerk Geschwindigkeitstests. | |||
|Schalte das Gast WLAN aus/ein. | |||
Wie viele Geräte sind im Netzwerk? | |||
Wie viel Datenvolumen habe ich verbraucht? | |||
Schalte das Kids Netzwerk aus/ein. | |||
Wie lautet der Name meines Netzwerkes? | |||
|https://developers.google.com/assistant/smarthome/traits/networkcontrol | |||
|- | |||
| OnOff ||<syntaxhighlight lang="json"> | |||
{ | |||
"On": { | |||
"reading": "state", | |||
"valueOff": "off", | |||
"cmdOn": "on", | |||
"cmdOff": "off" | |||
} | |||
} | |||
</syntaxhighlight>Beispiel einer Hue Konfiguration mit Shelly Schalter (homebridgeMapping beim Hue Device!)<syntaxhighlight lang="json"> | |||
{ | |||
"On": { | |||
"reading": "state", | |||
"device": "MQTT2_shellyswitch25_E5E123_CH2", | |||
"valueOff": "off", | |||
"cmdOn": "on", | |||
"cmdOff": "off", | |||
"delayAfter": true | |||
} | |||
} | |||
</syntaxhighlight> | |||
|| Alle Devices die on/off haben, erhalten dieses Mapping. || Alle Devices mit on/off. || Schalte das Wohnzimmer Radio aus. ||https://developers.google.com/actions/smarthome/traits/onoff | |||
|- | |||
| OpenClose ||<syntaxhighlight lang="json"> | |||
{ | |||
"OpenClose": { | |||
"reading": "state", | |||
"values": ["/^closed/:CLOSED", "/.*/:OPEN"], | |||
"cmdOpen": "open", | |||
"cmdClose": "close" | |||
}, | |||
"TargetPosition": { | |||
"reading": "position", | |||
"cmd": "position", | |||
"invert": true | |||
}, | |||
"CurrentPosition": { | |||
"reading": "position", | |||
"invert": true | |||
} | |||
} | |||
</syntaxhighlight> | |||
| Viele Rollos werden automatisch unterstützt. || OpenClose...Auf und Zu, keine Position | |||
TargetPosition...Erlaubt auch eine Position (z.B. 20%) CurrentPosition...Aktueller Wert der Position | |||
invert wird verwendet um aus 100% 0% zu machen, falls das Device es falschherum anzeigt. | |||
| Mach die Rollo im Wohnzimmer hoch. | |||
Stelle die Rollo im Schlafzimmer auf 80%. | |||
|https://developers.google.com/actions/smarthome/traits/openclose | |||
|- | |||
|Reboot | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"Reboot": { | |||
"cmd": "firmwareupdate" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|Wird für das gassistant Device automatisch gesetzt und führt einen Neustart von gassistant durch. | |||
|Kann bei allen Devices verwendet werden die Reboots unterstützen. | |||
|Reboot gassistant. | |||
|https://developers.google.com/assistant/smarthome/traits/reboot | |||
|- | |||
|RunCycle | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"RunCycleCurrentCycle": { | |||
"reading": "programPhase" | |||
}, | |||
"RunCycleLang": { | |||
"fixedValue": "de" | |||
}, | |||
"RunCycleCurrentTotalRemainingTime": { | |||
"reading": "totalRemainingSeconds" | |||
}, | |||
"RunCycleCurrentCycleRemainingTime": { | |||
"reading": "cycleRemainingSeconds" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|MieleAtHome Waschmaschine und Trockner werden automatisch unterstützt. | |||
|Erlaubt die Restlaufzeit und aktuelle Phase eines Programms abzufragen. | |||
|Was macht die Waschmaschine? | |||
Wie lange läuft der Trockner noch? | |||
|https://developers.google.com/assistant/smarthome/traits/runcycle | |||
|- | |||
| Scene || - || - || - || - ||https://developers.google.com/actions/smarthome/traits/scene | |||
|- | |||
|SoftwareUpdate | |||
|<syntaxhighlight lang="json"> | |||
{ | |||
"SoftwareUpdate": { | |||
"cmd": "firmwareupdate" | |||
} | |||
} | |||
</syntaxhighlight> | |||
|Wird für das gassistant Device automatisch gesetzt und führt einen reload (inkl. Google SYNC) durch. | |||
|Kann bei allen Devices verwendet werden die Updates unterstützen. | |||
|Update gassistant. | |||
|https://developers.google.com/assistant/smarthome/traits/softwareupdate | |||
|- | |||
| StartStop || - || - || - || - ||https://developers.google.com/actions/smarthome/traits/startstop | |||
|- | |||
| StatusReport ||<syntaxhighlight lang="json"> | |||
{ | |||
"Exceptions": { | |||
"lowBattery": { | |||
"reading":"battery", | |||
"values":"/low/:EXCEPTION", | |||
"onlyLinkedInfo": true | |||
} | |||
}, | |||
"Errors": { | |||
"deviceOffline": { | |||
"reading":"reachable", | |||
"values":"/offline/:ERROR" | |||
}, | |||
"binFull": { | |||
"reading":"error", | |||
"valueError":"bin_full" | |||
} | |||
}, | |||
"LinkedDevices": { | |||
"devices": [{ | |||
"id":"doorsensor", | |||
"blocking":true | |||
}, | |||
{ | |||
"id":"windowsensor" | |||
}] | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
|| Exceptions und Errors werden für Geräte mit battery und reachable automatisch erstellt. LinkedDevices werden nicht automatisch erstellt. || | |||
Exceptions...Fehlerfälle auf die Google bei Abfragen und Kommandos hinweist. onlyLinkedInfo=true bedeutet, dass die Exception nur gemeldet wird, wenn es über ein anderes Device abgefragt, das ist sinnvoll bei Exceptions wie openDevice. Exceptions klingen dann so... "Stelle die Heizung auf 20 Grad" => "Ok, Heizung wird auf 20 Grad gestellt. Die Batterie hat einen niedrigen Status." | |||
Errors...Fehlerfälle die eine Ausführung verhindern, weil das Device z.B. offline ist, wie bei Hue Lights. | |||
LinkedDevices...Für Alarmanlagen sinnvoll. Eine Abfrage "Ist meine Alarmanlage ok?" liefert dann Informationen über offenen Fenster oder niedrige Batteriestände, etc.. Alles was als Exception beim jeweiligen Device hinterlegt wurde. | |||
|| Ist meine Alarmanlage ok? || https://developers.google.com/actions/smarthome/traits/statusreport | |||
|- | |||
| TemperatureControl ||<syntaxhighlight lang="json"> | |||
{ | |||
"TemperatureControlSetCelsius": { | |||
"reading": "targetTemperature", | |||
"cmd": "desired", | |||
"minCelsius": 0, | |||
"maxCelsius": 300, | |||
"stepCelsius": 10, | |||
"formatUx": "C" | |||
}, | |||
"TemperatureControlAmbientCelsius": { | |||
"reading": "currentTemperature" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| Wird aktuell nur verwendet, wenn es eigenständig in homebridgeMapping definiert wird, da es im Moment keine Steuerung über die Home App zulässt. || NICHT für Thermostate, dafür wird TemperatureSetting verwendet. || Stelle den Ofen auf 180 Grad. ||https://developers.google.com/actions/smarthome/traits/temperaturecontrol | |||
|- | |||
| TemperatureSetting ||<syntaxhighlight lang="json"> | |||
{ | |||
"ThermostatModes": { | |||
"reading": ["desiredTemperature", "ecoMode"], | |||
"cmds": ["off:desiredTemperature 4.5", "heat:desiredTemperature 21", "eco:eco"], | |||
"values": ["ecoMode=/1/:eco", "desiredTemperature=/^4.5/:off","desiredTemperature=/.*/:heat"] | |||
}, | |||
"TargetTemperature": { | |||
"reading": "desiredTemp", | |||
"cmd": "desiredTemp" | |||
}, | |||
"CurrentTemperature": { | |||
"reading": "temperature" | |||
} | |||
} | |||
</syntaxhighlight> | |||
| Wird für alle Thermostate automatisch erstellt. || Zum Steuern der Thermostate, nicht für Öfen, Wasserkocher oder ähnliches gedacht. || Stelle die Heizung im Wohnzimmer auf 20 Grad. ||https://developers.google.com/actions/smarthome/traits/temperaturesetting | |||
|- | |||
| Timer || Timer={"commandOnlyTimer": true, "maxTimerLimitSec": 86400, "cmdTimerStart": "on-for-timer"} || Wird automatisch erstellt sobald on-for-timer verfügbar. || 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 | |||
|- | |||
| Toggles || - || - || - || - ||https://developers.google.com/actions/smarthome/traits/toggles | |||
|- | |||
|Volume | |||
|Absolute volume control:<syntaxhighlight lang="json"> | |||
{ | |||
"Volume" = { | |||
"reading": "volume", | |||
"cmd": "volume", | |||
"levelStepSize": 3 | |||
} | |||
} | |||
</syntaxhighlight>Relative volume control:<syntaxhighlight lang="json"> | |||
{ | |||
"Volume" = { | |||
"cmdUp": "volumeUp", | |||
"cmdDown": "volumeDown", | |||
"levelStepSize": 3 | |||
} | |||
} | |||
</syntaxhighlight> | |||
|Wird automatisch für alle volume Readings angelegt. | |||
|Volume erlaubt die Steuerung der Lautstärke. | |||
|Mach den Fernseher lauter. | |||
Mach das Radio leiser. | |||
|https://developers.google.com/assistant/smarthome/traits/volume | |||
|- | |||
|} | |||
Die obige Darstellung gibt nicht alle Möglichkeiten von homebridgeMapping wieder, daher hier noch eine Zusammenstellung möglicher Attribute: | |||
{| class="wikitable" | |||
|+homebridgeMapping Attribute (Liste noch nicht komplett) | |||
!Attribut | |||
!Beschreibung | |||
!Beispiel innerhalb eines Mappings | |||
|- | |||
|cmd | |||
|Beim Ausführen eines FHEM Commands wird das hier definierte cmd inkl. der Variable von Google verwendet. | |||
|"cmd": "desiredTemp" => set device desiredTemp 21 | |||
|- | |||
|cmdUp/ cmdDown | |||
|Bei relativen Steuerung kann dies verwendet werden. Z.B. Volume. | |||
|"cmdUp": "volumeUp", | |||
"cmdDown": "volumeDown" | |||
|- | |||
|reading | |||
|Bei Mappings die Werte auslesen, wird reading definiert um zu beschreiben aus welchem Reading der Wert ausgelesen wird | |||
|"reading": "state" | |||
|- | |||
|fixedValue | |||
|Wenn man einen fixen Wert zurück liefern will, unabhängig vom Reading, kann fixedValue verwendet werden. | |||
|"fixedValue": "BREW" | |||
|} | |||
==Beispiele== | |||
Hier findet ihr ein paar Beispielkonfigurationen für homebridgeMappings falls diese nicht automatisch von FHEM Connect erkannt werden. | |||
=== Temperatur-/Feuchtigkeits-sensor === | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"TemperatureControlAmbientCelsius": { | |||
"reading": "currentTemperature" | |||
}, | |||
"CurrentRelativeHumidity": { | |||
"reading": "humidity" | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==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: | |||
<syntaxhighlight lang="bash" style="width:70%;"> | <syntaxhighlight lang="bash" style="width:70%;"> | ||
sudo npm install -g gassistant-fhem --unsafe-perm | |||
</syntaxhighlight> | </syntaxhighlight> | ||
* | * gassistant über FHEM neu starten | ||
==Architektur== | ==Architektur== | ||
Zeile 53: | Zeile 850: | ||
* Firebase Cloud Functions | * 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. | 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== | ==Datenfluss== | ||
Zeile 67: | Zeile 862: | ||
* Der fhemconnect Client schickt den Befehl direkt an FHEM weiter wo der Befehl ausgeführt wird. | * Der fhemconnect Client schickt den Befehl direkt an FHEM weiter wo der Befehl ausgeführt wird. | ||
==Update== | Wenn Local Home aktiv ist, werden Sprachbefehle direkt vom Gerät an FHEM geschickt und nicht an die Cloud weitergeleitet. Ob Local Home aktiv ist, sieht man im Reading localHome. Eine ausführliche Erklärung zur Funktionsweise von Local Home ist hier zu finden: https://developers.google.com/assistant/smarthome/concepts/local | ||
==FAQs== | |||
===== Kann ich eine Sprachausgabe an meine Google / Nest Home Geräte senden? ===== | |||
Ja, das geht mit dem offiziellen GOOGLECAST Modul. Eine Weiterentwicklung davon findet ihr in einer aktuellen Testversion auf: | |||
https://github.com/dominikkarall/fhem_pythonbinding | |||
===== Fehlermeldung nach Update auf Version 3.0.0 ===== | |||
<pre> | |||
/usr/lib/node_modules/gassistant-fhem/node_modules/vm2/lib/main.js:1048 | |||
throw this._internal.Decontextify.value(e); | |||
</pre> | |||
In diesem Fall ist die Node Version zu alt und muss mit folgenden Befehlen aktualisiert werden: | |||
<syntaxhighlight lang="bash"> | |||
$ curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash - | |||
$ sudo apt install -y nodejs | |||
</syntaxhighlight> | |||
Falls nodejs 13 bereits in Einsatz ist, dann empfehle ich nodejs zuerst zu deinstallieren (ACHTUNG: Alle installierten NodeJS Module werden deinstalliert!) | |||
<syntaxhighlight lang="bash"> | |||
$ sudo apt purge nodejs | |||
$ rm -rf /usr/local/lib/node-modules | |||
</syntaxhighlight> | |||
===== 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 [https://forum.fhem.de/index.php/topic,96696.0.html 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). | |||
Hier die Liste der Geräte die Google offiziell in der Home App unterstützt, diese Liste wird laufend aktualisiert: <nowiki>https://developers.google.com/assistant/smarthome/develop/touch-controls</nowiki> | |||
===== 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 | |||
<syntaxhighlight lang="json" style="width:70%;"> | |||
"connections": [ | |||
{ | |||
"name": "FHEM", | |||
"server": "127.0.0.1", | |||
"auth": {"user": "fhemuser", "pass": "fhempassword"}, | |||
"ssl": true, | |||
"port": "8083", | |||
"filter": "room=GoogleAssistant" | |||
} | |||
] | |||
</syntaxhighlight> | |||
===== "Method Not Allowed" Fehlermeldung bei der npm Installation? ===== | |||
<syntaxhighlight lang="bash" style="width:70%;"> | |||
sudo npm install -g npm | |||
</syntaxhighlight> | |||
===== 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). | |||
<syntaxhighlight lang="bash" style="width:70%;"> | <syntaxhighlight lang="bash" style="width:70%;"> | ||
sudo apt update && sudo apt install nodejs | |||
</syntaxhighlight> | </syntaxhighlight> | ||
===== 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 <code>room=GoogleAssistant</code> durch zB <code>group=ghomeDevice</code> ersetzt werden. | |||
Eine weiteren Möglichkeit ist das Zuordnen von zwei Räumen in FHEM für ein Gerät zB <code>attr MediacenterKodi room Wohnzimmer,GoogleAssistant</code> | |||
===== 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 | |||
<pre>npm install gassistant-fhem</pre> | |||
sein. Gestartet wird es dann aus dem Installationsordner mit dem Befehl <code>node_modules/gassistant-fhem/bin/gassistant-fhem</code> | |||
Die Konfigurationsdatei für die FHEM-Verbindung ist dann unter <code>~/.fhemconnect/config.json</code> | |||
==Kostenlos== | ==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. | 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. | ||
[[Kategorie:Sprachsteuerung|Google Assistant]] | |||
Wer das Projekt mit Spenden unterstützen will: https://paypal.me/todominik |
Aktuelle Version vom 24. Mai 2021, 20:43 Uhr
FHEM Connect verbindet FHEM mit dem Google Assistant ohne mühsame Konfiguration mit wenigen Klicks. Du kannst FHEM Connect am iPhone, Android Device, Google Home, Google Nest, WearOS Smartwatch, Chromebook und mit vielen anderen Devices mit integrierten Google Assistant nutzen. Mit FHEM Connect kannst du deine FHEM Geräte per Google Assistant und Google Home App (Google PlayStore, Apple AppStore) von überall aus steuern.
FHEM Connect ist von Google zertifiziert und offiziell in der Google Home App verfügbar! Local Home SDK wird ebenfalls unterstützt.
Ich (Dominik Karall) würde mich über positive Bewertungen von FHEM Connect freuen.
gassistant | |
---|---|
Zweck / Funktion | |
Anbindung von FHEM an Google Assistant | |
Allgemein | |
Typ | Hilfsmodul |
Details | |
Dokumentation | EN / DE Thema |
Support (Forum) | Frontends/Sprachsteuerung |
Modulname | 39_gassistant.pm |
Ersteller | dominik (Forum / Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
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/
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!!).
Es werden alle Geräte unterstützt die ein on/off Command besitzen. Weitere Funktionalitäten sind für verschiedene Geräte (SamsungAV, BOSEST, SONOS, ...) implementiert. Falls ein Gerät nicht funktioniert oder zu wenig Funktionalität beinhaltet, poste bitte dein jsonlist2 DEVICE in diesem Thread: https://forum.fhem.de/index.php/topic,96696.0.html
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
- Voraussetzung: Aktuelle NodeJS Version installieren. libjson-perl ebenfalls, wobei das wahrscheinlich schon installiert ist.
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - $ sudo apt install -y nodejs libjson-perl
- gassistant-fhem installieren und einrichten:
Dazu auf der Konsole folgenden Befehl ausführensudo npm install -g gassistant-fhem --unsafe-perm
- Connector in FHEM definieren:
define gassistant gassistant
- Es wird automatisch ein Raum GoogleAssistant erstellt.
- Falls ihr euren Webzugriff mit einer Authentifizierung sichert, dann muss noch das gassistantFHEM-auth Attribut auf username:passwort gesetzt werden.
- Ca. 30s warten bis ein Reading gassistantFHEM.loginURL erscheint. Wenn der Link nicht erscheint, dann bitte im Log nachsehen woran es liegt (/opt/fhem/log/gassistant-fhem-*). Gerne dann im Forum posten wenn du nicht weiter kommst.
- Link öffnen und einloggen (Empfehlung: Login with Google)
- Den erhaltenen authcode in FHEM hinterlegen (
set gassistant authcode ............
) - 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)
- 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 ein Gerät bei euch nicht funktioniert, dann bitte im Forum (Link siehe Infobox rechts oben) posten. Mein Ziel ist es so viele Geräte wie möglich ohne weitere Konfiguration zu unterstützen.
Wenn ihr homebridgeMapping für Alexa oder Siri verwendet, bitte unbedingt einen Zeilenumbruch zwischen den Mappings verwenden und kein Leerzeichen!
Wer mehr konfigurieren möchte oder ein paar Einstellungen selbst vornehmen will, kann folgende homebridgeMappings verwenden:
Trait | homebridgeMapping Beispiel | Default | Beschreibung | Google Assistant Sprachkommandos | Google Dokumentation |
---|---|---|---|---|---|
2-Factor | 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 |
ArmDisarm | ArmDisarm=exitAllowance=10 | ArmDisarm=exitAllowance=60 | Zeit bis zur Aktivierung der Alarmanlage | Aktiviere die Alarmanlage | https://developers.google.com/actions/smarthome/traits/armdisarm |
Brightness | {
"Brightness": {
"reading": "pct",
"cmd": "pct"
}
}
|
Wird im Normalfall automatisch erkannt. | Das Brightness Reading wird im Normalfall automatisch erkannt und muss nicht konfiguriert werden. | Stelle die Helligkeit im Wohnzimmer auf 50 Prozent. | https://developers.google.com/actions/smarthome/traits/brightness |
CameraStream | {
"CameraStream": {
"reading": "streamurl"
}
}
{
"CameraStream": {
"fixedValue": "https://das.ist.die.url/zum.mp4"
}
}
|
- | Die URL muss von außen erreichbar sein und in einem der folgenden Formate vorliegen: hls, dash, smooth_stream, progressive_mp4 | Zeige die Eingangskamera am Fernseher. | https://developers.google.com/actions/smarthome/traits/camerastream |
Channel | {
"SimpleChannel": {
"ORF 1": "0_macro tv,1,enter",
"ORF 2,ORF zwei,ORF2": "0_macro tv,4,6,0,enter",
"ServusTV,Servus TV": "0_macro tv,5,enter"
}
}
{
"Channel": {
"availableChannels": [
{
"key": "ORF1",
"names": [
"ORF 1",
"ORF eins",
"ORF"
],
"number": "1"
},
{
"key": "ORF2",
"names": [
"ORF 2",
"ORF zwei"
],
"number": "2"
}
],
"cmds": ["ORF1:channel 1", "ORF2:channel 2"]
}
{
"ChannelRelativeChannel": {
"params": {
"relativeChannelChange": {
"cmdUp": "channelUp",
"cmdDown": "channelDown"
}
}
}
{
"ChannelReturnChannel": {
"cmd":"lastChannel"
}
}
|
SamsungAV wird automatisch erkannt, zumindest SimpleChannel muss selbst hinterlegt werden, da die Kanalnamen im SamsungAV Modul nicht vorliegen. | Erlaubt das Umschalten auf vordefinierte TV Kanäle. Google empfiehlt nicht mehr als 30 Kanäle zu konfigurieren! | Schalte den Fernseher auf ORF 1. | https://developers.google.com/assistant/smarthome/traits/channel |
ColorSetting | - | - | Wird im Normalfall automatisch erkannt. | Stelle die Wohnzimmerlampe auf warm-weiß. | https://developers.google.com/actions/smarthome/traits/colorsetting |
Cook | {
"CookCurrentCookingMode": {
"fixedValue": "BREW"
},
"CookCurrentFoodPreset": {
"fixedValue": "coffee"
},
"CookCurrentFoodQuantity": {
"fixedValue": 2
},
"CookCurrentFoodUnit": {
"fixedValue": "NO_UNITS"
},
"SimpleCookSynonyms": {
"coffee": ["Kaffee", "Schwarze Brühe"],
"cappuccino": ["Capu", "Capuci"]
},
"SimpleCook": {
"supportedCookingModes": ["BREW"],
"foodPresets": [{
"food_preset_name": ["coffee","kaffee"],
"supported_units": ["CUPS","NO_UNITS"]
}, {
"food_preset_name": ["cappuccino"],
"supported_units": ["CUPS","NO_UNITS"]
}],
"params": {
"foodPreset": {
"cmds": ["coffee:selectProgram Brew.Coffee"],
"delayAfter": 3
}
},
"cmdFunction": "function (mapping, params) { var cmds = []; if (params.start) { cmds.push(\"startProgram\"); else { cmds.push(\"stopProgram\"); } } return cmds; }"
}
}
|
HomeConnect CoffeeMaker wird automatisch erkannt. | Cook Trait wird für Kaffeemaschinen oder Geräte mit Kochfunktion verwendet. Die Variablen für supported_units und supportedCookingModes müssen den von Google unterstützten entsprechen. Siehe Google Doku.
SimpleCookSynonyms braucht nur verwendet werden wenn das Device automatisch erkannt und angelegt wird, dann hat man mit diesem Mapping die Möglichkeit sperrige Namen oder englische Bezeichnungen auf Deutsch zu übersetzen ohne ein gesamtes SimpleCook anlegen zu müssen. |
Brew a cup of coffee.
Mach mir einen Kaffee. |
https://developers.google.com/assistant/smarthome/traits/cook |
Dispense | {
"DispenseAmountRemaining": [
{
"itemName": "water",
"fixedValue": 3,
"unit": "CUPS"
}
],
"DispenseAmountLastDispensed": {
"itemName": "water",
"fixedValue": 1,
"unit": "CUPS"
},
"DispenseIsCurrentlyDispensing": {
"itemName": "water",
"reading": "state",
"values": "/dispense/1:/.*/0",
"format": bool
},
"SimpleDispense": {
"supportedDispenseItems": [{
"itemName": [
"water",
"Wasser"
],
"units": [
"CUPS",
"MILLILITERS"
],
"defaultAmount": 1,
"defaultUnit": "CUPS"
}],
"supportedDispensePresets": [
"water bowl"
],
"params": {
"preset": {
"cmd": "waterbowl"
}
},
"cmd": "dispense {amount} {unit} {item}"
}
}
|
- (UNTESTED!) | Mit diesem Trait kann z.B. ein Wasserspender, Futterspender oder ähnliches betrieben werden. | Dispense a cup of water. | https://developers.google.com/assistant/smarthome/traits/dispense |
Dock | {
"Dock": {
"reading": "state",
"cmd": "charge",
"values": ["/^Docked/:true", "/^Charging/:true", "/.*/:false"]
}
}
|
XiaomiVacuum, BOTNAV wird unterstützt. | Saugroboter in zur Ladestation schicken. | Schicke den Saugroboter in die Ladestation. | https://developers.google.com/actions/smarthome/traits/dock |
EnergyStorage | Mapping um Prozentwerte in sprachliche Kategorien (LOW, FULL, ...) umzuwandeln.{
"EnergyStorageDescriptive": {
"queryOnlyEnergyStorage": true,
"reading": "battery",
"values": ["/^[0]?[0-9]$/:CRITICALLY_LOW",
"/^[1][0-9]$/:LOW",
"/^[2-7][0-9]$/:MEDIUM",
"/^[8][0-9]$/:HIGH",
"/^[1]?[0,9][0-9]$/:FULL",
"/low/:CRITICALLY_LOW",
"/.*/:FULL"]
}
}
{
{
"EnergyStorageExact": [{
"queryOnlyEnergyStorage": true,
"reading": "batteryPercentage",
"unit": "PERCENTAGE"
}]
}
}
|
Alle Devices die ein battery Reading haben. | Wird für den Batteriestatus von Device betnutzt. | Wie ist der Batteriestatus meines Thermostats? | https://developers.google.com/assistant/smarthome/traits/energystorage |
FanSpeed | {
"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
}
}
|
Aktuell nicht automatisch konfiguriert. | 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 Wohnzimmerventilator auf leise. |
https://developers.google.com/actions/smarthome/traits/fanspeed |
HumiditySetting | {
"CurrentRelativeHumidity": {
"reading": "humidity"
},
"TargetRelativeHumidity": {
"reading": "targetHumidity",
"cmd": "humidity"
}
}
|
- | Luftfeuchtigkeit einstellen und auslesen. | Stelle die Luftfeuchtigkeit auf 40%. | https://developers.google.com/assistant/smarthome/traits/humiditysetting |
InputSelector | "SimpleInputSelector": {
"reading": "input",
"cmd": "source",
"voicecmds": {
"HDMI 1, Spielkonsole": "hdmi1",
"HDMI 2, Chromecast": "hdmi2",
"TV": "tv"
}
}
|
SamsungAV, VIERA, BOSEST, ONKYO wird automatisch ünterstützt. | Ermöglich das Setzen des Inputs (Source) für das Gerät. | Stelle den TV Eingang auf HDMI 2.
Stelle den TV Eingang auf Spielkonsole. |
https://developers.google.com/assistant/smarthome/traits/inputselector |
LightEffects | {
"LightEffectsColorLoop": {
"reading": "effect",
"values": ["/colorloop/:colorLoop", "/.*/:none"],
"cmds": ["colorLoop:effect colorloop", "none:effect none"]
},
"LightEffectsSleep": {
"reading": "pct",
"values": ["/0/:none", "/100/:none", "/.*/:sleep"],
"cmd": "pct 0"
},
"LightEffectsWake": {
"reading": "pct",
"values": ["/0/:none", "/100/:none", "/.*/:wake"],
"cmd": "pct 100"
}
}
|
Hue Devices werden unterstützt. | Google unterstützt aktuell nur colorloop, andere Effekte sind leider noch nicht möglich. | Starte das Farbspiel auf der Wohnzimmerlampe.
Stoppe das Farbspiel auf der Wohnzimmerlampe. |
https://developers.google.com/actions/smarthome/traits/lighteffects |
Locator | {
"Locate": {
"cmd": "locate"
}
}
|
XiaomiVacuum wird unterstützt. | Startet die Sprachausgabe "Hier bin ich" am Saugroboter. | Wo ist der Saugroboter? | https://developers.google.com/actions/smarthome/traits/locator |
LockUnlock | {
"LockCurrentState": {
"reading": "lock",
"values": ["/uncertain/:JAMMED", "/^locked/:SECURED", "/.*/:UNSECURED"]
},
"LockTargetState": {
"reading": "lock",
"values": ["/^locked/:SECURED", "/.*/:UNSECURED"],
"cmds": ["SECURED:lock", "UNSECURED:unlock"]
}
}
|
HM-SEC-KEY wird unterstützt. | Für Türschlösser geeignet, sollte mit 2-Factor in Kombination verwendet werden. Dazu muss in LockTargetState noch ein "pin": "1234" eingefügt werden. | Sperre die Eingangstür zu. | https://developers.google.com/assistant/smarthome/traits/lockunlock |
Modes | {
"SimpleModes": {
"reading": "state",
"name": "sender",
"ORF1": "0_macro tv,1",
"ORF2": "0_macro tv,4,4,5"
}
}
{
"Modes":[
{
"reading":"state",
"cmds":[
"ORF1:1",
"ORF2:4;4;5"
],
"mode_attributes":{
"name":"sender",
"name_values":[
{
"name_synonym":[
"sender",
"programm"
],
"lang":"de"
}
],
"settings":[
{
"setting_name":"ORF1",
"setting_values":[
{
"setting_synonym":[
"ORF1",
"ORF 1",
"ORF eins"
],
"lang":"de"
}
]
},
{
"setting_name":"ORF2",
"setting_values":[
{
"setting_synonym":[
"ORF2",
"ORF 2",
"ORF zwei"
],
"lang":"de"
}
]
}
]
}
}
]
}
|
XiaomiVaccum und BOTNAV werden unterstützt. | Sehr mächtiges Instrument. Kann jegliche Modes verwenden, siehe das Beispiel mit TV Umschaltung (im Beispiel ORF1=>Kanal 1, ORF2=>Kanal 445). Wird aktuell nur als JSON homebridgeMapping unterstützt, daher beginnt es mit { und endet mit }. |
Stelle den Saugroboter auf Turbo. Schalte den Fernseher auf ORF1. |
https://developers.google.com/actions/smarthome/traits/modes |
NetworkControl | {
"GuestNetwork":{
"cmdOn":"guest on",
"cmdOff":"guest off",
"reading":"gueststatus",
"valueOff":"off"
},
"GuestNetworkSettings":{
"reading":"guestssid"
},
"NetworkEnabled":{
"reading":"enabled"
},
"NetworkSettings":{
"reading":"ssid"
},
"NetworkProfile":{
"profiles":[
"kids",
"main"
],
"cmds": ["kids-on:kids on", "kids-off:kids off", "main-on:main on", "main-off:main off"]
},
"GuestNetworkPassword":{
"reading":"guestpassword"
},
"TestNetworkSpeed":{
"cmd":"speedtest"
},
"ConnectedDevices":{
"reading":"connecteddevices"
},
"NetworkUsageMB":{
"reading":"usage"
},
"NetworkUsageLimitMB":{
"reading":"usagelimit"
}
}
|
Fritzbox wird unterstützt. | Zur Steuerung von Routern und Netzwerken oder auch nur Netzwerk Geschwindigkeitstests. | Schalte das Gast WLAN aus/ein.
Wie viele Geräte sind im Netzwerk? Wie viel Datenvolumen habe ich verbraucht? Schalte das Kids Netzwerk aus/ein. Wie lautet der Name meines Netzwerkes? |
https://developers.google.com/assistant/smarthome/traits/networkcontrol |
OnOff | {
"On": {
"reading": "state",
"valueOff": "off",
"cmdOn": "on",
"cmdOff": "off"
}
}
{
"On": {
"reading": "state",
"device": "MQTT2_shellyswitch25_E5E123_CH2",
"valueOff": "off",
"cmdOn": "on",
"cmdOff": "off",
"delayAfter": true
}
}
|
Alle Devices die on/off haben, erhalten dieses Mapping. | Alle Devices mit on/off. | Schalte das Wohnzimmer Radio aus. | https://developers.google.com/actions/smarthome/traits/onoff |
OpenClose | {
"OpenClose": {
"reading": "state",
"values": ["/^closed/:CLOSED", "/.*/:OPEN"],
"cmdOpen": "open",
"cmdClose": "close"
},
"TargetPosition": {
"reading": "position",
"cmd": "position",
"invert": true
},
"CurrentPosition": {
"reading": "position",
"invert": true
}
}
|
Viele Rollos werden automatisch unterstützt. | OpenClose...Auf und Zu, keine Position
TargetPosition...Erlaubt auch eine Position (z.B. 20%) CurrentPosition...Aktueller Wert der Position invert wird verwendet um aus 100% 0% zu machen, falls das Device es falschherum anzeigt. |
Mach die Rollo im Wohnzimmer hoch.
Stelle die Rollo im Schlafzimmer auf 80%. |
https://developers.google.com/actions/smarthome/traits/openclose |
Reboot | {
"Reboot": {
"cmd": "firmwareupdate"
}
}
|
Wird für das gassistant Device automatisch gesetzt und führt einen Neustart von gassistant durch. | Kann bei allen Devices verwendet werden die Reboots unterstützen. | Reboot gassistant. | https://developers.google.com/assistant/smarthome/traits/reboot |
RunCycle | {
"RunCycleCurrentCycle": {
"reading": "programPhase"
},
"RunCycleLang": {
"fixedValue": "de"
},
"RunCycleCurrentTotalRemainingTime": {
"reading": "totalRemainingSeconds"
},
"RunCycleCurrentCycleRemainingTime": {
"reading": "cycleRemainingSeconds"
}
}
|
MieleAtHome Waschmaschine und Trockner werden automatisch unterstützt. | Erlaubt die Restlaufzeit und aktuelle Phase eines Programms abzufragen. | Was macht die Waschmaschine?
Wie lange läuft der Trockner noch? |
https://developers.google.com/assistant/smarthome/traits/runcycle |
Scene | - | - | - | - | https://developers.google.com/actions/smarthome/traits/scene |
SoftwareUpdate | {
"SoftwareUpdate": {
"cmd": "firmwareupdate"
}
}
|
Wird für das gassistant Device automatisch gesetzt und führt einen reload (inkl. Google SYNC) durch. | Kann bei allen Devices verwendet werden die Updates unterstützen. | Update gassistant. | https://developers.google.com/assistant/smarthome/traits/softwareupdate |
StartStop | - | - | - | - | https://developers.google.com/actions/smarthome/traits/startstop |
StatusReport | {
"Exceptions": {
"lowBattery": {
"reading":"battery",
"values":"/low/:EXCEPTION",
"onlyLinkedInfo": true
}
},
"Errors": {
"deviceOffline": {
"reading":"reachable",
"values":"/offline/:ERROR"
},
"binFull": {
"reading":"error",
"valueError":"bin_full"
}
},
"LinkedDevices": {
"devices": [{
"id":"doorsensor",
"blocking":true
},
{
"id":"windowsensor"
}]
}
}
}
|
Exceptions und Errors werden für Geräte mit battery und reachable automatisch erstellt. LinkedDevices werden nicht automatisch erstellt. |
Exceptions...Fehlerfälle auf die Google bei Abfragen und Kommandos hinweist. onlyLinkedInfo=true bedeutet, dass die Exception nur gemeldet wird, wenn es über ein anderes Device abgefragt, das ist sinnvoll bei Exceptions wie openDevice. Exceptions klingen dann so... "Stelle die Heizung auf 20 Grad" => "Ok, Heizung wird auf 20 Grad gestellt. Die Batterie hat einen niedrigen Status." Errors...Fehlerfälle die eine Ausführung verhindern, weil das Device z.B. offline ist, wie bei Hue Lights. LinkedDevices...Für Alarmanlagen sinnvoll. Eine Abfrage "Ist meine Alarmanlage ok?" liefert dann Informationen über offenen Fenster oder niedrige Batteriestände, etc.. Alles was als Exception beim jeweiligen Device hinterlegt wurde. |
Ist meine Alarmanlage ok? | https://developers.google.com/actions/smarthome/traits/statusreport |
TemperatureControl | {
"TemperatureControlSetCelsius": {
"reading": "targetTemperature",
"cmd": "desired",
"minCelsius": 0,
"maxCelsius": 300,
"stepCelsius": 10,
"formatUx": "C"
},
"TemperatureControlAmbientCelsius": {
"reading": "currentTemperature"
}
}
|
Wird aktuell nur verwendet, wenn es eigenständig in homebridgeMapping definiert wird, da es im Moment keine Steuerung über die Home App zulässt. | NICHT für Thermostate, dafür wird TemperatureSetting verwendet. | Stelle den Ofen auf 180 Grad. | https://developers.google.com/actions/smarthome/traits/temperaturecontrol |
TemperatureSetting | {
"ThermostatModes": {
"reading": ["desiredTemperature", "ecoMode"],
"cmds": ["off:desiredTemperature 4.5", "heat:desiredTemperature 21", "eco:eco"],
"values": ["ecoMode=/1/:eco", "desiredTemperature=/^4.5/:off","desiredTemperature=/.*/:heat"]
},
"TargetTemperature": {
"reading": "desiredTemp",
"cmd": "desiredTemp"
},
"CurrentTemperature": {
"reading": "temperature"
}
}
|
Wird für alle Thermostate automatisch erstellt. | Zum Steuern der Thermostate, nicht für Öfen, Wasserkocher oder ähnliches gedacht. | Stelle die Heizung im Wohnzimmer auf 20 Grad. | https://developers.google.com/actions/smarthome/traits/temperaturesetting |
Timer | Timer={"commandOnlyTimer": true, "maxTimerLimitSec": 86400, "cmdTimerStart": "on-for-timer"} | Wird automatisch erstellt sobald on-for-timer verfügbar. | 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 |
Toggles | - | - | - | - | https://developers.google.com/actions/smarthome/traits/toggles |
Volume | Absolute volume control:{
"Volume" = {
"reading": "volume",
"cmd": "volume",
"levelStepSize": 3
}
}
{
"Volume" = {
"cmdUp": "volumeUp",
"cmdDown": "volumeDown",
"levelStepSize": 3
}
}
|
Wird automatisch für alle volume Readings angelegt. | Volume erlaubt die Steuerung der Lautstärke. | Mach den Fernseher lauter.
Mach das Radio leiser. |
https://developers.google.com/assistant/smarthome/traits/volume |
Die obige Darstellung gibt nicht alle Möglichkeiten von homebridgeMapping wieder, daher hier noch eine Zusammenstellung möglicher Attribute:
Attribut | Beschreibung | Beispiel innerhalb eines Mappings |
---|---|---|
cmd | Beim Ausführen eines FHEM Commands wird das hier definierte cmd inkl. der Variable von Google verwendet. | "cmd": "desiredTemp" => set device desiredTemp 21 |
cmdUp/ cmdDown | Bei relativen Steuerung kann dies verwendet werden. Z.B. Volume. | "cmdUp": "volumeUp",
"cmdDown": "volumeDown" |
reading | Bei Mappings die Werte auslesen, wird reading definiert um zu beschreiben aus welchem Reading der Wert ausgelesen wird | "reading": "state" |
fixedValue | Wenn man einen fixen Wert zurück liefern will, unabhängig vom Reading, kann fixedValue verwendet werden. | "fixedValue": "BREW" |
Beispiele
Hier findet ihr ein paar Beispielkonfigurationen für homebridgeMappings falls diese nicht automatisch von FHEM Connect erkannt werden.
Temperatur-/Feuchtigkeits-sensor
{
"TemperatureControlAmbientCelsius": {
"reading": "currentTemperature"
},
"CurrentRelativeHumidity": {
"reading": "humidity"
}
}
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.
Wenn Local Home aktiv ist, werden Sprachbefehle direkt vom Gerät an FHEM geschickt und nicht an die Cloud weitergeleitet. Ob Local Home aktiv ist, sieht man im Reading localHome. Eine ausführliche Erklärung zur Funktionsweise von Local Home ist hier zu finden: https://developers.google.com/assistant/smarthome/concepts/local
FAQs
Kann ich eine Sprachausgabe an meine Google / Nest Home Geräte senden?
Ja, das geht mit dem offiziellen GOOGLECAST Modul. Eine Weiterentwicklung davon findet ihr in einer aktuellen Testversion auf:
https://github.com/dominikkarall/fhem_pythonbinding
Fehlermeldung nach Update auf Version 3.0.0
/usr/lib/node_modules/gassistant-fhem/node_modules/vm2/lib/main.js:1048 throw this._internal.Decontextify.value(e);
In diesem Fall ist die Node Version zu alt und muss mit folgenden Befehlen aktualisiert werden:
$ curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
$ sudo apt install -y nodejs
Falls nodejs 13 bereits in Einsatz ist, dann empfehle ich nodejs zuerst zu deinstallieren (ACHTUNG: Alle installierten NodeJS Module werden deinstalliert!)
$ sudo apt purge nodejs
$ rm -rf /usr/local/lib/node-modules
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).
Hier die Liste der Geräte die Google offiziell in der Home App unterstützt, diese Liste wird laufend aktualisiert: https://developers.google.com/assistant/smarthome/develop/touch-controls
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