Slice-Watch mit Ordnern/Filtern, Orca-Nachbearbeitung, Cockpit-Verlauf mit ED, Zeitzone im Browser. Tasten-Grenze und README-API angeglichen, toter Code entfernt, Requirements gepinnt.
119 lines
5.7 KiB
Markdown
119 lines
5.7 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 (unter Einstellungen setzen). 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`/`PATCH /einstellungen`, `POST /telegram/test` | Config und Telegram-Probe |
|
||
| `GET /drucker?live=1` | Drucker mit Live-Zustand, laufendem und wartendem Auftrag |
|
||
| `POST /drucker` · `PATCH`/`DELETE /drucker/<id>` | Drucker anlegen/ändern (Admin) |
|
||
| `POST /drucker/<host>/<aktion>` | Pause, Fortsetzen, Abbrechen, Fehler löschen |
|
||
| `POST /drucker/<host>/steuern` | Temperatur, Speed, Flow, Lüfter, ACE |
|
||
| `POST /drucker/<host>/abraeumen` | Platte geräumt (`confirm`) |
|
||
| `GET /kamera/<host>`, `/vorschau/<host>` | Snapshot / Job-Thumbnail |
|
||
| `GET`/`POST /dateien`, `PATCH`/`DELETE /dateien/<id>` | Bibliothek, Upload, Metadaten |
|
||
| `POST /dateien/neu-lesen`, `/dateien/ordner`, `/dateien/<id>/verschieben` | Watch-Sync, Ordner, Verschieben |
|
||
| `POST /senden`, `GET /sende-auftraege` | Sofort senden (`confirm`), Fortschritt |
|
||
| `GET`/`POST /druck-queue`, `PATCH /druck-queue/<id>` | Warteschlange (`confirm` beim Einreihen) |
|
||
| `GET /laeuft`, `/aufgaben` | Direktstarts und Platte-belegt |
|
||
| `POST /ablauf`, `/schieben-testen` | Ablauf Kobra 3 / Schieben-Test |
|
||
| `GET /spulen`, `POST /spulen`, `POST /spulen/<id>/einlegen` | Spulen und Einlegen |
|
||
| `GET /spulen/<id>/akte`, `/spulen/by-code` | Spulenakte, Scan `S-…` |
|
||
| `GET`/`POST /materialien`, `/farben` | Sorten und Farbpalette |
|
||
| `GET /laeufe`, `/laeufe/aktuell`, `/laeufe/<id>` | Protokoll und Druckbericht |
|
||
| `GET /statistik`, `/statistik.csv` | Auslastung und CSV |
|
||
| `GET`/`POST /projekte`, `/ideen` | Projekte und Ideen-Backlog |
|
||
| `GET /ereignisse`, `POST /ereignisse/gelesen` | Aktivität und Alerts |
|
||
| `POST /kalkulation` | Vorkalkulation Material+Strom |
|
||
|
||
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/`.
|