diff --git a/src/models/group.py b/src/models/group.py new file mode 100644 index 0000000..06bec27 --- /dev/null +++ b/src/models/group.py @@ -0,0 +1,51 @@ +from models.model import Model + +class Group(Model): + def __init__(self): + super().__init__() + + def create(self, name=""): + next_id = self.get_next_id() + self[next_id] = { + "name": name, + "devices": [], + "pattern": "on", + "colors": ["000000", "FF0000"], + "brightness": 100, + "delay": 100, + "step_offset": 0, + "step_increment": 1, + "n1": 0, + "n2": 0, + "n3": 0, + "n4": 0, + "n5": 0, + "n6": 0, + "n7": 0, + "n8": 0 + } + 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 + 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()) diff --git a/src/models/model.py b/src/models/model.py new file mode 100644 index 0000000..686cacc --- /dev/null +++ b/src/models/model.py @@ -0,0 +1,42 @@ +import json +import wifi +import ubinascii +import machine + +class Model(dict): + + def __init__(self): + self.file = self.__class__.__name__ + ".json" + super().__init__() + + self.load() # Load settings from file during initialization + + def set_defaults(self): + self = {} + + def get_next_id(self): + """Get the next available ID for creating a new record.""" + if not self: + return "1" + max_id = max((int(k) for k in self.keys() if k.isdigit()), default=0) + return str(max_id + 1) + + def save(self): + try: + j = json.dumps(self) + with open(self.file, 'w') as file: + file.write(j) + print("Settings saved successfully.") + except Exception as e: + print(f"Error saving settings: {e}") + + def load(self): + try: + with open(self.file, 'r') as file: + loaded_settings = json.load(file) + self.update(loaded_settings) + print("Settings loaded successfully.") + except Exception as e: + print(f"Error loading settings") + self.set_defaults() + self.save() diff --git a/src/models/pallet.py b/src/models/pallet.py new file mode 100644 index 0000000..6eb2cfe --- /dev/null +++ b/src/models/pallet.py @@ -0,0 +1,37 @@ +from models.model import Model + +class Palette(Model): + def __init__(self): + super().__init__() + + def create(self, name="", colors=None): + next_id = self.get_next_id() + self[next_id] = { + "name": name, + "colors": colors if colors 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 + 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()) diff --git a/src/models/preset.py b/src/models/preset.py new file mode 100644 index 0000000..1a5545b --- /dev/null +++ b/src/models/preset.py @@ -0,0 +1,50 @@ +from models.model import Model + +class Preset(Model): + def __init__(self): + super().__init__() + + def create(self): + next_id = self.get_next_id() + self[next_id] = { + "name": "", + "pattern": "", + "colors": [], + "brightness": 0, + "delay": 0, + "n1": 0, + "n2": 0, + "n3": 0, + "n4": 0, + "n5": 0, + "n6": 0, + } + self.save() + return next_id + + + def read(self, id): + id_str = str(id) + if id_str not in self: + return None + return self[id_str] + + def update(self, id, data): + id_str = str(id) + if id_str not in self: + return False + 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()) + \ No newline at end of file diff --git a/src/models/profile.py b/src/models/profile.py new file mode 100644 index 0000000..5b9275b --- /dev/null +++ b/src/models/profile.py @@ -0,0 +1,40 @@ +from models.model import Model + +class Profile(Model): + def __init__(self): + super().__init__() + + def create(self, name=""): + next_id = self.get_next_id() + self[next_id] = { + "name": name, + "tabs": {}, + "palette": [], + "tab_order": [] + } + 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 + 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()) + \ No newline at end of file diff --git a/src/models/squence.py b/src/models/squence.py new file mode 100644 index 0000000..6d39ffb --- /dev/null +++ b/src/models/squence.py @@ -0,0 +1,44 @@ +from models.model import Model + +class Sequence(Model): + def __init__(self): + super().__init__() + + def create(self, group_name="", preset_names=None): + next_id = self.get_next_id() + self[next_id] = { + "group_name": group_name, + "presets": preset_names if preset_names else [], + "sequence_duration": 3000, # Duration per preset in ms + "sequence_transition": 500, # Transition time in ms + "sequence_loop": False, + "sequence_repeat_count": 0, # 0 = infinite + "sequence_active": False, + "sequence_index": 0, + "sequence_start_time": 0 + } + 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 + 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()) diff --git a/src/models/tab.py b/src/models/tab.py new file mode 100644 index 0000000..c55ca3a --- /dev/null +++ b/src/models/tab.py @@ -0,0 +1,38 @@ +from models.model import Model + +class Tab(Model): + def __init__(self): + super().__init__() + + def create(self, name="", names=None, presets=None): + next_id = self.get_next_id() + self[next_id] = { + "name": name, + "names": names if names else [], + "presets": presets if presets 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 + 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())