diff --git a/homeassistant/components/homekit_controller/__init__.py b/homeassistant/components/homekit_controller/__init__.py index 0cb9ecbfc07..5e470e1540b 100644 --- a/homeassistant/components/homekit_controller/__init__.py +++ b/homeassistant/components/homekit_controller/__init__.py @@ -11,8 +11,7 @@ from homeassistant.helpers.event import call_later from .connection import get_accessory_information from .const import ( - CONTROLLER, DOMAIN, HOMEKIT_ACCESSORY_DISPATCH, KNOWN_ACCESSORIES, - KNOWN_DEVICES + CONTROLLER, DOMAIN, HOMEKIT_ACCESSORY_DISPATCH, KNOWN_DEVICES ) @@ -33,25 +32,6 @@ RETRY_INTERVAL = 60 # seconds PAIRING_FILE = "pairing.json" -def get_serial(accessory): - """Obtain the serial number of a HomeKit device.""" - # pylint: disable=import-error - from homekit.model.services import ServicesTypes - from homekit.model.characteristics import CharacteristicsTypes - - for service in accessory['services']: - if ServicesTypes.get_short(service['type']) != \ - 'accessory-information': - continue - for characteristic in service['characteristics']: - ctype = CharacteristicsTypes.get_short( - characteristic['type']) - if ctype != 'serial-number': - continue - return characteristic['value'] - return None - - def escape_characteristic_name(char_name): """Escape any dash or dots in a characteristics name.""" return char_name.replace('-', '_').replace('.', '_') @@ -75,6 +55,10 @@ class HKDevice(): self.configurator = hass.components.configurator self._connection_warning_logged = False + # This just tracks aid/iid pairs so we know if a HK service has been + # mapped to a HA entity. + self.entities = [] + self.pairing_lock = asyncio.Lock(loop=hass.loop) self.pairing = self.controller.pairings.get(hkid) @@ -100,15 +84,16 @@ class HKDevice(): self.hass, RETRY_INTERVAL, lambda _: self.accessory_setup()) return for accessory in data: - serial = get_serial(accessory) - if serial in self.hass.data[KNOWN_ACCESSORIES]: - continue - self.hass.data[KNOWN_ACCESSORIES][serial] = self aid = accessory['aid'] for service in accessory['services']: + iid = service['iid'] + if (aid, iid) in self.entities: + # Don't add the same entity again + continue + devtype = ServicesTypes.get_short(service['type']) _LOGGER.debug("Found %s", devtype) - service_info = {'serial': serial, + service_info = {'serial': self.hkid, 'aid': aid, 'iid': service['iid'], 'model': self.model, @@ -381,7 +366,6 @@ def setup(hass, config): device = HKDevice(hass, host, port, model, hkid, config_num, config) hass.data[KNOWN_DEVICES][hkid] = device - hass.data[KNOWN_ACCESSORIES] = {} hass.data[KNOWN_DEVICES] = {} discovery.listen(hass, SERVICE_HOMEKIT, discovery_dispatch) return True diff --git a/homeassistant/components/homekit_controller/alarm_control_panel.py b/homeassistant/components/homekit_controller/alarm_control_panel.py index 9bc15aad75d..f9bc25f4237 100644 --- a/homeassistant/components/homekit_controller/alarm_control_panel.py +++ b/homeassistant/components/homekit_controller/alarm_control_panel.py @@ -6,7 +6,7 @@ from homeassistant.const import ( ATTR_BATTERY_LEVEL, STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_NIGHT, STATE_ALARM_DISARMED, STATE_ALARM_TRIGGERED) -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -34,7 +34,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit Alarm Control Panel support.""" if discovery_info is None: return - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitAlarmControlPanel(accessory, discovery_info)], True) diff --git a/homeassistant/components/homekit_controller/binary_sensor.py b/homeassistant/components/homekit_controller/binary_sensor.py index 7fcc5b4e833..2bd03b18932 100644 --- a/homeassistant/components/homekit_controller/binary_sensor.py +++ b/homeassistant/components/homekit_controller/binary_sensor.py @@ -3,7 +3,7 @@ import logging from homeassistant.components.binary_sensor import BinarySensorDevice -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -13,7 +13,7 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit motion sensor support.""" if discovery_info is not None: - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitMotionSensor(accessory, discovery_info)], True) diff --git a/homeassistant/components/homekit_controller/climate.py b/homeassistant/components/homekit_controller/climate.py index 243b795e792..67f1fb72bcf 100644 --- a/homeassistant/components/homekit_controller/climate.py +++ b/homeassistant/components/homekit_controller/climate.py @@ -7,7 +7,7 @@ from homeassistant.components.climate.const import ( SUPPORT_TARGET_TEMPERATURE) from homeassistant.const import ATTR_TEMPERATURE, STATE_OFF, TEMP_CELSIUS -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -29,7 +29,7 @@ DEFAULT_VALID_MODES = list(MODE_HOMEKIT_TO_HASS) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit climate.""" if discovery_info is not None: - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitClimateDevice(accessory, discovery_info)], True) diff --git a/homeassistant/components/homekit_controller/const.py b/homeassistant/components/homekit_controller/const.py index 873f6b343d2..90a105b0ad9 100644 --- a/homeassistant/components/homekit_controller/const.py +++ b/homeassistant/components/homekit_controller/const.py @@ -1,7 +1,6 @@ """Constants for the homekit_controller component.""" DOMAIN = 'homekit_controller' -KNOWN_ACCESSORIES = "{}-accessories".format(DOMAIN) KNOWN_DEVICES = "{}-devices".format(DOMAIN) CONTROLLER = "{}-controller".format(DOMAIN) diff --git a/homeassistant/components/homekit_controller/cover.py b/homeassistant/components/homekit_controller/cover.py index 7a4fa486ff9..26b7613ed2b 100644 --- a/homeassistant/components/homekit_controller/cover.py +++ b/homeassistant/components/homekit_controller/cover.py @@ -8,7 +8,7 @@ from homeassistant.components.cover import ( from homeassistant.const import ( STATE_CLOSED, STATE_CLOSING, STATE_OPEN, STATE_OPENING) -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity STATE_STOPPED = 'stopped' @@ -41,7 +41,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up HomeKit Cover support.""" if discovery_info is None: return - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] if discovery_info['device-type'] == 'garage-door-opener': add_entities([HomeKitGarageDoorCover(accessory, discovery_info)], diff --git a/homeassistant/components/homekit_controller/light.py b/homeassistant/components/homekit_controller/light.py index db8fd332c0c..cb9259df4a9 100644 --- a/homeassistant/components/homekit_controller/light.py +++ b/homeassistant/components/homekit_controller/light.py @@ -5,7 +5,7 @@ from homeassistant.components.light import ( ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_HS_COLOR, SUPPORT_BRIGHTNESS, SUPPORT_COLOR, SUPPORT_COLOR_TEMP, Light) -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit lighting.""" if discovery_info is not None: - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitLight(accessory, discovery_info)], True) diff --git a/homeassistant/components/homekit_controller/lock.py b/homeassistant/components/homekit_controller/lock.py index ac1bd8f88da..0d0275fda16 100644 --- a/homeassistant/components/homekit_controller/lock.py +++ b/homeassistant/components/homekit_controller/lock.py @@ -5,7 +5,7 @@ from homeassistant.components.lock import LockDevice from homeassistant.const import ( ATTR_BATTERY_LEVEL, STATE_LOCKED, STATE_UNLOCKED) -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -30,7 +30,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit Lock support.""" if discovery_info is None: return - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitLock(accessory, discovery_info)], True) diff --git a/homeassistant/components/homekit_controller/sensor.py b/homeassistant/components/homekit_controller/sensor.py index 955a1a7927e..8cbc8f248ba 100644 --- a/homeassistant/components/homekit_controller/sensor.py +++ b/homeassistant/components/homekit_controller/sensor.py @@ -1,7 +1,7 @@ """Support for Homekit sensors.""" from homeassistant.const import TEMP_CELSIUS -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -16,7 +16,7 @@ UNIT_LUX = "lux" def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit sensor support.""" if discovery_info is not None: - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] devtype = discovery_info['device-type'] if devtype == 'humidity': diff --git a/homeassistant/components/homekit_controller/switch.py b/homeassistant/components/homekit_controller/switch.py index ba19413d411..34e83c06526 100644 --- a/homeassistant/components/homekit_controller/switch.py +++ b/homeassistant/components/homekit_controller/switch.py @@ -3,7 +3,7 @@ import logging from homeassistant.components.switch import SwitchDevice -from . import KNOWN_ACCESSORIES, HomeKitEntity +from . import KNOWN_DEVICES, HomeKitEntity DEPENDENCIES = ['homekit_controller'] @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up Homekit switch support.""" if discovery_info is not None: - accessory = hass.data[KNOWN_ACCESSORIES][discovery_info['serial']] + accessory = hass.data[KNOWN_DEVICES][discovery_info['serial']] add_entities([HomeKitSwitch(accessory, discovery_info)], True)