# 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](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 ```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: | 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 `. | | `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. ```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 öffnen. Handbuch in der Oberfläche unter **Doku**. `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/` | Technische Notizen, gerendert unter `/doku/` | | `CHANGELOG.md` | Änderungen je Version | ## API Alles unter `/api/v1`, JSON. Die wichtigsten Endpunkte: | Methode und Pfad | Zweck | | --- | --- | | `GET /version` | Version | | `GET /drucker?live=1` | Drucker mit Live-Zustand, laufendem und wartendem Auftrag | | `POST /drucker//` | Pause, Fortsetzen, Abbrechen, Fehler löschen | | `POST /drucker//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`, `PATCH /druck-queue/` | Warteschlange, Abbrechen (`status: cancelled`), Ablauf fortsetzen (`resume`) | | `POST /spulen//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 | ## Sicherheit - Druckstarts brauchen `confirm: true`. Die Oberfläche fragt per Zwei-Klick. - Keine freie G-code-Konsole. - Kein `FIRMWARE_RESTART`, GoKlipper hängt sich dabei auf. Fehler werden über „Fehler löschen“ geräumt. ## Versionen und Changelog - Versionierung nach [SemVer](https://semver.org/lang/de/): 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: . Doku zum Tool gehört nach `docs/`.