Add support for preset modes in homekit fans (#45962)
This commit is contained in:
parent
5e26bda52d
commit
d9ab1482bc
2 changed files with 126 additions and 0 deletions
|
@ -7,11 +7,14 @@ from homeassistant.components.fan import (
|
|||
ATTR_OSCILLATING,
|
||||
ATTR_PERCENTAGE,
|
||||
ATTR_PERCENTAGE_STEP,
|
||||
ATTR_PRESET_MODE,
|
||||
ATTR_PRESET_MODES,
|
||||
DIRECTION_FORWARD,
|
||||
DIRECTION_REVERSE,
|
||||
DOMAIN,
|
||||
SUPPORT_DIRECTION,
|
||||
SUPPORT_OSCILLATE,
|
||||
SUPPORT_PRESET_MODE,
|
||||
SUPPORT_SET_SPEED,
|
||||
)
|
||||
from homeassistant.components.homekit.const import ATTR_VALUE, PROP_MIN_STEP
|
||||
|
@ -557,3 +560,83 @@ async def test_fan_restore(hass, hk_driver, events):
|
|||
assert acc.char_direction is not None
|
||||
assert acc.char_speed is not None
|
||||
assert acc.char_swing is not None
|
||||
|
||||
|
||||
async def test_fan_preset_modes(hass, hk_driver, events):
|
||||
"""Test fan with direction."""
|
||||
entity_id = "fan.demo"
|
||||
|
||||
hass.states.async_set(
|
||||
entity_id,
|
||||
STATE_ON,
|
||||
{
|
||||
ATTR_SUPPORTED_FEATURES: SUPPORT_PRESET_MODE,
|
||||
ATTR_PRESET_MODE: "auto",
|
||||
ATTR_PRESET_MODES: ["auto", "smart"],
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
acc = Fan(hass, hk_driver, "Fan", entity_id, 1, None)
|
||||
hk_driver.add_accessory(acc)
|
||||
|
||||
assert acc.preset_mode_chars["auto"].value == 1
|
||||
assert acc.preset_mode_chars["smart"].value == 0
|
||||
|
||||
await acc.run()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
hass.states.async_set(
|
||||
entity_id,
|
||||
STATE_ON,
|
||||
{
|
||||
ATTR_SUPPORTED_FEATURES: SUPPORT_PRESET_MODE,
|
||||
ATTR_PRESET_MODE: "smart",
|
||||
ATTR_PRESET_MODES: ["auto", "smart"],
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert acc.preset_mode_chars["auto"].value == 0
|
||||
assert acc.preset_mode_chars["smart"].value == 1
|
||||
# Set from HomeKit
|
||||
call_set_preset_mode = async_mock_service(hass, DOMAIN, "set_preset_mode")
|
||||
call_turn_on = async_mock_service(hass, DOMAIN, "turn_on")
|
||||
|
||||
char_auto_iid = acc.preset_mode_chars["auto"].to_HAP()[HAP_REPR_IID]
|
||||
|
||||
hk_driver.set_characteristics(
|
||||
{
|
||||
HAP_REPR_CHARS: [
|
||||
{
|
||||
HAP_REPR_AID: acc.aid,
|
||||
HAP_REPR_IID: char_auto_iid,
|
||||
HAP_REPR_VALUE: 1,
|
||||
},
|
||||
]
|
||||
},
|
||||
"mock_addr",
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert call_set_preset_mode[0]
|
||||
assert call_set_preset_mode[0].data[ATTR_ENTITY_ID] == entity_id
|
||||
assert call_set_preset_mode[0].data[ATTR_PRESET_MODE] == "auto"
|
||||
assert len(events) == 1
|
||||
assert events[-1].data["service"] == "set_preset_mode"
|
||||
|
||||
hk_driver.set_characteristics(
|
||||
{
|
||||
HAP_REPR_CHARS: [
|
||||
{
|
||||
HAP_REPR_AID: acc.aid,
|
||||
HAP_REPR_IID: char_auto_iid,
|
||||
HAP_REPR_VALUE: 0,
|
||||
},
|
||||
]
|
||||
},
|
||||
"mock_addr",
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert call_turn_on[0]
|
||||
assert call_turn_on[0].data[ATTR_ENTITY_ID] == entity_id
|
||||
assert events[-1].data["service"] == "turn_on"
|
||||
assert len(events) == 2
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue