55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
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())
|