"""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)