-
Notifications
You must be signed in to change notification settings - Fork 0
/
pytcpconnected.py
144 lines (122 loc) · 4.06 KB
/
pytcpconnected.py
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
__author__ = 'hagenbuch'
import requests
import xml.etree.ElementTree as ET
import urllib.parse as url
import logging
class TcpController:
def __init__(self, host):
# populate the individual lights (assumes single room)
self.host = host
self.lights = {}
self.logger = logging.getLogger(__name__)
def get_lights(self):
try:
response = requests.get(make_request(self.host, BATCH_CMD, SCAN_DATA))
root = ET.fromstring(response.text)
for device in root.iter('device'):
light_info = {e.tag: e.text for e in device.getiterator()}
self.lights['did'] = light_info
except requests.exceptions.RequestException:
self.logger.error("Scan request to gateway failed!")
return self.lights
def turn_on(self, did):
return self._set_state(did, '1')
def turn_off(self, did):
return self._set_state(did, '0')
def _set_state(self, did, value):
try:
response = requests.post(
make_request(self.host),
POST_FORMAT.format(
cmd=DEV_CMD,
data=STATE_DATA_FORMAT.format(
did=did,
value=value
),
fmt=DATA_FMT
))
if response.status_code == 200:
return True
else:
self.logger.error("Gateway refused request set light state. Status code = "
+ str(response.status_code))
return False
except requests.exceptions.RequestException:
self.logger.error("Request to set light state failed!")
return False
def set_brightness(self, did, value):
try:
response = requests.post(
make_request(self.host),
POST_FORMAT.format(
cmd=DEV_CMD,
data=BRIGHTNESS_DATA_FORMAT.format(
did=did,
value=value
),
fmt=DATA_FMT
))
if response.status_code == 200:
return True
else:
self.logger.error("Gateway refused request set light brightness. Status code = "
+ str(response.status_code))
return False
except requests.exceptions.RequestException:
self.logger.error("Request to set light brightness failed!")
return False
def make_request(hostname, command_type=None, data=None):
command = ''
if command_type is not None and data is not None:
data = data.strip().replace('\n', '').replace(' ', '').replace('\t', ' ')
command = "?" + url.urlencode({'cmd': command_type, 'data': data, 'fmt': DATA_FMT})
return REQUEST_FORMAT.format(
hostname=hostname,
cmd=command)
BATCH_CMD = 'GWRBatch'
DEV_CMD = 'DeviceSendCommand'
DATA_FMT = 'xml'
SCAN_DATA = \
'''
<gwrcmds>
<gwrcmd>
<gcmd>RoomGetCarousel</gcmd>
<gdata>
<gip>
<version>1</version>
<token>1234567890</token>
<fields>
name,
control,
power,
product,
class,
realtype,
status
</fields>
</gip>
</gdata>
</gwrcmd>
</gwrcmds>
'''
STATE_DATA_FORMAT = \
'''
<gip>
<version>1</version>
<token>1234567890</token>
<did>{did}</did>
<value>{value}</value>
</gip>
'''
BRIGHTNESS_DATA_FORMAT = \
'''
<gip>
<version>1</version>
<token>1234567890</token>
<did>{did}</did>
<value>{value}</value>
<type>level</type>
</gip>
'''
REQUEST_FORMAT = "http://{hostname}/gwr/gop.php{cmd}"
POST_FORMAT = "cmd={cmd}&data{data}=&fmt={fmt}"