4.9 KiB
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, der beobachtet wird. 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 /drucker?live=1 |
Drucker mit Live-Zustand, laufendem und wartendem Auftrag |
POST /drucker/<host>/<aktion> |
Pause, Fortsetzen, Abbrechen, Fehler löschen |
POST /drucker/<host>/steuern |
Temperatur, Speed, Flow, Lüfter |
GET /dateien, POST /dateien |
Bibliothek, Upload |
POST /senden |
Datei an Drucker. confirm: true ist Pflicht. when_free: true reiht ein. |
GET /druck-queue, POST /druck-queue, PATCH /druck-queue/<id> |
Warteschlange (confirm beim Einreihen) |
POST /spulen/<id>/einlegen |
Spule an Drucker/Platz; alte Rolle dort ins Regal |
POST /ablauf |
Ablauf für Kobra 3 einreihen |
GET /ereignisse?host=&kind=&since=&limit= |
Aktivität |
POST /ereignisse/gelesen |
Alerts als gelesen |
GET /spulen, GET /laeufe, GET /projekte |
Material, Protokoll, Projekte |
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/.