Google Assistant SDK: Allow multiple commands in the same conversation context (#85423)

* Allow multiple commands in the same conversation

* fix test

* Apply suggestions from code review

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>

* Add missing cv import

* Update service description

* Fix test after merging dev

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
tronikos 2023-01-24 08:54:23 -08:00 committed by GitHub
parent 0d3bf0e911
commit 949c88930f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 4 deletions

View File

@ -38,7 +38,7 @@ SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER = "media_player"
SERVICE_SEND_TEXT_COMMAND_SCHEMA = vol.All(
{
vol.Required(SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND): vol.All(
str, vol.Length(min=1)
cv.ensure_list, [vol.All(str, vol.Length(min=1))]
),
vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids,
},
@ -106,11 +106,11 @@ async def async_setup_service(hass: HomeAssistant) -> None:
async def send_text_command(call: ServiceCall) -> None:
"""Send a text command to Google Assistant SDK."""
command: str = call.data[SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND]
commands: list[str] = call.data[SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND]
media_players: list[str] | None = call.data.get(
SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER
)
await async_send_text_commands(hass, [command], media_players)
await async_send_text_commands(hass, commands, media_players)
hass.services.async_register(
DOMAIN,

View File

@ -4,7 +4,7 @@ send_text_command:
fields:
command:
name: Command
description: Command to send to Google Assistant.
description: Command(s) to send to Google Assistant.
example: turn off kitchen TV
selector:
text:

View File

@ -145,6 +145,35 @@ async def test_send_text_command(
mock_text_assistant.assert_has_calls([call().__enter__().assist(command)])
async def test_send_text_commands(
hass: HomeAssistant,
setup_integration: ComponentSetup,
) -> None:
"""Test service call send_text_command calls TextAssistant."""
await setup_integration()
entries = hass.config_entries.async_entries(DOMAIN)
assert len(entries) == 1
assert entries[0].state is ConfigEntryState.LOADED
command1 = "open the garage door"
command2 = "1234"
with patch(
"homeassistant.components.google_assistant_sdk.helpers.TextAssistant"
) as mock_text_assistant:
await hass.services.async_call(
DOMAIN,
"send_text_command",
{"command": [command1, command2]},
blocking=True,
)
mock_text_assistant.assert_called_once_with(
ExpectedCredentials(), "en-US", audio_out=False
)
mock_text_assistant.assert_has_calls([call().__enter__().assist(command1)])
mock_text_assistant.assert_has_calls([call().__enter__().assist(command2)])
@pytest.mark.parametrize(
"status,requires_reauth",
[