Skip to content

Commit 1e04ec2

Browse files
committed
Merge branch 'master' into smartplug.
2 parents 652f52e + d490c5b commit 1e04ec2

1 file changed

Lines changed: 83 additions & 18 deletions

File tree

broadlink/__init__.py

Lines changed: 83 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,48 @@ def discover(timeout=None):
7575
return devices
7676
responsepacket = bytearray(response[0])
7777
host = response[1]
78+
devtype = responsepacket[0x34] | responsepacket[0x35] << 8
7879
mac = responsepacket[0x3a:0x40]
79-
devices.append(device(host=host, mac=mac))
80+
if devtype == 0: # SP1
81+
devices.append(sp1(host=host, mac=mac))
82+
if devtype == 0x2711: # SP2
83+
devices.append(sp2(host=host, mac=mac))
84+
if devtype == 0x2719 or devtype == 0x7919 or devtype == 0x271a or devtype == 0x791a: # Honeywell SP2
85+
devices.append(sp2(host=host, mac=mac))
86+
if devtype == 0x2720: # SPMini
87+
devices.append(sp2(host=host, mac=mac))
88+
elif devtype == 0x753e: # SP3
89+
devices.append(sp2(host=host, mac=mac))
90+
elif devtype == 0x2728: # SPMini2
91+
devices.append(sp2(host=host, mac=mac))
92+
elif devtype == 0x2733 or devtype == 0x273e: # OEM branded SPMini
93+
devices.append(sp2(host=host, mac=mac))
94+
elif devtype >= 0x7530 and devtype <= 0x7918: # OEM branded SPMini2
95+
devices.append(sp2(host=host, mac=mac))
96+
elif devtype == 0x2736: # SPMiniPlus
97+
devices.append(sp2(host=host, mac=mac))
98+
elif devtype == 0x2712: # RM2
99+
devices.append(rm(host=host, mac=mac))
100+
elif devtype == 0x2737: # RM Mini
101+
devices.append(rm(host=host, mac=mac))
102+
elif devtype == 0x273d: # RM Pro Phicomm
103+
devices.append(rm(host=host, mac=mac))
104+
elif devtype == 0x2783: # RM2 Home Plus
105+
devices.append(rm(host=host, mac=mac))
106+
elif devtype == 0x277c: # RM2 Home Plus GDT
107+
devices.append(rm(host=host, mac=mac))
108+
elif devtype == 0x272a: # RM2 Pro Plus
109+
devices.append(rm(host=host, mac=mac))
110+
elif devtype == 0x2787: # RM2 Pro Plus2
111+
devices.append(rm(host=host, mac=mac))
112+
elif devtype == 0x278b: # RM2 Pro Plus BL
113+
devices.append(rm(host=host, mac=mac))
114+
elif devtype == 0x278f: # RM Mini Shate
115+
devices.append(rm(host=host, mac=mac))
116+
elif devtype == 0x2714: # A1
117+
devices.append(a1(host=host, mac=mac))
118+
else:
119+
devices.append(device(host=host, mac=mac))
80120

81121
class device:
82122
def __init__(self, host, mac):
@@ -180,6 +220,21 @@ def send_packet(self, command, payload):
180220
response = self.cs.recvfrom(1024)
181221
return response[0]
182222

223+
224+
class sp1(device):
225+
def __init__ (self, host, mac):
226+
device.__init__(self, host, mac)
227+
228+
def set_power(self, state):
229+
packet = bytearray(4)
230+
packet[0] = state
231+
self.send_packet(0x66, packet)
232+
233+
234+
class sp2(device):
235+
def __init__ (self, host, mac):
236+
device.__init__(self, host, mac)
237+
183238
def set_power(self, state):
184239
"""Sets the power state of the smart plug."""
185240
packet = bytearray(16)
@@ -198,15 +253,9 @@ def check_power(self):
198253
payload = aes.decrypt(str(response[0x38:]))
199254
return bool(ord(payload[0x4]))
200255

201-
def send_data(self, data):
202-
packet = bytearray([0x02, 0x00, 0x00, 0x00])
203-
packet += data
204-
self.send_packet(0x6a, packet)
205-
206-
def enter_learning(self):
207-
packet = bytearray(16)
208-
packet[0] = 3
209-
self.send_packet(0x6a, packet)
256+
class a1(device):
257+
def __init__ (self, host, mac):
258+
device.__init__(self, host, mac)
210259

211260
def check_sensors(self):
212261
packet = bytearray(16)
@@ -252,28 +301,44 @@ def check_sensors(self):
252301
data['noise'] = 'unknown'
253302
return data
254303

255-
def check_temperature(self):
304+
305+
class rm(device):
306+
def __init__ (self, host, mac):
307+
device.__init__(self, host, mac)
308+
309+
def check_data(self):
256310
packet = bytearray(16)
257-
packet[0] = 1
311+
packet[0] = 4
258312
response = self.send_packet(0x6a, packet)
259313
err = ord(response[0x22]) | (ord(response[0x23]) << 8)
260314
if err == 0:
261315
aes = AES.new(str(self.key), AES.MODE_CBC, str(self.iv))
262316
payload = aes.decrypt(str(response[0x38:]))
263-
temp = (ord(payload[0x4]) * 10 + ord(payload[0x5])) / 10.0
264-
return temp
317+
return payload[0x04:]
265318

266-
def check_data(self):
319+
def send_data(self, data):
320+
packet = bytearray([0x02, 0x00, 0x00, 0x00])
321+
packet += data
322+
self.send_packet(0x6a, packet)
323+
324+
def enter_learning(self):
267325
packet = bytearray(16)
268-
packet[0] = 4
326+
packet[0] = 3
327+
self.send_packet(0x6a, packet)
328+
329+
def check_temperature(self):
330+
packet = bytearray(16)
331+
packet[0] = 1
269332
response = self.send_packet(0x6a, packet)
270333
err = ord(response[0x22]) | (ord(response[0x23]) << 8)
271334
if err == 0:
272335
aes = AES.new(str(self.key), AES.MODE_CBC, str(self.iv))
273336
payload = aes.decrypt(str(response[0x38:]))
274-
return payload[0x04:]
337+
temp = (ord(payload[0x4]) * 10 + ord(payload[0x5])) / 10.0
338+
return temp
275339

276-
class rm2(device):
340+
# For legay compatibility - don't use this
341+
class rm2(rm):
277342
def __init__ (self):
278343
device.__init__(self, None, None)
279344

0 commit comments

Comments
 (0)