core/homeassistant/components/touchline/climate.py

132 lines
4.0 KiB
Python

"""Platform for Roth Touchline floor heating controller."""
from __future__ import annotations
from typing import Any, NamedTuple
from pytouchline import PyTouchline
import voluptuous as vol
from homeassistant.components.climate import (
PLATFORM_SCHEMA,
ClimateEntity,
ClimateEntityFeature,
HVACMode,
)
from homeassistant.const import ATTR_TEMPERATURE, CONF_HOST, UnitOfTemperature
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
class PresetMode(NamedTuple):
"""Settings for preset mode."""
mode: int
program: int
PRESET_MODES = {
"Normal": PresetMode(mode=0, program=0),
"Night": PresetMode(mode=1, program=0),
"Holiday": PresetMode(mode=2, program=0),
"Pro 1": PresetMode(mode=0, program=1),
"Pro 2": PresetMode(mode=0, program=2),
"Pro 3": PresetMode(mode=0, program=3),
}
TOUCHLINE_HA_PRESETS = {
(settings.mode, settings.program): preset
for preset, settings in PRESET_MODES.items()
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Required(CONF_HOST): cv.string})
def setup_platform(
hass: HomeAssistant,
config: ConfigType,
add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the Touchline devices."""
host = config[CONF_HOST]
py_touchline = PyTouchline()
number_of_devices = int(py_touchline.get_number_of_devices(host))
devices = []
for device_id in range(0, number_of_devices):
devices.append(Touchline(PyTouchline(device_id)))
add_entities(devices, True)
class Touchline(ClimateEntity):
"""Representation of a Touchline device."""
_attr_hvac_mode = HVACMode.HEAT
_attr_hvac_modes = [HVACMode.HEAT]
_attr_supported_features = (
ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.PRESET_MODE
)
_attr_temperature_unit = UnitOfTemperature.CELSIUS
def __init__(self, touchline_thermostat):
"""Initialize the Touchline device."""
self.unit = touchline_thermostat
self._name = None
self._current_temperature = None
self._target_temperature = None
self._current_operation_mode = None
self._preset_mode = None
def update(self) -> None:
"""Update thermostat attributes."""
self.unit.update()
self._name = self.unit.get_name()
self._current_temperature = self.unit.get_current_temperature()
self._target_temperature = self.unit.get_target_temperature()
self._preset_mode = TOUCHLINE_HA_PRESETS.get(
(self.unit.get_operation_mode(), self.unit.get_week_program())
)
@property
def name(self):
"""Return the name of the climate device."""
return self._name
@property
def current_temperature(self):
"""Return the current temperature."""
return self._current_temperature
@property
def target_temperature(self):
"""Return the temperature we try to reach."""
return self._target_temperature
@property
def preset_mode(self):
"""Return the current preset mode."""
return self._preset_mode
@property
def preset_modes(self):
"""Return available preset modes."""
return list(PRESET_MODES)
def set_preset_mode(self, preset_mode):
"""Set new target preset mode."""
preset_mode = PRESET_MODES[preset_mode]
self.unit.set_operation_mode(preset_mode.mode)
self.unit.set_week_program(preset_mode.program)
def set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set new target hvac mode."""
self._current_operation_mode = HVACMode.HEAT
def set_temperature(self, **kwargs: Any) -> None:
"""Set new target temperature."""
if kwargs.get(ATTR_TEMPERATURE) is not None:
self._target_temperature = kwargs.get(ATTR_TEMPERATURE)
self.unit.set_target_temperature(self._target_temperature)