Skip to content

Simple Python framework to control your DIY smart home devices using Google Assistant

License

Notifications You must be signed in to change notification settings

Roger8/google-assistant-smart-home

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

google-assistant-smart-home

Simple Python framework to control your DIY smart home devices using Google Assistant

Requirements

  • Web server (you can use some single-board computer like Raspberry Pi)
  • Domain name
  • SSL certificate for HTTPS (you can use free certificate from Let's Entrypt)
  • This project is based on Flask, so you need Python 3.x.x and Flask to be installed

How to install

  • Checkout project somewhere on your server
  • Edit google_home.wsgi and change path to project directory
  • Deploy project to your web server using WSGI, don't forget to allow authorization header
  • Go to https://console.actions.google.com/ and create new project, select "smart home" type
  • Open "Develop"->"Invocation" and type name of your project
  • Open "Develop"->"Actions" and type fulfillment URL: https://your-domain-name/
  • Open "Develop"->"Account linking" and type

Client ID: some ID, just remember it for now

Client secret: some password, remember it too and keep it secret

Authorization URL: https://your-domain-name/auth/

Token URL: https://your-domain-name/token/

  • Open https://console.cloud.google.com -> "APIs & Services" -> "ENABLE APIS AND SERVICES" -> "HomeGraph API" -> "Manage" -> "Credentials" -> "Credentials in APIs & Services" -> "CREATE CREDENTIALS" -> "API Key", store it somewhere
  • Edit config.py and fill CLIENT_ID, CLIENT_SECRET and API_KEY with your credentials, also change USERS_DIRECTORY, TOKENS_DIRECTORY, and DEVICES_DIRECTORY to your users, tokens and devices paths
  • It's recommended to chmod go-rwx tokens users

How to use

  • Create file username.json in users directory and write json config for user with password and list of available devices:
{
    "password": "test",
    "devices": [
        "pc"
    ]
}

Example for simple on-off device:

{
    "type": "action.devices.types.SWITCH",
    "traits": [
        "action.devices.traits.OnOff"
    ],
    "name": {
        "name": "PC",
        "defaultNames": [
          "PC",
          "Computer"
        ],
        "nicknames": [
          "PC",
          "Computer"
        ]
    },
    "willReportState": false,
    "roomHint": "My room",
    "deviceInfo": {
        "manufacturer": "Cluster",
        "model": "1",
        "hwVersion": "1",
        "swVersion": "1"
    }
}
  • Create file device-name.py in devices directory and write python script with two methods: device-name_query(custom_data) and device-name_command(custom_data, command, params)

Example script to turn on/off PC:

import subprocess

def pc_query(custom_data):
    p = subprocess.run(["ping", "-c", "1", "192.168.0.2"], stdout=subprocess.PIPE)
    state = p.returncode == 0
    return {"on": state, "online": True}

def pc_action(custom_data, command, params):
    if command == "action.devices.commands.OnOff":
        if params['on']:
            subprocess.run(["wakeonlan", "-i", "192.168.0.255", "00:11:22:33:44:55"])
        else:
            subprocess.run(["sh", "-c", "echo shutdown -h | ssh clust@192.168.0.2"])
        return {"status": "SUCCESS", "states": {"on": params['on'], "online": True}}
    else:
        return {"status": "ERROR"}

Query fuction must return device status object, and action function must return action result. Please read traits documentation for more info: https://developers.google.com/assistant/smarthome/traits.

  • Open Google Home app on your phone and link it with your project
  • Done! You can control your devices using voice commands or Google Home app
  • Run sync.py script when you need to update devices list

About

Simple Python framework to control your DIY smart home devices using Google Assistant

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 93.2%
  • HTML 5.7%
  • CSS 1.1%