150 lines
5.4 KiB
Python
150 lines
5.4 KiB
Python
"""Support for Palazzetti climates."""
|
|
|
|
from typing import Any
|
|
|
|
from pypalazzetti.exceptions import CommunicationError, ValidationError
|
|
|
|
from homeassistant.components.climate import (
|
|
ClimateEntity,
|
|
ClimateEntityFeature,
|
|
HVACAction,
|
|
HVACMode,
|
|
)
|
|
from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from . import PalazzettiConfigEntry
|
|
from .const import DOMAIN, FAN_AUTO, FAN_HIGH, FAN_MODES
|
|
from .coordinator import PalazzettiDataUpdateCoordinator
|
|
from .entity import PalazzettiEntity
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: PalazzettiConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Set up Palazzetti climates based on a config entry."""
|
|
async_add_entities([PalazzettiClimateEntity(entry.runtime_data)])
|
|
|
|
|
|
class PalazzettiClimateEntity(PalazzettiEntity, ClimateEntity):
|
|
"""Defines a Palazzetti climate."""
|
|
|
|
_attr_has_entity_name = True
|
|
_attr_name = None
|
|
_attr_translation_key = DOMAIN
|
|
_attr_target_temperature_step = 1.0
|
|
_attr_temperature_unit = UnitOfTemperature.CELSIUS
|
|
_attr_supported_features = (
|
|
ClimateEntityFeature.TARGET_TEMPERATURE
|
|
| ClimateEntityFeature.FAN_MODE
|
|
| ClimateEntityFeature.TURN_ON
|
|
| ClimateEntityFeature.TURN_OFF
|
|
)
|
|
|
|
def __init__(self, coordinator: PalazzettiDataUpdateCoordinator) -> None:
|
|
"""Initialize Palazzetti climate."""
|
|
super().__init__(coordinator)
|
|
client = coordinator.client
|
|
mac = coordinator.config_entry.unique_id
|
|
self._attr_unique_id = mac
|
|
self._attr_hvac_modes = [HVACMode.HEAT, HVACMode.OFF]
|
|
self._attr_min_temp = client.target_temperature_min
|
|
self._attr_max_temp = client.target_temperature_max
|
|
self._attr_fan_modes = list(
|
|
map(str, range(client.fan_speed_min, client.fan_speed_max + 1))
|
|
)
|
|
if client.has_fan_high:
|
|
self._attr_fan_modes.append(FAN_HIGH)
|
|
if client.has_fan_auto:
|
|
self._attr_fan_modes.append(FAN_AUTO)
|
|
|
|
@property
|
|
def hvac_mode(self) -> HVACMode:
|
|
"""Return hvac operation ie. heat or off mode."""
|
|
return HVACMode.HEAT if self.coordinator.client.is_on else HVACMode.OFF
|
|
|
|
@property
|
|
def hvac_action(self) -> HVACAction:
|
|
"""Return hvac action ie. heating or idle."""
|
|
return (
|
|
HVACAction.HEATING
|
|
if self.coordinator.client.is_heating
|
|
else HVACAction.IDLE
|
|
)
|
|
|
|
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
|
"""Set new target hvac mode."""
|
|
try:
|
|
await self.coordinator.client.set_on(hvac_mode != HVACMode.OFF)
|
|
except CommunicationError as err:
|
|
raise HomeAssistantError(
|
|
translation_domain=DOMAIN, translation_key="cannot_connect"
|
|
) from err
|
|
except ValidationError as err:
|
|
raise ServiceValidationError(
|
|
translation_domain=DOMAIN, translation_key="on_off_not_available"
|
|
) from err
|
|
await self.coordinator.async_refresh()
|
|
|
|
@property
|
|
def current_temperature(self) -> float | None:
|
|
"""Return current temperature."""
|
|
return self.coordinator.client.room_temperature
|
|
|
|
@property
|
|
def target_temperature(self) -> int | None:
|
|
"""Return the temperature."""
|
|
return self.coordinator.client.target_temperature
|
|
|
|
async def async_set_temperature(self, **kwargs: Any) -> None:
|
|
"""Set new temperature."""
|
|
temperature = int(kwargs[ATTR_TEMPERATURE])
|
|
try:
|
|
await self.coordinator.client.set_target_temperature(temperature)
|
|
except CommunicationError as err:
|
|
raise HomeAssistantError(
|
|
translation_domain=DOMAIN, translation_key="cannot_connect"
|
|
) from err
|
|
except ValidationError as err:
|
|
raise ServiceValidationError(
|
|
translation_domain=DOMAIN,
|
|
translation_key="invalid_target_temperature",
|
|
translation_placeholders={
|
|
"value": str(temperature),
|
|
},
|
|
) from err
|
|
await self.coordinator.async_refresh()
|
|
|
|
@property
|
|
def fan_mode(self) -> str | None:
|
|
"""Return the fan mode."""
|
|
api_state = self.coordinator.client.current_fan_speed()
|
|
return FAN_MODES[api_state]
|
|
|
|
async def async_set_fan_mode(self, fan_mode: str) -> None:
|
|
"""Set new fan mode."""
|
|
try:
|
|
if fan_mode == FAN_HIGH:
|
|
await self.coordinator.client.set_fan_high()
|
|
elif fan_mode == FAN_AUTO:
|
|
await self.coordinator.client.set_fan_auto()
|
|
else:
|
|
await self.coordinator.client.set_fan_speed(FAN_MODES.index(fan_mode))
|
|
except CommunicationError as err:
|
|
raise HomeAssistantError(
|
|
translation_domain=DOMAIN, translation_key="cannot_connect"
|
|
) from err
|
|
except ValidationError as err:
|
|
raise ServiceValidationError(
|
|
translation_domain=DOMAIN,
|
|
translation_key="invalid_fan_mode",
|
|
translation_placeholders={
|
|
"value": fan_mode,
|
|
},
|
|
) from err
|
|
await self.coordinator.async_refresh()
|