106 lines
3.0 KiB
Python
106 lines
3.0 KiB
Python
import logging
|
|
|
|
from homeassistant.helpers.entity_registry import (
|
|
async_entries_for_config_entry,
|
|
async_entries_for_device,
|
|
)
|
|
from homeassistant.const import STATE_UNAVAILABLE
|
|
from homeassistant.helpers import device_registry, area_registry
|
|
|
|
from .const import (
|
|
DOMAIN,
|
|
DATA_DEVICES,
|
|
DATA_ALIASES,
|
|
USER_COMMANDS,
|
|
)
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup_services(hass):
|
|
def call_service(service, targets, data):
|
|
|
|
devices = hass.data[DOMAIN][DATA_DEVICES]
|
|
|
|
if isinstance(targets, str):
|
|
targets = [targets]
|
|
|
|
for target in targets:
|
|
if target not in devices:
|
|
continue
|
|
device = devices[target]
|
|
device.send(service, **data)
|
|
|
|
def handle_service(call):
|
|
service = call.service
|
|
data = {**call.data}
|
|
device_ids = set(data.get("device_id", []))
|
|
data.pop("device_id", None)
|
|
area_ids = set(data.get("area_id", []))
|
|
data.pop("area_id", None)
|
|
targets = data.get("target", [])
|
|
if isinstance(targets, str):
|
|
targets = [targets]
|
|
targets = set(targets)
|
|
data.pop("target", None)
|
|
|
|
dr = device_registry.async_get(hass)
|
|
|
|
for device in device_ids:
|
|
dev = dr.async_get(device)
|
|
if not dev:
|
|
continue
|
|
browserID = list(dev.identifiers)[0][1]
|
|
if browserID is None:
|
|
continue
|
|
targets.add(browserID)
|
|
|
|
for area in area_ids:
|
|
for dev in device_registry.async_entries_for_area(dr, area):
|
|
browserID = list(dev.identifiers)[0][1]
|
|
if browserID is None:
|
|
continue
|
|
targets.add(browserID)
|
|
|
|
_LOGGER.error(service)
|
|
_LOGGER.error(targets)
|
|
_LOGGER.error(data)
|
|
|
|
call_service(service, targets, data)
|
|
|
|
hass.services.async_register(DOMAIN, "test", handle_service)
|
|
hass.services.async_register(DOMAIN, "popup", handle_service)
|
|
|
|
|
|
async def setup_service(hass):
|
|
def handle_command(call):
|
|
command = call.data.get("command", None)
|
|
if not command:
|
|
return
|
|
|
|
targets = call.data.get("deviceID", None)
|
|
if isinstance(targets, str):
|
|
targets = [targets]
|
|
devices = hass.data[DOMAIN][DATA_DEVICES]
|
|
aliases = hass.data[DOMAIN][DATA_ALIASES]
|
|
if not targets:
|
|
targets = devices.keys()
|
|
targets = [aliases.get(t, t) for t in targets]
|
|
|
|
data = dict(call.data)
|
|
del data["command"]
|
|
|
|
for t in targets:
|
|
if t in devices:
|
|
devices[t].send(command, **data)
|
|
|
|
def command_wrapper(call):
|
|
command = call.service.replace("_", "-")
|
|
call.data = dict(call.data)
|
|
call.data["command"] = command
|
|
handle_command(call)
|
|
|
|
hass.services.async_register(DOMAIN, "command", handle_command)
|
|
for cmd in USER_COMMANDS:
|
|
hass.services.async_register(DOMAIN, cmd.replace("-", "_"), command_wrapper)
|