Slice-Watch mit Ordnern/Filtern, Orca-Nachbearbeitung, Cockpit-Verlauf mit ED, Zeitzone im Browser. Tasten-Grenze und README-API angeglichen, toter Code entfernt, Requirements gepinnt.
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
grottireicht, 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.
[{ "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.mdunter[Unreleased](Neu, Geändert, Behoben). - Beim Release: Version in
grotti/version.pysetzen,[Unreleased]in[x.y.z] – Datumumbenennen, Git-TagvX.Y.Z. - Ändert sich
web/static/grotti.cssoderapi.js, inlayout.htmlden?v=hochzählen.
Repo
Eigenes Repository: https://git.gundel.dev/dg/grotti. Doku zum Tool gehört nach docs/.