diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index f554f3375f2..a79dfdd3dca 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -29,10 +29,15 @@ from homeassistant.const import ( ATTR_SUPPORTED_FEATURES, ATTR_TEMPERATURE, ATTR_ASSUMED_STATE, + STATE_UNKNOWN, ) from homeassistant.core import DOMAIN as HA_DOMAIN from homeassistant.util import color as color_util, temperature as temp_util -from .const import ERR_VALUE_OUT_OF_RANGE +from .const import ( + ERR_VALUE_OUT_OF_RANGE, + ERR_NOT_SUPPORTED, + ERR_FUNCTION_NOT_SUPPORTED, +) from .helpers import SmartHomeError _LOGGER = logging.getLogger(__name__) @@ -1064,18 +1069,25 @@ class OpenCloseTrait(_Trait): # Google will not issue an open command if the assumed state is # open, even if that is currently incorrect. if self.state.attributes.get(ATTR_ASSUMED_STATE): - response['openPercent'] = 50 - else: - position = self.state.attributes.get( - cover.ATTR_CURRENT_POSITION - ) + raise SmartHomeError( + ERR_NOT_SUPPORTED, + 'Querying state is not supported') - if position is not None: - response['openPercent'] = position - elif self.state.state != cover.STATE_CLOSED: - response['openPercent'] = 100 - else: - response['openPercent'] = 0 + if self.state.state == STATE_UNKNOWN: + raise SmartHomeError( + ERR_NOT_SUPPORTED, + 'Querying state is not supported') + + position = self.state.attributes.get( + cover.ATTR_CURRENT_POSITION + ) + + if position is not None: + response['openPercent'] = position + elif self.state.state != cover.STATE_CLOSED: + response['openPercent'] = 100 + else: + response['openPercent'] = 0 elif domain == binary_sensor.DOMAIN: if self.state.state == STATE_ON: @@ -1091,22 +1103,23 @@ class OpenCloseTrait(_Trait): if domain == cover.DOMAIN: position = self.state.attributes.get(cover.ATTR_CURRENT_POSITION) - if position is not None: + if params['openPercent'] == 0: + await self.hass.services.async_call( + cover.DOMAIN, cover.SERVICE_CLOSE_COVER, { + ATTR_ENTITY_ID: self.state.entity_id + }, blocking=True, context=data.context) + elif params['openPercent'] == 100: + await self.hass.services.async_call( + cover.DOMAIN, cover.SERVICE_OPEN_COVER, { + ATTR_ENTITY_ID: self.state.entity_id + }, blocking=True, context=data.context) + elif position is not None: await self.hass.services.async_call( cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION, { ATTR_ENTITY_ID: self.state.entity_id, cover.ATTR_POSITION: params['openPercent'] }, blocking=True, context=data.context) else: - if self.state.state != cover.STATE_CLOSED: - if params['openPercent'] < 100: - await self.hass.services.async_call( - cover.DOMAIN, cover.SERVICE_CLOSE_COVER, { - ATTR_ENTITY_ID: self.state.entity_id - }, blocking=True, context=data.context) - else: - if params['openPercent'] > 0: - await self.hass.services.async_call( - cover.DOMAIN, cover.SERVICE_OPEN_COVER, { - ATTR_ENTITY_ID: self.state.entity_id - }, blocking=True, context=data.context) + raise SmartHomeError( + ERR_FUNCTION_NOT_SUPPORTED, + 'Setting a position is not supported') diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index 9887c1da2cc..07db4c47296 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -23,7 +23,7 @@ from homeassistant.components.google_assistant import trait, helpers, const from homeassistant.const import ( STATE_ON, STATE_OFF, ATTR_ENTITY_ID, SERVICE_TURN_ON, SERVICE_TURN_OFF, TEMP_CELSIUS, TEMP_FAHRENHEIT, ATTR_SUPPORTED_FEATURES, ATTR_TEMPERATURE, - ATTR_DEVICE_CLASS, ATTR_ASSUMED_STATE) + ATTR_DEVICE_CLASS, ATTR_ASSUMED_STATE, STATE_UNKNOWN) from homeassistant.core import State, DOMAIN as HA_DOMAIN, EVENT_CALL_SERVICE from homeassistant.util import color from tests.common import async_mock_service, mock_coro @@ -1088,15 +1088,24 @@ async def test_openclose_cover(hass): 'openPercent': 100 } + # No state + trt = trait.OpenCloseTrait(hass, State('cover.bla', STATE_UNKNOWN, { + }), BASIC_CONFIG) + + assert trt.sync_attributes() == {} + + with pytest.raises(helpers.SmartHomeError): + trt.query_attributes() + # Assumed state trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, { ATTR_ASSUMED_STATE: True, }), BASIC_CONFIG) assert trt.sync_attributes() == {} - assert trt.query_attributes() == { - 'openPercent': 50 - } + + with pytest.raises(helpers.SmartHomeError): + trt.query_attributes() trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, { cover.ATTR_CURRENT_POSITION: 75