Exemplo n.º 1
0
async def test_battery_service(hass, hk_driver, caplog):
    """Test battery service."""
    entity_id = "homekit.accessory"
    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 50})
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, "Battery Service", entity_id, 2, None)
    acc.update_state = lambda x: None
    assert acc._char_battery.value == 0
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 50
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 15})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 15
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 2

    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: "error"})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 15
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 2
    assert "ERROR" not in caplog.text

    # Test charging
    hass.states.async_set(entity_id, None, {
        ATTR_BATTERY_LEVEL: 10,
        ATTR_BATTERY_CHARGING: True
    })
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, "Battery Service", entity_id, 2, None)
    acc.update_state = lambda x: None
    assert acc._char_battery.value == 0
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 10
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 1

    hass.states.async_set(entity_id, None, {
        ATTR_BATTERY_LEVEL: 100,
        ATTR_BATTERY_CHARGING: False
    })
    await hass.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0
Exemplo n.º 2
0
async def test_battery_service(hass, hk_driver, caplog):
    """Test battery service."""
    entity_id = 'homekit.accessory'
    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 50})
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, 'Battery Service', entity_id, 2, None)
    acc.update_state = lambda x: None
    assert acc._char_battery.value == 0
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 50
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 15})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 15
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 2

    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 'error'})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 15
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 2
    assert 'ERROR' not in caplog.text

    # Test charging
    hass.states.async_set(entity_id, None, {
        ATTR_BATTERY_LEVEL: 10, ATTR_BATTERY_CHARGING: True})
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, 'Battery Service', entity_id, 2, None)
    acc.update_state = lambda x: None
    assert acc._char_battery.value == 0
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 10
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 1

    hass.states.async_set(entity_id, None, {
        ATTR_BATTERY_LEVEL: 100, ATTR_BATTERY_CHARGING: False})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0
Exemplo n.º 3
0
async def test_linked_battery_sensor(hass, hk_driver, caplog):
    """Test battery service with linked_battery_sensor."""
    entity_id = 'homekit.accessory'
    linked_battery = 'sensor.battery'
    hass.states.async_set(entity_id, 'open', {ATTR_BATTERY_LEVEL: 100})
    hass.states.async_set(linked_battery, 50, None)
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, 'Battery Service', entity_id, 2,
                        {CONF_LINKED_BATTERY_SENSOR: linked_battery})
    acc.update_state = lambda x: None
    assert acc.linked_battery_sensor == linked_battery

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 50
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    hass.states.async_set(linked_battery, 10, None)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 10
    assert acc._char_low_battery.value == 1

    # Ignore battery change on entity if it has linked_battery
    hass.states.async_set(entity_id, 'open', {ATTR_BATTERY_LEVEL: 90})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 10

    # Test none numeric state for linked_battery
    hass.states.async_set(linked_battery, 'error', None)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 10
    assert 'ERROR' not in caplog.text

    # Test charging & low battery threshold
    hass.states.async_set(linked_battery, 20, {ATTR_BATTERY_CHARGING: True})
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, 'Battery Service', entity_id, 2,
                        {CONF_LINKED_BATTERY_SENSOR: linked_battery,
                         CONF_LOW_BATTERY_THRESHOLD: 50})
    acc.update_state = lambda x: None
    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()
    assert acc._char_battery.value == 20
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 1

    hass.states.async_set(linked_battery, 100, {ATTR_BATTERY_CHARGING: False})
    await hass.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0
Exemplo n.º 4
0
async def test_missing_linked_battery_sensor(hass, hk_driver, caplog):
    """Test battery service with mising linked_battery_sensor."""
    entity_id = "homekit.accessory"
    linked_battery = "sensor.battery"
    hass.states.async_set(entity_id, "open")
    await hass.async_block_till_done()

    acc = HomeAccessory(
        hass,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_SENSOR: linked_battery},
    )
    acc.update_state = lambda x: None
    assert not acc.linked_battery_sensor

    await hass.async_add_job(acc.run)
    await hass.async_block_till_done()

    assert not acc.linked_battery_sensor
    assert not hasattr(acc, "_char_battery")
    assert not hasattr(acc, "_char_low_battery")
    assert not hasattr(acc, "_char_charging")
Exemplo n.º 5
0
async def test_linked_battery_charging_sensor(hass, hk_driver, caplog):
    """Test battery service with linked_battery_charging_sensor."""
    entity_id = "homekit.accessory"
    linked_battery_charging_sensor = "binary_sensor.battery_charging"
    hass.states.async_set(entity_id, "open", {ATTR_BATTERY_LEVEL: 100})
    hass.states.async_set(linked_battery_charging_sensor, STATE_ON, None)
    await hass.async_block_till_done()

    acc = HomeAccessory(
        hass,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_CHARGING_SENSOR: linked_battery_charging_sensor},
    )
    acc.update_state = lambda x: None
    assert acc.linked_battery_charging_sensor == linked_battery_charging_sensor

    await acc.run_handler()
    await hass.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 1

    hass.states.async_set(linked_battery_charging_sensor, STATE_OFF, None)
    await acc.run_handler()
    await hass.async_block_till_done()
    assert acc._char_charging.value == 0

    hass.states.async_set(linked_battery_charging_sensor, STATE_ON, None)
    await acc.run_handler()
    await hass.async_block_till_done()
    assert acc._char_charging.value == 1
Exemplo n.º 6
0
async def test_home_accessory(hass, hk_driver):
    """Test HomeAccessory class."""
    entity_id = "homekit.accessory"
    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, "Home Accessory", entity_id, 2, None)
    assert acc.hass == hass
    assert acc.display_name == "Home Accessory"
    assert acc.aid == 2
    assert acc.category == 1  # Category.OTHER
    assert len(acc.services) == 1
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.display_name == SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_NAME).value == "Home Accessory"
    assert serv.get_characteristic(CHAR_MANUFACTURER).value == MANUFACTURER
    assert serv.get_characteristic(CHAR_MODEL).value == "Homekit"
    assert serv.get_characteristic(
        CHAR_SERIAL_NUMBER).value == "homekit.accessory"

    hass.states.async_set(entity_id, "on")
    await hass.async_block_till_done()
    with patch(
            "homeassistant.components.homekit.accessories.HomeAccessory.update_state"
    ) as mock_update_state:
        await acc.run_handler()
        await hass.async_block_till_done()
        state = hass.states.get(entity_id)
        mock_update_state.assert_called_with(state)

        hass.states.async_remove(entity_id)
        await hass.async_block_till_done()
        assert mock_update_state.call_count == 1

    with pytest.raises(NotImplementedError):
        acc.update_state("new_state")

    # Test model name from domain
    entity_id = "test_model.demo"
    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = HomeAccessory(hass, hk_driver, "test_name", entity_id, 2, None)
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_MODEL).value == "Test Model"
async def test_home_accessory(hass, hk_driver):
    """Test HomeAccessory class."""
    entity_id = 'homekit.accessory'
    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, 'Home Accessory', entity_id, 2, None)
    assert acc.hass == hass
    assert acc.display_name == 'Home Accessory'
    assert acc.aid == 2
    assert acc.category == 1  # Category.OTHER
    assert len(acc.services) == 1
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.display_name == SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_NAME).value == 'Home Accessory'
    assert serv.get_characteristic(CHAR_MANUFACTURER).value == MANUFACTURER
    assert serv.get_characteristic(CHAR_MODEL).value == 'Homekit'
    assert serv.get_characteristic(CHAR_SERIAL_NUMBER).value == \
        'homekit.accessory'

    hass.states.async_set(entity_id, 'on')
    await hass.async_block_till_done()
    with patch('homeassistant.components.homekit.accessories.'
               'HomeAccessory.update_state') as mock_update_state:
        await hass.async_add_job(acc.run)
        await hass.async_block_till_done()
        state = hass.states.get(entity_id)
        mock_update_state.assert_called_with(state)

        hass.states.async_remove(entity_id)
        await hass.async_block_till_done()
        assert mock_update_state.call_count == 1

    with pytest.raises(NotImplementedError):
        acc.update_state('new_state')

    # Test model name from domain
    entity_id = 'test_model.demo'
    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()
    acc = HomeAccessory(hass, hk_driver, 'test_name', entity_id, 2, None)
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_MODEL).value == 'Test Model'
Exemplo n.º 8
0
async def test_home_accessory(hass):
    """Test HomeAccessory class."""
    entity_id = 'homekit.accessory'
    hass.states.async_set(entity_id, None)
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, 'Home Accessory', entity_id, 2, None)
    assert acc.hass == hass
    assert acc.display_name == 'Home Accessory'
    assert acc.aid == 2
    assert acc.category == 1  # Category.OTHER
    assert len(acc.services) == 1
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.display_name == SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_NAME).value == 'Home Accessory'
    assert serv.get_characteristic(CHAR_MANUFACTURER).value == MANUFACTURER
    assert serv.get_characteristic(CHAR_MODEL).value == 'Homekit'
    assert serv.get_characteristic(CHAR_SERIAL_NUMBER).value == \
        'homekit.accessory'

    hass.states.async_set(entity_id, 'on')
    await hass.async_block_till_done()
    with patch('homeassistant.components.homekit.accessories.'
               'HomeAccessory.update_state') as mock_update_state:
        await hass.async_add_job(acc.run)
        state = hass.states.get(entity_id)
        mock_update_state.assert_called_with(state)

        hass.states.async_remove(entity_id)
        await hass.async_block_till_done()
        assert mock_update_state.call_count == 1

    with pytest.raises(NotImplementedError):
        acc.update_state('new_state')

    # Test model name from domain
    acc = HomeAccessory('hass', 'test_name', 'test_model.demo', 2, None)
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_MODEL).value == 'Test Model'
Exemplo n.º 9
0
async def test_battery_appears_after_startup(hass, hk_driver, caplog):
    """Test battery level appears after homekit is started."""
    entity_id = "homekit.accessory"
    hass.states.async_set(entity_id, None, {})
    await hass.async_block_till_done()

    acc = HomeAccessory(hass, hk_driver, "Accessory without battery",
                        entity_id, 2, None)
    acc.update_state = lambda x: None
    assert acc._char_battery is None

    await acc.run_handler()
    await hass.async_block_till_done()
    assert acc._char_battery is None

    hass.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 15})
    await hass.async_block_till_done()
    assert acc._char_battery is None