Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update requirements.txt #240

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ netifaces==0.11.0
monotonic==1.6
pillow==9.0.1
rpi-ws281x==4.3.0
svgwrite==1.4.3
svgwrite==1.4.3
flask==2.0.2
werkzeug==2.0.2
3 changes: 3 additions & 0 deletions wordclock_config/wordclock_config.reference.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ wiring_layout = bernds_wiring
# FreeMonoBold FreeMonoOblique FreeSansBold FreeSansOblique FreeSerifBold FreeSerifItalic
default_font = wcfont

# Enable color cycling at startup (same as pressing tight button)
cycle_color = True

# Set the brightness of the display (between 1 and 255)
brightness = 255
# Supported sensor: TSL2561
Expand Down
21 changes: 20 additions & 1 deletion wordclock_interfaces/static/js/scripts.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,12 @@ var vm = new Vue(
menu_t: false,
textToScroll: "",
textRepeat: 0,
textEnable: false
textEnable: false,
menu_b: false,
menu_e: false,
sleepbegin: "00:00",
sleepend: "00:00",
sleepbrightness: 10
},
methods: {
loadApi: function () {
Expand All @@ -49,6 +54,8 @@ var vm = new Vue(
then(this.successCallbackColorTemperature, this.errorCallback);
this.$http.get('/api/scrolltext').
then(this.successCallbackScrolltext, this.errorCallback);
this.$http.get('/api/sleeptimer').
then(this.successCallbackSleeptimer, this.errorCallback);
},
successCallbackPlugins: function(response) {
this.apiData = response.data;
Expand All @@ -74,6 +81,11 @@ var vm = new Vue(
this.date = response.data.scrolldate;
this.time = response.data.scrolltime;
this.textRepeat = response.data.scrollrepeat;
},
successCallbackSleeptimer: function(response) {
this.sleepbegin = response.data.sleep_begin;
this.sleepend = response.data.sleep_end;
this.sleepbrightness = response.data.sleep_brightness;
},
errorCallback: function(response) {
console.log('errorCallback response:' , response);
Expand Down Expand Up @@ -145,6 +157,13 @@ var vm = new Vue(
xmlhttp.open("POST", "/api/scrolltext");
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send(JSON.stringify({ scrollenable: this.textEnable, scrolltext: this.textToScroll, scrolldate: this.date, scrolltime: this.time, scrollrepeat: this.textRepeat}));
},
updateSleeptimer: function() {
console.log("updateSleeptimer", this.sleepbegin, this.sleepend, this.sleepbrightness)
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "/api/sleeptimer");
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send(JSON.stringify({ sleep_begin: this.sleepbegin, sleep_end: this.sleepend, sleep_brightness: this.sleepbrightness}));
}
},
beforeMount(){
Expand Down
86 changes: 86 additions & 0 deletions wordclock_interfaces/templates/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,92 @@
</v-expansion-panel-content>
</v-expansion-panel>
<v-divider></v-divider>
<!----------------------------------------------------------------------------------------------------------------------->
<v-expansion-panel>
<v-expansion-panel-content>
<template v-slot:header>
<div>Sleep timer</div>
</template>
<v-card-text>
<v-container fluid text-xs-center>
<v-layout row justify-center>
<v-flex xs4>
<v-dialog
ref="menutime_begin"
v-model="menu_b"
:return-value.sync="sleepbegin"
transition="scale-transition"
offset-y
max-width="290px"
min-width="290px"
>
<template v-slot:activator="{ on, attrs }">
<v-text-field
v-model="sleepbegin"
label="Start time"
v-bind="attrs"
v-on="on"
></v-text-field>
</template>
<v-time-picker
v-if="menu_b"
v-model="sleepbegin"
full-width
v-on:change="updateSleeptimer"
@click:minute="$refs.menutime_begin.save(sleepbegin)"
></v-time-picker>
</v-dialog>
</v-flex>
<v-flex xs4>
</v-flex>
<v-flex xs4>
<v-dialog
ref="menutime_end"
v-model="menu_e"
:nudge-right="40"
:return-value.sync="sleepend"
transition="scale-transition"
offset-y
max-width="290px"
min-width="290px"
>
<template v-slot:activator="{ on, attrs }">
<v-text-field
v-model="sleepend"
label="End time"
v-bind="attrs"
v-on="on"
></v-text-field>
</template>
<v-time-picker
v-if="menu_e"
v-model="sleepend"
full-width
v-on:change="updateSleeptimer"
@click:minute="$refs.menutime_end.save(sleepend)"
></v-time-picker>
</v-dialog>
</v-flex>
</v-layout>
<v-layout row px-0>
<v-flex xs4>
<v-text-field
label="Brightness"
type="number"
v-model.number="sleepbrightness"
v-on:change="updateSleeptimer"
></v-text-field>
</v-flex>
<v-flex xs4>
</v-flex>
<v-flex xs4>
</v-flex>
</v-layout>
</v-container>
</v-card-text>
</v-expansion-panel-content>
</v-expansion-panel>
<v-divider></v-divider>
<v-card-actions>
<v-container fluid text-xs-center px-0>
<v-layout row px-0>
Expand Down
42 changes: 41 additions & 1 deletion wordclock_interfaces/web_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from flask_restx import Api, Resource, fields
import wordclock_tools.wordclock_colors as wcc
import wordclock_tools.wordclock_display as wcd
import wordclock_interfaces.web_interface as wciweb
import datetime

class web_interface:
Expand Down Expand Up @@ -61,6 +62,12 @@ class web_interface:
'scrollrepeat': fields.Integer(required=True, description='Repeat of text to scroll')
})

sleeptimer_model = api.model('sleeptimer', {
'sleep_begin': fields.String(required=True, description='Sleeptimer begin'),
'sleep_end': fields.String(required=True, description='Sleeptimer end'),
'sleep_brightness': fields.Integer(required=True, description='Sleeptimer brightness')
})

def __init__(self, wordclock):
self.app.wclk = wordclock
self.app.debug = False
Expand Down Expand Up @@ -240,7 +247,7 @@ class scrolltext(Resource):
400: 'Bad request'})
def get(self):
return {
'scrollenable': wcc.scrollenable, #web_interface.app.wclk
'scrollenable': wcc.scrollenable,
'scrolltext': wcc.scrolltext,
'scrolldate': wcc.scrolldate,
'scrolltime': wcc.scrolltime,
Expand Down Expand Up @@ -272,3 +279,36 @@ def post(self):
pass
wcc.scrollenable = web_interface.api.payload.get('scrollenable')
return "Wordclock scrolltext variables updated"

@web_interface.api.route('/sleeptimer')
class sleeptimer(Resource):
@web_interface.api.doc(
description='Returns the sleep timer variables',
responses={
200: 'Success',
400: 'Bad request'})
def get(self):
return {
'sleep_begin': (str(wciweb.sleep_begin.hour).zfill(2) + ":" + str(wciweb.sleep_begin.minute).zfill(2)),
'sleep_end': (str(wciweb.sleep_end.hour).zfill(2) + ":" + str(wciweb.sleep_end.minute).zfill(2)),
'sleep_brightness': wciweb.sleep_brightness
}
@web_interface.api.doc(
description='Sleeptimer',
responses={
200: 'Success',
400: 'Bad request'})
@web_interface.api.expect(web_interface.sleeptimer_model)
def post(self):
try:
wciweb.sleep_begin = datetime.datetime.strptime(web_interface.api.payload.get('sleep_begin'), '%H:%M').time()
except:
print("Invalid begin time")
#wciweb.sleep_begin = web_interface.api.payload.get('sleep_begin')
try:
wciweb.sleep_end = datetime.datetime.strptime(web_interface.api.payload.get('sleep_end'), '%H:%M').time()
except:
print("Invalid end time")
#wciweb.sleep_end = web_interface.api.payload.get('sleep_end')
wciweb.sleep_brightness = web_interface.api.payload.get('sleep_brightness')
return "Sleeptimer variables updated"
28 changes: 21 additions & 7 deletions wordclock_plugins/time_default/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import time
import wordclock_tools.wordclock_colors as wcc
import wordclock_tools.wordclock_display as wcd
import wordclock_interfaces.web_interface as wciweb


class plugin:
Expand Down Expand Up @@ -36,9 +37,9 @@ def __init__(self, config):
self.play_animation_each_minute = config.getboolean('plugin_time_default', 'play_animation_each_minute')
self.purist = config.getboolean('plugin_time_default', 'purist')

self.sleep_begin = datetime.datetime.strptime(config.get('plugin_' + self.name, 'sleep_begin'), '%H:%M').time()
self.sleep_end = datetime.datetime.strptime(config.get('plugin_' + self.name, 'sleep_end'), '%H:%M').time()
self.sleep_brightness = config.getint('plugin_' + self.name, 'sleep_brightness')
wciweb.sleep_begin = datetime.datetime.strptime(config.get('plugin_' + self.name, 'sleep_begin'), '%H:%M').time()
wciweb.sleep_end = datetime.datetime.strptime(config.get('plugin_' + self.name, 'sleep_end'), '%H:%M').time()
wciweb.sleep_brightness = config.getint('plugin_' + self.name, 'sleep_brightness')

# Choose default fgcolor
fgcolor = ''.join(config.get('plugin_time_default', 'default_fg_color'))
Expand Down Expand Up @@ -115,6 +116,8 @@ def __init__(self, config):
self.color_mode_pos = 0
self.rb_pos = 0 # index position for "rainbow"-mode

self.color_cycling = config.getboolean('wordclock_display', 'cycle_color')

self.brightness_mode_pos = config.getint('wordclock_display', 'brightness')
self.brightness_change = 8

Expand Down Expand Up @@ -146,6 +149,8 @@ def run(self, wcd, wci):

self.brightness_mode_pos = min(((((brightnessMax - brightnessMin) / sensorMax) * sensorCurrent) + brightnessMin),255)

has_run = False

while True:
# Get current time
now = datetime.datetime.now()
Expand Down Expand Up @@ -173,11 +178,11 @@ def run(self, wcd, wci):
# Check, if a minute has passed (to render the new time)
if prev_min < now.minute:
sleepActive = \
self.sleep_begin <= now.time() < self.sleep_end or \
self.sleep_end < self.sleep_begin <= now.time() <= datetime.time(23, 59, 59) or \
now.time() < self.sleep_end < self.sleep_begin
wciweb.sleep_begin <= now.time() < wciweb.sleep_end or \
wciweb.sleep_end < wciweb.sleep_begin <= now.time() <= datetime.time(23, 59, 59) or \
now.time() < wciweb.sleep_end < wciweb.sleep_begin

wcd.setBrightness(self.sleep_brightness if sleepActive else newBrightness)
wcd.setBrightness(wciweb.sleep_brightness if sleepActive else newBrightness)

# Set background color
if self.play_animation_each_minute:
Expand All @@ -193,6 +198,10 @@ def run(self, wcd, wci):
wcd.setBrightness(newBrightness)
self.show_time(wcd, wci, animation='None')

if not(has_run) and self.color_cycling:
self.color_selection(wcd, wci)
has_run = True

event = wci.waitForEvent(2)
# Switch display color, if button_left is pressed
if event == wci.EVENT_BUTTON_LEFT:
Expand Down Expand Up @@ -242,6 +251,11 @@ def color_selection(self, wcd, wci):
wcd.setColorToAll(self.bg_color, includeMinutes=True)
wcd.setColorBy1DCoordinates(taw_indices, self.word_color)
wcd.setMinutes(now, self.minute_color)
sleepActive = \
wciweb.sleep_begin <= now.time() < wciweb.sleep_end or \
wciweb.sleep_end < wciweb.sleep_begin <= now.time() <= datetime.time(23, 59, 59) or \
now.time() < wciweb.sleep_end < wciweb.sleep_begin
wcd.setBrightness(wciweb.sleep_brightness if sleepActive else self.wake_brightness)
wcd.show()
self.rb_pos += 1
if self.rb_pos == 256: self.rb_pos = 0
Expand Down