Add linked battery sensor to HomeKit (#22788)

This commit is contained in:
Austin Drummond 2019-04-09 17:13:48 -04:00 committed by cdce8p
parent 6244a397b1
commit c4e31bc4df
5 changed files with 103 additions and 16 deletions

View file

@ -13,7 +13,7 @@ from homeassistant.components.homekit.const import (
ATTR_DISPLAY_NAME, ATTR_VALUE,
BRIDGE_MODEL, BRIDGE_NAME, BRIDGE_SERIAL_NUMBER, CHAR_FIRMWARE_REVISION,
CHAR_MANUFACTURER, CHAR_MODEL, CHAR_NAME, CHAR_SERIAL_NUMBER,
MANUFACTURER, SERV_ACCESSORY_INFO)
CONF_LINKED_BATTERY_SENSOR, MANUFACTURER, SERV_ACCESSORY_INFO)
from homeassistant.const import (
__version__, ATTR_BATTERY_CHARGING, ATTR_BATTERY_LEVEL, ATTR_ENTITY_ID,
ATTR_SERVICE, ATTR_NOW, EVENT_TIME_CHANGED)
@ -156,6 +156,61 @@ async def test_battery_service(hass, hk_driver, caplog):
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
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})
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 == 0
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_call_service(hass, hk_driver, events):
"""Test call_service method."""
entity_id = 'homekit.accessory'

View file

@ -3,9 +3,9 @@ import pytest
import voluptuous as vol
from homeassistant.components.homekit.const import (
CONF_FEATURE, CONF_FEATURE_LIST, FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
HOMEKIT_NOTIFY_ID, TYPE_FAUCET, TYPE_OUTLET, TYPE_SHOWER, TYPE_SPRINKLER,
TYPE_SWITCH, TYPE_VALVE)
CONF_FEATURE, CONF_FEATURE_LIST, CONF_LINKED_BATTERY_SENSOR,
FEATURE_ON_OFF, FEATURE_PLAY_PAUSE, HOMEKIT_NOTIFY_ID, TYPE_FAUCET,
TYPE_OUTLET, TYPE_SHOWER, TYPE_SPRINKLER, TYPE_SWITCH, TYPE_VALVE)
from homeassistant.components.homekit.util import (
HomeKitSpeedMapping, SpeedRange, convert_to_float, density_to_air_quality,
dismiss_setup_message, show_setup_message, temperature_to_homekit,
@ -25,6 +25,9 @@ def test_validate_entity_config():
"""Test validate entities."""
configs = [None, [], 'string', 12345,
{'invalid_entity_id': {}}, {'demo.test': 1},
{'binary_sensor.demo': {CONF_LINKED_BATTERY_SENSOR: None}},
{'binary_sensor.demo': {CONF_LINKED_BATTERY_SENSOR:
'switch.demo'}},
{'demo.test': 'test'}, {'demo.test': [1, 2]},
{'demo.test': None}, {'demo.test': {CONF_NAME: None}},
{'media_player.test': {CONF_FEATURE_LIST: [
@ -42,6 +45,11 @@ def test_validate_entity_config():
assert vec({'demo.test': {CONF_NAME: 'Name'}}) == \
{'demo.test': {CONF_NAME: 'Name'}}
assert vec({'binary_sensor.demo': {CONF_LINKED_BATTERY_SENSOR:
'sensor.demo_battery'}}) == \
{'binary_sensor.demo': {CONF_LINKED_BATTERY_SENSOR:
'sensor.demo_battery'}}
assert vec({'alarm_control_panel.demo': {}}) == \
{'alarm_control_panel.demo': {ATTR_CODE: None}}
assert vec({'alarm_control_panel.demo': {ATTR_CODE: '1234'}}) == \