Motion detection now working, removed get_videos method

This commit is contained in:
Kevin Fronczak
2019-01-25 20:44:31 -05:00
parent 559cc4a5ac
commit 8fd989e991
3 changed files with 40 additions and 96 deletions
+3 -1
View File
@@ -166,7 +166,9 @@ class Blink():
for sync_name, sync_module in self.sync.items():
_LOGGER.debug("Attempting refresh of sync %s", sync_name)
sync_module.refresh(force_cache=force_cache)
self.last_refresh = int(time.time())
if not force_cache:
# Prevents rapid clearing of motion detect property
self.last_refresh = int(time.time())
def check_if_ok_to_update(self):
"""Check if it is ok to perform an http request."""
+9 -25
View File
@@ -28,7 +28,7 @@ class BlinkCamera():
self.battery_state = None
self.motion_detected = None
self.wifi_strength = None
self.last_record = []
self.last_record = None
self._cached_image = None
self._cached_video = None
@@ -128,12 +128,15 @@ class BlinkCamera():
new_thumbnail = "{}{}.jpg".format(self.sync.urls.base_url,
thumb_addr)
# Check if a new motion clip has been recorded
# check_for_motion_method sets motion_detected variable
self.check_for_motion()
try:
self.motion_detected = self.sync.motion[self.name]
except KeyError:
self.motion_detected = False
clip_addr = None
if self.last_record:
clip_addr = self.sync.all_clips[self.name][self.last_record[0]]
if self.name in self.sync.last_record:
clip_addr = self.sync.last_record[self.name]['clip']
self.last_record = self.sync.last_record[self.name]['time']
self.clip = "{}{}".format(self.sync.urls.base_url,
clip_addr)
@@ -158,25 +161,6 @@ class BlinkCamera():
stream=True,
json=False)
def check_for_motion(self):
"""Check if motion detected.."""
try:
records = sorted(self.sync.record_dates[self.name])
new_clip = records.pop()
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.info("Could not extract clip info from camera %s",
self.name)
def image_to_file(self, path):
"""
Write image to file.
+28 -70
View File
@@ -32,11 +32,10 @@ class BlinkSyncModule():
self.summary = None
self.homescreen = None
self.network_info = None
self.record_dates = {}
self.videos = {}
self.events = []
self.cameras = CaseInsensitiveDict({})
self.all_clips = {}
self.motion = {}
self.last_record = {}
@property
def attributes(self):
@@ -85,22 +84,17 @@ class BlinkSyncModule():
self.status = self.summary['status']
self.events = self.get_events()
self.homescreen = api.request_homescreen(self.blink)
self.network_info = api.request_network_status(self.blink,
self.network_id)
self.check_new_videos()
camera_info = self.get_camera_info()
for camera_config in camera_info:
name = camera_config['name']
self.cameras[name] = BlinkCamera(self)
self.videos = self.get_videos()
for camera_config in camera_info:
name = camera_config['name']
if name in self.cameras:
self.cameras[name].update(camera_config, force_cache=True)
self.motion[name] = False
self.cameras[name].update(camera_config, force_cache=True)
def get_events(self):
"""Retrieve events from server."""
@@ -115,74 +109,38 @@ class BlinkSyncModule():
def refresh(self, force_cache=False):
"""Get all blink cameras and pulls their most recent status."""
self.events = self.get_events()
self.videos = self.get_videos()
self.homescreen = api.request_homescreen(self.blink)
self.network_info = api.request_network_status(self.blink,
self.network_id)
camera_info = self.get_camera_info()
self.check_new_videos()
for camera_config in camera_info:
name = camera_config['name']
self.cameras[name].update(camera_config, force_cache=force_cache)
def get_videos(self, start_page=0, end_page=0):
"""
Retrieve last recorded videos per camera.
:param start_page: Page to start reading from on blink servers
(defaults to 0)
:param end_page: Page to stop reading from (defaults to 0)
"""
videos = list()
all_dates = dict()
def check_new_videos(self):
"""Check if new videos since last refresh."""
resp = api.request_videos(self.blink,
time=self.blink.last_refresh,
page=0)
try:
info = resp['videos']
except (KeyError, TypeError):
_LOGGER.warning("Could not check for motion. Response: %s", resp)
return False
for page_num in range(start_page, end_page + 1):
this_page = api.request_videos(self.blink,
time=self.blink.last_refresh,
page=page_num)
if not this_page:
break
elif 'message' in this_page:
_LOGGER.warning("Could not retrieve videos. Message: %s",
this_page['message'])
break
for camera in self.cameras.keys():
self.motion[camera] = False
videos.append(this_page)
_LOGGER.debug("Getting videos from page %s through %s",
start_page,
end_page)
for entry in info:
try:
name = entry['camera_name']
clip = entry['address']
timestamp = entry['created_at']
self.motion[name] = True
self.last_record[name] = {'clip': clip, 'time': timestamp}
except KeyError:
_LOGGER.info("Could not extract info from video entry.")
for page in videos:
for entry in page['videos']:
try:
camera_name = entry['camera_name']
clip_addr = entry['address']
thumb_addr = entry['thumbnail']
except TypeError:
_LOGGER.info("No videos since last refresh.")
break
clip_date = entry['created_at']
try:
self.all_clips[camera_name][clip_date] = clip_addr
except KeyError:
self.all_clips[camera_name] = {clip_date: clip_addr}
if camera_name not in all_dates:
all_dates[camera_name] = list()
all_dates[camera_name].append(clip_date)
try:
self.videos[camera_name].append(
{
'clip': clip_addr,
'thumb': thumb_addr,
}
)
except KeyError:
self.videos[camera_name] = [
{
'clip': clip_addr,
'thumb': thumb_addr,
}
]
self.record_dates = all_dates
_LOGGER.debug("Retrieved a total of %s records", len(all_dates))
return self.videos
return True