1 """Support for Actions on Google Assistant Smart Home Control."""
3 from __future__
import annotations
7 import voluptuous
as vol
20 CONF_EXPOSE_BY_DEFAULT,
26 CONF_SECURE_DEVICES_PIN,
29 DEFAULT_EXPOSE_BY_DEFAULT,
30 DEFAULT_EXPOSED_DOMAINS,
36 from .http
import GoogleAssistantView, GoogleConfig
38 from .const
import EVENT_COMMAND_RECEIVED, EVENT_SYNC_RECEIVED
40 _LOGGER = logging.getLogger(__name__)
42 CONF_ALLOW_UNLOCK =
"allow_unlock"
44 PLATFORMS = [Platform.BUTTON]
46 ENTITY_SCHEMA = vol.Schema(
48 vol.Optional(CONF_NAME): cv.string,
49 vol.Optional(CONF_EXPOSE, default=
True): cv.boolean,
50 vol.Optional(CONF_ALIASES): vol.All(cv.ensure_list, [cv.string]),
51 vol.Optional(CONF_ROOM_HINT): cv.string,
55 GOOGLE_SERVICE_ACCOUNT = vol.Schema(
57 vol.Required(CONF_PRIVATE_KEY): cv.string,
58 vol.Required(CONF_CLIENT_EMAIL): cv.string,
60 extra=vol.ALLOW_EXTRA,
65 if data[CONF_REPORT_STATE]
and CONF_SERVICE_ACCOUNT
not in data:
66 raise vol.Invalid(
"If report state is enabled, a service account must exist")
70 GOOGLE_ASSISTANT_SCHEMA = vol.All(
73 vol.Required(CONF_PROJECT_ID): cv.string,
75 CONF_EXPOSE_BY_DEFAULT, default=DEFAULT_EXPOSE_BY_DEFAULT
78 CONF_EXPOSED_DOMAINS, default=DEFAULT_EXPOSED_DOMAINS
80 vol.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ENTITY_SCHEMA},
82 vol.Optional(CONF_SECURE_DEVICES_PIN): str,
83 vol.Optional(CONF_REPORT_STATE, default=
False): cv.boolean,
84 vol.Optional(CONF_SERVICE_ACCOUNT): GOOGLE_SERVICE_ACCOUNT,
86 vol.Remove(CONF_ALLOW_UNLOCK): cv.boolean,
87 vol.Remove(CONF_API_KEY): cv.string,
89 extra=vol.PREVENT_EXTRA,
94 CONFIG_SCHEMA = vol.Schema(
95 {vol.Optional(DOMAIN): GOOGLE_ASSISTANT_SCHEMA}, extra=vol.ALLOW_EXTRA
99 async
def async_setup(hass: HomeAssistant, yaml_config: ConfigType) -> bool:
100 """Activate Google Actions component."""
101 if DOMAIN
not in yaml_config:
104 hass.data[DOMAIN] = {}
105 hass.data[DOMAIN][DATA_CONFIG] = yaml_config[DOMAIN]
107 hass.async_create_task(
108 hass.config_entries.flow.async_init(
110 context={
"source": SOURCE_IMPORT},
111 data={CONF_PROJECT_ID: yaml_config[DOMAIN][CONF_PROJECT_ID]},
119 """Set up from a config entry."""
121 config: ConfigType = {**hass.data[DOMAIN][DATA_CONFIG]}
123 if entry.source == SOURCE_IMPORT:
125 if config[CONF_PROJECT_ID] != entry.data[CONF_PROJECT_ID]:
126 hass.async_create_task(hass.config_entries.async_remove(entry.entry_id))
129 config.update(entry.data)
131 device_registry = dr.async_get(hass)
132 device_registry.async_get_or_create(
133 config_entry_id=entry.entry_id,
134 identifiers={(DOMAIN, config[CONF_PROJECT_ID])},
135 manufacturer=
"Google",
136 model=
"Google Assistant",
137 name=config[CONF_PROJECT_ID],
138 entry_type=dr.DeviceEntryType.SERVICE,
142 await google_config.async_initialize()
144 hass.data[DOMAIN][entry.entry_id] = google_config
148 if google_config.should_report_state:
149 google_config.async_enable_report_state()
151 async
def request_sync_service_handler(call: ServiceCall) ->
None:
152 """Handle request sync service calls."""
153 agent_user_id = call.data.get(
"agent_user_id")
or call.context.user_id
155 if agent_user_id
is None:
157 "No agent_user_id supplied for request_sync. Call as a user or pass in"
158 " user id as agent_user_id"
162 await google_config.async_sync_entities(agent_user_id)
165 if CONF_SERVICE_ACCOUNT
in config:
166 hass.services.async_register(
167 DOMAIN, SERVICE_REQUEST_SYNC, request_sync_service_handler
170 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
def _check_report_state(data)
bool async_setup(HomeAssistant hass, ConfigType yaml_config)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)