mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 04:07:08 +00:00
Nuki to use entity platform (#43774)
This commit is contained in:
parent
e33405a8b0
commit
e67809713f
@ -8,11 +8,8 @@ from requests.exceptions import RequestException
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.lock import PLATFORM_SCHEMA, SUPPORT_OPEN, LockEntity
|
from homeassistant.components.lock import PLATFORM_SCHEMA, SUPPORT_OPEN, LockEntity
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, CONF_HOST, CONF_PORT, CONF_TOKEN
|
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TOKEN
|
||||||
import homeassistant.helpers.config_validation as cv
|
from homeassistant.helpers import config_validation as cv, entity_platform
|
||||||
from homeassistant.helpers.service import extract_entity_ids
|
|
||||||
|
|
||||||
from . import DOMAIN
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -28,8 +25,6 @@ MIN_TIME_BETWEEN_SCANS = timedelta(seconds=30)
|
|||||||
|
|
||||||
NUKI_DATA = "nuki"
|
NUKI_DATA = "nuki"
|
||||||
|
|
||||||
SERVICE_LOCK_N_GO = "lock_n_go"
|
|
||||||
|
|
||||||
ERROR_STATES = (0, 254, 255)
|
ERROR_STATES = (0, 254, 255)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||||
@ -40,16 +35,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
LOCK_N_GO_SERVICE_SCHEMA = vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
|
||||||
vol.Optional(ATTR_UNLATCH, default=False): cv.boolean,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
||||||
def setup_platform(hass, config, add_entities, discovery_info=None):
|
|
||||||
"""Set up the Nuki lock platform."""
|
"""Set up the Nuki lock platform."""
|
||||||
|
|
||||||
|
def get_entities():
|
||||||
bridge = NukiBridge(
|
bridge = NukiBridge(
|
||||||
config[CONF_HOST],
|
config[CONF_HOST],
|
||||||
config[CONF_TOKEN],
|
config[CONF_TOKEN],
|
||||||
@ -58,29 +48,25 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
DEFAULT_TIMEOUT,
|
DEFAULT_TIMEOUT,
|
||||||
)
|
)
|
||||||
|
|
||||||
devices = [NukiLockEntity(lock) for lock in bridge.locks]
|
entities = [NukiLockEntity(lock) for lock in bridge.locks]
|
||||||
|
entities.extend([NukiOpenerEntity(opener) for opener in bridge.openers])
|
||||||
|
return entities
|
||||||
|
|
||||||
def service_handler(service):
|
entities = await hass.async_add_executor_job(get_entities)
|
||||||
"""Service handler for nuki services."""
|
|
||||||
entity_ids = extract_entity_ids(hass, service)
|
|
||||||
unlatch = service.data[ATTR_UNLATCH]
|
|
||||||
|
|
||||||
for lock in devices:
|
async_add_entities(entities)
|
||||||
if lock.entity_id not in entity_ids:
|
|
||||||
continue
|
|
||||||
lock.lock_n_go(unlatch=unlatch)
|
|
||||||
|
|
||||||
hass.services.register(
|
platform = entity_platform.current_platform.get()
|
||||||
DOMAIN,
|
assert platform is not None
|
||||||
SERVICE_LOCK_N_GO,
|
|
||||||
service_handler,
|
platform.async_register_entity_service(
|
||||||
schema=LOCK_N_GO_SERVICE_SCHEMA,
|
"lock_n_go",
|
||||||
|
{
|
||||||
|
vol.Optional(ATTR_UNLATCH, default=False): cv.boolean,
|
||||||
|
},
|
||||||
|
"lock_n_go",
|
||||||
)
|
)
|
||||||
|
|
||||||
devices.extend([NukiOpenerEntity(opener) for opener in bridge.openers])
|
|
||||||
|
|
||||||
add_entities(devices)
|
|
||||||
|
|
||||||
|
|
||||||
class NukiDeviceEntity(LockEntity, ABC):
|
class NukiDeviceEntity(LockEntity, ABC):
|
||||||
"""Representation of a Nuki device."""
|
"""Representation of a Nuki device."""
|
||||||
@ -172,13 +158,13 @@ class NukiLockEntity(NukiDeviceEntity):
|
|||||||
"""Open the door latch."""
|
"""Open the door latch."""
|
||||||
self._nuki_device.unlatch()
|
self._nuki_device.unlatch()
|
||||||
|
|
||||||
def lock_n_go(self, unlatch=False, **kwargs):
|
def lock_n_go(self, unlatch):
|
||||||
"""Lock and go.
|
"""Lock and go.
|
||||||
|
|
||||||
This will first unlock the door, then wait for 20 seconds (or another
|
This will first unlock the door, then wait for 20 seconds (or another
|
||||||
amount of time depending on the lock settings) and relock.
|
amount of time depending on the lock settings) and relock.
|
||||||
"""
|
"""
|
||||||
self._nuki_device.lock_n_go(unlatch, kwargs)
|
self._nuki_device.lock_n_go(unlatch)
|
||||||
|
|
||||||
|
|
||||||
class NukiOpenerEntity(NukiDeviceEntity):
|
class NukiOpenerEntity(NukiDeviceEntity):
|
||||||
@ -200,3 +186,6 @@ class NukiOpenerEntity(NukiDeviceEntity):
|
|||||||
def open(self, **kwargs):
|
def open(self, **kwargs):
|
||||||
"""Buzz open the door."""
|
"""Buzz open the door."""
|
||||||
self._nuki_device.electric_strike_actuation()
|
self._nuki_device.electric_strike_actuation()
|
||||||
|
|
||||||
|
def lock_n_go(self, unlatch):
|
||||||
|
"""Stub service."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user