91 lines
2.4 KiB
Python
91 lines
2.4 KiB
Python
"""Support for the Abode Security System."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from jaraco.abode.exceptions import Exception as AbodeException
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import ATTR_ENTITY_ID
|
|
from homeassistant.core import HomeAssistant, ServiceCall, callback
|
|
from homeassistant.helpers import config_validation as cv
|
|
from homeassistant.helpers.dispatcher import dispatcher_send
|
|
|
|
from .const import DOMAIN, LOGGER
|
|
|
|
SERVICE_SETTINGS = "change_setting"
|
|
SERVICE_CAPTURE_IMAGE = "capture_image"
|
|
SERVICE_TRIGGER_AUTOMATION = "trigger_automation"
|
|
|
|
ATTR_SETTING = "setting"
|
|
ATTR_VALUE = "value"
|
|
|
|
|
|
CHANGE_SETTING_SCHEMA = vol.Schema(
|
|
{vol.Required(ATTR_SETTING): cv.string, vol.Required(ATTR_VALUE): cv.string}
|
|
)
|
|
|
|
CAPTURE_IMAGE_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids})
|
|
|
|
AUTOMATION_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids})
|
|
|
|
|
|
def _change_setting(call: ServiceCall) -> None:
|
|
"""Change an Abode system setting."""
|
|
setting = call.data[ATTR_SETTING]
|
|
value = call.data[ATTR_VALUE]
|
|
|
|
try:
|
|
call.hass.data[DOMAIN].abode.set_setting(setting, value)
|
|
except AbodeException as ex:
|
|
LOGGER.warning(ex)
|
|
|
|
|
|
def _capture_image(call: ServiceCall) -> None:
|
|
"""Capture a new image."""
|
|
entity_ids = call.data[ATTR_ENTITY_ID]
|
|
|
|
target_entities = [
|
|
entity_id
|
|
for entity_id in call.hass.data[DOMAIN].entity_ids
|
|
if entity_id in entity_ids
|
|
]
|
|
|
|
for entity_id in target_entities:
|
|
signal = f"abode_camera_capture_{entity_id}"
|
|
dispatcher_send(call.hass, signal)
|
|
|
|
|
|
def _trigger_automation(call: ServiceCall) -> None:
|
|
"""Trigger an Abode automation."""
|
|
entity_ids = call.data[ATTR_ENTITY_ID]
|
|
|
|
target_entities = [
|
|
entity_id
|
|
for entity_id in call.hass.data[DOMAIN].entity_ids
|
|
if entity_id in entity_ids
|
|
]
|
|
|
|
for entity_id in target_entities:
|
|
signal = f"abode_trigger_automation_{entity_id}"
|
|
dispatcher_send(call.hass, signal)
|
|
|
|
|
|
@callback
|
|
def async_setup_services(hass: HomeAssistant) -> None:
|
|
"""Home Assistant services."""
|
|
|
|
hass.services.async_register(
|
|
DOMAIN, SERVICE_SETTINGS, _change_setting, schema=CHANGE_SETTING_SCHEMA
|
|
)
|
|
|
|
hass.services.async_register(
|
|
DOMAIN, SERVICE_CAPTURE_IMAGE, _capture_image, schema=CAPTURE_IMAGE_SCHEMA
|
|
)
|
|
|
|
hass.services.async_register(
|
|
DOMAIN,
|
|
SERVICE_TRIGGER_AUTOMATION,
|
|
_trigger_automation,
|
|
schema=AUTOMATION_SCHEMA,
|
|
)
|