1 """Class to hold all lock accessories."""
6 from pyhap.const
import CATEGORY_DOOR_LOCK
12 from .accessories
import TYPES, HomeAccessory
13 from .const
import CHAR_LOCK_CURRENT_STATE, CHAR_LOCK_TARGET_STATE, SERV_LOCK
15 _LOGGER = logging.getLogger(__name__)
17 HASS_TO_HOMEKIT_CURRENT = {
18 LockState.UNLOCKED.value: 0,
19 LockState.UNLOCKING.value: 1,
20 LockState.LOCKING.value: 0,
21 LockState.LOCKED.value: 1,
22 LockState.JAMMED.value: 2,
26 HASS_TO_HOMEKIT_TARGET = {
27 LockState.UNLOCKED.value: 0,
28 LockState.UNLOCKING.value: 0,
29 LockState.LOCKING.value: 1,
30 LockState.LOCKED.value: 1,
33 VALID_TARGET_STATES = {
34 LockState.LOCKING.value,
35 LockState.UNLOCKING.value,
36 LockState.LOCKED.value,
37 LockState.UNLOCKED.value,
41 0: LockState.UNLOCKED.value,
42 1: LockState.LOCKED.value,
43 2: LockState.JAMMED.value,
48 LockState.LOCKING.value:
"unlock",
49 LockState.LOCKED.value:
"lock",
50 LockState.UNLOCKING.value:
"lock",
51 LockState.UNLOCKED.value:
"unlock",
55 @TYPES.register("Lock")
57 """Generate a Lock accessory for a lock entity.
59 The lock entity must support: unlock and lock.
63 """Initialize a Lock accessory object."""
64 super().
__init__(*args, category=CATEGORY_DOOR_LOCK)
67 assert state
is not None
69 serv_lock_mechanism = self.add_preload_service(SERV_LOCK)
71 CHAR_LOCK_CURRENT_STATE, value=HASS_TO_HOMEKIT_CURRENT[STATE_UNKNOWN]
74 CHAR_LOCK_TARGET_STATE,
75 value=HASS_TO_HOMEKIT_CURRENT[LockState.LOCKED.value],
81 """Set lock state to value if call came from HomeKit."""
82 _LOGGER.debug(
"%s: Set state to %d", self.
entity_identity_id, value)
84 hass_value = HOMEKIT_TO_HASS[value]
85 service = STATE_TO_SERVICE[hass_value]
87 params = {ATTR_ENTITY_ID: self.
entity_identity_id}
89 params[ATTR_CODE] = self.
_code_code
94 """Update lock after state changed."""
95 hass_state = new_state.state
96 current_lock_state = HASS_TO_HOMEKIT_CURRENT.get(
97 hass_state, HASS_TO_HOMEKIT_CURRENT[STATE_UNKNOWN]
99 target_lock_state = HASS_TO_HOMEKIT_TARGET.get(hass_state)
101 "%s: Updated current state to %s (current=%d) (target=%s)",
110 if target_lock_state
is not None:
None async_call_service(self, str domain, str service, dict[str, Any]|None service_data, Any|None value=None)
None async_update_state(self, State new_state)
None set_state(self, int value)
None async_update_state(self, State new_state)
None __init__(self, *Any args)
web.Response get(self, web.Request request, str config_key)