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 {
"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,
)

View File

@ -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() == {