core/tests/components/homekit_controller/test_event.py

196 lines
6.4 KiB
Python

"""Test homekit_controller stateless triggers."""
from collections.abc import Callable
from aiohomekit.model import Accessory
from aiohomekit.model.characteristics import CharacteristicsTypes
from aiohomekit.model.services import ServicesTypes
from homeassistant.components.event import EventDeviceClass
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from .common import setup_test_component
def create_remote(accessory: Accessory) -> None:
"""Define characteristics for a button (that is inn a group)."""
service_label = accessory.add_service(ServicesTypes.SERVICE_LABEL)
char = service_label.add_char(CharacteristicsTypes.SERVICE_LABEL_NAMESPACE)
char.value = 1
for i in range(4):
button = accessory.add_service(ServicesTypes.STATELESS_PROGRAMMABLE_SWITCH)
button.linked.append(service_label)
char = button.add_char(CharacteristicsTypes.INPUT_EVENT)
char.value = 0
char.perms = ["pw", "pr", "ev"]
char = button.add_char(CharacteristicsTypes.NAME)
char.value = f"Button {i + 1}"
char = button.add_char(CharacteristicsTypes.SERVICE_LABEL_INDEX)
char.value = i
battery = accessory.add_service(ServicesTypes.BATTERY_SERVICE)
battery.add_char(CharacteristicsTypes.BATTERY_LEVEL)
def create_button(accessory: Accessory) -> None:
"""Define a button (that is not in a group)."""
button = accessory.add_service(ServicesTypes.STATELESS_PROGRAMMABLE_SWITCH)
char = button.add_char(CharacteristicsTypes.INPUT_EVENT)
char.value = 0
char.perms = ["pw", "pr", "ev"]
char = button.add_char(CharacteristicsTypes.NAME)
char.value = "Button 1"
battery = accessory.add_service(ServicesTypes.BATTERY_SERVICE)
battery.add_char(CharacteristicsTypes.BATTERY_LEVEL)
def create_doorbell(accessory: Accessory) -> None:
"""Define a button (that is not in a group)."""
button = accessory.add_service(ServicesTypes.DOORBELL)
char = button.add_char(CharacteristicsTypes.INPUT_EVENT)
char.value = 0
char.perms = ["pw", "pr", "ev"]
char = button.add_char(CharacteristicsTypes.NAME)
char.value = "Doorbell"
battery = accessory.add_service(ServicesTypes.BATTERY_SERVICE)
battery.add_char(CharacteristicsTypes.BATTERY_LEVEL)
async def test_remote(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
get_next_aid: Callable[[], int],
) -> None:
"""Test that remote is supported."""
helper = await setup_test_component(hass, get_next_aid(), create_remote)
entities = [
("event.testdevice_button_1", "Button 1"),
("event.testdevice_button_2", "Button 2"),
("event.testdevice_button_3", "Button 3"),
("event.testdevice_button_4", "Button 4"),
]
for entity_id, service in entities:
button = entity_registry.async_get(entity_id)
assert button.original_device_class == EventDeviceClass.BUTTON
assert button.capabilities["event_types"] == [
"single_press",
"double_press",
"long_press",
]
helper.pairing.testing.update_named_service(
service, {CharacteristicsTypes.INPUT_EVENT: 0}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "single_press"
helper.pairing.testing.update_named_service(
service, {CharacteristicsTypes.INPUT_EVENT: 1}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "double_press"
helper.pairing.testing.update_named_service(
service, {CharacteristicsTypes.INPUT_EVENT: 2}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "long_press"
async def test_button(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
get_next_aid: Callable[[], int],
) -> None:
"""Test that a button is correctly enumerated."""
helper = await setup_test_component(hass, get_next_aid(), create_button)
entity_id = "event.testdevice_button_1"
button = entity_registry.async_get(entity_id)
assert button.original_device_class == EventDeviceClass.BUTTON
assert button.capabilities["event_types"] == [
"single_press",
"double_press",
"long_press",
]
helper.pairing.testing.update_named_service(
"Button 1", {CharacteristicsTypes.INPUT_EVENT: 0}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "single_press"
helper.pairing.testing.update_named_service(
"Button 1", {CharacteristicsTypes.INPUT_EVENT: 1}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "double_press"
helper.pairing.testing.update_named_service(
"Button 1", {CharacteristicsTypes.INPUT_EVENT: 2}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "long_press"
async def test_doorbell(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
get_next_aid: Callable[[], int],
) -> None:
"""Test that doorbell service is handled."""
helper = await setup_test_component(hass, get_next_aid(), create_doorbell)
entity_id = "event.testdevice_doorbell"
doorbell = entity_registry.async_get(entity_id)
assert doorbell.original_device_class == EventDeviceClass.DOORBELL
assert doorbell.capabilities["event_types"] == [
"single_press",
"double_press",
"long_press",
]
helper.pairing.testing.update_named_service(
"Doorbell", {CharacteristicsTypes.INPUT_EVENT: 0}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "single_press"
helper.pairing.testing.update_named_service(
"Doorbell", {CharacteristicsTypes.INPUT_EVENT: 1}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "double_press"
helper.pairing.testing.update_named_service(
"Doorbell", {CharacteristicsTypes.INPUT_EVENT: 2}
)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state.attributes["event_type"] == "long_press"