mirror of https://github.com/home-assistant/core
196 lines
6.4 KiB
Python
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"
|