Home Assistant Unofficial Reference 2024.12.1
lock.py
Go to the documentation of this file.
1 """Support for Sure PetCare Flaps locks."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from surepy.entities import SurepyEntity
8 from surepy.enums import EntityType, LockState as SurepyLockState
9 
10 from homeassistant.components.lock import LockEntity, LockState
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant, callback
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .const import DOMAIN
16 from .coordinator import SurePetcareDataCoordinator
17 from .entity import SurePetcareEntity
18 
19 
21  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
22 ) -> None:
23  """Set up Sure PetCare locks on a config entry."""
24 
25  coordinator: SurePetcareDataCoordinator = hass.data[DOMAIN][entry.entry_id]
26 
28  SurePetcareLock(surepy_entity.id, coordinator, lock_state)
29  for surepy_entity in coordinator.data.values()
30  if surepy_entity.type in [EntityType.CAT_FLAP, EntityType.PET_FLAP]
31  for lock_state in (
32  SurepyLockState.LOCKED_IN,
33  SurepyLockState.LOCKED_OUT,
34  SurepyLockState.LOCKED_ALL,
35  )
36  )
37 
38 
40  """A lock implementation for Sure Petcare Entities."""
41 
42  def __init__(
43  self,
44  surepetcare_id: int,
45  coordinator: SurePetcareDataCoordinator,
46  lock_state: SurepyLockState,
47  ) -> None:
48  """Initialize a Sure Petcare lock."""
49  self._lock_state_lock_state = lock_state.name.lower()
50  self._available_available = False
51 
52  super().__init__(surepetcare_id, coordinator)
53 
54  self._attr_name_attr_name = f"{self._device_name} {self._lock_state.replace('_', ' ')}"
55  self._attr_unique_id_attr_unique_id = f"{self._device_id}-{self._lock_state}"
56 
57  @property
58  def available(self) -> bool:
59  """Return true if entity is available."""
60  return self._available_available and super().available
61 
62  @callback
63  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
64  """Update the state."""
65  status = surepy_entity.raw_data()["status"]
66 
67  self._attr_is_locked_attr_is_locked = (
68  SurepyLockState(status["locking"]["mode"]).name.lower() == self._lock_state_lock_state
69  )
70 
71  self._available_available = bool(status.get("online"))
72 
73  async def async_lock(self, **kwargs: Any) -> None:
74  """Lock the lock."""
75  if self.statestatestate != LockState.UNLOCKED:
76  return
77  self._attr_is_locking_attr_is_locking = True
78  self.async_write_ha_stateasync_write_ha_state()
79 
80  try:
81  await self.coordinator.lock_states_callbacks[self._lock_state_lock_state](self._id_id)
82  self._attr_is_locked_attr_is_locked = True
83  finally:
84  self._attr_is_locking_attr_is_locking = False
85  self.async_write_ha_stateasync_write_ha_state()
86 
87  async def async_unlock(self, **kwargs: Any) -> None:
88  """Unlock the lock."""
89  if self.statestatestate != LockState.LOCKED:
90  return
91  self._attr_is_unlocking_attr_is_unlocking = True
92  self.async_write_ha_stateasync_write_ha_state()
93 
94  try:
95  await self.coordinator.surepy.sac.unlock(self._id_id)
96  self._attr_is_locked_attr_is_locked = False
97  finally:
98  self._attr_is_unlocking_attr_is_unlocking = False
99  self.async_write_ha_stateasync_write_ha_state()
None _update_attr(self, SurepyEntity surepy_entity)
Definition: lock.py:63
None __init__(self, int surepetcare_id, SurePetcareDataCoordinator coordinator, SurepyLockState lock_state)
Definition: lock.py:47
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: lock.py:22