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_MODES,
API_THERMOSTAT_PRESETS, API_THERMOSTAT_PRESETS,
DATE_FORMAT, DATE_FORMAT,
PERCENTAGE_FAN_MAP,
Inputs, Inputs,
) )
from .errors import UnsupportedProperty from .errors import UnsupportedProperty
@ -668,9 +667,7 @@ class AlexaPercentageController(AlexaCapability):
raise UnsupportedProperty(name) raise UnsupportedProperty(name)
if self.entity.domain == fan.DOMAIN: if self.entity.domain == fan.DOMAIN:
speed = self.entity.attributes.get(fan.ATTR_SPEED) return self.entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
return PERCENTAGE_FAN_MAP.get(speed, 0)
if self.entity.domain == cover.DOMAIN: if self.entity.domain == cover.DOMAIN:
return self.entity.attributes.get(cover.ATTR_CURRENT_POSITION, 0) return self.entity.attributes.get(cover.ATTR_CURRENT_POSITION, 0)
@ -1155,9 +1152,7 @@ class AlexaPowerLevelController(AlexaCapability):
raise UnsupportedProperty(name) raise UnsupportedProperty(name)
if self.entity.domain == fan.DOMAIN: if self.entity.domain == fan.DOMAIN:
speed = self.entity.attributes.get(fan.ATTR_SPEED) return self.entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
return PERCENTAGE_FAN_MAP.get(speed)
return None return None

View File

@ -1,7 +1,6 @@
"""Constants for the Alexa integration.""" """Constants for the Alexa integration."""
from collections import OrderedDict from collections import OrderedDict
from homeassistant.components import fan
from homeassistant.components.climate import const as climate from homeassistant.components.climate import const as climate
from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT 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_MODES_CUSTOM = {climate.HVAC_MODE_DRY: "DEHUMIDIFY"}
API_THERMOSTAT_PRESETS = {climate.PRESET_ECO: "ECO"} 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: class Cause:
"""Possible causes for property changes. """Possible causes for property changes.

View File

@ -54,7 +54,6 @@ from .const import (
API_THERMOSTAT_MODES, API_THERMOSTAT_MODES,
API_THERMOSTAT_MODES_CUSTOM, API_THERMOSTAT_MODES_CUSTOM,
API_THERMOSTAT_PRESETS, API_THERMOSTAT_PRESETS,
PERCENTAGE_FAN_MAP,
Cause, Cause,
Inputs, Inputs,
) )
@ -360,17 +359,9 @@ async def async_api_set_percentage(hass, config, directive, context):
data = {ATTR_ENTITY_ID: entity.entity_id} data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN: if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_SPEED service = fan.SERVICE_SET_PERCENTAGE
speed = "off"
percentage = int(directive.payload["percentage"]) percentage = int(directive.payload["percentage"])
if percentage <= 33: data[fan.ATTR_PERCENTAGE] = percentage
speed = "low"
elif percentage <= 66:
speed = "medium"
elif percentage <= 100:
speed = "high"
data[fan.ATTR_SPEED] = speed
await hass.services.async_call( await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context 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} data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN: if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_SPEED service = fan.SERVICE_SET_PERCENTAGE
speed = entity.attributes.get(fan.ATTR_SPEED) current = entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
current = PERCENTAGE_FAN_MAP.get(speed, 100)
# set percentage # set percentage
percentage = max(0, percentage_delta + current) percentage = min(100, max(0, percentage_delta + current))
speed = "off" data[fan.ATTR_PERCENTAGE] = percentage
if percentage <= 33:
speed = "low"
elif percentage <= 66:
speed = "medium"
elif percentage <= 100:
speed = "high"
data[fan.ATTR_SPEED] = speed
await hass.services.async_call( await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context 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} data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN: if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_SPEED service = fan.SERVICE_SET_PERCENTAGE
speed = "off"
percentage = int(directive.payload["powerLevel"]) percentage = int(directive.payload["powerLevel"])
if percentage <= 33: data[fan.ATTR_PERCENTAGE] = percentage
speed = "low"
elif percentage <= 66:
speed = "medium"
else:
speed = "high"
data[fan.ATTR_SPEED] = speed
await hass.services.async_call( await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context 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} data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN: if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_SPEED service = fan.SERVICE_SET_PERCENTAGE
speed = entity.attributes.get(fan.ATTR_SPEED) current = entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
current = PERCENTAGE_FAN_MAP.get(speed, 100)
# set percentage # set percentage
percentage = max(0, percentage_delta + current) percentage = min(100, max(0, percentage_delta + current))
speed = "off" data[fan.ATTR_PERCENTAGE] = percentage
if percentage <= 33:
speed = "low"
elif percentage <= 66:
speed = "medium"
else:
speed = "high"
data[fan.ATTR_SPEED] = speed
await hass.services.async_call( await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context 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", "friendly_name": "Off fan",
"speed": "off", "speed": "off",
"supported_features": 1, "supported_features": 1,
"percentage": 0,
"speed_list": ["off", "low", "medium", "high"], "speed_list": ["off", "low", "medium", "high"],
}, },
) )
@ -333,6 +334,7 @@ async def test_report_fan_speed_state(hass):
"friendly_name": "Low speed fan", "friendly_name": "Low speed fan",
"speed": "low", "speed": "low",
"supported_features": 1, "supported_features": 1,
"percentage": 33,
"speed_list": ["off", "low", "medium", "high"], "speed_list": ["off", "low", "medium", "high"],
}, },
) )
@ -343,6 +345,7 @@ async def test_report_fan_speed_state(hass):
"friendly_name": "Medium speed fan", "friendly_name": "Medium speed fan",
"speed": "medium", "speed": "medium",
"supported_features": 1, "supported_features": 1,
"percentage": 66,
"speed_list": ["off", "low", "medium", "high"], "speed_list": ["off", "low", "medium", "high"],
}, },
) )
@ -353,6 +356,7 @@ async def test_report_fan_speed_state(hass):
"friendly_name": "High speed fan", "friendly_name": "High speed fan",
"speed": "high", "speed": "high",
"supported_features": 1, "supported_features": 1,
"percentage": 100,
"speed_list": ["off", "low", "medium", "high"], "speed_list": ["off", "low", "medium", "high"],
}, },
) )

View File

@ -383,6 +383,7 @@ async def test_variable_fan(hass):
"supported_features": 1, "supported_features": 1,
"speed_list": ["low", "medium", "high"], "speed_list": ["low", "medium", "high"],
"speed": "high", "speed": "high",
"percentage": 100,
}, },
) )
appliance = await discovery_test(device, hass) appliance = await discovery_test(device, hass)
@ -423,82 +424,82 @@ async def test_variable_fan(hass):
"Alexa.PercentageController", "Alexa.PercentageController",
"SetPercentage", "SetPercentage",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"percentage": "50"}, payload={"percentage": "50"},
) )
assert call.data["speed"] == "medium" assert call.data["percentage"] == 50
call, _ = await assert_request_calls_service( call, _ = await assert_request_calls_service(
"Alexa.PercentageController", "Alexa.PercentageController",
"SetPercentage", "SetPercentage",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"percentage": "33"}, payload={"percentage": "33"},
) )
assert call.data["speed"] == "low" assert call.data["percentage"] == 33
call, _ = await assert_request_calls_service( call, _ = await assert_request_calls_service(
"Alexa.PercentageController", "Alexa.PercentageController",
"SetPercentage", "SetPercentage",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"percentage": "100"}, payload={"percentage": "100"},
) )
assert call.data["speed"] == "high" assert call.data["percentage"] == 100
await assert_percentage_changes( await assert_percentage_changes(
hass, hass,
[("high", "-5"), ("off", "5"), ("low", "-80"), ("medium", "-34")], [(95, "-5"), (100, "5"), (20, "-80"), (66, "-34")],
"Alexa.PercentageController", "Alexa.PercentageController",
"AdjustPercentage", "AdjustPercentage",
"fan#test_2", "fan#test_2",
"percentageDelta", "percentageDelta",
"fan.set_speed", "fan.set_percentage",
"speed", "percentage",
) )
call, _ = await assert_request_calls_service( call, _ = await assert_request_calls_service(
"Alexa.PowerLevelController", "Alexa.PowerLevelController",
"SetPowerLevel", "SetPowerLevel",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"powerLevel": "20"}, payload={"powerLevel": "20"},
) )
assert call.data["speed"] == "low" assert call.data["percentage"] == 20
call, _ = await assert_request_calls_service( call, _ = await assert_request_calls_service(
"Alexa.PowerLevelController", "Alexa.PowerLevelController",
"SetPowerLevel", "SetPowerLevel",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"powerLevel": "50"}, payload={"powerLevel": "50"},
) )
assert call.data["speed"] == "medium" assert call.data["percentage"] == 50
call, _ = await assert_request_calls_service( call, _ = await assert_request_calls_service(
"Alexa.PowerLevelController", "Alexa.PowerLevelController",
"SetPowerLevel", "SetPowerLevel",
"fan#test_2", "fan#test_2",
"fan.set_speed", "fan.set_percentage",
hass, hass,
payload={"powerLevel": "99"}, payload={"powerLevel": "99"},
) )
assert call.data["speed"] == "high" assert call.data["percentage"] == 99
await assert_percentage_changes( await assert_percentage_changes(
hass, hass,
[("high", "-5"), ("medium", "-50"), ("low", "-80")], [(95, "-5"), (50, "-50"), (20, "-80")],
"Alexa.PowerLevelController", "Alexa.PowerLevelController",
"AdjustPowerLevel", "AdjustPowerLevel",
"fan#test_2", "fan#test_2",
"powerLevelDelta", "powerLevelDelta",
"fan.set_speed", "fan.set_percentage",
"speed", "percentage",
) )