mirror of https://github.com/home-assistant/core
234 lines
6.9 KiB
Python
234 lines
6.9 KiB
Python
"""Basic checks for HomeKit select entities."""
|
|
|
|
from collections.abc import Callable
|
|
|
|
from aiohomekit.model import Accessory
|
|
from aiohomekit.model.characteristics import CharacteristicsTypes
|
|
from aiohomekit.model.characteristics.const import TemperatureDisplayUnits
|
|
from aiohomekit.model.services import ServicesTypes
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from .common import Helper, setup_test_component
|
|
|
|
|
|
def create_service_with_ecobee_mode(accessory: Accessory):
|
|
"""Define a thermostat with ecobee mode characteristics."""
|
|
service = accessory.add_service(ServicesTypes.THERMOSTAT, add_required=True)
|
|
|
|
current_mode = service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE)
|
|
current_mode.value = 0
|
|
current_mode.perms.append("ev")
|
|
|
|
service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE)
|
|
|
|
return service
|
|
|
|
|
|
def create_service_with_temperature_units(accessory: Accessory):
|
|
"""Define a thermostat with ecobee mode characteristics."""
|
|
service = accessory.add_service(ServicesTypes.TEMPERATURE_SENSOR, add_required=True)
|
|
|
|
units = service.add_char(CharacteristicsTypes.TEMPERATURE_UNITS)
|
|
units.value = 0
|
|
|
|
return service
|
|
|
|
|
|
async def test_migrate_unique_id(
|
|
hass: HomeAssistant,
|
|
entity_registry: er.EntityRegistry,
|
|
get_next_aid: Callable[[], int],
|
|
) -> None:
|
|
"""Test we can migrate a select unique id."""
|
|
aid = get_next_aid()
|
|
select = entity_registry.async_get_or_create(
|
|
"select",
|
|
"homekit_controller",
|
|
f"homekit-0001-aid:{aid}-sid:8-cid:14",
|
|
suggested_object_id="testdevice_current_mode",
|
|
)
|
|
|
|
await setup_test_component(hass, aid, create_service_with_ecobee_mode)
|
|
|
|
assert (
|
|
entity_registry.async_get(select.entity_id).unique_id
|
|
== f"00:00:00:00:00:00_{aid}_8_14"
|
|
)
|
|
|
|
|
|
async def test_read_current_mode(
|
|
hass: HomeAssistant, get_next_aid: Callable[[], int]
|
|
) -> None:
|
|
"""Test that Ecobee mode can be correctly read and show as human readable text."""
|
|
helper = await setup_test_component(
|
|
hass, get_next_aid(), create_service_with_ecobee_mode
|
|
)
|
|
|
|
# Helper will be for the primary entity, which is the service. Make a helper for the sensor.
|
|
ecobee_mode = Helper(
|
|
hass,
|
|
"select.testdevice_current_mode",
|
|
helper.pairing,
|
|
helper.accessory,
|
|
helper.config_entry,
|
|
)
|
|
|
|
state = await ecobee_mode.async_update(
|
|
ServicesTypes.THERMOSTAT,
|
|
{
|
|
CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 0,
|
|
},
|
|
)
|
|
assert state.state == "home"
|
|
|
|
state = await ecobee_mode.async_update(
|
|
ServicesTypes.THERMOSTAT,
|
|
{
|
|
CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 1,
|
|
},
|
|
)
|
|
assert state.state == "sleep"
|
|
|
|
state = await ecobee_mode.async_update(
|
|
ServicesTypes.THERMOSTAT,
|
|
{
|
|
CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE: 2,
|
|
},
|
|
)
|
|
assert state.state == "away"
|
|
|
|
|
|
async def test_write_current_mode(
|
|
hass: HomeAssistant, get_next_aid: Callable[[], int]
|
|
) -> None:
|
|
"""Test can set a specific mode."""
|
|
helper = await setup_test_component(
|
|
hass, get_next_aid(), create_service_with_ecobee_mode
|
|
)
|
|
helper.accessory.services.first(service_type=ServicesTypes.THERMOSTAT)
|
|
|
|
# Helper will be for the primary entity, which is the service. Make a helper for the sensor.
|
|
current_mode = Helper(
|
|
hass,
|
|
"select.testdevice_current_mode",
|
|
helper.pairing,
|
|
helper.accessory,
|
|
helper.config_entry,
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{"entity_id": "select.testdevice_current_mode", "option": "home"},
|
|
blocking=True,
|
|
)
|
|
current_mode.async_assert_service_values(
|
|
ServicesTypes.THERMOSTAT,
|
|
{CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 0},
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{"entity_id": "select.testdevice_current_mode", "option": "sleep"},
|
|
blocking=True,
|
|
)
|
|
current_mode.async_assert_service_values(
|
|
ServicesTypes.THERMOSTAT,
|
|
{CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 1},
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{"entity_id": "select.testdevice_current_mode", "option": "away"},
|
|
blocking=True,
|
|
)
|
|
current_mode.async_assert_service_values(
|
|
ServicesTypes.THERMOSTAT,
|
|
{CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: 2},
|
|
)
|
|
|
|
|
|
async def test_read_select(
|
|
hass: HomeAssistant, get_next_aid: Callable[[], int]
|
|
) -> None:
|
|
"""Test the generic select can read the current value."""
|
|
helper = await setup_test_component(
|
|
hass, get_next_aid(), create_service_with_temperature_units
|
|
)
|
|
|
|
# Helper will be for the primary entity, which is the service. Make a helper for the sensor.
|
|
select_entity = Helper(
|
|
hass,
|
|
"select.testdevice_temperature_display_units",
|
|
helper.pairing,
|
|
helper.accessory,
|
|
helper.config_entry,
|
|
)
|
|
|
|
state = await select_entity.async_update(
|
|
ServicesTypes.TEMPERATURE_SENSOR,
|
|
{
|
|
CharacteristicsTypes.TEMPERATURE_UNITS: 0,
|
|
},
|
|
)
|
|
assert state.state == "celsius"
|
|
|
|
state = await select_entity.async_update(
|
|
ServicesTypes.TEMPERATURE_SENSOR,
|
|
{
|
|
CharacteristicsTypes.TEMPERATURE_UNITS: 1,
|
|
},
|
|
)
|
|
assert state.state == "fahrenheit"
|
|
|
|
|
|
async def test_write_select(
|
|
hass: HomeAssistant, get_next_aid: Callable[[], int]
|
|
) -> None:
|
|
"""Test can set a value."""
|
|
helper = await setup_test_component(
|
|
hass, get_next_aid(), create_service_with_temperature_units
|
|
)
|
|
helper.accessory.services.first(service_type=ServicesTypes.THERMOSTAT)
|
|
|
|
# Helper will be for the primary entity, which is the service. Make a helper for the sensor.
|
|
current_mode = Helper(
|
|
hass,
|
|
"select.testdevice_temperature_display_units",
|
|
helper.pairing,
|
|
helper.accessory,
|
|
helper.config_entry,
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{
|
|
"entity_id": "select.testdevice_temperature_display_units",
|
|
"option": "fahrenheit",
|
|
},
|
|
blocking=True,
|
|
)
|
|
current_mode.async_assert_service_values(
|
|
ServicesTypes.TEMPERATURE_SENSOR,
|
|
{CharacteristicsTypes.TEMPERATURE_UNITS: TemperatureDisplayUnits.FAHRENHEIT},
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{
|
|
"entity_id": "select.testdevice_temperature_display_units",
|
|
"option": "celsius",
|
|
},
|
|
blocking=True,
|
|
)
|
|
current_mode.async_assert_service_values(
|
|
ServicesTypes.TEMPERATURE_SENSOR,
|
|
{CharacteristicsTypes.TEMPERATURE_UNITS: TemperatureDisplayUnits.CELSIUS},
|
|
)
|