103 lines
4.3 KiB
Markdown
103 lines
4.3 KiB
Markdown
# 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 <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.
|
||
|
||
```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. 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/<name>` |
|
||
| `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/<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`, `PATCH /druck-queue/<id>` | Warteschlange, Abbrechen (`status: cancelled`), Ablauf fortsetzen (`resume`) |
|
||
| `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 |
|
||
|
||
## 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: <https://git.gundel.dev/dg/grotti>. Doku zum Tool gehört nach `docs/`.
|