2 from aiohttp import ClientSession
6 from dateutil.parser import parse
12 class garage_door_renderer(renderer.debuggable_abstaining_renderer):
13 def __init__(self, name_to_timeout_dict):
14 super(garage_door_renderer, self).__init__(name_to_timeout_dict, False)
16 self.last_update = None
18 def debug_prefix(self):
21 def periodic_render(self, key):
23 self.last_update = datetime.datetime.now()
24 return asyncio.run(self.poll_myq())
25 elif key == "Update Page":
26 return self.update_page()
28 raise error("Unknown operaiton")
30 async def poll_myq(self):
31 async with ClientSession() as websession:
32 myq = await pymyq.login(
33 secrets.myq_username, secrets.myq_password, websession
35 self.doors = myq.devices
36 return len(self.doors) > 0
38 def update_page(self):
39 f = file_writer.file_writer(constants.myq_pagename)
42 <H1>Garage Door Status</H1>
43 <!-- Last updated at %s -->
45 <TABLE BORDER=0 WIDTH=99%%>
50 html = self.do_door("Near House")
55 html = self.do_door("Middle Door")
67 def get_state_icon(self, state):
69 return "/icons/garage_open.png"
70 elif state == "closed":
71 return "/icons/garage_closed.png"
72 elif state == "opening":
73 return "/icons/garage_opening.png"
74 elif state == "closing":
75 return "/icons/garage_closing.png"
77 return str(state) + ", an unknown state for the door."
79 def do_door(self, name):
80 for key in self.doors:
81 door = self.doors[key]
83 j = self.doors[key].json
84 state = j["state"]["door_state"]
86 # "last_update": "2020-07-04T18:11:34.2981419Z"
87 raw = j["state"]["last_update"]
90 now = datetime.datetime.now(tz_info)
91 delta = (now - ts).total_seconds()
92 now = datetime.datetime.now()
93 is_night = now.hour <= 7 or now.hour >= 21
94 days = divmod(delta, constants.seconds_per_day)
95 hours = divmod(days[1], constants.seconds_per_hour)
96 minutes = divmod(hours[1], constants.seconds_per_minute)
98 if is_night and door.state == "open":
99 color = "border-color: #ff0000;"
107 <FONT STYLE="font-size:26pt">%s<BR>
110 STYLE="border-style: solid; border-width: %dpx; %s">
113 for %d day(s), %02d:%02d.
117 self.get_state_icon(state),
129 x = garage_door_renderer({"Test": 1})
130 x.periodic_render("Poll MyQ")
131 x.periodic_render("Update Page")