Remove legacy fan compatibility shim (#59781)
This commit is contained in:
parent
566716d697
commit
7fbe1dbc99
6 changed files with 124 additions and 550 deletions
|
@ -1,4 +1,6 @@
|
|||
"""Support for Template fans."""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
@ -12,16 +14,11 @@ from homeassistant.components.fan import (
|
|||
DIRECTION_FORWARD,
|
||||
DIRECTION_REVERSE,
|
||||
ENTITY_ID_FORMAT,
|
||||
SPEED_HIGH,
|
||||
SPEED_LOW,
|
||||
SPEED_MEDIUM,
|
||||
SPEED_OFF,
|
||||
SUPPORT_DIRECTION,
|
||||
SUPPORT_OSCILLATE,
|
||||
SUPPORT_PRESET_MODE,
|
||||
SUPPORT_SET_SPEED,
|
||||
FanEntity,
|
||||
preset_modes_from_speed_list,
|
||||
)
|
||||
from homeassistant.const import (
|
||||
CONF_ENTITY_ID,
|
||||
|
@ -45,10 +42,8 @@ from .template_entity import TemplateEntity
|
|||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CONF_FANS = "fans"
|
||||
CONF_SPEED_LIST = "speeds"
|
||||
CONF_SPEED_COUNT = "speed_count"
|
||||
CONF_PRESET_MODES = "preset_modes"
|
||||
CONF_SPEED_TEMPLATE = "speed_template"
|
||||
CONF_PERCENTAGE_TEMPLATE = "percentage_template"
|
||||
CONF_PRESET_MODE_TEMPLATE = "preset_mode_template"
|
||||
CONF_OSCILLATING_TEMPLATE = "oscillating_template"
|
||||
|
@ -67,14 +62,10 @@ _VALID_DIRECTIONS = [DIRECTION_FORWARD, DIRECTION_REVERSE]
|
|||
|
||||
FAN_SCHEMA = vol.All(
|
||||
cv.deprecated(CONF_ENTITY_ID),
|
||||
cv.deprecated(CONF_SPEED_LIST),
|
||||
cv.deprecated(CONF_SPEED_TEMPLATE),
|
||||
cv.deprecated(CONF_SET_SPEED_ACTION),
|
||||
vol.Schema(
|
||||
{
|
||||
vol.Optional(CONF_FRIENDLY_NAME): cv.string,
|
||||
vol.Required(CONF_VALUE_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_SPEED_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_PERCENTAGE_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_PRESET_MODE_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_OSCILLATING_TEMPLATE): cv.template,
|
||||
|
@ -82,16 +73,11 @@ FAN_SCHEMA = vol.All(
|
|||
vol.Optional(CONF_AVAILABILITY_TEMPLATE): cv.template,
|
||||
vol.Required(CONF_ON_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Required(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SET_SPEED_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SET_PERCENTAGE_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SET_PRESET_MODE_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SET_OSCILLATING_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SET_DIRECTION_ACTION): cv.SCRIPT_SCHEMA,
|
||||
vol.Optional(CONF_SPEED_COUNT): vol.Coerce(int),
|
||||
vol.Optional(
|
||||
CONF_SPEED_LIST,
|
||||
default=[SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH],
|
||||
): cv.ensure_list,
|
||||
vol.Optional(CONF_PRESET_MODES): cv.ensure_list,
|
||||
vol.Optional(CONF_ENTITY_ID): cv.entity_ids,
|
||||
vol.Optional(CONF_UNIQUE_ID): cv.string,
|
||||
|
@ -112,7 +98,6 @@ async def _async_create_entities(hass, config):
|
|||
friendly_name = device_config.get(CONF_FRIENDLY_NAME, device)
|
||||
|
||||
state_template = device_config[CONF_VALUE_TEMPLATE]
|
||||
speed_template = device_config.get(CONF_SPEED_TEMPLATE)
|
||||
percentage_template = device_config.get(CONF_PERCENTAGE_TEMPLATE)
|
||||
preset_mode_template = device_config.get(CONF_PRESET_MODE_TEMPLATE)
|
||||
oscillating_template = device_config.get(CONF_OSCILLATING_TEMPLATE)
|
||||
|
@ -127,7 +112,6 @@ async def _async_create_entities(hass, config):
|
|||
set_oscillating_action = device_config.get(CONF_SET_OSCILLATING_ACTION)
|
||||
set_direction_action = device_config.get(CONF_SET_DIRECTION_ACTION)
|
||||
|
||||
speed_list = device_config[CONF_SPEED_LIST]
|
||||
speed_count = device_config.get(CONF_SPEED_COUNT)
|
||||
preset_modes = device_config.get(CONF_PRESET_MODES)
|
||||
unique_id = device_config.get(CONF_UNIQUE_ID)
|
||||
|
@ -138,7 +122,6 @@ async def _async_create_entities(hass, config):
|
|||
device,
|
||||
friendly_name,
|
||||
state_template,
|
||||
speed_template,
|
||||
percentage_template,
|
||||
preset_mode_template,
|
||||
oscillating_template,
|
||||
|
@ -152,7 +135,6 @@ async def _async_create_entities(hass, config):
|
|||
set_oscillating_action,
|
||||
set_direction_action,
|
||||
speed_count,
|
||||
speed_list,
|
||||
preset_modes,
|
||||
unique_id,
|
||||
)
|
||||
|
@ -175,7 +157,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
device_id,
|
||||
friendly_name,
|
||||
state_template,
|
||||
speed_template,
|
||||
percentage_template,
|
||||
preset_mode_template,
|
||||
oscillating_template,
|
||||
|
@ -189,7 +170,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
set_oscillating_action,
|
||||
set_direction_action,
|
||||
speed_count,
|
||||
speed_list,
|
||||
preset_modes,
|
||||
unique_id,
|
||||
):
|
||||
|
@ -202,7 +182,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
self._name = friendly_name
|
||||
|
||||
self._template = state_template
|
||||
self._speed_template = speed_template
|
||||
self._percentage_template = percentage_template
|
||||
self._preset_mode_template = preset_mode_template
|
||||
self._oscillating_template = oscillating_template
|
||||
|
@ -243,13 +222,12 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
)
|
||||
|
||||
self._state = STATE_OFF
|
||||
self._speed = None
|
||||
self._percentage = None
|
||||
self._preset_mode = None
|
||||
self._oscillating = None
|
||||
self._direction = None
|
||||
|
||||
if self._speed_template or self._percentage_template:
|
||||
if self._percentage_template:
|
||||
self._supported_features |= SUPPORT_SET_SPEED
|
||||
if self._preset_mode_template and preset_modes:
|
||||
self._supported_features |= SUPPORT_PRESET_MODE
|
||||
|
@ -263,17 +241,9 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
# Number of valid speeds
|
||||
self._speed_count = speed_count
|
||||
|
||||
# List of valid speeds
|
||||
self._speed_list = speed_list
|
||||
|
||||
# List of valid preset modes
|
||||
self._preset_modes = preset_modes
|
||||
|
||||
@property
|
||||
def _implemented_speed(self):
|
||||
"""Return true if speed has been implemented."""
|
||||
return bool(self._set_speed_script or self._speed_template)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the display name of this fan."""
|
||||
|
@ -295,27 +265,15 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
return self._speed_count or 100
|
||||
|
||||
@property
|
||||
def speed_list(self) -> list:
|
||||
"""Get the list of available speeds."""
|
||||
return self._speed_list
|
||||
|
||||
@property
|
||||
def preset_modes(self) -> list:
|
||||
def preset_modes(self) -> list[str]:
|
||||
"""Get the list of available preset modes."""
|
||||
if self._preset_modes is not None:
|
||||
return self._preset_modes
|
||||
return preset_modes_from_speed_list(self._speed_list)
|
||||
return self._preset_modes
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return true if device is on."""
|
||||
return self._state == STATE_ON
|
||||
|
||||
@property
|
||||
def speed(self):
|
||||
"""Return the current speed."""
|
||||
return self._speed
|
||||
|
||||
@property
|
||||
def preset_mode(self):
|
||||
"""Return the current preset mode."""
|
||||
|
@ -366,30 +324,12 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
"""Turn off the fan."""
|
||||
await self._off_script.async_run(context=self._context)
|
||||
self._state = STATE_OFF
|
||||
|
||||
async def async_set_speed(self, speed: str) -> None:
|
||||
"""Set the speed of the fan."""
|
||||
if speed not in self.speed_list:
|
||||
_LOGGER.error(
|
||||
"Received invalid speed: %s. Expected: %s", speed, self.speed_list
|
||||
)
|
||||
return
|
||||
|
||||
self._state = STATE_OFF if speed == SPEED_OFF else STATE_ON
|
||||
self._speed = speed
|
||||
self._percentage = 0
|
||||
self._preset_mode = None
|
||||
self._percentage = self.speed_to_percentage(speed)
|
||||
|
||||
if self._set_speed_script:
|
||||
await self._set_speed_script.async_run(
|
||||
{ATTR_SPEED: self._speed}, context=self._context
|
||||
)
|
||||
|
||||
async def async_set_percentage(self, percentage: int) -> None:
|
||||
"""Set the percentage speed of the fan."""
|
||||
speed_list = self.speed_list
|
||||
self._state = STATE_OFF if percentage == 0 else STATE_ON
|
||||
self._speed = self.percentage_to_speed(percentage) if speed_list else None
|
||||
self._percentage = percentage
|
||||
self._preset_mode = None
|
||||
|
||||
|
@ -400,7 +340,7 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
|
||||
async def async_set_preset_mode(self, preset_mode: str) -> None:
|
||||
"""Set the preset_mode of the fan."""
|
||||
if preset_mode not in self.preset_modes:
|
||||
if self.preset_modes and preset_mode not in self.preset_modes:
|
||||
_LOGGER.error(
|
||||
"Received invalid preset_mode: %s. Expected: %s",
|
||||
preset_mode,
|
||||
|
@ -410,7 +350,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
|
||||
self._state = STATE_ON
|
||||
self._preset_mode = preset_mode
|
||||
self._speed = preset_mode
|
||||
self._percentage = None
|
||||
|
||||
if self._set_preset_mode_script:
|
||||
|
@ -491,14 +430,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
self._update_percentage,
|
||||
none_on_template_error=True,
|
||||
)
|
||||
if self._speed_template is not None:
|
||||
self.add_template_attribute(
|
||||
"_speed",
|
||||
self._speed_template,
|
||||
None,
|
||||
self._update_speed,
|
||||
none_on_template_error=True,
|
||||
)
|
||||
if self._oscillating_template is not None:
|
||||
self.add_template_attribute(
|
||||
"_oscillating",
|
||||
|
@ -517,27 +448,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
)
|
||||
await super().async_added_to_hass()
|
||||
|
||||
@callback
|
||||
def _update_speed(self, speed):
|
||||
# Validate speed
|
||||
speed = str(speed)
|
||||
|
||||
if speed in self._speed_list:
|
||||
self._speed = speed
|
||||
self._percentage = self.speed_to_percentage(speed)
|
||||
self._preset_mode = speed if speed in self.preset_modes else None
|
||||
elif speed in (STATE_UNAVAILABLE, STATE_UNKNOWN):
|
||||
self._speed = None
|
||||
self._percentage = 0
|
||||
self._preset_mode = None
|
||||
else:
|
||||
_LOGGER.error(
|
||||
"Received invalid speed: %s. Expected: %s", speed, self._speed_list
|
||||
)
|
||||
self._speed = None
|
||||
self._percentage = 0
|
||||
self._preset_mode = None
|
||||
|
||||
@callback
|
||||
def _update_percentage(self, percentage):
|
||||
# Validate percentage
|
||||
|
@ -545,19 +455,15 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
percentage = int(float(percentage))
|
||||
except ValueError:
|
||||
_LOGGER.error("Received invalid percentage: %s", percentage)
|
||||
self._speed = None
|
||||
self._percentage = 0
|
||||
self._preset_mode = None
|
||||
return
|
||||
|
||||
if 0 <= percentage <= 100:
|
||||
self._percentage = percentage
|
||||
if self._speed_list:
|
||||
self._speed = self.percentage_to_speed(percentage)
|
||||
self._preset_mode = None
|
||||
else:
|
||||
_LOGGER.error("Received invalid percentage: %s", percentage)
|
||||
self._speed = None
|
||||
self._percentage = 0
|
||||
self._preset_mode = None
|
||||
|
||||
|
@ -566,12 +472,10 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
# Validate preset mode
|
||||
preset_mode = str(preset_mode)
|
||||
|
||||
if preset_mode in self.preset_modes:
|
||||
self._speed = preset_mode
|
||||
if self.preset_modes and preset_mode in self.preset_modes:
|
||||
self._percentage = None
|
||||
self._preset_mode = preset_mode
|
||||
elif preset_mode in (STATE_UNAVAILABLE, STATE_UNKNOWN):
|
||||
self._speed = None
|
||||
self._percentage = None
|
||||
self._preset_mode = None
|
||||
else:
|
||||
|
@ -580,7 +484,6 @@ class TemplateFan(TemplateEntity, FanEntity):
|
|||
preset_mode,
|
||||
self.preset_mode,
|
||||
)
|
||||
self._speed = None
|
||||
self._percentage = None
|
||||
self._preset_mode = None
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue