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())
),
)