109 lines
4.9 KiB
Markdown
109 lines
4.9 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. 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](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/`.
|