174 lines
6.8 KiB
Python
174 lines
6.8 KiB
Python
from ...core.message import (
|
|
MessageType,
|
|
MessageRequest,
|
|
MessageResponse,
|
|
MessageBody
|
|
)
|
|
|
|
|
|
class Message26Base(MessageRequest):
|
|
def __init__(self, device_protocol_version, message_type, body_type):
|
|
super().__init__(
|
|
device_protocol_version=device_protocol_version,
|
|
device_type=0x26,
|
|
message_type=message_type,
|
|
body_type=body_type
|
|
)
|
|
|
|
@property
|
|
def _body(self):
|
|
raise NotImplementedError
|
|
|
|
|
|
class MessageQuery(Message26Base):
|
|
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([
|
|
])
|
|
|
|
|
|
class MessageSet(Message26Base):
|
|
def __init__(self, device_protocol_version):
|
|
super().__init__(
|
|
device_protocol_version=device_protocol_version,
|
|
message_type=MessageType.set,
|
|
body_type=0x01)
|
|
self.fields = {}
|
|
self.main_light = False
|
|
self.night_light = False
|
|
self.mode = 0
|
|
self.direction = 0xFD
|
|
|
|
def read_field(self, field):
|
|
value = self.fields.get(field, 0)
|
|
return value if value else 0
|
|
|
|
@property
|
|
def _body(self):
|
|
return bytearray([
|
|
1 if self.main_light else 0,
|
|
self.read_field("MAIN_LIGHT_BRIGHTNESS"),
|
|
1 if self.night_light else 0,
|
|
self.read_field("NIGHT_LIGHT_BRIGHTNESS"),
|
|
self.read_field("RADAR_INDUCTION_ENABLE"),
|
|
self.read_field("RADAR_INDUCTION_CLOSING_TIME"),
|
|
self.read_field("LIGHT_INTENSITY_THRESHOLD"),
|
|
self.read_field("RADAR_SENSITIVITY"),
|
|
1 if self.mode == 1 or self.mode == 2 else 0,
|
|
0 if not (self.mode == 1 or self.mode == 2) else 55 if self.mode == 1 else 30,
|
|
self.read_field("HEATING_SPEED"),
|
|
self.direction,
|
|
1 if self.mode == 3 else 0,
|
|
self.read_field("BATH_HEATING_TIME"),
|
|
self.read_field("BATH_TEMPERATURE"),
|
|
self.read_field("BATH_SPEED"),
|
|
self.direction,
|
|
1 if self.mode == 5 else 0,
|
|
self.read_field("VENTILATION_SPEED"),
|
|
self.direction,
|
|
1 if self.mode == 6 else 0,
|
|
self.read_field("DRYING_TIME"),
|
|
self.read_field("DRYING_TEMPERATURE"),
|
|
self.read_field("DRYING_SPEED"),
|
|
self.direction,
|
|
1 if self.mode == 4 else 0,
|
|
self.read_field("BLOWING_SPEED"),
|
|
self.direction,
|
|
self.read_field("DELAY_ENABLE"),
|
|
self.read_field("DELAY_TIME"),
|
|
self.read_field("SOFT_WIND_ENABLE"),
|
|
self.read_field("SOFT_WIND_TIME"),
|
|
self.read_field("SOFT_WIND_TEMPERATURE"),
|
|
self.read_field("SOFT_WIND_SPEED"),
|
|
self.read_field("SOFT_WIND_DIRECTION"),
|
|
self.read_field("WINDLESS_ENABLE"),
|
|
self.read_field("ANION_ENABLE"),
|
|
self.read_field("SMELLY_ENABLE"),
|
|
self.read_field("SMELLY_THRESHOLD")
|
|
])
|
|
|
|
|
|
class Message26Body(MessageBody):
|
|
def __init__(self, body):
|
|
super().__init__(body)
|
|
self.fields = {}
|
|
self.main_light = self.read_byte(body, 1) > 0
|
|
self.fields["MAIN_LIGHT_BRIGHTNESS"] = self.read_byte(body, 2)
|
|
self.night_light = self.read_byte(body, 3) > 0
|
|
self.fields["NIGHT_LIGHT_BRIGHTNESS"] = self.read_byte(body, 4)
|
|
self.fields["RADAR_INDUCTION_ENABLE"] = self.read_byte(body, 5)
|
|
self.fields["RADAR_INDUCTION_CLOSING_TIME"] = self.read_byte(body, 6)
|
|
self.fields["LIGHT_INTENSITY_THRESHOLD"] = self.read_byte(body, 7)
|
|
self.fields["RADAR_SENSITIVITY"] = self.read_byte(body, 8)
|
|
heat_mode = self.read_byte(body, 9) > 0
|
|
heat_temperature = self.read_byte(body, 10)
|
|
self.fields["HEATING_SPEED"] = self.read_byte(body, 11)
|
|
heat_direction = self.read_byte(body, 12)
|
|
bath_mode = self.read_byte(body, 13) > 0
|
|
self.fields["BATH_HEATING_TIME"] = self.read_byte(body, 14)
|
|
self.fields["BATH_TEMPERATURE"] = self.read_byte(body, 15)
|
|
self.fields["BATH_SPEED"] = self.read_byte(body, 16)
|
|
bath_direction = self.read_byte(body, 17)
|
|
ventilation_mode = self.read_byte(body, 18) > 0
|
|
self.fields["VENTILATION_SPEED"] = self.read_byte(body, 19)
|
|
ventilation_direction = self.read_byte(body, 20)
|
|
dry_mode = self.read_byte(body, 21) > 0
|
|
self.fields["DRYING_TIME"] = self.read_byte(body, 22)
|
|
self.fields["DRYING_TEMPERATURE"] = self.read_byte(body, 23)
|
|
self.fields["DRYING_SPEED"] = self.read_byte(body, 24)
|
|
dry_direction = self.read_byte(body, 25)
|
|
blow_mode = self.read_byte(body, 26) > 0
|
|
self.fields["BLOWING_SPEED"] = self.read_byte(body, 27)
|
|
blow_direction = self.read_byte(body, 28)
|
|
self.fields["DELAY_ENABLE"] = self.read_byte(body, 29)
|
|
self.fields["DELAY_TIME"] = self.read_byte(body, 30)
|
|
if self.read_byte(body, 31) != 0xFF:
|
|
self.current_humidity = self.read_byte(body, 31)
|
|
if self.read_byte(body, 32) != 0xFF:
|
|
self.current_radar = self.read_byte(body, 32)
|
|
if self.read_byte(body, 33) != 0xFF:
|
|
self.current_temperature = self.read_byte(body, 33)
|
|
self.fields["SOFT_WIND_ENABLE"] = self.read_byte(body, 38)
|
|
self.fields["SOFT_WIND_TIME"] = self.read_byte(body, 39)
|
|
self.fields["SOFT_WIND_TEMPERATURE"] = self.read_byte(body, 40)
|
|
self.fields["SOFT_WIND_SPEED"] = self.read_byte(body, 41)
|
|
self.fields["SOFT_WIND_DIRECTION"] = self.read_byte(body, 42)
|
|
self.fields["WINDLESS_ENABLE"] = self.read_byte(body, 43)
|
|
self.fields["ANION_ENABLE"] = self.read_byte(body, 44)
|
|
self.fields["SMELLY_ENABLE"] = self.read_byte(body, 45)
|
|
self.fields["SMELLY_THRESHOLD"] = self.read_byte(body, 46)
|
|
self.mode = 0
|
|
self.direction = 0xFD
|
|
if heat_mode:
|
|
if heat_temperature > 50:
|
|
self.mode = 1
|
|
else:
|
|
self.mode = 2
|
|
self.direction = heat_direction
|
|
elif bath_mode:
|
|
self.mode = 3
|
|
self.direction = bath_direction
|
|
elif blow_mode:
|
|
self.mode = 4
|
|
self.direction = blow_direction
|
|
elif ventilation_mode:
|
|
self.mode = 5
|
|
self.direction = ventilation_direction
|
|
elif dry_mode:
|
|
self.mode = 6
|
|
self.direction = dry_direction
|
|
|
|
|
|
class Message26Response(MessageResponse):
|
|
def __init__(self, message):
|
|
super().__init__(message)
|
|
if self.message_type in [MessageType.set, MessageType.notify1, MessageType.query] and self.body_type == 0x01:
|
|
self.set_body(Message26Body(super().body))
|
|
self.set_attr()
|
|
|