Align controller backend and data with new presets

Update palettes, profiles, tabs, preset sending, and ESPNow message format to match the new preset defaults and driver short-field schema.
This commit is contained in:
2026-01-29 00:04:23 +13:00
parent fd37183400
commit cf1d831b5a
11 changed files with 305 additions and 67 deletions

View File

@@ -6,22 +6,30 @@ class Palette(Model):
def create(self, name="", colors=None):
next_id = self.get_next_id()
self[next_id] = {
"name": name,
"colors": colors if colors else []
}
# Store palette as a simple list of colors; name is ignored.
self[next_id] = list(colors) if colors else []
self.save()
return next_id
def read(self, id):
id_str = str(id)
return self.get(id_str, None)
value = self.get(id_str, None)
# Backwards compatibility: if stored as {"colors": [...]}, unwrap.
if isinstance(value, dict) and "colors" in value:
return value.get("colors") or []
# Otherwise, expect a list of colors.
return value or []
def update(self, id, data):
id_str = str(id)
if id_str not in self:
return False
self[id_str].update(data)
# Accept either {"colors": [...]} or a raw list.
if isinstance(data, dict):
colors = data.get("colors", [])
else:
colors = data
self[id_str] = list(colors) if colors else []
self.save()
return True

View File

@@ -1,21 +1,45 @@
from models.model import Model
from models.pallet import Palette
class Profile(Model):
def __init__(self):
"""Profile model.
Each profile owns a single, unique palette stored in the Palette model.
The profile stores a `palette_id` that points to its palette; any legacy
inline `palette` arrays are migrated to a dedicated Palette entry.
"""
super().__init__()
self._palette_model = Palette()
# Migrate legacy inline palettes to separate Palette entries.
changed = False
for pid, pdata in list(self.items()):
if isinstance(pdata, dict):
if "palette" in pdata and "palette_id" not in pdata:
colors = pdata.get("palette") or []
palette_id = self._palette_model.create(colors=colors)
pdata.pop("palette", None)
pdata["palette_id"] = str(palette_id)
changed = True
if changed:
self.save()
def create(self, name="", profile_type="tabs"):
"""
Create a new profile.
"""Create a new profile and its own empty palette.
profile_type: "tabs" or "scenes" (ignoring scenes for now)
"""
next_id = self.get_next_id()
# Create a unique palette for this profile.
palette_id = self._palette_model.create(colors=[])
self[next_id] = {
"name": name,
"type": profile_type, # "tabs" or "scenes"
"tabs": [], # Array of tab IDs
"scenes": [], # Array of scene IDs (for future use)
"palette": []
"palette_id": str(palette_id),
}
self.save()
return next_id