Add support for sessions (#18518)

Added support for sessions to keep connection open with August portal, improving performance.
py-august version increased to 0.7.0
This commit is contained in:
ehendrix23 2018-11-19 03:53:27 -07:00 committed by Paulus Schoutsen
parent cdcc818bf9
commit 9fa34f0d77
2 changed files with 40 additions and 10 deletions

View File

@ -11,8 +11,9 @@ import voluptuous as vol
from requests import RequestException from requests import RequestException
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.core import callback
from homeassistant.const import ( from homeassistant.const import (
CONF_PASSWORD, CONF_USERNAME, CONF_TIMEOUT) CONF_PASSWORD, CONF_USERNAME, CONF_TIMEOUT, EVENT_HOMEASSISTANT_STOP)
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
from homeassistant.util import Throttle from homeassistant.util import Throttle
@ -20,7 +21,7 @@ _LOGGER = logging.getLogger(__name__)
_CONFIGURING = {} _CONFIGURING = {}
REQUIREMENTS = ['py-august==0.6.0'] REQUIREMENTS = ['py-august==0.7.0']
DEFAULT_TIMEOUT = 10 DEFAULT_TIMEOUT = 10
ACTIVITY_FETCH_LIMIT = 10 ACTIVITY_FETCH_LIMIT = 10
@ -116,7 +117,8 @@ def setup_august(hass, config, api, authenticator):
if DOMAIN in _CONFIGURING: if DOMAIN in _CONFIGURING:
hass.components.configurator.request_done(_CONFIGURING.pop(DOMAIN)) hass.components.configurator.request_done(_CONFIGURING.pop(DOMAIN))
hass.data[DATA_AUGUST] = AugustData(api, authentication.access_token) hass.data[DATA_AUGUST] = AugustData(
hass, api, authentication.access_token)
for component in AUGUST_COMPONENTS: for component in AUGUST_COMPONENTS:
discovery.load_platform(hass, component, DOMAIN, {}, config) discovery.load_platform(hass, component, DOMAIN, {}, config)
@ -136,9 +138,16 @@ def setup(hass, config):
"""Set up the August component.""" """Set up the August component."""
from august.api import Api from august.api import Api
from august.authenticator import Authenticator from august.authenticator import Authenticator
from requests import Session
conf = config[DOMAIN] conf = config[DOMAIN]
api = Api(timeout=conf.get(CONF_TIMEOUT)) try:
api_http_session = Session()
except RequestException as ex:
_LOGGER.warning("Creating HTTP session failed with: %s", str(ex))
api_http_session = None
api = Api(timeout=conf.get(CONF_TIMEOUT), http_session=api_http_session)
authenticator = Authenticator( authenticator = Authenticator(
api, api,
@ -154,8 +163,9 @@ def setup(hass, config):
class AugustData: class AugustData:
"""August data object.""" """August data object."""
def __init__(self, api, access_token): def __init__(self, hass, api, access_token):
"""Init August data object.""" """Init August data object."""
self._hass = hass
self._api = api self._api = api
self._access_token = access_token self._access_token = access_token
self._doorbells = self._api.get_doorbells(self._access_token) or [] self._doorbells = self._api.get_doorbells(self._access_token) or []
@ -168,6 +178,22 @@ class AugustData:
self._door_state_by_id = {} self._door_state_by_id = {}
self._activities_by_id = {} self._activities_by_id = {}
@callback
def august_api_stop(event):
"""Close the API HTTP session."""
_LOGGER.debug("Closing August HTTP session")
try:
self._api.http_session.close()
self._api.http_session = None
except RequestException:
pass
_LOGGER.debug("August HTTP session closed.")
self._hass.bus.listen_once(
EVENT_HOMEASSISTANT_STOP, august_api_stop)
_LOGGER.debug("Registered for HASS stop event")
@property @property
def house_ids(self): def house_ids(self):
"""Return a list of house_ids.""" """Return a list of house_ids."""
@ -201,8 +227,11 @@ class AugustData:
@Throttle(MIN_TIME_BETWEEN_UPDATES) @Throttle(MIN_TIME_BETWEEN_UPDATES)
def _update_device_activities(self, limit=ACTIVITY_FETCH_LIMIT): def _update_device_activities(self, limit=ACTIVITY_FETCH_LIMIT):
"""Update data object with latest from August API.""" """Update data object with latest from August API."""
_LOGGER.debug("Updating device activities") _LOGGER.debug("Start retrieving device activities")
for house_id in self.house_ids: for house_id in self.house_ids:
_LOGGER.debug("Updating device activity for house id %s",
house_id)
activities = self._api.get_house_activities(self._access_token, activities = self._api.get_house_activities(self._access_token,
house_id, house_id,
limit=limit) limit=limit)
@ -211,6 +240,7 @@ class AugustData:
for device_id in device_ids: for device_id in device_ids:
self._activities_by_id[device_id] = [a for a in activities if self._activities_by_id[device_id] = [a for a in activities if
a.device_id == device_id] a.device_id == device_id]
_LOGGER.debug("Completed retrieving device activities")
def get_doorbell_detail(self, doorbell_id): def get_doorbell_detail(self, doorbell_id):
"""Return doorbell detail.""" """Return doorbell detail."""
@ -223,7 +253,7 @@ class AugustData:
_LOGGER.debug("Start retrieving doorbell details") _LOGGER.debug("Start retrieving doorbell details")
for doorbell in self._doorbells: for doorbell in self._doorbells:
_LOGGER.debug("Updating status for %s", _LOGGER.debug("Updating doorbell status for %s",
doorbell.device_name) doorbell.device_name)
try: try:
detail_by_id[doorbell.device_id] =\ detail_by_id[doorbell.device_id] =\
@ -267,7 +297,7 @@ class AugustData:
_LOGGER.debug("Start retrieving door status") _LOGGER.debug("Start retrieving door status")
for lock in self._locks: for lock in self._locks:
_LOGGER.debug("Updating status for %s", _LOGGER.debug("Updating door status for %s",
lock.device_name) lock.device_name)
try: try:
@ -291,7 +321,7 @@ class AugustData:
_LOGGER.debug("Start retrieving locks status") _LOGGER.debug("Start retrieving locks status")
for lock in self._locks: for lock in self._locks:
_LOGGER.debug("Updating status for %s", _LOGGER.debug("Updating lock status for %s",
lock.device_name) lock.device_name)
try: try:
status_by_id[lock.device_id] = self._api.get_lock_status( status_by_id[lock.device_id] = self._api.get_lock_status(

View File

@ -787,7 +787,7 @@ pushetta==1.0.15
pwmled==1.3.0 pwmled==1.3.0
# homeassistant.components.august # homeassistant.components.august
py-august==0.6.0 py-august==0.7.0
# homeassistant.components.canary # homeassistant.components.canary
py-canary==0.5.0 py-canary==0.5.0