--- 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
alle ~30 s] FL --- DB POLL --- DB end subgraph Schule["Schule"] BS_PC[Bambu Studio
auf Schul-PCs] DRU[4 Bambu-Drucker] BS_PC -.WLAN.-> DRU end subgraph Cloud["Bambu Cloud"] BAMBU[api.bambulab.com
+ 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] F --> H[Herb/Herr Rechmann 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 - 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]]