mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Add PowerLevelController for fan to alexa (#27158)
* Implement AlexaPowerLevelController * Implement AlexaPowerLevelController Tests
This commit is contained in:
parent
565302ed34
commit
af81878d08
@ -614,3 +614,38 @@ class AlexaThermostatController(AlexaCapibility):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
return {"value": temp, "scale": API_TEMP_UNITS[unit]}
|
return {"value": temp, "scale": API_TEMP_UNITS[unit]}
|
||||||
|
|
||||||
|
|
||||||
|
class AlexaPowerLevelController(AlexaCapibility):
|
||||||
|
"""Implements Alexa.PowerLevelController.
|
||||||
|
|
||||||
|
https://developer.amazon.com/docs/device-apis/alexa-powerlevelcontroller.html
|
||||||
|
"""
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
"""Return the Alexa API name of this interface."""
|
||||||
|
return "Alexa.PowerLevelController"
|
||||||
|
|
||||||
|
def properties_supported(self):
|
||||||
|
"""Return what properties this entity supports."""
|
||||||
|
return [{"name": "powerLevel"}]
|
||||||
|
|
||||||
|
def properties_proactively_reported(self):
|
||||||
|
"""Return True if properties asynchronously reported."""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def properties_retrievable(self):
|
||||||
|
"""Return True if properties can be retrieved."""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_property(self, name):
|
||||||
|
"""Read and return a property."""
|
||||||
|
if name != "powerLevel":
|
||||||
|
raise UnsupportedProperty(name)
|
||||||
|
|
||||||
|
if self.entity.domain == fan.DOMAIN:
|
||||||
|
speed = self.entity.attributes.get(fan.ATTR_SPEED)
|
||||||
|
|
||||||
|
return PERCENTAGE_FAN_MAP.get(speed, None)
|
||||||
|
|
||||||
|
return None
|
||||||
|
@ -62,7 +62,12 @@ API_THERMOSTAT_MODES = OrderedDict(
|
|||||||
)
|
)
|
||||||
API_THERMOSTAT_PRESETS = {climate.PRESET_ECO: "ECO"}
|
API_THERMOSTAT_PRESETS = {climate.PRESET_ECO: "ECO"}
|
||||||
|
|
||||||
PERCENTAGE_FAN_MAP = {fan.SPEED_LOW: 33, fan.SPEED_MEDIUM: 66, fan.SPEED_HIGH: 100}
|
PERCENTAGE_FAN_MAP = {
|
||||||
|
fan.SPEED_OFF: 0,
|
||||||
|
fan.SPEED_LOW: 33,
|
||||||
|
fan.SPEED_MEDIUM: 66,
|
||||||
|
fan.SPEED_HIGH: 100,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Cause:
|
class Cause:
|
||||||
|
@ -43,6 +43,7 @@ from .capabilities import (
|
|||||||
AlexaPercentageController,
|
AlexaPercentageController,
|
||||||
AlexaPlaybackController,
|
AlexaPlaybackController,
|
||||||
AlexaPowerController,
|
AlexaPowerController,
|
||||||
|
AlexaPowerLevelController,
|
||||||
AlexaSceneController,
|
AlexaSceneController,
|
||||||
AlexaSpeaker,
|
AlexaSpeaker,
|
||||||
AlexaStepSpeaker,
|
AlexaStepSpeaker,
|
||||||
@ -344,6 +345,7 @@ class FanCapabilities(AlexaEntity):
|
|||||||
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||||
if supported & fan.SUPPORT_SET_SPEED:
|
if supported & fan.SUPPORT_SET_SPEED:
|
||||||
yield AlexaPercentageController(self.entity)
|
yield AlexaPercentageController(self.entity)
|
||||||
|
yield AlexaPowerLevelController(self.entity)
|
||||||
yield AlexaEndpointHealth(self.hass, self.entity)
|
yield AlexaEndpointHealth(self.hass, self.entity)
|
||||||
|
|
||||||
|
|
||||||
|
@ -779,3 +779,73 @@ async def async_api_set_thermostat_mode(hass, config, directive, context):
|
|||||||
async def async_api_reportstate(hass, config, directive, context):
|
async def async_api_reportstate(hass, config, directive, context):
|
||||||
"""Process a ReportState request."""
|
"""Process a ReportState request."""
|
||||||
return directive.response(name="StateReport")
|
return directive.response(name="StateReport")
|
||||||
|
|
||||||
|
|
||||||
|
@HANDLERS.register(("Alexa.PowerLevelController", "SetPowerLevel"))
|
||||||
|
async def async_api_set_power_level(hass, config, directive, context):
|
||||||
|
"""Process a SetPowerLevel request."""
|
||||||
|
entity = directive.entity
|
||||||
|
percentage = int(directive.payload["powerLevel"])
|
||||||
|
service = None
|
||||||
|
data = {ATTR_ENTITY_ID: entity.entity_id}
|
||||||
|
|
||||||
|
if entity.domain == fan.DOMAIN:
|
||||||
|
service = fan.SERVICE_SET_SPEED
|
||||||
|
speed = "off"
|
||||||
|
|
||||||
|
if percentage <= 33:
|
||||||
|
speed = "low"
|
||||||
|
elif percentage <= 66:
|
||||||
|
speed = "medium"
|
||||||
|
else:
|
||||||
|
speed = "high"
|
||||||
|
|
||||||
|
data[fan.ATTR_SPEED] = speed
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
entity.domain, service, data, blocking=False, context=context
|
||||||
|
)
|
||||||
|
|
||||||
|
return directive.response()
|
||||||
|
|
||||||
|
|
||||||
|
@HANDLERS.register(("Alexa.PowerLevelController", "AdjustPowerLevel"))
|
||||||
|
async def async_api_adjust_power_level(hass, config, directive, context):
|
||||||
|
"""Process an AdjustPowerLevel request."""
|
||||||
|
entity = directive.entity
|
||||||
|
percentage_delta = int(directive.payload["powerLevelDelta"])
|
||||||
|
service = None
|
||||||
|
data = {ATTR_ENTITY_ID: entity.entity_id}
|
||||||
|
current = 0
|
||||||
|
|
||||||
|
if entity.domain == fan.DOMAIN:
|
||||||
|
service = fan.SERVICE_SET_SPEED
|
||||||
|
speed = entity.attributes.get(fan.ATTR_SPEED)
|
||||||
|
|
||||||
|
if speed == "off":
|
||||||
|
current = 0
|
||||||
|
elif speed == "low":
|
||||||
|
current = 33
|
||||||
|
elif speed == "medium":
|
||||||
|
current = 66
|
||||||
|
else:
|
||||||
|
current = 100
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
entity.domain, service, data, blocking=False, context=context
|
||||||
|
)
|
||||||
|
|
||||||
|
return directive.response()
|
||||||
|
@ -340,6 +340,7 @@ async def test_variable_fan(hass):
|
|||||||
appliance,
|
appliance,
|
||||||
"Alexa.PercentageController",
|
"Alexa.PercentageController",
|
||||||
"Alexa.PowerController",
|
"Alexa.PowerController",
|
||||||
|
"Alexa.PowerLevelController",
|
||||||
"Alexa.EndpointHealth",
|
"Alexa.EndpointHealth",
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -364,6 +365,27 @@ async def test_variable_fan(hass):
|
|||||||
"speed",
|
"speed",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
call, _ = await assert_request_calls_service(
|
||||||
|
"Alexa.PowerLevelController",
|
||||||
|
"SetPowerLevel",
|
||||||
|
"fan#test_2",
|
||||||
|
"fan.set_speed",
|
||||||
|
hass,
|
||||||
|
payload={"powerLevel": "50"},
|
||||||
|
)
|
||||||
|
assert call.data["speed"] == "medium"
|
||||||
|
|
||||||
|
await assert_percentage_changes(
|
||||||
|
hass,
|
||||||
|
[("high", "-5"), ("high", "5"), ("low", "-80")],
|
||||||
|
"Alexa.PowerLevelController",
|
||||||
|
"AdjustPowerLevel",
|
||||||
|
"fan#test_2",
|
||||||
|
"powerLevelDelta",
|
||||||
|
"fan.set_speed",
|
||||||
|
"speed",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_lock(hass):
|
async def test_lock(hass):
|
||||||
"""Test lock discovery."""
|
"""Test lock discovery."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user