From f35f7414765f91287455fb09d419ca0249a50bb4 Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Sun, 15 Oct 2017 17:11:17 -0700 Subject: [PATCH 1/8] Reduce update calls to API. Add signal strength monitor. --- homeassistant/components/arlo.py | 2 +- homeassistant/components/camera/arlo.py | 61 +++++++++++++++++++------ homeassistant/components/sensor/arlo.py | 23 +++++++++- requirements_all.txt | 2 +- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/arlo.py b/homeassistant/components/arlo.py index f3397a884d17..2b80ff97e0de 100644 --- a/homeassistant/components/arlo.py +++ b/homeassistant/components/arlo.py @@ -12,7 +12,7 @@ from homeassistant.helpers import config_validation as cv from homeassistant.const import CONF_USERNAME, CONF_PASSWORD -REQUIREMENTS = ['pyarlo==0.0.7'] +REQUIREMENTS = ['pyarlo==0.0.8'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index be58b61fb8c8..1ad0af337d44 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -6,7 +6,7 @@ """ import asyncio import logging -from datetime import timedelta +from datetime import datetime, timedelta import voluptuous as vol @@ -14,12 +14,12 @@ from homeassistant.components.arlo import DEFAULT_BRAND, DATA_ARLO from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import DATA_FFMPEG -from homeassistant.const import ATTR_BATTERY_LEVEL +from homeassistant.const import ATTR_BATTERY_LEVEL, STATE_UNKNOWN from homeassistant.helpers.aiohttp_client import async_aiohttp_proxy_stream _LOGGER = logging.getLogger(__name__) -SCAN_INTERVAL = timedelta(minutes=10) +SCAN_INTERVAL = timedelta(seconds=90) ARLO_MODE_ARMED = 'armed' ARLO_MODE_DISARMED = 'disarmed' @@ -31,15 +31,16 @@ ATTR_POWERSAVE = 'power_save_mode' ATTR_SIGNAL_STRENGTH = 'signal_strength' ATTR_UNSEEN_VIDEOS = 'unseen_videos' +ATTR_LAST_REFRESH = 'last_refresh' CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' DEPENDENCIES = ['arlo', 'ffmpeg'] POWERSAVE_MODE_MAPPING = { - 1: 'best_battery_life', - 2: 'optimized', - 3: 'best_video' + '1': 'best_battery_life', + '2': 'optimized', + '3': 'best_video' } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @@ -73,6 +74,7 @@ def __init__(self, hass, camera, device_info): self._motion_status = False self._ffmpeg = hass.data[DATA_FFMPEG] self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) + self._last_refresh = None self.attrs = {} def camera_image(self): @@ -113,6 +115,7 @@ def device_state_attributes(self): 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), + ATTR_LAST_REFRESH: self.attrs.get(ATTR_LAST_REFRESH), } @property @@ -158,15 +161,43 @@ def disable_motion_detection(self): self._motion_status = False self.set_base_station_mode(ARLO_MODE_DISARMED) + def clean_attr(self, attr): + """Return unknown if attribute is None (non-subscriptable).""" + return str(attr) if attr is not None else STATE_UNKNOWN + 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, + base_stations = self._camera._session.base_stations + + if not base_stations: + return None + + base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() + + base_stations[0].update() + self._camera.update() + + battery_level = self.clean_attr(self._camera.get_battery_level) + brightness = self.clean_attr(self._camera.get_brightness) + flip_state = self.clean_attr(self._camera.get_flip_state) + mirror_state = self.clean_attr(self._camera.get_mirror_state) + motion_sensitivity = self.clean_attr( + self._camera.get_motion_detection_sensitivity) + powersave_mode = self.clean_attr(self._camera.get_powersave_mode) + signal_strength = self.clean_attr(self._camera.get_signal_strength) + unseen_videos = self.clean_attr(self._camera.unseen_videos) + + self.attrs[ATTR_BATTERY_LEVEL] = battery_level + self.attrs[ATTR_BRIGHTNESS] = brightness + self.attrs[ATTR_FLIPPED] = flip_state + self.attrs[ATTR_MIRRORED] = mirror_state + self.attrs[ATTR_MOTION] = motion_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 + powersave_mode] if powersave_mode != STATE_UNKNOWN \ + else STATE_UNKNOWN + self.attrs[ATTR_SIGNAL_STRENGTH] = signal_strength + self.attrs[ATTR_UNSEEN_VIDEOS] = unseen_videos + + self.attrs[ATTR_LAST_REFRESH] = (datetime.fromtimestamp( + base_stations[0]._last_refresh).strftime("%A, %B %d, %Y %I:%M:%S") + if base_stations[0]._last_refresh else STATE_UNKNOWN) diff --git a/homeassistant/components/sensor/arlo.py b/homeassistant/components/sensor/arlo.py index f665d8e70ab0..9a6d17be50fd 100644 --- a/homeassistant/components/sensor/arlo.py +++ b/homeassistant/components/sensor/arlo.py @@ -29,7 +29,8 @@ 'last_capture': ['Last', None, 'run-fast'], 'total_cameras': ['Arlo Cameras', None, 'video'], 'captured_today': ['Captured Today', None, 'file-video'], - 'battery_level': ['Battery Level', '%', 'battery-50'] + 'battery_level': ['Battery Level', '%', 'battery-50'], + 'signal_strength': ['Signal Strength', None, 'signal'] } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @@ -97,6 +98,17 @@ def unit_of_measurement(self): def update(self): """Get the latest data and updates the state.""" + try: + base_stations = self._data._session.base_stations + except (AttributeError, IndexError): + return None + + if not base_stations: + return None + + base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() + + base_stations[0].update() self._data.update() if self._sensor_type == 'total_cameras': @@ -118,6 +130,12 @@ def update(self): except TypeError: self._state = None + elif self._sensor_type == 'signal_strength': + try: + self._state = self._data.get_signal_strength + except TypeError: + self._state = None + @property def device_state_attributes(self): """Return the device state attributes.""" @@ -128,7 +146,8 @@ def device_state_attributes(self): if self._sensor_type == 'last_capture' or \ self._sensor_type == 'captured_today' or \ - self._sensor_type == 'battery_level': + self._sensor_type == 'battery_level' or \ + self._sensor_type == 'signal_strength': attrs['model'] = self._data.model_id return attrs diff --git a/requirements_all.txt b/requirements_all.txt index 83012a46ee5d..27e4fe470ecd 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.7 +pyarlo==0.0.8 # homeassistant.components.notify.xmpp pyasn1-modules==0.1.5 From fef84dbc24dd40d4cea8d41ba6a885934a39076a Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Mon, 16 Oct 2017 00:24:59 -0700 Subject: [PATCH 2/8] Fix lint errors --- homeassistant/components/camera/arlo.py | 13 +++++++++---- homeassistant/components/sensor/arlo.py | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index 1ad0af337d44..56809dc38dea 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -161,17 +161,20 @@ def disable_motion_detection(self): self._motion_status = False self.set_base_station_mode(ARLO_MODE_DISARMED) - def clean_attr(self, attr): + @staticmethod + def clean_attr(attr): """Return unknown if attribute is None (non-subscriptable).""" return str(attr) if attr is not None else STATE_UNKNOWN def update(self): """Add an attribute-update task to the executor pool.""" + # pylint: disable=W0212 base_stations = self._camera._session.base_stations if not base_stations: return None + # pylint: disable=W0212 base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() base_stations[0].update() @@ -198,6 +201,8 @@ def update(self): self.attrs[ATTR_SIGNAL_STRENGTH] = signal_strength self.attrs[ATTR_UNSEEN_VIDEOS] = unseen_videos - self.attrs[ATTR_LAST_REFRESH] = (datetime.fromtimestamp( - base_stations[0]._last_refresh).strftime("%A, %B %d, %Y %I:%M:%S") - if base_stations[0]._last_refresh else STATE_UNKNOWN) + # pylint: disable=W0212 + self.attrs[ATTR_LAST_REFRESH] = datetime.fromtimestamp( + base_stations[0]._last_refresh).strftime( + "%A, %B %d, %Y %I:%M:%S") if base_stations[0]._last_refresh \ + else STATE_UNKNOWN diff --git a/homeassistant/components/sensor/arlo.py b/homeassistant/components/sensor/arlo.py index 9a6d17be50fd..602676090f53 100644 --- a/homeassistant/components/sensor/arlo.py +++ b/homeassistant/components/sensor/arlo.py @@ -99,6 +99,7 @@ def unit_of_measurement(self): def update(self): """Get the latest data and updates the state.""" try: + # pylint: disable=W0212 base_stations = self._data._session.base_stations except (AttributeError, IndexError): return None @@ -106,6 +107,7 @@ def update(self): if not base_stations: return None + # pylint: disable=W0212 base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() base_stations[0].update() From 07cee6d790656951b9aebf73b1f8483ecb97fa83 Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Mon, 16 Oct 2017 00:50:17 -0700 Subject: [PATCH 3/8] Fix indent --- homeassistant/components/camera/arlo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index 56809dc38dea..e9e548ee2994 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -205,4 +205,4 @@ def update(self): self.attrs[ATTR_LAST_REFRESH] = datetime.fromtimestamp( base_stations[0]._last_refresh).strftime( "%A, %B %d, %Y %I:%M:%S") if base_stations[0]._last_refresh \ - else STATE_UNKNOWN + else STATE_UNKNOWN From 941d708bfcb59e88e1c6857627728abcd1dc0bdd Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Fri, 3 Nov 2017 02:55:09 -0700 Subject: [PATCH 4/8] Update pyarlo version and review fixes --- homeassistant/components/arlo.py | 2 +- homeassistant/components/camera/arlo.py | 68 +++++++++++-------------- homeassistant/components/sensor/arlo.py | 13 ++--- requirements_all.txt | 2 +- 4 files changed, 36 insertions(+), 49 deletions(-) diff --git a/homeassistant/components/arlo.py b/homeassistant/components/arlo.py index 2b80ff97e0de..a78b334de0bf 100644 --- a/homeassistant/components/arlo.py +++ b/homeassistant/components/arlo.py @@ -12,7 +12,7 @@ from homeassistant.helpers import config_validation as cv from homeassistant.const import CONF_USERNAME, CONF_PASSWORD -REQUIREMENTS = ['pyarlo==0.0.8'] +REQUIREMENTS = ['pyarlo==0.1.0'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index e9e548ee2994..57f277aa7ad2 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -14,7 +14,7 @@ from homeassistant.components.arlo import DEFAULT_BRAND, DATA_ARLO from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import DATA_FFMPEG -from homeassistant.const import ATTR_BATTERY_LEVEL, STATE_UNKNOWN +from homeassistant.const import ATTR_BATTERY_LEVEL from homeassistant.helpers.aiohttp_client import async_aiohttp_proxy_stream _LOGGER = logging.getLogger(__name__) @@ -38,9 +38,9 @@ DEPENDENCIES = ['arlo', 'ffmpeg'] POWERSAVE_MODE_MAPPING = { - '1': 'best_battery_life', - '2': 'optimized', - '3': 'best_video' + 1: 'best_battery_life', + 2: 'optimized', + 3: 'best_video' } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @@ -162,47 +162,37 @@ def disable_motion_detection(self): self.set_base_station_mode(ARLO_MODE_DISARMED) @staticmethod - def clean_attr(attr): - """Return unknown if attribute is None (non-subscriptable).""" - return str(attr) if attr is not None else STATE_UNKNOWN + def set_defined_attr(self, attr_name, attr_value): + """Set attribute if attribute is not None (non-subscriptable).""" + if attr_value is not None: + self.attrs[attr_name] = str(attr_value) def update(self): """Add an attribute-update task to the executor pool.""" - # pylint: disable=W0212 - base_stations = self._camera._session.base_stations + base_station = self._camera.base_station - if not base_stations: + if not base_station: return None - # pylint: disable=W0212 - base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() + base_station.refresh_rate = SCAN_INTERVAL.total_seconds() - base_stations[0].update() self._camera.update() - battery_level = self.clean_attr(self._camera.get_battery_level) - brightness = self.clean_attr(self._camera.get_brightness) - flip_state = self.clean_attr(self._camera.get_flip_state) - mirror_state = self.clean_attr(self._camera.get_mirror_state) - motion_sensitivity = self.clean_attr( - self._camera.get_motion_detection_sensitivity) - powersave_mode = self.clean_attr(self._camera.get_powersave_mode) - signal_strength = self.clean_attr(self._camera.get_signal_strength) - unseen_videos = self.clean_attr(self._camera.unseen_videos) - - self.attrs[ATTR_BATTERY_LEVEL] = battery_level - self.attrs[ATTR_BRIGHTNESS] = brightness - self.attrs[ATTR_FLIPPED] = flip_state - self.attrs[ATTR_MIRRORED] = mirror_state - self.attrs[ATTR_MOTION] = motion_sensitivity - self.attrs[ATTR_POWERSAVE] = POWERSAVE_MODE_MAPPING[ - powersave_mode] if powersave_mode != STATE_UNKNOWN \ - else STATE_UNKNOWN - self.attrs[ATTR_SIGNAL_STRENGTH] = signal_strength - self.attrs[ATTR_UNSEEN_VIDEOS] = unseen_videos - - # pylint: disable=W0212 - self.attrs[ATTR_LAST_REFRESH] = datetime.fromtimestamp( - base_stations[0]._last_refresh).strftime( - "%A, %B %d, %Y %I:%M:%S") if base_stations[0]._last_refresh \ - else STATE_UNKNOWN + self.set_defined_attr(self, ATTR_BATTERY_LEVEL, self._camera.battery_level) + self.set_defined_attr(self, ATTR_BRIGHTNESS, self._camera.brightness) + self.set_defined_attr(self, ATTR_FLIPPED, self._camera.flip_state) + self.set_defined_attr(self, ATTR_MIRRORED, self._camera.mirror_state) + self.set_defined_attr(self, ATTR_MOTION, + self._camera.motion_detection_sensitivity) + self.set_defined_attr(self, ATTR_SIGNAL_STRENGTH, + self._camera.signal_strength) + self.set_defined_attr(self, ATTR_UNSEEN_VIDEOS, self._camera.unseen_videos) + + powersave_mode = self._camera.powersave_mode + if powersave_mode: + self.attrs[ATTR_POWERSAVE] = POWERSAVE_MODE_MAPPING[powersave_mode] + + last_refresh = base_station.last_refresh + if last_refresh: + self.attrs[ATTR_LAST_REFRESH] = datetime.fromtimestamp( + last_refresh).strftime("%A, %B %d, %Y %I:%M:%S") diff --git a/homeassistant/components/sensor/arlo.py b/homeassistant/components/sensor/arlo.py index 602676090f53..a0d9e9570b8d 100644 --- a/homeassistant/components/sensor/arlo.py +++ b/homeassistant/components/sensor/arlo.py @@ -99,18 +99,15 @@ def unit_of_measurement(self): def update(self): """Get the latest data and updates the state.""" try: - # pylint: disable=W0212 - base_stations = self._data._session.base_stations + base_station = self._data.base_station except (AttributeError, IndexError): return None - if not base_stations: + if not base_station: return None - # pylint: disable=W0212 - base_stations[0]._refresh_rate = SCAN_INTERVAL.total_seconds() + base_station.refresh_rate = SCAN_INTERVAL.total_seconds() - base_stations[0].update() self._data.update() if self._sensor_type == 'total_cameras': @@ -128,13 +125,13 @@ def update(self): elif self._sensor_type == 'battery_level': try: - self._state = self._data.get_battery_level + self._state = self._data.battery_level except TypeError: self._state = None elif self._sensor_type == 'signal_strength': try: - self._state = self._data.get_signal_strength + self._state = self._data.signal_strength except TypeError: self._state = None diff --git a/requirements_all.txt b/requirements_all.txt index 27e4fe470ecd..3d42720c18d6 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.8 +pyarlo==0.1.0 # homeassistant.components.notify.xmpp pyasn1-modules==0.1.5 From cec96ab4d21aa8d6a0230b28096508a3a617282c Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Fri, 3 Nov 2017 02:58:01 -0700 Subject: [PATCH 5/8] Fix lint errors --- homeassistant/components/camera/arlo.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index 57f277aa7ad2..b112c6e47415 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -178,15 +178,20 @@ def update(self): self._camera.update() - self.set_defined_attr(self, ATTR_BATTERY_LEVEL, self._camera.battery_level) - self.set_defined_attr(self, ATTR_BRIGHTNESS, self._camera.brightness) - self.set_defined_attr(self, ATTR_FLIPPED, self._camera.flip_state) - self.set_defined_attr(self, ATTR_MIRRORED, self._camera.mirror_state) + self.set_defined_attr(self, ATTR_BATTERY_LEVEL, + self._camera.battery_level) + self.set_defined_attr(self, ATTR_BRIGHTNESS, + self._camera.brightness) + self.set_defined_attr(self, ATTR_FLIPPED, + self._camera.flip_state) + self.set_defined_attr(self, ATTR_MIRRORED, + self._camera.mirror_state) self.set_defined_attr(self, ATTR_MOTION, self._camera.motion_detection_sensitivity) self.set_defined_attr(self, ATTR_SIGNAL_STRENGTH, self._camera.signal_strength) - self.set_defined_attr(self, ATTR_UNSEEN_VIDEOS, self._camera.unseen_videos) + self.set_defined_attr(self, ATTR_UNSEEN_VIDEOS, + self._camera.unseen_videos) powersave_mode = self._camera.powersave_mode if powersave_mode: From f5421e65113ee31db9bbeb5d1aac5d8d84011157 Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Fri, 3 Nov 2017 10:41:20 -0700 Subject: [PATCH 6/8] Remove staticmethod --- homeassistant/components/camera/arlo.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index b112c6e47415..3b3ea83d7925 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -161,7 +161,6 @@ def disable_motion_detection(self): self._motion_status = False self.set_base_station_mode(ARLO_MODE_DISARMED) - @staticmethod def set_defined_attr(self, attr_name, attr_value): """Set attribute if attribute is not None (non-subscriptable).""" if attr_value is not None: @@ -178,19 +177,19 @@ def update(self): self._camera.update() - self.set_defined_attr(self, ATTR_BATTERY_LEVEL, + self.set_defined_attr(ATTR_BATTERY_LEVEL, self._camera.battery_level) - self.set_defined_attr(self, ATTR_BRIGHTNESS, + self.set_defined_attr(ATTR_BRIGHTNESS, self._camera.brightness) - self.set_defined_attr(self, ATTR_FLIPPED, + self.set_defined_attr(ATTR_FLIPPED, self._camera.flip_state) - self.set_defined_attr(self, ATTR_MIRRORED, + self.set_defined_attr(ATTR_MIRRORED, self._camera.mirror_state) - self.set_defined_attr(self, ATTR_MOTION, + self.set_defined_attr(ATTR_MOTION, self._camera.motion_detection_sensitivity) - self.set_defined_attr(self, ATTR_SIGNAL_STRENGTH, + self.set_defined_attr(ATTR_SIGNAL_STRENGTH, self._camera.signal_strength) - self.set_defined_attr(self, ATTR_UNSEEN_VIDEOS, + self.set_defined_attr(ATTR_UNSEEN_VIDEOS, self._camera.unseen_videos) powersave_mode = self._camera.powersave_mode From e73dc10e2b0fd77267218f791c79bf9680e70f27 Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Mon, 13 Nov 2017 15:49:44 -0800 Subject: [PATCH 7/8] Clean up attributes --- homeassistant/components/camera/arlo.py | 59 ++++++------------------- 1 file changed, 13 insertions(+), 46 deletions(-) diff --git a/homeassistant/components/camera/arlo.py b/homeassistant/components/camera/arlo.py index 3b3ea83d7925..4f5977717262 100644 --- a/homeassistant/components/camera/arlo.py +++ b/homeassistant/components/camera/arlo.py @@ -6,7 +6,7 @@ """ import asyncio import logging -from datetime import datetime, timedelta +from datetime import timedelta import voluptuous as vol @@ -75,6 +75,7 @@ def __init__(self, hass, camera, device_info): self._ffmpeg = hass.data[DATA_FFMPEG] self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) self._last_refresh = None + self._camera.base_station.refresh_rate = SCAN_INTERVAL.total_seconds() self.attrs = {} def camera_image(self): @@ -107,15 +108,17 @@ def name(self): def device_state_attributes(self): """Return the state attributes.""" return { - 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), - ATTR_LAST_REFRESH: self.attrs.get(ATTR_LAST_REFRESH), + name: value for name, value in ( + (ATTR_BATTERY_LEVEL, self._camera.battery_level), + (ATTR_BRIGHTNESS, self._camera.brightness), + (ATTR_FLIPPED, self._camera.flip_state), + (ATTR_MIRRORED, self._camera.mirror_state), + (ATTR_MOTION, self._camera.motion_detection_sensitivity), + (ATTR_POWERSAVE, POWERSAVE_MODE_MAPPING.get( + self._camera.powersave_mode)), + (ATTR_SIGNAL_STRENGTH, self._camera.signal_strength), + (ATTR_UNSEEN_VIDEOS, self._camera.unseen_videos), + ) if value is not None } @property @@ -161,42 +164,6 @@ def disable_motion_detection(self): self._motion_status = False self.set_base_station_mode(ARLO_MODE_DISARMED) - def set_defined_attr(self, attr_name, attr_value): - """Set attribute if attribute is not None (non-subscriptable).""" - if attr_value is not None: - self.attrs[attr_name] = str(attr_value) - def update(self): """Add an attribute-update task to the executor pool.""" - base_station = self._camera.base_station - - if not base_station: - return None - - base_station.refresh_rate = SCAN_INTERVAL.total_seconds() - self._camera.update() - - self.set_defined_attr(ATTR_BATTERY_LEVEL, - self._camera.battery_level) - self.set_defined_attr(ATTR_BRIGHTNESS, - self._camera.brightness) - self.set_defined_attr(ATTR_FLIPPED, - self._camera.flip_state) - self.set_defined_attr(ATTR_MIRRORED, - self._camera.mirror_state) - self.set_defined_attr(ATTR_MOTION, - self._camera.motion_detection_sensitivity) - self.set_defined_attr(ATTR_SIGNAL_STRENGTH, - self._camera.signal_strength) - self.set_defined_attr(ATTR_UNSEEN_VIDEOS, - self._camera.unseen_videos) - - powersave_mode = self._camera.powersave_mode - if powersave_mode: - self.attrs[ATTR_POWERSAVE] = POWERSAVE_MODE_MAPPING[powersave_mode] - - last_refresh = base_station.last_refresh - if last_refresh: - self.attrs[ATTR_LAST_REFRESH] = datetime.fromtimestamp( - last_refresh).strftime("%A, %B %d, %Y %I:%M:%S") From 76ff92fc3be9d6842cbb95c0bf5f09939c3177b4 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 14 Nov 2017 15:51:22 +0100 Subject: [PATCH 8/8] Update arlo.py --- homeassistant/components/sensor/arlo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/arlo.py b/homeassistant/components/sensor/arlo.py index a0d9e9570b8d..97b7ac229094 100644 --- a/homeassistant/components/sensor/arlo.py +++ b/homeassistant/components/sensor/arlo.py @@ -101,10 +101,10 @@ def update(self): try: base_station = self._data.base_station except (AttributeError, IndexError): - return None + return if not base_station: - return None + return base_station.refresh_rate = SCAN_INTERVAL.total_seconds()