etc...
for camera in camera_list:
file = "/timestamps/last_camera_motion_%s" % camera
ts = os.stat(file).st_ctime
- age = now - ts
- # print "Camera: %s, age %s" % (camera, age)
- if age < 60:
+ if (ts != self.last_trigger[camera] and
+ (now - ts) < 10):
+ print("Camera: %s, age %s" % (camera, (now - ts)))
+ self.last_trigger[camera] = ts
cameras_with_recent_triggers += 1
- time_since_last_trigger = now - self.last_trigger[camera]
- self.last_trigger[camera] = now
- if time_since_last_trigger < (60 * 7):
- self.triggers_in_the_past_seven_min[camera] += 1
- else:
- self.triggers_in_the_past_seven_min[camera] = 1
+ self.triggers_in_the_past_seven_min[camera] = 0
+ file = "/timestamps/camera_motion_history_%s" % camera
+ f = open(file, "r")
+ contents = f.readlines()
+ f.close()
+ for x in contents:
+ x.strip()
+ age = now - int(x)
+ if age < (60 * 7):
+ self.triggers_in_the_past_seven_min[camera] += 1
# Second pass, see whether we want to trigger due to
# camera activity we found. All cameras timestamps were
# squelch spammy cameras unless more than one is
# triggered at the same time.
for camera in camera_list:
- if self.last_trigger[camera] == now:
- ts = utils.timestamp()
+ if (now - self.last_trigger[camera]) < 10:
if (self.triggers_in_the_past_seven_min[camera] <= 4 or
cameras_with_recent_triggers > 1):
+ ts = utils.timestamp()
p = self.choose_priority(camera, age)
print(("%s: ****** %s[%d] CAMERA TRIGGER ******" % (
ts, camera, p)))
utils.timestamp()))
for r in renderer_catalog.get_renderers():
now = time.time()
- print("renderer[%s]: Rendering %s" % (utils.timestamp(), r.get_name()))
try:
r.render()
except Exception as e:
print("renderer[%s] unknown error in %s, swallowing it." % (
utils.timestamp(), r.get_name()))
delta = time.time() - now
- print("renderer[%s]: Back from %s, that took %5.2fs." % (
- utils.timestamp(), r.get_name(), delta))
+ if (delta > 1.0):
+ print("renderer[%s]: Warning: %s's rendering took %5.2fs." % (
+ utils.timestamp(), r.get_name(), delta))
print("renderer[%s]: thread having a little break for %ds..." % (
utils.timestamp(), constants.render_period_sec))
time.sleep(constants.render_period_sec)
-#!/usr/local/bin/python3.7
-
import pymyq
from aiohttp import ClientSession
import asyncio
def __init__(self, name_to_timeout_dict):
super(garage_door_renderer, self).__init__(name_to_timeout_dict, False)
self.doors = None
+ self.last_update = None
def debug_prefix(self):
return "myq"
def periodic_render(self, key):
if key == "Poll MyQ":
- asyncio.get_event_loop().run_until_complete(self.poll_myq())
+ self.last_update = datetime.datetime.now()
+ return asyncio.run(self.poll_myq())
elif key == "Update Page":
return self.update_page()
else:
secrets.myq_password,
websession)
self.doors = myq.devices
+ return len(self.doors) > 0
def update_page(self):
f = file_writer.file_writer(constants.myq_pagename)
- now = datetime.datetime.now()
f.write("""
<H1>Garage Door Status</H1>
<!-- Last updated at %s -->
<HR>
<TABLE BORDER=0 WIDTH=99%%>
<TR>
-""" % now)
+""" % self.last_update)
html = self.do_door("Near House")
if html == None:
return False
else:
msg = 'renderer: executing "%s.%s"' % (self.get_name(), key)
if (tries_per_key[key] > 1):
- msg = msg + " (retry %d)" % tries_per_key[key]
+ msg = msg + " (retry #%d)" % tries_per_key[key]
print(msg)
if (self.periodic_render(key)):
self.last_runs[key] = time.time()
# {"Poll" : (hours * 1)}),
myq_renderer.garage_door_renderer(
{"Poll MyQ" : (minutes * 5),
- "Update Page" : (minutes * 5)}),
+ "Update Page" : (always)}),
bellevue_reporter_rss_renderer.bellevue_reporter_rss_renderer(
{"Fetch News" : (hours * 1),
"Shuffle News" : (always)},