- HTML 76.2%
- Python 15.7%
- JavaScript 8.1%
| viewer | ||
| web | ||
| .gitignore | ||
| COPYRIGHT | ||
| json_to_image.py | ||
| LICENSE | ||
| README.md | ||
| serve.js | ||
| subjects.yaml | ||
Stundenplan
Web-App für einen Schul-Stundenplan auf dem Telefon: Woche und Tag mit Ausfall, Vertretung und
Terminen, dazu eine Packliste. Sie liest eine einzige Datei, timetable.json.
Dies ist das Gerüst ohne Datenquelle. Wer die App nutzen will, braucht einen eigenen Abruf für die
eigene Schule – sofern die ihre Daten digital anbietet –, der timetable.json im Format unten schreibt.
Gebaut ist die App an den Daten von Schulmanager Online, das
die Schule hier verwendet; dessen Abruf ist nicht enthalten.
Nebenbei rechnet json_to_image.py aus derselben Datei ein Bild für ein E-Ink-Schild, das
OpenEPaperLink ausspielt. Für die App ist es
nicht nötig.
Teile
web/index.html, web/day.html Web-App: Woche und Tag, mit Ausfall, Vertretung, Terminen
web/packliste.json was an welchem Fach eingepackt werden muss (Beispiel)
json_to_image.py Bild fürs E-Ink-Schild (Pillow, DejaVu Sans), optional
viewer/index.html, serve.js lokale Vorschau mit Formular für nachgetragene Arbeiten
subjects.yaml Fachkürzel → Name (Beispiel)
Die Web-App braucht keinen Server außer einem, der die Dateien ausliefert; timetable.json und
packliste.json liegen daneben.
python3 json_to_image.py --data timetable.json --output timetable.jpg
node serve.js --port 8099 --data timetable.json
Ab 16 Uhr zeigt das Bild den Plan für den nächsten Tag. serve.js schreibt nur eine Datei,
exam_overrides.json – Klassenarbeiten, die nicht in der Quelle stehen. Sein Knopf zum Neuladen
ruft einen Abruf auf, der hier nicht enthalten ist.
Datenmodell von timetable.json
| Block | Inhalt |
|---|---|
currentWeek, nextWeek |
Stunden. Neben subject/teacher/room auch subjectLong/teacherLong (ausgeschrieben), cancelled, changed, original (was eigentlich dran wäre), event (Termin auf dieser Stunde) und pause (beaufsichtigte Pause, kein Unterricht). |
classHours |
Stundenzeiten. Pausen ergeben sich aus den Lücken. |
days |
Pro Tag: status (unterricht/sondertag/ferien/frei), label, firstPeriod, lastPeriod, cancelledLeading, cancelledTrailing, events. |
exams |
Klassenarbeiten und Klassentermine. icon nur bei echten Arbeiten. |
upcoming |
Die nächsten Besonderheiten, anzeigefertig sortiert. |
holidays |
Ferienspannen. |
events |
Schulkalender mit Einstufung: student, school, other-grade, staff. |
glossary |
Kürzel → Name. |
warnings |
Auffälligkeiten beim Erzeugen. |
Zeilen mit pause: true zählen nicht als Unterricht: der Tag endet nach der letzten echten Stunde.
Das E-Ink-Bild lässt sie weg, die App zeigt sie an.
Nachgetragene Arbeiten
{ "exams": [
{ "subject": "M", "date": "05.11.2026", "periods": ["3","4"],
"comment": "Bruchrechnung" }
] }
Ein Eintrag kommt dazu; ersetzt wird nur mit "replaces": "<Datum>" oder bei gleichem Fach und Datum.
Datenschutz
Ein Stundenplan sagt, wo ein Kind wann ist. Die Web-App gehört hinter eine Anmeldung, und was sie lädt, sollte so knapp wie möglich sein: Vorname statt vollem Namen, keine Klasse, nur die Termine, die das Kind betreffen.