Home Assistant Unofficial Reference 2024.12.1
lock.py
Go to the documentation of this file.
1 """LOQED lock integration for Home Assistant."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from homeassistant.components.lock import LockEntity, LockEntityFeature
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant, callback
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 
13 from . import LoqedDataCoordinator
14 from .const import DOMAIN
15 from .entity import LoqedEntity
16 
17 WEBHOOK_API_ENDPOINT = "/api/loqed/webhook"
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 
23  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
24 ) -> None:
25  """Set up the Loqed lock platform."""
26  coordinator = hass.data[DOMAIN][entry.entry_id]
27 
28  async_add_entities([LoqedLock(coordinator)])
29 
30 
32  """Representation of a loqed lock."""
33 
34  _attr_supported_features = LockEntityFeature.OPEN
35 
36  def __init__(self, coordinator: LoqedDataCoordinator) -> None:
37  """Initialize the lock."""
38  super().__init__(coordinator)
39  self._lock_lock = coordinator.lock
40  self._attr_unique_id_attr_unique_id = self._lock_lock.id
41  self._attr_name_attr_name = None
42 
43  @property
44  def changed_by(self) -> str:
45  """Return internal ID of last used key."""
46  return f"KeyID {self._lock.last_key_id}"
47 
48  @property
49  def is_locking(self) -> bool | None:
50  """Return true if lock is locking."""
51  return self._lock_lock.bolt_state == "locking"
52 
53  @property
54  def is_unlocking(self) -> bool | None:
55  """Return true if lock is unlocking."""
56  return self._lock_lock.bolt_state == "unlocking"
57 
58  @property
59  def is_jammed(self) -> bool | None:
60  """Return true if lock is jammed."""
61  return self._lock_lock.bolt_state == "motor_stall"
62 
63  @property
64  def is_locked(self) -> bool | None:
65  """Return true if lock is locked."""
66  return self._lock_lock.bolt_state in ["night_lock_remote", "night_lock"]
67 
68  async def async_lock(self, **kwargs: Any) -> None:
69  """Lock the lock."""
70  await self._lock_lock.lock()
71 
72  async def async_unlock(self, **kwargs: Any) -> None:
73  """Unlock the lock."""
74  await self._lock_lock.unlock()
75 
76  async def async_open(self, **kwargs: Any) -> None:
77  """Open the door latch."""
78  await self._lock_lock.open()
79 
80  @callback
81  def _handle_coordinator_update(self) -> None:
82  """Handle updated data from the coordinator."""
83  _LOGGER.debug(self.coordinator.data)
84  if "bolt_state" in self.coordinator.data:
85  self._lock_lock.updateState(self.coordinator.data["bolt_state"]).close()
86  self.async_write_ha_stateasync_write_ha_state()
None unlock(self, **Any kwargs)
Definition: __init__.py:241
None open(self, **Any kwargs)
Definition: __init__.py:254
None __init__(self, LoqedDataCoordinator coordinator)
Definition: lock.py:36
None async_lock(self, **Any kwargs)
Definition: lock.py:68
None async_open(self, **Any kwargs)
Definition: lock.py:76
None async_unlock(self, **Any kwargs)
Definition: lock.py:72
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: lock.py:24