88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
"""Home Assistant climate commander adapter.
|
|
|
|
This adapter implements the ability to control climate entities (VTherm)
|
|
from the domain layer.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import TYPE_CHECKING
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .utils import get_entity_name
|
|
|
|
if TYPE_CHECKING:
|
|
pass
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class HAClimateCommander:
|
|
"""Controls climate entities (VTherm) from domain layer.
|
|
|
|
This adapter translates domain heating control commands into
|
|
Home Assistant climate service calls. No business logic.
|
|
"""
|
|
|
|
def __init__(self, hass: HomeAssistant, climate_entity_id: str) -> None:
|
|
"""Initialize the climate commander.
|
|
|
|
Args:
|
|
hass: Home Assistant instance
|
|
climate_entity_id: The VTherm/climate entity to control
|
|
"""
|
|
self._hass = hass
|
|
self._climate_entity_id = climate_entity_id
|
|
self._device_name = get_entity_name(hass, climate_entity_id)
|
|
|
|
async def set_temperature(self, target_temp: float) -> None:
|
|
"""Set target temperature for the climate entity.
|
|
|
|
Args:
|
|
target_temp: Target temperature in Celsius
|
|
"""
|
|
_LOGGER.info("[%s] Setting temperature to %.1f°C", self._device_name, target_temp)
|
|
|
|
await self._hass.services.async_call(
|
|
"climate",
|
|
"set_temperature",
|
|
{
|
|
"entity_id": self._climate_entity_id,
|
|
"temperature": target_temp,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
async def set_hvac_mode(self, mode: str) -> None:
|
|
"""Set HVAC mode (heat, off, etc.).
|
|
|
|
Args:
|
|
mode: HVAC mode (heat, off, auto, etc.)
|
|
"""
|
|
_LOGGER.info("[%s] Setting HVAC mode to %s", self._device_name, mode)
|
|
|
|
await self._hass.services.async_call(
|
|
"climate",
|
|
"set_hvac_mode",
|
|
{
|
|
"entity_id": self._climate_entity_id,
|
|
"hvac_mode": mode,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
async def turn_off(self) -> None:
|
|
"""Turn off heating."""
|
|
await self.set_hvac_mode("off")
|
|
|
|
async def turn_on_heat(self, target_temp: float) -> None:
|
|
"""Turn on heating with target temperature.
|
|
|
|
Args:
|
|
target_temp: Target temperature in Celsius
|
|
"""
|
|
await self.set_hvac_mode("heat")
|
|
await self.set_temperature(target_temp)
|