"""API de contrôle des LEDs WS2812b.""" import logging from fastapi import APIRouter, Request, Query from fastapi.responses import JSONResponse logger = logging.getLogger(__name__) router = APIRouter() @router.get("/leds/status") async def led_status(request: Request): led = request.app.state.led_service return {"effect": led.current_effect} @router.post("/leds/effect") async def set_effect( request: Request, effect: str = Query(..., description="idle | countdown | capture | captured | finished | printing | error | disabled | off"), ): """Force un effet LED (admin uniquement, pas de vérification auth ici — à protéger via Zoraxy).""" valid = ("idle", "countdown", "capture", "captured", "finished", "printing", "error", "disabled", "off") if effect not in valid: return JSONResponse({"error": f"Effet invalide. Valeurs: {valid}"}, status_code=400) led = request.app.state.led_service ws = request.app.state.ws_manager led.play(effect) await ws.broadcast({"type": "led_effect", "effect": effect}) return {"ok": True, "effect": effect} @router.post("/leds/color") async def set_color( request: Request, r: int = Query(default=0, ge=0, le=255), g: int = Query(default=0, ge=0, le=255), b: int = Query(default=0, ge=0, le=255), ): """Couleur fixe immédiate sur tout l'anneau.""" led = request.app.state.led_service led.set_color(r, g, b) return {"ok": True, "color": [r, g, b]} @router.post("/leds/off") async def leds_off(request: Request): led = request.app.state.led_service led.play("off") return {"ok": True}