Files
core/homeassistant/components/whirlpool/number.py
T

80 lines
2.8 KiB
Python

"""Number platform for the Whirlpool Appliances integration."""
from typing import override
from whirlpool.oven import Cavity as OvenCavity, CookMode, Oven
from homeassistant.components.number import NumberDeviceClass, NumberEntity
from homeassistant.const import UnitOfTemperature
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import WhirlpoolConfigEntry
from .const import DOMAIN
from .entity import WhirlpoolOvenEntity
PARALLEL_UPDATES = 1
# Oven target temperatures are handled in Celsius. The appliance accepts
# tenth-of-a-degree values, so a 1-degree step gives fine manual control while
# automations can still set any value Home Assistant passes through.
OVEN_MIN_TEMP = 30
OVEN_MAX_TEMP = 290
OVEN_TEMP_STEP = 1
async def async_setup_entry(
hass: HomeAssistant,
config_entry: WhirlpoolConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the number platform."""
appliances_manager = config_entry.runtime_data
async_add_entities(
WhirlpoolOvenTargetTemperature(oven, cavity)
for oven in appliances_manager.ovens
for cavity in (OvenCavity.Upper, OvenCavity.Lower)
if oven.get_oven_cavity_exists(cavity)
)
class WhirlpoolOvenTargetTemperature(WhirlpoolOvenEntity, NumberEntity):
"""Settable target temperature for an oven cavity."""
_attr_device_class = NumberDeviceClass.TEMPERATURE
_attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS
_attr_native_min_value = OVEN_MIN_TEMP
_attr_native_max_value = OVEN_MAX_TEMP
_attr_native_step = OVEN_TEMP_STEP
def __init__(self, appliance: Oven, cavity: OvenCavity) -> None:
"""Initialize the oven target temperature number."""
super().__init__(
appliance, cavity, "oven_target_temperature", "-target_temperature"
)
@override
@property
def native_value(self) -> float | None:
"""Return the current target temperature."""
return self._appliance.get_target_temp(self.cavity)
@override
async def async_set_native_value(self, value: float) -> None:
"""Set a new target temperature, keeping the current cook mode."""
mode = self._appliance.get_cook_mode(self.cavity)
if mode is None or mode == CookMode.Standby:
mode = CookMode.Bake
try:
WhirlpoolOvenTargetTemperature._check_service_request(
await self._appliance.set_cook(
target_temp=value, mode=mode, cavity=self.cavity
)
)
except ValueError as err:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="invalid_value_set",
) from err