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>
55 lines
2.8 KiB
Markdown
55 lines
2.8 KiB
Markdown
# Phase 4: Demo Device Provider & Seed Data
|
||
|
||
**Status:** ⬜ Not Started
|
||
**Parent plan:** [PLAN.md](./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` — `DemoDeviceProvider` extending `LEDDeviceProvider`:
|
||
- `device_type = "demo"`
|
||
- `capabilities = {"manual_led_count", "power_control", "brightness_control", "static_color"}`
|
||
- `create_client()` returns a `MockClient` (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 latency
|
||
- `validate_device()` returns `{"led_count": <from url>}`
|
||
- [ ] Task 2: Register `DemoDeviceProvider` in `led_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.)
|
||
- [ ] Task 4: Call `seed_demo_data()` during server startup in `main.py` when demo mode is active (before stores are loaded)
|
||
|
||
## Files to Modify/Create
|
||
- `server/src/wled_controller/core/devices/demo_provider.py` — New: DemoDeviceProvider
|
||
- `server/src/wled_controller/core/devices/led_client.py` — Register DemoDeviceProvider
|
||
- `server/src/wled_controller/core/demo_seed.py` — New: seed data generator
|
||
- `server/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)
|
||
|
||
## Handoff to Next Phase
|
||
<!-- Filled in after completion -->
|