Add adaptive brightness value source with time-of-day and scene modes

New "adaptive" value source type that automatically adjusts brightness
based on external conditions. Two sub-modes: time-of-day (schedule-based
interpolation with midnight wrap) and scene brightness (frame luminance
analysis via numpy BT.601 subsampling with EMA smoothing).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 15:14:30 +03:00
parent 48651f0a4e
commit d339dd3f90
11 changed files with 643 additions and 19 deletions

View File

@@ -774,10 +774,11 @@
"value_source.name.placeholder": "Brightness Pulse",
"value_source.name.hint": "A descriptive name for this value source",
"value_source.type": "Type:",
"value_source.type.hint": "Static outputs a constant value. Animated cycles through a waveform. Audio reacts to sound input.",
"value_source.type.hint": "Static outputs a constant value. Animated cycles through a waveform. Audio reacts to sound input. Adaptive adjusts based on time of day or scene brightness.",
"value_source.type.static": "Static",
"value_source.type.animated": "Animated",
"value_source.type.audio": "Audio",
"value_source.type.adaptive": "Adaptive",
"value_source.value": "Value:",
"value_source.value.hint": "Constant output value (0.0 = off, 1.0 = full brightness)",
"value_source.waveform": "Waveform:",
@@ -803,6 +804,25 @@
"value_source.sensitivity.hint": "Gain multiplier for the audio signal (higher = more reactive)",
"value_source.smoothing": "Smoothing:",
"value_source.smoothing.hint": "Temporal smoothing (0 = instant response, 1 = very smooth/slow)",
"value_source.adaptive_mode": "Adaptive Mode:",
"value_source.adaptive_mode.hint": "Time of Day adjusts brightness on a daily schedule. Scene analyzes picture brightness in real time.",
"value_source.adaptive_mode.time_of_day": "Time of Day",
"value_source.adaptive_mode.scene": "Scene Brightness",
"value_source.schedule": "Schedule:",
"value_source.schedule.hint": "Define at least 2 time points. Brightness interpolates linearly between them, wrapping at midnight.",
"value_source.schedule.add": "+ Add Point",
"value_source.schedule.points": "points",
"value_source.picture_source": "Picture Source:",
"value_source.picture_source.hint": "The picture source whose frames will be analyzed for average brightness.",
"value_source.scene_behavior": "Behavior:",
"value_source.scene_behavior.hint": "Complement: dark scene = high brightness (ideal for ambient backlight). Match: bright scene = high brightness.",
"value_source.scene_behavior.complement": "Complement (dark → bright)",
"value_source.scene_behavior.match": "Match (bright → bright)",
"value_source.adaptive_min_value": "Min Value:",
"value_source.adaptive_min_value.hint": "Minimum output brightness",
"value_source.adaptive_max_value": "Max Value:",
"value_source.adaptive_max_value.hint": "Maximum output brightness",
"value_source.error.schedule_min": "Schedule requires at least 2 time points",
"value_source.description": "Description (optional):",
"value_source.description.placeholder": "Describe this value source...",
"value_source.description.hint": "Optional notes about this value source",