Fix for stateless covers (#22962)
* Corrections and test * Raise error if does not support setting position * Raising error for stateless and assumed state covers * Fix pylint * Tests * Update test_trait.py
This commit is contained in:
parent
d722f4d64a
commit
b804919eaa
2 changed files with 51 additions and 29 deletions
|
@ -29,10 +29,15 @@ from homeassistant.const import (
|
||||||
ATTR_SUPPORTED_FEATURES,
|
ATTR_SUPPORTED_FEATURES,
|
||||||
ATTR_TEMPERATURE,
|
ATTR_TEMPERATURE,
|
||||||
ATTR_ASSUMED_STATE,
|
ATTR_ASSUMED_STATE,
|
||||||
|
STATE_UNKNOWN,
|
||||||
)
|
)
|
||||||
from homeassistant.core import DOMAIN as HA_DOMAIN
|
from homeassistant.core import DOMAIN as HA_DOMAIN
|
||||||
from homeassistant.util import color as color_util, temperature as temp_util
|
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
|
from .helpers import SmartHomeError
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -1064,8 +1069,15 @@ class OpenCloseTrait(_Trait):
|
||||||
# Google will not issue an open command if the assumed state is
|
# Google will not issue an open command if the assumed state is
|
||||||
# open, even if that is currently incorrect.
|
# open, even if that is currently incorrect.
|
||||||
if self.state.attributes.get(ATTR_ASSUMED_STATE):
|
if self.state.attributes.get(ATTR_ASSUMED_STATE):
|
||||||
response['openPercent'] = 50
|
raise SmartHomeError(
|
||||||
else:
|
ERR_NOT_SUPPORTED,
|
||||||
|
'Querying state is not supported')
|
||||||
|
|
||||||
|
if self.state.state == STATE_UNKNOWN:
|
||||||
|
raise SmartHomeError(
|
||||||
|
ERR_NOT_SUPPORTED,
|
||||||
|
'Querying state is not supported')
|
||||||
|
|
||||||
position = self.state.attributes.get(
|
position = self.state.attributes.get(
|
||||||
cover.ATTR_CURRENT_POSITION
|
cover.ATTR_CURRENT_POSITION
|
||||||
)
|
)
|
||||||
|
@ -1091,22 +1103,23 @@ class OpenCloseTrait(_Trait):
|
||||||
|
|
||||||
if domain == cover.DOMAIN:
|
if domain == cover.DOMAIN:
|
||||||
position = self.state.attributes.get(cover.ATTR_CURRENT_POSITION)
|
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(
|
await self.hass.services.async_call(
|
||||||
cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION, {
|
cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION, {
|
||||||
ATTR_ENTITY_ID: self.state.entity_id,
|
ATTR_ENTITY_ID: self.state.entity_id,
|
||||||
cover.ATTR_POSITION: params['openPercent']
|
cover.ATTR_POSITION: params['openPercent']
|
||||||
}, blocking=True, context=data.context)
|
}, blocking=True, context=data.context)
|
||||||
else:
|
else:
|
||||||
if self.state.state != cover.STATE_CLOSED:
|
raise SmartHomeError(
|
||||||
if params['openPercent'] < 100:
|
ERR_FUNCTION_NOT_SUPPORTED,
|
||||||
await self.hass.services.async_call(
|
'Setting a position is not supported')
|
||||||
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)
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ from homeassistant.components.google_assistant import trait, helpers, const
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
STATE_ON, STATE_OFF, ATTR_ENTITY_ID, SERVICE_TURN_ON, SERVICE_TURN_OFF,
|
STATE_ON, STATE_OFF, ATTR_ENTITY_ID, SERVICE_TURN_ON, SERVICE_TURN_OFF,
|
||||||
TEMP_CELSIUS, TEMP_FAHRENHEIT, ATTR_SUPPORTED_FEATURES, ATTR_TEMPERATURE,
|
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.core import State, DOMAIN as HA_DOMAIN, EVENT_CALL_SERVICE
|
||||||
from homeassistant.util import color
|
from homeassistant.util import color
|
||||||
from tests.common import async_mock_service, mock_coro
|
from tests.common import async_mock_service, mock_coro
|
||||||
|
@ -1088,15 +1088,24 @@ async def test_openclose_cover(hass):
|
||||||
'openPercent': 100
|
'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
|
# Assumed state
|
||||||
trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, {
|
trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, {
|
||||||
ATTR_ASSUMED_STATE: True,
|
ATTR_ASSUMED_STATE: True,
|
||||||
}), BASIC_CONFIG)
|
}), BASIC_CONFIG)
|
||||||
|
|
||||||
assert trt.sync_attributes() == {}
|
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, {
|
trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, {
|
||||||
cover.ATTR_CURRENT_POSITION: 75
|
cover.ATTR_CURRENT_POSITION: 75
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue