Add LED device abstraction layer for multi-controller support
Introduce abstract LEDClient base class with factory pattern so new LED controller types can plug in alongside WLED. ProcessorManager is now fully type-agnostic — all device-specific logic (health checks, state snapshot/restore, fast send) lives behind the LEDClient interface. - New led_client.py: LEDClient ABC, DeviceHealth, factory functions - WLEDClient inherits LEDClient, encapsulates WLED health checks and state management - device_type field on Device storage model (defaults to "wled") - Rename target_type "wled" → "led" with backward-compat migration - Frontend: "WLED" tab → "LED", device type badge, type selector in add-device modal, device type shown in target device dropdown - All wled_* API fields renamed to device_* for generic naming Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,7 @@ class Device:
|
||||
url: str,
|
||||
led_count: int,
|
||||
enabled: bool = True,
|
||||
device_type: str = "wled",
|
||||
calibration: Optional[CalibrationConfig] = None,
|
||||
created_at: Optional[datetime] = None,
|
||||
updated_at: Optional[datetime] = None,
|
||||
@@ -40,6 +41,7 @@ class Device:
|
||||
self.url = url
|
||||
self.led_count = led_count
|
||||
self.enabled = enabled
|
||||
self.device_type = device_type
|
||||
self.calibration = calibration or create_default_calibration(led_count)
|
||||
self.created_at = created_at or datetime.utcnow()
|
||||
self.updated_at = updated_at or datetime.utcnow()
|
||||
@@ -52,6 +54,7 @@ class Device:
|
||||
"url": self.url,
|
||||
"led_count": self.led_count,
|
||||
"enabled": self.enabled,
|
||||
"device_type": self.device_type,
|
||||
"calibration": calibration_to_dict(self.calibration),
|
||||
"created_at": self.created_at.isoformat(),
|
||||
"updated_at": self.updated_at.isoformat(),
|
||||
@@ -77,6 +80,7 @@ class Device:
|
||||
url=data["url"],
|
||||
led_count=data["led_count"],
|
||||
enabled=data.get("enabled", True),
|
||||
device_type=data.get("device_type", "wled"),
|
||||
calibration=calibration,
|
||||
created_at=datetime.fromisoformat(data.get("created_at", datetime.utcnow().isoformat())),
|
||||
updated_at=datetime.fromisoformat(data.get("updated_at", datetime.utcnow().isoformat())),
|
||||
@@ -160,6 +164,7 @@ class DeviceStore:
|
||||
name: str,
|
||||
url: str,
|
||||
led_count: int,
|
||||
device_type: str = "wled",
|
||||
calibration: Optional[CalibrationConfig] = None,
|
||||
) -> Device:
|
||||
"""Create a new device."""
|
||||
@@ -170,6 +175,7 @@ class DeviceStore:
|
||||
name=name,
|
||||
url=url,
|
||||
led_count=led_count,
|
||||
device_type=device_type,
|
||||
calibration=calibration,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user