Welcome to mirror list, hosted at ThFree Co, Russian Federation.

README.md - github.com/ClusterM/google-assistant-smart-home.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 013ed17b72a055d9104c7ca4bef642f0de85c892 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# 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:
```json
{
    "password": "test",
    "devices": [
        "pc"
    ]
}
```

* Create file _device-name_.json in __devices__ directory and write json config for device using Google guides: https://developers.google.com/assistant/smarthome/concepts/devices-traits

Example for simple on-off device:
```json
{
    "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:
```python
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