Add demo mode: virtual hardware sandbox for testing without real devices
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>
This commit is contained in:
46
plans/demo-mode/phase-6-engine-resolution.md
Normal file
46
plans/demo-mode/phase-6-engine-resolution.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Phase 6: Demo-only Engine Resolution
|
||||
|
||||
**Status:** ⬜ Not Started
|
||||
**Parent plan:** [PLAN.md](./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 with `ENGINE_TYPE == "demo"` when not in demo mode (they report `is_available()=False` anyway, 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/displays` endpoint: 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 engines
|
||||
- `server/src/wled_controller/core/audio/factory.py` — Filter demo engines
|
||||
- `server/src/wled_controller/api/routes/system.py` — Display endpoint defaults
|
||||
- `server/src/wled_controller/api/routes/audio_templates.py` — Audio engine listing
|
||||
- `server/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)
|
||||
|
||||
## Handoff to Next Phase
|
||||
<!-- Filled in after completion -->
|
||||
Reference in New Issue
Block a user