README: Banner, Badges und Community-Screenshots oben.
This commit is contained in:
1 parent
dd0e7ebc6b
commit
4ffe1dcfc6
4 files changed
+107
-78
No files matched your search
@@ -4,6 +4,10 @@ Alle Änderungen an Grotti. Format nach [Keep a Changelog](https://keepachangelo
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Geändert
|
||||
|
||||
- **README:** Banner, Badges, Feature-Übersicht und Community-Screenshots oben; Setup/API darunter.
|
||||
|
||||
## [3.4.0] – 2026-10-18
|
||||
|
||||
### Neu
|
||||
|
||||
@@ -1,76 +1,109 @@
|
||||
# Grotti
|
||||
<p align="center">
|
||||
<img src="docs/brand/readme-banner.png" alt="Grotti" width="720">
|
||||
</p>
|
||||
|
||||
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.
|
||||
<p align="center">
|
||||
<strong>Farm-Manager für Moonraker-Drucker</strong><br>
|
||||
Eine Oberfläche für die ganze Farm: Wand, Warteschlange, Material, Abläufe und Protokoll.<br>
|
||||
<em>Benannt nach der Mühle Grotti — sie mahlt ohne Pause, was man ihr aufträgt.</em>
|
||||
</p>
|
||||
|
||||
Der Name kommt von der Mühle Grotti: sie mahlt ohne Pause, was man ihr aufträgt.
|
||||
<p align="center">
|
||||
<a href="https://git.gundel.dev/dg/grotti"><img src="https://img.shields.io/badge/Version-3.4.0-e85d04?style=flat-square" alt="Version 3.4.0"></a>
|
||||
<img src="https://img.shields.io/badge/Python-3.11+-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
||||
<img src="https://img.shields.io/badge/PostgreSQL-14+-4169E1?style=flat-square&logo=postgresql&logoColor=white" alt="PostgreSQL">
|
||||
<img src="https://img.shields.io/badge/Moonraker-Klipper-2ecc71?style=flat-square" alt="Moonraker">
|
||||
<img src="https://img.shields.io/badge/UI-Deutsch-111827?style=flat-square" alt="UI Deutsch">
|
||||
<img src="https://img.shields.io/badge/Self--hosted-lokal-6b7280?style=flat-square" alt="Self-hosted">
|
||||
</p>
|
||||
|
||||
Die Drucker laufen mit Rinkhals (Kobra 3, Kobra S1). Grotti spricht sie über Moonraker an.
|
||||
<p align="center">
|
||||
<a href="#features">Features</a> ·
|
||||
<a href="#screenshots">Screenshots</a> ·
|
||||
<a href="#schnellstart">Schnellstart</a> ·
|
||||
<a href="#api">API</a> ·
|
||||
<a href="CHANGELOG.md">Changelog</a> ·
|
||||
<a href="docs/community/README.md">Community</a>
|
||||
</p>
|
||||
|
||||
Aktuelle Version: siehe `grotti/version.py`, Änderungen in [CHANGELOG.md](CHANGELOG.md).
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
<p align="center">
|
||||
<img src="docs/community/01-druckerwand.png" alt="Druckerwand" width="900">
|
||||
</p>
|
||||
|
||||
- Python 3.11
|
||||
- PostgreSQL (eine leere Datenbank `grotti` reicht, das Schema legt Grotti selbst an)
|
||||
- Drucker im selben Netz mit Moonraker auf Port 80
|
||||
## Features
|
||||
|
||||
## Einrichten
|
||||
| | |
|
||||
| --- | --- |
|
||||
| **Druckerwand & Cockpit** | Live-Status, Temps, Pause/Cancel, Farm-ETA |
|
||||
| **Warteschlange** | Priorität, „nächster freier“, Material-Match, ACE-Map |
|
||||
| **Dateien & Projekte** | Slice-Watch, Senden, Umbenennen, Projektordner |
|
||||
| **Kobra-3-Ablauf** | Druck → Abkühlen → Schieben → Tasten |
|
||||
| **Material** | Spulen, Restgewicht, Bedarf, Chargen |
|
||||
| **Aufträge & Statistik** | Kunden, Lieferschein, Kosten (€ Material+Strom) |
|
||||
| **Betrieb** | Auth (Session/`grt_…`), Telegram/ntfy, PWA |
|
||||
|
||||
Stack: **Python · Flask · PostgreSQL · Moonraker** (Rinkhals auf Kobra 3 / S1).
|
||||
|
||||
## Screenshots
|
||||
|
||||
<p align="center">
|
||||
<img src="docs/community/06-jetzt.png" alt="Jetzt-Liste" width="440">
|
||||
|
||||
<img src="docs/community/02-warteschlange.png" alt="Warteschlange" width="440">
|
||||
</p>
|
||||
<p align="center">
|
||||
<img src="docs/community/09-dateien.png" alt="Dateien" width="440">
|
||||
|
||||
<img src="docs/community/03-material.png" alt="Material" width="440">
|
||||
</p>
|
||||
<p align="center">
|
||||
<img src="docs/community/05-statistik.png" alt="Statistik" width="440">
|
||||
|
||||
<img src="docs/community/07-cockpit.png" alt="Cockpit" width="440">
|
||||
</p>
|
||||
|
||||
Weitere Bilder und Post-Text: [`docs/community/`](docs/community/README.md).
|
||||
|
||||
## Schnellstart
|
||||
|
||||
**Voraussetzungen:** Python 3.11, PostgreSQL (leere DB `grotti`), Drucker mit Moonraker im LAN.
|
||||
|
||||
```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.
|
||||
|
||||
Schema-Änderungen laufen beim Start über `grotti/migrations/` (Tabelle `schema_version`). Vor Major-Updates die Datenbank sichern (`pg_dump`).
|
||||
|
||||
```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.
|
||||
Dann <http://127.0.0.1:8770/>. Bedienung unter **Doku** in der App (`docs/Anleitung-*.md`).
|
||||
|
||||
`config.json` und `data/` sind lokal und nicht im Git.
|
||||
`config.json` und `data/` bleiben lokal (nicht im Git). Drucker zuerst in `drucker.json`, danach unter Einstellungen.
|
||||
|
||||
| Schlüssel | Bedeutung |
|
||||
| --- | --- |
|
||||
| `host`, `port` | Oberfläche (Standard `127.0.0.1:8770`) |
|
||||
| `database_url` | PostgreSQL |
|
||||
| `watch_dir` | Slice-Ordner (oder leer = nur Upload) |
|
||||
| `energy` / `telegram` / `alerts` | Kosten und Benachrichtigungen |
|
||||
|
||||
Schema-Migrationen laufen beim Start (`grotti/migrations/`). Vor Major-Updates: `pg_dump`.
|
||||
|
||||
## 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 |
|
||||
| `server.py` | Start, DB, Hintergrund-Threads |
|
||||
| `grotti/` | Moonraker, Queue, Senden, Abräumen, Watcher, Store |
|
||||
| `web/` | Flask, Templates, CSS/JS, Branding |
|
||||
| `docs/` | Anleitungen (`/doku`), Community-Screens, Technik unter `internal/` |
|
||||
| `CHANGELOG.md` | Versionen |
|
||||
|
||||
## 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).
|
||||
Alles unter `/api/v1`, JSON. Auth: Session oder `Authorization: Bearer grt_…`.
|
||||
|
||||
| Methode und Pfad | Zweck |
|
||||
| --- | --- |
|
||||
@@ -78,43 +111,33 @@ Alles unter `/api/v1`, JSON. Auth: Session-Cookie (UI) oder `Authorization: Bear
|
||||
| `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) |
|
||||
| `GET /drucker?live=1` | Drucker mit Live-Zustand |
|
||||
| `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 |
|
||||
| `GET`/`POST /dateien`, `PATCH`/`DELETE /dateien/<id>` | Bibliothek |
|
||||
| `POST /senden`, `GET`/`POST /druck-queue` | Senden und Warteschlange (`confirm`) |
|
||||
| `GET /spulen`, `POST /spulen/<id>/einlegen` | Material |
|
||||
| `GET /laeufe`, `/statistik`, `/ereignisse` | Protokoll und Aktivität |
|
||||
|
||||
MCP: `python -m grotti.mcp_server` mit `GROTTI_URL` und `GROTTI_TOKEN` (siehe `docs/internal/MCP.md`).
|
||||
MCP: `python -m grotti.mcp_server` mit `GROTTI_URL` / `GROTTI_TOKEN` → `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.
|
||||
- Login Pflicht. Rollen: Admin, Operator.
|
||||
- Druckstarts brauchen `confirm: true` (Zwei-Klick in der UI).
|
||||
- Keine freie G-code-Konsole; kein `FIRMWARE_RESTART` über Grotti.
|
||||
- Nach außen: Reverse Proxy mit TLS.
|
||||
|
||||
## Versionen und Changelog
|
||||
## Versionen
|
||||
|
||||
- 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.
|
||||
- SemVer in `grotti/version.py`, Einträge in [CHANGELOG.md](CHANGELOG.md).
|
||||
- Release: `[Unreleased]` → `[x.y.z] – Datum`, Tag `vX.Y.Z`.
|
||||
- CSS/JS-Cache: `?v=` in `layout.html` mitziehen.
|
||||
|
||||
## Repo
|
||||
---
|
||||
|
||||
Eigenes Repository: <https://git.gundel.dev/dg/grotti>. Doku zum Tool gehört nach `docs/`.
|
||||
<p align="center">
|
||||
<img src="web/static/brand/logo.png" alt="" width="72"><br>
|
||||
<sub>Repo: <a href="https://git.gundel.dev/dg/grotti">git.gundel.dev/dg/grotti</a></sub>
|
||||
</p>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
@@ -1,6 +1,8 @@
|
||||
# Grotti — Community-Vorstellung
|
||||
|
||||
Screenshots aus dem laufenden Betrieb (v3.2.0, Okt. 2026). Zielgruppe: mittlere bis große Printfarmen.
|
||||
Screenshots aus dem laufenden Betrieb (v3.4.0, Okt. 2026). Zielgruppe: mittlere bis große Printfarmen.
|
||||
|
||||
Logo und Repo-Banner: [`docs/brand/`](../brand/). Haupt-README: [`../../README.md`](../../README.md).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user