6 from dateutil.parser import parse
7 from typing import Any, Dict, Optional
10 from pyutils.datetimes import datetime_utils
14 import kiosk_constants
15 import kiosk_secrets as secrets
19 logger = logging.getLogger(__name__)
22 class ratago_renderer(renderer.abstaining_renderer):
23 def __init__(self, name_to_timeout_dict: Dict[str, int]) -> None:
24 super().__init__(name_to_timeout_dict)
25 self.last_update: Optional[datetime.datetime] = None
26 self.doors: Dict[str, Dict[str, Any]] = {
27 "cover.ratgdo_middle_door_door": {"state": "unknown"},
28 "cover.ratgdo_near_house_door": {"state": "unknown"},
29 "cover.ratgdo_shop_door": {"state": "unknown"},
32 def debug_prefix(self) -> str:
35 def periodic_render(self, key: str) -> bool:
36 if key == "Poll Home Assistant":
37 return self.poll_home_assistant()
38 elif key == "Update Page":
39 return self.update_page()
41 raise Exception("Unknown operaiton")
43 def poll_home_assistant(self) -> bool:
44 key = secrets.homeassistant_api_key
46 "Authorization": f"Bearer {key}",
47 "Content-Type": "application/json",
49 for door in self.doors.keys():
52 f"https://home.acknak.org/api/states/{door}",
57 j = json.loads(r.content.decode())
60 logger.warning("Unable to get state of garage door {door}, using 'unknown'")
62 logger.exception("Unable to get state of garage door {door}, using 'unknown'")
63 self.last_update = datetime_utils.now_pacific()
66 def update_page(self) -> bool:
67 with file_writer.file_writer(kiosk_constants.ratago_pagename) as f:
70 <H1>Garage Door Status</H1>
71 <!-- Last updated at {self.last_update} -->
73 <TABLE BORDER=0 WIDTH=99%>
77 html = self.do_door('cover.ratgdo_near_house_door')
82 html = self.do_door('cover.ratgdo_middle_door_door')
87 html = self.do_door('cover.ratgdo_shop_door')
98 def get_state_icon(self, state: str) -> str:
100 return "/kiosk/images/garage_open.png"
101 elif state == "closed":
102 return "/kiosk/images/garage_closed.png"
103 elif state == "opening":
104 return "/kiosk/images/garage_opening.png"
105 elif state == "closing":
106 return "/kiosk/images/garage_closing.png"
108 return str(state) + ", an unknown state for the door."
110 def do_door(self, name: str) -> Optional[str]:
111 friendly_door_names = {
112 "cover.ratgdo_middle_door_door": "Middle Door",
113 "cover.ratgdo_near_house_door": "Near House Door",
114 "cover.ratgdo_shop_door": "Workshop Door",
116 friendly_name = friendly_door_names.get(name, "unknown")
117 attributes = self.doors[name] #.get(name) #, {"state": "unknown"})
118 state = attributes.get("state", "unknown").lower()
119 since = attributes.get("last_changed", "unknown").lower()
121 # "last_update": "2020-07-04T18:11:34.2981419Z"
122 if since != "unknown":
125 now = datetime.datetime.now(tz_info)
126 delta = (now - ts).total_seconds()
127 duration = datetime_utils.describe_duration_briefly(int(delta))
131 now = datetime.datetime.now()
132 is_night = now.hour <= 7 or now.hour >= 21
134 if is_night and state == "open":
135 color = "border-color: #ff0000;"
137 globals.put("ratago_triggered", True)
141 globals.put("ratago_triggered", False)
145 <FONT STYLE="font-size:26pt">{friendly_name}<BR>
146 <IMG SRC="{self.get_state_icon(state)}"
148 STYLE="border-style: solid; border-width: {width}px; {color}">
150 <B>{state}</B></FONT><BR>
157 #x = ratago_renderer({"Test": 1})
158 #x.periodic_render("Poll Home Assistant")
159 #x.periodic_render("Update Page")