Skip to content

Instantly share code, notes, and snippets.

@11Firefox11
Created April 29, 2023 09:14
Show Gist options
  • Save 11Firefox11/ada2ea00cbc184744ca8accc893c45cf to your computer and use it in GitHub Desktop.
Save 11Firefox11/ada2ea00cbc184744ca8accc893c45cf to your computer and use it in GitHub Desktop.
Parse and run schema to create a sunrise
# This script is part of my blog post: https://tomoviktor.com/posts/pialarm-alarmrunner
CLEVER_SLEEP_SECS_SEGMENTS = 1
from numexpr import evaluate as ne_eval
from json import load
from os import environ
from time import sleep as time_sleep
from led_controller import LedController
class AlarmRunner:
def __init__(self, config_path="alarm.json"):
self.config_path = config_path
self.parsed_config = load(
open(self.config_path, "r", encoding="UTF-8"))
self.led_controller = LedController()
self.load_config()
def load_config(self):
self.wait_time = self.parsed_config["wait_time"]
self.when_yellow = self.parsed_config["when_yellow"]
self.repeat_last = self.parsed_config.get("repeat_last")
self.steps = self.parsed_config["steps"]
def start(self):
replace_vars = {"wait_time": self.wait_time, "red": lambda: self.led_controller.red,
"green": lambda: self.led_controller.green, "blue": lambda: self.led_controller.blue}
for step in self.steps:
if self.run_step(replace_vars, step) == False: return
if self.repeat_last:
while True:
for step in self.steps[-self.repeat_last:]:
if self.run_step(replace_vars, step) == False: return
def run_step(self, replace_vars, step):
range_data = step.get("range")
transition_data = step.get("transition")
sleep_time = self.wait_time if step["sleep"] == "wait_time" else step["sleep"]
if range_data:
for i in range(range_data.get("start", 0), range_data.get("stop", 10), range_data.get("step", 1)):
self.run_modify(step.get("modify", {}), {
**replace_vars, "i": i})
if not self.clever_sleep(sleep_time):
return False
elif transition_data:
for rgb in self.led_controller.transition(transition_data.get("red"), transition_data.get("green"), transition_data.get("blue"), transition_data.get("steps", 255)):
self.run_modify(step.get("modify", {}), {
**replace_vars, "r": rgb[0], "g": rgb[1], "b": rgb[2]})
if not self.clever_sleep(sleep_time):
return False
else:
self.run_modify(step.get("modify", {}), replace_vars)
if not self.clever_sleep(sleep_time):
return False
def run_modify(self, modify, replace_vars):
for color, calc in modify.items():
setattr(self.led_controller, color, ne_eval(calc, local_dict={var_name: var_value if not callable(
var_value) else var_value() for var_name, var_value in replace_vars.items()}))
def clever_sleep(self, val: float):
PIALARM_RUNNING = environ.get("PIALARM_RUNNING", "True")
if PIALARM_RUNNING == "False":
self.led_controller.reset()
return False
else:
try:
if val > CLEVER_SLEEP_SECS_SEGMENTS:
time_sleep(CLEVER_SLEEP_SECS_SEGMENTS)
return self.clever_sleep(val-CLEVER_SLEEP_SECS_SEGMENTS)
else:
time_sleep(val)
return True
except KeyboardInterrupt:
self.led_controller.reset()
return False
@11Firefox11
Copy link
Author

This script is part of my blog post: My Own Schema to Create Colorful Sunrise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment