@@ -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
81121class 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