core/homeassistant/components/smartthings/valve.py

72 lines
2.2 KiB
Python

"""Support for valves through the SmartThings cloud API."""
from __future__ import annotations
from pysmartthings import Attribute, Capability, Category, Command, SmartThings
from homeassistant.components.valve import (
ValveDeviceClass,
ValveEntity,
ValveEntityFeature,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import FullDevice, SmartThingsConfigEntry
from .const import MAIN
from .entity import SmartThingsEntity
DEVICE_CLASS_MAP: dict[Category | str, ValveDeviceClass] = {
Category.WATER_VALVE: ValveDeviceClass.WATER,
Category.GAS_VALVE: ValveDeviceClass.GAS,
}
async def async_setup_entry(
hass: HomeAssistant,
entry: SmartThingsConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Add valves for a config entry."""
entry_data = entry.runtime_data
async_add_entities(
SmartThingsValve(entry_data.client, device)
for device in entry_data.devices.values()
if Capability.VALVE in device.status[MAIN]
)
class SmartThingsValve(SmartThingsEntity, ValveEntity):
"""Define a SmartThings valve."""
_attr_supported_features = ValveEntityFeature.OPEN | ValveEntityFeature.CLOSE
_attr_reports_position = False
_attr_name = None
def __init__(self, client: SmartThings, device: FullDevice) -> None:
"""Init the class."""
super().__init__(client, device, {Capability.VALVE})
self._attr_device_class = DEVICE_CLASS_MAP.get(
device.device.components[0].user_category
or device.device.components[0].manufacturer_category
)
async def async_open_valve(self) -> None:
"""Open the valve."""
await self.execute_device_command(
Capability.VALVE,
Command.OPEN,
)
async def async_close_valve(self) -> None:
"""Close the valve."""
await self.execute_device_command(
Capability.VALVE,
Command.CLOSE,
)
@property
def is_closed(self) -> bool:
"""Return if the valve is closed."""
return self.get_attribute_value(Capability.VALVE, Attribute.VALVE) == "closed"