From 17fbfe2eeda3301ce34bb8aba20e57f1f73bd938 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 27 Dec 2021 11:39:57 -0800 Subject: [PATCH] Set a suggested_area on nest devices based on the Google Home room name (#62871) --- homeassistant/components/nest/device_info.py | 19 +++++++---- tests/components/nest/test_device_info.py | 36 ++++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/nest/device_info.py b/homeassistant/components/nest/device_info.py index 714e9cb00da..b9aa52aa2c6 100644 --- a/homeassistant/components/nest/device_info.py +++ b/homeassistant/components/nest/device_info.py @@ -35,6 +35,7 @@ class NestDeviceInfo: manufacturer=self.device_brand, model=self.device_model, name=self.device_name, + suggested_area=self.suggested_area, ) @property @@ -44,12 +45,9 @@ class NestDeviceInfo: trait: InfoTrait = self._device.traits[InfoTrait.NAME] if trait.custom_name: return str(trait.custom_name) - # Build a name from the room/structure. Note: This room/structure name - # is not associated with a home assistant Area. - if parent_relations := self._device.parent_relations: - items = sorted(parent_relations.items()) - names = [name for id, name in items] - return " ".join(names) + # Build a name from the room/structure if not set explicitly + if area := self.suggested_area: + return area return self.device_model @property @@ -59,3 +57,12 @@ class NestDeviceInfo: # devices, instead relying on traits, but we can infer a generic model # name based on the type return DEVICE_TYPE_MAP.get(self._device.type) + + @property + def suggested_area(self) -> str | None: + """Return device suggested area based on the Google Home room.""" + if parent_relations := self._device.parent_relations: + items = sorted(parent_relations.items()) + names = [name for id, name in items] + return " ".join(names) + return None diff --git a/tests/components/nest/test_device_info.py b/tests/components/nest/test_device_info.py index a333a31c2d2..a31a155b4ba 100644 --- a/tests/components/nest/test_device_info.py +++ b/tests/components/nest/test_device_info.py @@ -8,6 +8,7 @@ from homeassistant.const import ( ATTR_MANUFACTURER, ATTR_MODEL, ATTR_NAME, + ATTR_SUGGESTED_AREA, ) @@ -35,6 +36,7 @@ def test_device_custom_name(): ATTR_NAME: "My Doorbell", ATTR_MANUFACTURER: "Google Nest", ATTR_MODEL: "Doorbell", + ATTR_SUGGESTED_AREA: None, } @@ -60,6 +62,7 @@ def test_device_name_room(): ATTR_NAME: "Some Room", ATTR_MANUFACTURER: "Google Nest", ATTR_MODEL: "Doorbell", + ATTR_SUGGESTED_AREA: "Some Room", } @@ -79,6 +82,7 @@ def test_device_no_name(): ATTR_NAME: "Doorbell", ATTR_MANUFACTURER: "Google Nest", ATTR_MODEL: "Doorbell", + ATTR_SUGGESTED_AREA: None, } @@ -106,4 +110,36 @@ def test_device_invalid_type(): ATTR_NAME: "My Doorbell", ATTR_MANUFACTURER: "Google Nest", ATTR_MODEL: None, + ATTR_SUGGESTED_AREA: None, + } + + +def test_suggested_area(): + """Test the suggested area with different device name and room name.""" + device = Device.MakeDevice( + { + "name": "some-device-id", + "type": "sdm.devices.types.DOORBELL", + "traits": { + "sdm.devices.traits.Info": { + "customName": "My Doorbell", + }, + }, + "parentRelations": [ + {"parent": "some-structure-id", "displayName": "Some Room"} + ], + }, + auth=None, + ) + + device_info = NestDeviceInfo(device) + assert device_info.device_name == "My Doorbell" + assert device_info.device_model == "Doorbell" + assert device_info.device_brand == "Google Nest" + assert device_info.device_info == { + ATTR_IDENTIFIERS: {("nest", "some-device-id")}, + ATTR_NAME: "My Doorbell", + ATTR_MANUFACTURER: "Google Nest", + ATTR_MODEL: "Doorbell", + ATTR_SUGGESTED_AREA: "Some Room", }