From ba4a163e24f9485c88f0aedda5abae22644b30cb Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:07:44 +0100 Subject: [PATCH] Move roborock service registration (#162090) --- homeassistant/components/roborock/__init__.py | 11 +++- homeassistant/components/roborock/const.py | 4 +- homeassistant/components/roborock/services.py | 53 +++++++++++++++++++ homeassistant/components/roborock/vacuum.py | 38 +------------ tests/components/roborock/test_vacuum.py | 2 +- 5 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 homeassistant/components/roborock/services.py diff --git a/homeassistant/components/roborock/__init__.py b/homeassistant/components/roborock/__init__.py index a23866fbec46..b293620424d7 100644 --- a/homeassistant/components/roborock/__init__.py +++ b/homeassistant/components/roborock/__init__.py @@ -23,8 +23,9 @@ from roborock.mqtt.session import MqttSessionUnauthorized from homeassistant.const import CONF_USERNAME, EVENT_HOMEASSISTANT_STOP from homeassistant.core import Event, HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady -from homeassistant.helpers import device_registry as dr +from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.typing import ConfigType from .const import ( CONF_BASE_URL, @@ -47,12 +48,20 @@ from .coordinator import ( RoborockWetDryVacUpdateCoordinator, ) from .roborock_storage import CacheStore, async_cleanup_map_storage +from .services import async_setup_services +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) SCAN_INTERVAL = timedelta(seconds=30) _LOGGER = logging.getLogger(__name__) +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the component.""" + async_setup_services(hass) + return True + + async def async_setup_entry(hass: HomeAssistant, entry: RoborockConfigEntry) -> bool: """Set up roborock from a config entry.""" await async_cleanup_map_storage(hass, entry.entry_id) diff --git a/homeassistant/components/roborock/const.py b/homeassistant/components/roborock/const.py index 272b3c1268a5..3cfe6f4899f9 100644 --- a/homeassistant/components/roborock/const.py +++ b/homeassistant/components/roborock/const.py @@ -52,12 +52,10 @@ IMAGE_CACHE_INTERVAL = timedelta(seconds=30) MAP_SLEEP = 3 -GET_MAPS_SERVICE_NAME = "get_maps" + MAP_SCALE = 4 MAP_FILE_FORMAT = "PNG" MAP_FILENAME_SUFFIX = ".png" -SET_VACUUM_GOTO_POSITION_SERVICE_NAME = "set_vacuum_goto_position" -GET_VACUUM_CURRENT_POSITION_SERVICE_NAME = "get_vacuum_current_position" A01_UPDATE_INTERVAL = timedelta(minutes=1) diff --git a/homeassistant/components/roborock/services.py b/homeassistant/components/roborock/services.py new file mode 100644 index 000000000000..7c60921557fa --- /dev/null +++ b/homeassistant/components/roborock/services.py @@ -0,0 +1,53 @@ +"""Roborock services.""" + +import voluptuous as vol + +from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN +from homeassistant.core import HomeAssistant, SupportsResponse, callback +from homeassistant.helpers import config_validation as cv, service + +from .const import DOMAIN + +GET_MAPS_SERVICE_NAME = "get_maps" +SET_VACUUM_GOTO_POSITION_SERVICE_NAME = "set_vacuum_goto_position" +GET_VACUUM_CURRENT_POSITION_SERVICE_NAME = "get_vacuum_current_position" + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Set up services.""" + + service.async_register_platform_entity_service( + hass, + DOMAIN, + GET_MAPS_SERVICE_NAME, + entity_domain=VACUUM_DOMAIN, + schema=None, + func="get_maps", + supports_response=SupportsResponse.ONLY, + ) + + service.async_register_platform_entity_service( + hass, + DOMAIN, + GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, + entity_domain=VACUUM_DOMAIN, + schema=None, + func="get_vacuum_current_position", + supports_response=SupportsResponse.ONLY, + ) + + service.async_register_platform_entity_service( + hass, + DOMAIN, + SET_VACUUM_GOTO_POSITION_SERVICE_NAME, + entity_domain=VACUUM_DOMAIN, + schema=cv.make_entity_service_schema( + { + vol.Required("x"): vol.Coerce(int), + vol.Required("y"): vol.Coerce(int), + }, + ), + func="async_set_vacuum_goto_position", + supports_response=SupportsResponse.NONE, + ) diff --git a/homeassistant/components/roborock/vacuum.py b/homeassistant/components/roborock/vacuum.py index cb0425b1518b..361f9dcf79d2 100644 --- a/homeassistant/components/roborock/vacuum.py +++ b/homeassistant/components/roborock/vacuum.py @@ -6,24 +6,17 @@ from typing import Any from roborock.data import RoborockStateCode, SCWindMapping, WorkStatusMapping from roborock.exceptions import RoborockException from roborock.roborock_typing import RoborockCommand -import voluptuous as vol from homeassistant.components.vacuum import ( StateVacuumEntity, VacuumActivity, VacuumEntityFeature, ) -from homeassistant.core import HomeAssistant, ServiceResponse, SupportsResponse +from homeassistant.core import HomeAssistant, ServiceResponse from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from .const import ( - DOMAIN, - GET_MAPS_SERVICE_NAME, - GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, - SET_VACUUM_GOTO_POSITION_SERVICE_NAME, -) +from .const import DOMAIN from .coordinator import ( RoborockB01Q7UpdateCoordinator, RoborockConfigEntry, @@ -92,33 +85,6 @@ async def async_setup_entry( for coordinator in config_entry.runtime_data.b01 if isinstance(coordinator, RoborockB01Q7UpdateCoordinator) ) - platform = entity_platform.async_get_current_platform() - - platform.async_register_entity_service( - GET_MAPS_SERVICE_NAME, - None, - RoborockVacuum.get_maps.__name__, - supports_response=SupportsResponse.ONLY, - ) - - platform.async_register_entity_service( - GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, - None, - RoborockVacuum.get_vacuum_current_position.__name__, - supports_response=SupportsResponse.ONLY, - ) - - platform.async_register_entity_service( - SET_VACUUM_GOTO_POSITION_SERVICE_NAME, - cv.make_entity_service_schema( - { - vol.Required("x"): vol.Coerce(int), - vol.Required("y"): vol.Coerce(int), - }, - ), - RoborockVacuum.async_set_vacuum_goto_position.__name__, - supports_response=SupportsResponse.NONE, - ) class RoborockVacuum(RoborockCoordinatedEntityV1, StateVacuumEntity): diff --git a/tests/components/roborock/test_vacuum.py b/tests/components/roborock/test_vacuum.py index a3a3b0875bbf..e9b873cbbf16 100644 --- a/tests/components/roborock/test_vacuum.py +++ b/tests/components/roborock/test_vacuum.py @@ -10,7 +10,7 @@ from syrupy.assertion import SnapshotAssertion from vacuum_map_parser_base.map_data import Point from homeassistant.components.roborock import DOMAIN -from homeassistant.components.roborock.const import ( +from homeassistant.components.roborock.services import ( GET_MAPS_SERVICE_NAME, GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, SET_VACUUM_GOTO_POSITION_SERVICE_NAME,