From c7f1752fad09c628d951c51ddb9a51814ea332af Mon Sep 17 00:00:00 2001 From: Stefan Bethke Date: Fri, 13 Jun 2025 20:15:01 +0200 Subject: [PATCH] Add SpaceAPI info --- buba/__main__.py | 2 ++ buba/animations/spaceapi.py | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 buba/animations/spaceapi.py diff --git a/buba/__main__.py b/buba/__main__.py index 6b0f1d6..29cf283 100644 --- a/buba/__main__.py +++ b/buba/__main__.py @@ -8,6 +8,7 @@ from geventwebsocket.websocket import WebSocket from buba.animations.dbf import DBFAnimation from buba.animations.icalevents import IcalEvents from buba.animations.snake import SnakeAnimation +from buba.animations.spaceapi import Spaceapi from buba.animations.time import BubaTime from buba.appconfig import AppConfig from buba.bubaanimator import BubaAnimator @@ -34,6 +35,7 @@ animator.add(DBFAnimation, ds100="AHST", station="Holstenstraße") animator.add(DBFAnimation, ds100="AHS", station="Altona", count=9) animator.add(IcalEvents, url="https://cloud.hamburg.ccc.de/remote.php/dav/public-calendars/QJAdExziSnNJEz5g?export", title="CCCHH Events") +animator.add(Spaceapi, "https://spaceapi.hamburg.ccc.de", "CCCHH") animator.add(SnakeAnimation) @app.route("/static/") diff --git a/buba/animations/spaceapi.py b/buba/animations/spaceapi.py new file mode 100644 index 0000000..07bb0db --- /dev/null +++ b/buba/animations/spaceapi.py @@ -0,0 +1,65 @@ +import json +import logging +from datetime import datetime +from threading import Thread +from time import sleep + +import requests + +from buba.bubaanimator import BubaAnimation +from buba.bubacmd import BubaCmd + + +class Spaceapi(BubaAnimation): + def __init__(self, buba, url, title): + super().__init__(buba) + self.url = url + self.title = title + self.data = {} + self.load() + Thread(target=self.update, daemon=True).start() + + def load(self): + res = requests.get(self.url) + self.data = json.loads(res.text) + + def update(self): + while True: + self.load() + sleep(60) + + def humanize(self, dt): + td = dt - datetime.now().astimezone() + self.log.debug(f"dt {dt}, td {td}, {td.total_seconds()}") + if td.total_seconds() > -60: + return "just now" + if td.total_seconds() > -3600: + return f"for {-int(td.total_seconds()/60)} minutes" + if td.total_seconds() >- 86400: + return f"for {-int(td.total_seconds()/3600)} hours" + return dt.strftime("since %y-%m-%d %H:%M") + + def run(self): + open = "open" if self.data["state"]["open"] else "closed" + since = datetime.fromtimestamp(self.data["state"]["lastchange"]).astimezone() + temp = int(self.data["sensors"]["temperature"][0]["value"]) + hum = int(self.data["sensors"]["humidity"][0]["value"]) + printers = {} + for p in self.data["sensors"]["ext_3d_printer_busy_state"]: + printers[p["name"]] = { + "busy": p["value"] != 0, + } + for p in self.data["sensors"]["ext_3d_printer_minutes_remaining"]: + printers[p["name"]]["remaining"] = p["value"] + printstatus = [] + for n, p in printers.items(): + if p["busy"]: + printstatus.append(f"{n} remaining {p['remaining']}") + else: + printstatus.append(f"{n} idle") + + self.buba.text(page=0, row=0, col_start=0, col_end=119, text=f"CCCHH {open} {self.humanize(since)}", align=BubaCmd.ALIGN_LEFT) + self.buba.text(page=0, row=1, col_start=0, col_end=119, text=f"Outside: {temp}°C at {hum}% rel.hum.", align=BubaCmd.ALIGN_LEFT) + self.buba.text(page=0, row=2, col_start=0, col_end=119, text=", ".join(printstatus), align=BubaCmd.ALIGN_LEFT) + + sleep(10)