Skip to content
Snippets Groups Projects
Unverified Commit 6754bf24 authored by Luke Lashley's avatar Luke Lashley Committed by GitHub
Browse files

Send Roborock commands via cloud api when needed (#138496)

* Send via cloud api when needed

* Extract logic to helper function

* change to class method
parent 244b666d
No related branches found
No related tags found
No related merge requests found
......@@ -8,7 +8,11 @@ from roborock.containers import Consumable, Status
from roborock.exceptions import RoborockException
from roborock.roborock_message import RoborockDataProtocol
from roborock.roborock_typing import RoborockCommand
from roborock.version_1_apis.roborock_client_v1 import AttributeCache, RoborockClientV1
from roborock.version_1_apis.roborock_client_v1 import (
CLOUD_REQUIRED,
AttributeCache,
RoborockClientV1,
)
from roborock.version_1_apis.roborock_mqtt_client_v1 import RoborockMqttClientV1
from roborock.version_a01_apis import RoborockClientA01
......@@ -53,14 +57,16 @@ class RoborockEntityV1(RoborockEntity):
"""Get an item from the api cache."""
return self._api.cache[attribute]
async def send(
self,
@classmethod
async def _send_command(
cls,
command: RoborockCommand | str,
api: RoborockClientV1,
params: dict[str, Any] | list[Any] | int | None = None,
) -> dict:
"""Send a command to a vacuum cleaner."""
"""Send a Roborock command with params to a given api."""
try:
response: dict = await self._api.send_command(command, params)
response: dict = await api.send_command(command, params)
except RoborockException as err:
if isinstance(command, RoborockCommand):
command_name = command.name
......@@ -75,6 +81,14 @@ class RoborockEntityV1(RoborockEntity):
) from err
return response
async def send(
self,
command: RoborockCommand | str,
params: dict[str, Any] | list[Any] | int | None = None,
) -> dict:
"""Send a command to a vacuum cleaner."""
return await self._send_command(command, self._api, params)
@property
def api(self) -> RoborockClientV1:
"""Returns the api."""
......@@ -152,7 +166,10 @@ class RoborockCoordinatedEntityV1(
params: dict[str, Any] | list[Any] | int | None = None,
) -> dict:
"""Overloads normal send command but refreshes coordinator."""
res = await super().send(command, params)
if command in CLOUD_REQUIRED:
res = await self._send_command(command, self.coordinator.cloud_api, params)
else:
res = await self._send_command(command, self._api, params)
await self.coordinator.async_refresh()
return res
......
......@@ -117,6 +117,30 @@ async def test_commands(
assert mock_send_command.call_args[0][1] == called_params
async def test_cloud_command(
hass: HomeAssistant,
bypass_api_fixture,
setup_entry: MockConfigEntry,
) -> None:
"""Test sending commands to the vacuum."""
vacuum = hass.states.get(ENTITY_ID)
assert vacuum
data = {ATTR_ENTITY_ID: ENTITY_ID, "command": "get_map_v1"}
with patch(
"homeassistant.components.roborock.coordinator.RoborockMqttClientV1.send_command"
) as mock_send_command:
await hass.services.async_call(
Platform.VACUUM,
SERVICE_SEND_COMMAND,
data,
blocking=True,
)
assert mock_send_command.call_count == 1
assert mock_send_command.call_args[0][0] == RoborockCommand.GET_MAP_V1
@pytest.mark.parametrize(
("in_cleaning_int", "expected_command"),
[
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment