Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Platform for the opengarage.io cover component."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any, cast
7 
9  CoverDeviceClass,
10  CoverEntity,
11  CoverEntityFeature,
12  CoverState,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant, callback
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import DOMAIN
19 from .coordinator import OpenGarageDataUpdateCoordinator
20 from .entity import OpenGarageEntity
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 STATES_MAP = {0: CoverState.CLOSED, 1: CoverState.OPEN}
25 
26 
28  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
29 ) -> None:
30  """Set up the OpenGarage covers."""
32  [OpenGarageCover(hass.data[DOMAIN][entry.entry_id], cast(str, entry.unique_id))]
33  )
34 
35 
37  """Representation of a OpenGarage cover."""
38 
39  _attr_device_class = CoverDeviceClass.GARAGE
40  _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
41  _attr_name = None
42 
43  def __init__(
44  self, coordinator: OpenGarageDataUpdateCoordinator, device_id: str
45  ) -> None:
46  """Initialize the cover."""
47  self._state_state: str | None = None
48  self._state_before_move_state_before_move: str | None = None
49 
50  super().__init__(coordinator, device_id)
51 
52  @property
53  def is_closed(self) -> bool | None:
54  """Return if the cover is closed."""
55  if self._state_state is None:
56  return None
57  return self._state_state == CoverState.CLOSED
58 
59  @property
60  def is_closing(self) -> bool | None:
61  """Return if the cover is closing."""
62  if self._state_state is None:
63  return None
64  return self._state_state == CoverState.CLOSING
65 
66  @property
67  def is_opening(self) -> bool | None:
68  """Return if the cover is opening."""
69  if self._state_state is None:
70  return None
71  return self._state_state == CoverState.OPENING
72 
73  async def async_close_cover(self, **kwargs: Any) -> None:
74  """Close the cover."""
75  if self._state_state in [CoverState.CLOSED, CoverState.CLOSING]:
76  return
77  self._state_before_move_state_before_move = self._state_state
78  self._state_state = CoverState.CLOSING
79  await self._push_button_push_button()
80 
81  async def async_open_cover(self, **kwargs: Any) -> None:
82  """Open the cover."""
83  if self._state_state in [CoverState.OPEN, CoverState.OPENING]:
84  return
85  self._state_before_move_state_before_move = self._state_state
86  self._state_state = CoverState.OPENING
87  await self._push_button_push_button()
88 
89  @callback
90  def _update_attr(self) -> None:
91  """Update the state and attributes."""
92  status = self.coordinator.data
93 
94  state = STATES_MAP.get(status.get("door")) # type: ignore[arg-type]
95  if self._state_before_move_state_before_move is not None:
96  if self._state_before_move_state_before_move != state:
97  self._state_state = state
98  self._state_before_move_state_before_move = None
99  else:
100  self._state_state = state
101 
102  async def _push_button(self):
103  """Send commands to API."""
104  result = await self.coordinator.open_garage_connection.push_button()
105  if result is None:
106  _LOGGER.error("Unable to connect to OpenGarage device")
107  if result == 1:
108  return
109 
110  if result == 2:
111  _LOGGER.error("Unable to control %s: Device key is incorrect", self.namenamename)
112  elif result > 2:
113  _LOGGER.error("Unable to control %s: Error code %s", self.namenamename, result)
114 
115  self._state_state = self._state_before_move_state_before_move
116  self._state_before_move_state_before_move = None
None __init__(self, OpenGarageDataUpdateCoordinator coordinator, str device_id)
Definition: cover.py:45
str|UndefinedType|None name(self)
Definition: entity.py:738
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: cover.py:29