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
85 lines
2.6 KiB
Python
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()
|