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.8 KiB
2.8 KiB
Phase 4: Demo Device Provider & Seed Data
Status: ⬜ Not Started Parent plan: PLAN.md Domain: backend
Objective
Create a demo device provider that exposes discoverable virtual LED devices, and build a seed data generator that populates the demo data directory with sample entities on first run.
Tasks
- Task 1: Create
server/src/wled_controller/core/devices/demo_provider.py—DemoDeviceProviderextendingLEDDeviceProvider:device_type = "demo"capabilities = {"manual_led_count", "power_control", "brightness_control", "static_color"}create_client()returns aMockClient(reuse existing)discover()returns 3 pre-defined virtual devices:- "Demo LED Strip" (60 LEDs, ip="demo-strip")
- "Demo LED Matrix" (256 LEDs / 16×16, ip="demo-matrix")
- "Demo LED Ring" (24 LEDs, ip="demo-ring")
check_health()always returns online with simulated ~2ms latencyvalidate_device()returns{"led_count": <from url>}
- Task 2: Register
DemoDeviceProviderinled_client.py_register_builtin_providers() - Task 3: Create
server/src/wled_controller/core/demo_seed.py— seed data generator:- Function
seed_demo_data(storage_config: StorageConfig)that checks if demo data dir is empty and populates it - Seed entities: 3 devices (matching discover results), 2 output targets, 2 picture sources (using demo engine), 2 CSS sources (gradient + color_cycle), 1 audio source (using demo engine), 1 scene preset, 1 automation
- Use proper ID formats matching existing conventions (e.g.,
dev_<hex>,tgt_<hex>, etc.)
- Function
- Task 4: Call
seed_demo_data()during server startup inmain.pywhen demo mode is active (before stores are loaded)
Files to Modify/Create
server/src/wled_controller/core/devices/demo_provider.py— New: DemoDeviceProviderserver/src/wled_controller/core/devices/led_client.py— Register DemoDeviceProviderserver/src/wled_controller/core/demo_seed.py— New: seed data generatorserver/src/wled_controller/main.py— Call seed on demo startup
Acceptance Criteria
- Demo devices appear in discovery results when in demo mode
- Seed data populates
data/demo/with valid JSON files on first demo run - Subsequent demo runs don't overwrite existing demo data
- All seeded entities load correctly in stores
Notes
- Seed data must match the exact schema expected by each store (look at existing JSON files for format)
- Use the entity dataclass
to_dict()/ store patterns to generate valid data - Demo discovery should NOT appear when not in demo mode
Review Checklist
- All tasks completed
- Code follows project conventions
- No unintended side effects
- Build passes
- Tests pass (new + existing)