Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Support for HomeMatic covers."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  ATTR_POSITION,
9  ATTR_TILT_POSITION,
10  CoverDeviceClass,
11  CoverEntity,
12 )
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
16 
17 from .const import ATTR_DEVICE_TYPE, ATTR_DISCOVER_DEVICES
18 from .entity import HMDevice
19 
20 HM_GARAGE = ("IPGarage",)
21 
22 
24  hass: HomeAssistant,
25  config: ConfigType,
26  add_entities: AddEntitiesCallback,
27  discovery_info: DiscoveryInfoType | None = None,
28 ) -> None:
29  """Set up the platform."""
30  if discovery_info is None:
31  return
32 
33  devices: list[HMCover] = []
34  for conf in discovery_info[ATTR_DISCOVER_DEVICES]:
35  if conf[ATTR_DEVICE_TYPE] in HM_GARAGE:
36  devices.append(HMGarage(conf))
37  else:
38  devices.append(HMCover(conf))
39 
40  add_entities(devices, True)
41 
42 
44  """Representation a HomeMatic Cover."""
45 
46  @property
47  def current_cover_position(self) -> int | None:
48  """Return current position of cover.
49 
50  None is unknown, 0 is closed, 100 is fully open.
51  """
52  return int(self._hm_get_state_hm_get_state() * 100)
53 
54  def set_cover_position(self, **kwargs: Any) -> None:
55  """Move the cover to a specific position."""
56  if ATTR_POSITION in kwargs:
57  position = float(kwargs[ATTR_POSITION])
58  position = min(100, max(0, position))
59  level = position / 100.0
60  self._hmdevice_hmdevice.set_level(level, self._channel_channel)
61 
62  @property
63  def is_closed(self) -> bool | None:
64  """Return whether the cover is closed."""
67  return None
68 
69  def open_cover(self, **kwargs: Any) -> None:
70  """Open the cover."""
71  self._hmdevice_hmdevice.move_up(self._channel_channel)
72 
73  def close_cover(self, **kwargs: Any) -> None:
74  """Close the cover."""
75  self._hmdevice_hmdevice.move_down(self._channel_channel)
76 
77  def stop_cover(self, **kwargs: Any) -> None:
78  """Stop the device if in motion."""
79  self._hmdevice_hmdevice.stop(self._channel_channel)
80 
81  def _init_data_struct(self):
82  """Generate a data dictionary (self._data) from metadata."""
83  self._state_state_state = "LEVEL"
84  self._data.update({self._state_state_state: None})
85  if "LEVEL_2" in self._hmdevice_hmdevice.WRITENODE:
86  self._data.update({"LEVEL_2": None})
87 
88  @property
89  def current_cover_tilt_position(self) -> int | None:
90  """Return current position of cover tilt.
91 
92  None is unknown, 0 is closed, 100 is fully open.
93  """
94  if not (position := self._data.get("LEVEL_2", 0)):
95  return None
96  return int(position * 100)
97 
98  def set_cover_tilt_position(self, **kwargs: Any) -> None:
99  """Move the cover tilt to a specific position."""
100  if "LEVEL_2" in self._data and ATTR_TILT_POSITION in kwargs:
101  position = float(kwargs[ATTR_TILT_POSITION])
102  position = min(100, max(0, position))
103  level = position / 100.0
104  self._hmdevice_hmdevice.set_cover_tilt_position(level, self._channel_channel)
105 
106  def open_cover_tilt(self, **kwargs: Any) -> None:
107  """Open the cover tilt."""
108  if "LEVEL_2" in self._data:
109  self._hmdevice_hmdevice.open_slats()
110 
111  def close_cover_tilt(self, **kwargs: Any) -> None:
112  """Close the cover tilt."""
113  if "LEVEL_2" in self._data:
114  self._hmdevice_hmdevice.close_slats()
115 
116  def stop_cover_tilt(self, **kwargs: Any) -> None:
117  """Stop cover tilt."""
118  if "LEVEL_2" in self._data:
119  self.stop_coverstop_coverstop_cover(**kwargs)
120 
121 
123  """Represents a Homematic Garage cover. Homematic garage covers do not support position attributes."""
124 
125  _attr_device_class = CoverDeviceClass.GARAGE
126 
127  @property
128  def current_cover_position(self) -> None:
129  """Return current position of cover.
130 
131  None is unknown, 0 is closed, 100 is fully open.
132  """
133  # Garage covers do not support position; always return None
134  return None
135 
136  @property
137  def is_closed(self) -> bool:
138  """Return whether the cover is closed."""
139  return self._hmdevice_hmdevice.is_closed(self._hm_get_state_hm_get_state())
140 
141  def _init_data_struct(self):
142  """Generate a data dictionary (self._data) from metadata."""
143  self._state_state_state_state = "DOOR_STATE"
144  self._data.update({self._state_state_state_state: None})
None stop_cover(self, **Any kwargs)
Definition: __init__.py:435
None set_cover_tilt_position(self, **Any kwargs)
Definition: cover.py:98
None close_cover(self, **Any kwargs)
Definition: cover.py:73
None stop_cover(self, **Any kwargs)
Definition: cover.py:77
None open_cover_tilt(self, **Any kwargs)
Definition: cover.py:106
None set_cover_position(self, **Any kwargs)
Definition: cover.py:54
None open_cover(self, **Any kwargs)
Definition: cover.py:69
None close_cover_tilt(self, **Any kwargs)
Definition: cover.py:111
None stop_cover_tilt(self, **Any kwargs)
Definition: cover.py:116
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: cover.py:28