# 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": }` - [ ] 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_`, `tgt_`, 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