From d417ee27324d569f1197aa6ba61eabc7cf099daf Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 2 Feb 2021 03:39:07 -1000 Subject: [PATCH] Add fan speed percentage support to google assistant (#45835) --- .../components/google_assistant/trait.py | 20 ++++++++++++++----- .../components/google_assistant/test_trait.py | 12 +++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index b5dc2afd3e2..f2a2274d8a8 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -1276,6 +1276,7 @@ class FanSpeedTrait(_Trait): return { "availableFanSpeeds": {"speeds": speeds, "ordered": True}, "reversible": reversible, + "supportsFanSpeedPercent": True, } def query_attributes(self): @@ -1289,9 +1290,11 @@ class FanSpeedTrait(_Trait): response["currentFanSpeedSetting"] = speed if domain == fan.DOMAIN: speed = attrs.get(fan.ATTR_SPEED) + percent = attrs.get(fan.ATTR_PERCENTAGE) or 0 if speed is not None: response["on"] = speed != fan.SPEED_OFF response["currentFanSpeedSetting"] = speed + response["currentFanSpeedPercent"] = percent return response async def execute(self, command, data, params, challenge): @@ -1309,13 +1312,20 @@ class FanSpeedTrait(_Trait): context=data.context, ) if domain == fan.DOMAIN: + service_params = { + ATTR_ENTITY_ID: self.state.entity_id, + } + if "fanSpeedPercent" in params: + service = fan.SERVICE_SET_PERCENTAGE + service_params[fan.ATTR_PERCENTAGE] = params["fanSpeedPercent"] + else: + service = fan.SERVICE_SET_SPEED + service_params[fan.ATTR_SPEED] = params["fanSpeed"] + await self.hass.services.async_call( fan.DOMAIN, - fan.SERVICE_SET_SPEED, - { - ATTR_ENTITY_ID: self.state.entity_id, - fan.ATTR_SPEED: params["fanSpeed"], - }, + service, + service_params, blocking=True, context=data.context, ) diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index 9b573f1cf71..74e8ab21eb0 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -1391,6 +1391,7 @@ async def test_fan_speed(hass): fan.SPEED_HIGH, ], "speed": "low", + "percentage": 33, }, ), BASIC_CONFIG, @@ -1438,11 +1439,13 @@ async def test_fan_speed(hass): ], }, "reversible": False, + "supportsFanSpeedPercent": True, } assert trt.query_attributes() == { "currentFanSpeedSetting": "low", "on": True, + "currentFanSpeedPercent": 33, } assert trt.can_execute(trait.COMMAND_FANSPEED, params={"fanSpeed": "medium"}) @@ -1453,6 +1456,14 @@ async def test_fan_speed(hass): assert len(calls) == 1 assert calls[0].data == {"entity_id": "fan.living_room_fan", "speed": "medium"} + assert trt.can_execute(trait.COMMAND_FANSPEED, params={"fanSpeedPercent": 10}) + + calls = async_mock_service(hass, fan.DOMAIN, fan.SERVICE_SET_PERCENTAGE) + await trt.execute(trait.COMMAND_FANSPEED, BASIC_DATA, {"fanSpeedPercent": 10}, {}) + + assert len(calls) == 1 + assert calls[0].data == {"entity_id": "fan.living_room_fan", "percentage": 10} + async def test_climate_fan_speed(hass): """Test FanSpeed trait speed control support for climate domain.""" @@ -1495,6 +1506,7 @@ async def test_climate_fan_speed(hass): ], }, "reversible": False, + "supportsFanSpeedPercent": True, } assert trt.query_attributes() == {