Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)
Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).
Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md
Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)
Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
2026-05-24 18:56:59 +02:00
|
|
|
---
|
|
|
|
|
type: konzept-modul
|
|
|
|
|
projekt: 3d.lehrstun.de
|
|
|
|
|
stand: 2026-05-23
|
|
|
|
|
tags: [konzept, architektur]
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# Architektur
|
|
|
|
|
|
|
|
|
|
> Komponentensicht der 3D-Druck-AG-Plattform. Detail-Schema siehe [[datenmodell]],
|
|
|
|
|
> Bambu-Anbindung siehe [[druckerapi]], Reservierungen siehe [[slotsystem]].
|
|
|
|
|
|
|
|
|
|
## 1. Komponenten
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
flowchart LR
|
|
|
|
|
subgraph Browser["Browser"]
|
|
|
|
|
SUS[SuS-Cockpit]
|
|
|
|
|
LEHRER[Lehrer-Dashboard]
|
|
|
|
|
OEFF[Öffentliche Seiten]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph Server["Hetzner: 3d.lehrstun.de:5057"]
|
|
|
|
|
FL[Flask-App]
|
|
|
|
|
DB[(SQLite)]
|
|
|
|
|
POLL[Drucker-Poll-Worker<br/>alle ~30 s]
|
|
|
|
|
FL --- DB
|
|
|
|
|
POLL --- DB
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph Schule["Schule"]
|
|
|
|
|
BS_PC[Bambu Studio<br/>auf Schul-PCs]
|
|
|
|
|
DRU[4 Bambu-Drucker]
|
|
|
|
|
BS_PC -.WLAN.-> DRU
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph Cloud["Bambu Cloud"]
|
|
|
|
|
BAMBU[api.bambulab.com<br/>+ MQTT]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Browser -->|HTTPS| FL
|
|
|
|
|
POLL -->|HTTPS| BAMBU
|
|
|
|
|
DRU -->|MQTT| BAMBU
|
|
|
|
|
BS_PC -->|HTTPS| BAMBU
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 2. Datenfluss bei einem Druckauftrag
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
actor SuS
|
|
|
|
|
participant Site as 3d.lehrstun.de
|
|
|
|
|
participant DB as SQLite
|
|
|
|
|
participant Studio as Bambu Studio
|
|
|
|
|
participant Drucker
|
|
|
|
|
participant Cloud as Bambu Cloud
|
|
|
|
|
|
|
|
|
|
SuS->>Site: Druckauftrag eintragen (Titel, Dauer, Material)
|
|
|
|
|
Site->>DB: druckauftrag (status=geplant)
|
|
|
|
|
SuS->>Site: Slot reservieren (Drucker X, 14:00-16:00)
|
|
|
|
|
Site->>DB: slot (status=reserviert)
|
|
|
|
|
|
|
|
|
|
Note over SuS,Studio: SuS slict ausserhalb der Site
|
|
|
|
|
|
|
|
|
|
SuS->>Studio: Modell slicen
|
|
|
|
|
Studio->>Cloud: Job hochladen
|
|
|
|
|
Cloud->>Drucker: Job starten
|
|
|
|
|
Drucker->>Cloud: Status (printing, ETA, ...)
|
|
|
|
|
|
|
|
|
|
loop alle 30 s
|
|
|
|
|
Site->>Cloud: GET Status aller Drucker
|
|
|
|
|
Cloud-->>Site: JSON
|
|
|
|
|
Site->>DB: drucker_status aktualisieren
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SuS->>Site: Cockpit aufrufen
|
|
|
|
|
Site-->>SuS: "Dein Job auf Drucker X läuft, noch 1h 20m"
|
|
|
|
|
|
|
|
|
|
Drucker->>Cloud: Status (finished)
|
|
|
|
|
Site->>Cloud: GET (im nächsten Poll)
|
|
|
|
|
Site->>DB: druckauftrag.status = fertig
|
|
|
|
|
SuS->>Site: "Abgeholt" klicken
|
|
|
|
|
Site->>DB: druckauftrag.status = abgeholt
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3. Fehlerfälle
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
flowchart TB
|
|
|
|
|
A[Drucker meldet 'failed' an Cloud] --> B{Poll erkennt es}
|
|
|
|
|
B --> C[drucker_status.status = failed]
|
|
|
|
|
C --> D[Dashboard zeigt rote Markierung]
|
|
|
|
|
D --> E{Aktive Slots betroffen?}
|
|
|
|
|
E -- ja --> F[Vorschlag: Slot auf anderen Drucker verschieben]
|
|
|
|
|
E -- nein --> G[Nur Drucker als 'Wartung nötig' markieren]
|
2026-05-24 19:51:19 +02:00
|
|
|
F --> H[Herb/Herr Rechmann klickt 'Verschieben']
|
Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)
Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).
Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md
Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)
Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
2026-05-24 18:56:59 +02:00
|
|
|
H --> I[Slot.drucker_id neu, Notiz im SuS-Cockpit]
|
|
|
|
|
|
|
|
|
|
J[Cloud-API antwortet nicht] --> K{Letzter Poll-Erfolg > 5 Min her?}
|
|
|
|
|
K -- ja --> L[UI: 'Status veraltet']
|
|
|
|
|
L --> M[Admin: Button 'Manueller Status']
|
|
|
|
|
K -- nein --> N[Normal weiter]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 4. Querverweise
|
|
|
|
|
|
|
|
|
|
- Detail-Tabellen: [[datenmodell]]
|
|
|
|
|
- Welche Routes welche Komponenten füttern: [[routen]]
|
|
|
|
|
- Wie das Polling konkret läuft: [[druckerapi]]
|
|
|
|
|
- Wie Slots verteilt werden: [[slotsystem]]
|
|
|
|
|
- Welche Etappe was baut: [[etappen]]
|