Home Assistant Unofficial Reference 2024.12.1
cover.py
Go to the documentation of this file.
1 """Support for covers."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from aiocomelit import ComelitSerialBridgeObject
8 from aiocomelit.const import COVER, STATE_COVER, STATE_OFF, STATE_ON
9 
10 from homeassistant.components.cover import CoverDeviceClass, CoverEntity, CoverState
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant, callback
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 from homeassistant.helpers.restore_state import RestoreEntity
15 from homeassistant.helpers.update_coordinator import CoordinatorEntity
16 
17 from .const import DOMAIN
18 from .coordinator import ComelitSerialBridge
19 
20 
22  hass: HomeAssistant,
23  config_entry: ConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up Comelit covers."""
27 
28  coordinator: ComelitSerialBridge = hass.data[DOMAIN][config_entry.entry_id]
29 
31  ComelitCoverEntity(coordinator, device, config_entry.entry_id)
32  for device in coordinator.data[COVER].values()
33  )
34 
35 
37  CoordinatorEntity[ComelitSerialBridge], RestoreEntity, CoverEntity
38 ):
39  """Cover device."""
40 
41  _attr_device_class = CoverDeviceClass.SHUTTER
42  _attr_has_entity_name = True
43  _attr_name = None
44 
45  def __init__(
46  self,
47  coordinator: ComelitSerialBridge,
48  device: ComelitSerialBridgeObject,
49  config_entry_entry_id: str,
50  ) -> None:
51  """Init cover entity."""
52  self._api_api = coordinator.api
53  self._device_device_device = device
54  super().__init__(coordinator)
55  # Use config_entry.entry_id as base for unique_id
56  # because no serial number or mac is available
57  self._attr_unique_id_attr_unique_id = f"{config_entry_entry_id}-{device.index}"
58  self._attr_device_info_attr_device_info = coordinator.platform_device_info(device, device.type)
59  # Device doesn't provide a status so we assume UNKNOWN at first startup
60  self._last_action_last_action: int | None = None
61  self._last_state_last_state: str | None = None
62 
63  def _current_action(self, action: str) -> bool:
64  """Return the current cover action."""
65  is_moving = self.device_statusdevice_statusdevice_status == STATE_COVER.index(action)
66  if is_moving:
67  self._last_action_last_action = STATE_COVER.index(action)
68  return is_moving
69 
70  @property
71  def device_status(self) -> int:
72  """Return current device status."""
73  return self.coordinator.data[COVER][self._device_device_device.index].status
74 
75  @property
76  def is_closed(self) -> bool | None:
77  """Return if the cover is closed."""
78 
79  if self._last_state_last_state in [None, "unknown"]:
80  return None
81 
82  if self.device_statusdevice_statusdevice_status != STATE_COVER.index("stopped"):
83  return False
84 
85  if self._last_action_last_action:
86  return self._last_action_last_action == STATE_COVER.index("closing")
87 
88  return self._last_state_last_state == CoverState.CLOSED
89 
90  @property
91  def is_closing(self) -> bool:
92  """Return if the cover is closing."""
93  return self._current_action_current_action("closing")
94 
95  @property
96  def is_opening(self) -> bool:
97  """Return if the cover is opening."""
98  return self._current_action_current_action("opening")
99 
100  async def async_close_cover(self, **kwargs: Any) -> None:
101  """Close cover."""
102  await self._api_api.set_device_status(COVER, self._device_device_device.index, STATE_OFF)
103 
104  async def async_open_cover(self, **kwargs: Any) -> None:
105  """Open cover."""
106  await self._api_api.set_device_status(COVER, self._device_device_device.index, STATE_ON)
107 
108  async def async_stop_cover(self, **_kwargs: Any) -> None:
109  """Stop the cover."""
110  if not self.is_closingis_closingis_closing and not self.is_openingis_openingis_opening:
111  return
112 
113  action = STATE_ON if self.is_closingis_closingis_closing else STATE_OFF
114  await self._api_api.set_device_status(COVER, self._device_device_device.index, action)
115 
116  @callback
117  def _handle_coordinator_update(self) -> None:
118  """Handle device update."""
119  self._last_state_last_state = self.statestatestate
120  self.async_write_ha_stateasync_write_ha_state()
121 
122  async def async_added_to_hass(self) -> None:
123  """Handle entity which will be added."""
124 
125  await super().async_added_to_hass()
126 
127  if last_state := await self.async_get_last_stateasync_get_last_state():
128  self._last_state_last_state = last_state.state
None __init__(self, ComelitSerialBridge coordinator, ComelitSerialBridgeObject device, str config_entry_entry_id)
Definition: cover.py:50
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: cover.py:25