Adjusted clock commands for clock backend

This commit is contained in:
Remy Moll 2022-01-02 21:19:44 +01:00
parent 621c8cf6e3
commit 3bbe3e6cc6
5 changed files with 50 additions and 70 deletions

View File

@ -11,7 +11,7 @@ Just like AIO-coolers, this little program aims to tackle many problems at once.
### Chatbot
Periodically calls the telegram api and reacts to sent commands. Also handles basic calls to the hardware: it allows you to control certain aspects of the clock.
Periodically calls the telegram api and reacts to sent commands. Also handles basic calls to the hardware: it allows you to control certain aspects of the leds (TODO: implement this correctly)
### Clock
@ -30,5 +30,3 @@ This program makes use of git submodules, namely `sql_as_rest_api`. This implies
* Enter the repo
* Type `git submodule init` which creates a `.gitmodules` file
* Type `git submodule update` which fetches the newest version of these submodules
TODO Describe dev process

View File

@ -9,10 +9,10 @@ MESSAGE, WAKE, ALARM, IMAGE, ART = range(3,8)
class Clock(BotFunc):
"""pass on commands to clock-module"""
def __init__(self, prst, clock_module, art_api):
super().__init__(prst)
def __init__(self, db_utils, clock_module, art_api):
super().__init__(db_utils)
self.clock = clock_module
self.api_art = art_api
self.art_api = art_api
def create_handler(self):
handler = ConversationHandler(
@ -100,46 +100,36 @@ class Clock(BotFunc):
def exec_wake_light(self, update: Update, context: CallbackContext) -> None:
duration = update.message.text
def output(duration):
self.clock.set_brightness(value=1)
start_color = numpy.array([153, 0, 51])
end_color = numpy.array([255, 255, 0])
col_show = numpy.zeros((*self.clock.shape, 3))
col_show[:,:,...] = start_color
matrices = []
start_color = numpy.array([153, 0, 51])
end_color = numpy.array([255, 255, 0])
col_show = numpy.zeros((*self.clock.MOP.shape, 3))
col_show[:,:,...] = start_color
gradient = end_color - start_color
# 20 steps should be fine => sleep_time = duration / 20
for i in range(20):
ct = i/20 * gradient
col_show[:,:,...] = [int(x) for x in ct+start_color]
self.clock.IO.put(col_show)
time.sleep(int(duration) / 20)
gradient = end_color - start_color
# steps are shown at a frequency of ?? frames / second =>
for i in range(duration * 2): # / 0.5
ct = i/20 * gradient
col_show[:,:,...] = [int(x) for x in ct+start_color]
matrices.append(col_show)
self.clock.run(output,(duration,))
self.clock.out.queue.append({"matrices" : matrices})
return ConversationHandler.END
def exec_alarm_blink(self, update: Update, context: CallbackContext) -> None:
duration = self.additional_argument
frequency = update.message.text
def output(duration, frequency):
self.clock.set_brightness(value=1)
duration = int(duration)
frequency = int(frequency)
n = duration * frequency / 2
empty = numpy.zeros((*self.clock.shape,3))
red = empty.copy()
red[...,0] = 255
for i in range(int(n)):
self.clock.IO.put(red)
time.sleep(1/frequency)
self.clock.IO.put(empty)
time.sleep(1/frequency)
matrices = []
duration = int(duration * 2)
empty = numpy.zeros((*self.clock.MOP.shape,3))
red = numpy.ones_like(empty) * 255
if not(duration == 0 or frequency == 0):
update.message.reply_text("Now blinking")
self.clock.run(output,(duration, frequency))
for _ in range(int(duration / 2)):
matrices.append(red)
matrices.append(empty)
self.clock.out.queue.append({"matrices": matrices})
return ConversationHandler.END
@ -166,11 +156,9 @@ class Clock(BotFunc):
t = img.resize((width, height),box=(0,0,width*scale,height*scale))
a = numpy.asarray(t)
def output(image, duration):
self.clock.IO.put(image)
time.sleep(int(duration) * 60)
matrices = [a for _ in range(2*60*duration)]
self.clock.run(output,(a, duration))
self.clock.out.queue.append({"matrices": matrices})
return ConversationHandler.END
@ -187,7 +175,7 @@ class Clock(BotFunc):
def output(number, duration):
for i in range(number):
img = self.api_art.get_random_art() # returns an PIL.Image object
img = self.art_api.get_random_art() # returns an PIL.Image object
im_height = img.height
im_width = img.width

View File

@ -16,12 +16,12 @@ class ChatBot():
-> prst:dict - persistence (overloaded dict that writes to json file)
-> logger - logging object to unify log messages
"""
# added by the launcher, we have self.modules (dict) and persistence and db
# added by the launcher, we have self.modules (dict) and persistence and db_utils
self.name = name
self.version = version
# Import submodules
# Import apis
self.api_weather = api.weather.WeatherFetch(api.keys.weather_api)
self.api_reddit = api.reddit.RedditFetch(api.keys.reddit_api)
self.api_search = api.search.WebSearch()
@ -30,37 +30,38 @@ class ChatBot():
self.telegram = Updater(api.keys.telegram_api, use_context=True)
self.dispatcher = self.telegram.dispatcher
self.commands = commands
def add_commands(self):
# Mark modules as available
db = self.db_utils
self.help_module = self.commands.help.Help(db)
# self.help_module = commands.help.Help(db)
self.sub_modules = {
"weather": self.commands.weather.Weather(self.api_weather, db),
"help" : self.help_module,
"status" : self.commands.status.Status(self.name, self.version, db),
"zvv" : self.commands.zvv.Zvv(db),
"list" : self.commands.lists.Lists(db),
"weather": commands.weather.Weather(self.api_weather, db),
"help" : commands.help.Help(db),
"status" : commands.status.Status(self.name, self.version, db),
"zvv" : commands.zvv.Zvv(db),
"list" : commands.lists.Lists(db),
# "alias" : commands.alias.Alias(self.dispatcher, db),
"joke" : self.commands.reddit.Joke(self.api_reddit, db),
"meme" : self.commands.reddit.Meme(self.api_reddit, db),
# "news" : self.commands.reddit.News(self.api_reddit, db),
"search" : self.commands.search.Search(self.api_search, db),
"joke" : commands.reddit.Joke(self.api_reddit, db),
"meme" : commands.reddit.Meme(self.api_reddit, db),
"search" : commands.search.Search(self.api_search, db),
"clock" : commands.clock.Clock(self.api_art, self.modules["clock"], db),
# ...
"plaintext" : self.commands.plaintext.Plain(db) # for handling non-command messages that should simply contribute to statistics
"plaintext" : commands.plaintext.Plain(db)
# for handling non-command messages that should simply contribute to statistics
}
# must be a class that has a method create_handler
for k in self.sub_modules:
self.dispatcher.add_handler(self.sub_modules[k].create_handler())
self.help_module.add_commands(self.sub_modules)
# self.help_module.add_commands(self.sub_modules)
self.sub_modules["help"].add_commands(self.sub_modules)
def start(self):
self.sub_modules = {"clock" : self.commands.clock.Clock(self.db_utils, self.modules["clock"], self.api_art)}
self.add_commands()
self.telegram.start_polling(
poll_interval=0.2,

View File

@ -4,9 +4,10 @@ from broadcast import b_in
import launcher
import logging
import os
import platform
if os.name == "nt":
if platform.uname().node == "ArchSpectre":
# development
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO

View File

@ -2,14 +2,12 @@
from bot import main
from clock import c_back
from broadcast import b_out
# from dashboard import d_out
import launcher
import logging
import platform
if platform.uname().node == "ArchSpectre":
# development
logging.basicConfig(
@ -28,19 +26,13 @@ class BroadcastLauncher(launcher.Launcher):
"""Launcher for all server-side modules. The hard-computations"""
def __init__(self):
self.bot_module = main.ChatBot(name="Norbit", version="4.1a") # ???
self.bot_module = main.ChatBot(name="Norbit", version="4.1a")
self.clock_backend_module = c_back.ClockBackend() # threaded through threading.Timer
self.broadcast_module = b_out.BroadcastUpdates(port="1111") # Thread
# self.dashboard_module = d_out.DashBoard(port="80") # ??? threaded as Thread
# "sensors" : self.sensors,
# "bot" : self.bot_module,
# "clock" : self.clock_module,
# "dashboard" : self.dashboard_module,
super().__init__(
bot = self.bot_module,
clock = self.clock_backend_module,
# dashboard = self.dashboard_module,
broadcast = self.broadcast_module
)