Basic service call framework set up
This commit is contained in:
@@ -5,19 +5,73 @@ from homeassistant.helpers.entity_registry import (
|
||||
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,
|
||||
DATA_CONFIG,
|
||||
CONFIG_DEVICES,
|
||||
)
|
||||
|
||||
_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)
|
||||
@@ -49,55 +103,3 @@ async def setup_service(hass):
|
||||
hass.services.async_register(DOMAIN, "command", handle_command)
|
||||
for cmd in USER_COMMANDS:
|
||||
hass.services.async_register(DOMAIN, cmd.replace("-", "_"), command_wrapper)
|
||||
|
||||
async def call_service(service_call):
|
||||
await async_clean_devices(hass, service_call.data)
|
||||
|
||||
hass.services.async_register(DOMAIN, "clean_devices", call_service)
|
||||
|
||||
|
||||
async def async_clean_devices(hass, data):
|
||||
config_entry = hass.config_entries.async_entries(DOMAIN)[0]
|
||||
|
||||
entity_registry = await hass.helpers.entity_registry.async_get_registry()
|
||||
device_registry = await hass.helpers.device_registry.async_get_registry()
|
||||
entity_entries = async_entries_for_config_entry(
|
||||
entity_registry, config_entry.entry_id
|
||||
)
|
||||
|
||||
device_entries = [
|
||||
entry
|
||||
for entry in device_registry.devices.values()
|
||||
if config_entry.entry_id in entry.config_entries
|
||||
]
|
||||
|
||||
user_config = hass.data[DOMAIN][DATA_CONFIG]
|
||||
|
||||
devices_to_keep = []
|
||||
if CONFIG_DEVICES in user_config:
|
||||
for d in device_entries:
|
||||
for c in user_config[CONFIG_DEVICES]:
|
||||
if (DOMAIN, c) in d.identifiers:
|
||||
devices_to_keep.append(d.id)
|
||||
|
||||
entities_to_remove = []
|
||||
for e in entity_entries:
|
||||
entity = hass.states.get(e.entity_id)
|
||||
if entity.state != STATE_UNAVAILABLE:
|
||||
continue
|
||||
if e.device_id in devices_to_keep:
|
||||
continue
|
||||
entities_to_remove.append(e)
|
||||
|
||||
for e in entities_to_remove:
|
||||
entity_registry.async_remove(e.entity_id)
|
||||
|
||||
removed = []
|
||||
for d in device_entries:
|
||||
if len(async_entries_for_device(entity_registry, d.id)) == 0:
|
||||
removed.append(d.name)
|
||||
device_registry.async_remove_device(d.id)
|
||||
|
||||
devices = hass.data[DOMAIN][DATA_DEVICES]
|
||||
for rec in devices:
|
||||
devices[rec].send("toast", message=f"Removed devices: {removed}")
|
||||
|
||||
Reference in New Issue
Block a user