2019-05-10 16:34:28 +00:00
|
|
|
"""Support for a Genius Hub system."""
|
|
|
|
from datetime import timedelta
|
2019-04-16 21:54:46 +00:00
|
|
|
import logging
|
|
|
|
|
|
|
|
import voluptuous as vol
|
|
|
|
|
2019-05-10 16:34:28 +00:00
|
|
|
from geniushubclient import GeniusHubClient
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME
|
2019-04-16 21:54:46 +00:00
|
|
|
from homeassistant.helpers import config_validation as cv
|
|
|
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
|
|
from homeassistant.helpers.discovery import async_load_platform
|
2019-05-10 16:34:28 +00:00
|
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
|
|
|
from homeassistant.helpers.event import async_track_time_interval
|
2019-04-16 21:54:46 +00:00
|
|
|
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
DOMAIN = "geniushub"
|
2019-04-16 21:54:46 +00:00
|
|
|
|
2019-05-10 16:34:28 +00:00
|
|
|
SCAN_INTERVAL = timedelta(seconds=60)
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
_V1_API_SCHEMA = vol.Schema({vol.Required(CONF_TOKEN): cv.string})
|
|
|
|
_V3_API_SCHEMA = vol.Schema(
|
|
|
|
{
|
|
|
|
vol.Required(CONF_HOST): cv.string,
|
|
|
|
vol.Required(CONF_USERNAME): cv.string,
|
|
|
|
vol.Required(CONF_PASSWORD): cv.string,
|
|
|
|
}
|
|
|
|
)
|
|
|
|
CONFIG_SCHEMA = vol.Schema(
|
|
|
|
{DOMAIN: vol.Any(_V3_API_SCHEMA, _V1_API_SCHEMA)}, extra=vol.ALLOW_EXTRA
|
|
|
|
)
|
2019-04-16 21:54:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def async_setup(hass, hass_config):
|
|
|
|
"""Create a Genius Hub system."""
|
2019-04-18 12:37:52 +00:00
|
|
|
kwargs = dict(hass_config[DOMAIN])
|
|
|
|
if CONF_HOST in kwargs:
|
2019-07-31 19:25:30 +00:00
|
|
|
args = (kwargs.pop(CONF_HOST),)
|
2019-04-18 12:37:52 +00:00
|
|
|
else:
|
2019-07-31 19:25:30 +00:00
|
|
|
args = (kwargs.pop(CONF_TOKEN),)
|
2019-04-18 12:37:52 +00:00
|
|
|
|
2019-05-10 16:34:28 +00:00
|
|
|
hass.data[DOMAIN] = {}
|
2019-07-31 19:25:30 +00:00
|
|
|
data = hass.data[DOMAIN]["data"] = GeniusData(hass, args, kwargs)
|
2019-04-16 21:54:46 +00:00
|
|
|
try:
|
2019-05-10 16:34:28 +00:00
|
|
|
await data._client.hub.update() # pylint: disable=protected-access
|
2019-04-16 21:54:46 +00:00
|
|
|
except AssertionError: # assert response.status == HTTP_OK
|
2019-07-31 19:25:30 +00:00
|
|
|
_LOGGER.warning("Setup failed, check your configuration.", exc_info=True)
|
2019-04-16 21:54:46 +00:00
|
|
|
return False
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
_LOGGER.debug(
|
|
|
|
"zones_raw = %s", data._client.hub._zones_raw
|
|
|
|
) # noqa; pylint: disable=protected-access
|
|
|
|
_LOGGER.debug(
|
|
|
|
"devices_raw = %s", data._client.hub._devices_raw
|
|
|
|
) # noqa; pylint: disable=protected-access
|
2019-07-21 17:07:03 +00:00
|
|
|
|
2019-05-10 16:34:28 +00:00
|
|
|
async_track_time_interval(hass, data.async_update, SCAN_INTERVAL)
|
2019-04-16 21:54:46 +00:00
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
for platform in ["climate", "water_heater"]:
|
|
|
|
hass.async_create_task(
|
|
|
|
async_load_platform(hass, platform, DOMAIN, {}, hass_config)
|
|
|
|
)
|
2019-05-07 15:37:47 +00:00
|
|
|
|
2019-07-31 17:44:09 +00:00
|
|
|
if data._client.api_version == 3: # pylint: disable=protected-access
|
2019-07-31 19:25:30 +00:00
|
|
|
for platform in ["sensor", "binary_sensor"]:
|
|
|
|
hass.async_create_task(
|
|
|
|
async_load_platform(hass, platform, DOMAIN, {}, hass_config)
|
|
|
|
)
|
2019-05-14 21:30:26 +00:00
|
|
|
|
2019-04-16 21:54:46 +00:00
|
|
|
return True
|
2019-05-10 16:34:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
class GeniusData:
|
|
|
|
"""Container for geniushub client and data."""
|
|
|
|
|
|
|
|
def __init__(self, hass, args, kwargs):
|
|
|
|
"""Initialize the geniushub client."""
|
|
|
|
self._hass = hass
|
2019-07-31 19:25:30 +00:00
|
|
|
self._client = hass.data[DOMAIN]["client"] = GeniusHubClient(
|
|
|
|
*args, **kwargs, session=async_get_clientsession(hass)
|
|
|
|
)
|
2019-05-10 16:34:28 +00:00
|
|
|
|
|
|
|
async def async_update(self, now, **kwargs):
|
|
|
|
"""Update the geniushub client's data."""
|
|
|
|
try:
|
|
|
|
await self._client.hub.update()
|
|
|
|
except AssertionError: # assert response.status == HTTP_OK
|
|
|
|
_LOGGER.warning("Update failed.", exc_info=True)
|
|
|
|
return
|
2019-07-21 17:07:03 +00:00
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
_LOGGER.debug(
|
|
|
|
"zones_raw = %s", self._client.hub._zones_raw
|
|
|
|
) # noqa; pylint: disable=protected-access
|
|
|
|
_LOGGER.debug(
|
|
|
|
"devices_raw = %s", self._client.hub._devices_raw
|
|
|
|
) # noqa; pylint: disable=protected-access
|
2019-07-21 17:07:03 +00:00
|
|
|
|
2019-05-10 16:34:28 +00:00
|
|
|
async_dispatcher_send(self._hass, DOMAIN)
|