diff --git a/homeassistant/components/bt_smarthub/device_tracker.py b/homeassistant/components/bt_smarthub/device_tracker.py index 383f724decd..107eb5598d9 100644 --- a/homeassistant/components/bt_smarthub/device_tracker.py +++ b/homeassistant/components/bt_smarthub/device_tracker.py @@ -1,4 +1,5 @@ """Support for BT Smart Hub (Sometimes referred to as BT Home Hub 6).""" +from collections import namedtuple import logging from btsmarthub_devicelist import BTSmartHub @@ -31,19 +32,30 @@ def get_scanner(hass, config): smarthub_client = BTSmartHub( router_ip=info[CONF_HOST], smarthub_model=info.get(CONF_SMARTHUB_MODEL) ) - scanner = BTSmartHubScanner(smarthub_client) - return scanner if scanner.success_init else None +def _create_device(data): + """Create new device from the dict.""" + ip_address = data.get("IPAddress") + mac = data.get("PhysAddress") + host = data.get("UserHostName") + status = data.get("Active") + name = data.get("name") + return _Device(ip_address, mac, host, status, name) + + +_Device = namedtuple("_Device", ["ip_address", "mac", "host", "status", "name"]) + + class BTSmartHubScanner(DeviceScanner): """This class queries a BT Smart Hub.""" def __init__(self, smarthub_client): """Initialise the scanner.""" self.smarthub = smarthub_client - self.last_results = {} + self.last_results = [] self.success_init = False # Test the router is accessible @@ -56,15 +68,15 @@ class BTSmartHubScanner(DeviceScanner): def scan_devices(self): """Scan for new devices and return a list with found device IDs.""" self._update_info() - return [client["mac"] for client in self.last_results] + return [device.mac for device in self.last_results] def get_device_name(self, device): """Return the name of the given device or None if we don't know.""" if not self.last_results: return None - for client in self.last_results: - if client["mac"] == device: - return client["host"] + for result_device in self.last_results: + if result_device.mac == device: + return result_device.name or result_device.host return None def _update_info(self): @@ -77,26 +89,10 @@ class BTSmartHubScanner(DeviceScanner): if not data: _LOGGER.warning("Error scanning devices") return - - clients = list(data.values()) - self.last_results = clients + self.last_results = data def get_bt_smarthub_data(self): """Retrieve data from BT Smart Hub and return parsed result.""" - # Request data from bt smarthub into a list of dicts. data = self.smarthub.get_devicelist(only_active_devices=True) - - # Renaming keys from parsed result. - devices = {} - for device in data: - try: - devices[device["UserHostName"]] = { - "ip": device["IPAddress"], - "mac": device["PhysAddress"], - "host": device["UserHostName"], - "status": device["Active"], - } - except KeyError: - pass - return devices + return [_create_device(d) for d in data if d.get("PhysAddress")]