import logging from colorsys import hsv_to_rgb from random import randint from jinja2 import Environment from lifxlan import LifxLAN from litestar import Litestar, get, post from litestar.contrib.jinja import JinjaTemplateEngine from litestar.response import Template from litestar.template import TemplateConfig # FIXME: discovery happens here, but things can change. # Try power cycling the light and see what happens. lifxlan = LifxLAN() DEFAULT_COLOR = "#FF0000" TEMPLATE_STR = """ lux

{{ message }}

""" logging.basicConfig(level=logging.DEBUG) log = logging.getLogger() def random_light() -> Template: hue = randint(0, 65535) saturation = randint(0, 65535) brightness = randint(0, 65535) kelvin = randint(0, 9000) log.info(f"Setting color to {hue}, {saturation}, {brightness}, {kelvin}") try: # colors = lifxlan.get_color_all_lights() lifxlan.set_color_all_lights( [hue, saturation, brightness, kelvin], rapid=True, ) except Exception as e: log.exception("Error setting color") return Template( template_str=TEMPLATE_STR, context={"color": DEFAULT_COLOR, "message": f"error: {str(e)}"}, ) rgb_hex = DEFAULT_COLOR try: r, g, b = hsv_to_rgb(hue / 65535, saturation / 65535, brightness / 65535) log.info("RGB: %s, %s, %s", r, g, b) rgb_hex = "#%02x%02x%02x" % (int(r * 255), int(g * 255), int(b * 255)) log.info("hex RGB: %s", rgb_hex) except Exception as e: log.exception("Error converting color") return Template( template_str=TEMPLATE_STR, context={"color": DEFAULT_COLOR, "message": f"error: {str(e)}"}, ) return Template( template_str=TEMPLATE_STR, context={"color": rgb_hex, "message": " "} ) @get("/") async def get_index() -> Template: return random_light() @post("/") async def post_index() -> Template: return random_light() # @post("/") # async def post_index( # hue: int, saturation: int, brightness: int, kelvin: int # ) -> dict[str, str]: # try: # lifxlan.set_color_all_lights( # [hue, saturation, brightness, kelvin], # rapid=True, # ) # except Exception as e: # return {"status": "error", "message": str(e)} # return {"status": "ok"} app = Litestar( [ get_index, post_index, ], template_config=TemplateConfig( instance=JinjaTemplateEngine.from_environment(Environment()) ), )