Negative temperature fixed

This commit is contained in:
Remy Moll 2020-11-29 21:52:28 +01:00
parent 1fa1d7cb67
commit eb817ac2ee
12 changed files with 283 additions and 120 deletions

@ -43,6 +43,8 @@ class ChatBot():
"joke" : self.bot_tell_joke, "joke" : self.bot_tell_joke,
"meme" : self.bot_send_meme, "meme" : self.bot_send_meme,
"news" : self.bot_send_news, "news" : self.bot_send_news,
"shopping" : self.bot_shopping_list,
} }
@ -203,7 +205,7 @@ class ChatBot():
def bot_emojify(self, *args): def bot_emojify(self, *args):
"""Converts a string to emojis""" """Converts a string to emojis"""
if len(params) < 2: if len(args) < 2:
return "Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text" return "Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text"
sep = args[0] sep = args[0]
@ -411,3 +413,41 @@ class ChatBot():
text = reddit.get_top(subreddit_name, number, "text") text = reddit.get_top(subreddit_name, number, "text")
return text return text
def bot_shopping_list(self, *args):
"""Shows a shopping list. Usage
add <aobject>
print
clear
remove <position>
"""
output = ""
# args = list(args)
if len(args) == 0:
return "Missing parameter(s)"
if args[0] == "print":
sl = self.persistence.global_action("read", "shopping_list")
for ind,thing in enumerate(sl):
output += str(ind+1) + ". " + thing + "\n"
elif args[0] == "clear":
self.persistence.global_action("write", "shopping_list", value=[])
output = "Cleared list."
elif args[0] == "add":
if len(args) == 1:
output = "Missing parameter"
add = " ".join(args[1:])
self.persistence.global_action("append_list", "shopping_list", value=add)
output = "Added " + add + "."
elif args[0] == "remove":
output = "Removed test."
return output
def bot_save_alias(self, *args):
"""Save a shortcut for special commands (+params)
usage: /alias sa shopping add
Means: /sa will now be treated as input /shopping add"""
return "Does this look finished to you?"

@ -18,30 +18,50 @@ def text_converter(text, height):
digits = { digits = {
1 : [[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]], "1" : [[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],
2 : [[1,1,1],[0,0,1],[1,1,1],[1,0,0],[1,1,1]], "2" : [[1,1,1],[0,0,1],[1,1,1],[1,0,0],[1,1,1]],
3 : [[1,1,1],[0,0,1],[1,1,1],[0,0,1],[1,1,1]], "3" : [[1,1,1],[0,0,1],[1,1,1],[0,0,1],[1,1,1]],
4 : [[1,0,1],[1,0,1],[1,1,1],[0,0,1],[0,0,1]], "4" : [[1,0,1],[1,0,1],[1,1,1],[0,0,1],[0,0,1]],
5 : [[1,1,1],[1,0,0],[1,1,1],[0,0,1],[1,1,1]], "5" : [[1,1,1],[1,0,0],[1,1,1],[0,0,1],[1,1,1]],
6 : [[1,1,1],[1,0,0],[1,1,1],[1,0,1],[1,1,1]], "6" : [[1,1,1],[1,0,0],[1,1,1],[1,0,1],[1,1,1]],
7 : [[1,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]], "7" : [[1,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],
8 : [[1,1,1],[1,0,1],[1,1,1],[1,0,1],[1,1,1]], "8" : [[1,1,1],[1,0,1],[1,1,1],[1,0,1],[1,1,1]],
9 : [[1,1,1],[1,0,1],[1,1,1],[0,0,1],[1,1,1]], "9" : [[1,1,1],[1,0,1],[1,1,1],[0,0,1],[1,1,1]],
0 : [[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]] "0" : [[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]],
"-" : [[0,0,0],[0,0,0],[1,1,1],[0,0,0],[0,0,0]],
"-1" : [[0,0,1],[0,0,1],[1,1,1],[0,0,1],[0,0,1]],
} }
##place of numbers, invariable ##place of numbers, invariant
digit_position = [[2,4], [2,10], [9,4], [9,10]] digit_position = [[2,4], [2,10], [9,4], [9,10]]
def time_converter(time=""): def time_converter(top="", bottom=""):
"""Converts 4-digit time to a pixel-matrix """Converts 4-digit time to a pixel-matrix
returns: np.array((16, 16))""" returns: np.array((16, 16))"""
if time == "":
time = datetime.datetime.now().strftime("%H%M")
pixels = np.zeros((16,16),dtype=np.uint8)
time = "0" * (4 - len(str(time))) + str(time)
time_split = [int(i) for i in time]
pixels = np.zeros((16,16),dtype=np.uint8)
if bottom == "" or top == "":
top = datetime.datetime.now().strftime("%H")
bottom = datetime.datetime.now().strftime("%M")
if len(top) < 2:
top = "0" * (2 - len(top)) + top
if len(bottom) < 2:
bottom = "0" * (2 - len(bottom)) + bottom
if ("-" in top and len(top) > 2) or ("-" in bottom and len(bottom) > 2):
time_split = 4*["-"]
else:
time_split = [i for i in top] + [i for i in bottom]
if "-1" in top and len(top) != 2:
time_split = ["-1", top[-1]] + [i for i in bottom]
if "-1" in bottom and len(bottom) != 2:
time_split = [i for i in top] + ["-1", bottom[-1]]
print(time_split)
for i in range(4): for i in range(4):
x = digit_position[i][0] x = digit_position[i][0]
y = digit_position[i][1] y = digit_position[i][1]

@ -92,7 +92,7 @@ class OutputHandler():
if weather["show"] == "weather": if weather["show"] == "weather":
face2_3d = converter.weather_converter(weather["weather"]) face2_3d = converter.weather_converter(weather["weather"])
else: else:
face2 = converter.time_converter(int(weather["low"]+weather["high"])) face2 = converter.time_converter(top=weather["low"], bottom=weather["high"])
face2 = np.concatenate((face2[:8,...],2*face2[8:,...])) face2 = np.concatenate((face2[:8,...],2*face2[8:,...]))
face2_3d = self.matrix_add_depth(face2,[[0, 102, 255],[255, 102, 0]]) face2_3d = self.matrix_add_depth(face2,[[0, 102, 255],[255, 102, 0]])

@ -1,36 +1,33 @@
import time import wrapper
import datetime import datetime
from threading import Thread
class ModuleWrapper(): class ClockWrapper(wrapper.Wrapper):
"""Wrapper for the CLOCK-functionality""" """Wrapper for the CLOCK-functionality"""
def __init__(self, bot_module, clock_module): def __init__(self, own_module, *other_modules):
"""""" """"""
super().__init__(own_module, *other_modules)
print("Initializing clock-functionality") print("Initializing clock-functionality")
self.clock = clock_module
self.bot = bot_module
self.time_thread = Thread(target=self.mainloop)
self.time_thread.start()
self.weather = {"weather":"", "high":"", "low":"", "show":"temps"} self.weather = {"weather":"", "high":"", "low":"", "show":"temps"}
self.mainloop(15)
def mainloop(self): def mainloop(self, sleep_delta):
"""Runs the showing of the clock-face periodically (better way?)""" """Runs the showing of the clock-face periodically (better way?)"""
print("Starting clock mainloop") print("Starting clock mainloop")
prev_time = 0 self.prev_time = 0
prev_weather_time = datetime.datetime.fromtimestamp(0) self.prev_weather_time = datetime.datetime.fromtimestamp(0)
while True:
if prev_time == datetime.datetime.now().strftime("%H:%M"): def perform_loop():
time.sleep(15) if self.prev_time != datetime.datetime.now().strftime("%H:%M"):
else: d = datetime.datetime.now() - self.prev_weather_time
d = datetime.datetime.now() - prev_weather_time
mins_elapsed = int(d.total_seconds()/60) mins_elapsed = int(d.total_seconds()/60)
if mins_elapsed >= 3*60: if mins_elapsed >= 3*60:
# fetch new weather every 3 hours (hard coded) # fetch new weather every 3 hours (hard coded)
prev_weather_time = datetime.datetime.now() prev_weather_time = datetime.datetime.now()
weather = self.bot.bot_show_weather("zurich") weather = self.others[0].bot_show_weather("zurich")
l1 = weather[weather.find("</b>")+5:weather.find("\n")].replace (":","") l1 = weather[weather.find("</b>")+5:weather.find("\n")].replace (":","")
# current weather situation (icon): we pick the first line, remove the start string, remove :: indicating an emoji # current weather situation (icon): we pick the first line, remove the start string, remove :: indicating an emoji
@ -52,4 +49,6 @@ class ModuleWrapper():
prev_time = datetime.datetime.now().strftime("%H:%M") prev_time = datetime.datetime.now().strftime("%H:%M")
self.clock.set_face(self.weather) self.own.set_face(self.weather)
super().mainloop(sleep_delta,perform_loop)

@ -2,84 +2,125 @@ import dash
import dash_bootstrap_components as dbc import dash_bootstrap_components as dbc
import dash_html_components as html import dash_html_components as html
import dash_core_components as dcc import dash_core_components as dcc
import locale
locale.setlocale(locale.LC_TIME, "de_DE")
#from dash.dependencies import Input, Output #from dash.dependencies import Input, Output
import datetime import datetime
ex_css = [dbc.themes.BOOTSTRAP, "static/test.css"]
app = dash.Dash(__name__, external_stylesheets=ex_css)
card_main = dbc.Card(
[ class DashBoard():
#dbc.CardImg(src="/assets/ball_of_sun.jpg", top=True, bottom=False, """"""
# title="Image by Kevin Dinkel", alt='Learn Dash Bootstrap Card Component'), def __init__(self, host_ip):
dbc.CardBody( ## pre-sets
self.today = datetime.date.today().strftime("%A, der %d. %B %Y")
self.inter_margin = "1em"
ex_css = [dbc.themes.BOOTSTRAP]
self.app = dash.Dash(__name__, external_stylesheets=ex_css)
self.set_layout()
self.app.run_server(host=host_ip)
def set_layout(self):
card_placeholder = dbc.Card(
[ [
html.H4("Learn Dash with Charming Data", className="card-title"), #dbc.CardImg(src="/assets/ball_of_sun.jpg", top=True, bottom=False,
html.H6("Lesson 1:", className="card-subtitle"), # title="Image by Kevin Dinkel", alt='Learn Dash Bootstrap Card Component'),
html.P( dbc.CardBody(
"Choose the year you would like to see on the bubble chart.", [
className="card-text", html.H4("Learn Dash with Charming Data", className="card-title"),
html.H6("Lesson 1:", className="card-subtitle"),
html.P(
"Choose the year you would like to see on the bubble chart. Test this is a very long text that should hopefully have a line break.",
className="card-text",
),
html.P(
"Choose the year you would like to see on the bubble chart.",
className="card-text",
),
html.P(
"Choose the year you would like to see on the bubble chart.",
className="card-text",
),
html.P(
"Choose the year you would like to see on the bubble chart.",
className="card-text",
),
dbc.Button("Still not live I guess?", color="primary"),
dbc.CardLink("GirlsWhoCode", href="https://girlswhocode.com/", target="_blank"),
]
), ),
],
color="dark", # https://bootswatch.com/default/ for more card colors
inverse=True, # change color of text (black or white)
outline=False, # True = remove the block colors from the background and header
)
dbc.Button("Still not live I guess?", color="primary"), card_weather = dbc.Card(
# dbc.CardLink("GirlsWhoCode", href="https://girlswhocode.com/", target="_blank"),
]
),
],
color="dark", # https://bootswatch.com/default/ for more card colors
inverse=True, # change color of text (black or white)
outline=False, # True = remove the block colors from the background and header
)
card_question = dbc.Card( )
[
dbc.CardBody([ card_bot_stats = dbc.Card(
html.H4("Question 1", className="card-title"),
html.P("What was India's life expectancy in 1952?", className="card-text"), )
dbc.ListGroup(
[
dbc.ListGroupItem("A. 55 years"),
dbc.ListGroupItem("B. 37 years"),
dbc.ListGroupItem("C. 49 years"),
], flush=True)
]),
], color="warning",
)
today = datetime.date.today().strftime("%d.%m.%Y") card_header = dbc.Card(
tag = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"][datetime.datetime.today().weekday()] [ dbc.CardImg(src="static/header.jpg", top=True, bottom=False,
title="Header", alt='Header image'),
dbc.CardBody([html.H4(self.today, className="card-title")]),
],
color="dark",
style = {"width" : "100%", "margin-bottom":self.inter_margin},
inverse=True,
)
string_header = tag + ", der " + today card_shopping_list = dbc.Card(
[
dbc.CardBody([
html.H4("Shopping list:", className="card-title"),
# html.P("What was India's life expectancy in 1952?", className="card-text"),
dbc.ListGroup(
[
dbc.ListGroupItem("test"),
dbc.ListGroupItem("B. 37 years"),
dbc.ListGroupItem("C. 49 years"),
], flush=False)
]),
],
color="dark",
style = {"width" : "100%", "margin-bottom":self.inter_margin},
inverse=True,
)
app.layout = html.Div([ self.app.layout = html.Div([
html.Header(children = [ html.Div(
html.H1(string_header) className = "content",
],), style={"padding":self.inter_margin},
html.Div( children = [
className = "content", # dbc.Row([dbc.Col(card_main, width=3),
style = {"padding-top" : "32em"}, # dbc.Col(card_question, width=3)], justify="around"), # justify="start", "center", "end", "between", "around"
children = [ card_header,
# dbc.Row([dbc.Col(card_main, width=3), dbc.CardColumns([
# dbc.Col(card_question, width=3)], justify="around"), # justify="start", "center", "end", "between", "around" card_shopping_list,
card_placeholder,
# dbc.CardGroup([card_main, card_question, card_graph]) # attaches cards with equal width and height columns card_placeholder,
# dbc.CardDeck([card_main, card_question, card_graph]) # same as CardGroup but with gutter in between cards card_placeholder,
card_placeholder,
dbc.CardColumns([ # Cards organised into Masonry-like columns card_placeholder,
card_main, ]),
card_question,card_question,card_question,card_question,
# card_graph, ])
# card_question, ])
# card_question,
])
])
])
if __name__ == "__main__": if __name__ == "__main__":
app.run_server(host="0.0.0.0") test = DashBoard(host_ip="0.0.0.0")
5

BIN
dashboard/static/header.jpg Normal file

Binary file not shown.

After

(image error) Size: 809 KiB

@ -25,7 +25,7 @@ header::before {
h1 { h1 {
font-size: calc(2.8em + 2.6vw); font-size: calc(2.8em + 2.6vw);
font-weight: 650; font-weight: 500;
letter-spacing: .01em; letter-spacing: .01em;
padding: 6rem 0 0 4.5rem; padding: 6rem 0 0 4.5rem;
text-shadow: .022em .022em .022em #111; text-shadow: .022em .022em .022em #111;

@ -1 +1,24 @@
### mmmh I'm not that far import wrapper
from threading import Thread
import time
class DashBoardWrapper(wrapper.Wrapper):
def __init__(self, own_module, *other_modules):
""""""
super().__init__(own_module, other_modules)
print("Initializing DASHBOARD-functionality")
# mainloop
def mainloop(self):
super(DashBoardWrapper, self).mainloop(sleep_delta = 3600*3) #3hours refresh-cycle
self.set_weather()
self.set_shopping_list()
self.set_bot_logs()
self.set_joke()
self.bot.refresh()
def set_weather(self):
weather = self.bot.bot_show_weather("zurich")
...
self.own.set_weather(weather)

@ -1,9 +1,12 @@
# functionality # functionality
import bot.main import bot.main
import clock.main import clock.main
import dashboard.main
# wrapper # wrapper
import clock_wrapper import clock_wrapper
import bot_wrapper import bot_wrapper
import dashboard_wrapper
# misc. # misc.
from threading import Thread from threading import Thread
@ -28,7 +31,7 @@ class Launcher():
def clock(self): def clock(self):
print("Launching clock-functionality") print("Launching clock-functionality")
self.clock = clock_wrapper.ModuleWrapper(self.bot_module, self.clock_module) self.clock = clock_wrapper.ClockWrapper(self.clock_module, self.bot_module)
def chatbot(self): def chatbot(self):
@ -36,6 +39,10 @@ class Launcher():
self.bot = bot_wrapper.ModuleWrapper(self.bot_module, self.clock_module) self.bot = bot_wrapper.ModuleWrapper(self.bot_module, self.clock_module)
def dashboard(self):
print("Launching dashboard-functionality")
self.dashboard = dashboard_wrapper.DashBoardWrapper(self.dashboard_module, self.bot_module)
######################################################################## ########################################################################
## Aand liftoff! ## Aand liftoff!
Launcher() Launcher()

@ -11,5 +11,11 @@
"clock" : { "clock" : {
"test":"" "test":""
},
"dashboard" : {
"test":""
},
"global" : {
"shopping_list" : []
} }
} }

@ -1,19 +1,37 @@
import json import json
import time import time
import os import os
import shutil
class Variables(): class Variables():
"""""" """"""
def __init__(self, module_name, file_name="persistence/persistent_vars.json", init_name="persistence/persistent_init.json", ): def __init__(self, module_name, file_name="persistence/persistent_vars.json", init_name="persistence/persistent_init.json", ):
self.path = file_name self.path = file_name
self.init_path = init_name self.init_path = init_name
self.last_action = ""
self.module = module_name self.module = module_name
self.last_action = ""
# last performed action, if only reads are made, then the underlying var has not been changed # last performed action, if only reads are made, then the underlying var has not been changed
# and doesn't need to be read again # and doesn't need to be read again
self.savefile = {} self.savefile = {}
if not os.path.exists(self.path):
shutil.copy(self.init_path, self.path)
def global_action(self, action, name, value=""):
old = self.module
self.module = "global"
action = getattr(self, action)
if value != "":
ret = action(name,value)
else:
ret = action(name)
self.module = old
return ret
def write(self, name, value): def write(self, name, value):
pre = self.read("") pre = self.read("")
pre[self.module][name] = value pre[self.module][name] = value
@ -28,23 +46,13 @@ class Variables():
def read(self, name): def read(self, name):
if self.last_action == "read": if self.last_action == "read":
if name == "": vars = self.savefile
return self.savefile else:
else: file = open(self.path,"r")
return self.savefile[self.module][name]
try:
if os.path.exists(self.path):
file_path = self.path
else:
file_path = self.init_path
file = open(file_path,"r")
vars = json.load(file) vars = json.load(file)
file.close() file.close()
self.savefile = vars self.savefile = vars
self.last_action = "read" self.last_action = "read"
except:
return None
if name != "": if name != "":
vars = vars[self.module][name] vars = vars[self.module][name]
@ -53,9 +61,11 @@ class Variables():
def increment(self, name, inc=1): def increment(self, name, inc=1):
pre = self.read(name) pre = self.read(name)
plus1 = pre + inc if pre:
self.write(name, plus1) self.write(name, pre + inc)
else:
self.write(name, inc)
def append_list(self, name, value): def append_list(self, name, value):
pre = self.read(name) pre = self.read(name)

17
wrapper.py Normal file

@ -0,0 +1,17 @@
import time
class Wrapper():
"""Wrapper skeleton for the modules (bot, clock dashboard...)"""
def __init__(self, own_module, *other_modules):
self.own = own_module
self.others = other_modules
def mainloop(self, sleep_delta, action):
"""sleep_delta in seconds sets the sleep period of the loop
action is a function that is performed every * seconds"""
while True:
action()
time.sleep(sleep_delta)