Grotti 2.2.0: Auth, API-Tokens, MCP und Doku-Trennung.

This commit is contained in:
Dominic Gundel committed 2026-10-15 10:53:12 +02:00
1 parent b20f8a7779
commit 5a3716b26a
65 files changed
+2212 -198

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
# ACE und Spulen
Stand **15.10.2026**. Mehrfarb-Drucke brauchen vor dem Start eine Zuordnung Datei-Farbe → ACE-Platz und eine passende Spule am Drucker.
![ACE-Zuordnung beim Senden](/static/doku/ace-zuordnung.png)
## Spule einlegen
1. Unter **Material → Spulen** die Rolle wählen oder anlegen.
2. Ort = Drucker und **ACE-Platz** (1–8) oder externe Spule.
3. Materialtyp und Farbe sollten zur Slice-Datei passen.
Es gibt **kein freies Spulen-Dropdown** beim Start: Grotti nimmt die Rolle(n), die am Ziel-Drucker liegen. Material-Mismatch oder zu wenig Rest → Warnung vor dem Start.
Etiketten mit QR: [Material und mehr](Anleitung-Material).
## ACE-Map beim Senden
Unter **Dateien → Optionen → ACE-Zuordnung**:
- Jede Farbe aus der Datei (`paint_index`) einem **ACE-Platz** zuordnen
- Ohne passende Map schreibt der Drucker oft **„cannot parse the file“** und startet nicht
- Grotti legt die Sidecar `*.gcode.acm` an und schickt sie mit
Externe Spule / keine ACE-Slots: keine `.acm` nötig.
## Typische Fehler
| Symptom | Check |
| --- | --- |
| „cannot parse the file“ | ACE-Zuordnung vollständig? Farben richtig? |
| Material-Warnung | Eingelegte Sorte ≠ Datei — Spule wechseln oder Slice prüfen |
| Rest zu gering | Andere Spule oder leichteres Teil |
| ACE blinkt nicht / kein Wechsel | Spule und Platz prüfen, ggf. Druck neu starten |
## Weiter
- [Dateien senden](Anleitung-Dateien)
- [Material](Anleitung-Material)
+49
View File
@@ -0,0 +1,49 @@
# Dateien senden
Stand **15.10.2026**. Seite `/dateien` — Bibliothek links, Senden rechts.
![Dateien: Bibliothek und Senden](/static/doku/dateien-flow.png)
## Bibliothek
- Suche, Filter nach Maschine und Projekt
- Vorschaubild, Material, Zeit, Gewicht, Schichthöhe
- Info-Popup mit Slice-Metadaten (Kopf und Footer)
- **Hochladen** per Knopf oder Drag & Drop
- **Ordner neu lesen**, wenn `watch_dir` in der Config auf den Slice-Ordner zeigt
Ohne `watch_dir` geht nur manueller Upload — das reicht für den Alltag.
## Senden: drei Schritte
1. **Datei** wählen (Klick in der Liste).
2. **Drucker** wählen — Kacheln zeigen Live-Zustand und eingelegte Rolle. Passt die Maschine nicht, ist die Kachel blass.
3. **Wann:**
- **Jetzt** — sofort senden und starten (Zwei-Klick)
- **Wenn frei** — in die Warteschlange für diesen Drucker
- **Nächster freier** — erster passender freier Drucker
Auswahl merkt sich der Browser (`localStorage`).
### Optionen
Unter Optionen u. a.:
- **Bettnetz / Auto-Level** beim MQTT-Start (Anycubic)
- Maschinen-Override, Projekt zuweisen
- **ACE-Zuordnung** — siehe [ACE und Spulen](Anleitung-ACE)
## Warum es dauert
Große Dateien brauchen oft **eine Minute**. In der Sidebar unter **Senden** siehst du den MB-Fortschritt. Danach startet der Druck.
## Nach dem Start
- Fortschritt auf der [Wand](Anleitung-Wand) und in der Sidebar **Läuft jetzt**
- Bei „Wenn frei“: Eintrag unter [Warteschlange](Anleitung-Warteschlange)
- Später unter **Protokoll** mit **Nochmal** (inkl. gespeicherter ACE-Map)
## Weiter
- [ACE und Spulen](Anleitung-ACE)
- [Warteschlange](Anleitung-Warteschlange)
+66
View File
@@ -0,0 +1,66 @@
# Einrichtung
Stand **15.10.2026**. Grotti auf dem Haus-PC installieren und den Browser öffnen. Die Drucker brauchen vorher Moonraker (Rinkhals auf Kobra 3 und S1).
## Was du brauchst
- Python 3.11
- PostgreSQL (leere Datenbank `grotti` reicht; Schema legt Grotti an)
- Drucker im selben Netz, Moonraker auf Port 80
- Dieses Repo und eine `config.json`
## Einmalig einrichten
Im Projektordner:
```powershell
cd D:\Projekte\Grotti
python -m venv .venv
.\.venv\Scripts\pip install -r requirements.txt
copy config.example.json config.json
```
`config.json` anpassen. Die wichtigsten Schlüssel:
| 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, den Grotti beobachtet. Leer = nur manueller Upload. |
| `token` | Optionaler Shared-API-Token (Übergang). Mit Benutzerverwaltung nutzt du API-Tokens unter Einstellungen. |
| `fqdn` | Öffentliche Basis-URL für QR auf Spulen-Etiketten. Leer = Request-Host. |
| `auto_queue` | `false` stoppt neue „wenn frei“-Starts. |
| `energy`, `telegram`, `alerts` | Kosten im Protokoll und Telegram — später auch unter Einstellungen. |
| `secret_key` | Für Login-Sessions. Beim ersten Start wird ein Wert erzeugt, wenn leer. |
Drucker beim ersten Start über `drucker.json` (Seed). Danach pflegt man sie unter [Einstellungen](Anleitung-Einstellungen).
```json
[{ "name": "Kobra 3 da26", "host": "10.10.1.60" }]
```
Die Familie (Kobra 3 oder S1) liest Grotti aus dem Namen.
## Starten
```powershell
.\.venv\Scripts\python.exe server.py
```
Dann <http://127.0.0.1:8770/> öffnen. Beim ersten Start legst du den Admin-Benutzer an. Nach Code-Änderungen an Python oft neu starten.
![Druckerwand nach dem Start](/static/doku/wand-uebersicht.png)
## Sicherheit
- Druckstart nur mit Bestätigung (Zwei-Klick in der UI bzw. `confirm: true` in der API).
- Keine freie G-code-Konsole; Firmware-Neustart über Grotti ist gesperrt.
- Benutzer und API-Tokens unter Einstellungen. Für Zugriff aus dem Internet: Reverse Proxy mit TLS, nicht den Entwickler-Server öffentlich freigeben.
- `config.json` und `data/` bleiben lokal, nicht im Git.
## Weiter
- [Oberfläche](Anleitung-Oberflaeche) — Navigation und Sidebar
- [Dateien senden](Anleitung-Dateien) — erster Druck
- Ausführlich im `README.md` im Projektordner
+44
View File
@@ -0,0 +1,44 @@
# Einstellungen
Stand **15.10.2026**. Seite `/einstellungen` — Drucker, Automatik, Anzeige, Telegram, Energie.
![Einstellungen: Drucker](/static/doku/einstellungen-drucker.png)
## Dieser Browser
- **Desktop** oder **Regal (Touch)** — nur lokal im Browser, siehe [Oberfläche](Anleitung-Oberflaeche).
## Automatik
Checkbox **Automatik-Warteschlange** (`auto_queue`). Aus = keine neuen „wenn frei“-Starts. Laufende Abläufe und manuelle „Jetzt“-Starts bleiben möglich.
## Drucker
Tabelle: Name, Host, Familie, **gesperrt**.
- Seed beim allerersten Start aus `drucker.json`, danach nur noch hier (Datenbank).
- Familie aus dem Namen (Kobra 3 / S1) oder gesetzt.
- **Gesperrt:** keine neuen Queue-Starts auf diesem Host.
## FQDN
Öffentliche Basis-URL für QR-Codes auf Spulen-Etiketten. Leer = Host aus dem aktuellen Request. Wichtig, wenn du Etiketten von einem Handy scannst, das nicht `127.0.0.1` kennt.
## Telegram und Alerts
Bot-Token und Chat-ID. Pro Ereignisart an/aus (Fertig, Fehler, Offline, Queue, …). Test-Knopf zum Prüfen. Wichtige Ereignisse stehen auch in der Sidebar unter Alerts.
## Benutzer und API-Tokens
Unter **Benutzer** (nur Admin) legst du Konten mit Rolle Admin oder Operator an. Unter **API-Tokens** erzeugst du Schlüssel für Home-Automation, App oder MCP — der Klartext erscheint nur einmal (`Authorization: Bearer grt_…`).
MCP (optional): Token erzeugen, dann `python -m grotti.mcp_server` mit `GROTTI_URL` und `GROTTI_TOKEN`. Für nur Lesen: `GROTTI_MCP_READ_ONLY=1`.
## Energie
Watt und Strompreis für die Kosten im **Protokoll**. Optional Trockner/Ausschuss/Auslastung für die Kalkulation.
## Weiter
- [Einrichtung](Anleitung-Einrichtung) (Config-Datei)
- [Störungen](Anleitung-Stoerungen)
+42
View File
@@ -0,0 +1,42 @@
# Material und mehr
Stand **15.10.2026**. Spulen, Etiketten, Projekte, Protokoll, Kameras, Aktivität und Ideen.
![Material: Spulen](/static/doku/material-spule.png)
## Material
Zwei Reiter: **Spulen** und **Sorten**.
**Spulen:** Filter Alle / Am Drucker / Regal / Wenig Rest. Formular bei Auswahl oder „Neue Spule“. Ort = Drucker · ACE/extern oder Regal. Scan-Feld im Seitenkopf (QR vom Etikett).
**Sorten:** Profile (Dichte, Preis, Maschinen). „Spule damit anlegen“ wechselt zum Spulen-Reiter.
### Etikett und QR
Pro Spule ein Etikett mit Chargennummer und QR. Der Code öffnet Material mit der Spule vorausgewählt. Dafür in den Einstellungen ggf. **FQDN** setzen (öffentliche URL), sonst gilt der Host aus dem Request.
## Projekte
Unter **Projekte** Aufträge mit Notiz und Kalkulation. Dateien lassen sich einem Projekt zuweisen (Bibliothek / Senden).
## Protokoll
Abgeschlossene Läufe: Dauer, Gramm, Kosten, Urteil. **Nochmal** startet denselben Job inkl. gespeicherter ACE-Map und Bettnetz-Option.
## Kameras
`/kameras` — alle Snapshots nebeneinander mit Live-Zustand. Praktisch auf dem Regal-Tablet.
## Aktivität
Zeitstrahl: Starts, Schritte, Fertig, Fehler, Abbrüche, offline. Filter nach Drucker, Art, Zeitraum. Ungelesene Alerts sind markiert; in der Sidebar kannst du sie als gelesen setzen.
## Ideen
`/ideen` — Notizen und Ideen für später. Kein Druckfluss, nur Merkliste.
## Weiter
- [ACE und Spulen](Anleitung-ACE)
- [Einstellungen](Anleitung-Einstellungen)
+37
View File
@@ -0,0 +1,37 @@
# Oberfläche
Stand **15.10.2026**. Wie die App aufgebaut ist — Menü, Live-Leiste, Desktop und Regal.
## Navigation
Links (Desktop): **Drucker**, **Dateien**, **Kameras**, **Aktivität**, **Warteschlange**, **Protokoll**, **Material**, **Projekte**. Darunter **Einstellungen**, **Ideen**, **Doku**. Fuß: Version (öffnet die Doku).
Unter ca. 760 px: untere Leiste mit den wichtigsten Seiten. Das Seitenmenü lässt sich zur Icon-Rail einklappen.
![Seitenleiste mit Live-Boxen](/static/doku/sidebar-live.png)
## Live-Leiste
Unter dem Menü, eigene Scrollfläche. Boxen auf- und zuklappbar (Merker im Browser):
| Box | Inhalt |
| --- | --- |
| **Läuft jetzt** | Laufende Aufträge und Abläufe, Schrittleiste, Abbrechen. Auch Direktstarts ohne Queue-Zeile. |
| **Wartet** | Wartende Aufträge: Priorität, Abbrechen. Gestoppte Abläufe mit Fortsetzen. |
| **Aufgaben** | Platte belegt ohne laufenden Ablauf — **geräumt** (Zwei-Klick). |
| **Senden** | Uploads mit MB-Fortschritt. |
| **Alerts** | Ungelesene wichtige Ereignisse; als gelesen markieren oder zur Aktivität. |
## Desktop und Regal
Unter **Einstellungen → Dieser Browser**:
- **Desktop** — normale Dichte
- **Regal (Touch)** — größere Bedienelemente, kompaktere Nav, Sidebar oft eingeklappt
Shortcut in der URL: `?shelf=1` bzw. `?shelf=0`. Nur dieser Browser (`localStorage`).
## Weiter
- [Druckerwand](Anleitung-Wand)
- [Dateien senden](Anleitung-Dateien)
+56
View File
@@ -0,0 +1,56 @@
# Störungen
Stand **15.10.2026**. Was tun, wenn etwas hängt. Kurzfassung auch auf der [Doku-Startseite](/doku#haengt).
## Auftrag startet nicht
| Anzeige | Maßnahme |
| --- | --- |
| **Platte belegt** | Teil runter, dann **Platte geräumt** (Karte oder Sidebar → Aufgaben). |
| Drucker **gesperrt** | Unter Einstellungen entsperren. |
| Automatik aus | Einstellungen → Automatik-Warteschlange an. |
| Falsche Maschine | Andere Datei oder anderen Drucker wählen. |
## Fehlerzustand auf dem Drucker
Auf der Karte **Fehler löschen** (Zwei-Klick). Grotti räumt den hängenden Fehler und schaltet die Heizung aus. Ein Neustart der Firmware über Grotti ist absichtlich nicht möglich — bei Bedarf Display-Neustart oder Strom aus/an.
Hängende Fehler vor einem Start räumt Grotti oft selbst, wenn kein Druck aktiv ist.
## Ablauf gestoppt
1. Grund in Sidebar / Karte / Aktivität lesen (Schieben, Tasten, Timeout, …).
2. Mechanisch klären (Kiste, Teil, Platte).
3. **Weiter** ab dem fehlgeschlagenen Schritt — oder Verwerfen und neu einreihen.
## Start scheitert nach Abbruch
Manchmal bleibt nach einem Abbruch ein alter Auftrag auf dem Drucker hängen. Der nächste Start scheitert dann oft mit einer Fehlermeldung (z. B. Code **10101**).
Was tun: Abbruch über Grotti (nicht nur am Display), auf der Wand den Task-Hinweis prüfen, erneut starten. Bleibt es hängen: Strom aus und wieder an.
## ACE / „cannot parse“
ACE-Zuordnung unter Dateien → Optionen prüfen. Spulen am richtigen Platz. Siehe [ACE und Spulen](Anleitung-ACE).
## Offline
Strom, WLAN und Erreichbarkeit des Druckers prüfen. Grotti meldet „wieder erreichbar“ unter Aktivität und ggf. Telegram.
## E-Stop
Im Cockpit (nur bei aktivem Druck/Heizen). Danach oft **Strom aus und wieder an**. Firmware-Neustart über Grotti ist absichtlich gesperrt.
## Upload hängt bei großen Dateien
Oft noch Verarbeitung auf dem Drucker. In der Sidebar unter **Senden** den Fortschritt beobachten. Nach einem Grotti-Update den Dienst einmal neu starten.
## Wo nachschauen
- Sidebar: Alerts, Läuft, Wartet, Senden
- **Aktivität** — Zeitstrahl mit Filtern
## Weiter
- [Druckerwand](Anleitung-Wand)
- [Warteschlange](Anleitung-Warteschlange)
+54
View File
@@ -0,0 +1,54 @@
# Druckerwand
Stand **15.10.2026**. Startseite `/` — eine Karte je Drucker. Klick öffnet das Cockpit.
![Druckerwand](/static/doku/wand-uebersicht.png)
## Karte
Pro Drucker siehst du:
- Zustand (Chip), Fertig-Uhrzeit, Fortschrittsbalken
- Restzeit, Schicht, Laufzeit
- Temperaturen Düse/Bett (mit Ziel)
- Dateiname, bei ACE oft Farb-Swatches
- Bei Ablauf: Schrittleiste und Abbrechen
Aktionen auf der Karte brauchen oft **zwei Klicks** (erster Klick „scharf“, zweiter bestätigt):
| Aktion | Wann |
| --- | --- |
| **Pause** / **Weiter** | Während des Drucks |
| **Abbrechen** | Druck oder Pause |
| **Fehler löschen** | Zustand Fehler — räumt den hängenden Fehler, Heizung aus |
| **Platte geräumt** | Nach Fertig, wenn die Platte wieder frei ist |
| **Weiter** (Ablauf) | Gestoppter Ablauf — ab dem fehlgeschlagenen Schritt, wenn die Kiste steht |
Während eines Abräum-Ablaufs blendet Grotti „Platte geräumt“ aus — der Ablauf räumt selbst.
## Cockpit
URL mit Hash: `/#<host>` (z. B. nach Klick auf die Karte).
![Cockpit eines Druckers](/static/doku/cockpit.png)
Inhalt:
- **Kamera** — nur wenn eine Webcam erreichbar ist; sonst bleibt der Platz weg
- Status, Temps inkl. Bauraum wo verfügbar, Lüfter
- **Steuerung:** Zieltemperaturen, Speed, Flow, Fan — fest vorgegebene Befehle, keine freie Konsole
- **E-Stop** nur bei printing/paused/heating (Zwei-Klick). Danach oft Strom aus/an
- **3D-Pfad** der laufenden oder gewählten Datei; Objekte ausschließen (mit Bestätigung)
- **Bettnetz**-Heatmap, wenn vorhanden
## Tipps
- Gesperrte Drucker (Einstellungen) starten keine neuen „wenn frei“-Jobs.
- Live-Daten kommen mit wenigen Sekunden Verzögerung.
- Ein Task-Hinweis auf der Karte zeigt, wenn auf dem Drucker noch ein alter Auftrag hängt — siehe [Störungen](Anleitung-Stoerungen).
## Weiter
- [Dateien senden](Anleitung-Dateien)
- [Warteschlange und Ablauf](Anleitung-Warteschlange)
- [Störungen](Anleitung-Stoerungen)
+52
View File
@@ -0,0 +1,52 @@
# Warteschlange und Ablauf
Stand **15.10.2026**. Aufträge „wenn frei“, Priorität, und der Kobra-3-Ablauf (drucken → abkühlen → schieben → tasten).
![Warteschlange](/static/doku/warteschlange.png)
## Seite Warteschlange
Filter: **Läuft** / **Wartet** / **Fehler** / **Historie** (und „Alle aktiv“).
Pro Auftrag:
- Priorität hoch/runter
- **Abbrechen**
- Bei gestopptem Ablauf: **Fortsetzen** (ab dem fehlgeschlagenen Schritt)
Unter **Läuft** siehst du auch Direktstarts ohne Queue-Zeile (Link zur Wand).
Dieselbe Information steht kompakt in der Sidebar (**Läuft jetzt** / **Wartet**).
## Wann startet ein wartender Auftrag?
Sobald der Drucker bereit ist (`standby` / fertig / abgebrochen), die **Platte frei** ist und der Drucker nicht gesperrt. Automatik aus (`auto_queue`) oder gesperrt → keine neuen Starts; laufende Abläufe laufen weiter.
## Ablauf (nur Kobra 3)
Unter **Dateien → Ablauf** eine Kette bauen und einreihen:
```text
Drucken → Abkühlen → Schieben → Tasten → (Wiederholung)
```
| Schritt | Bedeutung |
| --- | --- |
| **Abkühlen** | Wartet, bis Bett und Düse unter der Grenze sind. PLA löst sich oft von selbst. |
| **Schieben** | Extruder schiebt das Teil von hinten nach vorn in die Kiste. |
| **Tasten** | LeviQ-Netz tippt; Maß aus `Result is z=`. Über 1 mm stoppt den Ablauf. |
Aktueller Schritt: auf der Druckerkarte und in der Sidebar. Abbrechen an beiden Stellen. Jeder Schritt landet unter **Aktivität**.
**Schieben testen** und „Bett ist leer“: im Ablauf-Reiter, bevor du unbeaufsichtigt läuft.
## Gestoppter Ablauf
1. Ursache beheben (Kiste voll, Teil hängt, Tasten zu hoch, …).
2. Auf der Karte oder in der Sidebar **Weiter** — nicht nur neu einreihen.
3. Oder verwerfen / abbrechen und später neu starten.
## Weiter
- [Druckerwand](Anleitung-Wand)
- [Störungen](Anleitung-Stoerungen)
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -8,7 +8,7 @@ Jede Spule in Grotti bekommt automatisch eine `chargen_nr` der Form `S-YYYYMMDD-
Scannen: auf Material den Code tippen oder per USB-Handscanner (Tastatur + Enter). Lookup `GET /api/v1/spulen/by-code/<code>`. QR auf dem Etikett öffnet `/material?spool=<id>`.
Etikett: `/etikett/<id>`, Druck über den Browser. QR per qrcode.js (CDN). Basis-URL für den QR kommt aus Einstellungen → **FQDN** (`config.json` Key `fqdn`); leer = Host der aktuellen Anfrage. Beispiel: `https://grotti.example.de/material?spool=12`.
Etikett: `/etikett/<id>`, Druck über den Browser. QR per lokalem `qrcode.min.js` (`web/static/`). Basis-URL für den QR kommt aus Einstellungen → **FQDN** (`config.json` Key `fqdn`); leer = Host der aktuellen Anfrage. Beispiel: `https://grotti.example.de/material?spool=12`.
## 3D-Pfad
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+30
View File
@@ -0,0 +1,30 @@
# MCP-Server
Stand **15.10.2026**. Agenten steuern Grotti nur über die HTTP-API mit einem API-Token.
## Start
```powershell
$env:GROTTI_URL = "http://127.0.0.1:8770"
$env:GROTTI_TOKEN = "grt_…" # unter Einstellungen → API-Tokens
$env:GROTTI_MCP_READ_ONLY = "1" # optional: nur lesen
.\.venv\Scripts\pip install mcp
.\.venv\Scripts\python.exe -m grotti.mcp_server
```
## Tools
| Tool | Schreibend | Confirm |
| --- | --- | --- |
| `list_printers`, `get_printer`, `list_running`, `list_queue`, `list_events`, `list_files`, `list_spools`, `get_version` | nein | — |
| `pause_printer`, `resume_printer` | ja | — |
| `cancel_printer`, `clear_bed`, `enqueue_*` | ja | `confirm=true` |
| `steer_temp`, `steer_speed`, `steer_fan` | ja | — |
Nicht exponiert: freie G-code, Firmware-Restart, E-Stop, User/Token/Settings.
## Sicherheit
- Token mit Rolle Operator reicht für den Alltag; Admin-Token vermeiden.
- Read-only-Flag für vorsichtige Agents.
- Server ideal nur lokal; Grotti selbst hinter Login/TLS.
File renamed without changes.
+5
View File
@@ -0,0 +1,5 @@
# Interne Technik-Notizen
Diese Dateien sind für Entwicklung und Agenten — **nicht** unter `/doku` in der App.
Nutzer-Handbuch: `docs/Anleitung-*.md`.
File renamed without changes.
File renamed without changes.
File renamed without changes.