Files
wled-screen-controller-mixed/plans/demo-mode/phase-4-demo-device-seed-data.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.8 KiB
Raw Blame History

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