feat: relay inversé, LED idle solid, luminosité manuelle, auto-flash lux
This commit is contained in:
@@ -51,6 +51,42 @@ async def leds_off(request: Request):
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.get("/leds/brightness")
|
||||
async def get_brightness(request: Request):
|
||||
cfg = request.app.state.config.leds
|
||||
return {"brightness": cfg.brightness, "auto_brightness": cfg.auto_brightness}
|
||||
|
||||
|
||||
@router.put("/leds/brightness")
|
||||
async def set_brightness(
|
||||
request: Request,
|
||||
value: int = Query(..., ge=0, le=255),
|
||||
save: bool = Query(default=True),
|
||||
):
|
||||
"""Regle la luminosite globale (0-255) et l'applique immediatement."""
|
||||
led = request.app.state.led_service
|
||||
led.set_brightness(value)
|
||||
if save:
|
||||
config_svc = request.app.state.config_service
|
||||
config_svc.save_led_brightness(value)
|
||||
return {"ok": True, "brightness": value}
|
||||
|
||||
|
||||
@router.put("/leds/auto-brightness")
|
||||
async def set_auto_brightness(
|
||||
request: Request,
|
||||
enabled: bool = Query(...),
|
||||
save: bool = Query(default=True),
|
||||
):
|
||||
"""Active ou desactive la luminosite automatique du flash selon l'ambiance."""
|
||||
cfg = request.app.state.config.leds
|
||||
cfg.auto_brightness = enabled
|
||||
if save:
|
||||
config_svc = request.app.state.config_service
|
||||
config_svc.save_led_auto_brightness(enabled)
|
||||
return {"ok": True, "auto_brightness": enabled}
|
||||
|
||||
|
||||
@router.get("/leds/effects")
|
||||
async def get_effects(request: Request):
|
||||
"""Retourne la configuration de tous les effets LED."""
|
||||
|
||||
@@ -27,6 +27,9 @@ async def photobooth_webhook(
|
||||
match event_key:
|
||||
case "counting":
|
||||
led.play("countdown", countdown_duration=DEFAULT_COUNTDOWN)
|
||||
if request.app.state.config.leds.auto_brightness:
|
||||
pb = request.app.state.photobooth_service
|
||||
asyncio.create_task(_analyze_ambient_lux(led, pb))
|
||||
|
||||
case "capture":
|
||||
led.play("capture")
|
||||
@@ -58,3 +61,21 @@ async def _delayed_relay_on(btn, delay: float):
|
||||
await asyncio.sleep(delay)
|
||||
if btn:
|
||||
btn.relay_on()
|
||||
|
||||
|
||||
async def _analyze_ambient_lux(led, pb):
|
||||
"""Capture une frame du liveview et calcule la luminosite moyenne."""
|
||||
try:
|
||||
snapshot = await pb.get_liveview_snapshot()
|
||||
if not snapshot:
|
||||
logger.debug("Analyse lux: aucun snapshot disponible")
|
||||
return
|
||||
from PIL import Image
|
||||
import io
|
||||
img = Image.open(io.BytesIO(snapshot)).convert("L").resize((80, 60))
|
||||
pixels = list(img.getdata())
|
||||
avg = sum(pixels) / len(pixels)
|
||||
led.set_ambient_lux(avg)
|
||||
logger.info("Luminosite ambiante: %.1f / 255", avg)
|
||||
except Exception as e:
|
||||
logger.warning("Analyse lux echouee: %s", e)
|
||||
|
||||
Reference in New Issue
Block a user