From 43d77729c557b38765a80cf29e582401c21c586b Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 9 Oct 2017 03:35:05 -0600 Subject: [PATCH] WIP: Fix Arlo Camera blocking IO (#9758) * WIP: Fix Arlo Camera blocking IO * Accidental undo * Linting issues * Owner-requested changes * Bumped pyarlo version and added Throttle * Fix * Update requirements_all.txt --- homeassistant/components/arlo.py | 2 +- homeassistant/components/camera/arlo.py | 43 +++++++++++++++++-------- requirements_all.txt | 2 +- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/arlo.py b/homeassistant/components/arlo.py index a443124ae5a..f3397a884d1 100644 --- a/homeassistant/components/arlo.py +++ b/homeassistant/components/arlo.py @@ -12,7 +12,7 @@ from requests.exceptions import HTTPError, ConnectTimeout from homeassistant.helpers import config_validation as cv from homeassistant.const import CONF_USERNAME, CONF_PASSWORD -REQUIREMENTS = ['pyarlo==0.0.6'] +REQUIREMENTS = ['pyarlo==0.0.7'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index 06314f5dbab..be58b61fb8c 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -6,6 +6,7 @@ https://home-assistant.io/components/camera.arlo/ """ import asyncio import logging +from datetime import timedelta import voluptuous as vol @@ -18,13 +19,16 @@ from homeassistant.helpers.aiohttp_client import async_aiohttp_proxy_stream _LOGGER = logging.getLogger(__name__) +SCAN_INTERVAL = timedelta(minutes=10) + ARLO_MODE_ARMED = 'armed' ARLO_MODE_DISARMED = 'disarmed' + ATTR_BRIGHTNESS = 'brightness' ATTR_FLIPPED = 'flipped' ATTR_MIRRORED = 'mirrored' -ATTR_MOTION_SENSITIVITY = 'motion_detection_sensitivity' -ATTR_POWER_SAVE_MODE = 'power_save_mode' +ATTR_MOTION = 'motion_detection_sensitivity' +ATTR_POWERSAVE = 'power_save_mode' ATTR_SIGNAL_STRENGTH = 'signal_strength' ATTR_UNSEEN_VIDEOS = 'unseen_videos' @@ -39,7 +43,8 @@ POWERSAVE_MODE_MAPPING = { } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string, + vol.Optional(CONF_FFMPEG_ARGUMENTS): + cv.string, }) @@ -68,6 +73,7 @@ class ArloCam(Camera): self._motion_status = False self._ffmpeg = hass.data[DATA_FFMPEG] self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) + self.attrs = {} def camera_image(self): """Return a still image response from the camera.""" @@ -99,16 +105,14 @@ class ArloCam(Camera): def device_state_attributes(self): """Return the state attributes.""" return { - ATTR_BATTERY_LEVEL: self._camera.get_battery_level, - ATTR_BRIGHTNESS: self._camera.get_brightness, - ATTR_FLIPPED: self._camera.get_flip_state, - ATTR_MIRRORED: self._camera.get_mirror_state, - ATTR_MOTION_SENSITIVITY: - self._camera.get_motion_detection_sensitivity, - ATTR_POWER_SAVE_MODE: - POWERSAVE_MODE_MAPPING[self._camera.get_powersave_mode], - ATTR_SIGNAL_STRENGTH: self._camera.get_signal_strength, - ATTR_UNSEEN_VIDEOS: self._camera.unseen_videos + ATTR_BATTERY_LEVEL: self.attrs.get(ATTR_BATTERY_LEVEL), + ATTR_BRIGHTNESS: self.attrs.get(ATTR_BRIGHTNESS), + ATTR_FLIPPED: self.attrs.get(ATTR_FLIPPED), + ATTR_MIRRORED: self.attrs.get(ATTR_MIRRORED), + ATTR_MOTION: self.attrs.get(ATTR_MOTION), + ATTR_POWERSAVE: self.attrs.get(ATTR_POWERSAVE), + ATTR_SIGNAL_STRENGTH: self.attrs.get(ATTR_SIGNAL_STRENGTH), + ATTR_UNSEEN_VIDEOS: self.attrs.get(ATTR_UNSEEN_VIDEOS), } @property @@ -153,3 +157,16 @@ class ArloCam(Camera): """Disable the motion detection in base station (Disarm).""" self._motion_status = False self.set_base_station_mode(ARLO_MODE_DISARMED) + + def update(self): + """Add an attribute-update task to the executor pool.""" + self.attrs[ATTR_BATTERY_LEVEL] = self._camera.get_battery_level + self.attrs[ATTR_BRIGHTNESS] = self._camera.get_battery_level + self.attrs[ATTR_FLIPPED] = self._camera.get_flip_state, + self.attrs[ATTR_MIRRORED] = self._camera.get_mirror_state, + self.attrs[ + ATTR_MOTION] = self._camera.get_motion_detection_sensitivity, + self.attrs[ATTR_POWERSAVE] = POWERSAVE_MODE_MAPPING[ + self._camera.get_powersave_mode], + self.attrs[ATTR_SIGNAL_STRENGTH] = self._camera.get_signal_strength, + self.attrs[ATTR_UNSEEN_VIDEOS] = self._camera.unseen_videos diff --git a/requirements_all.txt b/requirements_all.txt index 00a1aa12445..67d4e762c3e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -568,7 +568,7 @@ pyairvisual==1.0.0 pyalarmdotcom==0.3.0 # homeassistant.components.arlo -pyarlo==0.0.6 +pyarlo==0.0.7 # homeassistant.components.notify.xmpp pyasn1-modules==0.1.4