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
|
return devices
|
||||||
responsepacket = bytearray(response[0])
|
responsepacket = bytearray(response[0])
|
||||||
host = response[1]
|
host = response[1]
|
||||||
|
devtype = responsepacket[0x34] | responsepacket[0x35] << 8
|
||||||
mac = responsepacket[0x3a:0x40]
|
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))
|
devices.append(device(host=host, mac=mac))
|
||||||
|
|
||||||
class device:
|
class device:
|
||||||
|
@ -180,6 +220,21 @@ class device:
|
||||||
response = self.cs.recvfrom(1024)
|
response = self.cs.recvfrom(1024)
|
||||||
return response[0]
|
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):
|
def set_power(self, state):
|
||||||
"""Sets the power state of the smart plug."""
|
"""Sets the power state of the smart plug."""
|
||||||
packet = bytearray(16)
|
packet = bytearray(16)
|
||||||
|
@ -198,15 +253,9 @@ class device:
|
||||||
payload = aes.decrypt(str(response[0x38:]))
|
payload = aes.decrypt(str(response[0x38:]))
|
||||||
return bool(ord(payload[0x4]))
|
return bool(ord(payload[0x4]))
|
||||||
|
|
||||||
def send_data(self, data):
|
class a1(device):
|
||||||
packet = bytearray([0x02, 0x00, 0x00, 0x00])
|
def __init__ (self, host, mac):
|
||||||
packet += data
|
device.__init__(self, host, mac)
|
||||||
self.send_packet(0x6a, packet)
|
|
||||||
|
|
||||||
def enter_learning(self):
|
|
||||||
packet = bytearray(16)
|
|
||||||
packet[0] = 3
|
|
||||||
self.send_packet(0x6a, packet)
|
|
||||||
|
|
||||||
def check_sensors(self):
|
def check_sensors(self):
|
||||||
packet = bytearray(16)
|
packet = bytearray(16)
|
||||||
|
@ -252,16 +301,10 @@ class device:
|
||||||
data['noise'] = 'unknown'
|
data['noise'] = 'unknown'
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def check_temperature(self):
|
|
||||||
packet = bytearray(16)
|
class rm(device):
|
||||||
packet[0] = 1
|
def __init__ (self, host, mac):
|
||||||
response = self.send_packet(0x6a, packet)
|
device.__init__(self, host, mac)
|
||||||
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
|
|
||||||
|
|
||||||
def check_data(self):
|
def check_data(self):
|
||||||
packet = bytearray(16)
|
packet = bytearray(16)
|
||||||
|
@ -273,7 +316,29 @@ class device:
|
||||||
payload = aes.decrypt(str(response[0x38:]))
|
payload = aes.decrypt(str(response[0x38:]))
|
||||||
return payload[0x04:]
|
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):
|
def __init__ (self):
|
||||||
device.__init__(self, None, None)
|
device.__init__(self, None, None)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue