From e0f79875449e58a749dd46e00c38af2fae050a19 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 29 Jun 2021 11:18:50 +0200 Subject: [PATCH] Filter MQTT fan JSON attributes (#52283) --- homeassistant/components/mqtt/fan.py | 14 ++++++++++++++ tests/components/mqtt/test_fan.py | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/homeassistant/components/mqtt/fan.py b/homeassistant/components/mqtt/fan.py index d92b6dfd21f..ef996a3c4ba 100644 --- a/homeassistant/components/mqtt/fan.py +++ b/homeassistant/components/mqtt/fan.py @@ -94,6 +94,18 @@ DEFAULT_SPEED_RANGE_MAX = 100 OSCILLATE_ON_PAYLOAD = "oscillate_on" OSCILLATE_OFF_PAYLOAD = "oscillate_off" +MQTT_FAN_ATTRIBUTES_BLOCKED = frozenset( + { + fan.ATTR_DIRECTION, + fan.ATTR_OSCILLATING, + fan.ATTR_PERCENTAGE_STEP, + fan.ATTR_PERCENTAGE, + fan.ATTR_PRESET_MODE, + fan.ATTR_PRESET_MODES, + fan.ATTR_SPEED_LIST, + fan.ATTR_SPEED, + } +) _LOGGER = logging.getLogger(__name__) @@ -223,6 +235,8 @@ async def _async_setup_entity( class MqttFan(MqttEntity, FanEntity): """A MQTT fan component.""" + _attributes_extra_blocked = MQTT_FAN_ATTRIBUTES_BLOCKED + def __init__(self, hass, config, config_entry, discovery_data): """Initialize the MQTT fan.""" self._state = False diff --git a/tests/components/mqtt/test_fan.py b/tests/components/mqtt/test_fan.py index dad365e3c66..438ae0978c6 100644 --- a/tests/components/mqtt/test_fan.py +++ b/tests/components/mqtt/test_fan.py @@ -6,6 +6,7 @@ from voluptuous.error import MultipleInvalid from homeassistant.components import fan from homeassistant.components.fan import NotValidPresetModeError +from homeassistant.components.mqtt.fan import MQTT_FAN_ATTRIBUTES_BLOCKED from homeassistant.const import ( ATTR_ASSUMED_STATE, ATTR_SUPPORTED_FEATURES, @@ -33,6 +34,7 @@ from .test_common import ( help_test_entity_id_update_subscriptions, help_test_setting_attribute_via_mqtt_json_message, help_test_setting_attribute_with_template, + help_test_setting_blocked_attribute_via_mqtt_json_message, help_test_unique_id, help_test_update_with_json_attrs_bad_JSON, help_test_update_with_json_attrs_not_dict, @@ -2037,6 +2039,13 @@ async def test_setting_attribute_via_mqtt_json_message(hass, mqtt_mock): ) +async def test_setting_blocked_attribute_via_mqtt_json_message(hass, mqtt_mock): + """Test the setting of attribute via MQTT with JSON payload.""" + await help_test_setting_blocked_attribute_via_mqtt_json_message( + hass, mqtt_mock, fan.DOMAIN, DEFAULT_CONFIG, MQTT_FAN_ATTRIBUTES_BLOCKED + ) + + async def test_setting_attribute_with_template(hass, mqtt_mock): """Test the setting of attribute via MQTT with JSON payload.""" await help_test_setting_attribute_with_template(