Clean up HomeKit accessory information characteristics (#14114)

* Update accessory information characteristics
* Add firmware revision characteristic
This commit is contained in:
Matt Schmitt 2018-04-28 17:17:30 -04:00 committed by cdce8p
parent 84f163252a
commit 2091f86e25
3 changed files with 34 additions and 21 deletions

View file

@ -7,15 +7,17 @@ import logging
from pyhap.accessory import Accessory, Bridge, Category from pyhap.accessory import Accessory, Bridge, Category
from pyhap.accessory_driver import AccessoryDriver from pyhap.accessory_driver import AccessoryDriver
from homeassistant.const import __version__
from homeassistant.core import callback as ha_callback from homeassistant.core import callback as ha_callback
from homeassistant.core import split_entity_id
from homeassistant.helpers.event import ( from homeassistant.helpers.event import (
async_track_state_change, track_point_in_utc_time) async_track_state_change, track_point_in_utc_time)
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from .const import ( from .const import (
DEBOUNCE_TIMEOUT, BRIDGE_MODEL, BRIDGE_NAME, MANUFACTURER, DEBOUNCE_TIMEOUT, BRIDGE_MODEL, BRIDGE_NAME, BRIDGE_SERIAL_NUMBER,
SERV_ACCESSORY_INFO, CHAR_MANUFACTURER, MANUFACTURER, SERV_ACCESSORY_INFO, CHAR_FIRMWARE_REVISION,
CHAR_MODEL, CHAR_NAME, CHAR_SERIAL_NUMBER) CHAR_MANUFACTURER, CHAR_MODEL, CHAR_NAME, CHAR_SERIAL_NUMBER)
from .util import ( from .util import (
show_setup_message, dismiss_setup_message) show_setup_message, dismiss_setup_message)
@ -84,14 +86,17 @@ def setup_char(char_name, service, value=None, properties=None, callback=None):
return char return char
def set_accessory_info(acc, name, model, manufacturer=MANUFACTURER, def set_accessory_info(acc, name, model, serial_number,
serial_number='0000'): manufacturer=MANUFACTURER,
firmware_revision=__version__):
"""Set the default accessory information.""" """Set the default accessory information."""
service = acc.get_service(SERV_ACCESSORY_INFO) service = acc.get_service(SERV_ACCESSORY_INFO)
service.get_characteristic(CHAR_NAME).set_value(name) service.get_characteristic(CHAR_NAME).set_value(name)
service.get_characteristic(CHAR_MODEL).set_value(model) service.get_characteristic(CHAR_MODEL).set_value(model)
service.get_characteristic(CHAR_MANUFACTURER).set_value(manufacturer) service.get_characteristic(CHAR_MANUFACTURER).set_value(manufacturer)
service.get_characteristic(CHAR_SERIAL_NUMBER).set_value(serial_number) service.get_characteristic(CHAR_SERIAL_NUMBER).set_value(serial_number)
service.get_characteristic(CHAR_FIRMWARE_REVISION) \
.set_value(firmware_revision)
class HomeAccessory(Accessory): class HomeAccessory(Accessory):
@ -100,7 +105,8 @@ class HomeAccessory(Accessory):
def __init__(self, hass, name, entity_id, aid, category): def __init__(self, hass, name, entity_id, aid, category):
"""Initialize a Accessory object.""" """Initialize a Accessory object."""
super().__init__(name, aid=aid) super().__init__(name, aid=aid)
set_accessory_info(self, name, model=entity_id) domain = split_entity_id(entity_id)[0].replace("_", " ").title()
set_accessory_info(self, name, model=domain, serial_number=entity_id)
self.category = getattr(Category, category, Category.OTHER) self.category = getattr(Category, category, Category.OTHER)
self.entity_id = entity_id self.entity_id = entity_id
self.hass = hass self.hass = hass
@ -137,7 +143,8 @@ class HomeBridge(Bridge):
def __init__(self, hass, name=BRIDGE_NAME): def __init__(self, hass, name=BRIDGE_NAME):
"""Initialize a Bridge object.""" """Initialize a Bridge object."""
super().__init__(name) super().__init__(name)
set_accessory_info(self, name, model=BRIDGE_MODEL) set_accessory_info(self, name, model=BRIDGE_MODEL,
serial_number=BRIDGE_SERIAL_NUMBER)
self.hass = hass self.hass = hass
def _set_services(self): def _set_services(self):

View file

@ -18,9 +18,10 @@ DEFAULT_PORT = 51827
SERVICE_HOMEKIT_START = 'start' SERVICE_HOMEKIT_START = 'start'
# #### STRING CONSTANTS #### # #### STRING CONSTANTS ####
BRIDGE_MODEL = 'homekit.bridge' BRIDGE_MODEL = 'Bridge'
BRIDGE_NAME = 'Home Assistant' BRIDGE_NAME = 'Home Assistant Bridge'
MANUFACTURER = 'HomeAssistant' BRIDGE_SERIAL_NUMBER = 'homekit.bridge'
MANUFACTURER = 'Home Assistant'
# #### Categories #### # #### Categories ####
CATEGORY_ALARM_SYSTEM = 'ALARM_SYSTEM' CATEGORY_ALARM_SYSTEM = 'ALARM_SYSTEM'
@ -74,6 +75,7 @@ CHAR_CURRENT_POSITION = 'CurrentPosition' # Int | [0, 100]
CHAR_CURRENT_HUMIDITY = 'CurrentRelativeHumidity' # percent CHAR_CURRENT_HUMIDITY = 'CurrentRelativeHumidity' # percent
CHAR_CURRENT_SECURITY_STATE = 'SecuritySystemCurrentState' CHAR_CURRENT_SECURITY_STATE = 'SecuritySystemCurrentState'
CHAR_CURRENT_TEMPERATURE = 'CurrentTemperature' CHAR_CURRENT_TEMPERATURE = 'CurrentTemperature'
CHAR_FIRMWARE_REVISION = 'FirmwareRevision'
CHAR_HEATING_THRESHOLD_TEMPERATURE = 'HeatingThresholdTemperature' CHAR_HEATING_THRESHOLD_TEMPERATURE = 'HeatingThresholdTemperature'
CHAR_HUE = 'Hue' # arcdegress | [0, 360] CHAR_HUE = 'Hue' # arcdegress | [0, 360]
CHAR_LEAK_DETECTED = 'LeakDetected' CHAR_LEAK_DETECTED = 'LeakDetected'

View file

@ -10,8 +10,8 @@ from homeassistant.components.homekit.accessories import (
add_preload_service, set_accessory_info, add_preload_service, set_accessory_info,
debounce, HomeAccessory, HomeBridge, HomeDriver) debounce, HomeAccessory, HomeBridge, HomeDriver)
from homeassistant.components.homekit.const import ( from homeassistant.components.homekit.const import (
BRIDGE_MODEL, BRIDGE_NAME, SERV_ACCESSORY_INFO, BRIDGE_MODEL, BRIDGE_NAME, SERV_ACCESSORY_INFO, CHAR_FIRMWARE_REVISION,
CHAR_MANUFACTURER, CHAR_MODEL, CHAR_NAME, CHAR_SERIAL_NUMBER) CHAR_MANUFACTURER, CHAR_MODEL, CHAR_NAME, CHAR_SERIAL_NUMBER, MANUFACTURER)
from homeassistant.const import ATTR_NOW, EVENT_TIME_CHANGED from homeassistant.const import ATTR_NOW, EVENT_TIME_CHANGED
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
@ -92,26 +92,30 @@ class TestAccessories(unittest.TestCase):
"""Test setting the basic accessory information.""" """Test setting the basic accessory information."""
# Test HomeAccessory # Test HomeAccessory
acc = HomeAccessory('HA', 'Home Accessory', 'homekit.accessory', 2, '') acc = HomeAccessory('HA', 'Home Accessory', 'homekit.accessory', 2, '')
set_accessory_info(acc, 'name', 'model', 'manufacturer', '0000') set_accessory_info(acc, 'name', 'model', '0000', MANUFACTURER, '1.2.3')
serv = acc.get_service(SERV_ACCESSORY_INFO) serv = acc.get_service(SERV_ACCESSORY_INFO)
self.assertEqual(serv.get_characteristic(CHAR_NAME).value, 'name') self.assertEqual(serv.get_characteristic(CHAR_NAME).value, 'name')
self.assertEqual(serv.get_characteristic(CHAR_MODEL).value, 'model') self.assertEqual(serv.get_characteristic(CHAR_MODEL).value, 'model')
self.assertEqual(
serv.get_characteristic(CHAR_MANUFACTURER).value, 'manufacturer')
self.assertEqual( self.assertEqual(
serv.get_characteristic(CHAR_SERIAL_NUMBER).value, '0000') serv.get_characteristic(CHAR_SERIAL_NUMBER).value, '0000')
self.assertEqual(
serv.get_characteristic(CHAR_MANUFACTURER).value, MANUFACTURER)
self.assertEqual(
serv.get_characteristic(CHAR_FIRMWARE_REVISION).value, '1.2.3')
# Test HomeBridge # Test HomeBridge
acc = HomeBridge('hass') acc = HomeBridge('hass')
set_accessory_info(acc, 'name', 'model', 'manufacturer', '0000') set_accessory_info(acc, 'name', 'model', '0000', MANUFACTURER, '1.2.3')
serv = acc.get_service(SERV_ACCESSORY_INFO) serv = acc.get_service(SERV_ACCESSORY_INFO)
self.assertEqual(serv.get_characteristic(CHAR_MODEL).value, 'model') self.assertEqual(serv.get_characteristic(CHAR_MODEL).value, 'model')
self.assertEqual(
serv.get_characteristic(CHAR_MANUFACTURER).value, 'manufacturer')
self.assertEqual( self.assertEqual(
serv.get_characteristic(CHAR_SERIAL_NUMBER).value, '0000') serv.get_characteristic(CHAR_SERIAL_NUMBER).value, '0000')
self.assertEqual(
serv.get_characteristic(CHAR_MANUFACTURER).value, MANUFACTURER)
self.assertEqual(
serv.get_characteristic(CHAR_FIRMWARE_REVISION).value, '1.2.3')
def test_home_accessory(self): def test_home_accessory(self):
"""Test HomeAccessory class.""" """Test HomeAccessory class."""
@ -124,7 +128,7 @@ class TestAccessories(unittest.TestCase):
self.assertEqual(len(acc.services), 1) self.assertEqual(len(acc.services), 1)
serv = acc.services[0] # SERV_ACCESSORY_INFO serv = acc.services[0] # SERV_ACCESSORY_INFO
self.assertEqual( self.assertEqual(
serv.get_characteristic(CHAR_MODEL).value, 'homekit.accessory') serv.get_characteristic(CHAR_MODEL).value, 'Homekit')
hass.states.set('homekit.accessory', 'on') hass.states.set('homekit.accessory', 'on')
hass.block_till_done() hass.block_till_done()
@ -132,13 +136,13 @@ class TestAccessories(unittest.TestCase):
hass.states.set('homekit.accessory', 'off') hass.states.set('homekit.accessory', 'off')
hass.block_till_done() hass.block_till_done()
acc = HomeAccessory('hass', 'test_name', 'test_model', 2, '') acc = HomeAccessory('hass', 'test_name', 'test_model.demo', 2, '')
self.assertEqual(acc.display_name, 'test_name') self.assertEqual(acc.display_name, 'test_name')
self.assertEqual(acc.aid, 2) self.assertEqual(acc.aid, 2)
self.assertEqual(len(acc.services), 1) self.assertEqual(len(acc.services), 1)
serv = acc.services[0] # SERV_ACCESSORY_INFO serv = acc.services[0] # SERV_ACCESSORY_INFO
self.assertEqual( self.assertEqual(
serv.get_characteristic(CHAR_MODEL).value, 'test_model') serv.get_characteristic(CHAR_MODEL).value, 'Test Model')
hass.stop() hass.stop()