Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Support for Velux covers."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 
7 from pyvlx import OpeningDevice, Position
8 from pyvlx.opening_device import Awning, Blind, GarageDoor, Gate, RollerShutter, Window
9 
11  ATTR_POSITION,
12  ATTR_TILT_POSITION,
13  CoverDeviceClass,
14  CoverEntity,
15  CoverEntityFeature,
16 )
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from .const import DOMAIN
22 from .entity import VeluxEntity
23 
24 PARALLEL_UPDATES = 1
25 
26 
28  hass: HomeAssistant, config: ConfigEntry, async_add_entities: AddEntitiesCallback
29 ) -> None:
30  """Set up cover(s) for Velux platform."""
31  module = hass.data[DOMAIN][config.entry_id]
33  VeluxCover(node, config.entry_id)
34  for node in module.pyvlx.nodes
35  if isinstance(node, OpeningDevice)
36  )
37 
38 
40  """Representation of a Velux cover."""
41 
42  _is_blind = False
43  node: OpeningDevice
44 
45  def __init__(self, node: OpeningDevice, config_entry_id: str) -> None:
46  """Initialize VeluxCover."""
47  super().__init__(node, config_entry_id)
48  self._attr_device_class_attr_device_class = CoverDeviceClass.WINDOW
49  if isinstance(node, Awning):
50  self._attr_device_class_attr_device_class = CoverDeviceClass.AWNING
51  if isinstance(node, Blind):
52  self._attr_device_class_attr_device_class = CoverDeviceClass.BLIND
53  self._is_blind_is_blind_is_blind = True
54  if isinstance(node, GarageDoor):
55  self._attr_device_class_attr_device_class = CoverDeviceClass.GARAGE
56  if isinstance(node, Gate):
57  self._attr_device_class_attr_device_class = CoverDeviceClass.GATE
58  if isinstance(node, RollerShutter):
59  self._attr_device_class_attr_device_class = CoverDeviceClass.SHUTTER
60  if isinstance(node, Window):
61  self._attr_device_class_attr_device_class = CoverDeviceClass.WINDOW
62 
63  @property
64  def supported_features(self) -> CoverEntityFeature:
65  """Flag supported features."""
66  supported_features = (
67  CoverEntityFeature.OPEN
68  | CoverEntityFeature.CLOSE
69  | CoverEntityFeature.SET_POSITION
70  | CoverEntityFeature.STOP
71  )
72  if self.current_cover_tilt_positioncurrent_cover_tilt_positioncurrent_cover_tilt_positioncurrent_cover_tilt_position is not None:
73  supported_features |= (
74  CoverEntityFeature.OPEN_TILT
75  | CoverEntityFeature.CLOSE_TILT
76  | CoverEntityFeature.SET_TILT_POSITION
77  | CoverEntityFeature.STOP_TILT
78  )
79  return supported_features
80 
81  @property
82  def current_cover_position(self) -> int:
83  """Return the current position of the cover."""
84  return 100 - self.nodenode.position.position_percent
85 
86  @property
87  def current_cover_tilt_position(self) -> int | None:
88  """Return the current position of the cover."""
89  if self._is_blind_is_blind_is_blind:
90  return 100 - cast(Blind, self.nodenode).orientation.position_percent
91  return None
92 
93  @property
94  def is_closed(self) -> bool:
95  """Return if the cover is closed."""
96  return self.nodenode.position.closed
97 
98  @property
99  def is_opening(self) -> bool:
100  """Return if the cover is opening or not."""
101  return self.nodenode.is_opening
102 
103  @property
104  def is_closing(self) -> bool:
105  """Return if the cover is closing or not."""
106  return self.nodenode.is_closing
107 
108  async def async_close_cover(self, **kwargs: Any) -> None:
109  """Close the cover."""
110  await self.nodenode.close(wait_for_completion=False)
111 
112  async def async_open_cover(self, **kwargs: Any) -> None:
113  """Open the cover."""
114  await self.nodenode.open(wait_for_completion=False)
115 
116  async def async_set_cover_position(self, **kwargs: Any) -> None:
117  """Move the cover to a specific position."""
118  position_percent = 100 - kwargs[ATTR_POSITION]
119 
120  await self.nodenode.set_position(
121  Position(position_percent=position_percent), wait_for_completion=False
122  )
123 
124  async def async_stop_cover(self, **kwargs: Any) -> None:
125  """Stop the cover."""
126  await self.nodenode.stop(wait_for_completion=False)
127 
128  async def async_close_cover_tilt(self, **kwargs: Any) -> None:
129  """Close cover tilt."""
130  await cast(Blind, self.nodenode).close_orientation(wait_for_completion=False)
131 
132  async def async_open_cover_tilt(self, **kwargs: Any) -> None:
133  """Open cover tilt."""
134  await cast(Blind, self.nodenode).open_orientation(wait_for_completion=False)
135 
136  async def async_stop_cover_tilt(self, **kwargs: Any) -> None:
137  """Stop cover tilt."""
138  await cast(Blind, self.nodenode).stop_orientation(wait_for_completion=False)
139 
140  async def async_set_cover_tilt_position(self, **kwargs: Any) -> None:
141  """Move cover tilt to a specific position."""
142  position_percent = 100 - kwargs[ATTR_TILT_POSITION]
143  orientation = Position(position_percent=position_percent)
144  await cast(Blind, self.nodenode).set_orientation(
145  orientation=orientation, wait_for_completion=False
146  )
CoverEntityFeature supported_features(self)
Definition: cover.py:64
None async_close_cover_tilt(self, **Any kwargs)
Definition: cover.py:128
None async_open_cover(self, **Any kwargs)
Definition: cover.py:112
None async_set_cover_position(self, **Any kwargs)
Definition: cover.py:116
None async_stop_cover(self, **Any kwargs)
Definition: cover.py:124
None async_open_cover_tilt(self, **Any kwargs)
Definition: cover.py:132
None __init__(self, OpeningDevice node, str config_entry_id)
Definition: cover.py:45
None async_close_cover(self, **Any kwargs)
Definition: cover.py:108
None async_set_cover_tilt_position(self, **Any kwargs)
Definition: cover.py:140
None async_stop_cover_tilt(self, **Any kwargs)
Definition: cover.py:136
None open(self, **Any kwargs)
Definition: lock.py:86
None async_setup_entry(HomeAssistant hass, ConfigEntry config, AddEntitiesCallback async_add_entities)
Definition: cover.py:29