Remove per-source speed, fix device dirty check, and add frontend caching

Speed is now exclusively controlled via sync clocks — CSS sources no longer
carry their own speed/cycle_speed fields. Streams default to 1.0× when no
clock is assigned. Also fixes false-positive dirty check on the device
settings modal (array reference comparison) and converts several frontend
modules to use DataCache for consistent API response caching.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-01 22:07:54 +03:00
parent aa1e4a6afc
commit 39e41dfce7
15 changed files with 56 additions and 187 deletions

View File

@@ -684,7 +684,7 @@ class StaticColorStripStream(ColorStripStream):
speed = clock.speed
t = clock.get_time()
else:
speed = float(anim.get("speed", 1.0))
speed = 1.0
t = wall_start
atype = anim.get("type", "breathing")
n = self._led_count
@@ -798,7 +798,6 @@ class ColorCycleColorStripStream(ColorStripStream):
self._color_list = [
c for c in raw if isinstance(c, list) and len(c) == 3
] or default
self._cycle_speed = float(source.cycle_speed) if source.cycle_speed else 1.0
self._auto_size = not source.led_count
self._led_count = source.led_count if source.led_count > 0 else 1
self._rebuild_colors()
@@ -892,7 +891,7 @@ class ColorCycleColorStripStream(ColorStripStream):
speed = clock.speed
t = clock.get_time()
else:
speed = self._cycle_speed
speed = 1.0
t = wall_start
n = self._led_count
num = len(color_list)
@@ -1067,7 +1066,7 @@ class GradientColorStripStream(ColorStripStream):
speed = clock.speed
t = clock.get_time()
else:
speed = float(anim.get("speed", 1.0))
speed = 1.0
t = wall_start
atype = anim.get("type", "breathing")
n = self._led_count

View File

@@ -203,7 +203,6 @@ class EffectColorStripStream(ColorStripStream):
def _update_from_source(self, source) -> None:
self._effect_type = getattr(source, "effect_type", "fire")
self._speed = float(getattr(source, "speed", 1.0))
self._auto_size = not source.led_count
self._led_count = source.led_count if source.led_count and source.led_count > 0 else 1
self._palette_name = getattr(source, "palette", None) or _EFFECT_DEFAULT_PALETTE.get(self._effect_type, "fire")
@@ -307,7 +306,7 @@ class EffectColorStripStream(ColorStripStream):
self._effective_speed = clock.speed
else:
anim_time = wall_start
self._effective_speed = self._speed
self._effective_speed = 1.0
n = self._led_count
if n != _pool_n: