Merge branch 'master' into smartplug.
This commit is contained in:
commit
1e04ec2be5
1 changed files with 86 additions and 21 deletions
|
@ -75,7 +75,47 @@ def discover(timeout=None):
|
|||
return devices
|
||||
responsepacket = bytearray(response[0])
|
||||
host = response[1]
|
||||
devtype = responsepacket[0x34] | responsepacket[0x35] << 8
|
||||
mac = responsepacket[0x3a:0x40]
|
||||
if devtype == 0: # SP1
|
||||
devices.append(sp1(host=host, mac=mac))
|
||||
if devtype == 0x2711: # SP2
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
if devtype == 0x2719 or devtype == 0x7919 or devtype == 0x271a or devtype == 0x791a: # Honeywell SP2
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
if devtype == 0x2720: # SPMini
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype == 0x753e: # SP3
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype == 0x2728: # SPMini2
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype == 0x2733 or devtype == 0x273e: # OEM branded SPMini
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype >= 0x7530 and devtype <= 0x7918: # OEM branded SPMini2
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype == 0x2736: # SPMiniPlus
|
||||
devices.append(sp2(host=host, mac=mac))
|
||||
elif devtype == 0x2712: # RM2
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x2737: # RM Mini
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x273d: # RM Pro Phicomm
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x2783: # RM2 Home Plus
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x277c: # RM2 Home Plus GDT
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x272a: # RM2 Pro Plus
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x2787: # RM2 Pro Plus2
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x278b: # RM2 Pro Plus BL
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x278f: # RM Mini Shate
|
||||
devices.append(rm(host=host, mac=mac))
|
||||
elif devtype == 0x2714: # A1
|
||||
devices.append(a1(host=host, mac=mac))
|
||||
else:
|
||||
devices.append(device(host=host, mac=mac))
|
||||
|
||||
class device:
|
||||
|
@ -180,6 +220,21 @@ class device:
|
|||
response = self.cs.recvfrom(1024)
|
||||
return response[0]
|
||||
|
||||
|
||||
class sp1(device):
|
||||
def __init__ (self, host, mac):
|
||||
device.__init__(self, host, mac)
|
||||
|
||||
def set_power(self, state):
|
||||
packet = bytearray(4)
|
||||
packet[0] = state
|
||||
self.send_packet(0x66, packet)
|
||||
|
||||
|
||||
class sp2(device):
|
||||
def __init__ (self, host, mac):
|
||||
device.__init__(self, host, mac)
|
||||
|
||||
def set_power(self, state):
|
||||
"""Sets the power state of the smart plug."""
|
||||
packet = bytearray(16)
|
||||
|
@ -198,15 +253,9 @@ class device:
|
|||
payload = aes.decrypt(str(response[0x38:]))
|
||||
return bool(ord(payload[0x4]))
|
||||
|
||||
def send_data(self, data):
|
||||
packet = bytearray([0x02, 0x00, 0x00, 0x00])
|
||||
packet += data
|
||||
self.send_packet(0x6a, packet)
|
||||
|
||||
def enter_learning(self):
|
||||
packet = bytearray(16)
|
||||
packet[0] = 3
|
||||
self.send_packet(0x6a, packet)
|
||||
class a1(device):
|
||||
def __init__ (self, host, mac):
|
||||
device.__init__(self, host, mac)
|
||||
|
||||
def check_sensors(self):
|
||||
packet = bytearray(16)
|
||||
|
@ -252,16 +301,10 @@ class device:
|
|||
data['noise'] = 'unknown'
|
||||
return data
|
||||
|
||||
def check_temperature(self):
|
||||
packet = bytearray(16)
|
||||
packet[0] = 1
|
||||
response = self.send_packet(0x6a, packet)
|
||||
err = ord(response[0x22]) | (ord(response[0x23]) << 8)
|
||||
if err == 0:
|
||||
aes = AES.new(str(self.key), AES.MODE_CBC, str(self.iv))
|
||||
payload = aes.decrypt(str(response[0x38:]))
|
||||
temp = (ord(payload[0x4]) * 10 + ord(payload[0x5])) / 10.0
|
||||
return temp
|
||||
|
||||
class rm(device):
|
||||
def __init__ (self, host, mac):
|
||||
device.__init__(self, host, mac)
|
||||
|
||||
def check_data(self):
|
||||
packet = bytearray(16)
|
||||
|
@ -273,7 +316,29 @@ class device:
|
|||
payload = aes.decrypt(str(response[0x38:]))
|
||||
return payload[0x04:]
|
||||
|
||||
class rm2(device):
|
||||
def send_data(self, data):
|
||||
packet = bytearray([0x02, 0x00, 0x00, 0x00])
|
||||
packet += data
|
||||
self.send_packet(0x6a, packet)
|
||||
|
||||
def enter_learning(self):
|
||||
packet = bytearray(16)
|
||||
packet[0] = 3
|
||||
self.send_packet(0x6a, packet)
|
||||
|
||||
def check_temperature(self):
|
||||
packet = bytearray(16)
|
||||
packet[0] = 1
|
||||
response = self.send_packet(0x6a, packet)
|
||||
err = ord(response[0x22]) | (ord(response[0x23]) << 8)
|
||||
if err == 0:
|
||||
aes = AES.new(str(self.key), AES.MODE_CBC, str(self.iv))
|
||||
payload = aes.decrypt(str(response[0x38:]))
|
||||
temp = (ord(payload[0x4]) * 10 + ord(payload[0x5])) / 10.0
|
||||
return temp
|
||||
|
||||
# For legay compatibility - don't use this
|
||||
class rm2(rm):
|
||||
def __init__ (self):
|
||||
device.__init__(self, None, None)
|
||||
|
||||
|
|
Loading…
Reference in a new issue