Home Assistant Unofficial Reference 2024.12.1
climate.py
Go to the documentation of this file.
1 """Support for Palazzetti climates."""
2 
3 from typing import Any
4 
5 from pypalazzetti.exceptions import CommunicationError, ValidationError
6 
8  ClimateEntity,
9  ClimateEntityFeature,
10  HVACAction,
11  HVACMode,
12 )
13 from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
14 from homeassistant.core import HomeAssistant
15 from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from . import PalazzettiConfigEntry
19 from .const import DOMAIN, FAN_AUTO, FAN_HIGH, FAN_MODES, FAN_SILENT
20 from .coordinator import PalazzettiDataUpdateCoordinator
21 from .entity import PalazzettiEntity
22 
23 
25  hass: HomeAssistant,
26  entry: PalazzettiConfigEntry,
27  async_add_entities: AddEntitiesCallback,
28 ) -> None:
29  """Set up Palazzetti climates based on a config entry."""
30  async_add_entities([PalazzettiClimateEntity(entry.runtime_data)])
31 
32 
34  """Defines a Palazzetti climate."""
35 
36  _attr_has_entity_name = True
37  _attr_name = None
38  _attr_translation_key = DOMAIN
39  _attr_target_temperature_step = 1.0
40  _attr_temperature_unit = UnitOfTemperature.CELSIUS
41  _attr_supported_features = (
42  ClimateEntityFeature.TARGET_TEMPERATURE
43  | ClimateEntityFeature.FAN_MODE
44  | ClimateEntityFeature.TURN_ON
45  | ClimateEntityFeature.TURN_OFF
46  )
47 
48  def __init__(self, coordinator: PalazzettiDataUpdateCoordinator) -> None:
49  """Initialize Palazzetti climate."""
50  super().__init__(coordinator)
51  client = coordinator.client
52  mac = coordinator.config_entry.unique_id
53  self._attr_unique_id_attr_unique_id = mac
54  self._attr_hvac_modes_attr_hvac_modes = [HVACMode.HEAT, HVACMode.OFF]
55  self._attr_min_temp_attr_min_temp = client.target_temperature_min
56  self._attr_max_temp_attr_max_temp = client.target_temperature_max
57  self._attr_fan_modes_attr_fan_modes = list(
58  map(str, range(client.fan_speed_min, client.fan_speed_max + 1))
59  )
60  if client.has_fan_silent:
61  self._attr_fan_modes_attr_fan_modes.insert(0, FAN_SILENT)
62  if client.has_fan_high:
63  self._attr_fan_modes_attr_fan_modes.append(FAN_HIGH)
64  if client.has_fan_auto:
65  self._attr_fan_modes_attr_fan_modes.append(FAN_AUTO)
66 
67  @property
68  def hvac_mode(self) -> HVACMode:
69  """Return hvac operation ie. heat or off mode."""
70  return HVACMode.HEAT if self.coordinator.client.is_on else HVACMode.OFF
71 
72  @property
73  def hvac_action(self) -> HVACAction:
74  """Return hvac action ie. heating or idle."""
75  return (
76  HVACAction.HEATING
77  if self.coordinator.client.is_heating
78  else HVACAction.IDLE
79  )
80 
81  async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
82  """Set new target hvac mode."""
83  try:
84  await self.coordinator.client.set_on(hvac_mode != HVACMode.OFF)
85  except CommunicationError as err:
86  raise HomeAssistantError(
87  translation_domain=DOMAIN, translation_key="cannot_connect"
88  ) from err
89  except ValidationError as err:
91  translation_domain=DOMAIN, translation_key="on_off_not_available"
92  ) from err
93  await self.coordinator.async_refresh()
94 
95  @property
96  def current_temperature(self) -> float | None:
97  """Return current temperature."""
98  return self.coordinator.client.room_temperature
99 
100  @property
101  def target_temperature(self) -> int | None:
102  """Return the temperature."""
103  return self.coordinator.client.target_temperature
104 
105  async def async_set_temperature(self, **kwargs: Any) -> None:
106  """Set new temperature."""
107  temperature = int(kwargs[ATTR_TEMPERATURE])
108  try:
109  await self.coordinator.client.set_target_temperature(temperature)
110  except CommunicationError as err:
111  raise HomeAssistantError(
112  translation_domain=DOMAIN, translation_key="cannot_connect"
113  ) from err
114  except ValidationError as err:
116  translation_domain=DOMAIN,
117  translation_key="invalid_target_temperature",
118  translation_placeholders={
119  "value": str(temperature),
120  },
121  ) from err
122  await self.coordinator.async_refresh()
123 
124  @property
125  def fan_mode(self) -> str | None:
126  """Return the fan mode."""
127  api_state = self.coordinator.client.fan_speed
128  return FAN_MODES[api_state]
129 
130  async def async_set_fan_mode(self, fan_mode: str) -> None:
131  """Set new fan mode."""
132  try:
133  if fan_mode == FAN_SILENT:
134  await self.coordinator.client.set_fan_silent()
135  elif fan_mode == FAN_HIGH:
136  await self.coordinator.client.set_fan_high()
137  elif fan_mode == FAN_AUTO:
138  await self.coordinator.client.set_fan_auto()
139  else:
140  await self.coordinator.client.set_fan_speed(FAN_MODES.index(fan_mode))
141  except CommunicationError as err:
142  raise HomeAssistantError(
143  translation_domain=DOMAIN, translation_key="cannot_connect"
144  ) from err
145  except ValidationError as err:
147  translation_domain=DOMAIN,
148  translation_key="invalid_fan_mode",
149  translation_placeholders={
150  "value": fan_mode,
151  },
152  ) from err
153  await self.coordinator.async_refresh()
None __init__(self, PalazzettiDataUpdateCoordinator coordinator)
Definition: climate.py:48
None async_setup_entry(HomeAssistant hass, PalazzettiConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: climate.py:28