mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Update alexa for new fan model (#45836)
This commit is contained in:
parent
5b95f61fd3
commit
6707496c5d
@ -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
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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"],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -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",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user