From 12c4a10cfcfba6c7eb5e69a58e1b2f7399546170 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Fri, 20 Oct 2023 10:51:14 +0200 Subject: [PATCH] Do not fail MQTT setup if numbers configured via yaml can't be validated (#102316) Add number --- .../components/mqtt/config_integration.py | 6 +---- homeassistant/components/mqtt/number.py | 27 +++++++------------ tests/components/mqtt/test_number.py | 11 +++----- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/mqtt/config_integration.py b/homeassistant/components/mqtt/config_integration.py index def93075303..5c254da0c27 100644 --- a/homeassistant/components/mqtt/config_integration.py +++ b/homeassistant/components/mqtt/config_integration.py @@ -17,7 +17,6 @@ from homeassistant.helpers import config_validation as cv from . import ( cover as cover_platform, event as event_platform, - number as number_platform, sensor as sensor_platform, ) from .const import ( @@ -56,10 +55,7 @@ CONFIG_SCHEMA_BASE = vol.Schema( Platform.LAWN_MOWER.value: vol.All(cv.ensure_list, [dict]), Platform.LIGHT.value: vol.All(cv.ensure_list, [dict]), Platform.LOCK.value: vol.All(cv.ensure_list, [dict]), - Platform.NUMBER.value: vol.All( - cv.ensure_list, - [number_platform.PLATFORM_SCHEMA_MODERN], # type: ignore[has-type] - ), + Platform.NUMBER.value: vol.All(cv.ensure_list, [dict]), Platform.SCENE.value: vol.All(cv.ensure_list, [dict]), Platform.SELECT.value: vol.All(cv.ensure_list, [dict]), Platform.SENSOR.value: vol.All( diff --git a/homeassistant/components/mqtt/number.py b/homeassistant/components/mqtt/number.py index 231da95ffb0..34616df41bc 100644 --- a/homeassistant/components/mqtt/number.py +++ b/homeassistant/components/mqtt/number.py @@ -2,7 +2,6 @@ from __future__ import annotations from collections.abc import Callable -import functools import logging import voluptuous as vol @@ -28,7 +27,7 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType +from homeassistant.helpers.typing import ConfigType from . import subscription from .config import MQTT_RW_SCHEMA @@ -45,7 +44,7 @@ from .debug_info import log_messages from .mixins import ( MQTT_ENTITY_COMMON_SCHEMA, MqttEntity, - async_setup_entry_helper, + async_mqtt_entry_helper, write_state_on_attr_change, ) from .models import ( @@ -118,21 +117,15 @@ async def async_setup_entry( async_add_entities: AddEntitiesCallback, ) -> None: """Set up MQTT number through YAML and through MQTT discovery.""" - setup = functools.partial( - _async_setup_entity, hass, async_add_entities, config_entry=config_entry + await async_mqtt_entry_helper( + hass, + config_entry, + MqttNumber, + number.DOMAIN, + async_add_entities, + DISCOVERY_SCHEMA, + PLATFORM_SCHEMA_MODERN, ) - await async_setup_entry_helper(hass, number.DOMAIN, setup, DISCOVERY_SCHEMA) - - -async def _async_setup_entity( - hass: HomeAssistant, - async_add_entities: AddEntitiesCallback, - config: ConfigType, - config_entry: ConfigEntry, - discovery_data: DiscoveryInfoType | None = None, -) -> None: - """Set up the MQTT number.""" - async_add_entities([MqttNumber(hass, config, config_entry, discovery_data)]) class MqttNumber(MqttEntity, RestoreNumber): diff --git a/tests/components/mqtt/test_number.py b/tests/components/mqtt/test_number.py index c6590c71c4d..f69b6e0730a 100644 --- a/tests/components/mqtt/test_number.py +++ b/tests/components/mqtt/test_number.py @@ -826,8 +826,7 @@ async def test_invalid_min_max_attributes( caplog: pytest.LogCaptureFixture, ) -> None: """Test invalid min/max attributes.""" - with pytest.raises(AssertionError): - await mqtt_mock_entry() + assert await mqtt_mock_entry() assert f"'{CONF_MAX}' must be > '{CONF_MIN}'" in caplog.text @@ -948,11 +947,9 @@ async def test_invalid_mode( valid: bool, ) -> None: """Test invalid mode.""" - if valid: - await mqtt_mock_entry() - return - with pytest.raises(AssertionError): - await mqtt_mock_entry() + await mqtt_mock_entry() + state = hass.states.get("number.test_number") + assert (state is not None) == valid @pytest.mark.parametrize(