Add fan speed percentage support to google assistant (#45835)

This commit is contained in:
J. Nick Koston 2021-02-02 03:39:07 -10:00 committed by GitHub
parent a96a80e78d
commit d417ee2732
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 5 deletions

View File

@ -1276,6 +1276,7 @@ class FanSpeedTrait(_Trait):
return { return {
"availableFanSpeeds": {"speeds": speeds, "ordered": True}, "availableFanSpeeds": {"speeds": speeds, "ordered": True},
"reversible": reversible, "reversible": reversible,
"supportsFanSpeedPercent": True,
} }
def query_attributes(self): def query_attributes(self):
@ -1289,9 +1290,11 @@ class FanSpeedTrait(_Trait):
response["currentFanSpeedSetting"] = speed response["currentFanSpeedSetting"] = speed
if domain == fan.DOMAIN: if domain == fan.DOMAIN:
speed = attrs.get(fan.ATTR_SPEED) speed = attrs.get(fan.ATTR_SPEED)
percent = attrs.get(fan.ATTR_PERCENTAGE) or 0
if speed is not None: if speed is not None:
response["on"] = speed != fan.SPEED_OFF response["on"] = speed != fan.SPEED_OFF
response["currentFanSpeedSetting"] = speed response["currentFanSpeedSetting"] = speed
response["currentFanSpeedPercent"] = percent
return response return response
async def execute(self, command, data, params, challenge): async def execute(self, command, data, params, challenge):
@ -1309,13 +1312,20 @@ class FanSpeedTrait(_Trait):
context=data.context, context=data.context,
) )
if domain == fan.DOMAIN: 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( await self.hass.services.async_call(
fan.DOMAIN, fan.DOMAIN,
fan.SERVICE_SET_SPEED, service,
{ service_params,
ATTR_ENTITY_ID: self.state.entity_id,
fan.ATTR_SPEED: params["fanSpeed"],
},
blocking=True, blocking=True,
context=data.context, context=data.context,
) )

View File

@ -1391,6 +1391,7 @@ async def test_fan_speed(hass):
fan.SPEED_HIGH, fan.SPEED_HIGH,
], ],
"speed": "low", "speed": "low",
"percentage": 33,
}, },
), ),
BASIC_CONFIG, BASIC_CONFIG,
@ -1438,11 +1439,13 @@ async def test_fan_speed(hass):
], ],
}, },
"reversible": False, "reversible": False,
"supportsFanSpeedPercent": True,
} }
assert trt.query_attributes() == { assert trt.query_attributes() == {
"currentFanSpeedSetting": "low", "currentFanSpeedSetting": "low",
"on": True, "on": True,
"currentFanSpeedPercent": 33,
} }
assert trt.can_execute(trait.COMMAND_FANSPEED, params={"fanSpeed": "medium"}) 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 len(calls) == 1
assert calls[0].data == {"entity_id": "fan.living_room_fan", "speed": "medium"} 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): async def test_climate_fan_speed(hass):
"""Test FanSpeed trait speed control support for climate domain.""" """Test FanSpeed trait speed control support for climate domain."""
@ -1495,6 +1506,7 @@ async def test_climate_fan_speed(hass):
], ],
}, },
"reversible": False, "reversible": False,
"supportsFanSpeedPercent": True,
} }
assert trt.query_attributes() == { assert trt.query_attributes() == {