3 from __future__
import annotations
8 from chip.clusters
import Objects
as clusters
12 LockEntityDescription,
20 from .const
import LOGGER
21 from .entity
import MatterEntity
22 from .helpers
import get_matter
23 from .models
import MatterDiscoverySchema
25 DoorLockFeature = clusters.DoorLock.Bitmaps.Feature
30 config_entry: ConfigEntry,
31 async_add_entities: AddEntitiesCallback,
33 """Set up Matter lock from Config Entry."""
35 matter.register_platform_handler(Platform.LOCK, async_add_entities)
39 """Representation of a Matter lock."""
41 _feature_map: int |
None =
None
42 _optimistic_timer: asyncio.TimerHandle |
None =
None
43 _platform_translation_key =
"lock"
47 """Regex for code format or None if no code is required."""
49 clusters.DoorLock.Attributes.RequirePINforRemoteOperation
51 min_pincode_length =
int(
53 clusters.DoorLock.Attributes.MinPINCodeLength
56 max_pincode_length =
int(
58 clusters.DoorLock.Attributes.MaxPINCodeLength
61 return f
"^\\d{{{min_pincode_length},{max_pincode_length}}}$"
67 command: clusters.ClusterCommand,
68 timed_request_timeout_ms: int = 1000,
70 """Send a command to the device."""
72 node_id=self.
_endpoint_endpoint.node.node_id,
73 endpoint_id=self.
_endpoint_endpoint.endpoint_id,
75 timed_request_timeout_ms=timed_request_timeout_ms,
79 """Lock the lock with pin if needed."""
89 code: str |
None = kwargs.get(ATTR_CODE)
90 code_bytes = code.encode()
if code
else None
92 command=clusters.DoorLock.Commands.LockDoor(code_bytes)
96 """Unlock the lock with pin if needed."""
106 code: str |
None = kwargs.get(ATTR_CODE)
107 code_bytes = code.encode()
if code
else None
113 command=clusters.DoorLock.Commands.UnboltDoor(code_bytes)
117 command=clusters.DoorLock.Commands.UnlockDoor(code_bytes)
121 """Open the door latch."""
130 code: str |
None = kwargs.get(ATTR_CODE)
131 code_bytes = code.encode()
if code
else None
133 command=clusters.DoorLock.Commands.UnlockDoor(code_bytes)
138 """Update the entity from the device."""
143 clusters.DoorLock.Attributes.LockState
149 LOGGER.debug(
"Lock state: %s for %s", lock_state, self.
entity_identity_id)
151 if lock_state == clusters.DoorLock.Enums.DlLockState.kUnlatched:
154 elif lock_state == clusters.DoorLock.Enums.DlLockState.kLocked:
158 clusters.DoorLock.Enums.DlLockState.kUnlocked,
159 clusters.DoorLock.Enums.DlLockState.kNotFullyLocked,
184 """Calculate features for HA Lock platform from Matter FeatureMap."""
195 if bool(feature_map & DoorLockFeature.kUnbolt):
196 supported_features |= LockEntityFeature.OPEN
200 DISCOVERY_SCHEMAS = [
202 platform=Platform.LOCK,
207 entity_class=MatterLock,
208 required_attributes=(clusters.DoorLock.Attributes.LockState,),
Any get_matter_attribute_value(self, type[ClusterAttributeDescriptor] attribute, bool null_as_none=True)
None async_unlock(self, **Any kwargs)
None send_device_command(self, clusters.ClusterCommand command, int timed_request_timeout_ms=1000)
None _reset_optimistic_state(self, bool write_state=True)
str|None code_format(self)
None async_open(self, **Any kwargs)
None async_lock(self, **Any kwargs)
None _update_from_device(self)
None _calculate_features(self)
None async_write_ha_state(self)
MatterAdapter get_matter(HomeAssistant hass)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)