Update alexa for new fan model (#45836)

This commit is contained in:
J. Nick Koston 2021-02-19 20:45:14 -10:00 committed by GitHub
parent 5b95f61fd3
commit 6707496c5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 83 deletions

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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"],
},
)

View file

@ -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",
)