Esempio n. 1
0
async def test_call_service(opp, hk_driver, events):
    """Test call_service method."""
    entity_id = "homekit.accessory"
    opp.states.async_set(entity_id, None)
    await opp.async_block_till_done()

    acc = HomeAccessory(opp, hk_driver, "Home Accessory", entity_id, 2, {})
    call_service = async_mock_service(opp, "cover", "open_cover")

    test_domain = "cover"
    test_service = "open_cover"
    test_value = "value"

    acc.async_call_service(test_domain, test_service,
                           {ATTR_ENTITY_ID: entity_id}, test_value)
    await opp.async_block_till_done()

    assert len(events) == 1
    assert events[0].data == {
        ATTR_ENTITY_ID: acc.entity_id,
        ATTR_DISPLAY_NAME: acc.display_name,
        ATTR_SERVICE: test_service,
        ATTR_VALUE: test_value,
    }

    assert len(call_service) == 1
    assert call_service[0].domain == test_domain
    assert call_service[0].service == test_service
    assert call_service[0].data == {ATTR_ENTITY_ID: entity_id}
Esempio n. 2
0
async def test_accessory_cancels_track_state_change_on_stop(opp, hk_driver):
    """Ensure homekit state changed listeners are unsubscribed on reload."""
    entity_id = "sensor.accessory"
    opp.states.async_set(entity_id, None)
    acc = HomeAccessory(opp, hk_driver, "Home Accessory", entity_id, 2,
                        {"platform": "isy994"})
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        await acc.run()
    assert len(opp.data[TRACK_STATE_CHANGE_CALLBACKS][entity_id]) == 1
    acc.async_stop()
    assert entity_id not in opp.data[TRACK_STATE_CHANGE_CALLBACKS]
Esempio n. 3
0
async def test_battery_appears_after_startup(opp, hk_driver, caplog):
    """Test battery level appears after homekit is started."""
    entity_id = "homekit.accessory"
    opp.states.async_set(entity_id, None, {})
    await opp.async_block_till_done()

    acc = HomeAccessory(opp, hk_driver, "Accessory without battery", entity_id,
                        2, {})
    assert acc._char_battery is None

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_battery is None

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        opp.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 15})
        await opp.async_block_till_done()
    assert acc._char_battery is None

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        opp.states.async_remove(entity_id)
        await opp.async_block_till_done()
    assert acc._char_battery is None
Esempio n. 4
0
async def test_missing_linked_battery_charging_sensor(opp, hk_driver, caplog):
    """Test battery service with linked_battery_charging_sensor that is mapping to a missing entity."""
    entity_id = "homekit.accessory"
    linked_battery_charging_sensor = "binary_sensor.battery_charging"
    opp.states.async_set(entity_id, "open", {ATTR_BATTERY_LEVEL: 100})
    await opp.async_block_till_done()

    acc = HomeAccessory(
        opp,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_CHARGING_SENSOR: linked_battery_charging_sensor},
    )
    assert acc.linked_battery_charging_sensor is None

    # Make sure we don't throw if the linked_battery_charging_sensor
    # is removed
    opp.states.async_remove(linked_battery_charging_sensor)
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        await acc.run()
        await opp.async_block_till_done()

    # Make sure we don't throw if the entity_id
    # is removed
    opp.states.async_remove(entity_id)
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        await acc.run()
        await opp.async_block_till_done()
Esempio n. 5
0
async def test_linked_battery_charging_sensor(opp, hk_driver, caplog):
    """Test battery service with linked_battery_charging_sensor."""
    entity_id = "homekit.accessory"
    linked_battery_charging_sensor = "binary_sensor.battery_charging"
    opp.states.async_set(entity_id, "open", {ATTR_BATTERY_LEVEL: 100})
    opp.states.async_set(linked_battery_charging_sensor, STATE_ON, None)
    await opp.async_block_till_done()

    acc = HomeAccessory(
        opp,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_CHARGING_SENSOR: linked_battery_charging_sensor},
    )
    assert acc.linked_battery_charging_sensor == linked_battery_charging_sensor

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 1

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_set(linked_battery_charging_sensor, STATE_OFF, None)
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_charging.value == 0

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_set(linked_battery_charging_sensor, STATE_ON, None)
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_charging.value == 1

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_remove(linked_battery_charging_sensor)
        await acc.run()
        await opp.async_block_till_done()
    assert acc._char_charging.value == 1
Esempio n. 6
0
async def test_missing_linked_battery_sensor(opp, hk_driver, caplog):
    """Test battery service with missing linked_battery_sensor."""
    entity_id = "homekit.accessory"
    linked_battery = "sensor.battery"
    opp.states.async_set(entity_id, "open")
    await opp.async_block_till_done()

    acc = HomeAccessory(
        opp,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_SENSOR: linked_battery},
    )
    assert not acc.linked_battery_sensor

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

    assert not acc.linked_battery_sensor
    assert acc._char_battery is None
    assert acc._char_low_battery is None
    assert acc._char_charging is None

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_remove(entity_id)
        await acc.run()
        await opp.async_block_till_done()

    assert not acc.linked_battery_sensor
    assert acc._char_battery is None
    assert acc._char_low_battery is None
    assert acc._char_charging is None
Esempio n. 7
0
async def test_home_accessory(opp, hk_driver):
    """Test HomeAccessory class."""
    entity_id = "sensor.accessory"
    entity_id2 = "light.accessory"

    opp.states.async_set(entity_id, None)
    opp.states.async_set(entity_id2, STATE_UNAVAILABLE)

    await opp.async_block_till_done()

    acc = HomeAccessory(opp, hk_driver, "Home Accessory", entity_id, 2,
                        {"platform": "isy994"})
    assert acc.opp == opp
    assert acc.display_name == "Home Accessory"
    assert acc.aid == 2
    assert acc.available is True
    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 == "Isy994"
    assert serv.get_characteristic(CHAR_MODEL).value == "Sensor"
    assert serv.get_characteristic(
        CHAR_SERIAL_NUMBER).value == "sensor.accessory"

    acc2 = HomeAccessory(opp, hk_driver, "Home Accessory", entity_id2, 3, {})
    serv = acc2.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_NAME).value == "Home Accessory"
    assert serv.get_characteristic(
        CHAR_MANUFACTURER).value == f"{MANUFACTURER} Light"
    assert serv.get_characteristic(CHAR_MODEL).value == "Light"
    assert serv.get_characteristic(
        CHAR_SERIAL_NUMBER).value == "light.accessory"

    acc3 = HomeAccessory(
        opp,
        hk_driver,
        "Home Accessory",
        entity_id2,
        3,
        {
            ATTR_MODEL: "Awesome",
            ATTR_MANUFACTURER: "Lux Brands",
            ATTR_SOFTWARE_VERSION: "0.4.3",
            ATTR_INTERGRATION: "luxe",
        },
    )
    assert acc3.available is False
    serv = acc3.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_NAME).value == "Home Accessory"
    assert serv.get_characteristic(CHAR_MANUFACTURER).value == "Lux Brands"
    assert serv.get_characteristic(CHAR_MODEL).value == "Awesome"
    assert serv.get_characteristic(
        CHAR_SERIAL_NUMBER).value == "light.accessory"

    opp.states.async_set(entity_id, "on")
    await opp.async_block_till_done()
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

        opp.states.async_remove(entity_id)
        await opp.async_block_till_done()
        assert mock_async_update_state.call_count == 1

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

    # Test model name from domain
    entity_id = "test_model.demo"
    opp.states.async_set(entity_id, None)
    await opp.async_block_till_done()
    acc = HomeAccessory(opp, hk_driver, "test_name", entity_id, 2, None)
    serv = acc.services[0]  # SERV_ACCESSORY_INFO
    assert serv.get_characteristic(CHAR_MODEL).value == "Test Model"
Esempio n. 8
0
async def test_linked_battery_sensor(opp, hk_driver, caplog):
    """Test battery service with linked_battery_sensor."""
    entity_id = "homekit.accessory"
    linked_battery = "sensor.battery"
    opp.states.async_set(entity_id, "open", {ATTR_BATTERY_LEVEL: 100})
    opp.states.async_set(linked_battery, 50, None)
    await opp.async_block_till_done()

    acc = HomeAccessory(
        opp,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {CONF_LINKED_BATTERY_SENSOR: linked_battery},
    )
    assert acc.linked_battery_sensor == linked_battery

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_battery.value == 50
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    opp.states.async_set(linked_battery, 10, None)
    await opp.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
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        opp.states.async_set(entity_id, "open", {ATTR_BATTERY_LEVEL: 90})
        await opp.async_block_till_done()
    assert acc._char_battery.value == 10

    # Test none numeric state for linked_battery
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        opp.states.async_set(linked_battery, "error", None)
        await opp.async_block_till_done()
    assert acc._char_battery.value == 10
    assert "ERROR" not in caplog.text

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

    acc = HomeAccessory(
        opp,
        hk_driver,
        "Battery Service",
        entity_id,
        2,
        {
            CONF_LINKED_BATTERY_SENSOR: linked_battery,
            CONF_LOW_BATTERY_THRESHOLD: 50
        },
    )
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_battery.value == 20
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 1

    opp.states.async_set(linked_battery, 100, {ATTR_BATTERY_CHARGING: False})
    await opp.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0

    opp.states.async_remove(linked_battery)
    await opp.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0
Esempio n. 9
0
async def test_battery_service(opp, hk_driver, caplog):
    """Test battery service."""
    entity_id = "homekit.accessory"
    opp.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 50})
    await opp.async_block_till_done()

    acc = HomeAccessory(opp, hk_driver, "Battery Service", entity_id, 2, None)
    assert acc._char_battery.value == 0
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

    assert acc._char_battery.value == 50
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 2

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: 15})
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

    assert acc._char_battery.value == 15
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 2

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_set(entity_id, None, {ATTR_BATTERY_LEVEL: "error"})
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

    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
    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        opp.states.async_set(entity_id, None, {
            ATTR_BATTERY_LEVEL: 10,
            ATTR_BATTERY_CHARGING: True
        })
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        acc = HomeAccessory(opp, hk_driver, "Battery Service", entity_id, 2,
                            None)
        assert acc._char_battery.value == 0
        assert acc._char_low_battery.value == 0
        assert acc._char_charging.value == 2

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ) as mock_async_update_state:
        await acc.run()
        await opp.async_block_till_done()
        state = opp.states.get(entity_id)
        mock_async_update_state.assert_called_with(state)
    assert acc._char_battery.value == 10
    assert acc._char_low_battery.value == 1
    assert acc._char_charging.value == 1

    with patch(
            "openpeerpower.components.homekit.accessories.HomeAccessory.async_update_state"
    ):
        opp.states.async_set(entity_id, None, {
            ATTR_BATTERY_LEVEL: 100,
            ATTR_BATTERY_CHARGING: False
        })
        await opp.async_block_till_done()
    assert acc._char_battery.value == 100
    assert acc._char_low_battery.value == 0
    assert acc._char_charging.value == 0