Dominic Gundel 4ddffbbeb1 Grotti 3.2.0: Jetzt-Liste, Filament-Pause, Strom-Torte, UI-Polish.
Jetzt/Topbar und Material-Routing, Pause bei Filament-Ende, Druckbericht mit Stromanteilen, Design- und Kamera-Stream-Polish; Bedarf-Alert-Spam und Platte-belegt-Bugs behoben.
2026-10-18 14:58:32 +02:00

Grotti

Steuert die 3D-Drucker im Haus von einer Weboberfläche aus: Live-Zustand, Dateien senden, Warteschlange, Abläufe für den Kobra 3 (drucken, abkühlen, abschieben, prüfen), Material, Projekte und ein Protokoll, was wann passiert ist.

Der Name kommt von der Mühle Grotti: sie mahlt ohne Pause, was man ihr aufträgt.

Die Drucker laufen mit Rinkhals (Kobra 3, Kobra S1). Grotti spricht sie über Moonraker an.

Aktuelle Version: siehe grotti/version.py, Änderungen in CHANGELOG.md.

Voraussetzungen

  • Python 3.11
  • PostgreSQL (eine leere Datenbank grotti reicht, das Schema legt Grotti selbst an)
  • Drucker im selben Netz mit Moonraker auf Port 80

Einrichten

cd D:\Projekte\Grotti
python -m venv .venv
.\.venv\Scripts\pip install -r requirements.txt
copy config.example.json config.json

config.json anpassen:

Schlüssel Bedeutung
host, port Wo die Oberfläche lauscht. Standard 127.0.0.1:8770.
database_url PostgreSQL-Verbindung.
data_dir Uploads, Vorschaubilder, Cache. Standard data.
watch_dir Slice-Ordner (unter Einstellungen setzen). Leer = nur Upload.
token Wenn gesetzt, braucht die API Authorization: Bearer <token>.
fqdn Öffentliche Basis-URL für Spulen-Etiketten-QR. Leer = Request-Host.
energy Watt und Strompreis für die Kosten im Protokoll.
telegram, alerts Bot und welche Ereignisse als Nachricht kommen.
auto_queue Wenn false, startet die Warteschlange nichts Neues.

Die Drucker stehen beim ersten Start in drucker.json und landen dann in der Datenbank. Danach werden sie unter Einstellungen gepflegt.

Schema-Änderungen laufen beim Start über grotti/migrations/ (Tabelle schema_version). Vor Major-Updates die Datenbank sichern (pg_dump).

[{ "name": "Kobra 3 da26", "host": "10.10.1.60" }]

Die Familie (Kobra 3 oder S1) liest Grotti aus dem Namen.

Starten

.\.venv\Scripts\python.exe server.py

Dann http://127.0.0.1:8770/ öffnen. Bedienungsanleitung mit Screenshots in der Oberfläche unter Doku (Kapitel Anleitung-*), Technik-Notizen darunter.

config.json und data/ sind lokal und nicht im Git.

Ordner

Pfad Inhalt
server.py Start, Datenbank vorbereiten, Hintergrund-Threads
grotti/ Kern: Moonraker, Warteschlange (print_queue.py), Senden (send_queue.py), Abräumen (eject.py), Zustandswächter (watcher.py), Ereignisse und Telegram (notify.py), Datenbank (store.py, schema.sql)
web/ Flask-App (app.py), Seiten (templates/), CSS und JS (static/)
docs/ Bedienungsanleitung (Anleitung-*.md) unter /doku; Technik unter docs/internal/ (nicht in der App)
web/static/doku/ Screenshots für die Anleitung
CHANGELOG.md Änderungen je Version

API

Alles unter /api/v1, JSON. Auth: Session-Cookie (UI) oder Authorization: Bearer grt_… (API-Token unter Einstellungen). Optional noch Shared-token in der Config (Migrationsbrücke).

Methode und Pfad Zweck
POST /auth/setup, /auth/login, /auth/logout Ersten Admin, Login, Logout
GET /me, /users, /tokens Konto, Benutzer (Admin), API-Tokens
GET /version Version
GET/PATCH /einstellungen, POST /telegram/test Config und Telegram-Probe
GET /drucker?live=1 Drucker mit Live-Zustand, laufendem und wartendem Auftrag
POST /drucker · PATCH/DELETE /drucker/<id> Drucker anlegen/ändern (Admin)
POST /drucker/<host>/<aktion> Pause, Fortsetzen, Abbrechen, Fehler löschen
POST /drucker/<host>/steuern Temperatur, Speed, Flow, Lüfter, ACE
POST /drucker/<host>/abraeumen Platte geräumt (confirm)
GET /kamera/<host>, /vorschau/<host> Snapshot / Job-Thumbnail
GET/POST /dateien, PATCH/DELETE /dateien/<id> Bibliothek, Upload, Metadaten
POST /dateien/neu-lesen, /dateien/ordner, /dateien/<id>/verschieben Watch-Sync, Ordner, Verschieben
POST /senden, GET /sende-auftraege Sofort senden (confirm), Fortschritt
GET/POST /druck-queue, PATCH /druck-queue/<id> Warteschlange (confirm beim Einreihen)
GET /laeuft, /aufgaben Direktstarts und Platte-belegt
POST /ablauf, /schieben-testen Ablauf Kobra 3 / Schieben-Test
GET /spulen, POST /spulen, POST /spulen/<id>/einlegen Spulen und Einlegen
GET /spulen/<id>/akte, /spulen/by-code Spulenakte, Scan S-…
GET/POST /materialien, /farben Sorten und Farbpalette
GET /laeufe, /laeufe/aktuell, /laeufe/<id> Protokoll und Druckbericht
GET /statistik, /statistik.csv Auslastung und CSV
GET/POST /projekte, /ideen Projekte und Ideen-Backlog
GET /ereignisse, POST /ereignisse/gelesen Aktivität und Alerts
POST /kalkulation Vorkalkulation Material+Strom

MCP: python -m grotti.mcp_server mit GROTTI_URL und GROTTI_TOKEN (siehe docs/internal/MCP.md).

Sicherheit

  • Login Pflicht (Setup legt den ersten Admin an). Rollen: Admin, Operator.
  • Druckstarts brauchen confirm: true. Die Oberfläche fragt per Zwei-Klick.
  • Keine freie G-code-Konsole; Firmware-Neustart über Grotti ist gesperrt.
  • Für Internet: Reverse Proxy mit TLS; nicht den Entwickler-Server öffentlich freigeben.

Versionen und Changelog

  • Versionierung nach SemVer: Patch für Fehlerbehebung, Minor für neue Funktion, Major für Bruch an API oder Datenbankschema.
  • Jede Änderung kommt in CHANGELOG.md unter [Unreleased] (Neu, Geändert, Behoben).
  • Beim Release: Version in grotti/version.py setzen, [Unreleased] in [x.y.z] – Datum umbenennen, Git-Tag vX.Y.Z.
  • Ändert sich web/static/grotti.css oder api.js, in layout.html den ?v= hochzählen.

Repo

Eigenes Repository: https://git.gundel.dev/dg/grotti. Doku zum Tool gehört nach docs/.

S
Description
No description provided
Readme
7.9 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 57.1%
HTML 30.2%
CSS 8.3%
JavaScript 4%
Shell 0.4%