diff options
author | Przemek Wiech <pwiech@gmail.com> | 2016-11-18T20·20+0100 |
---|---|---|
committer | Przemek Wiech <pwiech@gmail.com> | 2016-11-18T20·20+0100 |
commit | 1e04ec2be57fa61a8d205df8f8cbfa18c8fdd40a (patch) | |
tree | 1c3a29940af817000aabf83b3f4ea6c3ef1fca22 /broadlink | |
parent | 652f52eb039a0ecd3fb157558d88374aabe013fe (diff) | |
parent | d490c5b71eaa9fa19f711648a92359678717682f (diff) |
Merge branch 'master' into smartplug.
Diffstat (limited to 'broadlink')
-rwxr-xr-x | broadlink/__init__.py | 101 |
1 files changed, 83 insertions, 18 deletions
diff --git a/broadlink/__init__.py b/broadlink/__init__.py index 45c3d06011e0..53ab886b0414 100755 --- a/broadlink/__init__.py +++ b/broadlink/__init__.py @@ -75,8 +75,48 @@ def discover(timeout=None): return devices responsepacket = bytearray(response[0]) host = response[1] + devtype = responsepacket[0x34] | responsepacket[0x35] << 8 mac = responsepacket[0x3a:0x40] - devices.append(device(host=host, mac=mac)) + 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: def __init__(self, host, mac): @@ -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,28 +301,44 @@ class device: data['noise'] = 'unknown' return data - def check_temperature(self): + +class rm(device): + def __init__ (self, host, mac): + device.__init__(self, host, mac) + + def check_data(self): packet = bytearray(16) - packet[0] = 1 + packet[0] = 4 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 + return payload[0x04:] - def check_data(self): + 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] = 4 + 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:])) - return payload[0x04:] + temp = (ord(payload[0x4]) * 10 + ord(payload[0x5])) / 10.0 + return temp -class rm2(device): +# For legay compatibility - don't use this +class rm2(rm): def __init__ (self): device.__init__(self, None, None) |