forked from chaeron/thermostat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththermostat_relay_setter_hidusb.py
56 lines (36 loc) · 1.29 KB
/
thermostat_relay_setter_hidusb.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
from thermostat_relay_setter import BaseRelaySetter
from thermostat_hidusb_base import HIDRelay
from ctypes import *
import struct
class HIDUSBRelaySetter(BaseRelaySetter, HIDRelay):
def __init__(self, settings):
HIDRelay.__init__(self, settings)
def set(self, state):
if self.relayHandle is None:
if (self.opendevice() is False):
return -1
mask = 1 << self.usbRelayNum
# ALL ON=0xFE, ALL OFF=0xFC
if state :
bit = 0xFF
else:
bit = 0xFD
rep = struct.pack('BBBBBBBBB', 0x00, bit, self.usbRelayNum + 1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
reportnum = c_int(0)
len = c_int(9) # report id 1 byte + 8 bytes data
report = self.h.String(rep)
res3 = self.h.usbhidSetReport(self.relayHandle, report, 9)
# Read back & verify
buffer = self.h.String("")
err = self.h.usbhidGetReport(self.relayHandle, reportnum, buffer, byref(len))
if err != 0:
errmsg = self.h.String("")
self.h.usbhidStrerror_r(result, errmsg, c_int(80))
print ("Error switching USB relay: {0}".format(errmsg))
return -1
if len != 9 or buffer.raw[8:9] != reportnum:
#printerr("ERROR: wrong HID report returned! %d\n", len)
return -2
intState = int.from_bytes(buffer.raw[8:9], byteorder='little')
isSet = mask & intState
return isSet and state