"""Support Google Home units.""" import logging import asyncio import voluptuous as vol from homeassistant.const import CONF_DEVICES, CONF_HOST from homeassistant.helpers import discovery import homeassistant.helpers.config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession _LOGGER = logging.getLogger(__name__) DOMAIN = "googlehome" CLIENT = "googlehome_client" NAME = "GoogleHome" CONF_DEVICE_TYPES = "device_types" CONF_RSSI_THRESHOLD = "rssi_threshold" CONF_TRACK_ALARMS = "track_alarms" CONF_TRACK_DEVICES = "track_devices" DEVICE_TYPES = [1, 2, 3] DEFAULT_RSSI_THRESHOLD = -70 DEVICE_CONFIG = vol.Schema( { vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_DEVICE_TYPES, default=DEVICE_TYPES): vol.All( cv.ensure_list, [vol.In(DEVICE_TYPES)] ), vol.Optional(CONF_RSSI_THRESHOLD, default=DEFAULT_RSSI_THRESHOLD): vol.Coerce( int ), vol.Optional(CONF_TRACK_ALARMS, default=False): cv.boolean, vol.Optional(CONF_TRACK_DEVICES, default=True): cv.boolean, } ) CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema( {vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [DEVICE_CONFIG])} ) }, extra=vol.ALLOW_EXTRA, ) async def async_setup(hass, config): """Set up the Google Home component.""" hass.data[DOMAIN] = {} hass.data[CLIENT] = GoogleHomeClient(hass) for device in config[DOMAIN][CONF_DEVICES]: hass.data[DOMAIN][device["host"]] = {} if device[CONF_TRACK_DEVICES]: hass.async_create_task( discovery.async_load_platform( hass, "device_tracker", DOMAIN, device, config ) ) if device[CONF_TRACK_ALARMS]: hass.async_create_task( discovery.async_load_platform(hass, "sensor", DOMAIN, device, config) ) return True class GoogleHomeClient: """Handle all communication with the Google Home unit.""" def __init__(self, hass): """Initialize the Google Home Client.""" self.hass = hass self._connected = None async def update_info(self, host): """Update data from Google Home.""" from googledevices.api.connect import Cast _LOGGER.debug("Updating Google Home info for %s", host) session = async_get_clientsession(self.hass) device_info = await Cast(host, self.hass.loop, session).info() device_info_data = await device_info.get_device_info() self._connected = bool(device_info_data) self.hass.data[DOMAIN][host]["info"] = device_info_data async def update_bluetooth(self, host): """Update bluetooth from Google Home.""" from googledevices.api.connect import Cast _LOGGER.debug("Updating Google Home bluetooth for %s", host) session = async_get_clientsession(self.hass) bluetooth = await Cast(host, self.hass.loop, session).bluetooth() await bluetooth.scan_for_devices() await asyncio.sleep(5) bluetooth_data = await bluetooth.get_scan_result() self.hass.data[DOMAIN][host]["bluetooth"] = bluetooth_data async def update_alarms(self, host): """Update alarms from Google Home.""" from googledevices.api.connect import Cast _LOGGER.debug("Updating Google Home bluetooth for %s", host) session = async_get_clientsession(self.hass) assistant = await Cast(host, self.hass.loop, session).assistant() alarms_data = await assistant.get_alarms() self.hass.data[DOMAIN][host]["alarms"] = alarms_data