Demo mode provides a complete sandbox environment with: - Virtual capture engine (radial rainbow test pattern on 3 displays) - Virtual audio engine (synthetic music-like audio on 2 devices) - Virtual LED device provider (strip/60, matrix/256, ring/24 LEDs) - Isolated data directory (data/demo/) with auto-seeded sample entities - Dedicated config (config/demo_config.yaml) with pre-configured API key - Frontend indicator (DEMO badge + dismissible banner) - Engine filtering (only demo engines visible in demo mode) - Separate entry point: python -m wled_controller.demo (port 8081) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.4 KiB
2.4 KiB
Phase 6: Demo-only Engine Resolution
Status: ⬜ Not Started Parent plan: PLAN.md Domain: backend
Objective
Ensure demo engines are the primary/preferred engines in demo mode, and are hidden when not in demo mode. This makes demo mode act as a "virtual platform" where only demo engines resolve.
Tasks
- Task 1: Modify
EngineRegistry.get_available_engines()to filter out engines withENGINE_TYPE == "demo"when not in demo mode (they reportis_available()=Falseanyway, but belt-and-suspenders) - Task 2: Modify
AudioEngineRegistry.get_available_engines()similarly - Task 3: In demo mode,
get_best_available_engine()should return the demo engine (already handled by priority=1000, but verify) - Task 4: Modify the
GET /api/v1/config/displaysendpoint: in demo mode, default to demo engine displays if no engine_type specified - Task 5: Modify the audio engine listing endpoint similarly
- Task 6: Ensure
DemoDeviceProvider.discover()only returns devices when in demo mode - Task 7: End-to-end verification: start server in demo mode, verify only demo engines/devices appear in API responses
Files to Modify/Create
server/src/wled_controller/core/capture_engines/factory.py— Filter demo enginesserver/src/wled_controller/core/audio/factory.py— Filter demo enginesserver/src/wled_controller/api/routes/system.py— Display endpoint defaultsserver/src/wled_controller/api/routes/audio_templates.py— Audio engine listingserver/src/wled_controller/core/devices/demo_provider.py— Guard discover()
Acceptance Criteria
- In demo mode: demo engines are primary, real engines may also be listed but demo is default
- Not in demo mode: demo engines are completely hidden from all API responses
- Display list defaults to demo displays in demo mode
- Audio device list defaults to demo devices in demo mode
Notes
- This is the "demo OS identifier" concept — demo mode acts as a virtual platform
- Be careful not to break existing behavior when demo=False (default)
- The demo engines already have
is_available() = is_demo_mode(), so the main concern is UI defaults
Review Checklist
- All tasks completed
- Code follows project conventions
- No unintended side effects
- Build passes
- Tests pass (new + existing)