Update comfoconnect to use new fan entity model (#45593)
parent
d7e0391e03
commit
d148f9aa85
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue