def test_no_alarm_code(self):
        """Test accessory if security_system doesn't require a alarm_code."""
        acp = 'alarm_control_panel.test'

        acc = SecuritySystem(self.hass, acp, 'SecuritySystem',
                             alarm_code=None, aid=2)
        acc.run()

        # Set from HomeKit
        acc.char_target_state.set_value(0)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE], 'alarm_arm_home')
        self.assertNotIn(ATTR_CODE, self.events[0].data[ATTR_SERVICE_DATA])
        self.assertEqual(acc.char_target_state.value, 0)
Example #2
0
    def test_no_alarm_code(self):
        """Test accessory if security_system doesn't require a alarm_code."""
        acp = 'alarm_control_panel.test'

        acc = SecuritySystem(self.hass, acp, 'SecuritySystem',
                             alarm_code=None, aid=2)
        acc.run()

        # Set from HomeKit
        acc.char_target_state.client_update_value(0)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE], 'alarm_arm_home')
        self.assertNotIn(ATTR_CODE, self.events[0].data[ATTR_SERVICE_DATA])
        self.assertEqual(acc.char_target_state.value, 0)
async def test_arming(hass, hk_driver, events):
    """Test to make sure arming sets the right state."""
    entity_id = "alarm_control_panel.test"

    hass.states.async_set(entity_id, None)

    acc = SecuritySystem(hass, hk_driver, "SecuritySystem", entity_id, 2, {})
    await acc.run()
    await hass.async_block_till_done()

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_AWAY)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 1

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_HOME)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 0
    assert acc.char_current_state.value == 0

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_VACATION)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 1

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_NIGHT)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 2
    assert acc.char_current_state.value == 2

    hass.states.async_set(entity_id, STATE_ALARM_ARMING)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_DISARMED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_AWAY)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 1

    hass.states.async_set(entity_id, STATE_ALARM_TRIGGERED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 4
async def test_no_alarm_code(hass, config):
    """Test accessory if security_system doesn't require an alarm_code."""
    entity_id = 'alarm_control_panel.test'

    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = SecuritySystem(hass, 'SecuritySystem', entity_id, 2, config)

    # Set from HomeKit
    call_arm_home = async_mock_service(hass, DOMAIN, 'alarm_arm_home')

    await hass.async_add_job(acc.char_target_state.client_update_value, 0)
    await hass.async_block_till_done()
    assert call_arm_home
    assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id
    assert ATTR_CODE not in call_arm_home[0].data
    assert acc.char_target_state.value == 0
async def test_no_alarm_code(hass, hk_driver, config, events):
    """Test accessory if security_system doesn't require an alarm_code."""
    entity_id = "alarm_control_panel.test"

    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = SecuritySystem(hass, hk_driver, "SecuritySystem", entity_id, 2, config)

    # Set from HomeKit
    call_arm_home = async_mock_service(hass, DOMAIN, "alarm_arm_home")

    acc.char_target_state.client_update_value(0)
    await hass.async_block_till_done()
    assert call_arm_home
    assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id
    assert ATTR_CODE not in call_arm_home[0].data
    assert acc.char_target_state.value == 0
    assert len(events) == 1
    assert events[-1].data[ATTR_VALUE] is None
async def test_switch_set_state(hass, hk_driver, events):
    """Test if accessory and HA are updated accordingly."""
    code = "1234"
    config = {ATTR_CODE: code}
    entity_id = "alarm_control_panel.test"

    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = SecuritySystem(hass, hk_driver, "SecuritySystem", entity_id, 2, config)
    await acc.run()
    await hass.async_block_till_done()

    assert acc.aid == 2
    assert acc.category == 11  # AlarmSystem

    assert acc.char_current_state.value == 3
    assert acc.char_target_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_AWAY)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 1

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_HOME)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 0
    assert acc.char_current_state.value == 0

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_NIGHT)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 2
    assert acc.char_current_state.value == 2

    hass.states.async_set(entity_id, STATE_ALARM_DISARMED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_TRIGGERED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 4

    hass.states.async_set(entity_id, STATE_UNKNOWN)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 4

    # Set from HomeKit
    call_arm_home = async_mock_service(hass, DOMAIN, "alarm_arm_home")
    call_arm_away = async_mock_service(hass, DOMAIN, "alarm_arm_away")
    call_arm_night = async_mock_service(hass, DOMAIN, "alarm_arm_night")
    call_disarm = async_mock_service(hass, DOMAIN, "alarm_disarm")

    acc.char_target_state.client_update_value(0)
    await hass.async_block_till_done()
    assert call_arm_home
    assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_home[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 0
    assert len(events) == 1
    assert events[-1].data[ATTR_VALUE] is None

    acc.char_target_state.client_update_value(1)
    await hass.async_block_till_done()
    assert call_arm_away
    assert call_arm_away[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_away[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 1
    assert len(events) == 2
    assert events[-1].data[ATTR_VALUE] is None

    acc.char_target_state.client_update_value(2)
    await hass.async_block_till_done()
    assert call_arm_night
    assert call_arm_night[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_night[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 2
    assert len(events) == 3
    assert events[-1].data[ATTR_VALUE] is None

    acc.char_target_state.client_update_value(3)
    await hass.async_block_till_done()
    assert call_disarm
    assert call_disarm[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_disarm[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 3
    assert len(events) == 4
    assert events[-1].data[ATTR_VALUE] is None
async def test_supported_states(hass, hk_driver, events):
    """Test different supported states."""
    code = "1234"
    config = {ATTR_CODE: code}
    entity_id = "alarm_control_panel.test"

    loader = get_loader()
    default_current_states = loader.get_char(
        "SecuritySystemCurrentState"
    ).properties.get("ValidValues")
    default_target_services = loader.get_char(
        "SecuritySystemTargetState"
    ).properties.get("ValidValues")

    # Set up a number of test configuration
    test_configs = [
        {
            "features": SUPPORT_ALARM_ARM_HOME,
            "current_values": [
                default_current_states["Disarmed"],
                default_current_states["AlarmTriggered"],
                default_current_states["StayArm"],
            ],
            "target_values": [
                default_target_services["Disarm"],
                default_target_services["StayArm"],
            ],
        },
        {
            "features": SUPPORT_ALARM_ARM_AWAY,
            "current_values": [
                default_current_states["Disarmed"],
                default_current_states["AlarmTriggered"],
                default_current_states["AwayArm"],
            ],
            "target_values": [
                default_target_services["Disarm"],
                default_target_services["AwayArm"],
            ],
        },
        {
            "features": SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY,
            "current_values": [
                default_current_states["Disarmed"],
                default_current_states["AlarmTriggered"],
                default_current_states["StayArm"],
                default_current_states["AwayArm"],
            ],
            "target_values": [
                default_target_services["Disarm"],
                default_target_services["StayArm"],
                default_target_services["AwayArm"],
            ],
        },
        {
            "features": SUPPORT_ALARM_ARM_HOME
            | SUPPORT_ALARM_ARM_AWAY
            | SUPPORT_ALARM_ARM_NIGHT,
            "current_values": [
                default_current_states["Disarmed"],
                default_current_states["AlarmTriggered"],
                default_current_states["StayArm"],
                default_current_states["AwayArm"],
                default_current_states["NightArm"],
            ],
            "target_values": [
                default_target_services["Disarm"],
                default_target_services["StayArm"],
                default_target_services["AwayArm"],
                default_target_services["NightArm"],
            ],
        },
        {
            "features": SUPPORT_ALARM_ARM_HOME
            | SUPPORT_ALARM_ARM_AWAY
            | SUPPORT_ALARM_ARM_NIGHT
            | SUPPORT_ALARM_TRIGGER,
            "current_values": [
                default_current_states["Disarmed"],
                default_current_states["AlarmTriggered"],
                default_current_states["StayArm"],
                default_current_states["AwayArm"],
                default_current_states["NightArm"],
            ],
            "target_values": [
                default_target_services["Disarm"],
                default_target_services["StayArm"],
                default_target_services["AwayArm"],
                default_target_services["NightArm"],
            ],
        },
    ]

    for test_config in test_configs:
        attrs = {"supported_features": test_config.get("features")}

        hass.states.async_set(entity_id, None, attributes=attrs)
        await hass.async_block_till_done()

        acc = SecuritySystem(hass, hk_driver, "SecuritySystem", entity_id, 2, config)
        await acc.run()
        await hass.async_block_till_done()

        valid_current_values = acc.char_current_state.properties.get("ValidValues")
        valid_target_values = acc.char_target_state.properties.get("ValidValues")

        for val in valid_current_values.values():
            assert val in test_config.get("current_values")

        for val in valid_target_values.values():
            assert val in test_config.get("target_values")
async def test_switch_set_state(hass):
    """Test if accessory and HA are updated accordingly."""
    code = '1234'
    config = {ATTR_CODE: code}
    entity_id = 'alarm_control_panel.test'

    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = SecuritySystem(hass, 'SecuritySystem', entity_id, 2, config)
    await hass.async_add_job(acc.run)

    assert acc.aid == 2
    assert acc.category == 11  # AlarmSystem

    assert acc.char_current_state.value == 3
    assert acc.char_target_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_AWAY)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 1
    assert acc.char_current_state.value == 1

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_HOME)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 0
    assert acc.char_current_state.value == 0

    hass.states.async_set(entity_id, STATE_ALARM_ARMED_NIGHT)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 2
    assert acc.char_current_state.value == 2

    hass.states.async_set(entity_id, STATE_ALARM_DISARMED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 3

    hass.states.async_set(entity_id, STATE_ALARM_TRIGGERED)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 4

    hass.states.async_set(entity_id, STATE_UNKNOWN)
    await hass.async_block_till_done()
    assert acc.char_target_state.value == 3
    assert acc.char_current_state.value == 4

    # Set from HomeKit
    call_arm_home = async_mock_service(hass, DOMAIN, 'alarm_arm_home')
    call_arm_away = async_mock_service(hass, DOMAIN, 'alarm_arm_away')
    call_arm_night = async_mock_service(hass, DOMAIN, 'alarm_arm_night')
    call_disarm = async_mock_service(hass, DOMAIN, 'alarm_disarm')

    await hass.async_add_job(acc.char_target_state.client_update_value, 0)
    await hass.async_block_till_done()
    assert call_arm_home
    assert call_arm_home[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_home[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 0

    await hass.async_add_job(acc.char_target_state.client_update_value, 1)
    await hass.async_block_till_done()
    assert call_arm_away
    assert call_arm_away[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_away[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 1

    await hass.async_add_job(acc.char_target_state.client_update_value, 2)
    await hass.async_block_till_done()
    assert call_arm_night
    assert call_arm_night[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_arm_night[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 2

    await hass.async_add_job(acc.char_target_state.client_update_value, 3)
    await hass.async_block_till_done()
    assert call_disarm
    assert call_disarm[0].data[ATTR_ENTITY_ID] == entity_id
    assert call_disarm[0].data[ATTR_CODE] == code
    assert acc.char_target_state.value == 3
    def test_switch_set_state(self):
        """Test if accessory and HA are updated accordingly."""
        acp = 'alarm_control_panel.test'

        acc = SecuritySystem(self.hass,
                             acp,
                             'SecuritySystem',
                             alarm_code='1234',
                             aid=2)
        acc.run()

        self.assertEqual(acc.aid, 2)
        self.assertEqual(acc.category, 11)  # AlarmSystem

        self.assertEqual(acc.char_current_state.value, 3)
        self.assertEqual(acc.char_target_state.value, 3)

        self.hass.states.set(acp, STATE_ALARM_ARMED_AWAY)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 1)
        self.assertEqual(acc.char_current_state.value, 1)

        self.hass.states.set(acp, STATE_ALARM_ARMED_HOME)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 0)
        self.assertEqual(acc.char_current_state.value, 0)

        self.hass.states.set(acp, STATE_ALARM_ARMED_NIGHT)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 2)
        self.assertEqual(acc.char_current_state.value, 2)

        self.hass.states.set(acp, STATE_ALARM_DISARMED)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 3)
        self.assertEqual(acc.char_current_state.value, 3)

        self.hass.states.set(acp, STATE_UNKNOWN)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 3)
        self.assertEqual(acc.char_current_state.value, 3)

        # Set from HomeKit
        acc.char_target_state.set_value(0)
        self.hass.block_till_done()
        self.assertEqual(self.events[0].data[ATTR_SERVICE], 'alarm_arm_home')
        self.assertEqual(self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE],
                         '1234')
        self.assertEqual(acc.char_target_state.value, 0)

        acc.char_target_state.set_value(1)
        self.hass.block_till_done()
        self.assertEqual(self.events[1].data[ATTR_SERVICE], 'alarm_arm_away')
        self.assertEqual(self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE],
                         '1234')
        self.assertEqual(acc.char_target_state.value, 1)

        acc.char_target_state.set_value(2)
        self.hass.block_till_done()
        self.assertEqual(self.events[2].data[ATTR_SERVICE], 'alarm_arm_night')
        self.assertEqual(self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE],
                         '1234')
        self.assertEqual(acc.char_target_state.value, 2)

        acc.char_target_state.set_value(3)
        self.hass.block_till_done()
        self.assertEqual(self.events[3].data[ATTR_SERVICE], 'alarm_disarm')
        self.assertEqual(self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE],
                         '1234')
        self.assertEqual(acc.char_target_state.value, 3)
    def test_switch_set_state(self):
        """Test if accessory and HA are updated accordingly."""
        acp = 'alarm_control_panel.test'

        acc = SecuritySystem(self.hass, acp, 'SecuritySystem',
                             alarm_code='1234', aid=2)
        acc.run()

        self.assertEqual(acc.aid, 2)
        self.assertEqual(acc.category, 11)  # AlarmSystem

        self.assertEqual(acc.char_current_state.value, 3)
        self.assertEqual(acc.char_target_state.value, 3)

        self.hass.states.set(acp, STATE_ALARM_ARMED_AWAY)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 1)
        self.assertEqual(acc.char_current_state.value, 1)

        self.hass.states.set(acp, STATE_ALARM_ARMED_HOME)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 0)
        self.assertEqual(acc.char_current_state.value, 0)

        self.hass.states.set(acp, STATE_ALARM_ARMED_NIGHT)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 2)
        self.assertEqual(acc.char_current_state.value, 2)

        self.hass.states.set(acp, STATE_ALARM_DISARMED)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 3)
        self.assertEqual(acc.char_current_state.value, 3)

        self.hass.states.set(acp, STATE_UNKNOWN)
        self.hass.block_till_done()
        self.assertEqual(acc.char_target_state.value, 3)
        self.assertEqual(acc.char_current_state.value, 3)

        # Set from HomeKit
        acc.char_target_state.set_value(0)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE], 'alarm_arm_home')
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE], '1234')
        self.assertEqual(acc.char_target_state.value, 0)

        acc.char_target_state.set_value(1)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[1].data[ATTR_SERVICE], 'alarm_arm_away')
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE], '1234')
        self.assertEqual(acc.char_target_state.value, 1)

        acc.char_target_state.set_value(2)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[2].data[ATTR_SERVICE], 'alarm_arm_night')
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE], '1234')
        self.assertEqual(acc.char_target_state.value, 2)

        acc.char_target_state.set_value(3)
        self.hass.block_till_done()
        self.assertEqual(
            self.events[3].data[ATTR_SERVICE], 'alarm_disarm')
        self.assertEqual(
            self.events[0].data[ATTR_SERVICE_DATA][ATTR_CODE], '1234')
        self.assertEqual(acc.char_target_state.value, 3)