"""Support for monitoring a Sense energy sensor.""" import logging from datetime import timedelta import voluptuous as vol from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_TIMEOUT import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.event import async_track_time_interval _LOGGER = logging.getLogger(__name__) ACTIVE_UPDATE_RATE = 60 DEFAULT_TIMEOUT = 5 DOMAIN = 'sense' SENSE_DATA = 'sense_data' SENSE_DEVICE_UPDATE = 'sense_devices_update' CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Required(CONF_EMAIL): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, }) }, extra=vol.ALLOW_EXTRA) async def async_setup(hass, config): """Set up the Sense sensor.""" from sense_energy import ( ASyncSenseable, SenseAuthenticationException, SenseAPITimeoutException) username = config[DOMAIN][CONF_EMAIL] password = config[DOMAIN][CONF_PASSWORD] timeout = config[DOMAIN][CONF_TIMEOUT] try: hass.data[SENSE_DATA] = ASyncSenseable( api_timeout=timeout, wss_timeout=timeout) hass.data[SENSE_DATA].rate_limit = ACTIVE_UPDATE_RATE await hass.data[SENSE_DATA].authenticate(username, password) except SenseAuthenticationException: _LOGGER.error("Could not authenticate with sense server") return False hass.async_create_task( async_load_platform(hass, 'sensor', DOMAIN, {}, config)) hass.async_create_task( async_load_platform(hass, 'binary_sensor', DOMAIN, {}, config)) async def async_sense_update(now): """Retrieve latest state.""" try: await hass.data[SENSE_DATA].update_realtime() async_dispatcher_send(hass, SENSE_DEVICE_UPDATE) except SenseAPITimeoutException: _LOGGER.error("Timeout retrieving data") async_track_time_interval(hass, async_sense_update, timedelta(seconds=ACTIVE_UPDATE_RATE)) return True