Home Assistant Unofficial Reference 2024.12.1
lock.py
Go to the documentation of this file.
1 """Support for locks on Ubiquiti's UniFi Protect NVR."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any, cast
7 
8 from uiprotect.data import (
9  Doorlock,
10  LockStatusType,
11  ModelType,
12  ProtectAdoptableDeviceModel,
13 )
14 
15 from homeassistant.components.lock import LockEntity, LockEntityDescription
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 
19 from .data import ProtectDeviceType, UFPConfigEntry
20 from .entity import ProtectDeviceEntity
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 
26  hass: HomeAssistant,
27  entry: UFPConfigEntry,
28  async_add_entities: AddEntitiesCallback,
29 ) -> None:
30  """Set up locks on a UniFi Protect NVR."""
31  data = entry.runtime_data
32 
33  @callback
34  def _add_new_device(device: ProtectAdoptableDeviceModel) -> None:
35  if isinstance(device, Doorlock):
36  async_add_entities([ProtectLock(data, device)])
37 
38  data.async_subscribe_adopt(_add_new_device)
39 
42  data, cast(Doorlock, device), LockEntityDescription(key="lock", name="Lock")
43  )
44  for device in data.get_by_types({ModelType.DOORLOCK})
45  )
46 
47 
49  """A Ubiquiti UniFi Protect Speaker."""
50 
51  device: Doorlock
52  entity_description: LockEntityDescription
53  _state_attrs = (
54  "_attr_available",
55  "_attr_is_locked",
56  "_attr_is_locking",
57  "_attr_is_unlocking",
58  "_attr_is_jammed",
59  )
60 
61  @callback
62  def _async_update_device_from_protect(self, device: ProtectDeviceType) -> None:
63  super()._async_update_device_from_protect(device)
64  lock_status = self.devicedevice.lock_status
65 
66  self._attr_is_locked_attr_is_locked = False
67  self._attr_is_locking_attr_is_locking = False
68  self._attr_is_unlocking_attr_is_unlocking = False
69  self._attr_is_jammed_attr_is_jammed = False
70  if lock_status is LockStatusType.CLOSED:
71  self._attr_is_locked_attr_is_locked = True
72  elif lock_status is LockStatusType.CLOSING:
73  self._attr_is_locking_attr_is_locking = True
74  elif lock_status is LockStatusType.OPENING:
75  self._attr_is_unlocking_attr_is_unlocking = True
76  elif lock_status in (
77  LockStatusType.FAILED_WHILE_CLOSING,
78  LockStatusType.FAILED_WHILE_OPENING,
79  LockStatusType.JAMMED_WHILE_CLOSING,
80  LockStatusType.JAMMED_WHILE_OPENING,
81  ):
82  self._attr_is_jammed_attr_is_jammed = True
83  # lock is not fully initialized yet
84  elif lock_status != LockStatusType.OPEN:
85  self._attr_available_attr_available_attr_available = False
86 
87  async def async_unlock(self, **kwargs: Any) -> None:
88  """Unlock the lock."""
89  _LOGGER.debug("Unlocking %s", self.devicedevice.display_name)
90  return await self.devicedevice.open_lock()
91 
92  async def async_lock(self, **kwargs: Any) -> None:
93  """Lock the lock."""
94  _LOGGER.debug("Locking %s", self.devicedevice.display_name)
95  return await self.devicedevice.close_lock()
None _async_update_device_from_protect(self, ProtectDeviceType device)
Definition: lock.py:62
None async_setup_entry(HomeAssistant hass, UFPConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: lock.py:29