Add notification reactive color strip source with webhook trigger
New source_type "notification" fires one-shot visual effects (flash, pulse, sweep) triggered via POST webhook. Designed as a composite layer for overlay on persistent sources. Includes app color mapping, whitelist/blacklist filtering, and auto-sizing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
118
BRAINSTORM.md
Normal file
118
BRAINSTORM.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user