ha-core/homeassistant/components/subaru/lock.py

100 lines
3.1 KiB
Python

"""Support for Subaru door locks."""
import logging
from typing import Any
import voluptuous as vol
from homeassistant.components.lock import LockEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import SERVICE_LOCK, SERVICE_UNLOCK
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import DOMAIN, get_device_info
from .const import (
ATTR_DOOR,
ENTRY_CONTROLLER,
ENTRY_VEHICLES,
SERVICE_UNLOCK_SPECIFIC_DOOR,
UNLOCK_DOOR_ALL,
UNLOCK_VALID_DOORS,
VEHICLE_HAS_REMOTE_SERVICE,
VEHICLE_NAME,
VEHICLE_VIN,
)
from .remote_service import async_call_remote_service
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Subaru locks by config_entry."""
entry = hass.data[DOMAIN][config_entry.entry_id]
controller = entry[ENTRY_CONTROLLER]
vehicle_info = entry[ENTRY_VEHICLES]
async_add_entities(
SubaruLock(vehicle, controller)
for vehicle in vehicle_info.values()
if vehicle[VEHICLE_HAS_REMOTE_SERVICE]
)
platform = entity_platform.async_get_current_platform()
platform.async_register_entity_service(
SERVICE_UNLOCK_SPECIFIC_DOOR,
{vol.Required(ATTR_DOOR): vol.In(UNLOCK_VALID_DOORS)},
"async_unlock_specific_door",
)
class SubaruLock(LockEntity):
"""
Representation of a Subaru door lock.
Note that the Subaru API currently does not support returning the status of the locks. Lock status is always unknown.
"""
def __init__(self, vehicle_info, controller):
"""Initialize the locks for the vehicle."""
self.controller = controller
self.vehicle_info = vehicle_info
vin = vehicle_info[VEHICLE_VIN]
self.car_name = vehicle_info[VEHICLE_NAME]
self._attr_name = f"{self.car_name} Door Locks"
self._attr_unique_id = f"{vin}_door_locks"
self._attr_device_info = get_device_info(vehicle_info)
async def async_lock(self, **kwargs: Any) -> None:
"""Send the lock command."""
_LOGGER.debug("Locking doors for: %s", self.car_name)
await async_call_remote_service(
self.controller,
SERVICE_LOCK,
self.vehicle_info,
)
async def async_unlock(self, **kwargs: Any) -> None:
"""Send the unlock command."""
_LOGGER.debug("Unlocking doors for: %s", self.car_name)
await async_call_remote_service(
self.controller,
SERVICE_UNLOCK,
self.vehicle_info,
UNLOCK_VALID_DOORS[UNLOCK_DOOR_ALL],
)
async def async_unlock_specific_door(self, door):
"""Send the unlock command for a specified door."""
_LOGGER.debug("Unlocking %s door for: %s", door, self.car_name)
await async_call_remote_service(
self.controller,
SERVICE_UNLOCK,
self.vehicle_info,
UNLOCK_VALID_DOORS[door],
)