Allow Google Assistant relative volume control (#26585)

* Allow Google Assistant volume control without volume_level

* Add test for relative volume control w/o volume_level
This commit is contained in:
Ryan Ewen 2019-10-10 10:53:52 -04:00 committed by Teemu R
parent c188ecf79b
commit 95c537bee8
2 changed files with 55 additions and 11 deletions

View file

@ -1427,18 +1427,33 @@ class VolumeTrait(_Trait):
async def _execute_volume_relative(self, data, params):
# This could also support up/down commands using relativeSteps
relative = params["volumeRelativeLevel"]
current = self.state.attributes.get(media_player.ATTR_MEDIA_VOLUME_LEVEL)
await self.hass.services.async_call(
media_player.DOMAIN,
media_player.SERVICE_VOLUME_SET,
{
ATTR_ENTITY_ID: self.state.entity_id,
media_player.ATTR_MEDIA_VOLUME_LEVEL: current + relative / 100,
},
blocking=True,
context=data.context,
)
# if we have access to current volume level, do a single 'set' call
if media_player.ATTR_MEDIA_VOLUME_LEVEL in self.state.attributes:
current = self.state.attributes.get(media_player.ATTR_MEDIA_VOLUME_LEVEL)
await self.hass.services.async_call(
media_player.DOMAIN,
media_player.SERVICE_VOLUME_SET,
{
ATTR_ENTITY_ID: self.state.entity_id,
media_player.ATTR_MEDIA_VOLUME_LEVEL: current + relative / 100,
},
blocking=True,
context=data.context,
)
# otherwise do multiple 'up' or 'down' calls
else:
for _ in range(abs(relative)):
await self.hass.services.async_call(
media_player.DOMAIN,
media_player.SERVICE_VOLUME_UP
if relative > 0
else media_player.SERVICE_VOLUME_DOWN,
{ATTR_ENTITY_ID: self.state.entity_id},
blocking=True,
context=data.context,
)
async def execute(self, command, data, params, challenge):
"""Execute a brightness command."""

View file

@ -1599,6 +1599,35 @@ async def test_volume_media_player_relative(hass):
}
async def test_volume_media_player_relative_no_vol_lvl(hass):
"""Test volume trait support for media player domain."""
trt = trait.VolumeTrait(
hass, State("media_player.bla", media_player.STATE_PLAYING, {}), BASIC_CONFIG
)
assert trt.sync_attributes() == {}
assert trt.query_attributes() == {}
up_calls = async_mock_service(
hass, media_player.DOMAIN, media_player.SERVICE_VOLUME_UP
)
await trt.execute(
trait.COMMAND_VOLUME_RELATIVE, BASIC_DATA, {"volumeRelativeLevel": 2}, {}
)
assert len(up_calls) == 2
down_calls = async_mock_service(
hass, media_player.DOMAIN, media_player.SERVICE_VOLUME_DOWN
)
await trt.execute(
trait.COMMAND_VOLUME_RELATIVE, BASIC_DATA, {"volumeRelativeLevel": -2}, {}
)
assert len(down_calls) == 2
async def test_temperature_setting_sensor(hass):
"""Test TemperatureSetting trait support for temperature sensor."""
assert (