Home Assistant Unofficial Reference 2024.12.1
valve.py
Go to the documentation of this file.
1 """Support for ESPHome valves."""
2 
3 from __future__ import annotations
4 
5 from functools import partial
6 from typing import Any
7 
8 from aioesphomeapi import EntityInfo, ValveInfo, ValveOperation, ValveState
9 
11  ValveDeviceClass,
12  ValveEntity,
13  ValveEntityFeature,
14 )
15 from homeassistant.core import callback
16 from homeassistant.util.enum import try_parse_enum
17 
18 from .entity import (
19  EsphomeEntity,
20  convert_api_error_ha_error,
21  esphome_state_property,
22  platform_async_setup_entry,
23 )
24 
25 
26 class EsphomeValve(EsphomeEntity[ValveInfo, ValveState], ValveEntity):
27  """A valve implementation for ESPHome."""
28 
29  @callback
30  def _on_static_info_update(self, static_info: EntityInfo) -> None:
31  """Set attrs from static info."""
32  super()._on_static_info_update(static_info)
33  static_info = self._static_info_static_info
34  flags = ValveEntityFeature.OPEN | ValveEntityFeature.CLOSE
35  if static_info.supports_stop:
36  flags |= ValveEntityFeature.STOP
37  if static_info.supports_position:
38  flags |= ValveEntityFeature.SET_POSITION
39  self._attr_supported_features_attr_supported_features = flags
40  self._attr_device_class_attr_device_class = try_parse_enum(
41  ValveDeviceClass, static_info.device_class
42  )
43  self._attr_assumed_state_attr_assumed_state = static_info.assumed_state
44  self._attr_reports_position_attr_reports_position = static_info.supports_position
45 
46  @property
47  @esphome_state_property
48  def is_closed(self) -> bool:
49  """Return if the valve is closed or not."""
50  return self._state_state.position == 0.0
51 
52  @property
53  @esphome_state_property
54  def is_opening(self) -> bool:
55  """Return if the valve is opening or not."""
56  return self._state_state.current_operation is ValveOperation.IS_OPENING
57 
58  @property
59  @esphome_state_property
60  def is_closing(self) -> bool:
61  """Return if the valve is closing or not."""
62  return self._state_state.current_operation is ValveOperation.IS_CLOSING
63 
64  @property
65  @esphome_state_property
66  def current_valve_position(self) -> int | None:
67  """Return current position of valve. 0 is closed, 100 is open."""
68  return round(self._state_state.position * 100.0)
69 
70  @convert_api_error_ha_error
71  async def async_open_valve(self, **kwargs: Any) -> None:
72  """Open the valve."""
73  self._client_client.valve_command(key=self._key_key, position=1.0)
74 
75  @convert_api_error_ha_error
76  async def async_close_valve(self, **kwargs: Any) -> None:
77  """Close valve."""
78  self._client_client.valve_command(key=self._key_key, position=0.0)
79 
80  @convert_api_error_ha_error
81  async def async_stop_valve(self, **kwargs: Any) -> None:
82  """Stop the valve."""
83  self._client_client.valve_command(key=self._key_key, stop=True)
84 
85  @convert_api_error_ha_error
86  async def async_set_valve_position(self, position: float) -> None:
87  """Move the valve to a specific position."""
88  self._client_client.valve_command(key=self._key_key, position=position / 100)
89 
90 
91 async_setup_entry = partial(
92  platform_async_setup_entry,
93  info_type=ValveInfo,
94  entity_type=EsphomeValve,
95  state_type=ValveState,
96 )
None _on_static_info_update(self, EntityInfo static_info)
Definition: valve.py:30
None async_set_valve_position(self, float position)
Definition: valve.py:86
None async_stop_valve(self, **Any kwargs)
Definition: valve.py:81
None async_close_valve(self, **Any kwargs)
Definition: valve.py:76
None async_open_valve(self, **Any kwargs)
Definition: valve.py:71