hass-core/homeassistant/components/loqed/lock.py
Mike Woudenberg ab50069918
Quality improvement on LOQED integration (#95725)
Remove generated translation
Raise error correctly
Remove obsolete consts
Remove callback, hass assignment and info log
Use name from LOQED API instead of default name
Correct entity name for assertion
2023-07-02 21:52:52 -04:00

85 lines
2.6 KiB
Python

"""LOQED lock integration for Home Assistant."""
from __future__ import annotations
import logging
from typing import Any
from homeassistant.components.lock import LockEntity, LockEntityFeature
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import LoqedDataCoordinator
from .const import DOMAIN
from .entity import LoqedEntity
WEBHOOK_API_ENDPOINT = "/api/loqed/webhook"
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the Loqed lock platform."""
coordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities([LoqedLock(coordinator)])
class LoqedLock(LoqedEntity, LockEntity):
"""Representation of a loqed lock."""
_attr_supported_features = LockEntityFeature.OPEN
def __init__(self, coordinator: LoqedDataCoordinator) -> None:
"""Initialize the lock."""
super().__init__(coordinator)
self._lock = coordinator.lock
self._attr_unique_id = self._lock.id
self._attr_name = None
@property
def changed_by(self) -> str:
"""Return internal ID of last used key."""
return f"KeyID {self._lock.last_key_id}"
@property
def is_locking(self) -> bool | None:
"""Return true if lock is locking."""
return self._lock.bolt_state == "locking"
@property
def is_unlocking(self) -> bool | None:
"""Return true if lock is unlocking."""
return self._lock.bolt_state == "unlocking"
@property
def is_jammed(self) -> bool | None:
"""Return true if lock is jammed."""
return self._lock.bolt_state == "motor_stall"
@property
def is_locked(self) -> bool | None:
"""Return true if lock is locked."""
return self._lock.bolt_state in ["night_lock_remote", "night_lock"]
async def async_lock(self, **kwargs: Any) -> None:
"""Lock the lock."""
await self._lock.lock()
async def async_unlock(self, **kwargs: Any) -> None:
"""Unlock the lock."""
await self._lock.unlock()
async def async_open(self, **kwargs: Any) -> None:
"""Open the door latch."""
await self._lock.open()
@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
_LOGGER.debug(self.coordinator.data)
if "bolt_state" in self.coordinator.data:
self._lock.updateState(self.coordinator.data["bolt_state"]).close()
self.async_write_ha_state()