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…
	
	Add table
		Add a link
		
	
		Reference in a new issue