diff --git a/homeassistant/components/demo/number.py b/homeassistant/components/demo/number.py index d471bdac85f..2625d8bca05 100644 --- a/homeassistant/components/demo/number.py +++ b/homeassistant/components/demo/number.py @@ -1,10 +1,7 @@ """Demo platform that offers a fake Number entity.""" from __future__ import annotations -from typing import Literal - -from homeassistant.components.number import NumberEntity -from homeassistant.components.number.const import MODE_AUTO, MODE_BOX, MODE_SLIDER +from homeassistant.components.number import NumberEntity, NumberMode from homeassistant.const import DEVICE_DEFAULT_NAME from homeassistant.helpers.entity import DeviceInfo @@ -21,7 +18,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= 42.0, "mdi:volume-high", False, - mode=MODE_SLIDER, + mode=NumberMode.SLIDER, ), DemoNumber( "pwm1", @@ -32,7 +29,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= 0.0, 1.0, 0.01, - MODE_BOX, + NumberMode.BOX, ), DemoNumber( "large_range", @@ -78,7 +75,7 @@ class DemoNumber(NumberEntity): min_value: float | None = None, max_value: float | None = None, step: float | None = None, - mode: Literal["auto", "box", "slider"] = MODE_AUTO, + mode: NumberMode = NumberMode.AUTO, ) -> None: """Initialize the Demo Number entity.""" self._attr_assumed_state = assumed diff --git a/homeassistant/components/flux_led/number.py b/homeassistant/components/flux_led/number.py index 583b8cea0a8..28007181e5c 100644 --- a/homeassistant/components/flux_led/number.py +++ b/homeassistant/components/flux_led/number.py @@ -4,8 +4,7 @@ from __future__ import annotations from typing import cast from homeassistant import config_entries -from homeassistant.components.number import NumberEntity -from homeassistant.components.number.const import MODE_SLIDER +from homeassistant.components.number import NumberEntity, NumberMode from homeassistant.const import CONF_NAME from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError @@ -47,7 +46,7 @@ class FluxNumber(FluxEntity, CoordinatorEntity, NumberEntity): _attr_min_value = 1 _attr_max_value = 100 _attr_step = 1 - _attr_mode = MODE_SLIDER + _attr_mode = NumberMode.SLIDER _attr_icon = "mdi:speedometer" def __init__( diff --git a/homeassistant/components/knx/schema.py b/homeassistant/components/knx/schema.py index 02e4803b163..218a84b2485 100644 --- a/homeassistant/components/knx/schema.py +++ b/homeassistant/components/knx/schema.py @@ -18,7 +18,7 @@ from homeassistant.components.binary_sensor import ( ) from homeassistant.components.climate.const import HVAC_MODE_HEAT, HVAC_MODES from homeassistant.components.cover import DEVICE_CLASSES as COVER_DEVICE_CLASSES -from homeassistant.components.number.const import MODE_AUTO, MODE_BOX, MODE_SLIDER +from homeassistant.components.number import NumberMode from homeassistant.components.sensor import CONF_STATE_CLASS, STATE_CLASSES_SCHEMA from homeassistant.const import ( CONF_DEVICE_CLASS, @@ -786,14 +786,14 @@ class NumberSchema(KNXPlatformSchema): CONF_STEP = "step" DEFAULT_NAME = "KNX Number" - NUMBER_MODES: Final = [MODE_AUTO, MODE_BOX, MODE_SLIDER] - ENTITY_SCHEMA = vol.All( vol.Schema( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_MODE, default=MODE_AUTO): vol.In(NUMBER_MODES), + vol.Optional(CONF_MODE, default=NumberMode.AUTO): vol.Coerce( + NumberMode + ), vol.Required(CONF_TYPE): numeric_type_validator, vol.Required(KNX_ADDRESS): ga_list_validator, vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index 89ad7d8b8c2..7e2f9093b80 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -4,7 +4,7 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta import logging -from typing import Any, Literal, final +from typing import Any, final import voluptuous as vol @@ -18,6 +18,7 @@ from homeassistant.helpers.config_validation import ( # noqa: F401 from homeassistant.helpers.entity import Entity, EntityDescription from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.typing import ConfigType +from homeassistant.util.enum import StrEnum from .const import ( ATTR_MAX, @@ -28,7 +29,6 @@ from .const import ( DEFAULT_MIN_VALUE, DEFAULT_STEP, DOMAIN, - MODE_AUTO, SERVICE_SET_VALUE, ) @@ -41,6 +41,14 @@ MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) _LOGGER = logging.getLogger(__name__) +class NumberMode(StrEnum): + """Modes for number entities.""" + + AUTO = "auto" + BOX = "box" + SLIDER = "slider" + + async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Number entities.""" component = hass.data[DOMAIN] = EntityComponent( @@ -92,7 +100,7 @@ class NumberEntity(Entity): _attr_min_value: float = DEFAULT_MIN_VALUE _attr_state: None = None _attr_step: float - _attr_mode: Literal["auto", "slider", "box"] = MODE_AUTO + _attr_mode: NumberMode = NumberMode.AUTO _attr_value: float @property @@ -128,7 +136,7 @@ class NumberEntity(Entity): return step @property - def mode(self) -> Literal["auto", "slider", "box"]: + def mode(self) -> NumberMode: """Return the mode of the entity.""" return self._attr_mode diff --git a/homeassistant/components/number/const.py b/homeassistant/components/number/const.py index 749463b11e5..50390e7ab81 100644 --- a/homeassistant/components/number/const.py +++ b/homeassistant/components/number/const.py @@ -7,10 +7,6 @@ ATTR_MIN = "min" ATTR_MAX = "max" ATTR_STEP = "step" -MODE_AUTO: Final = "auto" -MODE_BOX: Final = "box" -MODE_SLIDER: Final = "slider" - DEFAULT_MIN_VALUE = 0.0 DEFAULT_MAX_VALUE = 100.0 DEFAULT_STEP = 1.0 @@ -18,3 +14,8 @@ DEFAULT_STEP = 1.0 DOMAIN = "number" SERVICE_SET_VALUE = "set_value" + +# MODE_* are deprecated as of 2021.12, use the NumberMode enum instead. +MODE_AUTO: Final = "auto" +MODE_BOX: Final = "box" +MODE_SLIDER: Final = "slider" diff --git a/tests/components/demo/test_number.py b/tests/components/demo/test_number.py index 88e46f5c66d..64f690d9eac 100644 --- a/tests/components/demo/test_number.py +++ b/tests/components/demo/test_number.py @@ -3,15 +3,13 @@ import pytest import voluptuous as vol +from homeassistant.components.number import NumberMode from homeassistant.components.number.const import ( ATTR_MAX, ATTR_MIN, ATTR_STEP, ATTR_VALUE, DOMAIN, - MODE_AUTO, - MODE_BOX, - MODE_SLIDER, SERVICE_SET_VALUE, ) from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE @@ -42,25 +40,25 @@ def test_default_setup_params(hass): assert state.attributes.get(ATTR_MIN) == 0.0 assert state.attributes.get(ATTR_MAX) == 100.0 assert state.attributes.get(ATTR_STEP) == 1.0 - assert state.attributes.get(ATTR_MODE) == MODE_SLIDER + assert state.attributes.get(ATTR_MODE) == NumberMode.SLIDER state = hass.states.get(ENTITY_PWM) assert state.attributes.get(ATTR_MIN) == 0.0 assert state.attributes.get(ATTR_MAX) == 1.0 assert state.attributes.get(ATTR_STEP) == 0.01 - assert state.attributes.get(ATTR_MODE) == MODE_BOX + assert state.attributes.get(ATTR_MODE) == NumberMode.BOX state = hass.states.get(ENTITY_LARGE_RANGE) assert state.attributes.get(ATTR_MIN) == 1.0 assert state.attributes.get(ATTR_MAX) == 1000.0 assert state.attributes.get(ATTR_STEP) == 1.0 - assert state.attributes.get(ATTR_MODE) == MODE_AUTO + assert state.attributes.get(ATTR_MODE) == NumberMode.AUTO state = hass.states.get(ENTITY_SMALL_RANGE) assert state.attributes.get(ATTR_MIN) == 1.0 assert state.attributes.get(ATTR_MAX) == 255.0 assert state.attributes.get(ATTR_STEP) == 1.0 - assert state.attributes.get(ATTR_MODE) == MODE_AUTO + assert state.attributes.get(ATTR_MODE) == NumberMode.AUTO async def test_set_value_bad_attr(hass):