From bc1ecfd13c4bae53225f8aad29c364e244a9a50f Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 24 Dec 2023 14:47:53 +0100 Subject: [PATCH 01/10] minor changes --- bot_framework/telepot_bot.py | 12 ++++++------ control/service.py | 4 ++-- functions/__init__.py | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index 0cae22d..30c9288 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -52,10 +52,10 @@ def __init__(self, t, ids): self._remove_keyboard = ReplyKeyboardRemove() # keys order (refer config) self.__keyboard_markup = ReplyKeyboardMarkup(keyboard=[ - self.__button_group([4, 5, 17, 18, 19, 21, 22]), - self.__button_group([8, 9, 10, 13, 11, 12, 14]), - self.__button_group([15, 20, 6, 23, 7, 24]), - self.__button_group([2, 3, 16]) + self.__btn_grp([4, 5, 17, 18, 19, 21, 22]), + self.__btn_grp([8, 9, 10, 13, 11, 12, 14]), + self.__btn_grp([15, 20, 6, 23, 7, 24]), + self.__btn_grp([2, 3, 16]) ]) self.__log.debug(f"Done, keyboards and buttons built.") self.__func_thread = None @@ -89,12 +89,12 @@ def __button(self, text, i) -> KeyboardButton: return KeyboardButton(text=text) # noinspection PyMethodMayBeStatic - def __button_group(self, choices: list) -> list: + def __btn_grp(self, choices: list) -> list: btn_list, il = [], [] for i in choices: btn_list.append(self.__button(commands[i], i)) il.append(i) - self.__log.debug(f"arranged {il}") + self.__log.debug(f"{il} arranged") return btn_list def __send(self, ch_id, text, reply_markup, parse_mode='Markdown'): diff --git a/control/service.py b/control/service.py index a9aeddf..23a718c 100644 --- a/control/service.py +++ b/control/service.py @@ -49,7 +49,7 @@ Candles: Each LED simulates candlelight. Strobe: Emitting brief and rapid flashes of white light in random frequency. -- *Service menu:* +- *Service* menu: /Reboot device /Restart bot application (running as service) /Info Information commit/release versions on GitHub, host name, IP, memory usage, disk usage, cpu load. @@ -70,7 +70,7 @@ def __init__(self, command: str = None, log_msg: str = None): self.__log_msg = log_msg self.__command = command self.__help_txt = HELP_TEXT - self.__menu_header = f"{NAME} functions:" + self.__menu_header = f"*{NAME}*:" self.__menu_dictionary = { 0: self.c_reboot, 1: self.c_restart, diff --git a/functions/__init__.py b/functions/__init__.py index 36e3298..c1a87bd 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -21,7 +21,7 @@ STOP_CMD = commands[0] -def light_animations(): +def get_dictionary(): try: """ Ensure right order of functions, @@ -41,10 +41,10 @@ def light_animations(): for i in range(len(commands)): f = funcs[i] dic[commands[i]] = f - LOGGER.debug(f"Dictionary function[{i:02d}] {commands[i]}: {f}") + LOGGER.debug(f"function[{i:02d}] {commands[i]}: {f}") return dic except Exception as ex: LOGGER.error(f"{ex}") -dictionary_of_functions = light_animations() +dictionary_of_functions = get_dictionary() From 03ddef4e28edd17d8b92c638211bf719f0ed98f2 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 15:30:09 +0100 Subject: [PATCH 02/10] minor changes --- bot_framework/telepot_bot.py | 5 ++++- config/__init__.py | 8 ++++---- config/settings.py | 2 +- config/{dictionary.json => ui_translations.json} | 0 functions/__init__.py | 2 +- functions/advent.py | 13 ++++++++----- 6 files changed, 18 insertions(+), 12 deletions(-) rename config/{dictionary.json => ui_translations.json} (100%) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index 30c9288..d8343a0 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -214,7 +214,10 @@ def start(self): as_nfo = f"Autostart" self.__log.info(f"{as_nfo} = {AUTO_START}") with open(HISTORY, "r") as f: - line = f.readlines()[-1] + # FIXME: if no HISTORY, impossible to find line in file + lines = f.readlines() + # if len(f.readlines()) > 0 else ["new file\n"] + line = lines[-1] self.__log.warning(line.replace("\n", "")) # TODO: implement considering of translation of stored command after language change # - search key of value/stored string and gather translations with this key diff --git a/config/__init__.py b/config/__init__.py index d9a2fe0..c70404f 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -19,18 +19,18 @@ translations = json.load(file) commands = [] -# not really needed, but better to avoid error messages in the IDE +# Init not really needed, but better to avoid error messages in the IDE (m_wrong_id, m_not_allowed, m_pls_select, m_called, m_started, m_rebooted, m_restarted, m_stopped, m_standby, m_stop_f, m_killed, m_updated) \ - = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + = [None] * 12 for item in translations.items(): _type = item[1].get('type') _name = item[1].get('name') _value = item[1].get(LANGUAGE) _n = int(item[0]) - globals()[_name] = _value - _value_hr = _value.replace("\n", "") + globals()[_name] = _value # variables creation dynamically + _value_hr = _value.replace("\n", "") # human readable if _type == "btn_txt": # commands _n = len(commands) diff --git a/config/settings.py b/config/settings.py index f723c75..21057b9 100644 --- a/config/settings.py +++ b/config/settings.py @@ -22,7 +22,7 @@ AUTO_START = False LANGUAGE = "German" # language keys: "German", "English", "French" RUNNING = "Bot is running..." -TRANSLATIONS = 'dictionary.json' +TRANSLATIONS = 'ui_translations.json' if __name__ == '__main__': pass diff --git a/config/dictionary.json b/config/ui_translations.json similarity index 100% rename from config/dictionary.json rename to config/ui_translations.json diff --git a/functions/__init__.py b/functions/__init__.py index c1a87bd..8ba8e94 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -26,7 +26,7 @@ def get_dictionary(): """ Ensure right order of functions, depends on the command order - in config/dictionary.json + in config/ui_translations.json """ dic = {} funcs = [None, None, diff --git a/functions/advent.py b/functions/advent.py index 0798715..18c757b 100644 --- a/functions/advent.py +++ b/functions/advent.py @@ -20,9 +20,12 @@ class Advent: logger = LOGGER CANDLE = Candles.RED, Candles.GREEN, Candles.BLUE - ADVENT = 255, 30, 0 # advent RGB - ZERO = (210, 70, 0) # first LED - NAD = [27, 28, 29, 30] # November advent days + ADVENT = 255, 30, 0 + """Advent RGB""" + FIRST = (210, 70, 0) + """1st LED RGB""" + NAD = [27, 28, 29, 30] + """possible November advent days""" WRONG = f"Wrong period to show xmas/advent animation, " \ f"it\'s {time.strftime('%A, %d.%B %Y')}!" @@ -57,7 +60,7 @@ def __init__(self, light_wreath): while count > 0: Advent.logger.warning(Advent.WRONG) count -= 1 - Effect(self.__light_wreath).chaser(Color(*Advent.ZERO)) + Effect(self.__light_wreath).chaser(Color(*Advent.FIRST)) peripheral_functions.get(3) def __calendar(self): @@ -74,7 +77,7 @@ def __calendar(self): # different color and brightness per day # set up first LED as advent because it's before 1st December if advents[0] in Advent.NAD: - self.__randomize(0, Advent.ZERO) + self.__randomize(0, Advent.FIRST) # set up other advents in december if (i + 1) in advents: self.__randomize(i, Advent.ADVENT) From a187c7c77a7fa7bb8d059521835d52a1e09580c6 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 17:07:31 +0100 Subject: [PATCH 03/10] bot main handle definition refactored --- bot_framework/telepot_bot.py | 97 +++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index d8343a0..8e9bac1 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -139,6 +139,31 @@ def __handle(self, msg): content_type, chat_type, chat_id = telepot.glance(msg) self.__log.debug(msg) + def answer(txt): + self.__send(chat_id, txt, reply_markup=self.rm_kb) + + def execution_possible(txt): + if command == txt: + if self.__stop_function(chat_id, msg=None): + return True + + def selection_request(): + self.__send(chat_id, + m_pls_select.format(msg['from']['first_name']), + reply_markup=self.kb_markup) + + def help_requested(): + return execution_possible( + service.Service.c_help) or execution_possible( + service.Service.c_help.lower()) + + def sos(): + """start or stop w/o leading '/'""" + return (command.startswith(commands[0])) or ( + command.startswith(commands[0].lower())) or ( + command.startswith(commands[1])) or ( + command.startswith(commands[1].lower())) + # check user if chat_id not in self.__admins: self.__reply_wrong_id(chat_id, msg) @@ -147,57 +172,37 @@ def __handle(self, msg): if content_type == 'text': command = msg['text'] self.__log.info(f"Got command '{command}'") - # /start - if command == "/start": - if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, - m_pls_select.format(msg['from']['first_name']), - reply_markup=self.kb_markup) - - # /stop - elif command == "/stop": - if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, m_stopped, reply_markup=self.rm_kb) - # stop function - elif (command.startswith(commands[0])) \ - or (command.startswith(commands[0].lower())): - if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, - m_pls_select.format(msg['from']['first_name']), - reply_markup=self.kb_markup) - - # /service - elif command == ('/' + service.NAME.lower()): - if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, service.menu, reply_markup=self.rm_kb) - elif command == service.Service.c_reboot: - self.__send(chat_id, m_rebooted, reply_markup=self.rm_kb) + # Bot menu respectively Telegram-in-app-commands + if execution_possible("/start"): + selection_request() + elif execution_possible("/stop"): + answer(m_stopped) + elif execution_possible('/' + service.NAME.lower()): + answer(service.menu) + elif execution_possible(service.Service.c_reboot): + answer(m_rebooted) service.reboot_device(m_rebooted) - elif command == service.Service.c_restart: - self.__send(chat_id, m_restarted, reply_markup=self.rm_kb) + elif execution_possible(service.Service.c_restart): + answer(m_restarted) service.restart_service(m_restarted) - elif command == service.Service.c_info: - if self.__stop_function(chat_id, msg=None): - info = service.system_info() - self.__send(chat_id, info, reply_markup=self.rm_kb) - self.__log.info(info.replace("\n", "").replace(" ", "")) - elif command == service.Service.c_update: + elif execution_possible(service.Service.c_info): + info = service.system_info() + answer(info) + self.__log.info(info.replace("\n", "").replace(" ", "")) + elif execution_possible(service.Service.c_update): + answer(m_updated) + update_bot(m_updated) + elif help_requested(): + answer(service.get_help_text()) + # start or stop + elif sos(): if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, m_updated, reply_markup=self.rm_kb) - update_bot(m_updated) - elif command == service.Service.c_help \ - or command == service.Service.c_help.lower(): - if self.__stop_function(chat_id, msg=None): - self.__send(chat_id, service.get_help_text(), - reply_markup=self.rm_kb) - + selection_request() # all other commands - elif any(c for c in commands if (command == c)): - if self.__stop_function(chat_id, msg=None): - self.__func_thread = run_thread(command, chat_id, self) - self.__send(chat_id, text=command, - reply_markup=self.kb_stop) + elif any(c for c in commands if (execution_possible(c))): + self.__func_thread = run_thread(command, chat_id, self) + self.__send(chat_id, text=command, reply_markup=self.kb_stop) else: self.__reply_wrong_command(chat_id, command) else: From 41c042de92caeb3d2c8ee1a7c700cb9f9b093f1f Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 18:00:57 +0100 Subject: [PATCH 04/10] bot class: minor changes --- bot_framework/telepot_bot.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index 8e9bac1..979fa63 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -49,7 +49,7 @@ def __init__(self, t, ids): self.__admins = ids self.__bot = telepot.Bot(self.__token) - self._remove_keyboard = ReplyKeyboardRemove() + self.__remove_keyboard = ReplyKeyboardRemove() # keys order (refer config) self.__keyboard_markup = ReplyKeyboardMarkup(keyboard=[ self.__btn_grp([4, 5, 17, 18, 19, 21, 22]), @@ -60,18 +60,9 @@ def __init__(self, t, ids): self.__log.debug(f"Done, keyboards and buttons built.") self.__func_thread = None - @property - def rm_kb(self): - return self._remove_keyboard - - @property - def kb_markup(self): - return self.__keyboard_markup - @property def kb_stop(self): - r = ReplyKeyboardMarkup( - keyboard=[[self.__button(commands[0], 0)]]) + r = ReplyKeyboardMarkup(keyboard=[[self.__button(commands[0], 0)]]) self.__log.debug(f"Stop keyboard markup: {r}") return r @@ -114,7 +105,7 @@ def __reply_wrong_id(self, ch_id, msg): f"{ch_id} User:{username}, {first_name} {last_name}" self.__send(ch_id, m_wrong_id.format(user_id, username, first_name, last_name), - reply_markup=self.rm_kb) + reply_markup=self.__remove_keyboard) raise Exception(log_msg) except Exception as ex: self.__log.warning(f"{ex}") @@ -131,7 +122,7 @@ def __reply_wrong_command(self, ch_id, content): def __stop_function(self, ch_id, msg): if msg is not None: - self.__send(ch_id, msg, reply_markup=self.rm_kb) + self.__send(ch_id, msg, reply_markup=self.__remove_keyboard) # return True if stop_threads() else False return stop_threads() @@ -140,7 +131,7 @@ def __handle(self, msg): self.__log.debug(msg) def answer(txt): - self.__send(chat_id, txt, reply_markup=self.rm_kb) + self.__send(chat_id, txt, reply_markup=self.__remove_keyboard) def execution_possible(txt): if command == txt: @@ -150,7 +141,7 @@ def execution_possible(txt): def selection_request(): self.__send(chat_id, m_pls_select.format(msg['from']['first_name']), - reply_markup=self.kb_markup) + reply_markup=self.__keyboard_markup) def help_requested(): return execution_possible( @@ -211,7 +202,7 @@ def sos(): def start(self): self.__log.info(RUNNING) for a in self.__admins: - self.__send(a, m_started, reply_markup=self.rm_kb) + self.__send(a, m_started, reply_markup=self.__remove_keyboard) MessageLoop(self.__bot, {'chat': self.__handle}).run_as_thread() @@ -245,7 +236,7 @@ def start(self): self.__log.info(f"{ar_nfo} = {AUTO_REBOOT_ENABLED}") if AUTO_REBOOT_ENABLED: for a in self.__admins: - kb = self.kb_stop if AUTO_START else self.rm_kb + kb = self.kb_stop if AUTO_START else self.__remove_keyboard self.__send(a, f"{ar_nfo}: {AUTO_REBOOT_TIME} CET", reply_markup=kb) AutoReboot(reboot_time=AUTO_REBOOT_TIME, bot=self).start() From 236ecef06c39d370b7899f168a37200792eea699 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 19:15:53 +0100 Subject: [PATCH 05/10] effect class: some improvements --- functions/effects.py | 68 ++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/functions/effects.py b/functions/effects.py index 113746f..07c2cf3 100644 --- a/functions/effects.py +++ b/functions/effects.py @@ -19,28 +19,28 @@ class Effect: log = LOGGER - __spectr = 255 + spectrum = 255 def __init__(self, fairy_lights: Adafruit_NeoPixel): self.__leds = fairy_lights - self.__spectr = Effect.__spectr + wreath_setup(self.__leds) Effect.log.debug(f"Initialize instance of {self.__class__.__name__} " f"for {self.__leds}.") - Effect.log.debug(f"Call effect: {inspect.stack()[1].function}") + Effect.log.debug(str(inspect.stack()[1].code_context[0]).strip()) @classmethod def __wheel(cls, pos): """ - Generate rainbow colors across 0-255 positions. + color depends on position """ if pos < 85: - return Color(pos * 3, cls.__spectr - pos * 3, 0) + return Color(pos * 3, cls.spectrum - pos * 3, 0) elif pos < 170: pos -= 85 - return Color(cls.__spectr - pos * 3, 0, pos * 3) + return Color(cls.spectrum - pos * 3, 0, pos * 3) else: pos -= 170 - return Color(0, pos * 3, cls.__spectr - pos * 3) + return Color(0, pos * 3, cls.spectrum - pos * 3) def clear(self): """ @@ -83,10 +83,10 @@ def rainbow(self, wait_ms=20, iterations=1): """ Draw rainbow that fades across all pixels at once. """ - for j in range((self.__spectr + 1) * iterations): + for j in range((Effect.spectrum + 1) * iterations): for i in range(self.__leds.numPixels()): self.__leds.setPixelColor(i, Effect.__wheel( - (i + j) & self.__spectr)) + (i + j) & Effect.spectrum)) self.__leds.show() time.sleep(wait_ms / 1_000.0) @@ -94,12 +94,14 @@ def rainbow_cycle(self, wait_ms=20, iterations=1): """ Draw rainbow that uniformly distributes itself across all pixels. """ - for j in range((self.__spectr + 1) * iterations): + for j in range((Effect.spectrum + 1) * iterations): for i in range(self.__leds.numPixels()): self.__leds.setPixelColor( i, Effect.__wheel( - (int(i * 256 / self.__leds.numPixels()) + j) - & self.__spectr)) + (int(i * ( + Effect.spectrum + 1) + / self.__leds.numPixels()) + j) + & Effect.spectrum)) self.__leds.show() time.sleep(wait_ms / 1_000.0) @@ -107,11 +109,11 @@ def rainbow_chaser(self, wait_ms=50, iterations=1): """ Rainbow movie theater light style chaser animation. """ - for j in range((self.__spectr + 1) * iterations): + for j in range((Effect.spectrum + 1) * iterations): for led in range(3): for i in range(0, self.__leds.numPixels(), 3): self.__leds.setPixelColor( - i + led, Effect.__wheel((i + j) % self.__spectr)) + i + led, Effect.__wheel((i + j) % Effect.spectrum)) self.__leds.show() time.sleep(wait_ms / 1_000.0) for i in range(0, self.__leds.numPixels(), 3): @@ -144,22 +146,6 @@ def wipe_second(self, color: Color, pivot=0, back_again=True): # TODO: create new wipe effects (wandering empty pixel) and implement -def __loop(wreath, effect): - Effect.log.debug(inspect.stack()[1].code_context) - from control import stopped - while not stopped(): - try: - wreath_setup(wreath) - return effect - except KeyboardInterrupt: - Effect.log.warning("KeyboardInterrupt") - exit() - except Exception as e: - Effect.log.error(f"Any error occurs: {e}") - exit() - Effect(wreath).clear() - - def clear(wreath): try: Effect(wreath).clear() @@ -173,29 +159,29 @@ def clear(wreath): def run_rainbow(wreath): while True: - __loop(wreath, Effect(wreath).rainbow(iterations=1)) + Effect(wreath).rainbow(iterations=1) def run_rainbow_cycle(wreath): while True: - __loop(wreath, Effect(wreath).rainbow_cycle(iterations=1)) + Effect(wreath).rainbow_cycle(iterations=1) def run_rainbow_chaser(wreath): while True: - __loop(wreath, Effect(wreath).rainbow_chaser(iterations=1)) + Effect(wreath).rainbow_chaser(iterations=1) def run_theater(wreath): while True: - __loop(wreath, Effect(wreath).full_wipe(Color(127, 0, 0))) - __loop(wreath, Effect(wreath).full_wipe(Color(0, 127, 0))) - __loop(wreath, Effect(wreath).full_wipe(Color(0, 0, 127))) - __loop(wreath, Effect(wreath).full_wipe(Color(127, 127, 127))) - __loop(wreath, Effect(wreath).chaser(Color(127, 127, 127))) - __loop(wreath, Effect(wreath).chaser(Color(0, 0, 127))) - __loop(wreath, Effect(wreath).chaser(Color(0, 127, 0))) - __loop(wreath, Effect(wreath).chaser(Color(127, 0, 0))) + Effect(wreath).full_wipe(Color(127, 0, 0)) + Effect(wreath).full_wipe(Color(0, 127, 0)) + Effect(wreath).full_wipe(Color(0, 0, 127)) + Effect(wreath).full_wipe(Color(127, 127, 127)) + Effect(wreath).chaser(Color(127, 127, 127)) + Effect(wreath).chaser(Color(0, 0, 127)) + Effect(wreath).chaser(Color(0, 127, 0)) + Effect(wreath).chaser(Color(127, 0, 0)) def wipe_second(wreath, color, pivot, back_again=True): From 7174c18e275a1aa539c841f4fb8e34d6f7d3f6aa Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 21:29:38 +0100 Subject: [PATCH 06/10] update buttons creation --- bot_framework/telepot_bot.py | 12 +++++------- functions/__init__.py | 13 ++++++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index 979fa63..d78fcdd 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -23,7 +23,7 @@ stop_threads from control.reboot import AutoReboot from control.update import update_bot -from functions import STOP_CMD +from functions import STOP_CMD, indices_of_functions from logger import LOGGER, HISTORY admins = [ID_CHAT_THK] @@ -51,12 +51,10 @@ def __init__(self, t, ids): self.__remove_keyboard = ReplyKeyboardRemove() # keys order (refer config) - self.__keyboard_markup = ReplyKeyboardMarkup(keyboard=[ - self.__btn_grp([4, 5, 17, 18, 19, 21, 22]), - self.__btn_grp([8, 9, 10, 13, 11, 12, 14]), - self.__btn_grp([15, 20, 6, 23, 7, 24]), - self.__btn_grp([2, 3, 16]) - ]) + self.__keyboard = [] + for i in range(len(indices_of_functions)): + self.__keyboard.append(self.__btn_grp(indices_of_functions[i])) + self.__keyboard_markup = ReplyKeyboardMarkup(keyboard=self.__keyboard) self.__log.debug(f"Done, keyboards and buttons built.") self.__func_thread = None diff --git a/functions/__init__.py b/functions/__init__.py index 8ba8e94..5e1e177 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -21,7 +21,7 @@ STOP_CMD = commands[0] -def get_dictionary(): +def arranged(): try: """ Ensure right order of functions, @@ -38,13 +38,20 @@ def get_dictionary(): run_clock5, run_demo2, run_clock6, run_clock7, run_rainbow, run_rainbow_chaser, None] + + i_clocks = 4, 5, 17, 18, 19, 21, 22 + i_colors = 8, 9, 10, 13, 11, 12, 14 + i_effects = 15, 20, 6, 23, 7, 24 + i_specials = 2, 3, 16 + indices = i_clocks, i_colors, i_effects, i_specials + for i in range(len(commands)): f = funcs[i] dic[commands[i]] = f LOGGER.debug(f"function[{i:02d}] {commands[i]}: {f}") - return dic + return dic, indices except Exception as ex: LOGGER.error(f"{ex}") -dictionary_of_functions = get_dictionary() +dictionary_of_functions, indices_of_functions = arranged() From d004edf059eac6e5bd03017694c02bc35e214194 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 28 Dec 2023 22:06:59 +0100 Subject: [PATCH 07/10] marginal renaming --- bot_framework/telepot_bot.py | 27 +++++++++++++-------------- control/__init__.py | 8 ++++---- functions/__init__.py | 7 ++++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/bot_framework/telepot_bot.py b/bot_framework/telepot_bot.py index d78fcdd..f5629a0 100644 --- a/bot_framework/telepot_bot.py +++ b/bot_framework/telepot_bot.py @@ -23,7 +23,7 @@ stop_threads from control.reboot import AutoReboot from control.update import update_bot -from functions import STOP_CMD, indices_of_functions +from functions import indices_of_functions, STOP, START from logger import LOGGER, HISTORY admins = [ID_CHAT_THK] @@ -59,8 +59,8 @@ def __init__(self, t, ids): self.__func_thread = None @property - def kb_stop(self): - r = ReplyKeyboardMarkup(keyboard=[[self.__button(commands[0], 0)]]) + def kb_stop(self) -> ReplyKeyboardMarkup: + r = ReplyKeyboardMarkup(keyboard=[[self.__btn(STOP, 0)]]) self.__log.debug(f"Stop keyboard markup: {r}") return r @@ -73,7 +73,7 @@ def external_request(cls, msg, chat_id=None, reply_markup=None, bot=None): bot.__send(ch_id=chat_id, text=msg, reply_markup=reply_markup) # noinspection PyMethodMayBeStatic - def __button(self, text, i) -> KeyboardButton: + def __btn(self, text, i) -> KeyboardButton: self.__log.debug(f"[{i:02d}] {text}") return KeyboardButton(text=text) @@ -81,7 +81,7 @@ def __button(self, text, i) -> KeyboardButton: def __btn_grp(self, choices: list) -> list: btn_list, il = [], [] for i in choices: - btn_list.append(self.__button(commands[i], i)) + btn_list.append(self.__btn(commands[i], i)) il.append(i) self.__log.debug(f"{il} arranged") return btn_list @@ -118,10 +118,9 @@ def __reply_wrong_command(self, ch_id, content): self.__log.warning(str(ex)) return - def __stop_function(self, ch_id, msg): + def __stop_function(self, ch_id, msg) -> bool: if msg is not None: self.__send(ch_id, msg, reply_markup=self.__remove_keyboard) - # return True if stop_threads() else False return stop_threads() def __handle(self, msg): @@ -131,7 +130,7 @@ def __handle(self, msg): def answer(txt): self.__send(chat_id, txt, reply_markup=self.__remove_keyboard) - def execution_possible(txt): + def execution_possible(txt) -> bool: if command == txt: if self.__stop_function(chat_id, msg=None): return True @@ -146,12 +145,12 @@ def help_requested(): service.Service.c_help) or execution_possible( service.Service.c_help.lower()) - def sos(): + def sos() -> bool: """start or stop w/o leading '/'""" - return (command.startswith(commands[0])) or ( - command.startswith(commands[0].lower())) or ( - command.startswith(commands[1])) or ( - command.startswith(commands[1].lower())) + return (command.startswith(STOP)) or ( + command.startswith(STOP.lower())) or ( + command.startswith(START)) or ( + command.startswith(START.lower())) # check user if chat_id not in self.__admins: @@ -217,7 +216,7 @@ def start(self): # - search key of value/stored string and gather translations with this key # - depending of set language execute/set command text cmd = line.partition(" HISTORY ")[2].replace("\n", "") - _stop = (cmd == STOP_CMD) + _stop = (cmd == STOP) self.__log.warning(_stop) if AUTO_START: if not _stop: diff --git a/control/__init__.py b/control/__init__.py index db7a58f..0aa089c 100644 --- a/control/__init__.py +++ b/control/__init__.py @@ -6,14 +6,14 @@ __maintainer__ = "Thomas Kaulke" __status__ = "Production" -from functions import dictionary_of_functions, STOP_CMD +from functions import dictionary_of_functions, STOP from functions.effects import clear from logger import LOGGER from .light import LightFunction from .wreath import WREATH, wreath_setup ERROR = "Any error occurred: " -flag = None +flag = False clear(WREATH) @@ -52,13 +52,13 @@ def run_thread(func_name, request_id, bot): LOGGER.error(f"{ERROR}{e}") -def stop_threads(): +def stop_threads() -> bool: try: for t in LightFunction.threads: if t is not None and t.is_running: t.stop() set_stop_flag(True) - LOGGER.history(STOP_CMD) + LOGGER.history(STOP) except Exception as e: LOGGER.error(f"{ERROR}{e}") set_stop_flag(False) diff --git a/functions/__init__.py b/functions/__init__.py index 5e1e177..387c70b 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -18,10 +18,11 @@ from .effects import run_rainbow, run_rainbow_chaser, run_rainbow_cycle, \ run_theater -STOP_CMD = commands[0] +STOP = commands[0] +START = commands[1] -def arranged(): +def assigned(): try: """ Ensure right order of functions, @@ -54,4 +55,4 @@ def arranged(): LOGGER.error(f"{ex}") -dictionary_of_functions, indices_of_functions = arranged() +dictionary_of_functions, indices_of_functions = assigned() From 29481d8d3da0e8e44f6513dec22845c5f8fc94dd Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 30 Dec 2023 17:17:02 +0100 Subject: [PATCH 08/10] update colors stuff (new class, improved imports) --- control/wreath.py | 2 +- functions/__init__.py | 3 +- functions/advent.py | 2 +- functions/candles.py | 2 +- functions/clocks.py | 67 ++++++++++++---------------- functions/color.py | 46 +++++++++++++++++++ functions/{colors.py => colorant.py} | 60 ++++++++++++------------- functions/effects.py | 23 +++++----- 8 files changed, 120 insertions(+), 85 deletions(-) create mode 100644 functions/color.py rename functions/{colors.py => colorant.py} (68%) diff --git a/control/wreath.py b/control/wreath.py index 8ead9b6..2f5d0ed 100644 --- a/control/wreath.py +++ b/control/wreath.py @@ -8,7 +8,7 @@ import datetime -from rpi_ws281x import * +from rpi_ws281x import Adafruit_NeoPixel from config import LED_BRIGHTNESS, LED_BRIGHTNESS_DAY, LED_BRIGHTNESS_NIGHT, \ LED_COUNT, LED_CUT_OFF_MORNING, LED_CUT_OFF_NIGHT, LED_DMA, LED_FREQ_HZ, \ diff --git a/functions/__init__.py b/functions/__init__.py index 387c70b..5e741b3 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -13,7 +13,8 @@ from .clocks import \ run_clock1, run_clock2, run_clock3, \ run_clock4, run_clock5, run_clock6, run_clock7 -from .colors import run_blue, run_demo, run_demo2, run_green, run_orange, \ +from .color import OwnColors +from .colorant import run_blue, run_demo, run_demo2, run_green, run_orange, \ run_red, run_stroboscope, run_violet, run_white, run_yellow from .effects import run_rainbow, run_rainbow_chaser, run_rainbow_cycle, \ run_theater diff --git a/functions/advent.py b/functions/advent.py index 18c757b..e98bf23 100644 --- a/functions/advent.py +++ b/functions/advent.py @@ -10,7 +10,7 @@ import time from random import randint -from rpi_ws281x import * +from rpi_ws281x import Color from functions.candles import Candles from functions.effects import Effect diff --git a/functions/candles.py b/functions/candles.py index 127f91b..607a4c1 100644 --- a/functions/candles.py +++ b/functions/candles.py @@ -9,7 +9,7 @@ import time from random import randint -from rpi_ws281x import * +from rpi_ws281x import Color from logger import LOGGER diff --git a/functions/clocks.py b/functions/clocks.py index 2264e46..de05216 100644 --- a/functions/clocks.py +++ b/functions/clocks.py @@ -11,31 +11,18 @@ import inspect import time -from rpi_ws281x import * +from rpi_ws281x import Color, Adafruit_NeoPixel from control.wreath import wreath_setup +from functions.color import OwnColors from functions.effects import clear, wipe_second from logger import LOGGER # noinspection PyGlobalUndefined class Clock: - class __AttribDict(dict): - __slots__ = () - __getattr__ = dict.__getitem__ - __setattr__ = dict.__setitem__ - log = LOGGER REFRESH = .1 - COLORS = __AttribDict({ - "red": Color(200, 0, 0), # hour - "blue": Color(0, 0, 200), # minute - "yellow": Color(92, 67, 6), # second - "less_intense_red": Color(50, 0, 0), - "less_intense_blue": Color(0, 0, 40), - "less_intense_green_second": Color(6, 30, 10), - "less_intense_yellow": Color(92 // 4, 67 // 4, 6 // 4) - }) def __init__(self, fairy_lights: Adafruit_NeoPixel, clock: int): self.__fairy_lights = fairy_lights @@ -142,24 +129,26 @@ def __show_strip_btwn_6nd12(self, hour_color, minute_color, hour_dimmed): def _one(self): for i in range(0, self.__fairy_lights.numPixels(), 1): - self.__fairy_lights.setPixelColor(self.__h_hand, Clock.COLORS.red) - self.__expanded_minute_hand(Clock.COLORS.red, Clock.COLORS.blue) + self.__fairy_lights.setPixelColor(self.__h_hand, + OwnColors.color.RED) + self.__expanded_minute_hand(OwnColors.color.RED, + OwnColors.color.BLUE) if i == self.__s_hand: - self.__fairy_lights.setPixelColor(i, Clock.COLORS.yellow) + self.__fairy_lights.setPixelColor(i, OwnColors.color.YELLOW) else: - self.__fairy_lights.setPixelColor(i, Color(0, 0, 0)) + self.__fairy_lights.setPixelColor(i, OwnColors.color.OFF) self.__fairy_lights.show() time.sleep(Clock.REFRESH) def _two(self): next_minute = self.__m_hand + 1 if self.__m_hand <= 22 else 0 while not self.__m_hand == next_minute: - self.__show_strip_btwn_6nd12(Clock.COLORS.red, - Clock.COLORS.blue, - Clock.COLORS.less_intense_red) + self.__show_strip_btwn_6nd12(OwnColors.color.RED, + OwnColors.color.BLUE, + OwnColors.color.less_intense_red) time.sleep(Clock.REFRESH) self.__m_hand = self.__hands[1] - wipe_second(self.__fairy_lights, Clock.COLORS.less_intense_blue, + wipe_second(self.__fairy_lights, OwnColors.color.less_intense_blue, self.__m_hand - 1) clear(self.__fairy_lights) @@ -175,35 +164,37 @@ def dial(led_wreath): led_wreath.setPixelColorRGB(_l, r // div, g // div, b // div) def hour(led, led_wreath): - led_wreath.setPixelColor(led, Clock.COLORS.red) + led_wreath.setPixelColor(led, OwnColors.color.RED) def set_minute_led_before_and_after(led_wreath, led): - led_wreath.setPixelColor(led - 1, Clock.COLORS.less_intense_blue) - led_wreath.setPixelColor(led + 1, Clock.COLORS.less_intense_blue) + led_wreath.setPixelColor(led - 1, + OwnColors.color.less_intense_blue) + led_wreath.setPixelColor(led + 1, + OwnColors.color.less_intense_blue) def minute(led, led_hour, led_wreath): if led < led_wreath.numPixels(): if led == led_hour: set_minute_led_before_and_after(led_wreath, led) else: - led_wreath.setPixelColor(led, Clock.COLORS.blue) + led_wreath.setPixelColor(led, OwnColors.color.BLUE) if led >= led_wreath.numPixels(): if led == led_hour: set_minute_led_before_and_after(led_wreath, led_hour) - led_wreath.setPixelColor(0, Clock.COLORS.blue) + led_wreath.setPixelColor(0, OwnColors.color.BLUE) else: - led_wreath.setPixelColor(0, Clock.COLORS.blue) + led_wreath.setPixelColor(0, OwnColors.color.BLUE) else: - led_wreath.setPixelColor(led, Clock.COLORS.blue) + led_wreath.setPixelColor(led, OwnColors.color.BLUE) def seconds(leds_per_2500ms, led_wreath): for led in range(0, leds_per_2500ms, 1): if 0 < (led + 1) < led_wreath.numPixels(): led_wreath.setPixelColor( - led + 1, Clock.COLORS.less_intense_green_second) + led + 1, OwnColors.color.less_intense_green) if (led + 1) == led_wreath.numPixels(): led_wreath.setPixelColor( - 0, Clock.COLORS.less_intense_green_second) + 0, OwnColors.color.less_intense_green) dial(self.__fairy_lights) seconds(self.__s_hand, self.__fairy_lights) @@ -232,22 +223,22 @@ def _five(self): global __pendulum, __p_right, __p_left for i in range(len(__pendulum)): self.__fairy_lights.setPixelColor( - __pendulum[i], Clock.COLORS.less_intense_yellow) + __pendulum[i], OwnColors.color.less_intense_yellow) if __p_left >= len(__pendulum) - 1: if __p_right <= 0: __p_right = len(__pendulum) - 1 __p_left = 0 else: self.__fairy_lights.setPixelColor( - __pendulum[__p_right], Clock.COLORS.yellow) + __pendulum[__p_right], OwnColors.color.YELLOW) __p_right -= 1 else: self.__fairy_lights.setPixelColor( - __pendulum[__p_left], Clock.COLORS.yellow) + __pendulum[__p_left], OwnColors.color.YELLOW) __p_left += 1 - self.__show_strip_btwn_6nd12(Clock.COLORS.red, - Clock.COLORS.blue, - Clock.COLORS.less_intense_red) + self.__show_strip_btwn_6nd12(OwnColors.color.RED, + OwnColors.color.BLUE, + OwnColors.color.less_intense_red) global __wait_ms time.sleep(__wait_ms) diff --git a/functions/color.py b/functions/color.py new file mode 100644 index 0000000..93e9422 --- /dev/null +++ b/functions/color.py @@ -0,0 +1,46 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +__author__ = "Thomas Kaulke" +__email__ = "kaulketh@gmail.com" +__maintainer__ = "Thomas Kaulke" +__status__ = "Production" + +from rpi_ws281x import Color + + +def _get_color(r, g, b, bir=1): + # bir => brightness/intense reducer + c = Color(r // bir, g // bir, b // bir) + return c + + +class OwnColors: + class _AttribDict(dict): + __slots__ = () + __getattr__ = dict.__getitem__ + __setattr__ = dict.__setitem__ + + color = _AttribDict({ + "BLUE": _get_color(0, 0, 200), + "GREEN": _get_color(0, 200, 0), + "OFF": _get_color(0, 0, 0), + "RED": _get_color(200, 0, 0), + "WHITE": _get_color(255, 255, 255), + "YELLOW": _get_color(92, 67, 6), + "blue": _get_color(0, 50, 135, 3), + "green": _get_color(0, 135, 50, 3), + "less_intense_blue": _get_color(0, 0, 40), + "less_intense_green": _get_color(6, 30, 10), + "less_intense_red": _get_color(50, 0, 0), + "less_intense_yellow": _get_color(92 // 4, 67 // 4, 6 // 4), + "orange": _get_color(210, 70, 0, 3), + "red": _get_color(165, 10, 10, 3), + "violet": _get_color(238, 18, 137, 3), + "white": _get_color(255, 255, 255, 6), + "yellow": _get_color(255, 165, 0, 3) + }) + + +if __name__ == "__main__": + pass diff --git a/functions/colors.py b/functions/colorant.py similarity index 68% rename from functions/colors.py rename to functions/colorant.py index 64ad29e..384adf3 100644 --- a/functions/colors.py +++ b/functions/colorant.py @@ -10,41 +10,37 @@ import time from random import uniform -from rpi_ws281x import * +from rpi_ws281x import Adafruit_NeoPixel from control.wreath import wreath_setup +from functions import OwnColors from functions.effects import clear from logger import LOGGER -class Colorizer: +class Colorant: log = LOGGER - @classmethod - def color(cls, r, g, b, bir=1): - # bir => brightness/intense reducer - return Color(r // bir, g // bir, b // bir) - def __init__(self, fairy_lights: Adafruit_NeoPixel, color_key=None): self.__fairy_lights = fairy_lights self.__colors = { - 'off': Colorizer.color(0, 0, 0), - 'on': Colorizer.color(255, 255, 255), - 'red': Colorizer.color(165, 10, 10, 3), - 'blue': Colorizer.color(0, 50, 135, 3), - 'green': Colorizer.color(0, 135, 50, 3), - 'yellow': Colorizer.color(255, 165, 0, 3), - 'orange': Colorizer.color(210, 70, 0, 3), - 'white': Colorizer.color(255, 255, 255, 6), - 'violet': Colorizer.color(238, 18, 137, 3) + 'off': OwnColors.color.OFF, + 'on': OwnColors.color.WHITE, + 'red': OwnColors.color.red, + 'blue': OwnColors.color.blue, + 'green': OwnColors.color.green, + 'yellow': OwnColors.color.yellow, + 'orange': OwnColors.color.orange, + 'white': OwnColors.color.white, + 'violet': OwnColors.color.violet } self.__color = None - Colorizer.log.debug(f"Init instance of {self.__class__.__name__}.") + Colorant.log.debug(f"Init instance of {self.__class__.__name__}.") if color_key is not None: - Colorizer.log.debug(f"Run color '{color_key}'") + Colorant.log.debug(f"Run color '{color_key}'") self.run(color_key, None) else: - Colorizer.log.debug( + Colorant.log.debug( f"Call function '{inspect.stack()[1].function}'") @property @@ -52,7 +48,7 @@ def all_colors(self): return list(self.__colors.keys()) def __function_loop(self, function): - Colorizer.log.debug(f"Running loop: {inspect.stack()[1].function}") + Colorant.log.debug(f"Running loop: {inspect.stack()[1].function}") from control import stopped while not stopped(): function() @@ -68,10 +64,10 @@ def __start(self, color, brightness=None): self.__fairy_lights.setPixelColor(i, color) self.__fairy_lights.show() except KeyboardInterrupt: - Colorizer.log.warn("KeyboardInterrupt") + Colorant.log.warn("KeyboardInterrupt") exit() except Exception as e: - Colorizer.log.error(f"An error occurs: {e}") + Colorant.log.error(f"An error occurs: {e}") exit() def run(self, key, brightness): @@ -113,43 +109,43 @@ def __strobe(): def run_red(fairy_lights): - Colorizer(fairy_lights, 'red') + Colorant(fairy_lights, 'red') def run_blue(fairy_lights): - Colorizer(fairy_lights, 'blue') + Colorant(fairy_lights, 'blue') def run_green(fairy_lights): - Colorizer(fairy_lights, 'green') + Colorant(fairy_lights, 'green') def run_yellow(fairy_lights): - Colorizer(fairy_lights, 'yellow') + Colorant(fairy_lights, 'yellow') def run_orange(fairy_lights): - Colorizer(fairy_lights, 'orange') + Colorant(fairy_lights, 'orange') def run_white(fairy_lights): - Colorizer(fairy_lights, 'white') + Colorant(fairy_lights, 'white') def run_violet(fairy_lights): - Colorizer(fairy_lights, 'violet') + Colorant(fairy_lights, 'violet') def run_stroboscope(fairy_lights): - Colorizer(fairy_lights).strobe() + Colorant(fairy_lights).strobe() def run_demo(fairy_lights): - Colorizer(fairy_lights).switch() + Colorant(fairy_lights).switch() def run_demo2(fairy_lights): - Colorizer(fairy_lights).fade() + Colorant(fairy_lights).fade() if __name__ == '__main__': diff --git a/functions/effects.py b/functions/effects.py index 07c2cf3..4845dcd 100644 --- a/functions/effects.py +++ b/functions/effects.py @@ -11,9 +11,10 @@ import inspect import time -from rpi_ws281x import * +from rpi_ws281x import Adafruit_NeoPixel, Color from control.wreath import wreath_setup +from functions.color import OwnColors from logger import LOGGER @@ -47,7 +48,7 @@ def clear(self): Set color with RGB parts = 0 (zero) """ for i in range(self.__leds.numPixels()): - self.__leds.setPixelColor(i, Color(0, 0, 0)) + self.__leds.setPixelColor(i, OwnColors.color.OFF) self.__leds.show() def wipe(self, color, length: int = None, wait_ms=50): @@ -138,7 +139,7 @@ def wipe_second(self, color: Color, pivot=0, back_again=True): for i in range(self.__leds.numPixels() + pivot - 1, pivot, -1): if i >= self.__leds.numPixels(): i -= self.__leds.numPixels() - self.__leds.setPixelColor(i, Color(0, 0, 0)) + self.__leds.setPixelColor(i, OwnColors.color.OFF) self.__leds.show() time.sleep(wait_ms) @@ -174,14 +175,14 @@ def run_rainbow_chaser(wreath): def run_theater(wreath): while True: - Effect(wreath).full_wipe(Color(127, 0, 0)) - Effect(wreath).full_wipe(Color(0, 127, 0)) - Effect(wreath).full_wipe(Color(0, 0, 127)) - Effect(wreath).full_wipe(Color(127, 127, 127)) - Effect(wreath).chaser(Color(127, 127, 127)) - Effect(wreath).chaser(Color(0, 0, 127)) - Effect(wreath).chaser(Color(0, 127, 0)) - Effect(wreath).chaser(Color(127, 0, 0)) + Effect(wreath).full_wipe(OwnColors.color.RED) + Effect(wreath).full_wipe(OwnColors.color.GREEN) + Effect(wreath).full_wipe(OwnColors.color.BLUE) + Effect(wreath).full_wipe(OwnColors.color.WHITE) + Effect(wreath).chaser(OwnColors.color.WHITE) + Effect(wreath).chaser(OwnColors.color.BLUE) + Effect(wreath).chaser(OwnColors.color.GREEN) + Effect(wreath).chaser(OwnColors.color.RED) def wipe_second(wreath, color, pivot, back_again=True): From 430996bdc40af43330063daf74357c1249c7f8ab Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 30 Dec 2023 17:33:29 +0100 Subject: [PATCH 09/10] update colorant.py --- functions/colorant.py | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/functions/colorant.py b/functions/colorant.py index 384adf3..a31c8bd 100644 --- a/functions/colorant.py +++ b/functions/colorant.py @@ -13,7 +13,7 @@ from rpi_ws281x import Adafruit_NeoPixel from control.wreath import wreath_setup -from functions import OwnColors +from functions.color import OwnColors from functions.effects import clear from logger import LOGGER @@ -23,17 +23,6 @@ class Colorant: def __init__(self, fairy_lights: Adafruit_NeoPixel, color_key=None): self.__fairy_lights = fairy_lights - self.__colors = { - 'off': OwnColors.color.OFF, - 'on': OwnColors.color.WHITE, - 'red': OwnColors.color.red, - 'blue': OwnColors.color.blue, - 'green': OwnColors.color.green, - 'yellow': OwnColors.color.yellow, - 'orange': OwnColors.color.orange, - 'white': OwnColors.color.white, - 'violet': OwnColors.color.violet - } self.__color = None Colorant.log.debug(f"Init instance of {self.__class__.__name__}.") if color_key is not None: @@ -43,10 +32,6 @@ def __init__(self, fairy_lights: Adafruit_NeoPixel, color_key=None): Colorant.log.debug( f"Call function '{inspect.stack()[1].function}'") - @property - def all_colors(self): - return list(self.__colors.keys()) - def __function_loop(self, function): Colorant.log.debug(f"Running loop: {inspect.stack()[1].function}") from control import stopped @@ -71,12 +56,12 @@ def __start(self, color, brightness=None): exit() def run(self, key, brightness): - self.__color = self.__colors.get(key) + self.__color = OwnColors.color.get(key) self.__start(self.__color, brightness) def fade(self): def __fade(): - for c in self.all_colors[2:]: + for c in OwnColors.color.keys(): for i in range( wreath_setup(self.__fairy_lights)[1]): self.run(c, brightness=i) @@ -92,7 +77,7 @@ def __fade(): def switch(self): def __switch(): - for c in self.all_colors[2:]: + for c in OwnColors.color.keys(): self.run(c, None) time.sleep(uniform(0.25, 1)) From af4f9a2195dbbe46d0b9991cedd9c23122572592 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 30 Dec 2023 17:47:01 +0100 Subject: [PATCH 10/10] update demo modes --- functions/color.py | 2 +- functions/colorant.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/color.py b/functions/color.py index 93e9422..2a61b02 100644 --- a/functions/color.py +++ b/functions/color.py @@ -22,9 +22,9 @@ class _AttribDict(dict): __setattr__ = dict.__setitem__ color = _AttribDict({ + "OFF": _get_color(0, 0, 0), "BLUE": _get_color(0, 0, 200), "GREEN": _get_color(0, 200, 0), - "OFF": _get_color(0, 0, 0), "RED": _get_color(200, 0, 0), "WHITE": _get_color(255, 255, 255), "YELLOW": _get_color(92, 67, 6), diff --git a/functions/colorant.py b/functions/colorant.py index a31c8bd..ee908c9 100644 --- a/functions/colorant.py +++ b/functions/colorant.py @@ -61,7 +61,7 @@ def run(self, key, brightness): def fade(self): def __fade(): - for c in OwnColors.color.keys(): + for c in list(OwnColors.color.keys())[1:]: for i in range( wreath_setup(self.__fairy_lights)[1]): self.run(c, brightness=i) @@ -77,7 +77,7 @@ def __fade(): def switch(self): def __switch(): - for c in OwnColors.color.keys(): + for c in list(OwnColors.color.keys())[1:]: self.run(c, None) time.sleep(uniform(0.25, 1))