Midea/midea_ac_lan/midea/devices/cc/message.py

127 lines
4.3 KiB
Python
Raw Normal View History

2023-09-22 05:45:40 +00:00
from ...core.message import (
MessageType,
MessageRequest,
MessageResponse,
MessageBody,
)
class MessageCCBase(MessageRequest):
def __init__(self, device_protocol_version, message_type, body_type):
super().__init__(
device_protocol_version=device_protocol_version,
device_type=0xCC,
message_type=message_type,
body_type=body_type
)
@property
def _body(self):
raise NotImplementedError
class MessageQuery(MessageCCBase):
def __init__(self, device_protocol_version):
super().__init__(
device_protocol_version=device_protocol_version,
message_type=MessageType.query,
body_type=0x01)
@property
def _body(self):
return bytearray([0x00] * 23)
class MessageSet(MessageCCBase):
def __init__(self, device_protocol_version):
super().__init__(
device_protocol_version=device_protocol_version,
message_type=MessageType.set,
body_type=0xC3)
self.power = False
self.mode = 4
self.fan_speed = 0x80
self.target_temperature = 26
self.eco_mode = False
self.sleep_mode = False
self.night_light = False
self.ventilation = False
self.aux_heat_status = 0
self.auto_aux_heat_running = False
self.swing = False
@property
def _body(self):
# Byte1, Power Mode
power = 0x80 if self.power else 0
mode = 1 << (self.mode - 1)
# Byte2 fan_speed
fan_speed = self.fan_speed
# Byte3 Integer of target_temperature
temperature_integer = int(self.target_temperature) & 0xFF
# Byte6 eco_mode ventilation aux_heating
eco_mode = 0x01 if self.eco_mode else 0
if self.aux_heat_status == 1:
aux_heating = 0x10
elif self.aux_heat_status == 2:
aux_heating = 0x20
else:
aux_heating = 0
swing = 0x04 if self.swing else 0
ventilation = 0x08 if self.ventilation else 0
# Byte8 sleep_mode night_light
sleep_mode = 0x10 if self.sleep_mode else 0
night_light = 0x08 if self.night_light else 0
# Byte11 Dot of target_temperature
temperature_dot = int((self.target_temperature - temperature_integer) * 10) & 0xFF
return bytearray([
power | mode,
fan_speed,
temperature_integer,
# timer
0x00, 0x00,
eco_mode | ventilation | swing | aux_heating,
# non-stepless fan speed
0xFF,
sleep_mode | night_light,
0x00, 0x00,
temperature_dot,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
])
class CCGeneralMessageBody(MessageBody):
def __init__(self, body):
super().__init__(body)
self.power = (body[1] & 0x80) > 0
mode = body[1] & 0x1F
self.mode = 0
while mode >= 1:
mode /= 2
self.mode += 1
self.fan_speed = body[2]
self.target_temperature = body[3] + body[19] / 10
self.indoor_temperature = (body[4] - 40) / 2
self.eco_mode = (body[13] & 0x01) > 0
self.sleep_mode = (body[14] & 0x10) > 0
self.night_light = (body[14] & 0x08) > 0
self.ventilation = (body[13] & 0x08) > 0
self.aux_heat_status = (body[14] & 0x60) >> 5
self.auto_aux_heat_running = (body[13] & 0x02) > 0
self.fan_speed_level = (body[13] & 0x40) > 0
self.temperature_precision = 1 if (body[14] & 0x80) > 0 else 0.5
self.swing = (body[13] & 0x04) > 0
self.temp_fahrenheit = (body[20] & 0x80) > 0
class MessageCCResponse(MessageResponse):
def __init__(self, message):
super().__init__(message)
if (self.message_type == MessageType.query and self.body_type == 0x01) or \
(self.message_type in [MessageType.notify1, MessageType.notify2] and self.body_type == 0x01) or \
(self.message_type == MessageType.set and self.body_type == 0xC3):
self.set_body(CCGeneralMessageBody(super().body))
self.set_attr()