126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
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()
|