diff --git a/homeassistant/components/ads/valve.py b/homeassistant/components/ads/valve.py new file mode 100644 index 00000000000..88e2836335f --- /dev/null +++ b/homeassistant/components/ads/valve.py @@ -0,0 +1,86 @@ +"""Support for ADS valves.""" + +from __future__ import annotations + +import pyads +import voluptuous as vol + +from homeassistant.components.valve import ( + DEVICE_CLASSES_SCHEMA as VALVE_DEVICE_CLASSES_SCHEMA, + PLATFORM_SCHEMA as VALVE_PLATFORM_SCHEMA, + ValveDeviceClass, + ValveEntity, + ValveEntityFeature, +) +from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME +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 + +from . import CONF_ADS_VAR, DATA_ADS +from .entity import AdsEntity +from .hub import AdsHub + +DEFAULT_NAME = "ADS valve" + +PLATFORM_SCHEMA = VALVE_PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_ADS_VAR): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_DEVICE_CLASS): VALVE_DEVICE_CLASSES_SCHEMA, + } +) + + +def setup_platform( + hass: HomeAssistant, + config: ConfigType, + add_entities: AddEntitiesCallback, + discovery_info: DiscoveryInfoType | None = None, +) -> None: + """Set up an ADS valve device.""" + ads_hub: AdsHub = hass.data[DATA_ADS] + ads_var = config[CONF_ADS_VAR] + name = config[CONF_NAME] + device_class = config.get(CONF_DEVICE_CLASS) + supported_features: ValveEntityFeature = ( + ValveEntityFeature.OPEN | ValveEntityFeature.CLOSE + ) + + entity = AdsValve(ads_hub, ads_var, name, device_class, supported_features) + + add_entities([entity]) + + +class AdsValve(AdsEntity, ValveEntity): + """Representation of an ADS valve entity.""" + + def __init__( + self, + ads_hub: AdsHub, + ads_var: str, + name: str, + device_class: ValveDeviceClass | None, + supported_features: ValveEntityFeature, + ) -> None: + """Initialize AdsValve entity.""" + super().__init__(ads_hub, name, ads_var) + self._attr_device_class = device_class + self._attr_supported_features = supported_features + self._attr_reports_position = False + self._attr_is_closed = True + + async def async_added_to_hass(self) -> None: + """Register device notification.""" + await self.async_initialize_device(self._ads_var, pyads.PLCTYPE_BOOL) + + def open_valve(self, **kwargs) -> None: + """Open the valve.""" + self._ads_hub.write_by_name(self._ads_var, True, pyads.PLCTYPE_BOOL) + self._attr_is_closed = False + + def close_valve(self, **kwargs) -> None: + """Close the valve.""" + self._ads_hub.write_by_name(self._ads_var, False, pyads.PLCTYPE_BOOL) + self._attr_is_closed = True