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
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
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
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")
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
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'
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'
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