ha-hunterbtt

Home Assistant integration for Hunter BTT
git clone https://git.stephank.nl/ha-hunterbtt
Log | Files | Refs | README | LICENSE | ZIP

valve.py (2387B)


      1 """Valve control for Hunter BTT."""
      2 
      3 from typing import override
      4 
      5 from homeassistant.components.valve import (
      6     ValveDeviceClass,
      7     ValveEntity,
      8     ValveEntityFeature,
      9 )
     10 from homeassistant.core import HomeAssistant
     11 from homeassistant.exceptions import HomeAssistantError
     12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
     13 
     14 from .coordinator import HunterBTTConfigEntry, HunterBTTCoordinator
     15 from .entity import HunterBTTEntity
     16 from .runtime import (
     17     ManualControlError,
     18     ensure_manual_start_allowed,
     19     should_send_manual_stop,
     20 )
     21 
     22 
     23 async def async_setup_entry(
     24     _hass: HomeAssistant,
     25     entry: HunterBTTConfigEntry,
     26     async_add_entities: AddEntitiesCallback,
     27 ) -> None:
     28     """Set up the validated zone-1 manual valve control."""
     29     coordinator = entry.runtime_data
     30     if coordinator.data.state.channel_count != 1:
     31         return
     32     async_add_entities([HunterBTTZone1Valve(coordinator)])
     33 
     34 
     35 class HunterBTTZone1Valve(HunterBTTEntity, ValveEntity):
     36     """Control zone 1 through bounded manual watering."""
     37 
     38     _attr_translation_key = "valve"
     39     _attr_device_class = ValveDeviceClass.WATER
     40     _attr_reports_position = False
     41     _attr_supported_features = ValveEntityFeature.OPEN | ValveEntityFeature.CLOSE
     42 
     43     def __init__(self, coordinator: HunterBTTCoordinator) -> None:
     44         """Initialize a valve backed by FF82 zone-1 state."""
     45         super().__init__(coordinator, "zone_1_valve")
     46 
     47     @property
     48     @override
     49     def is_closed(self) -> bool | None:
     50         """Return whether FF82 reports zone 1 as not watering."""
     51         if self.coordinator.data is None:
     52             return None
     53         return not self.coordinator.data.state.zone1_is_watering
     54 
     55     async def async_open_valve(self) -> None:
     56         """Begin one bounded manual zone-1 run."""
     57         try:
     58             ensure_manual_start_allowed(self.is_closed)
     59         except ManualControlError as err:
     60             raise HomeAssistantError(str(err)) from err
     61         await self.coordinator.async_start_manual_zone1()
     62 
     63     async def async_close_valve(self) -> None:
     64         """End the current zone-1 manual run early."""
     65         try:
     66             should_stop = should_send_manual_stop(self.is_closed)
     67         except ManualControlError as err:
     68             raise HomeAssistantError(str(err)) from err
     69         if should_stop:
     70             await self.coordinator.async_stop_manual_zone1()