Handle unavailable input_select in Google Assistant (#38611)

This commit is contained in:
Paulus Schoutsen 2020-08-07 08:17:00 +02:00 committed by GitHub
parent 6d0d5548e5
commit 881b6a831d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 39 deletions

View File

@ -1285,10 +1285,8 @@ class ModesTrait(_Trait):
return features & media_player.SUPPORT_SELECT_SOUND_MODE return features & media_player.SUPPORT_SELECT_SOUND_MODE
def sync_attributes(self): def _generate(self, name, settings):
"""Return mode attributes for a sync request.""" """Generate a list of modes."""
def _generate(name, settings):
mode = { mode = {
"name": name, "name": name,
"name_values": [ "name_values": [
@ -1303,9 +1301,7 @@ class ModesTrait(_Trait):
"setting_name": setting, "setting_name": setting,
"setting_values": [ "setting_values": [
{ {
"setting_synonym": self.SYNONYMS.get( "setting_synonym": self.SYNONYMS.get(setting, [setting]),
setting, [setting]
),
"lang": "en", "lang": "en",
} }
], ],
@ -1313,18 +1309,25 @@ class ModesTrait(_Trait):
) )
return mode return mode
attrs = self.state.attributes def sync_attributes(self):
"""Return mode attributes for a sync request."""
modes = [] modes = []
if self.state.domain == media_player.DOMAIN:
if media_player.ATTR_SOUND_MODE_LIST in attrs: for domain, attr, name in (
modes.append( (media_player.DOMAIN, media_player.ATTR_SOUND_MODE_LIST, "sound mode"),
_generate("sound mode", attrs[media_player.ATTR_SOUND_MODE_LIST]) (input_select.DOMAIN, input_select.ATTR_OPTIONS, "option"),
) (humidifier.DOMAIN, humidifier.ATTR_AVAILABLE_MODES, "mode"),
elif self.state.domain == input_select.DOMAIN: ):
modes.append(_generate("option", attrs[input_select.ATTR_OPTIONS])) if self.state.domain != domain:
elif self.state.domain == humidifier.DOMAIN: continue
if humidifier.ATTR_AVAILABLE_MODES in attrs:
modes.append(_generate("mode", attrs[humidifier.ATTR_AVAILABLE_MODES])) items = self.state.attributes.get(attr)
if items is not None:
modes.append(self._generate(name, items))
# Shortcut since all domains are currently unique
break
payload = {"availableModes": modes} payload = {"availableModes": modes}

View File

@ -337,8 +337,6 @@ async def test_execute(hass):
const.SOURCE_CLOUD, const.SOURCE_CLOUD,
) )
print(result)
assert result == { assert result == {
"requestId": REQ_ID, "requestId": REQ_ID,
"payload": { "payload": {

View File

@ -1515,6 +1515,11 @@ async def test_modes_input_select(hass):
assert helpers.get_google_type(input_select.DOMAIN, None) is not None assert helpers.get_google_type(input_select.DOMAIN, None) is not None
assert trait.ModesTrait.supported(input_select.DOMAIN, None, None) assert trait.ModesTrait.supported(input_select.DOMAIN, None, None)
trt = trait.ModesTrait(
hass, State("input_select.bla", "unavailable"), BASIC_CONFIG,
)
assert trt.sync_attributes() == {"availableModes": []}
trt = trait.ModesTrait( trt = trait.ModesTrait(
hass, hass,
State( State(