From 74d7293ab8f481c61905e24a2f61586d370aaa76 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Mon, 12 Apr 2021 01:53:07 +0200 Subject: [PATCH] mqtt fan percentage to speed_range and received speed_state fix (#49060) * percentage to speed_range and get speed state fix * Update homeassistant/components/mqtt/fan.py * Update homeassistant/components/mqtt/fan.py * Update homeassistant/components/mqtt/fan.py * Update homeassistant/components/mqtt/fan.py Co-authored-by: J. Nick Koston --- homeassistant/components/mqtt/fan.py | 16 ++++++++-------- tests/components/mqtt/test_fan.py | 20 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/mqtt/fan.py b/homeassistant/components/mqtt/fan.py index 6009b941c5c..24c4c805dfd 100644 --- a/homeassistant/components/mqtt/fan.py +++ b/homeassistant/components/mqtt/fan.py @@ -1,6 +1,7 @@ """Support for MQTT fans.""" import functools import logging +import math import voluptuous as vol @@ -441,13 +442,12 @@ class MqttFan(MqttEntity, FanEntity): ) return - if not self._feature_percentage: - if speed in self._legacy_speeds_list_no_off: - self._percentage = ordered_list_item_to_percentage( - self._legacy_speeds_list_no_off, speed - ) - elif speed == SPEED_OFF: - self._percentage = 0 + if speed in self._legacy_speeds_list_no_off: + self._percentage = ordered_list_item_to_percentage( + self._legacy_speeds_list_no_off, speed + ) + elif speed == SPEED_OFF: + self._percentage = 0 self.async_write_ha_state() @@ -592,7 +592,7 @@ class MqttFan(MqttEntity, FanEntity): This method is a coroutine. """ - percentage_payload = int( + percentage_payload = math.ceil( percentage_to_ranged_value(self._speed_range, percentage) ) mqtt_payload = self._command_templates[ATTR_PERCENTAGE](percentage_payload) diff --git a/tests/components/mqtt/test_fan.py b/tests/components/mqtt/test_fan.py index 5caec9b7473..bfa1f387bcd 100644 --- a/tests/components/mqtt/test_fan.py +++ b/tests/components/mqtt/test_fan.py @@ -618,7 +618,7 @@ async def test_sending_mqtt_commands_with_alternate_speed_range(hass, mqtt_mock) "percentage_state_topic": "percentage-state-topic1", "percentage_command_topic": "percentage-command-topic1", "speed_range_min": 1, - "speed_range_max": 100, + "speed_range_max": 3, }, { "platform": "mqtt", @@ -651,9 +651,25 @@ async def test_sending_mqtt_commands_with_alternate_speed_range(hass, mqtt_mock) state = hass.states.get("fan.test1") assert state.attributes.get(ATTR_ASSUMED_STATE) + await common.async_set_percentage(hass, "fan.test1", 33) + mqtt_mock.async_publish.assert_called_once_with( + "percentage-command-topic1", "1", 0, False + ) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test1") + assert state.attributes.get(ATTR_ASSUMED_STATE) + + await common.async_set_percentage(hass, "fan.test1", 66) + mqtt_mock.async_publish.assert_called_once_with( + "percentage-command-topic1", "2", 0, False + ) + mqtt_mock.async_publish.reset_mock() + state = hass.states.get("fan.test1") + assert state.attributes.get(ATTR_ASSUMED_STATE) + await common.async_set_percentage(hass, "fan.test1", 100) mqtt_mock.async_publish.assert_called_once_with( - "percentage-command-topic1", "100", 0, False + "percentage-command-topic1", "3", 0, False ) mqtt_mock.async_publish.reset_mock() state = hass.states.get("fan.test1")