Add display brightness and power control
- New display service with DDC/CI brightness and power control via screen_brightness_control and monitorcontrol - New /api/display/* endpoints (monitors, brightness, power) - Display tab in WebUI with per-monitor brightness sliders and power toggle - EDID resolution parsing to distinguish same-name monitors - Throttled brightness slider (50ms) matching volume control pattern Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,8 +3,9 @@
|
||||
from .audio import router as audio_router
|
||||
from .browser import router as browser_router
|
||||
from .callbacks import router as callbacks_router
|
||||
from .display import router as display_router
|
||||
from .health import router as health_router
|
||||
from .media import router as media_router
|
||||
from .scripts import router as scripts_router
|
||||
|
||||
__all__ = ["audio_router", "browser_router", "callbacks_router", "health_router", "media_router", "scripts_router"]
|
||||
__all__ = ["audio_router", "browser_router", "callbacks_router", "display_router", "health_router", "media_router", "scripts_router"]
|
||||
|
||||
59
media_server/routes/display.py
Normal file
59
media_server/routes/display.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Display brightness and power control API endpoints."""
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ..auth import verify_token
|
||||
from ..services.display_service import (
|
||||
get_brightness,
|
||||
list_monitors,
|
||||
set_brightness,
|
||||
set_power,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter(prefix="/api/display", tags=["display"])
|
||||
|
||||
|
||||
class BrightnessRequest(BaseModel):
|
||||
brightness: int = Field(ge=0, le=100)
|
||||
|
||||
|
||||
class PowerRequest(BaseModel):
|
||||
on: bool
|
||||
|
||||
|
||||
@router.get("/monitors")
|
||||
async def get_monitors(
|
||||
refresh: bool = False, _: str = Depends(verify_token)
|
||||
) -> list[dict]:
|
||||
"""List all connected monitors with brightness and power info."""
|
||||
monitors = list_monitors(force_refresh=refresh)
|
||||
logger.debug("Found %d monitors", len(monitors))
|
||||
return [m.to_dict() for m in monitors]
|
||||
|
||||
|
||||
@router.post("/brightness/{monitor_id}")
|
||||
async def set_monitor_brightness(
|
||||
monitor_id: int, request: BrightnessRequest, _: str = Depends(verify_token)
|
||||
) -> dict:
|
||||
"""Set brightness for a specific monitor."""
|
||||
success = set_brightness(monitor_id, request.brightness)
|
||||
if success:
|
||||
logger.info("Set monitor %d brightness to %d", monitor_id, request.brightness)
|
||||
return {"success": success}
|
||||
|
||||
|
||||
@router.post("/power/{monitor_id}")
|
||||
async def set_monitor_power(
|
||||
monitor_id: int, request: PowerRequest, _: str = Depends(verify_token)
|
||||
) -> dict:
|
||||
"""Turn a monitor on or off."""
|
||||
action = "on" if request.on else "off"
|
||||
success = set_power(monitor_id, request.on)
|
||||
if success:
|
||||
logger.info("Set monitor %d power %s", monitor_id, action)
|
||||
return {"success": success}
|
||||
Reference in New Issue
Block a user