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
|