core/tests/components/homekit_controller/test_select.py

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},
)