diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index 653324758e0..55c26b9499d 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -1521,8 +1521,6 @@ class OpenCloseTrait(_Trait): name = TRAIT_OPENCLOSE commands = [COMMAND_OPENCLOSE] - override_position = None - @staticmethod def supported(domain, features, device_class): """Test if state is supported.""" @@ -1548,6 +1546,10 @@ class OpenCloseTrait(_Trait): if self.state.domain == binary_sensor.DOMAIN: response["queryOnlyOpenClose"] = True response["discreteOnlyOpenClose"] = True + + if self.state.attributes.get(ATTR_ASSUMED_STATE): + response["commandOnlyOpenClose"] = True + return response def query_attributes(self): @@ -1555,25 +1557,20 @@ class OpenCloseTrait(_Trait): domain = self.state.domain response = {} - if self.override_position is not None: - response["openPercent"] = self.override_position - - elif domain == cover.DOMAIN: - # When it's an assumed state, we will return that querying state - # is not supported. - if self.state.attributes.get(ATTR_ASSUMED_STATE): - raise SmartHomeError( - ERR_NOT_SUPPORTED, "Querying state is not supported" - ) + # When it's an assumed state, we will return empty state + # This shouldn't happen because we set `commandOnlyOpenClose` + # but Google still queries. Erroring here will cause device + # to show up offline. + if self.state.attributes.get(ATTR_ASSUMED_STATE): + return response + if domain == cover.DOMAIN: if self.state.state == STATE_UNKNOWN: raise SmartHomeError( ERR_NOT_SUPPORTED, "Querying state is not supported" ) - position = self.override_position or self.state.attributes.get( - cover.ATTR_CURRENT_POSITION - ) + position = self.state.attributes.get(cover.ATTR_CURRENT_POSITION) if position is not None: response["openPercent"] = position @@ -1626,12 +1623,6 @@ class OpenCloseTrait(_Trait): cover.DOMAIN, service, svc_params, blocking=True, context=data.context ) - if ( - self.state.attributes.get(ATTR_ASSUMED_STATE) - or self.state.state == STATE_UNKNOWN - ): - self.override_position = params["openPercent"] - @register_trait class VolumeTrait(_Trait): diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index d1f5f9a1293..a579eebea04 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -1886,7 +1886,8 @@ async def test_openclose_cover_unknown_state(hass): assert len(calls) == 1 assert calls[0].data == {ATTR_ENTITY_ID: "cover.bla"} - assert trt.query_attributes() == {"openPercent": 100} + with pytest.raises(helpers.SmartHomeError): + trt.query_attributes() async def test_openclose_cover_assumed_state(hass): @@ -1909,18 +1910,15 @@ async def test_openclose_cover_assumed_state(hass): BASIC_CONFIG, ) - assert trt.sync_attributes() == {} + assert trt.sync_attributes() == {"commandOnlyOpenClose": True} - with pytest.raises(helpers.SmartHomeError): - trt.query_attributes() + assert trt.query_attributes() == {} calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) await trt.execute(trait.COMMAND_OPENCLOSE, BASIC_DATA, {"openPercent": 40}, {}) assert len(calls) == 1 assert calls[0].data == {ATTR_ENTITY_ID: "cover.bla", cover.ATTR_POSITION: 40} - assert trt.query_attributes() == {"openPercent": 40} - async def test_openclose_cover_no_position(hass): """Test OpenClose trait support for cover domain."""