hackens-org-configurations/machines/agb01/script.py

106 lines
2.7 KiB
Python
Raw Normal View History

2024-11-07 20:58:01 +01:00
#!/nix/store/q1p072dnnx7fh7qfcavkmpwn3rgf2xh1-python3-3.12.5-env/bin/python
2024-10-10 01:00:01 +02:00
import json
import logging
import sys
import requests
from colour import Color
2024-11-07 20:58:01 +01:00
from pyjecteur.fixtures import Blinder, LedBar48Ch, Tradi, Wash, Lyre
2024-10-10 01:00:01 +02:00
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 = {
2024-11-07 20:58:01 +01:00
"blinder": 0.1,
"led_tub": 0.3,
"spot": 0.3,
2024-10-10 01:00:01 +02:00
}
u = Universe(w)
def strToProj(s):
match s:
case "spot":
return Tradi()
case "led_tub":
return LedBar48Ch()
case "blinder":
2024-11-07 20:58:01 +01:00
return LedBar48Ch()
2024-10-10 01:00:01 +02:00
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"])
2024-11-07 20:58:01 +01:00
u.register(lights[k], v["channels"][0]*3)
print(v["kind"], v["channels"])
2024-10-10 01:00:01 +02:00
# 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
2024-11-07 20:58:01 +01:00
l = Lyre()
u.register(l, 489)
2024-10-10 01:00:01 +02:00
def update_light(address, red, green, blue):
2024-11-07 20:58:01 +01:00
if address not in update:
return
2024-10-10 01:00:01 +02:00
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")
2024-11-07 20:58:01 +01:00
bump = False
bump_color = None
2024-10-10 01:00:01 +02:00
for line in sys.stdin:
logging.debug(line)
if line.startswith("data:"):
dataStr = line[5:]
2024-10-13 21:12:20 +02:00
logging.info(f"Received: {dataStr}")
2024-10-10 01:00:01 +02:00
data = json.loads(dataStr)
2024-10-13 21:12:20 +02:00
if data["type"] == "Color":
2024-11-07 20:58:01 +01:00
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
2024-10-10 01:00:01 +02:00
run()