fix: timing flash + couleur idle LED + diagnostic auto-brightness
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
"""API de contrôle des LEDs WS2812b."""
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
from fastapi import APIRouter, Request, Query
|
||||
from fastapi.responses import JSONResponse
|
||||
@@ -103,6 +104,60 @@ async def get_effects(request: Request):
|
||||
}
|
||||
|
||||
|
||||
@router.get("/leds/ambient-lux")
|
||||
async def get_ambient_lux(request: Request):
|
||||
"""Retourne la luminosité ambiante mesurée (dernière valeur connue)."""
|
||||
led = request.app.state.led_service
|
||||
lux = led._ambient_lux
|
||||
return {
|
||||
"ambient_lux": lux,
|
||||
"known": lux >= 0,
|
||||
"auto_brightness": request.app.state.config.leds.auto_brightness,
|
||||
"description": (
|
||||
"sombre (flash plein)" if lux < 50 and lux >= 0 else
|
||||
"luminosité moyenne (flash adapté)" if lux < 180 and lux >= 0 else
|
||||
"clair (flash réduit)" if lux >= 180 else
|
||||
"non mesuré"
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@router.post("/leds/measure-ambient")
|
||||
async def measure_ambient_lux(request: Request):
|
||||
"""Déclenche une mesure de luminosité ambiante via snapshot liveview.
|
||||
Utile pour diagnostiquer si le flux liveview est accessible depuis JH-Photomaton.
|
||||
"""
|
||||
pb = request.app.state.photobooth_service
|
||||
led = request.app.state.led_service
|
||||
|
||||
snapshot = await pb.get_liveview_snapshot()
|
||||
if not snapshot:
|
||||
return JSONResponse({
|
||||
"ok": False,
|
||||
"error": "Aucun endpoint liveview accessible sur photobooth-app. "
|
||||
"Vérifiez que photobooth-app est démarré et que le flux vidéo est actif.",
|
||||
}, status_code=503)
|
||||
|
||||
try:
|
||||
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)
|
||||
return {
|
||||
"ok": True,
|
||||
"ambient_lux": round(avg, 1),
|
||||
"description": (
|
||||
"sombre → flash plein (255)" if avg < 50 else
|
||||
f"moyen → flash {int(255 - (avg - 50) / 130 * 135)}" if avg < 180 else
|
||||
"clair → flash réduit (80)"
|
||||
),
|
||||
}
|
||||
except Exception as e:
|
||||
return JSONResponse({"ok": False, "error": str(e)}, status_code=500)
|
||||
|
||||
|
||||
@router.put("/leds/effect/{effect_name}")
|
||||
async def update_effect(
|
||||
request: Request,
|
||||
|
||||
Reference in New Issue
Block a user