"""Support for Google Home Bluetooth tacker.""" from datetime import timedelta import logging from homeassistant.components.device_tracker import DeviceScanner from homeassistant.helpers.event import async_track_time_interval from homeassistant.util import slugify from . import CLIENT, DOMAIN as GOOGLEHOME_DOMAIN, NAME _LOGGER = logging.getLogger(__name__) DEFAULT_SCAN_INTERVAL = timedelta(seconds=10) async def async_setup_scanner(hass, config, async_see, discovery_info=None): """Validate the configuration and return a Google Home scanner.""" if discovery_info is None: _LOGGER.warning( "To use this you need to configure the 'googlehome' component") return False scanner = GoogleHomeDeviceScanner(hass, hass.data[CLIENT], discovery_info, async_see) return await scanner.async_init() class GoogleHomeDeviceScanner(DeviceScanner): """This class queries a Google Home unit.""" def __init__(self, hass, client, config, async_see): """Initialize the scanner.""" self.async_see = async_see self.hass = hass self.rssi = config['rssi_threshold'] self.device_types = config['device_types'] self.host = config['host'] self.client = client async def async_init(self): """Further initialize connection to Google Home.""" await self.client.update_info(self.host) data = self.hass.data[GOOGLEHOME_DOMAIN][self.host] info = data.get('info', {}) connected = bool(info) if connected: await self.async_update() async_track_time_interval(self.hass, self.async_update, DEFAULT_SCAN_INTERVAL) return connected async def async_update(self, now=None): """Ensure the information from Google Home is up to date.""" _LOGGER.debug('Checking Devices on %s', self.host) await self.client.update_bluetooth(self.host) data = self.hass.data[GOOGLEHOME_DOMAIN][self.host] info = data.get('info') bluetooth = data.get('bluetooth') if info is None or bluetooth is None: return google_home_name = info.get('name', NAME) for device in bluetooth: if (device['device_type'] not in self.device_types or device['rssi'] < self.rssi): continue name = "{} {}".format(self.host, device['mac_address']) attributes = {} attributes['btle_mac_address'] = device['mac_address'] attributes['ghname'] = google_home_name attributes['rssi'] = device['rssi'] attributes['source_type'] = 'bluetooth' if device['name']: attributes['name'] = device['name'] await self.async_see(dev_id=slugify(name), attributes=attributes)