1 """Support for HomeKit Controller locks."""
3 from __future__
import annotations
7 from aiohomekit.model.characteristics
import CharacteristicsTypes
8 from aiohomekit.model.services
import Service, ServicesTypes
16 from .
import KNOWN_DEVICES
17 from .connection
import HKDevice
18 from .entity
import HomeKitEntity
21 0: LockState.UNLOCKED,
27 TARGET_STATE_MAP = {LockState.UNLOCKED: 0, LockState.LOCKED: 1}
29 REVERSED_TARGET_STATE_MAP = {v: k
for k, v
in TARGET_STATE_MAP.items()}
34 config_entry: ConfigEntry,
35 async_add_entities: AddEntitiesCallback,
37 """Set up Homekit lock."""
38 hkid: str = config_entry.data[
"AccessoryPairingID"]
39 conn: HKDevice = hass.data[KNOWN_DEVICES][hkid]
42 def async_add_service(service: Service) -> bool:
43 if service.type != ServicesTypes.LOCK_MECHANISM:
45 info = {
"aid": service.accessory.aid,
"iid": service.iid}
47 conn.async_migrate_unique_id(
48 entity.old_unique_id, entity.unique_id, Platform.LOCK
53 conn.add_listener(async_add_service)
57 """Representation of a HomeKit Controller Lock."""
60 """Define the homekit characteristics the entity cares about."""
62 CharacteristicsTypes.LOCK_MECHANISM_CURRENT_STATE,
63 CharacteristicsTypes.LOCK_MECHANISM_TARGET_STATE,
64 CharacteristicsTypes.BATTERY_LEVEL,
69 """Return true if device is locked."""
70 value = self.
serviceservice.value(CharacteristicsTypes.LOCK_MECHANISM_CURRENT_STATE)
71 if CURRENT_STATE_MAP[value] == STATE_UNKNOWN:
73 return CURRENT_STATE_MAP[value] == LockState.LOCKED
77 """Return true if device is locking."""
78 current_value = self.
serviceservice.value(
79 CharacteristicsTypes.LOCK_MECHANISM_CURRENT_STATE
81 target_value = self.
serviceservice.value(
82 CharacteristicsTypes.LOCK_MECHANISM_TARGET_STATE
85 CURRENT_STATE_MAP[current_value] == LockState.UNLOCKED
86 and REVERSED_TARGET_STATE_MAP.get(target_value) == LockState.LOCKED
91 """Return true if device is unlocking."""
92 current_value = self.
serviceservice.value(
93 CharacteristicsTypes.LOCK_MECHANISM_CURRENT_STATE
95 target_value = self.
serviceservice.value(
96 CharacteristicsTypes.LOCK_MECHANISM_TARGET_STATE
99 CURRENT_STATE_MAP[current_value] == LockState.LOCKED
100 and REVERSED_TARGET_STATE_MAP.get(target_value) == LockState.UNLOCKED
105 """Return true if device is jammed."""
106 value = self.
serviceservice.value(CharacteristicsTypes.LOCK_MECHANISM_CURRENT_STATE)
107 return CURRENT_STATE_MAP[value] == LockState.JAMMED
110 """Lock the device."""
114 """Unlock the device."""
118 """Send state command."""
120 {CharacteristicsTypes.LOCK_MECHANISM_TARGET_STATE: TARGET_STATE_MAP[state]}
125 await self.
_accessory_accessory.async_request_update()
129 """Return the optional state attributes."""
132 battery_level = self.
serviceservice.value(CharacteristicsTypes.BATTERY_LEVEL)
134 attributes[ATTR_BATTERY_LEVEL] = battery_level
None async_put_characteristics(self, dict[str, Any] characteristics)
bool|None is_locked(self)
None async_lock(self, **Any kwargs)
None _set_lock_state(self, LockState state)
list[str] get_characteristic_types(self)
dict[str, Any] extra_state_attributes(self)
None async_unlock(self, **Any kwargs)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)