openHAB Google Assistant is based on Google Cloud Function powered by Firebase and realized by Node.js. This serverless application connects the Google Assistant platform with the users openHAB instance through the openHAB Cloud service and lets the user control IoT devices through the Google Assistant. The openHAB Smart Home app lets you connect, query, and control devices through openHAB Cloud infrastructure.
openHAB Cloud is the Smart Home IoT cloud engine in this setup and provides both the main openHAB business logic for the web services and proxying, as well as the web portal used to administrate the granted application in the frontend. It handles authentication, and ultimately handles requests from the Google Assistant. openHAB Cloud is also the access point and backend for the Node.js based openHAB Google Cloud function app that acts as mediator and adapter code. This Adapter will receive commands from the Google Assistant and has listeners for POST requests for receiving SYNC, QUERY or EXEC smart home device control messages towards the openHAB Cloud. The path for requests to this adapter is /openhabGoogleAssistant
.
Google Home Graph: The Google related parts of any Smart Home action rely on Google Home Graph, a database that stores and provides contextual data about the home and its devices. For example, Home Graph can store the concept of a living room that contains multiple types of devices (a light, television, and speaker) from different manufacturers. This information is passed to the Google Assistant in order to execute user requests based on the appropriate context.
curl -O https://dl.google.com/gactions/updates/bin/linux/amd64/gactions/gactions
chmod +x gactions
functions/config.js
host
to point to your openHAB Cloud instance, for example: openhab.myserver.com
. Do not include https
, if you do you'll get DNS errors.path
to the rest API. Defaults to /rest/items/
.Deploy the openhabGoogleAssistant
(openHAB home automation) function:
cd openhab-google-assistant/functions
gcloud beta functions deploy openhabGoogleAssistant --runtime nodejs18 --stage-bucket <BUCKET_NAME> --trigger-http --project <PROJECT ID>
Keep the address somewhere, you'll need it (something like https://us-central1-<PROJECT ID>.cloudfunctions.net/openhabGoogleAssistant
).
You'll need to create OAuth credentials to enable API access.
Since this is only used between your Google Cloud function and your openHAB cloud server, you can choose them on your own. See The Client ID and Secret - OAuth for details.
mongo
and enter these commandsuse openhab
db.oauth2clients.insert({ clientId: "<CLIENT-ID>", clientSecret: "<CLIENT SECRET>"})
db.oauth2scopes.insert({ name: "any"})
db.oauth2scopes.insert( { name : "google-assistant", description: "Access to openHAB Cloud specific API for Actions on Google Assistant", } )
Actions on Google is Google's platform for developers to extend Google Assistant. Here you need to develop your actions to engage users on Google Home, Pixel, and other surfaces where the Google Assistant is available.
glcoud beta functions
you saved earlier.https://openhab.myserver.com/oauth2/authorize
https://openhab.myserver.com/oauth2/token
google-assistant
. This links to the records that you have inserted into the MongoDB table oauth2scopes
in Setup your Database.When you ask your assistant to “Turn on the light”, it will use the auth bearer Token and call the specified endpoint. To specify which endpoint the Google Assistant should call, you need to create an action.json similar to the one below, with your endpoint URL.
openhab-google-assistant/action.json
file and specify the Google Cloud Functions endpoint. This is not your server, this is the endpoint given to you from the call to gcloud beta functions
{
"actions": [{
"name": "actions.devices",
"deviceControl": {
},
"fulfillment": {
"conversationName": "automation"
}
}],
"conversations": {
"automation" :
{
"name": "automation",
"url": "https://YOUR-FULFILLMENT-URL-GIVEN-FROM-DEPLOYMENT"
}
}
}
If you want to deploy your action in a foreign language, add locale parameter to the top of the action.js like :
{
"locale": "fr",
"actions": [{
"name": "actions.devices",
"deviceControl": {
[...]
gactions update --action_package action.json --project <PROJECT ID>
Google Assistant will call the service endpoint: https://YOUR-OPENHAB-CLOUD-URL/openhabGoogleAssistant
.
This web service will receive parameters (intents) from Google and will query/modify openHAB items through openHAB Cloud depending on those parameters.
gactions test --action_package action.json --project <PROJECT ID>
Note: Anytime you make changes to the settings to your Action on the Actions By Google interface, you'll need to repeat this step.
Add
button and then Set up device
. Then Works with Google > Have something already set up?
[test] open hab
- select itIf you're lucky this works! You'll need to configure your items (below) and then sync again. If it didn't work, try the workaround below.
To resync changes in the metadata or other openHAB configuration, tell Google Home to sync my devices
. In a few seconds any changes will appear.
If you're getting error messages about an unknown scope, first check you've updated the MongoDB correctly in the Setup your Database step. If you still have issues, you can try this:
SSH into to your openHAB Cloud instance
Edit the file routes/oauth2.js:
scope = req.oauth2.req.scope;
and insert the following line above it: scope = 'any';
//scope = req.oauth2.req.scope;
scope = 'any';
Restart your server and attempt to authorize again.
In some cases, you may wish to have your Google Cloud Function
and Actions On Google
configured on a different Google account than the one running on your Google Home (eg. you have a work account for GCP services and payments, a home account for assistant). This configuration is still possible, but you need to make some permissions changes.
Follow the same process above to setup the function and action, using your work@gmail.com account. By default, when you go to add OpenHAB to the Google Home app using your home@gmail.com account, your [test] open hab
service will NOT be available to select.
To fix:
IAM & Admin > IAM
+ ADD
button at the top of the pageProject > Viewer
roleReturn back to the Google Home app and try to add the OpenHAB service again. You should now be able to see [test] open hab
and add it successfully.
For details on how to configure your items and which voice commands you can use, please see the USAGE documentation.
In addition, you can also find information there on how to set up service linking with https://myopenhab.org within the Google Home App.
To check your deployed openHAB Google Cloud function app logs and debugging use the following command:
gcloud beta functions logs read openhabGoogleAssistant