from models.model import Model def _normalize_address(addr): """Normalize 6-byte ESP32 address to 12-char lowercase hex (no colons).""" if addr is None: return None s = str(addr).strip().lower().replace(":", "").replace("-", "") if len(s) == 12 and all(c in "0123456789abcdef" for c in s): return s return None class Device(Model): def __init__(self): super().__init__() def create(self, name="", address=None, default_pattern=None, tabs=None): next_id = self.get_next_id() addr = _normalize_address(address) self[next_id] = { "name": name, "address": addr, "default_pattern": default_pattern if default_pattern else None, "tabs": list(tabs) if tabs else [], } self.save() return next_id def read(self, id): id_str = str(id) return self.get(id_str, None) def update(self, id, data): id_str = str(id) if id_str not in self: return False if "address" in data and data["address"] is not None: data = dict(data) data["address"] = _normalize_address(data["address"]) self[id_str].update(data) self.save() return True def delete(self, id): id_str = str(id) if id_str not in self: return False self.pop(id_str) self.save() return True def list(self): return list(self.keys())