# Feature Brainstorm — LED Grab ## New Automation Conditions (Profiles) Right now profiles only trigger on **app detection**. High-value additions: - **Time-of-day / Schedule** — "warm tones after sunset, off at midnight." Schedule-based value sources pattern already exists - **Display state** — detect monitor on/off/sleep, auto-stop targets when display is off - **System idle** — dim or switch to ambient effect after N minutes of no input - **Sunrise/sunset** — fetch local solar times, drive circadian color temperature shifts - **Webhook/MQTT trigger** — let external systems activate profiles without HA integration ## New Output Targets Currently: WLED, Adalight, AmbileD, DDP. Potential: - **MQTT publish** — generic IoT output, any MQTT subscriber becomes a target - **Art-Net / sACN (E1.31)** — stage/theatrical lighting protocols, DMX controllers - **OpenRGB** — control PC peripherals (keyboard, mouse, RAM, fans) as ambient targets - **HTTP webhook** — POST color data to arbitrary endpoints - **Recording target** — save color streams to file for playback later ## New Color Strip Sources - **Spotify / media player** — album art color extraction or tempo-synced effects - **Weather** — pull conditions from API, map to palettes (blue=rain, orange=sun, white=snow) - **Camera / webcam** — border-sampling from camera feed for video calls or room-reactive lighting - **Script source** — user-written JS/Python snippets producing color arrays per frame - **Notification reactive** — flash/pulse on OS notifications (optional app filter) ## Processing Pipeline Extensions - **Palette quantization** — force output to match a user-defined palette - **Zone grouping** — merge adjacent LEDs into logical groups sharing one averaged color - **Color temperature filter** — warm/cool shift separate from hue shift (circadian/mood) - **Noise gate** — suppress small color changes below threshold, preventing shimmer on static content ## Multi-Instance & Sync - **Multi-room sync** — multiple instances with shared clock for synchronized effects - **Multi-display unification** — treat 2-3 monitors as single virtual display for seamless ambilight - **Leader/follower mode** — one target's output drives others with optional delay (cascade) ## UX & Dashboard - **PWA / mobile layout** — mobile-first layout + "Add to Home Screen" manifest - **Scene presets** — bundled source + filters + brightness as one-click presets ("Movie night", "Gaming") - **Live preview on dashboard** — miniature screen with LED colors rendered around its border - **Undo/redo for calibration** — reduce frustration in the fiddly calibration editor - **Drag-and-drop filter ordering** — reorder postprocessing filter chains visually ## API & Integration - **WebSocket event bus** — broadcast all state changes over a single WS channel - **OBS integration** — detect active scene, switch profiles; or use OBS virtual camera as source - **Plugin system** — formalize extension points into documented plugin API with hot-reload ## Creative / Fun - **Effect sequencer** — timeline-based choreography of effects, colors, and transitions - **Music BPM sync** — lock effect speed to detected BPM (beat detection already exists) - **Color extraction from image** — upload photo, extract palette, use as gradient/cycle source - **Transition effects** — crossfade, wipe, or dissolve between sources/profiles instead of instant cut --- ## Deep Dive: Notification Reactive Source **Type:** New `ColorStripSource` (`source_type: "notification"`) — normally outputs transparent RGBA, flashes on notification events. Designed to be used as a layer in a **composite source** so it overlays on top of a persistent base (gradient, effect, screen capture, etc.). ### Trigger modes (both active simultaneously) 1. **OS listener (Windows)** — `pywinrt` + `Windows.UI.Notifications.Management.UserNotificationListener`. Runs in background thread, pushes events to source via queue. Windows-only for now; macOS (`pyobjc` + `NSUserNotificationCenter`) and Linux (`dbus` + `org.freedesktop.Notifications`) deferred to future. 2. **Webhook** — `POST /api/v1/notifications/{source_id}/fire` with optional body `{ "app": "MyApp", "color": "#FF0000" }`. Always available, cross-platform by nature. ### Source config ```yaml os_listener: true # enable Windows notification listener app_filter: mode: whitelist|blacklist # which apps to react to apps: [Discord, Slack, Telegram] app_colors: # user-configured app → color mapping Discord: "#5865F2" Slack: "#4A154B" Telegram: "#26A5E4" default_color: "#FFFFFF" # fallback when app has no mapping effect: flash|pulse|sweep # visual effect type duration_ms: 1500 # effect duration ``` ### Effect rendering Source outputs RGBA color array per frame: - **Idle**: all pixels `(0,0,0,0)` — composite passes through base layer - **Flash**: instant full-color, linear fade to transparent over `duration_ms` - **Pulse**: sine fade in/out over `duration_ms` - **Sweep**: color travels across the strip like a wave Each notification starts its own mini-timeline from trigger timestamp (not sync clock). ### Overlap handling New notification while previous effect is active → restart timer with new color. No queuing. ### App color resolution 1. Webhook body `color` field (explicit override) → highest priority 2. `app_colors` mapping by app name 3. `default_color` fallback --- ## Top Picks (impact vs effort) 1. **Time-of-day + idle profile conditions** — builds on existing profile/condition architecture 2. **MQTT output target** — opens the door to an enormous IoT ecosystem 3. **Scene presets** — purely frontend, bundles existing features into one-click UX