Add per-target protocol selection (DDP/HTTP) and reorganize target editor

- Add protocol field (ddp/http) to storage, API schemas, routes, processor
- WledTargetProcessor passes protocol to create_led_client(use_ddp=...)
- Target editor: protocol dropdown + keepalive in collapsible Specific Settings
- FPS, brightness threshold, adaptive FPS moved to main form area
- Hide Specific Settings section for serial devices (protocol is WLED-only)
- Card badge: show DDP/HTTP for WLED devices, Serial for serial devices

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-26 20:52:03 +03:00
parent cadef971e7
commit fda040ae18
11 changed files with 87 additions and 21 deletions

View File

@@ -323,6 +323,7 @@ class ProcessorManager:
brightness_value_source_id: str = "",
min_brightness_threshold: int = 0,
adaptive_fps: bool = False,
protocol: str = "ddp",
):
"""Register a WLED target processor."""
if target_id in self._processors:
@@ -340,6 +341,7 @@ class ProcessorManager:
brightness_value_source_id=brightness_value_source_id,
min_brightness_threshold=min_brightness_threshold,
adaptive_fps=adaptive_fps,
protocol=protocol,
ctx=self._build_context(),
)
self._processors[target_id] = proc

View File

@@ -39,6 +39,7 @@ class WledTargetProcessor(TargetProcessor):
brightness_value_source_id: str = "",
min_brightness_threshold: int = 0,
adaptive_fps: bool = False,
protocol: str = "ddp",
ctx: TargetContext = None,
):
super().__init__(target_id, ctx)
@@ -50,6 +51,7 @@ class WledTargetProcessor(TargetProcessor):
self._brightness_vs_id = brightness_value_source_id
self._min_brightness_threshold = min_brightness_threshold
self._adaptive_fps = adaptive_fps
self._protocol = protocol
# Adaptive FPS / liveness probe runtime state
self._effective_fps: int = self._target_fps
@@ -95,7 +97,7 @@ class WledTargetProcessor(TargetProcessor):
try:
self._led_client = create_led_client(
device_info.device_type, device_info.device_url,
use_ddp=True, led_count=device_info.led_count,
use_ddp=(self._protocol == "ddp"), led_count=device_info.led_count,
baud_rate=device_info.baud_rate,
send_latency_ms=device_info.send_latency_ms,
rgbw=device_info.rgbw,
@@ -373,6 +375,7 @@ class WledTargetProcessor(TargetProcessor):
"errors": [metrics.last_error] if metrics.last_error else [],
"device_streaming_reachable": self._device_reachable if self._is_running else None,
"fps_effective": self._effective_fps if self._is_running else None,
"protocol": self._protocol,
}
def get_metrics(self) -> dict: