Home Assistant Unofficial Reference 2024.12.1
atlantic_electrical_towel_dryer.py
Go to the documentation of this file.
1 """Support for Atlantic Electrical Towel Dryer."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 
7 from pyoverkiz.enums import OverkizCommand, OverkizCommandParam, OverkizState
8 
10  PRESET_BOOST,
11  PRESET_NONE,
12  ClimateEntity,
13  ClimateEntityFeature,
14  HVACMode,
15 )
16 from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
17 
18 from ..const import DOMAIN
19 from ..coordinator import OverkizDataUpdateCoordinator
20 from ..entity import OverkizEntity
21 
22 PRESET_DRYING = "drying"
23 
24 OVERKIZ_TO_HVAC_MODE: dict[str, HVACMode] = {
25  OverkizCommandParam.EXTERNAL: HVACMode.HEAT, # manu
26  OverkizCommandParam.INTERNAL: HVACMode.AUTO, # prog
27  OverkizCommandParam.STANDBY: HVACMode.OFF,
28 }
29 HVAC_MODE_TO_OVERKIZ = {v: k for k, v in OVERKIZ_TO_HVAC_MODE.items()}
30 
31 OVERKIZ_TO_PRESET_MODE: dict[str, str] = {
32  OverkizCommandParam.PERMANENT_HEATING: PRESET_NONE,
33  OverkizCommandParam.BOOST: PRESET_BOOST,
34  OverkizCommandParam.DRYING: PRESET_DRYING,
35 }
36 
37 PRESET_MODE_TO_OVERKIZ = {v: k for k, v in OVERKIZ_TO_PRESET_MODE.items()}
38 
39 TEMPERATURE_SENSOR_DEVICE_INDEX = 7
40 
41 
43  """Representation of Atlantic Electrical Towel Dryer."""
44 
45  _attr_hvac_modes = [*HVAC_MODE_TO_OVERKIZ]
46  _attr_preset_modes = [*PRESET_MODE_TO_OVERKIZ]
47  _attr_temperature_unit = UnitOfTemperature.CELSIUS
48  _attr_translation_key = DOMAIN
49  _enable_turn_on_off_backwards_compatibility = False
50 
51  def __init__(
52  self, device_url: str, coordinator: OverkizDataUpdateCoordinator
53  ) -> None:
54  """Init method."""
55  super().__init__(device_url, coordinator)
56  self.temperature_devicetemperature_device = self.executorexecutor.linked_device(
57  TEMPERATURE_SENSOR_DEVICE_INDEX
58  )
59 
60  self._attr_supported_features_attr_supported_features = (
61  ClimateEntityFeature.TARGET_TEMPERATURE
62  | ClimateEntityFeature.TURN_OFF
63  | ClimateEntityFeature.TURN_ON
64  )
65 
66  # Not all AtlanticElectricalTowelDryer models support presets, thus we need to check if the command is available
67  if self.executorexecutor.has_command(OverkizCommand.SET_TOWEL_DRYER_TEMPORARY_STATE):
68  self._attr_supported_features_attr_supported_features |= ClimateEntityFeature.PRESET_MODE
69 
70  @property
71  def hvac_mode(self) -> HVACMode:
72  """Return hvac operation ie. heat, cool mode."""
73  if OverkizState.CORE_OPERATING_MODE in self.devicedevice.states:
74  return OVERKIZ_TO_HVAC_MODE[
75  cast(str, self.executorexecutor.select_state(OverkizState.CORE_OPERATING_MODE))
76  ]
77 
78  return HVACMode.OFF
79 
80  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
81  """Set new target hvac mode."""
82  await self.executorexecutor.async_execute_command(
83  OverkizCommand.SET_TOWEL_DRYER_OPERATING_MODE,
84  HVAC_MODE_TO_OVERKIZ[hvac_mode],
85  )
86 
87  @property
88  def target_temperature(self) -> None:
89  """Return the temperature."""
90  if self.hvac_modehvac_modehvac_modehvac_modehvac_mode == HVACMode.AUTO:
91  self.executorexecutor.select_state(OverkizState.IO_EFFECTIVE_TEMPERATURE_SETPOINT)
92  else:
93  self.executorexecutor.select_state(OverkizState.CORE_TARGET_TEMPERATURE)
94 
95  @property
96  def current_temperature(self) -> float | None:
97  """Return the current temperature."""
98  if self.temperature_devicetemperature_device is not None and (
99  temperature := self.temperature_devicetemperature_device.states[OverkizState.CORE_TEMPERATURE]
100  ):
101  return cast(float, temperature.value)
102 
103  return None
104 
105  async def async_set_temperature(self, **kwargs: Any) -> None:
106  """Set new temperature."""
107  temperature = kwargs[ATTR_TEMPERATURE]
108 
109  if self.hvac_modehvac_modehvac_modehvac_modehvac_mode == HVACMode.AUTO:
110  await self.executorexecutor.async_execute_command(
111  OverkizCommand.SET_DEROGATED_TARGET_TEMPERATURE, temperature
112  )
113  else:
114  await self.executorexecutor.async_execute_command(
115  OverkizCommand.SET_TARGET_TEMPERATURE, temperature
116  )
117 
118  @property
119  def preset_mode(self) -> str | None:
120  """Return the current preset mode, e.g., home, away, temp."""
121  return OVERKIZ_TO_PRESET_MODE[
122  cast(
123  str,
124  self.executorexecutor.select_state(OverkizState.IO_TOWEL_DRYER_TEMPORARY_STATE),
125  )
126  ]
127 
128  async def async_set_preset_mode(self, preset_mode: str) -> None:
129  """Set new preset mode."""
130  await self.executorexecutor.async_execute_command(
131  OverkizCommand.SET_TOWEL_DRYER_TEMPORARY_STATE,
132  PRESET_MODE_TO_OVERKIZ[preset_mode],
133  )