Home Assistant Unofficial Reference 2024.12.1
lock.py
Go to the documentation of this file.
1 """Support for locks through the SmartThings cloud API."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Sequence
6 from typing import Any
7 
8 from pysmartthings import Attribute, Capability
9 
10 from homeassistant.components.lock import LockEntity
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .const import DATA_BROKERS, DOMAIN
16 from .entity import SmartThingsEntity
17 
18 ST_STATE_LOCKED = "locked"
19 ST_LOCK_ATTR_MAP = {
20  "codeId": "code_id",
21  "codeName": "code_name",
22  "lockName": "lock_name",
23  "method": "method",
24  "timeout": "timeout",
25  "usedCode": "used_code",
26 }
27 
28 
30  hass: HomeAssistant,
31  config_entry: ConfigEntry,
32  async_add_entities: AddEntitiesCallback,
33 ) -> None:
34  """Add locks for a config entry."""
35  broker = hass.data[DOMAIN][DATA_BROKERS][config_entry.entry_id]
37  SmartThingsLock(device)
38  for device in broker.devices.values()
39  if broker.any_assigned(device.device_id, "lock")
40  )
41 
42 
43 def get_capabilities(capabilities: Sequence[str]) -> Sequence[str] | None:
44  """Return all capabilities supported if minimum required are present."""
45  if Capability.lock in capabilities:
46  return [Capability.lock]
47  return None
48 
49 
51  """Define a SmartThings lock."""
52 
53  async def async_lock(self, **kwargs: Any) -> None:
54  """Lock the device."""
55  await self._device_device.lock(set_status=True)
56  self.async_write_ha_stateasync_write_ha_state()
57 
58  async def async_unlock(self, **kwargs: Any) -> None:
59  """Unlock the device."""
60  await self._device_device.unlock(set_status=True)
61  self.async_write_ha_stateasync_write_ha_state()
62 
63  @property
64  def is_locked(self) -> bool:
65  """Return true if lock is locked."""
66  return self._device_device.status.lock == ST_STATE_LOCKED
67 
68  @property
69  def extra_state_attributes(self) -> dict[str, Any]:
70  """Return device specific state attributes."""
71  state_attrs = {}
72  status = self._device_device.status.attributes[Attribute.lock]
73  if status.value:
74  state_attrs["lock_state"] = status.value
75  if isinstance(status.data, dict):
76  for st_attr, ha_attr in ST_LOCK_ATTR_MAP.items():
77  if (data_val := status.data.get(st_attr)) is not None:
78  state_attrs[ha_attr] = data_val
79  return state_attrs
None async_unlock(self, **Any kwargs)
Definition: __init__.py:245
None unlock(self, **Any kwargs)
Definition: __init__.py:241
None lock(self, **Any kwargs)
Definition: __init__.py:228
Mapping[str, Any]|None extra_state_attributes(self)
Definition: entity.py:787
Sequence[str]|None get_capabilities(Sequence[str] capabilities)
Definition: lock.py:43
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: lock.py:33