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()