Add lock platform to Tessie (#106216)

* Add lock platform

* Update tests

* fix test docstring
This commit is contained in:
Brett Adams 2023-12-22 19:11:48 +10:00 committed by GitHub
parent abc57ea706
commit 1170e72913
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 0 deletions

View File

@ -19,6 +19,7 @@ PLATFORMS = [
Platform.BUTTON,
Platform.CLIMATE,
Platform.DEVICE_TRACKER,
Platform.LOCK,
Platform.SELECT,
Platform.SENSOR,
Platform.SWITCH,

View File

@ -0,0 +1,52 @@
"""Lock platform for Tessie integration."""
from __future__ import annotations
from typing import Any
from tessie_api import lock, unlock
from homeassistant.components.lock import LockEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .coordinator import TessieDataUpdateCoordinator
from .entity import TessieEntity
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the Tessie sensor platform from a config entry."""
coordinators = hass.data[DOMAIN][entry.entry_id]
async_add_entities(TessieLockEntity(coordinator) for coordinator in coordinators)
class TessieLockEntity(TessieEntity, LockEntity):
"""Lock entity for current charge."""
_attr_name = None
def __init__(
self,
coordinator: TessieDataUpdateCoordinator,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator, "vehicle_state_locked")
@property
def is_locked(self) -> bool | None:
"""Return the state of the Lock."""
return self._value
async def async_lock(self, **kwargs: Any) -> None:
"""Set new value."""
await self.run(lock)
self.set((self.key, True))
async def async_unlock(self, **kwargs: Any) -> None:
"""Set new value."""
await self.run(unlock)
self.set((self.key, False))

View File

@ -0,0 +1,50 @@
"""Test the Tessie lock platform."""
from unittest.mock import patch
from homeassistant.components.lock import (
DOMAIN as LOCK_DOMAIN,
SERVICE_LOCK,
SERVICE_UNLOCK,
)
from homeassistant.const import ATTR_ENTITY_ID, STATE_LOCKED, STATE_UNLOCKED
from homeassistant.core import HomeAssistant
from .common import TEST_VEHICLE_STATE_ONLINE, setup_platform
async def test_locks(hass: HomeAssistant) -> None:
"""Tests that the lock entity is correct."""
assert len(hass.states.async_all("lock")) == 0
await setup_platform(hass)
assert len(hass.states.async_all("lock")) == 1
entity_id = "lock.test"
assert (
hass.states.get(entity_id).state == STATE_LOCKED
) == TEST_VEHICLE_STATE_ONLINE["vehicle_state"]["locked"]
# Test lock set value functions
with patch("homeassistant.components.tessie.lock.lock") as mock_run:
await hass.services.async_call(
LOCK_DOMAIN,
SERVICE_LOCK,
{ATTR_ENTITY_ID: [entity_id]},
blocking=True,
)
assert hass.states.get(entity_id).state == STATE_LOCKED
mock_run.assert_called_once()
with patch("homeassistant.components.tessie.lock.unlock") as mock_run:
await hass.services.async_call(
LOCK_DOMAIN,
SERVICE_UNLOCK,
{ATTR_ENTITY_ID: [entity_id]},
blocking=True,
)
assert hass.states.get(entity_id).state == STATE_UNLOCKED
mock_run.assert_called_once()