236 lines
11 KiB
Python
236 lines
11 KiB
Python
import logging
|
|
from .message import (
|
|
MessageQuery,
|
|
MessageC3Response,
|
|
MessageSet
|
|
)
|
|
try:
|
|
from enum import StrEnum
|
|
except ImportError:
|
|
from ...backports.enum import StrEnum
|
|
from ...core.device import MiedaDevice
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class DeviceAttributes(StrEnum):
|
|
zone1_power = "zone1_power"
|
|
zone2_power = "zone2_power"
|
|
dhw_power = "dhw_power"
|
|
zone1_curve = "zone1_curve"
|
|
zone2_curve = "zone2_curve"
|
|
disinfect = "disinfect"
|
|
fast_dhw = "fast_dhw"
|
|
zone_temp_type = "zone_temp_type"
|
|
zone1_room_temp_mode = "zone1_room_temp_mode"
|
|
zone2_room_temp_mode = "zone2_room_temp_mode"
|
|
zone1_water_temp_mode = "zone1_water_temp_mode"
|
|
zone2_water_temp_mode = "zone2_water_temp_mode"
|
|
mode = "mode"
|
|
mode_auto = "mode_auto"
|
|
zone_target_temp = "zone_target_temp"
|
|
dhw_target_temp = "dhw_target_temp"
|
|
room_target_temp = "room_target_temp"
|
|
zone_heating_temp_max = "zone_heating_temp_max"
|
|
zone_heating_temp_min = "zone_heating_temp_min"
|
|
zone_cooling_temp_max = "zone_cooling_temp_max"
|
|
zone_cooling_temp_min = "zone_cooling_temp_min"
|
|
tank_actual_temperature = "tank_actual_temperature"
|
|
room_temp_max = "room_temp_max"
|
|
room_temp_min = "room_temp_min"
|
|
dhw_temp_max = "dhw_temp_max"
|
|
dhw_temp_min = "dhw_temp_min"
|
|
target_temperature = "target_temperature"
|
|
temperature_max = "temperature_max"
|
|
temperature_min = "temperature_min"
|
|
status_heating = "status_heating"
|
|
status_dhw = "status_dhw"
|
|
status_tbh = "status_tbh"
|
|
status_ibh = "status_ibh"
|
|
total_energy_consumption = "total_energy_consumption"
|
|
total_produced_energy = "total_produced_energy"
|
|
outdoor_temperature = "outdoor_temperature"
|
|
|
|
|
|
class MideaC3Device(MiedaDevice):
|
|
def __init__(
|
|
self,
|
|
name: str,
|
|
device_id: int,
|
|
ip_address: str,
|
|
port: int,
|
|
token: str,
|
|
key: str,
|
|
protocol: int,
|
|
model: str,
|
|
customize: str
|
|
):
|
|
super().__init__(
|
|
name=name,
|
|
device_id=device_id,
|
|
device_type=0xC3,
|
|
ip_address=ip_address,
|
|
port=port,
|
|
token=token,
|
|
key=key,
|
|
protocol=protocol,
|
|
model=model,
|
|
attributes={
|
|
DeviceAttributes.zone1_power: False,
|
|
DeviceAttributes.zone2_power: False,
|
|
DeviceAttributes.dhw_power: False,
|
|
DeviceAttributes.zone1_curve: False,
|
|
DeviceAttributes.zone2_curve: False,
|
|
DeviceAttributes.disinfect: False,
|
|
DeviceAttributes.fast_dhw: False,
|
|
DeviceAttributes.zone_temp_type: [False, False],
|
|
DeviceAttributes.zone1_room_temp_mode: False,
|
|
DeviceAttributes.zone2_room_temp_mode: False,
|
|
DeviceAttributes.zone1_water_temp_mode: False,
|
|
DeviceAttributes.zone2_water_temp_mode: False,
|
|
DeviceAttributes.mode: 1,
|
|
DeviceAttributes.mode_auto: 1,
|
|
DeviceAttributes.zone_target_temp: [25, 25],
|
|
DeviceAttributes.dhw_target_temp: 25,
|
|
DeviceAttributes.room_target_temp: 30,
|
|
DeviceAttributes.zone_heating_temp_max: [55, 55],
|
|
DeviceAttributes.zone_heating_temp_min: [25, 25],
|
|
DeviceAttributes.zone_cooling_temp_max: [25, 25],
|
|
DeviceAttributes.zone_cooling_temp_min: [5, 5],
|
|
DeviceAttributes.room_temp_max: 60,
|
|
DeviceAttributes.room_temp_min: 34,
|
|
DeviceAttributes.dhw_temp_max: 60,
|
|
DeviceAttributes.dhw_temp_min: 20,
|
|
DeviceAttributes.tank_actual_temperature: None,
|
|
DeviceAttributes.target_temperature: [25, 25],
|
|
DeviceAttributes.temperature_max: [0, 0],
|
|
DeviceAttributes.temperature_min: [0, 0],
|
|
DeviceAttributes.total_energy_consumption: None,
|
|
DeviceAttributes.status_heating: None,
|
|
DeviceAttributes.status_dhw: None,
|
|
DeviceAttributes.status_tbh: None,
|
|
DeviceAttributes.status_ibh: None,
|
|
DeviceAttributes.total_produced_energy: None,
|
|
DeviceAttributes.outdoor_temperature: None
|
|
})
|
|
|
|
def build_query(self):
|
|
return [MessageQuery(self._device_protocol_version)]
|
|
|
|
def process_message(self, msg):
|
|
message = MessageC3Response(msg)
|
|
_LOGGER.debug(f"[{self.device_id}] Received: {message}")
|
|
new_status = {}
|
|
for status in self._attributes.keys():
|
|
if hasattr(message, str(status)):
|
|
self._attributes[status] = getattr(message, str(status))
|
|
new_status[str(status)] = getattr(message, str(status))
|
|
if 'zone_temp_type' in new_status:
|
|
for zone in [0, 1]:
|
|
if self._attributes[DeviceAttributes.zone_temp_type][zone]: # Water temp mode
|
|
self._attributes[DeviceAttributes.target_temperature][zone] = \
|
|
self._attributes[DeviceAttributes.zone_target_temp][zone]
|
|
if self._attributes[DeviceAttributes.mode_auto] == 2: # cooling mode
|
|
self._attributes[DeviceAttributes.temperature_max][zone] = \
|
|
self._attributes[DeviceAttributes.zone_cooling_temp_max][zone]
|
|
self._attributes[DeviceAttributes.temperature_min][zone] = \
|
|
self._attributes[DeviceAttributes.zone_cooling_temp_min][zone]
|
|
elif self._attributes[DeviceAttributes.mode] == 3: # heating mode
|
|
self._attributes[DeviceAttributes.temperature_max][zone] = \
|
|
self._attributes[DeviceAttributes.zone_heating_temp_max][zone]
|
|
self._attributes[DeviceAttributes.temperature_min][zone] = \
|
|
self._attributes[DeviceAttributes.zone_heating_temp_min][zone]
|
|
else: # Room temp mode
|
|
self._attributes[DeviceAttributes.target_temperature][zone] = \
|
|
self._attributes[DeviceAttributes.room_target_temp]
|
|
self._attributes[DeviceAttributes.temperature_max][zone] = \
|
|
self._attributes[DeviceAttributes.room_temp_max]
|
|
self._attributes[DeviceAttributes.temperature_min][zone] = \
|
|
self._attributes[DeviceAttributes.room_temp_min]
|
|
if self._attributes[DeviceAttributes.zone1_power]:
|
|
if self._attributes[DeviceAttributes.zone_temp_type][zone]:
|
|
self._attributes[DeviceAttributes.zone1_water_temp_mode] = True
|
|
self._attributes[DeviceAttributes.zone1_room_temp_mode] = False
|
|
else:
|
|
self._attributes[DeviceAttributes.zone1_water_temp_mode] = False
|
|
self._attributes[DeviceAttributes.zone1_room_temp_mode] = True
|
|
else:
|
|
self._attributes[DeviceAttributes.zone1_water_temp_mode] = False
|
|
self._attributes[DeviceAttributes.zone1_room_temp_mode] = False
|
|
if self._attributes[DeviceAttributes.zone2_power]:
|
|
if self._attributes[DeviceAttributes.zone_temp_type][zone]:
|
|
self._attributes[DeviceAttributes.zone2_water_temp_mode] = True
|
|
self._attributes[DeviceAttributes.zone2_room_temp_mode] = False
|
|
else:
|
|
self._attributes[DeviceAttributes.zone2_water_temp_mode] = False
|
|
self._attributes[DeviceAttributes.zone2_room_temp_mode] = True
|
|
else:
|
|
self._attributes[DeviceAttributes.zone2_water_temp_mode] = False
|
|
self._attributes[DeviceAttributes.zone2_room_temp_mode] = False
|
|
new_status[DeviceAttributes.zone1_water_temp_mode.value] = \
|
|
self._attributes[DeviceAttributes.zone1_water_temp_mode]
|
|
new_status[DeviceAttributes.zone2_water_temp_mode.value] = \
|
|
self._attributes[DeviceAttributes.zone2_water_temp_mode]
|
|
new_status[DeviceAttributes.zone1_room_temp_mode.value] = \
|
|
self._attributes[DeviceAttributes.zone1_room_temp_mode]
|
|
new_status[DeviceAttributes.zone2_room_temp_mode.value] = \
|
|
self._attributes[DeviceAttributes.zone2_room_temp_mode]
|
|
|
|
return new_status
|
|
|
|
def make_message_set(self):
|
|
message = MessageSet(self._device_protocol_version)
|
|
message.zone1_power = self._attributes[DeviceAttributes.zone1_power]
|
|
message.zone2_power = self._attributes[DeviceAttributes.zone2_power]
|
|
message.dhw_power = self._attributes[DeviceAttributes.dhw_power]
|
|
message.mode = self._attributes[DeviceAttributes.mode]
|
|
message.zone_target_temp = self._attributes[DeviceAttributes.zone_target_temp]
|
|
message.dhw_target_temp = self._attributes[DeviceAttributes.dhw_target_temp]
|
|
message.room_target_temp = self._attributes[DeviceAttributes.room_target_temp]
|
|
message.zone1_curve = self._attributes[DeviceAttributes.zone1_curve]
|
|
message.zone2_curve = self._attributes[DeviceAttributes.zone2_curve]
|
|
message.disinfect = self._attributes[DeviceAttributes.disinfect]
|
|
message.fast_dhw = self._attributes[DeviceAttributes.fast_dhw]
|
|
return message
|
|
|
|
def set_attribute(self, attr, value):
|
|
if attr in [
|
|
DeviceAttributes.zone1_power,
|
|
DeviceAttributes.zone2_power,
|
|
DeviceAttributes.dhw_power,
|
|
DeviceAttributes.zone1_curve,
|
|
DeviceAttributes.zone2_curve,
|
|
DeviceAttributes.disinfect,
|
|
DeviceAttributes.fast_dhw,
|
|
DeviceAttributes.dhw_target_temp
|
|
]:
|
|
message = self.make_message_set()
|
|
setattr(message, str(attr), value)
|
|
self.build_send(message)
|
|
|
|
def set_mode(self, zone, mode):
|
|
message = self.make_message_set()
|
|
if zone == 0:
|
|
message.zone1_power = True
|
|
else:
|
|
message.zone2_power = True
|
|
message.mode = mode
|
|
self.build_send(message)
|
|
|
|
def set_target_temperature(self, zone, target_temperature, mode):
|
|
message = self.make_message_set()
|
|
if self._attributes[DeviceAttributes.zone_temp_type][zone]:
|
|
message.zone_target_temp[zone] = target_temperature
|
|
else:
|
|
message.room_target_temp = target_temperature
|
|
if mode is not None:
|
|
if zone == 0:
|
|
message.zone1_power = True
|
|
else:
|
|
message.zone2_power = True
|
|
message.mode = mode
|
|
self.build_send(message)
|
|
|
|
|
|
class MideaAppliance(MideaC3Device):
|
|
pass
|