MQTT cover Bugfixes (#46479)

* MQTT cover Bugfixes

* Remove period
pull/46583/head
Shay Levy 2021-02-15 18:33:42 +02:00 committed by GitHub
parent 9917bb76fb
commit a5d943b5f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 66 deletions

View File

@ -129,14 +129,14 @@ def validate_options(value):
):
_LOGGER.warning(
"using 'value_template' for 'position_topic' is deprecated "
"and will be removed from Home Assistant in version 2021.6"
"and will be removed from Home Assistant in version 2021.6, "
"please replace it with 'position_template'"
)
if CONF_TILT_INVERT_STATE in value:
_LOGGER.warning(
"'tilt_invert_state' is deprecated "
"and will be removed from Home Assistant in version 2021.6"
"and will be removed from Home Assistant in version 2021.6, "
"please invert tilt using 'tilt_min' & 'tilt_max'"
)
@ -172,9 +172,7 @@ PLATFORM_SCHEMA = vol.All(
CONF_TILT_CLOSED_POSITION, default=DEFAULT_TILT_CLOSED_POSITION
): int,
vol.Optional(CONF_TILT_COMMAND_TOPIC): mqtt.valid_publish_topic,
vol.Optional(
CONF_TILT_INVERT_STATE, default=DEFAULT_TILT_INVERT_STATE
): cv.boolean,
vol.Optional(CONF_TILT_INVERT_STATE): cv.boolean,
vol.Optional(CONF_TILT_MAX, default=DEFAULT_TILT_MAX): int,
vol.Optional(CONF_TILT_MIN, default=DEFAULT_TILT_MIN): int,
vol.Optional(
@ -247,15 +245,22 @@ class MqttCover(MqttEntity, CoverEntity):
)
self._tilt_optimistic = config[CONF_TILT_STATE_OPTIMISTIC]
template = self._config.get(CONF_VALUE_TEMPLATE)
if template is not None:
template.hass = self.hass
value_template = self._config.get(CONF_VALUE_TEMPLATE)
if value_template is not None:
value_template.hass = self.hass
set_position_template = self._config.get(CONF_SET_POSITION_TEMPLATE)
if set_position_template is not None:
set_position_template.hass = self.hass
get_position_template = self._config.get(CONF_GET_POSITION_TEMPLATE)
if get_position_template is not None:
get_position_template.hass = self.hass
set_tilt_template = self._config.get(CONF_TILT_COMMAND_TEMPLATE)
if set_tilt_template is not None:
set_tilt_template.hass = self.hass
tilt_status_template = self._config.get(CONF_TILT_STATUS_TEMPLATE)
if tilt_status_template is not None:
tilt_status_template.hass = self.hass
@ -290,24 +295,21 @@ class MqttCover(MqttEntity, CoverEntity):
def state_message_received(msg):
"""Handle new MQTT state messages."""
payload = msg.payload
template = self._config.get(CONF_VALUE_TEMPLATE)
if template is not None:
payload = template.async_render_with_possible_json_value(payload)
value_template = self._config.get(CONF_VALUE_TEMPLATE)
if value_template is not None:
payload = value_template.async_render_with_possible_json_value(payload)
if payload == self._config[CONF_STATE_STOPPED]:
if (
self._optimistic
or self._config.get(CONF_GET_POSITION_TOPIC) is None
):
self._state = (
STATE_CLOSED if self._state == STATE_CLOSING else STATE_OPEN
)
else:
if self._config.get(CONF_GET_POSITION_TOPIC) is not None:
self._state = (
STATE_CLOSED
if self._position == DEFAULT_POSITION_CLOSED
else STATE_OPEN
)
else:
self._state = (
STATE_CLOSED if self._state == STATE_CLOSING else STATE_OPEN
)
elif payload == self._config[CONF_STATE_OPENING]:
self._state = STATE_OPENING
elif payload == self._config[CONF_STATE_CLOSING]:
@ -616,7 +618,7 @@ class MqttCover(MqttEntity, CoverEntity):
max_percent = 100
min_percent = 0
position_percentage = min(max(position_percentage, min_percent), max_percent)
if range_type == TILT_PAYLOAD and self._config[CONF_TILT_INVERT_STATE]:
if range_type == TILT_PAYLOAD and self._config.get(CONF_TILT_INVERT_STATE):
return 100 - position_percentage
return position_percentage
@ -640,6 +642,6 @@ class MqttCover(MqttEntity, CoverEntity):
position = round(current_range * (percentage / 100.0))
position += offset
if range_type == TILT_PAYLOAD and self._config[CONF_TILT_INVERT_STATE]:
if range_type == TILT_PAYLOAD and self._config.get(CONF_TILT_INVERT_STATE):
position = max_range - position + offset
return position

View File

@ -2032,10 +2032,10 @@ async def test_entity_debug_info_message(hass, mqtt_mock):
)
async def test_deprecated_value_template_for_position_topic_warnning(
async def test_deprecated_value_template_for_position_topic_warning(
hass, caplog, mqtt_mock
):
"""Test warnning when value_template is used for position_topic."""
"""Test warning when value_template is used for position_topic."""
assert await async_setup_component(
hass,
cover.DOMAIN,
@ -2054,13 +2054,13 @@ async def test_deprecated_value_template_for_position_topic_warnning(
assert (
"using 'value_template' for 'position_topic' is deprecated "
"and will be removed from Home Assistant in version 2021.6"
"and will be removed from Home Assistant in version 2021.6, "
"please replace it with 'position_template'"
) in caplog.text
async def test_deprecated_tilt_invert_state_warnning(hass, caplog, mqtt_mock):
"""Test warnning when tilt_invert_state is used."""
async def test_deprecated_tilt_invert_state_warning(hass, caplog, mqtt_mock):
"""Test warning when tilt_invert_state is used."""
assert await async_setup_component(
hass,
cover.DOMAIN,
@ -2077,11 +2077,33 @@ async def test_deprecated_tilt_invert_state_warnning(hass, caplog, mqtt_mock):
assert (
"'tilt_invert_state' is deprecated "
"and will be removed from Home Assistant in version 2021.6"
"and will be removed from Home Assistant in version 2021.6, "
"please invert tilt using 'tilt_min' & 'tilt_max'"
) in caplog.text
async def test_no_deprecated_tilt_invert_state_warning(hass, caplog, mqtt_mock):
"""Test warning when tilt_invert_state is used."""
assert await async_setup_component(
hass,
cover.DOMAIN,
{
cover.DOMAIN: {
"platform": "mqtt",
"name": "test",
"command_topic": "command-topic",
}
},
)
await hass.async_block_till_done()
assert (
"'tilt_invert_state' is deprecated "
"and will be removed from Home Assistant in version 2021.6, "
"please invert tilt using 'tilt_min' & 'tilt_max'"
) not in caplog.text
async def test_no_deprecated_warning_for_position_topic_using_position_template(
hass, caplog, mqtt_mock
):
@ -2104,7 +2126,7 @@ async def test_no_deprecated_warning_for_position_topic_using_position_template(
assert (
"using 'value_template' for 'position_topic' is deprecated "
"and will be removed from Home Assistant in version 2021.6"
"and will be removed from Home Assistant in version 2021.6, "
"please replace it with 'position_template'"
) not in caplog.text
@ -2221,8 +2243,8 @@ async def test_set_state_via_position_using_stopped_state(hass, mqtt_mock):
assert state.state == STATE_OPEN
async def test_set_state_via_stopped_state_optimistic(hass, mqtt_mock):
"""Test the controlling state via stopped state in optimistic mode."""
async def test_position_via_position_topic_template(hass, mqtt_mock):
"""Test position by updating status via position template."""
assert await async_setup_component(
hass,
cover.DOMAIN,
@ -2231,51 +2253,28 @@ async def test_set_state_via_stopped_state_optimistic(hass, mqtt_mock):
"platform": "mqtt",
"name": "test",
"state_topic": "state-topic",
"position_topic": "get-position-topic",
"position_open": 100,
"position_closed": 0,
"state_open": "OPEN",
"state_closed": "CLOSE",
"state_stopped": "STOPPED",
"state_opening": "OPENING",
"state_closing": "CLOSING",
"command_topic": "command-topic",
"qos": 0,
"optimistic": True,
"set_position_topic": "set-position-topic",
"position_topic": "get-position-topic",
"position_template": "{{ (value | multiply(0.01)) | int }}",
}
},
)
await hass.async_block_till_done()
async_fire_mqtt_message(hass, "state-topic", "OPEN")
async_fire_mqtt_message(hass, "get-position-topic", "99")
state = hass.states.get("cover.test")
assert state.state == STATE_OPEN
current_cover_position_position = hass.states.get("cover.test").attributes[
ATTR_CURRENT_POSITION
]
assert current_cover_position_position == 0
async_fire_mqtt_message(hass, "get-position-topic", "50")
async_fire_mqtt_message(hass, "get-position-topic", "5000")
state = hass.states.get("cover.test")
assert state.state == STATE_OPEN
async_fire_mqtt_message(hass, "state-topic", "OPENING")
state = hass.states.get("cover.test")
assert state.state == STATE_OPENING
async_fire_mqtt_message(hass, "state-topic", "STOPPED")
state = hass.states.get("cover.test")
assert state.state == STATE_OPEN
async_fire_mqtt_message(hass, "state-topic", "CLOSING")
state = hass.states.get("cover.test")
assert state.state == STATE_CLOSING
async_fire_mqtt_message(hass, "state-topic", "STOPPED")
state = hass.states.get("cover.test")
assert state.state == STATE_CLOSED
current_cover_position_position = hass.states.get("cover.test").attributes[
ATTR_CURRENT_POSITION
]
assert current_cover_position_position == 50
async def test_set_state_via_stopped_state_no_position_topic(hass, mqtt_mock):