#!/nix/store/q1p072dnnx7fh7qfcavkmpwn3rgf2xh1-python3-3.12.5-env/bin/python import json import logging import sys import requests from colour import Color from pyjecteur.fixtures import Blinder, LedBar48Ch, Tradi, Wash, Lyre from pyjecteur.lights import Universe from pyjecteur.widget import Widget if False: # True: # True: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) w = Widget("/dev/ttyUSB0") DIM = { "blinder": 0.1, "led_tub": 0.3, "spot": 0.3, } u = Universe(w) def strToProj(s): match s: case "spot": return Tradi() case "led_tub": return LedBar48Ch() case "blinder": return LedBar48Ch() r = requests.get("https://agb.hackens.org/api-docs/patch.json") patch = r.json() lights = {} update = {} current_addr = 0 for k, v in patch["lights"].items(): lights[k] = strToProj(v["kind"]) u.register(lights[k], v["channels"][0]*3) print(v["kind"], v["channels"]) # update dmx since some params are set before lights[k].update_dmx() logging.info( f"Light {k} of kind {v['kind']} is at DMX{v['channels'][0]*3+1} (PLS convention)" ) for i, chan in enumerate(v["channels"]): update[chan] = (k, i) # put the light name current_addr += lights[k].address_size l = Lyre() u.register(l, 489) def update_light(address, red, green, blue): if address not in update: return light, chan = update[address] kind = patch["lights"][light]["kind"] r, g, b = red * DIM[kind] / 255, (green * DIM[kind]) / 255, (blue * DIM[kind]) / 255 match kind: case "blinder": lights[light].colors[chan] = Color(rgb=(r, g, b)) case "led_tub": lights[light].colors[chan] = Color(rgb=(r, g, b)) case "spot": lights[light].color = Color(rgb=(r, g, b)) def run(): logging.info("Started") bump = False bump_color = None for line in sys.stdin: logging.debug(line) if line.startswith("data:"): dataStr = line[5:] logging.info(f"Received: {dataStr}") data = json.loads(dataStr) if data["type"] == "Color": if data["address"] == 90: r, g, b = data["value"]["red"] /255, data["value"]["green"] /255, data["value"]["blue"] /255 w.color = Color(rgb = (r, g, b)) else: update_light(data["address"], **data["value"]) else: l.pan = data["pan"] l.tilt = data["tilt"] l.dimmer = data["focus"] l.color = data["white_button"] *7 + 3 run()