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
|
### 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
|
### Clock
|
||||||
@ -30,5 +30,3 @@ This program makes use of git submodules, namely `sql_as_rest_api`. This implies
|
|||||||
* Enter the repo
|
* Enter the repo
|
||||||
* Type `git submodule init` which creates a `.gitmodules` file
|
* Type `git submodule init` which creates a `.gitmodules` file
|
||||||
* Type `git submodule update` which fetches the newest version of these submodules
|
* 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):
|
class Clock(BotFunc):
|
||||||
"""pass on commands to clock-module"""
|
"""pass on commands to clock-module"""
|
||||||
def __init__(self, prst, clock_module, art_api):
|
def __init__(self, db_utils, clock_module, art_api):
|
||||||
super().__init__(prst)
|
super().__init__(db_utils)
|
||||||
self.clock = clock_module
|
self.clock = clock_module
|
||||||
self.api_art = art_api
|
self.art_api = art_api
|
||||||
|
|
||||||
def create_handler(self):
|
def create_handler(self):
|
||||||
handler = ConversationHandler(
|
handler = ConversationHandler(
|
||||||
@ -100,46 +100,36 @@ class Clock(BotFunc):
|
|||||||
def exec_wake_light(self, update: Update, context: CallbackContext) -> None:
|
def exec_wake_light(self, update: Update, context: CallbackContext) -> None:
|
||||||
duration = update.message.text
|
duration = update.message.text
|
||||||
|
|
||||||
def output(duration):
|
matrices = []
|
||||||
self.clock.set_brightness(value=1)
|
|
||||||
start_color = numpy.array([153, 0, 51])
|
start_color = numpy.array([153, 0, 51])
|
||||||
end_color = numpy.array([255, 255, 0])
|
end_color = numpy.array([255, 255, 0])
|
||||||
col_show = numpy.zeros((*self.clock.shape, 3))
|
col_show = numpy.zeros((*self.clock.MOP.shape, 3))
|
||||||
col_show[:,:,...] = start_color
|
col_show[:,:,...] = start_color
|
||||||
|
|
||||||
gradient = end_color - start_color
|
gradient = end_color - start_color
|
||||||
# 20 steps should be fine => sleep_time = duration / 20
|
# steps are shown at a frequency of ?? frames / second =>
|
||||||
for i in range(20):
|
for i in range(duration * 2): # / 0.5
|
||||||
ct = i/20 * gradient
|
ct = i/20 * gradient
|
||||||
col_show[:,:,...] = [int(x) for x in ct+start_color]
|
col_show[:,:,...] = [int(x) for x in ct+start_color]
|
||||||
self.clock.IO.put(col_show)
|
matrices.append(col_show)
|
||||||
time.sleep(int(duration) / 20)
|
|
||||||
|
|
||||||
self.clock.run(output,(duration,))
|
self.clock.out.queue.append({"matrices" : matrices})
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
def exec_alarm_blink(self, update: Update, context: CallbackContext) -> None:
|
def exec_alarm_blink(self, update: Update, context: CallbackContext) -> None:
|
||||||
duration = self.additional_argument
|
duration = self.additional_argument
|
||||||
frequency = update.message.text
|
|
||||||
|
|
||||||
def output(duration, frequency):
|
matrices = []
|
||||||
self.clock.set_brightness(value=1)
|
duration = int(duration * 2)
|
||||||
duration = int(duration)
|
empty = numpy.zeros((*self.clock.MOP.shape,3))
|
||||||
frequency = int(frequency)
|
red = numpy.ones_like(empty) * 255
|
||||||
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)
|
|
||||||
|
|
||||||
if not(duration == 0 or frequency == 0):
|
for _ in range(int(duration / 2)):
|
||||||
update.message.reply_text("Now blinking")
|
matrices.append(red)
|
||||||
self.clock.run(output,(duration, frequency))
|
matrices.append(empty)
|
||||||
|
|
||||||
|
self.clock.out.queue.append({"matrices": matrices})
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
@ -166,11 +156,9 @@ class Clock(BotFunc):
|
|||||||
t = img.resize((width, height),box=(0,0,width*scale,height*scale))
|
t = img.resize((width, height),box=(0,0,width*scale,height*scale))
|
||||||
a = numpy.asarray(t)
|
a = numpy.asarray(t)
|
||||||
|
|
||||||
def output(image, duration):
|
matrices = [a for _ in range(2*60*duration)]
|
||||||
self.clock.IO.put(image)
|
|
||||||
time.sleep(int(duration) * 60)
|
|
||||||
|
|
||||||
self.clock.run(output,(a, duration))
|
self.clock.out.queue.append({"matrices": matrices})
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
@ -187,7 +175,7 @@ class Clock(BotFunc):
|
|||||||
|
|
||||||
def output(number, duration):
|
def output(number, duration):
|
||||||
for i in range(number):
|
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_height = img.height
|
||||||
im_width = img.width
|
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)
|
-> prst:dict - persistence (overloaded dict that writes to json file)
|
||||||
-> logger - logging object to unify log messages
|
-> 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.name = name
|
||||||
self.version = version
|
self.version = version
|
||||||
|
|
||||||
# Import submodules
|
# Import apis
|
||||||
self.api_weather = api.weather.WeatherFetch(api.keys.weather_api)
|
self.api_weather = api.weather.WeatherFetch(api.keys.weather_api)
|
||||||
self.api_reddit = api.reddit.RedditFetch(api.keys.reddit_api)
|
self.api_reddit = api.reddit.RedditFetch(api.keys.reddit_api)
|
||||||
self.api_search = api.search.WebSearch()
|
self.api_search = api.search.WebSearch()
|
||||||
@ -30,37 +30,38 @@ class ChatBot():
|
|||||||
|
|
||||||
self.telegram = Updater(api.keys.telegram_api, use_context=True)
|
self.telegram = Updater(api.keys.telegram_api, use_context=True)
|
||||||
self.dispatcher = self.telegram.dispatcher
|
self.dispatcher = self.telegram.dispatcher
|
||||||
self.commands = commands
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def add_commands(self):
|
def add_commands(self):
|
||||||
# Mark modules as available
|
# Mark modules as available
|
||||||
db = self.db_utils
|
db = self.db_utils
|
||||||
self.help_module = self.commands.help.Help(db)
|
# self.help_module = commands.help.Help(db)
|
||||||
self.sub_modules = {
|
self.sub_modules = {
|
||||||
"weather": self.commands.weather.Weather(self.api_weather, db),
|
"weather": commands.weather.Weather(self.api_weather, db),
|
||||||
"help" : self.help_module,
|
"help" : commands.help.Help(db),
|
||||||
"status" : self.commands.status.Status(self.name, self.version, db),
|
"status" : commands.status.Status(self.name, self.version, db),
|
||||||
"zvv" : self.commands.zvv.Zvv(db),
|
"zvv" : commands.zvv.Zvv(db),
|
||||||
"list" : self.commands.lists.Lists(db),
|
"list" : commands.lists.Lists(db),
|
||||||
# "alias" : commands.alias.Alias(self.dispatcher, db),
|
# "alias" : commands.alias.Alias(self.dispatcher, db),
|
||||||
"joke" : self.commands.reddit.Joke(self.api_reddit, db),
|
"joke" : commands.reddit.Joke(self.api_reddit, db),
|
||||||
"meme" : self.commands.reddit.Meme(self.api_reddit, db),
|
"meme" : commands.reddit.Meme(self.api_reddit, db),
|
||||||
# "news" : self.commands.reddit.News(self.api_reddit, db),
|
"search" : commands.search.Search(self.api_search, db),
|
||||||
"search" : self.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
|
# must be a class that has a method create_handler
|
||||||
|
|
||||||
for k in self.sub_modules:
|
for k in self.sub_modules:
|
||||||
self.dispatcher.add_handler(self.sub_modules[k].create_handler())
|
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):
|
def start(self):
|
||||||
self.sub_modules = {"clock" : self.commands.clock.Clock(self.db_utils, self.modules["clock"], self.api_art)}
|
|
||||||
self.add_commands()
|
self.add_commands()
|
||||||
self.telegram.start_polling(
|
self.telegram.start_polling(
|
||||||
poll_interval=0.2,
|
poll_interval=0.2,
|
||||||
|
@ -4,9 +4,10 @@ from broadcast import b_in
|
|||||||
import launcher
|
import launcher
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import platform
|
||||||
|
|
||||||
if os.name == "nt":
|
|
||||||
|
if platform.uname().node == "ArchSpectre":
|
||||||
# development
|
# development
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
|
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 bot import main
|
||||||
from clock import c_back
|
from clock import c_back
|
||||||
from broadcast import b_out
|
from broadcast import b_out
|
||||||
# from dashboard import d_out
|
|
||||||
|
|
||||||
import launcher
|
import launcher
|
||||||
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
|
|
||||||
if platform.uname().node == "ArchSpectre":
|
if platform.uname().node == "ArchSpectre":
|
||||||
# development
|
# development
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
@ -28,19 +26,13 @@ class BroadcastLauncher(launcher.Launcher):
|
|||||||
"""Launcher for all server-side modules. The hard-computations"""
|
"""Launcher for all server-side modules. The hard-computations"""
|
||||||
def __init__(self):
|
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.clock_backend_module = c_back.ClockBackend() # threaded through threading.Timer
|
||||||
self.broadcast_module = b_out.BroadcastUpdates(port="1111") # Thread
|
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__(
|
super().__init__(
|
||||||
bot = self.bot_module,
|
bot = self.bot_module,
|
||||||
clock = self.clock_backend_module,
|
clock = self.clock_backend_module,
|
||||||
# dashboard = self.dashboard_module,
|
|
||||||
broadcast = self.broadcast_module
|
broadcast = self.broadcast_module
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user