Some checks failed
Validate / validate (push) Failing after 1m6s
This is a complete WLED ambient lighting controller that captures screen border pixels and sends them to WLED devices for immersive ambient lighting effects. ## Server Features: - FastAPI-based REST API with 17+ endpoints - Real-time screen capture with multi-monitor support - Advanced LED calibration system with visual GUI - API key authentication with labeled tokens - Per-device brightness control (0-100%) - Configurable FPS (1-60), border width, and color correction - Persistent device storage (JSON-based) - Comprehensive Web UI with dark/light themes - Docker support with docker-compose - Windows monitor name detection via WMI (shows "LG ULTRAWIDE" etc.) ## Web UI Features: - Device management (add, configure, remove WLED devices) - Real-time status monitoring with FPS metrics - Settings modal for device configuration - Visual calibration GUI with edge testing - Brightness slider per device - Display selection with friendly monitor names - Token-based authentication with login/logout - Responsive button layout ## Calibration System: - Support for any LED strip layout (clockwise/counterclockwise) - 4 starting position options (corners) - Per-edge LED count configuration - Visual preview with starting position indicator - Test buttons to light up individual edges - Smart LED ordering based on start position and direction ## Home Assistant Integration: - Custom HACS integration - Switch entities for processing control - Sensor entities for status and FPS - Select entities for display selection - Config flow for easy setup - Auto-discovery of devices from server ## Technical Stack: - Python 3.11+ - FastAPI + uvicorn - mss (screen capture) - httpx (async WLED client) - Pydantic (validation) - WMI (Windows monitor detection) - Structlog (logging) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
192 lines
4.4 KiB
Markdown
192 lines
4.4 KiB
Markdown
# WLED Screen Controller - Server
|
|
|
|
High-performance FastAPI server that captures screen content and controls WLED devices for ambient lighting.
|
|
|
|
## Overview
|
|
|
|
The server component provides:
|
|
- 🎯 **Real-time Screen Capture** - Multi-monitor support with configurable FPS
|
|
- 🎨 **Advanced Processing** - Border pixel extraction with color correction
|
|
- 🔧 **Flexible Calibration** - Map screen edges to any LED layout
|
|
- 🌐 **REST API** - Complete control via 17 REST endpoints
|
|
- 💾 **Persistent Storage** - JSON-based device and configuration management
|
|
- 📊 **Metrics & Monitoring** - Real-time FPS, status, and performance data
|
|
|
|
## Quick Start
|
|
|
|
### Option 1: Docker (Recommended)
|
|
|
|
```bash
|
|
# Start server
|
|
docker-compose up -d
|
|
|
|
# View logs
|
|
docker-compose logs -f
|
|
|
|
# Stop server
|
|
docker-compose down
|
|
```
|
|
|
|
Server runs on: **http://localhost:8080**
|
|
|
|
### Option 2: Python
|
|
|
|
```bash
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
|
|
# Activate
|
|
source venv/bin/activate # Linux/Mac
|
|
venv\Scripts\activate # Windows
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Set PYTHONPATH
|
|
export PYTHONPATH=$(pwd)/src # Linux/Mac
|
|
set PYTHONPATH=%CD%\src # Windows
|
|
|
|
# Run server
|
|
uvicorn wled_controller.main:app --host 0.0.0.0 --port 8080
|
|
```
|
|
|
|
## Installation
|
|
|
|
### Requirements
|
|
- **Python 3.11+** (for Python installation)
|
|
- **Docker & Docker Compose** (for Docker installation)
|
|
- **WLED device** on your network
|
|
|
|
See [../INSTALLATION.md](../INSTALLATION.md) for comprehensive installation guide.
|
|
|
|
## Configuration
|
|
|
|
### Configuration File
|
|
|
|
Edit `config/default_config.yaml`:
|
|
|
|
```yaml
|
|
server:
|
|
host: "0.0.0.0"
|
|
port: 8080
|
|
log_level: "INFO"
|
|
|
|
processing:
|
|
default_fps: 30 # Target frames per second
|
|
max_fps: 60 # Maximum allowed FPS
|
|
border_width: 10 # Pixels to sample from edge
|
|
|
|
wled:
|
|
timeout: 5 # Connection timeout (seconds)
|
|
retry_attempts: 3 # Number of retries
|
|
|
|
storage:
|
|
devices_file: "data/devices.json"
|
|
|
|
logging:
|
|
format: "json"
|
|
file: "logs/wled_controller.log"
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
```bash
|
|
# Server configuration
|
|
export WLED_SERVER__HOST="0.0.0.0"
|
|
export WLED_SERVER__PORT=8080
|
|
export WLED_SERVER__LOG_LEVEL="INFO"
|
|
|
|
# Processing configuration
|
|
export WLED_PROCESSING__DEFAULT_FPS=30
|
|
export WLED_PROCESSING__BORDER_WIDTH=10
|
|
|
|
# WLED configuration
|
|
export WLED_WLED__TIMEOUT=5
|
|
```
|
|
|
|
## Usage
|
|
|
|
### WLED Device Setup
|
|
|
|
**Important**: Configure your WLED device using the official WLED web interface before connecting it to this controller:
|
|
|
|
1. **Access WLED Interface**: Open `http://[wled-ip]` in your browser
|
|
2. **Configure Device Settings**:
|
|
- Set LED count and type
|
|
- Configure brightness, color order, and power limits
|
|
- Set up segments if needed
|
|
- Configure effects and presets
|
|
|
|
**This controller only sends pixel color data** - it does not manage WLED settings like brightness, effects, or segments. All WLED device configuration should be done through the official WLED interface.
|
|
|
|
### API Documentation
|
|
|
|
- **Web UI**: http://localhost:8080 (recommended for device management)
|
|
- **Swagger UI**: http://localhost:8080/docs
|
|
- **ReDoc**: http://localhost:8080/redoc
|
|
|
|
### Quick Example
|
|
|
|
```bash
|
|
# 1. Add device
|
|
curl -X POST http://localhost:8080/api/v1/devices \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"name":"Living Room","url":"http://192.168.1.100","led_count":150}'
|
|
|
|
# 2. Start processing
|
|
curl -X POST http://localhost:8080/api/v1/devices/{device_id}/start
|
|
|
|
# 3. Check status
|
|
curl http://localhost:8080/api/v1/devices/{device_id}/state
|
|
```
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
# Run all tests
|
|
pytest
|
|
|
|
# Run with coverage
|
|
pytest --cov=wled_controller --cov-report=html
|
|
|
|
# Run specific test
|
|
pytest tests/test_screen_capture.py -v
|
|
```
|
|
|
|
## Development
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
src/wled_controller/
|
|
├── main.py # FastAPI application
|
|
├── config.py # Configuration
|
|
├── api/ # API routes
|
|
├── core/ # Core functionality
|
|
│ ├── screen_capture.py
|
|
│ ├── wled_client.py
|
|
│ ├── calibration.py
|
|
│ └── processor_manager.py
|
|
├── storage/ # Data persistence
|
|
└── utils/ # Utilities
|
|
```
|
|
|
|
### Code Quality
|
|
|
|
```bash
|
|
# Format code
|
|
black src/ tests/
|
|
|
|
# Lint code
|
|
ruff check src/ tests/
|
|
```
|
|
|
|
## License
|
|
|
|
MIT - see [../LICENSE](../LICENSE)
|
|
|
|
## Support
|
|
|
|
- 📖 [Full Documentation](../docs/)
|
|
- 🐛 [Issues](https://github.com/yourusername/wled-screen-controller/issues)
|