Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Support for deCONZ covers."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 
7 from pydeconz.interfaces.lights import CoverAction
8 from pydeconz.models import ResourceType
9 from pydeconz.models.event import EventType
10 from pydeconz.models.light.cover import Cover
11 
13  ATTR_POSITION,
14  ATTR_TILT_POSITION,
15  DOMAIN as COVER_DOMAIN,
16  CoverDeviceClass,
17  CoverEntity,
18  CoverEntityFeature,
19 )
20 from homeassistant.config_entries import ConfigEntry
21 from homeassistant.core import HomeAssistant, callback
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from .entity import DeconzDevice
25 from .hub import DeconzHub
26 
27 DECONZ_TYPE_TO_DEVICE_CLASS = {
28  ResourceType.LEVEL_CONTROLLABLE_OUTPUT.value: CoverDeviceClass.DAMPER,
29  ResourceType.WINDOW_COVERING_CONTROLLER.value: CoverDeviceClass.SHADE,
30  ResourceType.WINDOW_COVERING_DEVICE.value: CoverDeviceClass.SHADE,
31 }
32 
33 
35  hass: HomeAssistant,
36  config_entry: ConfigEntry,
37  async_add_entities: AddEntitiesCallback,
38 ) -> None:
39  """Set up covers for deCONZ component."""
40  hub = DeconzHub.get_hub(hass, config_entry)
41  hub.entities[COVER_DOMAIN] = set()
42 
43  @callback
44  def async_add_cover(_: EventType, cover_id: str) -> None:
45  """Add cover from deCONZ."""
46  async_add_entities([DeconzCover(cover_id, hub)])
47 
48  hub.register_platform_add_device_callback(
49  async_add_cover,
50  hub.api.lights.covers,
51  )
52 
53 
54 class DeconzCover(DeconzDevice[Cover], CoverEntity):
55  """Representation of a deCONZ cover."""
56 
57  TYPE = COVER_DOMAIN
58 
59  def __init__(self, cover_id: str, hub: DeconzHub) -> None:
60  """Set up cover device."""
61  super().__init__(cover := hub.api.lights.covers[cover_id], hub)
62 
63  self._attr_supported_features_attr_supported_features = (
64  CoverEntityFeature.OPEN
65  | CoverEntityFeature.CLOSE
66  | CoverEntityFeature.STOP
67  | CoverEntityFeature.SET_POSITION
68  )
69 
70  if self._device.tilt is not None:
71  self._attr_supported_features_attr_supported_features |= (
72  CoverEntityFeature.OPEN_TILT
73  | CoverEntityFeature.CLOSE_TILT
74  | CoverEntityFeature.STOP_TILT
75  | CoverEntityFeature.SET_TILT_POSITION
76  )
77 
78  self._attr_device_class_attr_device_class = DECONZ_TYPE_TO_DEVICE_CLASS.get(cover.type)
79 
80  self.legacy_modelegacy_mode = cover.type == ResourceType.LEVEL_CONTROLLABLE_OUTPUT.value
81 
82  @property
83  def current_cover_position(self) -> int:
84  """Return the current position of the cover."""
85  return 100 - self._device.lift
86 
87  @property
88  def is_closed(self) -> bool:
89  """Return if the cover is closed."""
90  return not self._device.is_open
91 
92  async def async_set_cover_position(self, **kwargs: Any) -> None:
93  """Move the cover to a specific position."""
94  position = 100 - cast(int, kwargs[ATTR_POSITION])
95  await self.hub.api.lights.covers.set_state(
96  id=self._device.resource_id,
97  lift=position,
98  legacy_mode=self.legacy_modelegacy_mode,
99  )
100 
101  async def async_open_cover(self, **kwargs: Any) -> None:
102  """Open cover."""
103  await self.hub.api.lights.covers.set_state(
104  id=self._device.resource_id,
105  action=CoverAction.OPEN,
106  legacy_mode=self.legacy_modelegacy_mode,
107  )
108 
109  async def async_close_cover(self, **kwargs: Any) -> None:
110  """Close cover."""
111  await self.hub.api.lights.covers.set_state(
112  id=self._device.resource_id,
113  action=CoverAction.CLOSE,
114  legacy_mode=self.legacy_modelegacy_mode,
115  )
116 
117  async def async_stop_cover(self, **kwargs: Any) -> None:
118  """Stop cover."""
119  await self.hub.api.lights.covers.set_state(
120  id=self._device.resource_id,
121  action=CoverAction.STOP,
122  legacy_mode=self.legacy_modelegacy_mode,
123  )
124 
125  @property
126  def current_cover_tilt_position(self) -> int | None:
127  """Return the current tilt position of the cover."""
128  if self._device.tilt is not None:
129  return 100 - self._device.tilt
130  return None
131 
132  async def async_set_cover_tilt_position(self, **kwargs: Any) -> None:
133  """Tilt the cover to a specific position."""
134  position = 100 - cast(int, kwargs[ATTR_TILT_POSITION])
135  await self.hub.api.lights.covers.set_state(
136  id=self._device.resource_id,
137  tilt=position,
138  legacy_mode=self.legacy_modelegacy_mode,
139  )
140 
141  async def async_open_cover_tilt(self, **kwargs: Any) -> None:
142  """Open cover tilt."""
143  await self.hub.api.lights.covers.set_state(
144  id=self._device.resource_id,
145  tilt=0,
146  legacy_mode=self.legacy_modelegacy_mode,
147  )
148 
149  async def async_close_cover_tilt(self, **kwargs: Any) -> None:
150  """Close cover tilt."""
151  await self.hub.api.lights.covers.set_state(
152  id=self._device.resource_id,
153  tilt=100,
154  legacy_mode=self.legacy_modelegacy_mode,
155  )
156 
157  async def async_stop_cover_tilt(self, **kwargs: Any) -> None:
158  """Stop cover tilt."""
159  await self.hub.api.lights.covers.set_state(
160  id=self._device.resource_id,
161  action=CoverAction.STOP,
162  legacy_mode=self.legacy_modelegacy_mode,
163  )
None async_stop_cover(self, **Any kwargs)
Definition: cover.py:117
None __init__(self, str cover_id, DeconzHub hub)
Definition: cover.py:59
None async_close_cover_tilt(self, **Any kwargs)
Definition: cover.py:149
None async_open_cover_tilt(self, **Any kwargs)
Definition: cover.py:141
None async_set_cover_tilt_position(self, **Any kwargs)
Definition: cover.py:132
None async_set_cover_position(self, **Any kwargs)
Definition: cover.py:92
None async_close_cover(self, **Any kwargs)
Definition: cover.py:109
None async_stop_cover_tilt(self, **Any kwargs)
Definition: cover.py:157
None async_open_cover(self, **Any kwargs)
Definition: cover.py:101
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: cover.py:38