Files

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

85 lines
2.6 KiB
Python
Raw Permalink Normal View History

2020-10-01 09:50:06 +02:00
"""Support for deCONZ locks."""
2023-01-23 08:38:45 +01:00
from typing import Any
from pydeconz.models.event import EventType
from pydeconz.models.light.lock import Lock
from pydeconz.models.sensor.door_lock import DoorLock
from homeassistant.components.lock import DOMAIN as LOCK_DOMAIN, LockEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
2020-10-01 09:50:06 +02:00
2025-01-27 10:16:57 +01:00
from . import DeconzConfigEntry
2024-09-20 23:40:08 +02:00
from .entity import DeconzDevice
2020-10-01 09:50:06 +02:00
async def async_setup_entry(
hass: HomeAssistant,
2025-01-27 10:16:57 +01:00
config_entry: DeconzConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up locks for deCONZ component."""
2025-01-27 10:16:57 +01:00
hub = config_entry.runtime_data
hub.entities[LOCK_DOMAIN] = set()
2020-10-01 09:50:06 +02:00
@callback
def async_add_lock_from_light(_: EventType, lock_id: str) -> None:
2020-10-01 09:50:06 +02:00
"""Add lock from deCONZ."""
lock = hub.api.lights.locks[lock_id]
async_add_entities([DeconzLock(lock, hub)])
2020-10-01 09:50:06 +02:00
hub.register_platform_add_device_callback(
2022-05-25 05:48:09 +02:00
async_add_lock_from_light,
hub.api.lights.locks,
2020-10-01 09:50:06 +02:00
)
@callback
def async_add_lock_from_sensor(_: EventType, lock_id: str) -> None:
"""Add lock from deCONZ."""
lock = hub.api.sensors.door_lock[lock_id]
async_add_entities([DeconzLock(lock, hub)])
hub.register_platform_add_device_callback(
2022-05-25 05:48:09 +02:00
async_add_lock_from_sensor,
hub.api.sensors.door_lock,
always_ignore_clip_sensors=True,
)
2020-10-01 09:50:06 +02:00
2023-01-23 08:38:45 +01:00
class DeconzLock(DeconzDevice[DoorLock | Lock], LockEntity):
2020-10-01 09:50:06 +02:00
"""Representation of a deCONZ lock."""
TYPE = LOCK_DOMAIN
2020-10-01 09:50:06 +02:00
@property
def is_locked(self) -> bool:
2020-10-01 09:50:06 +02:00
"""Return true if lock is on."""
return self._device.is_locked
2020-10-01 09:50:06 +02:00
async def async_lock(self, **kwargs: Any) -> None:
2020-10-01 09:50:06 +02:00
"""Lock the lock."""
if isinstance(self._device, DoorLock):
await self.hub.api.sensors.door_lock.set_config(
id=self._device.resource_id,
lock=True,
)
else:
await self.hub.api.lights.locks.set_state(
id=self._device.resource_id,
lock=True,
)
2020-10-01 09:50:06 +02:00
async def async_unlock(self, **kwargs: Any) -> None:
2020-10-01 09:50:06 +02:00
"""Unlock the lock."""
if isinstance(self._device, DoorLock):
await self.hub.api.sensors.door_lock.set_config(
id=self._device.resource_id,
lock=False,
)
else:
await self.hub.api.lights.locks.set_state(
id=self._device.resource_id,
lock=False,
)