core/homeassistant/components/synology_dsm/service.py

68 lines
2.2 KiB
Python

"""The Synology DSM component."""
from __future__ import annotations
import logging
from synology_dsm.exceptions import SynologyDSMException
from homeassistant.core import HomeAssistant, ServiceCall
from .const import CONF_SERIAL, DOMAIN, SERVICE_REBOOT, SERVICE_SHUTDOWN, SERVICES
from .models import SynologyDSMData
LOGGER = logging.getLogger(__name__)
async def async_setup_services(hass: HomeAssistant) -> None:
"""Service handler setup."""
async def service_handler(call: ServiceCall) -> None:
"""Handle service call."""
serial = call.data.get(CONF_SERIAL)
dsm_devices = hass.data[DOMAIN]
if serial:
dsm_device: SynologyDSMData = hass.data[DOMAIN][serial]
elif len(dsm_devices) == 1:
dsm_device = next(iter(dsm_devices.values()))
serial = next(iter(dsm_devices))
else:
LOGGER.error(
"More than one DSM configured, must specify one of serials %s",
sorted(dsm_devices),
)
return
if not dsm_device:
LOGGER.error("DSM with specified serial %s not found", serial)
return
if call.service in [SERVICE_REBOOT, SERVICE_SHUTDOWN]:
if serial not in hass.data[DOMAIN]:
LOGGER.error("DSM with specified serial %s not found", serial)
return
LOGGER.debug("%s DSM with serial %s", call.service, serial)
LOGGER.warning(
(
"The %s service is deprecated and will be removed in future"
" release. Please use the corresponding button entity"
),
call.service,
)
dsm_device = hass.data[DOMAIN][serial]
dsm_api = dsm_device.api
try:
await getattr(dsm_api, f"async_{call.service}")()
except SynologyDSMException as ex:
LOGGER.error(
"%s of DSM with serial %s not possible, because of %s",
call.service,
serial,
ex,
)
return
for service in SERVICES:
hass.services.async_register(DOMAIN, service, service_handler)