Adjusted clock commands for clock backend
This commit is contained in:
parent
621c8cf6e3
commit
3bbe3e6cc6
@ -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
|
@ -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
|
||||
|
||||
|
33
bot/main.py
33
bot/main.py
@ -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,
|
||||
|
@ -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
|
||||
|
12
server.py
12
server.py
@ -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
|
||||
)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user