1 """Support for Google Assistant SDK."""
3 from __future__
import annotations
8 from gassist_text
import TextAssistant
9 from google.oauth2.credentials
import Credentials
10 import voluptuous
as vol
25 async_get_config_entry_implementation,
34 SUPPORTED_LANGUAGE_CODES,
36 from .helpers
import (
37 GoogleAssistantSDKAudioView,
39 async_send_text_commands,
40 best_matching_language_code,
43 SERVICE_SEND_TEXT_COMMAND =
"send_text_command"
44 SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND =
"command"
45 SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER =
"media_player"
46 SERVICE_SEND_TEXT_COMMAND_SCHEMA = vol.All(
48 vol.Required(SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND): vol.All(
49 cv.ensure_list, [vol.All(str, vol.Length(min=1))]
51 vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids,
55 CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
58 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
59 """Set up Google Assistant SDK component."""
60 hass.async_create_task(
61 discovery.async_load_platform(
62 hass, Platform.NOTIFY, DOMAIN, {CONF_NAME: DOMAIN}, config
70 """Set up Google Assistant SDK from a config entry."""
71 hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {}
76 await session.async_ensure_token_valid()
77 except aiohttp.ClientResponseError
as err:
78 if 400 <= err.status < 500:
80 "OAuth session is not valid, reauth required"
82 raise ConfigEntryNotReady
from err
83 except aiohttp.ClientError
as err:
84 raise ConfigEntryNotReady
from err
85 hass.data[DOMAIN][entry.entry_id][DATA_SESSION] = session
88 hass.data[DOMAIN][entry.entry_id][DATA_MEM_STORAGE] = mem_storage
94 conversation.async_set_agent(hass, entry, agent)
100 """Unload a config entry."""
101 hass.data[DOMAIN].pop(entry.entry_id)
104 for entry
in hass.config_entries.async_entries(DOMAIN)
105 if entry.state == ConfigEntryState.LOADED
107 if len(loaded_entries) == 1:
108 for service_name
in hass.services.async_services_for_domain(DOMAIN):
109 hass.services.async_remove(DOMAIN, service_name)
111 conversation.async_unset_agent(hass, entry)
117 """Add the services for Google Assistant SDK."""
119 async
def send_text_command(call: ServiceCall) -> ServiceResponse:
120 """Send a text command to Google Assistant SDK."""
121 commands: list[str] = call.data[SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND]
122 media_players: list[str] |
None = call.data.get(
123 SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER
126 hass, commands, media_players
128 if call.return_response:
131 dataclasses.asdict(command_response)
132 for command_response
in command_response_list
137 hass.services.async_register(
139 SERVICE_SEND_TEXT_COMMAND,
141 schema=SERVICE_SEND_TEXT_COMMAND_SCHEMA,
142 supports_response=SupportsResponse.OPTIONAL,
147 """Google Assistant SDK conversation agent."""
149 def __init__(self, hass: HomeAssistant, entry: ConfigEntry) ->
None:
150 """Initialize the agent."""
153 self.
assistantassistant: TextAssistant |
None =
None
154 self.
sessionsession: OAuth2Session |
None =
None
155 self.
languagelanguage: str |
None =
None
159 """Return a list of supported languages."""
160 return SUPPORTED_LANGUAGE_CODES
163 self, user_input: conversation.ConversationInput
165 """Process a sentence."""
169 session = self.
hasshass.data[DOMAIN][self.
entryentry.entry_id][DATA_SESSION]
171 if not session.valid_token:
172 await session.async_ensure_token_valid()
178 self.
entryentry.options.get(CONF_LANGUAGE_CODE),
182 credentials = Credentials(session.token[CONF_ACCESS_TOKEN])
186 resp = await self.
hasshass.async_add_executor_job(
187 self.
assistantassistant.assist, user_input.text
189 text_response = resp[0]
or "<empty response>"
191 intent_response = intent.IntentResponse(language=language)
192 intent_response.async_set_speech(text_response)
194 response=intent_response, conversation_id=user_input.conversation_id
None __init__(self, HomeAssistant hass, ConfigEntry entry)
conversation.ConversationResult async_process(self, conversation.ConversationInput user_input)
list[str] supported_languages(self)
list[CommandResponse] async_send_text_commands(HomeAssistant hass, list[str] commands, list[str]|None media_players=None)
str best_matching_language_code(HomeAssistant hass, str assist_language, str|None agent_language=None)
None async_setup_service(HomeAssistant hass)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup(HomeAssistant hass, ConfigType config)
AbstractOAuth2Implementation async_get_config_entry_implementation(HomeAssistant hass, config_entries.ConfigEntry config_entry)