From 67b309394fe57935035bd382a40154cff09d695f Mon Sep 17 00:00:00 2001 From: Jim Ekman Date: Wed, 27 Jan 2021 10:40:33 +0100 Subject: [PATCH] Esphome fan direction (#44495) --- homeassistant/components/esphome/fan.py | 28 ++++++++++++++++++- .../components/esphome/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/esphome/fan.py b/homeassistant/components/esphome/fan.py index df663f8b10a..32f445d23a2 100644 --- a/homeassistant/components/esphome/fan.py +++ b/homeassistant/components/esphome/fan.py @@ -1,13 +1,16 @@ """Support for ESPHome fans.""" from typing import List, Optional -from aioesphomeapi import FanInfo, FanSpeed, FanState +from aioesphomeapi import FanDirection, FanInfo, FanSpeed, FanState from homeassistant.components.fan import ( + DIRECTION_FORWARD, + DIRECTION_REVERSE, SPEED_HIGH, SPEED_LOW, SPEED_MEDIUM, SPEED_OFF, + SUPPORT_DIRECTION, SUPPORT_OSCILLATE, SUPPORT_SET_SPEED, FanEntity, @@ -47,6 +50,14 @@ def _fan_speeds(): } +@esphome_map_enum +def _fan_directions(): + return { + FanDirection.FORWARD: DIRECTION_FORWARD, + FanDirection.REVERSE: DIRECTION_REVERSE, + } + + class EsphomeFan(EsphomeEntity, FanEntity): """A fan implementation for ESPHome.""" @@ -88,6 +99,12 @@ class EsphomeFan(EsphomeEntity, FanEntity): key=self._static_info.key, oscillating=oscillating ) + async def async_set_direction(self, direction: str): + """Set direction of the fan.""" + await self._client.fan_command( + key=self._static_info.key, direction=_fan_directions.from_hass(direction) + ) + # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # pylint: disable=invalid-overridden-method @@ -110,6 +127,13 @@ class EsphomeFan(EsphomeEntity, FanEntity): return None return self._state.oscillating + @esphome_state_property + def current_direction(self) -> None: + """Return the current fan direction.""" + if not self._static_info.supports_direction: + return None + return _fan_directions.from_esphome(self._state.direction) + @property def speed_list(self) -> Optional[List[str]]: """Get the list of available speeds.""" @@ -125,4 +149,6 @@ class EsphomeFan(EsphomeEntity, FanEntity): flags |= SUPPORT_OSCILLATE if self._static_info.supports_speed: flags |= SUPPORT_SET_SPEED + if self._static_info.supports_direction: + flags |= SUPPORT_DIRECTION return flags diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index 123c7931e41..c69f4f4d8c6 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -3,7 +3,7 @@ "name": "ESPHome", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/esphome", - "requirements": ["aioesphomeapi==2.6.3"], + "requirements": ["aioesphomeapi==2.6.4"], "zeroconf": ["_esphomelib._tcp.local."], "codeowners": ["@OttoWinter"], "after_dependencies": ["zeroconf", "tag"] diff --git a/requirements_all.txt b/requirements_all.txt index e8708a3283a..65296beed4b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -154,7 +154,7 @@ aiodns==2.0.0 aioeafm==0.1.2 # homeassistant.components.esphome -aioesphomeapi==2.6.3 +aioesphomeapi==2.6.4 # homeassistant.components.flo aioflo==0.4.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7567c21ad58..b42a9225fe9 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -88,7 +88,7 @@ aiodns==2.0.0 aioeafm==0.1.2 # homeassistant.components.esphome -aioesphomeapi==2.6.3 +aioesphomeapi==2.6.4 # homeassistant.components.flo aioflo==0.4.1