Add lawn mower support to Google Assistant (#140530)

* Add lawn mower support to google assistant

* Update snapshots

* Sort alphabetically

* Refactor service call

* Refactor service call

* Feedback
This commit is contained in:
Paul Bottein
2025-03-14 16:22:23 +01:00
committed by GitHub
parent e740e341c8
commit 324f208d68
4 changed files with 141 additions and 42 deletions

View File

@@ -21,6 +21,7 @@ from homeassistant.components import (
input_boolean,
input_button,
input_select,
lawn_mower,
light,
lock,
media_player,
@@ -44,6 +45,7 @@ from homeassistant.components.fan import FanEntityFeature
from homeassistant.components.google_assistant import const, error, helpers, trait
from homeassistant.components.google_assistant.error import SmartHomeError
from homeassistant.components.humidifier import HumidifierEntityFeature
from homeassistant.components.lawn_mower import LawnMowerEntityFeature
from homeassistant.components.light import LightEntityFeature
from homeassistant.components.lock import LockEntityFeature
from homeassistant.components.media_player import (
@@ -589,6 +591,64 @@ async def test_startstop_vacuum(hass: HomeAssistant) -> None:
assert unpause_calls[0].data == {ATTR_ENTITY_ID: "vacuum.bla"}
async def test_dock_lawn_mower(hass: HomeAssistant) -> None:
"""Test dock trait support for lawn mower domain."""
assert helpers.get_google_type(lawn_mower.DOMAIN, None) is not None
assert trait.DockTrait.supported(lawn_mower.DOMAIN, 0, None, None)
trt = trait.DockTrait(
hass, State("lawn_mower.bla", lawn_mower.LawnMowerActivity.MOWING), BASIC_CONFIG
)
assert trt.sync_attributes() == {}
assert trt.query_attributes() == {"isDocked": False}
calls = async_mock_service(hass, lawn_mower.DOMAIN, lawn_mower.SERVICE_DOCK)
await trt.execute(trait.COMMAND_DOCK, BASIC_DATA, {}, {})
assert len(calls) == 1
assert calls[0].data == {ATTR_ENTITY_ID: "lawn_mower.bla"}
async def test_startstop_lawn_mower(hass: HomeAssistant) -> None:
"""Test startStop trait support for lawn mower domain."""
assert helpers.get_google_type(lawn_mower.DOMAIN, None) is not None
assert trait.StartStopTrait.supported(lawn_mower.DOMAIN, 0, None, None)
trt = trait.StartStopTrait(
hass,
State(
"lawn_mower.bla",
lawn_mower.LawnMowerActivity.PAUSED,
{ATTR_SUPPORTED_FEATURES: LawnMowerEntityFeature.PAUSE},
),
BASIC_CONFIG,
)
assert trt.sync_attributes() == {"pausable": True}
assert trt.query_attributes() == {"isRunning": False, "isPaused": True}
start_calls = async_mock_service(
hass, lawn_mower.DOMAIN, lawn_mower.SERVICE_START_MOWING
)
await trt.execute(trait.COMMAND_START_STOP, BASIC_DATA, {"start": True}, {})
assert len(start_calls) == 1
assert start_calls[0].data == {ATTR_ENTITY_ID: "lawn_mower.bla"}
pause_calls = async_mock_service(hass, lawn_mower.DOMAIN, lawn_mower.SERVICE_PAUSE)
await trt.execute(trait.COMMAND_PAUSE_UNPAUSE, BASIC_DATA, {"pause": True}, {})
assert len(pause_calls) == 1
assert pause_calls[0].data == {ATTR_ENTITY_ID: "lawn_mower.bla"}
unpause_calls = async_mock_service(
hass, lawn_mower.DOMAIN, lawn_mower.SERVICE_START_MOWING
)
await trt.execute(trait.COMMAND_PAUSE_UNPAUSE, BASIC_DATA, {"pause": False}, {})
assert len(unpause_calls) == 1
assert unpause_calls[0].data == {ATTR_ENTITY_ID: "lawn_mower.bla"}
@pytest.mark.parametrize(
(
"domain",