core/homeassistant/components/duotecno/climate.py

101 lines
3.1 KiB
Python

"""Support for Duotecno climate devices."""
from __future__ import annotations
from typing import Any, Final
from duotecno.controller import PyDuotecno
from duotecno.unit import SensUnit
from homeassistant.components.climate import (
ClimateEntity,
ClimateEntityFeature,
HVACMode,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .entity import DuotecnoEntity, api_call
HVACMODE: Final = {
0: HVACMode.OFF,
1: HVACMode.HEAT,
2: HVACMode.COOL,
}
HVACMODE_REVERSE: Final = {value: key for key, value in HVACMODE.items()}
PRESETMODES: Final = {"sun": 0, "half_sun": 1, "moon": 2, "half_moon": 3}
PRESETMODES_REVERSE: Final = {value: key for key, value in PRESETMODES.items()}
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Duotecno climate based on config_entry."""
cntrl: PyDuotecno = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
DuotecnoClimate(channel) for channel in cntrl.get_units(["SensUnit"])
)
class DuotecnoClimate(DuotecnoEntity, ClimateEntity):
"""Representation of a Duotecno climate entity."""
_unit: SensUnit
_attr_supported_features = (
ClimateEntityFeature.TARGET_TEMPERATURE
| ClimateEntityFeature.PRESET_MODE
| ClimateEntityFeature.TURN_OFF
| ClimateEntityFeature.TURN_ON
)
_attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_hvac_modes = list(HVACMODE_REVERSE)
_attr_preset_modes = list(PRESETMODES)
_attr_translation_key = "duotecno"
_enable_turn_on_off_backwards_compatibility = False
@property
def current_temperature(self) -> float | None:
"""Get the current temperature."""
return self._unit.get_cur_temp()
@property
def target_temperature(self) -> float | None:
"""Get the target temperature."""
return self._unit.get_target_temp()
@property
def hvac_mode(self) -> HVACMode:
"""Get the current hvac_mode."""
return HVACMODE[self._unit.get_state()]
@property
def preset_mode(self) -> str:
"""Get the preset mode."""
return PRESETMODES_REVERSE[self._unit.get_preset()]
@api_call
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set new target temperatures."""
if (temp := kwargs.get(ATTR_TEMPERATURE)) is None:
return
await self._unit.set_temp(temp)
@api_call
async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set the preset mode."""
await self._unit.set_preset(PRESETMODES[preset_mode])
@api_call
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Duotecno does not support setting this, we can only display it."""
if hvac_mode == HVACMode.OFF:
await self._unit.turn_off()
else:
await self._unit.turn_on()