Update alexa for new fan model (#45836)
This commit is contained in:
parent
5b95f61fd3
commit
6707496c5d
5 changed files with 37 additions and 83 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"],
|
||||
},
|
||||
)
|
||||
|
|
|
@ -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",
|
||||
)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue