Files
3d.lehrstun.de/docs/architektur.md
Hans Puettmann 4658d4931a 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

2.9 KiB

type, projekt, stand, tags
type projekt stand tags
konzept-modul 3d.lehrstun.de 2026-05-23
konzept
architektur

Architektur

Komponentensicht der 3D-Druck-AG-Plattform. Detail-Schema siehe datenmodell, Bambu-Anbindung siehe druckerapi, Reservierungen siehe slotsystem.

1. Komponenten

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

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

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]
    F --> H[Herb/Markus klickt 'Verschieben']
    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