Skip to content

Commit

Permalink
Merge pull request #77 from fronzbot/v0.8.1
Browse files Browse the repository at this point in the history
v0.8.1
  • Loading branch information
fronzbot authored Sep 24, 2018
2 parents 0d83a7f + 3713485 commit 9335a37
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 18 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.pytest_cache/*
.cache/*
.tox/*
__pycache__/*
Expand Down
3 changes: 3 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ Changelog

A list of changes between each release

0.9.0.dev (Development Version)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.8.0 (2018-05-21)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Added support for battery voltage level (fixes `#64 <https://github.com/fronzbot/blinkpy/issues/64>`_)
Expand Down
35 changes: 29 additions & 6 deletions blinkpy/blinkpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

_LOGGER = logging.getLogger('blinkpy')

MAX_CLIPS = 5


def _attempt_reauthorization(blink):
"""Attempt to refresh auth token and links."""
Expand Down Expand Up @@ -79,7 +81,7 @@ class BlinkAuthenticationException(BlinkException):
pass


class BlinkURLHandler(object):
class BlinkURLHandler():
"""Class that handles Blink URLS."""

def __init__(self, region_id):
Expand All @@ -93,7 +95,7 @@ def __init__(self, region_id):
_LOGGER.debug("Setting base url to %s.", self.base_url)


class BlinkCamera(object):
class BlinkCamera():
"""Class to initialize individual camera."""

def __init__(self, config, blink):
Expand All @@ -118,6 +120,8 @@ def __init__(self, config, blink):
self.motion_detected = None
self.wifi_strength = None
self.camera_config = dict()
self.motion_enabled = None
self.last_record = list()

@property
def attributes(self):
Expand All @@ -132,10 +136,12 @@ def attributes(self):
'battery': self.battery,
'thumbnail': self.thumbnail,
'video': self.clip,
'motion_enabled': self.motion_enabled,
'notifications': self.notifications,
'motion_detected': self.motion_detected,
'wifi_strength': self.wifi_strength,
'network_id': self.blink.network_id
'network_id': self.blink.network_id,
'last_record': self.last_record
}
return attributes

Expand Down Expand Up @@ -205,13 +211,31 @@ def update(self, values):

try:
self.battery_voltage = cfg['camera'][0]['battery_voltage']
self.motion_detected = cfg['camera'][0]['motion_alert']
self.motion_enabled = cfg['camera'][0]['motion_alert']
self.wifi_strength = cfg['camera'][0]['wifi_strength']
self.temperature = cfg['camera'][0]['temperature']
except KeyError:
_LOGGER.warning("Problem extracting config for camera %s",
self.name)

# Check if the most recent clip is included in the last_record list
# and that the last_record list is populated
try:
new_clip = self.blink.videos[self.name][0]['clip']
if new_clip not in self.last_record and self.last_record:
self.motion_detected = True
self.last_record.insert(0, new_clip)
if len(self.last_record) > MAX_CLIPS:
self.last_record.pop()
elif not self.last_record:
self.last_record.insert(0, new_clip)
self.motion_detected = False
else:
self.motion_detected = False
except KeyError:
_LOGGER.warning("Could not extract clip info from camera %s",
self.name)

def image_refresh(self):
"""Refresh current thumbnail."""
url = self.urls.home_url
Expand Down Expand Up @@ -248,7 +272,7 @@ def video_to_file(self, path):
copyfileobj(response.raw, vidfile)


class Blink(object):
class Blink():
"""Class to initialize communication and sync module."""

def __init__(self, username=None, password=None):
Expand Down Expand Up @@ -348,7 +372,6 @@ def refresh(self):
camera.update(element)
except KeyError:
pass
return None

def get_videos(self, start_page=0, end_page=1):
"""Retrieve last recorded videos per camera."""
Expand Down
2 changes: 1 addition & 1 deletion blinkpy/helpers/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

MAJOR_VERSION = 0
MINOR_VERSION = 8
PATCH_VERSION = 0
PATCH_VERSION = 1

__version__ = '{}.{}.{}'.format(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION)

Expand Down
4 changes: 3 additions & 1 deletion pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ reports=no
# unused-argument - generic callbacks and setup methods create a lot of warnings
# too-many-* - are not enforced for the sake of readability
# too-few-* - same as too-many-*
# no-else-return - I don't see any reason to enforce this. both forms are readable

disable=
locally-disabled,
Expand All @@ -20,4 +21,5 @@ disable=
too-many-return-statements,
too-many-statements,
too-many-lines,
too-few-public-methods,
too-few-public-methods,
no-else-return,
12 changes: 6 additions & 6 deletions requirements_test.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
flake8==3.3
flake8-docstrings==1.1.0
pylint==1.8.1
pydocstyle==2.0.0
pytest==3.3.1
flake8==3.5.0
flake8-docstrings==1.3.0
pylint==2.1.1
pydocstyle==2.1.1
pytest==3.7.1
pytest-cov>=2.3.1
pytest-sugar>=0.9.0
pytest-timeout>=1.0.0
restructuredtext-lint>=1.0.1
pygments>=2.2.0
pygments>=2.2.0
3 changes: 2 additions & 1 deletion tests/mock_responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def json(self):
response_to_return = {'message': 'Error', 'code': 404}
code_to_return = 404

if url_arg == const.LOGIN_URL or url_arg == const.LOGIN_BACKUP_URL:
if url_arg in (const.LOGIN_URL, const.LOGIN_BACKUP_URL):
response_to_return = LOGIN_RESPONSE
code_to_return = 200
elif url_arg is not None:
Expand Down Expand Up @@ -77,6 +77,7 @@ def raw(self):

url_arg = args[0]

# pylint: disable=R1711
if url_arg == 'use_bad_response':
return MockGetResponse({'foo': 'bar'}, 200)
elif url_arg == 'reauth':
Expand Down
4 changes: 2 additions & 2 deletions tests/test_blink_cameras.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def test_camera_properties(self, mock_get, mock_post, mock_cfg):
self.assertEqual(camera.battery_string, "OK")
self.assertEqual(camera.notifications, 2)
self.assertEqual(camera.region_id, 'test')
self.assertEqual(camera.motion_detected, True)
self.assertEqual(camera.motion_enabled, True)
self.assertEqual(camera.wifi_strength, -30)

camera_config = self.camera_config
Expand Down Expand Up @@ -154,5 +154,5 @@ def test_camera_attributes(self, mock_cfg):
self.assertEqual(camera_attr['battery'], 50)
self.assertEqual(camera_attr['notifications'], 2)
self.assertEqual(camera_attr['network_id'], '0000')
self.assertEqual(camera_attr['motion_detected'], True)
self.assertEqual(camera_attr['motion_enabled'], True)
self.assertEqual(camera_attr['wifi_strength'], -30)
2 changes: 1 addition & 1 deletion tests/test_blink_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import unittest
from unittest import mock
from blinkpy import blinkpy as blinkpy
from blinkpy import blinkpy
import tests.mock_responses as mresp

USERNAME = 'foobar'
Expand Down

0 comments on commit 9335a37

Please sign in to comment.