mirror of
https://github.com/home-assistant/core.git
synced 2026-09-26 19:55:35 +01:00
119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
"""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
|