feat: BindableFloat — universal value source binding for all scalar properties
Lint & Test / test (push) Successful in 1m20s
Lint & Test / test (push) Successful in 1m20s
Introduce BindableFloat abstraction that allows any numeric property to be
either a static value or dynamically driven by a ValueSource. Backward-compatible
serialization: plain float when unbound, {value, source_id} dict when bound.
Backend:
- storage/bindable.py — BindableFloat dataclass + bfloat() helper
- 25+ scalar properties converted across all entity types
- Runtime VS acquisition in ColorStripStreamManager for CSS bindings
- All stream hot loops use self.resolve() for live values
- KeyColorsColorStripStream now inherits ColorStripStream
Frontend:
- BindableScalarWidget (slider + VS picker toggle) for all editors
- TypeScript BindableFloat type + helpers
- Graph editor edges for all bindable properties
- Audio source channel IconSelect grid
Fixes: daylight longitude, candlelight wind_strength/candle_type from_dict
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"app.title": "LED Grab",
|
||||
"bindable.none": "None (static value)",
|
||||
"bindable.toggle": "Toggle value source binding",
|
||||
"app.version": "Version:",
|
||||
"app.api_docs": "API Documentation",
|
||||
"app.connection_lost": "Server unreachable",
|
||||
@@ -1331,9 +1333,12 @@
|
||||
"audio_source.parent.hint": "Multichannel source to extract a channel from",
|
||||
"audio_source.channel": "Channel:",
|
||||
"audio_source.channel.hint": "Which audio channel to extract from the multichannel source",
|
||||
"audio_source.channel.mono": "Mono (L+R mix)",
|
||||
"audio_source.channel.mono": "Mono",
|
||||
"audio_source.channel.mono.desc": "L+R mix",
|
||||
"audio_source.channel.left": "Left",
|
||||
"audio_source.channel.left.desc": "Left channel only",
|
||||
"audio_source.channel.right": "Right",
|
||||
"audio_source.channel.right.desc": "Right channel only",
|
||||
"audio_source.description": "Description (optional):",
|
||||
"audio_source.description.placeholder": "Describe this audio source...",
|
||||
"audio_source.description.hint": "Optional notes about this audio source",
|
||||
@@ -1808,6 +1813,10 @@
|
||||
"ha_light.update_rate.hint": "How often to send color updates to HA lights (0.5-5.0 Hz). Lower values are safer for HA performance.",
|
||||
"ha_light.transition": "Transition:",
|
||||
"ha_light.transition.hint": "Smooth fade duration between colors (HA transition parameter).",
|
||||
"ha_light.color_tolerance": "Color Tolerance:",
|
||||
"ha_light.color_tolerance.hint": "Skip sending color updates when the RGB delta is below this threshold. Reduces HA traffic for near-static scenes.",
|
||||
"ha_light.min_brightness_threshold": "Min Brightness Threshold:",
|
||||
"ha_light.min_brightness_threshold.hint": "Effective output brightness below this value turns lights off completely (0 = disabled).",
|
||||
"ha_light.mappings": "Light Mappings:",
|
||||
"ha_light.mappings.hint": "Map LED ranges to HA light entities. Each mapping averages the LED segment to a single color.",
|
||||
"ha_light.mappings.add": "Add Mapping",
|
||||
@@ -1830,6 +1839,9 @@
|
||||
"automations.condition.home_assistant.state": "State:",
|
||||
"automations.condition.home_assistant.match_mode": "Match Mode:",
|
||||
"automations.condition.home_assistant.hint": "Activate when a Home Assistant entity matches the specified state",
|
||||
"automations.condition.ha.match_mode.exact.desc": "State must match exactly",
|
||||
"automations.condition.ha.match_mode.contains.desc": "State must contain the text",
|
||||
"automations.condition.ha.match_mode.regex.desc": "State must match the regex pattern",
|
||||
"color_strip.clock": "Sync Clock:",
|
||||
"color_strip.clock.hint": "Link to a sync clock to synchronize animation timing across sources. Speed is controlled on the clock.",
|
||||
"graph.title": "Graph",
|
||||
|
||||
Reference in New Issue
Block a user