Loading kronk.py +81 −43 Original line number Diff line number Diff line Loading @@ -17,11 +17,18 @@ class Kronk: self.last_space_status_change = time.time() self.last_interaction_time = int(time.time()) self.selector = 0 self.temperature = 0 self.last_sensor_poll = int(time.time()) self.clock_force_draw = 0 self.menu_index = 0 self.selector = 0 self.menus = ["STATUS", "DOORHOLD"] self.status_options = ["OPEN", "CLOSED", "INVISIBLE"] self.doorhold_options = ["TRUE", "FALSE"] self.tasks = [] self.running = True Loading Loading @@ -50,15 +57,26 @@ class Kronk: url = "https://devhack.net/spaceapi.json" sensors = requests.get(url, headers=headers).json() self.temperature = sensors["sensors"]["temperature"][0]["value"] self.ppm = sensors["sensors"]["humidity"][1]["value"] except (IndexError, requests.exceptions.RequestException) as e: print(f"error polling: {e}") self.temperature = 0 self.ppm = 0 self.last_sensor_poll = int(time.time()) def draw_space_update_menu(self, option): def draw_space_update_menu(self, option=None): if (self.menus[self.menu_index] == "STATUS"): self.full_draw(0) self.panel.write_line(7, " ") self.panel.write_line(7, f"==SET SPACE STATUS==") self.panel.write_line(8, " ") self.panel.write_line(8, f"SET SPACE TO {self.status_options[self.selector]}?") if (self.menus[self.menu_index] == "DOORHOLD"): self.full_draw(0) self.panel.write_line(7, " ") self.panel.write_line(7, f"==SET DOORHOLD STATUS==") self.panel.write_line(8, " ") self.panel.write_line(8, f"SET SPACE TO {option}?") self.panel.write_line(8, f"doorhold menu") def set_space_status_led(self): if self.space_status == "OPEN": Loading @@ -70,13 +88,18 @@ class Kronk: def wakeup(self): print("WAKING UP") self.menu_index = 0 self.panel.display_backlight_on(0) # Full brightness self.panel.set_keypad_backlight_brightness(255) def partial_draw_clock(self): now = datetime.datetime.now() time = now.strftime("%Y-%m-%d %H:%M:%S") self.panel.write_line(7, f"{time}") timestr = now.strftime("%Y-%m-%d %H:%M:%S") if int(time.time()) % 2 == 0: self.panel.write_line(1, f" /dev/hack is {self.space_status}") else: self.panel.write_line(1, f"# /dev/hack is {self.space_status}") self.panel.write_line(6, f"{timestr}") # a force draw variable, in case someone does a remote close, # since partial clock draw is run regularly we will do that here if self.clock_force_draw == 1: Loading @@ -86,14 +109,13 @@ class Kronk: def full_draw(self, clear=1): if clear == 1: self.panel.clear_display() self.panel.write_line(1, f"# /dev/hack is {self.space_status}") self.panel.write_line(2, f"Temp: {self.temperature}F, {self.ppm} PPM CO2") self.set_space_status_led() self.airquality_update() self.partial_draw_clock() def on_button_press(self, char): options = ["OPEN", "CLOSED", "INVISIBLE"] print(f"Button pressed: {char}") print(self.panel_status) # wake up backlights on button press if not already awake Loading @@ -101,14 +123,30 @@ class Kronk: self.wakeup() # if a button is pressed, update the last interaction time self.last_interaction_time = int(time.time()) # if right or up are pressed, increment through the list # corner buttons! # up corner button increments menu index self.panel_status = "in_menu" if (char == "A" or char == "G"): self.selector = 0 if (char == "A"): self.menu_index = self.menu_index + 1; if (self.menu_index > len(self.menus) - 1): self.menu_index = 0 # loop back if we reach the end # down corner button decrements menu index if (char == "G"): self.menu_index = self.menu_index - 1; if (self.menu_index < 0): self.menu_index = len(self.menus) - 1 # loop back if we reach the end self.draw_space_update_menu() if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "STATUS"): if char == "B" or char == "C": self.panel_status = "in_menu" self.selector = self.selector + 1 # loop back around if self.selector > 2: self.selector = 0 self.draw_space_update_menu(options[self.selector]) self.draw_space_update_menu() # if left or down are pressed, decrement through the list if char == "H" or char == "D": self.panel_status = "in_menu" Loading @@ -116,21 +154,24 @@ class Kronk: # loop back around if self.selector < 0: self.selector = 2 self.draw_space_update_menu(options[self.selector]) self.draw_space_update_menu() # if we're in a menu, and the enter key is pressed, set that if char == "E" and self.panel_status == "in_menu": # update the space status self.space_status = options[self.selector] print(f"STATUS CHANGED to {options[self.selector]}") self.space_status = self.status_options[self.selector] print(f"STATUS CHANGED to {self.status_options[self.selector]}") # poke the last space status change self.last_space_status_change = time.time() # awake, but no longer in menu self.panel_status = "awake" # redraw panel self.full_draw() if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "DOORHOLD"): self.draw_space_update_menu() async def screen_update(self): async def tick_pulse(self): while self.running: # sensor/tick draw # if it's been two minutes since the last sensor poll, do it again if int(time.time()) - self.last_sensor_poll > 120: self.poll_sensors() Loading @@ -139,10 +180,8 @@ class Kronk: self.partial_draw_clock() else: self.full_draw(0) await asyncio.sleep(1) async def sleep_timeout(self): while self.running: # sleep timer if self.panel_status != "asleep": print( "BACKLIGHT TIMEOUT COUNTER:" Loading Loading @@ -179,8 +218,7 @@ class Kronk: self.full_draw() self.poll_sensors() self.tasks.append(asyncio.create_task(self.sleep_timeout())) self.tasks.append(asyncio.create_task(self.screen_update())) self.tasks.append(asyncio.create_task(self.tick_pulse())) self.panel.add_button_callback(self.on_button_press) Loading Loading
kronk.py +81 −43 Original line number Diff line number Diff line Loading @@ -17,11 +17,18 @@ class Kronk: self.last_space_status_change = time.time() self.last_interaction_time = int(time.time()) self.selector = 0 self.temperature = 0 self.last_sensor_poll = int(time.time()) self.clock_force_draw = 0 self.menu_index = 0 self.selector = 0 self.menus = ["STATUS", "DOORHOLD"] self.status_options = ["OPEN", "CLOSED", "INVISIBLE"] self.doorhold_options = ["TRUE", "FALSE"] self.tasks = [] self.running = True Loading Loading @@ -50,15 +57,26 @@ class Kronk: url = "https://devhack.net/spaceapi.json" sensors = requests.get(url, headers=headers).json() self.temperature = sensors["sensors"]["temperature"][0]["value"] self.ppm = sensors["sensors"]["humidity"][1]["value"] except (IndexError, requests.exceptions.RequestException) as e: print(f"error polling: {e}") self.temperature = 0 self.ppm = 0 self.last_sensor_poll = int(time.time()) def draw_space_update_menu(self, option): def draw_space_update_menu(self, option=None): if (self.menus[self.menu_index] == "STATUS"): self.full_draw(0) self.panel.write_line(7, " ") self.panel.write_line(7, f"==SET SPACE STATUS==") self.panel.write_line(8, " ") self.panel.write_line(8, f"SET SPACE TO {self.status_options[self.selector]}?") if (self.menus[self.menu_index] == "DOORHOLD"): self.full_draw(0) self.panel.write_line(7, " ") self.panel.write_line(7, f"==SET DOORHOLD STATUS==") self.panel.write_line(8, " ") self.panel.write_line(8, f"SET SPACE TO {option}?") self.panel.write_line(8, f"doorhold menu") def set_space_status_led(self): if self.space_status == "OPEN": Loading @@ -70,13 +88,18 @@ class Kronk: def wakeup(self): print("WAKING UP") self.menu_index = 0 self.panel.display_backlight_on(0) # Full brightness self.panel.set_keypad_backlight_brightness(255) def partial_draw_clock(self): now = datetime.datetime.now() time = now.strftime("%Y-%m-%d %H:%M:%S") self.panel.write_line(7, f"{time}") timestr = now.strftime("%Y-%m-%d %H:%M:%S") if int(time.time()) % 2 == 0: self.panel.write_line(1, f" /dev/hack is {self.space_status}") else: self.panel.write_line(1, f"# /dev/hack is {self.space_status}") self.panel.write_line(6, f"{timestr}") # a force draw variable, in case someone does a remote close, # since partial clock draw is run regularly we will do that here if self.clock_force_draw == 1: Loading @@ -86,14 +109,13 @@ class Kronk: def full_draw(self, clear=1): if clear == 1: self.panel.clear_display() self.panel.write_line(1, f"# /dev/hack is {self.space_status}") self.panel.write_line(2, f"Temp: {self.temperature}F, {self.ppm} PPM CO2") self.set_space_status_led() self.airquality_update() self.partial_draw_clock() def on_button_press(self, char): options = ["OPEN", "CLOSED", "INVISIBLE"] print(f"Button pressed: {char}") print(self.panel_status) # wake up backlights on button press if not already awake Loading @@ -101,14 +123,30 @@ class Kronk: self.wakeup() # if a button is pressed, update the last interaction time self.last_interaction_time = int(time.time()) # if right or up are pressed, increment through the list # corner buttons! # up corner button increments menu index self.panel_status = "in_menu" if (char == "A" or char == "G"): self.selector = 0 if (char == "A"): self.menu_index = self.menu_index + 1; if (self.menu_index > len(self.menus) - 1): self.menu_index = 0 # loop back if we reach the end # down corner button decrements menu index if (char == "G"): self.menu_index = self.menu_index - 1; if (self.menu_index < 0): self.menu_index = len(self.menus) - 1 # loop back if we reach the end self.draw_space_update_menu() if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "STATUS"): if char == "B" or char == "C": self.panel_status = "in_menu" self.selector = self.selector + 1 # loop back around if self.selector > 2: self.selector = 0 self.draw_space_update_menu(options[self.selector]) self.draw_space_update_menu() # if left or down are pressed, decrement through the list if char == "H" or char == "D": self.panel_status = "in_menu" Loading @@ -116,21 +154,24 @@ class Kronk: # loop back around if self.selector < 0: self.selector = 2 self.draw_space_update_menu(options[self.selector]) self.draw_space_update_menu() # if we're in a menu, and the enter key is pressed, set that if char == "E" and self.panel_status == "in_menu": # update the space status self.space_status = options[self.selector] print(f"STATUS CHANGED to {options[self.selector]}") self.space_status = self.status_options[self.selector] print(f"STATUS CHANGED to {self.status_options[self.selector]}") # poke the last space status change self.last_space_status_change = time.time() # awake, but no longer in menu self.panel_status = "awake" # redraw panel self.full_draw() if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "DOORHOLD"): self.draw_space_update_menu() async def screen_update(self): async def tick_pulse(self): while self.running: # sensor/tick draw # if it's been two minutes since the last sensor poll, do it again if int(time.time()) - self.last_sensor_poll > 120: self.poll_sensors() Loading @@ -139,10 +180,8 @@ class Kronk: self.partial_draw_clock() else: self.full_draw(0) await asyncio.sleep(1) async def sleep_timeout(self): while self.running: # sleep timer if self.panel_status != "asleep": print( "BACKLIGHT TIMEOUT COUNTER:" Loading Loading @@ -179,8 +218,7 @@ class Kronk: self.full_draw() self.poll_sensors() self.tasks.append(asyncio.create_task(self.sleep_timeout())) self.tasks.append(asyncio.create_task(self.screen_update())) self.tasks.append(asyncio.create_task(self.tick_pulse())) self.panel.add_button_callback(self.on_button_press) Loading