From 6a23ad96ca7afc8e7821d5e4968bc930e6efaa41 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 10 Jun 2025 09:49:56 +0200 Subject: [PATCH] Move google assistant sdk services to separate module (#146434) --- .../google_assistant_sdk/__init__.py | 58 ++---------------- .../google_assistant_sdk/services.py | 61 +++++++++++++++++++ 2 files changed, 65 insertions(+), 54 deletions(-) create mode 100644 homeassistant/components/google_assistant_sdk/services.py diff --git a/homeassistant/components/google_assistant_sdk/__init__.py b/homeassistant/components/google_assistant_sdk/__init__.py index 94b0e0b8a25..6f747bfb318 100644 --- a/homeassistant/components/google_assistant_sdk/__init__.py +++ b/homeassistant/components/google_assistant_sdk/__init__.py @@ -2,21 +2,13 @@ from __future__ import annotations -import dataclasses - import aiohttp from gassist_text import TextAssistant from google.oauth2.credentials import Credentials -import voluptuous as vol from homeassistant.components import conversation from homeassistant.const import CONF_ACCESS_TOKEN, CONF_NAME, Platform -from homeassistant.core import ( - HomeAssistant, - ServiceCall, - ServiceResponse, - SupportsResponse, -) +from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady from homeassistant.helpers import config_validation as cv, discovery, intent from homeassistant.helpers.config_entry_oauth2_flow import ( @@ -31,21 +23,9 @@ from .helpers import ( GoogleAssistantSDKConfigEntry, GoogleAssistantSDKRuntimeData, InMemoryStorage, - async_send_text_commands, best_matching_language_code, ) - -SERVICE_SEND_TEXT_COMMAND = "send_text_command" -SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND = "command" -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( - cv.ensure_list, [vol.All(str, vol.Length(min=1))] - ), - vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids, - }, -) +from .services import async_setup_services CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) @@ -58,6 +38,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) ) + async_setup_services(hass) + return True @@ -81,8 +63,6 @@ async def async_setup_entry( mem_storage = InMemoryStorage(hass) hass.http.register_view(GoogleAssistantSDKAudioView(mem_storage)) - await async_setup_service(hass) - entry.runtime_data = GoogleAssistantSDKRuntimeData( session=session, mem_storage=mem_storage ) @@ -105,36 +85,6 @@ async def async_unload_entry( return True -async def async_setup_service(hass: HomeAssistant) -> None: - """Add the services for Google Assistant SDK.""" - - async def send_text_command(call: ServiceCall) -> ServiceResponse: - """Send a text command to Google Assistant SDK.""" - 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 - ) - command_response_list = await async_send_text_commands( - hass, commands, media_players - ) - if call.return_response: - return { - "responses": [ - dataclasses.asdict(command_response) - for command_response in command_response_list - ] - } - return None - - hass.services.async_register( - DOMAIN, - SERVICE_SEND_TEXT_COMMAND, - send_text_command, - schema=SERVICE_SEND_TEXT_COMMAND_SCHEMA, - supports_response=SupportsResponse.OPTIONAL, - ) - - class GoogleAssistantConversationAgent(conversation.AbstractConversationAgent): """Google Assistant SDK conversation agent.""" diff --git a/homeassistant/components/google_assistant_sdk/services.py b/homeassistant/components/google_assistant_sdk/services.py new file mode 100644 index 00000000000..7f0227bf040 --- /dev/null +++ b/homeassistant/components/google_assistant_sdk/services.py @@ -0,0 +1,61 @@ +"""Support for Google Assistant SDK.""" + +from __future__ import annotations + +import dataclasses + +import voluptuous as vol + +from homeassistant.core import ( + HomeAssistant, + ServiceCall, + ServiceResponse, + SupportsResponse, +) +from homeassistant.helpers import config_validation as cv + +from .const import DOMAIN +from .helpers import async_send_text_commands + +SERVICE_SEND_TEXT_COMMAND = "send_text_command" +SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND = "command" +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( + cv.ensure_list, [vol.All(str, vol.Length(min=1))] + ), + vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids, + }, +) + + +async def _send_text_command(call: ServiceCall) -> ServiceResponse: + """Send a text command to Google Assistant SDK.""" + 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 + ) + command_response_list = await async_send_text_commands( + call.hass, commands, media_players + ) + if call.return_response: + return { + "responses": [ + dataclasses.asdict(command_response) + for command_response in command_response_list + ] + } + return None + + +def async_setup_services(hass: HomeAssistant) -> None: + """Add the services for Google Assistant SDK.""" + + hass.services.async_register( + DOMAIN, + SERVICE_SEND_TEXT_COMMAND, + _send_text_command, + schema=SERVICE_SEND_TEXT_COMMAND_SCHEMA, + supports_response=SupportsResponse.OPTIONAL, + )