From d148f9aa85f75751a2c4b8b6bb1cbe7d479a6f8f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 28 Jan 2021 10:23:10 -0600 Subject: [PATCH] Update comfoconnect to use new fan entity model (#45593) --- homeassistant/components/comfoconnect/fan.py | 75 +++++++++----------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/homeassistant/components/comfoconnect/fan.py b/homeassistant/components/comfoconnect/fan.py index 18549c52d35..1d7b9c1c0af 100644 --- a/homeassistant/components/comfoconnect/fan.py +++ b/homeassistant/components/comfoconnect/fan.py @@ -1,5 +1,6 @@ """Platform to control a Zehnder ComfoAir Q350/450/600 ventilation unit.""" import logging +import math from pycomfoconnect import ( CMD_FAN_MODE_AWAY, @@ -9,21 +10,25 @@ from pycomfoconnect import ( SENSOR_FAN_SPEED_MODE, ) -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.helpers.dispatcher import async_dispatcher_connect +from homeassistant.util.percentage import ( + percentage_to_ranged_value, + ranged_value_to_percentage, +) from . import DOMAIN, SIGNAL_COMFOCONNECT_UPDATE_RECEIVED, ComfoConnectBridge _LOGGER = logging.getLogger(__name__) -SPEED_MAPPING = {0: SPEED_OFF, 1: SPEED_LOW, 2: SPEED_MEDIUM, 3: SPEED_HIGH} +CMD_MAPPING = { + 0: CMD_FAN_MODE_AWAY, + 1: CMD_FAN_MODE_LOW, + 2: CMD_FAN_MODE_MEDIUM, + 3: CMD_FAN_MODE_HIGH, +} + +SPEED_RANGE = (1, 3) # away is not included in speeds and instead mapped to off def setup_platform(hass, config, add_entities, discovery_info=None): @@ -89,50 +94,36 @@ class ComfoConnectFan(FanEntity): return SUPPORT_SET_SPEED @property - def speed(self): - """Return the current fan mode.""" - try: - speed = self._ccb.data[SENSOR_FAN_SPEED_MODE] - return SPEED_MAPPING[speed] - except KeyError: + def percentage(self) -> str: + """Return the current speed percentage.""" + speed = self._ccb.data[SENSOR_FAN_SPEED_MODE] + if speed is None: return None + return ranged_value_to_percentage(SPEED_RANGE, speed) - @property - def speed_list(self): - """List of available fan modes.""" - return [SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] - - # - # 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/ - # def turn_on( self, speed: str = None, percentage=None, preset_mode=None, **kwargs ) -> None: """Turn on the fan.""" - if speed is None: - speed = SPEED_LOW - self.set_speed(speed) + self.set_percentage(percentage) def turn_off(self, **kwargs) -> None: """Turn off the fan (to away).""" - self.set_speed(SPEED_OFF) + self.set_percentage(0) - def set_speed(self, speed: str): - """Set fan speed.""" - _LOGGER.debug("Changing fan speed to %s", speed) + def set_percentage(self, percentage: int): + """Set fan speed percentage.""" + _LOGGER.debug("Changing fan speed percentage to %s", percentage) - if speed == SPEED_OFF: - self._ccb.comfoconnect.cmd_rmi_request(CMD_FAN_MODE_AWAY) - elif speed == SPEED_LOW: - self._ccb.comfoconnect.cmd_rmi_request(CMD_FAN_MODE_LOW) - elif speed == SPEED_MEDIUM: - self._ccb.comfoconnect.cmd_rmi_request(CMD_FAN_MODE_MEDIUM) - elif speed == SPEED_HIGH: - self._ccb.comfoconnect.cmd_rmi_request(CMD_FAN_MODE_HIGH) + if percentage is None: + cmd = CMD_FAN_MODE_LOW + elif percentage == 0: + cmd = CMD_FAN_MODE_AWAY + else: + speed = math.ceil(percentage_to_ranged_value(SPEED_RANGE, percentage)) + cmd = CMD_MAPPING[speed] + + self._ccb.comfoconnect.cmd_rmi_request(cmd) # Update current mode self.schedule_update_ha_state()