Files
wled-screen-controller-mixed/plans/demo-mode/phase-6-engine-resolution.md
alexei.dolgolyov 2240471b67 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>
2026-03-20 16:17:14 +03:00

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 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