rssmatrix/code.py

208 lines
4.8 KiB
Python

from adafruit_display_text.label import Label
import time
import gc
import board
import displayio
import random
import math
from adafruit_bitmap_font import bitmap_font
from adafruit_matrixportal.network import Network
from adafruit_matrixportal.matrix import Matrix
import adafruit_requests as requests
# statics
SPEED = 24 # should be even
COLORS = [
0x50FA7B,
0xFFB86C,
0xF1FA8C,
0xFF5555,
0xFF79C6,
0x8BE9FD,
]
FONT = bitmap_font.load_font("/Bm437_Paradise132_7x9-12.bdf")
TEXTWIDTH = 7
tick = 0
def random_color():
return random.choice(COLORS)
# Get wifi details and more from a secrets.py file
try:
from secrets import secrets
except ImportError:
print("WiFi secrets are kept in secrets.py, please add them there!")
raise
network = Network(
debug=False,
status_neopixel=board.NEOPIXEL,
)
matrix = Matrix()
display = matrix.display
upper_text_content = " =^_^="
upper_text = Label(
FONT,
text=upper_text_content,
color=random_color(),
)
upper_text.y = 2
decoration = Label(FONT, text="»»»»»»»»»»»»", color=random_color())
decoration.y = 10
middle_text_content = "jacking"
middle_text = Label(
FONT,
text=middle_text_content,
color=random_color(),
)
middle_text.y = 16
lower_text_content = " in..."
lower_text = Label(
FONT,
text=lower_text_content,
color=random_color(),
)
lower_text.y = 25
maingroup = displayio.Group()
g = displayio.Group()
g.append(upper_text)
maingroup.append(decoration)
g.append(middle_text)
g.append(lower_text)
maingroup.append(g)
display.brightness = 0.01
display.auto_refresh = False
display.show(maingroup)
daynames = {
0: "monday",
1: "tuesday",
2: "wednesday",
3: "thursday",
4: "friday",
5: "saturday",
6: "sunday",
}
def sliceForTextField(s, i, max_chars=10) -> str:
i = math.trunc(i)
if len(s) < max_chars:
return s
return str(s[i % len(s) :] + s[: i % len(s)])[:max_chars]
def update_content():
global middle_text_content, upper_text_content, tick
tick = 0
try:
# set time from network
network.get_local_time()
except RuntimeError as e:
print("failed loading time")
try:
# get unread rss feeds
print("loading rss feeds")
headers = {"X-Auth-Token": secrets["miniflux_token"]}
rssresponse = requests.get(
secrets["miniflux_url"] + "/entries?status=unread&direction=desc",
headers=headers,
)
entries = rssresponse.json()["entries"]
rssresponse.close()
upper_text_content = str(len(entries)) + " unread entries "
for e in entries:
gc.collect()
upper_text_content += "|" + e["feed"]["title"]
upper_text_content += "-" + e["title"] + "| "
gc.collect()
except RuntimeError as e:
print("failed loading unread")
gc.collect()
try:
weatherresponse = requests.get(
"https://wttr.in/?format='%l:+%C+precipitation+%p+%t+%w+humidity+%h+dawn:+%D+dusk:+%d+uv:+%u'"
)
middle_text_content = (
weatherresponse.text.replace("\n", " ").replace("'", "") + " "
)
weatherresponse.close()
except RuntimeError as e:
print("failed getting weather")
def update_time():
global lower_text_content
now = time.localtime()
lower_text_content = (
"{dayname} {day}.{month:02d}.{year} {hours:02d}:{minutes:02d}:{seconds:02d}".format(
hours= now[3],
minutes=now[4],
seconds=now[5],
dayname=daynames[now[6]],
day=now[2],
month=now[1],
year=now[0],
)
+ " "
)
def update(tick):
global display
if tick % (10 * SPEED) == 0:
upper_text.color = random_color()
middle_text.color = random_color()
lower_text.color = random_color()
decoration.color = random_color()
# do this once about every half hour
if tick % (1800 * SPEED) == 0:
update_content()
# do this every new letter
offset = 0 - tick % TEXTWIDTH
if offset == 0:
texttick = tick / TEXTWIDTH
update_time()
lower_text.text = sliceForTextField(
lower_text_content,
texttick,
)
middle_text.text = sliceForTextField(
middle_text_content,
texttick,
)
upper_text.text = sliceForTextField(
upper_text_content,
texttick,
)
g.x = offset
decoration.x = -1 * offset - TEXTWIDTH * 2
display.refresh(
minimum_frames_per_second=0,
target_frames_per_second=SPEED,
)
display.refresh(
minimum_frames_per_second=0,
target_frames_per_second=SPEED,
)
network.connect()
while True:
update(tick)
tick += 1