Migrate number mode to StrEnum (#60614)
This commit is contained in:
parent
1b8eba0afd
commit
7469f083fd
6 changed files with 32 additions and 29 deletions
|
@ -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
|
||||
|
|
|
@ -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__(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue