229 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
"""Basic checks for HomeKitalarm_control_panel."""
 | 
						|
from aiohomekit.model.characteristics import CharacteristicsTypes
 | 
						|
from aiohomekit.model.services import ServicesTypes
 | 
						|
 | 
						|
from tests.components.homekit_controller.common import setup_test_component
 | 
						|
 | 
						|
POSITION_STATE = ("window-covering", "position.state")
 | 
						|
POSITION_CURRENT = ("window-covering", "position.current")
 | 
						|
POSITION_TARGET = ("window-covering", "position.target")
 | 
						|
POSITION_HOLD = ("window-covering", "position.hold")
 | 
						|
 | 
						|
H_TILT_CURRENT = ("window-covering", "horizontal-tilt.current")
 | 
						|
H_TILT_TARGET = ("window-covering", "horizontal-tilt.target")
 | 
						|
 | 
						|
V_TILT_CURRENT = ("window-covering", "vertical-tilt.current")
 | 
						|
V_TILT_TARGET = ("window-covering", "vertical-tilt.target")
 | 
						|
 | 
						|
WINDOW_OBSTRUCTION = ("window-covering", "obstruction-detected")
 | 
						|
 | 
						|
DOOR_CURRENT = ("garage-door-opener", "door-state.current")
 | 
						|
DOOR_TARGET = ("garage-door-opener", "door-state.target")
 | 
						|
DOOR_OBSTRUCTION = ("garage-door-opener", "obstruction-detected")
 | 
						|
 | 
						|
 | 
						|
def create_window_covering_service(accessory):
 | 
						|
    """Define a window-covering characteristics as per page 219 of HAP spec."""
 | 
						|
    service = accessory.add_service(ServicesTypes.WINDOW_COVERING)
 | 
						|
 | 
						|
    cur_state = service.add_char(CharacteristicsTypes.POSITION_CURRENT)
 | 
						|
    cur_state.value = 0
 | 
						|
 | 
						|
    targ_state = service.add_char(CharacteristicsTypes.POSITION_TARGET)
 | 
						|
    targ_state.value = 0
 | 
						|
 | 
						|
    position_state = service.add_char(CharacteristicsTypes.POSITION_STATE)
 | 
						|
    position_state.value = 0
 | 
						|
 | 
						|
    position_hold = service.add_char(CharacteristicsTypes.POSITION_HOLD)
 | 
						|
    position_hold.value = 0
 | 
						|
 | 
						|
    obstruction = service.add_char(CharacteristicsTypes.OBSTRUCTION_DETECTED)
 | 
						|
    obstruction.value = False
 | 
						|
 | 
						|
    name = service.add_char(CharacteristicsTypes.NAME)
 | 
						|
    name.value = "testdevice"
 | 
						|
 | 
						|
    return service
 | 
						|
 | 
						|
 | 
						|
def create_window_covering_service_with_h_tilt(accessory):
 | 
						|
    """Define a window-covering characteristics as per page 219 of HAP spec."""
 | 
						|
    service = create_window_covering_service(accessory)
 | 
						|
 | 
						|
    tilt_current = service.add_char(CharacteristicsTypes.HORIZONTAL_TILT_CURRENT)
 | 
						|
    tilt_current.value = 0
 | 
						|
 | 
						|
    tilt_target = service.add_char(CharacteristicsTypes.HORIZONTAL_TILT_TARGET)
 | 
						|
    tilt_target.value = 0
 | 
						|
 | 
						|
 | 
						|
def create_window_covering_service_with_v_tilt(accessory):
 | 
						|
    """Define a window-covering characteristics as per page 219 of HAP spec."""
 | 
						|
    service = create_window_covering_service(accessory)
 | 
						|
 | 
						|
    tilt_current = service.add_char(CharacteristicsTypes.VERTICAL_TILT_CURRENT)
 | 
						|
    tilt_current.value = 0
 | 
						|
 | 
						|
    tilt_target = service.add_char(CharacteristicsTypes.VERTICAL_TILT_TARGET)
 | 
						|
    tilt_target.value = 0
 | 
						|
 | 
						|
 | 
						|
async def test_change_window_cover_state(hass, utcnow):
 | 
						|
    """Test that we can turn a HomeKit alarm on and off again."""
 | 
						|
    helper = await setup_test_component(hass, create_window_covering_service)
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover", "open_cover", {"entity_id": helper.entity_id}, blocking=True
 | 
						|
    )
 | 
						|
    assert helper.characteristics[POSITION_TARGET].value == 100
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover", "close_cover", {"entity_id": helper.entity_id}, blocking=True
 | 
						|
    )
 | 
						|
    assert helper.characteristics[POSITION_TARGET].value == 0
 | 
						|
 | 
						|
 | 
						|
async def test_read_window_cover_state(hass, utcnow):
 | 
						|
    """Test that we can read the state of a HomeKit alarm accessory."""
 | 
						|
    helper = await setup_test_component(hass, create_window_covering_service)
 | 
						|
 | 
						|
    helper.characteristics[POSITION_STATE].value = 0
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "closing"
 | 
						|
 | 
						|
    helper.characteristics[POSITION_STATE].value = 1
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "opening"
 | 
						|
 | 
						|
    helper.characteristics[POSITION_STATE].value = 2
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "closed"
 | 
						|
 | 
						|
    helper.characteristics[WINDOW_OBSTRUCTION].value = True
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.attributes["obstruction-detected"] is True
 | 
						|
 | 
						|
 | 
						|
async def test_read_window_cover_tilt_horizontal(hass, utcnow):
 | 
						|
    """Test that horizontal tilt is handled correctly."""
 | 
						|
    helper = await setup_test_component(
 | 
						|
        hass, create_window_covering_service_with_h_tilt
 | 
						|
    )
 | 
						|
 | 
						|
    helper.characteristics[H_TILT_CURRENT].value = 75
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.attributes["current_tilt_position"] == 75
 | 
						|
 | 
						|
 | 
						|
async def test_read_window_cover_tilt_vertical(hass, utcnow):
 | 
						|
    """Test that vertical tilt is handled correctly."""
 | 
						|
    helper = await setup_test_component(
 | 
						|
        hass, create_window_covering_service_with_v_tilt
 | 
						|
    )
 | 
						|
 | 
						|
    helper.characteristics[V_TILT_CURRENT].value = 75
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.attributes["current_tilt_position"] == 75
 | 
						|
 | 
						|
 | 
						|
async def test_write_window_cover_tilt_horizontal(hass, utcnow):
 | 
						|
    """Test that horizontal tilt is written correctly."""
 | 
						|
    helper = await setup_test_component(
 | 
						|
        hass, create_window_covering_service_with_h_tilt
 | 
						|
    )
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover",
 | 
						|
        "set_cover_tilt_position",
 | 
						|
        {"entity_id": helper.entity_id, "tilt_position": 90},
 | 
						|
        blocking=True,
 | 
						|
    )
 | 
						|
    assert helper.characteristics[H_TILT_TARGET].value == 90
 | 
						|
 | 
						|
 | 
						|
async def test_write_window_cover_tilt_vertical(hass, utcnow):
 | 
						|
    """Test that vertical tilt is written correctly."""
 | 
						|
    helper = await setup_test_component(
 | 
						|
        hass, create_window_covering_service_with_v_tilt
 | 
						|
    )
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover",
 | 
						|
        "set_cover_tilt_position",
 | 
						|
        {"entity_id": helper.entity_id, "tilt_position": 90},
 | 
						|
        blocking=True,
 | 
						|
    )
 | 
						|
    assert helper.characteristics[V_TILT_TARGET].value == 90
 | 
						|
 | 
						|
 | 
						|
async def test_window_cover_stop(hass, utcnow):
 | 
						|
    """Test that vertical tilt is written correctly."""
 | 
						|
    helper = await setup_test_component(
 | 
						|
        hass, create_window_covering_service_with_v_tilt
 | 
						|
    )
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover", "stop_cover", {"entity_id": helper.entity_id}, blocking=True
 | 
						|
    )
 | 
						|
    assert helper.characteristics[POSITION_HOLD].value == 1
 | 
						|
 | 
						|
 | 
						|
def create_garage_door_opener_service(accessory):
 | 
						|
    """Define a garage-door-opener chars as per page 217 of HAP spec."""
 | 
						|
    service = accessory.add_service(ServicesTypes.GARAGE_DOOR_OPENER)
 | 
						|
 | 
						|
    cur_state = service.add_char(CharacteristicsTypes.DOOR_STATE_CURRENT)
 | 
						|
    cur_state.value = 0
 | 
						|
 | 
						|
    cur_state = service.add_char(CharacteristicsTypes.DOOR_STATE_TARGET)
 | 
						|
    cur_state.value = 0
 | 
						|
 | 
						|
    obstruction = service.add_char(CharacteristicsTypes.OBSTRUCTION_DETECTED)
 | 
						|
    obstruction.value = False
 | 
						|
 | 
						|
    name = service.add_char(CharacteristicsTypes.NAME)
 | 
						|
    name.value = "testdevice"
 | 
						|
 | 
						|
    return service
 | 
						|
 | 
						|
 | 
						|
async def test_change_door_state(hass, utcnow):
 | 
						|
    """Test that we can turn open and close a HomeKit garage door."""
 | 
						|
    helper = await setup_test_component(hass, create_garage_door_opener_service)
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover", "open_cover", {"entity_id": helper.entity_id}, blocking=True
 | 
						|
    )
 | 
						|
    assert helper.characteristics[DOOR_TARGET].value == 0
 | 
						|
 | 
						|
    await hass.services.async_call(
 | 
						|
        "cover", "close_cover", {"entity_id": helper.entity_id}, blocking=True
 | 
						|
    )
 | 
						|
    assert helper.characteristics[DOOR_TARGET].value == 1
 | 
						|
 | 
						|
 | 
						|
async def test_read_door_state(hass, utcnow):
 | 
						|
    """Test that we can read the state of a HomeKit garage door."""
 | 
						|
    helper = await setup_test_component(hass, create_garage_door_opener_service)
 | 
						|
 | 
						|
    helper.characteristics[DOOR_CURRENT].value = 0
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "open"
 | 
						|
 | 
						|
    helper.characteristics[DOOR_CURRENT].value = 1
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "closed"
 | 
						|
 | 
						|
    helper.characteristics[DOOR_CURRENT].value = 2
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "opening"
 | 
						|
 | 
						|
    helper.characteristics[DOOR_CURRENT].value = 3
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.state == "closing"
 | 
						|
 | 
						|
    helper.characteristics[DOOR_OBSTRUCTION].value = True
 | 
						|
    state = await helper.poll_and_get_state()
 | 
						|
    assert state.attributes["obstruction-detected"] is True
 |