From 3896e81db747a7ed71bc0a14954fd5b9678aa61f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 28 Jan 2021 03:09:16 -0600 Subject: [PATCH] Update smartthings to use new fan entity model (#45592) --- homeassistant/components/smartthings/fan.py | 55 +++++++-------------- 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/homeassistant/components/smartthings/fan.py b/homeassistant/components/smartthings/fan.py index bff9862c8f6..b09bfe0ad46 100644 --- a/homeassistant/components/smartthings/fan.py +++ b/homeassistant/components/smartthings/fan.py @@ -1,22 +1,19 @@ """Support for fans through the SmartThings cloud API.""" +import math from typing import Optional, Sequence from pysmartthings import Capability -from homeassistant.components.fan import ( - SPEED_HIGH, - SPEED_LOW, - SPEED_MEDIUM, - SPEED_OFF, - SUPPORT_SET_SPEED, - FanEntity, +from homeassistant.components.fan import SUPPORT_SET_SPEED, FanEntity +from homeassistant.util.percentage import ( + percentage_to_ranged_value, + ranged_value_to_percentage, ) from . import SmartThingsEntity from .const import DATA_BROKERS, DOMAIN -VALUE_TO_SPEED = {0: SPEED_OFF, 1: SPEED_LOW, 2: SPEED_MEDIUM, 3: SPEED_HIGH} -SPEED_TO_VALUE = {v: k for k, v in VALUE_TO_SPEED.items()} +SPEED_RANGE = (1, 3) # off is not included async def async_setup_entry(hass, config_entry, async_add_entities): @@ -42,21 +39,19 @@ def get_capabilities(capabilities: Sequence[str]) -> Optional[Sequence[str]]: class SmartThingsFan(SmartThingsEntity, FanEntity): """Define a SmartThings Fan.""" - async def async_set_speed(self, speed: str): - """Set the speed of the fan.""" - value = SPEED_TO_VALUE[speed] - await self._device.set_fan_speed(value, set_status=True) + async def async_set_percentage(self, percentage: int) -> None: + """Set the speed percentage of the fan.""" + if percentage is None: + await self._device.switch_on(set_status=True) + elif percentage == 0: + await self._device.switch_off(set_status=True) + else: + value = math.ceil(percentage_to_ranged_value(SPEED_RANGE, percentage)) + await self._device.set_fan_speed(value, set_status=True) # State is set optimistically in the command above, therefore update # the entity state ahead of receiving the confirming push updates self.async_write_ha_state() - # - # The fan entity model has changed to use percentages and preset_modes - # instead of speeds. - # - # Please review - # https://developers.home-assistant.io/docs/core/entity/fan/ - # async def async_turn_on( self, speed: str = None, @@ -65,14 +60,7 @@ class SmartThingsFan(SmartThingsEntity, FanEntity): **kwargs, ) -> None: """Turn the fan on.""" - if speed is not None: - value = SPEED_TO_VALUE[speed] - await self._device.set_fan_speed(value, set_status=True) - else: - await self._device.switch_on(set_status=True) - # State is set optimistically in the commands above, therefore update - # the entity state ahead of receiving the confirming push updates - self.async_write_ha_state() + await self.async_set_percentage(percentage) async def async_turn_off(self, **kwargs) -> None: """Turn the fan off.""" @@ -87,14 +75,9 @@ class SmartThingsFan(SmartThingsEntity, FanEntity): return self._device.status.switch @property - def speed(self) -> str: - """Return the current speed.""" - return VALUE_TO_SPEED[self._device.status.fan_speed] - - @property - def speed_list(self) -> list: - """Get the list of available speeds.""" - return [SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] + def percentage(self) -> str: + """Return the current speed percentage.""" + return ranged_value_to_percentage(SPEED_RANGE, self._device.status.fan_speed) @property def supported_features(self) -> int: