Remove legacy fan compatibility shim (#59781)

This commit is contained in:
J. Nick Koston 2021-12-03 19:57:46 -10:00 committed by GitHub
parent 566716d697
commit 7fbe1dbc99
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 124 additions and 550 deletions

View file

@ -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