diff --git a/homeassistant/components/fibaro.py b/homeassistant/components/fibaro.py index dacf0c97edf..5813b194890 100644 --- a/homeassistant/components/fibaro.py +++ b/homeassistant/components/fibaro.py @@ -7,6 +7,7 @@ https://home-assistant.io/components/fibaro/ import logging from collections import defaultdict +from typing import Optional import voluptuous as vol from homeassistant.const import (ATTR_ARMED, ATTR_BATTERY_LEVEL, @@ -65,8 +66,8 @@ class FibaroController(): _device_map = None # Dict for mapping deviceId to device object fibaro_devices = None # List of devices by type _callbacks = {} # Dict of update value callbacks by deviceId - _client = None # Fiblary's Client object for communication - _state_handler = None # Fiblary's StateHandler object + _client = None # Fiblary's Client object for communication + _state_handler = None # Fiblary's StateHandler object _import_plugins = None # Whether to import devices from plugins def __init__(self, username, password, url, import_plugins): @@ -74,11 +75,14 @@ class FibaroController(): from fiblary3.client.v4.client import Client as FibaroClient self._client = FibaroClient(url, username, password) self._scene_map = None + self.hub_serial = None # Unique serial number of the hub def connect(self): """Start the communication with the Fibaro controller.""" try: login = self._client.login.get() + info = self._client.info.get() + self.hub_serial = slugify(info.serialNumber) except AssertionError: _LOGGER.error("Can't connect to Fibaro HC. " "Please check URL.") @@ -180,9 +184,12 @@ class FibaroController(): room_name = 'Unknown' else: room_name = self._room_map[device.roomID].name + device.room_name = room_name device.friendly_name = '{} {}'.format(room_name, device.name) device.ha_id = '{}_{}_{}'.format( slugify(room_name), slugify(device.name), device.id) + device.unique_id_str = "{}.{}".format( + self.hub_serial, device.id) self._scene_map[device.id] = device self.fibaro_devices['scene'].append(device) @@ -197,6 +204,7 @@ class FibaroController(): room_name = 'Unknown' else: room_name = self._room_map[device.roomID].name + device.room_name = room_name device.friendly_name = room_name + ' ' + device.name device.ha_id = '{}_{}_{}'.format( slugify(room_name), slugify(device.name), device.id) @@ -207,6 +215,8 @@ class FibaroController(): else: device.mapped_type = None if device.mapped_type: + device.unique_id_str = "{}.{}".format( + self.hub_serial, device.id) self._device_map[device.id] = device self.fibaro_devices[device.mapped_type].append(device) else: @@ -347,7 +357,12 @@ class FibaroDevice(Entity): return False @property - def name(self): + def unique_id(self) -> str: + """Return a unique ID.""" + return self.fibaro_device.unique_id_str + + @property + def name(self) -> Optional[str]: """Return the name of the device.""" return self._name @@ -380,5 +395,5 @@ class FibaroDevice(Entity): except (ValueError, KeyError): pass - attr['id'] = self.ha_id + attr['fibaro_id'] = self.fibaro_device.id return attr