From 6707496c5d73f04d0e5ae4929663bd73a12ab7ed Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 19 Feb 2021 20:45:14 -1000 Subject: [PATCH] Update alexa for new fan model (#45836) --- .../components/alexa/capabilities.py | 9 +-- homeassistant/components/alexa/const.py | 8 --- homeassistant/components/alexa/handlers.py | 62 ++++--------------- tests/components/alexa/test_capabilities.py | 4 ++ tests/components/alexa/test_smart_home.py | 37 +++++------ 5 files changed, 37 insertions(+), 83 deletions(-) diff --git a/homeassistant/components/alexa/capabilities.py b/homeassistant/components/alexa/capabilities.py index 008870c8dd9..acfba91a933 100644 --- a/homeassistant/components/alexa/capabilities.py +++ b/homeassistant/components/alexa/capabilities.py @@ -46,7 +46,6 @@ from .const import ( API_THERMOSTAT_MODES, API_THERMOSTAT_PRESETS, DATE_FORMAT, - PERCENTAGE_FAN_MAP, Inputs, ) from .errors import UnsupportedProperty @@ -668,9 +667,7 @@ class AlexaPercentageController(AlexaCapability): raise UnsupportedProperty(name) if self.entity.domain == fan.DOMAIN: - speed = self.entity.attributes.get(fan.ATTR_SPEED) - - return PERCENTAGE_FAN_MAP.get(speed, 0) + return self.entity.attributes.get(fan.ATTR_PERCENTAGE) or 0 if self.entity.domain == cover.DOMAIN: return self.entity.attributes.get(cover.ATTR_CURRENT_POSITION, 0) @@ -1155,9 +1152,7 @@ class AlexaPowerLevelController(AlexaCapability): raise UnsupportedProperty(name) if self.entity.domain == fan.DOMAIN: - speed = self.entity.attributes.get(fan.ATTR_SPEED) - - return PERCENTAGE_FAN_MAP.get(speed) + return self.entity.attributes.get(fan.ATTR_PERCENTAGE) or 0 return None diff --git a/homeassistant/components/alexa/const.py b/homeassistant/components/alexa/const.py index ca0d8435e02..a076fdcad9e 100644 --- a/homeassistant/components/alexa/const.py +++ b/homeassistant/components/alexa/const.py @@ -1,7 +1,6 @@ """Constants for the Alexa integration.""" from collections import OrderedDict -from homeassistant.components import fan from homeassistant.components.climate import const as climate from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT @@ -80,13 +79,6 @@ API_THERMOSTAT_MODES = OrderedDict( API_THERMOSTAT_MODES_CUSTOM = {climate.HVAC_MODE_DRY: "DEHUMIDIFY"} API_THERMOSTAT_PRESETS = {climate.PRESET_ECO: "ECO"} -PERCENTAGE_FAN_MAP = { - fan.SPEED_OFF: 0, - fan.SPEED_LOW: 33, - fan.SPEED_MEDIUM: 66, - fan.SPEED_HIGH: 100, -} - class Cause: """Possible causes for property changes. diff --git a/homeassistant/components/alexa/handlers.py b/homeassistant/components/alexa/handlers.py index 8837210b6ad..dce4f9f2210 100644 --- a/homeassistant/components/alexa/handlers.py +++ b/homeassistant/components/alexa/handlers.py @@ -54,7 +54,6 @@ from .const import ( API_THERMOSTAT_MODES, API_THERMOSTAT_MODES_CUSTOM, API_THERMOSTAT_PRESETS, - PERCENTAGE_FAN_MAP, Cause, Inputs, ) @@ -360,17 +359,9 @@ async def async_api_set_percentage(hass, config, directive, context): data = {ATTR_ENTITY_ID: entity.entity_id} if entity.domain == fan.DOMAIN: - service = fan.SERVICE_SET_SPEED - speed = "off" - + service = fan.SERVICE_SET_PERCENTAGE percentage = int(directive.payload["percentage"]) - if percentage <= 33: - speed = "low" - elif percentage <= 66: - speed = "medium" - elif percentage <= 100: - speed = "high" - data[fan.ATTR_SPEED] = speed + data[fan.ATTR_PERCENTAGE] = percentage await hass.services.async_call( entity.domain, service, data, blocking=False, context=context @@ -388,22 +379,12 @@ async def async_api_adjust_percentage(hass, config, directive, context): data = {ATTR_ENTITY_ID: entity.entity_id} if entity.domain == fan.DOMAIN: - service = fan.SERVICE_SET_SPEED - speed = entity.attributes.get(fan.ATTR_SPEED) - current = PERCENTAGE_FAN_MAP.get(speed, 100) + service = fan.SERVICE_SET_PERCENTAGE + current = entity.attributes.get(fan.ATTR_PERCENTAGE) or 0 # set percentage - percentage = max(0, percentage_delta + current) - speed = "off" - - if percentage <= 33: - speed = "low" - elif percentage <= 66: - speed = "medium" - elif percentage <= 100: - speed = "high" - - data[fan.ATTR_SPEED] = speed + percentage = min(100, max(0, percentage_delta + current)) + data[fan.ATTR_PERCENTAGE] = percentage await hass.services.async_call( entity.domain, service, data, blocking=False, context=context @@ -854,18 +835,9 @@ async def async_api_set_power_level(hass, config, directive, context): data = {ATTR_ENTITY_ID: entity.entity_id} if entity.domain == fan.DOMAIN: - service = fan.SERVICE_SET_SPEED - speed = "off" - + service = fan.SERVICE_SET_PERCENTAGE percentage = int(directive.payload["powerLevel"]) - if percentage <= 33: - speed = "low" - elif percentage <= 66: - speed = "medium" - else: - speed = "high" - - data[fan.ATTR_SPEED] = speed + data[fan.ATTR_PERCENTAGE] = percentage await hass.services.async_call( entity.domain, service, data, blocking=False, context=context @@ -883,22 +855,12 @@ async def async_api_adjust_power_level(hass, config, directive, context): data = {ATTR_ENTITY_ID: entity.entity_id} if entity.domain == fan.DOMAIN: - service = fan.SERVICE_SET_SPEED - speed = entity.attributes.get(fan.ATTR_SPEED) - current = PERCENTAGE_FAN_MAP.get(speed, 100) + service = fan.SERVICE_SET_PERCENTAGE + current = entity.attributes.get(fan.ATTR_PERCENTAGE) or 0 # set percentage - percentage = max(0, percentage_delta + current) - speed = "off" - - if percentage <= 33: - speed = "low" - elif percentage <= 66: - speed = "medium" - else: - speed = "high" - - data[fan.ATTR_SPEED] = speed + percentage = min(100, max(0, percentage_delta + current)) + data[fan.ATTR_PERCENTAGE] = percentage await hass.services.async_call( entity.domain, service, data, blocking=False, context=context diff --git a/tests/components/alexa/test_capabilities.py b/tests/components/alexa/test_capabilities.py index 0bdbac70d7d..cd013ca70d9 100644 --- a/tests/components/alexa/test_capabilities.py +++ b/tests/components/alexa/test_capabilities.py @@ -323,6 +323,7 @@ async def test_report_fan_speed_state(hass): "friendly_name": "Off fan", "speed": "off", "supported_features": 1, + "percentage": 0, "speed_list": ["off", "low", "medium", "high"], }, ) @@ -333,6 +334,7 @@ async def test_report_fan_speed_state(hass): "friendly_name": "Low speed fan", "speed": "low", "supported_features": 1, + "percentage": 33, "speed_list": ["off", "low", "medium", "high"], }, ) @@ -343,6 +345,7 @@ async def test_report_fan_speed_state(hass): "friendly_name": "Medium speed fan", "speed": "medium", "supported_features": 1, + "percentage": 66, "speed_list": ["off", "low", "medium", "high"], }, ) @@ -353,6 +356,7 @@ async def test_report_fan_speed_state(hass): "friendly_name": "High speed fan", "speed": "high", "supported_features": 1, + "percentage": 100, "speed_list": ["off", "low", "medium", "high"], }, ) diff --git a/tests/components/alexa/test_smart_home.py b/tests/components/alexa/test_smart_home.py index 05a60c86ae0..657bc407fb0 100644 --- a/tests/components/alexa/test_smart_home.py +++ b/tests/components/alexa/test_smart_home.py @@ -383,6 +383,7 @@ async def test_variable_fan(hass): "supported_features": 1, "speed_list": ["low", "medium", "high"], "speed": "high", + "percentage": 100, }, ) appliance = await discovery_test(device, hass) @@ -423,82 +424,82 @@ async def test_variable_fan(hass): "Alexa.PercentageController", "SetPercentage", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"percentage": "50"}, ) - assert call.data["speed"] == "medium" + assert call.data["percentage"] == 50 call, _ = await assert_request_calls_service( "Alexa.PercentageController", "SetPercentage", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"percentage": "33"}, ) - assert call.data["speed"] == "low" + assert call.data["percentage"] == 33 call, _ = await assert_request_calls_service( "Alexa.PercentageController", "SetPercentage", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"percentage": "100"}, ) - assert call.data["speed"] == "high" + assert call.data["percentage"] == 100 await assert_percentage_changes( hass, - [("high", "-5"), ("off", "5"), ("low", "-80"), ("medium", "-34")], + [(95, "-5"), (100, "5"), (20, "-80"), (66, "-34")], "Alexa.PercentageController", "AdjustPercentage", "fan#test_2", "percentageDelta", - "fan.set_speed", - "speed", + "fan.set_percentage", + "percentage", ) call, _ = await assert_request_calls_service( "Alexa.PowerLevelController", "SetPowerLevel", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"powerLevel": "20"}, ) - assert call.data["speed"] == "low" + assert call.data["percentage"] == 20 call, _ = await assert_request_calls_service( "Alexa.PowerLevelController", "SetPowerLevel", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"powerLevel": "50"}, ) - assert call.data["speed"] == "medium" + assert call.data["percentage"] == 50 call, _ = await assert_request_calls_service( "Alexa.PowerLevelController", "SetPowerLevel", "fan#test_2", - "fan.set_speed", + "fan.set_percentage", hass, payload={"powerLevel": "99"}, ) - assert call.data["speed"] == "high" + assert call.data["percentage"] == 99 await assert_percentage_changes( hass, - [("high", "-5"), ("medium", "-50"), ("low", "-80")], + [(95, "-5"), (50, "-50"), (20, "-80")], "Alexa.PowerLevelController", "AdjustPowerLevel", "fan#test_2", "powerLevelDelta", - "fan.set_speed", - "speed", + "fan.set_percentage", + "percentage", )