From 7705eb7941c6d25ce9ef273cad7144ba817f3308 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 14 Feb 2020 15:28:11 -0800 Subject: [PATCH] Google Assistant: Remove speaker type and earlier filter out devices from being locally exposed (#31830) * Remove speaker type * Do not expose locks or alarms to Google Local --- .../components/google_assistant/const.py | 3 ++- .../components/google_assistant/helpers.py | 15 ++++++++++++++- .../components/google_assistant/smart_home.py | 4 +--- tests/components/google_assistant/test_helpers.py | 10 ++++++++++ .../google_assistant/test_smart_home.py | 1 - 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/google_assistant/const.py b/homeassistant/components/google_assistant/const.py index add625d2de4..c9f8d857b62 100644 --- a/homeassistant/components/google_assistant/const.py +++ b/homeassistant/components/google_assistant/const.py @@ -133,7 +133,6 @@ DEVICE_CLASS_TO_GOOGLE_TYPES = { (binary_sensor.DOMAIN, binary_sensor.DEVICE_CLASS_OPENING): TYPE_SENSOR, (binary_sensor.DOMAIN, binary_sensor.DEVICE_CLASS_WINDOW): TYPE_SENSOR, (media_player.DOMAIN, media_player.DEVICE_CLASS_TV): TYPE_TV, - (media_player.DOMAIN, media_player.DEVICE_CLASS_SPEAKER): TYPE_SPEAKER, (sensor.DOMAIN, sensor.DEVICE_CLASS_TEMPERATURE): TYPE_SENSOR, (sensor.DOMAIN, sensor.DEVICE_CLASS_HUMIDITY): TYPE_SENSOR, } @@ -146,3 +145,5 @@ STORE_AGENT_USER_IDS = "agent_user_ids" SOURCE_CLOUD = "cloud" SOURCE_LOCAL = "local" + +NOT_EXPOSE_LOCAL = {TYPE_ALARM, TYPE_LOCK} diff --git a/homeassistant/components/google_assistant/helpers.py b/homeassistant/components/google_assistant/helpers.py index f1b7a89bffe..6ba301c01e8 100644 --- a/homeassistant/components/google_assistant/helpers.py +++ b/homeassistant/components/google_assistant/helpers.py @@ -28,6 +28,7 @@ from .const import ( DOMAIN, DOMAIN_TO_GOOGLE_TYPES, ERR_FUNCTION_NOT_SUPPORTED, + NOT_EXPOSE_LOCAL, SOURCE_LOCAL, STORE_AGENT_USER_IDS, ) @@ -351,6 +352,18 @@ class GoogleEntity: """If entity should be exposed.""" return self.config.should_expose(self.state) + @callback + def should_expose_local(self) -> bool: + """Return if the entity should be exposed locally.""" + return ( + self.should_expose() + and get_google_type( + self.state.domain, self.state.attributes.get(ATTR_DEVICE_CLASS) + ) + not in NOT_EXPOSE_LOCAL + and not self.might_2fa() + ) + @callback def is_supported(self) -> bool: """Return if the entity is supported by Google.""" @@ -401,7 +414,7 @@ class GoogleEntity: if aliases: device["name"]["nicknames"] = [name] + aliases - if self.config.is_local_sdk_active: + if self.config.is_local_sdk_active and self.should_expose_local(): device["otherDeviceIds"] = [{"deviceId": self.entity_id}] device["customData"] = { "webhookId": self.config.local_sdk_webhook_id, diff --git a/homeassistant/components/google_assistant/smart_home.py b/homeassistant/components/google_assistant/smart_home.py index bf6c32505aa..97c872bdaf8 100644 --- a/homeassistant/components/google_assistant/smart_home.py +++ b/homeassistant/components/google_assistant/smart_home.py @@ -243,9 +243,7 @@ async def async_devices_reachable(hass, data: RequestData, payload): "devices": [ entity.reachable_device_serialize() for entity in async_get_entities(hass, data.config) - if entity.entity_id in google_ids - and entity.should_expose() - and not entity.might_2fa() + if entity.entity_id in google_ids and entity.should_expose_local() ] } diff --git a/tests/components/google_assistant/test_helpers.py b/tests/components/google_assistant/test_helpers.py index 9c8a868e68d..8d2aaa63c48 100644 --- a/tests/components/google_assistant/test_helpers.py +++ b/tests/components/google_assistant/test_helpers.py @@ -7,6 +7,7 @@ import pytest from homeassistant.components.google_assistant import helpers from homeassistant.components.google_assistant.const import ( # noqa: F401 EVENT_COMMAND_RECEIVED, + NOT_EXPOSE_LOCAL, ) from homeassistant.setup import async_setup_component from homeassistant.util import dt @@ -46,6 +47,15 @@ async def test_google_entity_sync_serialize_with_local_sdk(hass): "webhookId": "mock-webhook-id", } + for device_type in NOT_EXPOSE_LOCAL: + with patch( + "homeassistant.components.google_assistant.helpers.get_google_type", + return_value=device_type, + ): + serialized = await entity.sync_serialize(None) + assert "otherDeviceIds" not in serialized + assert "customData" not in serialized + async def test_config_local_sdk(hass, hass_client): """Test the local SDK.""" diff --git a/tests/components/google_assistant/test_smart_home.py b/tests/components/google_assistant/test_smart_home.py index aa073c699f8..7e98f162f22 100644 --- a/tests/components/google_assistant/test_smart_home.py +++ b/tests/components/google_assistant/test_smart_home.py @@ -682,7 +682,6 @@ async def test_device_class_cover(hass, device_class, google_type): "device_class,google_type", [ ("non_existing_class", "action.devices.types.SWITCH"), - ("speaker", "action.devices.types.SPEAKER"), ("tv", "action.devices.types.TV"), ], )