Files
grotti/CHANGELOG.md
T

37 KiB
Raw Blame History

Changelog

Alle Änderungen an Grotti. Format nach Keep a Changelog, Versionen nach SemVer.

[Unreleased]

[3.6.1] – 2026-11-01

Behoben

  • Abbruch fehlt nach Neustart: Der History-Abgleich hat den Live-Lauf übernommen und gelöscht, das Ereignis „Druck abgebrochen“ zeigte noch auf diese Zeile. Der Fremdschlüssel hat den ganzen Watcher-Tick zurückgerollt, der Abbruch kam nie ins Protokoll, und der neue Druck hat dieselbe Zeile weiterbenutzt. Das Ereignis hängt sich an den überlebenden Lauf. Wechselt die Datei, wird der offene Lauf geschlossen statt umbenannt. Ein Live-Lauf einer anderen Datei wird nicht mehr übernommen.
  • Spulenwechsel: Nach Filamentpause kein vorzeitiger Spulenabzug mehr (watcher_resume). Beim Zurücknehmen eines Abzugs wird der letzte Abschnitt wieder geöffnet; der Messwert wird anteilig nach mm verteilt. Beim Einlegen während des Drucks entsteht der erste Abschnitt auch dann (0→jetzt), wenn die alte Rolle schon im Regal ist oder ACE ohne Start-Abschnitt lief. Fallback slot-genau (Platz / ACE-Map / letzter Abschnitt). ACE-Start öffnet Abschnitte für gemappte Plätze mit Spule — ohne Wechsel bleibt Anteil-Split.

Geändert

  • systemd: TimeoutStopSec=20 und KillMode=mixed, damit ein hängender Stopp nicht 90 s blockiert.
  • Orca: Anleitung und Empfehlung zeigen auf Grotti am Pi (http://10.10.1.41:8770/), nicht mehr lokal.
  • Dateien: Unveränderte Watch-Dateien werden beim Sync nur per Größe/mtime geprüft, nicht erneut geöffnet. ace_trailer liegt in der Datenbank; die Dateiliste öffnet die Datei nur noch einmal, wenn der Wert fehlt. Wand zeigt Drucker sofort, die Bibliothek lädt im Hintergrund. Pi-Paket: http_threads 8.
  • 3D-Pfad: Ungespeicherte Bahnen werden nacheinander gebaut, nicht parallel. http_threads begrenzt die Request-Threads. Sonst liest die Vorschau mehrere G-codes gleichzeitig und füllt auf einem Pi mit 2 GB den Speicher.
  • UI: Wärmeres Orange-Licht (App und Login), Warten-Status in Amber statt Knopf-Orange, Druckerwand mit heller Kartenkante, größerer Prozentzahl und atmendem Druck-Streifen.

[3.6.0] – 2026-10-25

Neu

  • Projekte: Kennzahlen (Läufe, Zeit, Filament, Kosten), Tab Läufe, Einreihen / Alle einreihen, Filter Aktiv/Fertig, Deep-Link #id. API: GET …/laeufe, POST …/einreihen.
  • Wand-Cockpit: Block „Als Nächstes“ — Nochmal, Queue-Hinweis, passende Dateien (Start oder Anpassen unter Dateien).
  • Querverlinkung: Datei/Projekt/Spule/Auftrag/Drucker verlinkt in Protokoll, Bericht, Warteschlange, Aufträge, Material, Statistik (Projektfilter), Dateien.
  • API für Apps: POST /auth/token, QR bei Token-Erzeugung, Server-Filter für Dateien/Queue/Spulen (limit/offset, X-Total-Count), ?token= für Datei-Vorschau und Assets, /version mit api/features, Aktions-Alias resume/cancel. Doku: docs/internal/API.md, openapi.yaml.
  • Pi: Umzugsanleitung Windows→Pi, Skript scripts/pfade_umziehen.py im .deb.
  • Protokoll Verbinden: Verdachtspaare nach Runout manuell zusammenlegen (POST /laeufe/<id>/verbinden). Liste zeigt Rollenwechsel, mehrere Spulen und Pausendauer.
  • Reparatur: scripts/laeufe_reparieren.py findet Alt-Paare und verwaiste Live-Läufe (Probelauf standardmäßig). Orphan-Übernahme nur bei gleicher Datei und wenn der Live-Lauf wirklich verschwindet; kein Host-Fallback auf fremde offene Drucke.

Geändert

  • Projekte / Aufträge: Liste zuerst (volle Breite); Formular und Detail nur bei Neu, Auswahl oder Bearbeiten — wie Material. Aufträge: Positionen ohne prompt(), Kopf-Button „Neuer Auftrag“.
  • Layout: .edit-split.is-idle, Split/Panel ab 1080px einspaltig; Pfad-Ellipsis in Tabellen; Protokoll-Hilfe einklappbar; Queue-Aktionen mit Textlabels; Jetzt-Seite zeigt „Alles erledigt“; Aktivität Drucker-Filter als Select; Statistik-Filter unter „Weitere Filter“; Nav Aufträge = Clipboard-Icon; Mobile-Mehr gruppiert.
  • Material-Routing: PLA ist PLA. Meta, Matte, Silk und die Marke halten die Queue nicht mehr an; liegt die genannte Sorte am Drucker, wird sie weiter bevorzugt. Ein anderer Typ (PETG statt PLA) bleibt ein Wartegrund.
  • mcp auf 2.0.0 gepinnt.
  • Lauf-Identität: Zusammenlegen nur mit Beweis (print_duration fortgesetzt + Lücke ≤ 5 s, oder Watcher „druckt weiter“). Leere History-Hüllen werden nicht gespeichert. sync_history unter Advisory-Lock; Abzug atomar. Doku: docs/internal/Lauf-Identitaet.md.
  • Queue print_active: Nur complete = fertig. cancelled/standby werden entprellt; echter Abbruch heißt „Druck abgebrochen“, nicht „Fertig.“. Kein Auto-Retry nach Abbruch. Worker respektiert Abbruch während Upload. print_queue.run_id + höchstens ein running pro Host.
  • Wand Runout: Hinweis nennt ACE-Platz und verlinkt Material mit vorausgefülltem Drucker/Platz.
  • Live-UI: SSE queue/drucker aktualisiert Warteschlange und Protokoll.

Behoben

  • Legacy-Kameras-Seite: totes Template entfernt (Route leitete schon auf die Wand um).
  • Laufende Charge bleibt am History-Job: Kommt die Moonraker-Job-ID, übernimmt dieser Lauf die Nummer. Sie fällt nicht weg, nur weil der Druck noch läuft.
  • Alte History-Jobs verbrauchen die Charge von heute: Eine Filament-Pause öffnet eine zweite Job-ID. Bleibt die ohne Ende und ohne Dauer in der History stehen, hing Grotti sie als neuen Druck an den heutigen Tag und buchte das Filament noch einmal ab. Die Job-ID bleibt am ursprünglichen Lauf, eine leere Hülle überschreibt ihn nicht, und die Charge trägt das Startdatum des Drucks.
  • Kontaktverlust spaltet den Druck: Zwei fehlende Polls melden den Drucker offline, lassen den Lauf aber offen und ziehen nichts ab. Dieselbe Charge läuft weiter, wenn derselbe Auftrag wieder da ist. Erst fertig, Abbruch, Fehler oder ein anderer Auftrag schließt den Lauf.
  • Queue bleibt auf „Druckstart kann eine Minute dauern“, während der Drucker längst druckt: Der Abschluss hat await_print erst geprüft, wenn der Drucker wieder frei war, und den laufenden Druck dann als Start-Timeout gewertet.
  • Strombericht ohne Düse/Bett nach Pause: Beim Zusammenlegen zweier History-Jobs bleiben Temperatur- und ED-Proben am Lauf. Vorher wurden die Proben des Folgejobs gelöscht, der Bericht fiel auf die Grundlast zurück.
  • Filament-Pause spaltet das Protokoll: Setzt Anycubic nach dem Fortsetzen eine neue History-Job-ID, bleibt es ein Lauf. Der Abbruch-Teil wird nicht noch einmal als ganzer Druck abgezogen.
  • Materialwechsel öffnet trotzdem einen zweiten Auftrag: Moonraker liefert die History neueste zuerst. Die Fortsetzung kam vor dem abgebrochenen Teil an die Reihe, fand keinen Vorgänger und wurde ein eigener Lauf; der alte Teil wurde als Abbruch abgezogen. Der Abgleich geht jetzt pro Drucker von alt nach neu. Eine eingeklappte Job-ID setzt den laufenden Druck nicht mehr auf „Abgebrochen“ zurück, und der zusammengelegte Lauf hat kein Ende, solange er druckt.
  • Fertig vor History bucht doppelt: Live-Lauf wird geschlossen ohne Abzug; History bucht. Fallback nach 10 min ohne History.
  • Abbruch + schnelles Nochmal: Frischer Neustart (Dauer nahe 0) wird nicht mehr als Filament-Fortsetzung zusammengelegt.
  • Alter Lauf auf der neuen Spule: Der History-Abgleich zieht einen Druck nur von Rollen ab, die vor dem Druckende schon existierten. Die Rolle, die gerade im ACE liegt, bekommt keine alten Jobs.
  • Projektfilter leer neben „Wurzel“: Ein gewähltes Projekt hebt den Ordnerfilter „Wurzel“ auf. Ein Ordner zeigt auch die Dateien in seinen Unterordnern.

[3.5.2] – 2026-10-21

Geändert

  • Wenig Rest: ACE oder Spule unter dem Dateigewicht warnt unter Dateien, bricht Start und Warteschlange nicht mehr ab. Falsche Sorte bleibt ein Wartegrund.

Behoben

  • Queue „Nochmal — Start abgebrochen (Neustart)“ während der Drucker anläuft: Nach dem Upload bleibt der Auftrag in await_print, bis Moonraker druckt. Die 45-Sekunden-Regel gilt nur noch, wenn der Upload-Thread weg ist. Wand und Seitenleiste zeigen „startet“ und dass es etwa eine Minute dauern kann.

[3.5.1] – 2026-10-20

Geändert

  • MCP: Server-Anweisung für Clients (Ablauf, confirm, Filament-Pause, Platten-Quittung, kein G-code), damit der Agent die Tools in der richtigen Reihenfolge nutzt.
  • Wand: „Aus der Warteschlange“-Strip nur noch bei Ablauf (mit Schritten); einfacher Queue-Druck zeigt nur DRUCKT.

Behoben

  • Queue zu früh „Fertig.“: Nach Start bleibt Phase starting, bis Moonraker printing meldet — alter complete/standby schließt den Job nicht mehr.

[3.5.0] – 2026-10-19

Neu

  • Doku: interne Makro-Referenz docs/internal/Makros-Kobra.md (Nicht-tun, Vanilla-Klipper-Alltag, ACE, LeviQ/Wipe für S1 und K3).
  • Pagination: Dateien, Protokoll, Material, Aufträge, Warteschlange, Aktivität, Projekte — max. 40 Zeilen pro Seite (Zurück/Weiter).
  • Logging: log_level in der Config; Kernpfade schreiben nach stdout (unter systemd → journalctl -u grotti).
  • Debian-Paket: packaging/build-deb.sh baut .deb mit venv, systemd-Unit und PostgreSQL-postinst (Peer-Auth). Anleitung: docs/Anleitung-Installation-Pi.md.

Geändert

  • Config: GROTTI_CONFIG bzw. /etc/grotti/config.json für Paket-Install; sonst Repo-config.json.
  • README: Banner, Badges, Feature-Übersicht und Community-Screenshots oben; Setup/API darunter; Pi-.deb-Hinweis.

Behoben

  • Queue „braucht Eryone PLA Lite“ trotz PLA-Spule: Basis-Profil (ohne Meta/Matte/Silk) matcht nach Typ; Slice-Hex-Farbe (#26A69A) blockiert Lagerfarbe „Grau“ nicht mehr.
  • Dateien Info-Popup: Details-Popup wird nicht mehr vom Bibliothek-Scroll abgeschnitten; Position fixed mit Flip nach oben, besserer Kontrast.

[3.4.0] – 2026-10-18

Neu

  • Dateien: Umbenennen in der Bibliothek (Stift-Icon; Endung bleibt erhalten).

Behoben

  • Queue „druckt schon“ bei Folgejobs: Einfach-Druck bleibt running bis Moonraker fertig — nicht mehr sofort done nach Start (sonst startete der nächste Job zu früh).
  • Bedarf „443 g fehlen“ trotz voller Spulen: Slice-Farbe #26A69A matchte nicht Lagerfarbe „Grau“ → Rest 0. Bei Hex-Farbe zählt jetzt der Rest gleicher Sorte; archivierte Spulen nicht.
  • Falsches „Material nachlegen“ bei manueller Pause: Anycubic meldet active_filament.empty=true auch ohne Runout (tool/gate = −1). Heuristik nur noch bei Meldung/reason_for_pause/10107, aktivem Tool + differenziertem gate_status, oder G-code-Store.
  • gklib 10111 nach Einfarbig-Upload: Orca-Zeile ; filament_colour_type wird beim Senden entfernt (nur Einfarbig; Multicolor unangetastet).
  • Protokoll „druckt“ nach Offline: Live-Läufe werden bei anhaltendem Offline als interrupted geschlossen (z. B. gklib-Shutdown).
  • Sorte „Sunlu PLA“ vs. Eryone PLA: Basis-Profil ohne Meta/Matte/Silk matcht nach Material-Typ (Marke egal); Varianten bleiben streng.

[3.3.0] – 2026-10-18

Neu

  • Projekte /projekte: Arbeitsmappe mit Ordner unter dem Slice-Pfad (projects.folder); G-code-Zuordnung per Sync; Upload weiterer Dateien (STEP/STL/PDF/…); Nav unter Verwalten.
  • Dateien: Uploads in Slice-Ordner verschieben (werden Watch); Löschen für Upload und Watch (nur unter Slice/eingang); kompaktere Bibliothek-Filter.
  • Material: Filter Sorte/Farbe; leere/archivierte Spulen ausgeblendet (Filter Archiv); Buttons Leer, Archivieren, Wiederherstellen (archived_at).
  • Wand: kleines Kamera-Snapshot-Thumb auf jeder Karte (nie Stream); Menüpunkt Kameras entfernt, /kameras → Wand.

Geändert

  • Technik-Cockpit: kompakte Fact-Chips; Steuerung in Gruppen Heizung / Druck / ACE-Plätze.
  • Protokoll: kurze Dateinamen, festere Spaltenbreiten.
  • Statistik: kompakte Filter inkl. Farbe, Auto-Laden, KPI Primär/Sekundär.
  • Orca-Login: Session 30 Tage (überlebt App-Fenster schließen); kein zweites Chrome mit demselben Profil (sonst erneutes Anmelden).
  • Druckbericht: Kosten-Torte und Tabelle inkl. Filament (nicht nur Strom); Summe = Material + Energie.
  • Dateien: Starten / Einreihen / Ablauf mit einem Klick (kein Zwei-Klick mehr). API weiter mit confirm: true.
  • Senden: Zwei Start-Modi statt drei — Dieser Drucker (frei → sofort, sonst Warteschlange) und Nächster passender (Grotti wählt nach Sorte).
  • Material-Routing: Match auf Katalog-Sorte aus Orca-filament_settings_id (PLA Meta ≠ Matte ≠ Silk); falsche Variante wartet mit Grund. Farbe bleibt soft. Bei Auto-Wahl baut Grotti die ACE-Map aus den Spulen am Claim-Drucker. Bestehende Dateien: Dateien neu lesen.
  • Wand: Bei Filament-Pause Hinweis, die neue Rolle unter Material dem Drucker zuzuweisen — sonst zählt der Verbrauch weiter zur alten Spule.
  • Anleitung Material/ACE: Rollenwechsel während Pause klargestellt.

Behoben

  • Orca/Anycubic öffnet zwei Browserfenster: Nachbearbeitung läuft oft 2× — Debounce (~25 s) öffnet nur noch eines. Deep-Link lädt fehlende paint_index nach (ACE zeigt sonst fälschlich T0/T1).
  • Dateien-Tab hängt nach Orca: 3D-Pfad erst nach ACE/Senden (Idle); Debounce ignoriert Anycubic-Zeitstempel im Dateinamen; erneuter Export aktualisiert den offenen Tab statt ein zweites Fenster.
  • Orca/Anycubic → Desktop-Fenster: orca_senden öffnet Grotti als Chrome/Edge-App (browser: app). Anycubic-Dialog nur vermeiden durch G-code exportieren, nicht Remote Print / Aufgabe starten.
  • Anleitung Orca: Grotti unter Gerät per Device-UI-URL (http://127.0.0.1:8770/); Upload-zum-Host weiter meiden.
  • ACE-Map mit Lücken-T (Bambu/Anycubic): UI behält Slicer-Tn (z. B. T1+T10). Beim Senden verdichtet Grotti auf T0…n und schreibt passende .acm — sonst gklib 10011700 invalid filament id bzw. Hang bei Map-Mismatch. Senden prüft Map gegen T-Befehle. Bestehende Dateien: Dateien neu lesen.
  • 10011700 trotz dichter UI-Map: Verdichtung hängt am G-code (T1/T10), nicht daran, ob die Map schon 0/1 zeigt — sonst blieb T10 auf dem Drucker. Grotti neu starten, Clip erneut senden.
  • Abräumen ließ Lauf offen: Urteil und Platte waren quittiert, der Live-Lauf blieb in_progress (Moonraker-History oft ohne Endzeit). Abräumen und Watcher (printing→complete) schließen den Lauf jetzt als completed inkl. Materialabzug.
  • Rollenwechsel während Pause: Einlegen hängt Abschnitte/Ereignisse auch an offene History-Jobs (nicht nur live:). Send-Spule und Lauf-Spule werden mitgezogen; Abzug bevorzugt die Rolle am Drucker statt eines veralteten Send-Hints.

[3.2.0] – 2026-10-18

Neu

  • Jetzt-Liste / Topbar-Chips / Mobile-Tab /jetzt: Platte räumen, Queue-Fehler, Bedarf, Wartung, Aufträge, Material-Wartegründe; Farm-ETA; Filament-Pause → „Material nachlegen“.
  • GET /api/v1/jetzt, GET /api/v1/prognose, GET /api/v1/suche (Ctrl+K).
  • Filament-Pause: Pause + ACE/mmu/Runout-Hinweis → Event spule, Jetzt-Eintrag, Alert.
  • Druckbericht: Strom-Aufschlüsselung (Grundlast / Düse / Bett / Trockner) mit Tortendiagramm.
  • Material-Routing: „Nächster freier“ bevorzugt passende Rolle/Farbe/Rest; sonst Wartegrund in der Queue.
  • Termine (due_at) sortieren die Warteschlange vor der Priorität.
  • Auto-Retry (einmal, Einstellung) bei Queue-/Ablauf-Fehler.
  • Gleich nochmal drucken im Abräumen-Dialog.
  • Tagesbericht 7 Uhr (Telegram/ntfy) und Push bei Wartung fällig, Bedarf, Auftrag überfällig.
  • Kosten pro Teil und Stück-Yield in Bericht, Auftrag und Statistik.
  • Undo-Toast beim Entfernen aus der Warteschlange; Ctrl+K-Suche.
  • Design-Polish: Lucide-Icons (icons.svg), Schrift Inter, Tokens/Komponenten; Topbar und Sidebar-Gruppen.
  • Kamera-Stream: Snapshot oder MJPEG in Einstellungen und auf der Kameras-Seite.
  • Community-Screenshots unter docs/community/.
  • Einstellungen: Abschnitts-Navigation, Autosave, Drucker als Karten mit Dialog.
  • Cockpit: Alltag oben, Technik-Fold (Steuerung, Verlauf, 3D, Bettnetz) standardmäßig zu.

Geändert

  • Live-Status in der Topbar (Chips + Popover); Mobile-Tab Jetzt.
  • PA12-CF in Grotti als PA12-CF; am ACE als PA6-CF (ACE kennt den Typ nicht).
  • Falsche Sorte warnt in Dateien, hält die Queue nicht an; zu wenig Rest blockiert weiter.
  • Alert-Hygiene: spule/start/auth quiet; Sidebar-Label „Meldungen“.
  • Status als Chip; Einstellungen-Nav mit Icons; Autosave; Light-Theme; tabular-nums.
  • Begriffe: Queue-Eintrag = Druck; Empty-States mit Handlung; Primär-/Danger-Buttons.
  • Cool-Park blockiert den Queue-Tick nicht mehr (Worker).
  • Kunden und Positionen bearbeiten/löschen unter Aufträge.
  • projekte.html / ideen.html entfernt (Redirect bleibt).

Behoben

  • Bedarf/Wartung/Auftrag-Spam: Ops-Alerts Dedup-Art und Event-kind stimmten nicht überein (jede Minute derselbe Hinweis).
  • Platte belegt nach Neustart: Watcher setzte bereits Quittiertes wieder auf needs_clear.
  • „Pausiert“ nach Abbruch/Offline: Live-Lauf blieb offen bei Offline→standby.
  • Regal-Modus: Sidebar-Menü unter Desktop-Breite ausgeblendet.

[3.1.0] – 2026-10-18

Neu

  • Bedarf in der UI: Sidebar-Warnung, Karte unter Material, Chip in der Warteschlange.
  • Start-Zeitfenster je Drucker in den Einstellungen (Queue nur im Fenster).
  • HT/NT-Tarif in den Energie-Einstellungen.
  • ntfy-Test wie bei Telegram.
  • Helles Theme (Dunkel / Hell / System) pro Browser.
  • Statistik: Balkendiagramme Druckzeit/Verbrauch, Empty-State ohne Daten.
  • Wartung: KPIs, Empty-State, Reset mit Bestätigung (armButton).

Geändert

  • Cockpit und Warteschlange nutzen SSE/createPoller statt hartem 5‑s-Intervall.
  • Shared-config.token wird nicht mehr als Auth akzeptiert — nur noch Session und grt_…-Tokens.
  • Legacy-Alias GET /api/drucker entfernt (nur /api/v1/drucker).

Behoben

  • SSE unter waitress: Hop-by-Hop-Header Connection entfernt (sonst Fehler auf /api/v1/stream).
  • Bedarf: Material/Farbe aus files.filaments statt nicht existierender Spalten.
  • Chrome: Service-Worker lieferte bei Fehlern die Startseite statt der angeklickten Route; „Mehr“-Dialog blockierte die Navigation; SSE und Poller liefen parallel und stauten Verbindungen.

[3.0.0] – 2026-10-18

Major: neue Tabellen (Aufträge, Wartung), Projekte/Ideen → Aufträge, Navigation umgebaut, Dev-Server → waitress, Schema über Migrationen.

Vor dem Update: pg_dump der Datenbank. Danach Grotti starten (Migrationen 003–009 laufen automatisch).

Neu

  • Aufträge: Kunden, Positionen (Datei × Menge), Fortschritt, Einreihen, Lieferschein; Migration aus Projekten/Ideen; API /api/v1/kunden, /api/v1/auftraege; MCP-Lesetools.
  • Ausschuss-Pflicht: Dialog beim „Platte geräumt“ (Urteil, Grund, Stückzahlen).
  • Wartung: Laufzähler und Verschleißteile, Seite /wartung.
  • Bedarf: Queue vs. Spulenrest (GET /api/v1/bedarf).
  • ntfy neben Telegram; Backup-ZIP (pg_dump + data/); Zeitfenster je Drucker; optional HT/NT-Tarif.
  • SSE Live-Stream /api/v1/stream, Verbindungsbanner, PWA-Manifest/Service-Worker.
  • Migrationen unter grotti/migrations/, Connection-Pool, Indizes, Sample-Retention.
  • Mobile-Nav mit „Mehr“-Sheet; Anleitungen Aufträge und Wartung.

Geändert

  • Server: waitress; Threads starten in server.main().
  • Navigation: Aufträge statt Projekte/Ideen; Wartung; Dateien-/Statistik-Icons.
  • Kontrast --faint, prefers-reduced-motion, Touch-Ziele, Print-CSS.
  • Upload-Whitelist, Host-Validierung, ProxyFix, Settings-Lock, ?token= nur Bilder.
  • Spulenabzug History ohne blinde Rate; Chargen-Locks; MCP temp/percent.

Behoben

  • Hängende Queue-Starts nach Neustart; Worker-Rollback; snapshot()-Exceptions.
  • Toast-Dedupe; ACE-Map bei Send-Vorbereitung; Spulenwarnung mit ACE.

[2.10.0] – 2026-10-18

Neu

  • Einstellungen: Slice-Ordner (watch_dir) setzen; Repo-Ordner slice/ als Standard (Inhalt gitignored).
  • Orca-Nachbearbeitung: scripts/orca_senden.py lädt den Export nach Grotti und öffnet /dateien?file=… (Drucker, ACE, Einreihen in der UI); Anleitung unter Doku.
  • Bibliothek: Ordner unter dem Slice-Pfad anlegen und Watch-Dateien verschieben (ID/Projekt bleiben); API …/dateien/ordner, …/verschieben.
  • Bibliothek: Filter Material und Ordner, Sortierung (Neueste / Name / Material / Ordner / Druckzeit / Gewicht), Suche auch in Material und Projekt; Filter bleiben im Browser; Gruppenköpfe bei Sort Material/Ordner.
  • Cockpit: Verlauf (Temp/ED) des aktuellen oder letzten Drucks, Link zum Bericht; gemeinsame Chart-Hilfe in api.js.
  • Druckbericht-Verlauf: Zeitachse (links °C, rechts ED %), gestrichelte Soll-Linien, Einschaltdauer Düse/Bett; Aufheizen wird dichter erfasst.
  • Stromschätzung aus ED: Einstellungen → Düse-/Bett-Watt; Bericht zeigt kWh (ED oder pauschal).
  • Einstellungen → Dieser Browser: Zeitzone für Anzeigezeiten (Browser automatisch oder z. B. Europe/Berlin).

Geändert

  • Energie-Defaults: Grundlast 40 W (Elektronik), Düse 60 W, Bett 220 W; Hinweis in den Einstellungen, wenn Düse/Bett 0 (nur pauschal).
  • Druckbericht: Start/Ende als lesbare Ortszeit (17.10.2026, 15:09 – 15:46) statt ISO.
  • Sidebar Läuft jetzt: eine Zeile pro Drucker (Name · % · Fertig-Uhr), Fortschritt in der Zeile; Klick öffnet die Warteschlange, × bricht ab.
  • Spulenakte: KPI-Kacheln statt Fließtext; Druckzeilen mit Datum, Charge D-…, Kurzname, Gramm und Status.
  • Material-Spulenformular: Marke, Chargen und Technik unter „Weitere Angaben“ eingeklappt.
  • Druck-Etikett: „Soll … g“ statt „Ziel“ (Slicer-Filamentmenge, wie im Bericht).
  • Tasten-Grenze im Ablauf: dokumentierter Default 3 mm (kalt an der Düse sonst Fehlalarm); Anleitung und Technik-Notiz angepasst.
  • requirements.txt mit festen Versionen; requirements-dev.txt mit pytest.
  • Unbenutzte Helfer entfernt (printers.load_printers, Mesh-Vergleich 3×3, fetch_bed_mesh, last_sample_at, …).

Behoben

  • Druckbericht: Objekt-Etiketten kollidieren nicht mehr, wenn dieselbe Chargennummer schon an einem anderen Lauf hängt (Seite /protokoll/<id> lieferte 500).
  • Orca-Nachbearbeitung: Export unter dem Slice-Ordner (inkl. Unterordner) wird als Watch-Datei übernommen statt flachem Upload; Temp-Dateien .gcode.pp erkannt.
  • Material: Rest-Gramm im Spulenformular akzeptiert Dezimalwerte (Abzug lieferte z. B. 501,34 g — Browser blockierte bei step=1).

[2.5.1] – 2026-10-17

Neu

  • Cockpit-Steuerung: ACE-Trockner starten/stoppen (Temp, Dauer), nur wenn ein ACE hängt.
  • Cockpit-Steuerung: bestückte ACE-Plätze mit Sorte und Farbe aus Grotti an den Drucker schreiben.
  • Wand-Kacheln zeigen das Druck-Vorschaubild (Moonraker-Thumbnail) in der Job-Zeile.
  • Druckbericht /protokoll/<id>: Soll/Ist-Gramm, Spulenanteile, Temperaturverlauf, Ereignisse, Charge.
  • Statistik /statistik: Auslastung, Erfolg, Verbrauch, Ausschuss, Schätztreue; CSV-Export.
  • Spulenakte unter Material: verdruckte Gramm, Ausschuss, Leer-in aus dem Wochenverbrauch.
  • Etiketten pro Druck oder Objekt (D-YYYYMMDD-nnnn), QR auf den Bericht; Scan von D-… öffnet den Bericht.
  • Spulenabzug nach Ist (filament_used); Abbruch nur anteilig; Mehrfarb-Anteile als Schätzwert; Rest darf ins Minus.
  • Rollenwechsel während Druck/Pause (Einlegen) teilt den Verbrauch in Abschnitte.

Geändert

  • Statistik: Zeitraum per Knopf (Tag, Woche, Monat, Gestern, Letzte Woche, Letzter Monat, Alles); Bis-Datum zählt inklusiv; CSV übernimmt denselben Filter.
  • Druck-Charge D-… wieder während des Laufs (Protokoll, Wand-Etikett, Bericht); Adoption übernimmt die Nummer auf den History-Job. Ausschuss: gedruckte Bögen verwerfen, Charge bleibt.
  • Dateien → ACE-Zuordnung: Platz-Dropdown zeigt bei bekannter Spule Material, Farbe, Name und Restgramm.

Behoben

  • Spulenakte blieb leer: Abzug schrieb oft kein run_spools (hängende History-Läufe, Abzug vor Akte-Tabelle); Nachzug ohne erneuten Rest-Abzug, Abzug schreibt run_spools vor deducted.
  • Protokoll: keine Doppel-„druckt“-Zeilen mehr (Live + History); Watcher hängt am History-Job, sobald Moonraker ihn kennt; Liste blendet überzählige Live-Zeilen aus.
  • Platte geräumt: needs_clear nach Watcher-Ende und History-Sync (nur wenn kein Live-Druck); neuer Druckstart bricht alte Live-Läufe ab.
  • Druck-Etikett: Material schon während des Laufs (Send/ACE/Spule); QR bleibt im 70‑mm-Bogen.
  • Druckstart: Dateien mit altem stored_path (z. B. nach Umzug von 3DP/…/Uebersicht nach Grotti) werden unter data/eingang/<name> wiedergefunden statt „liegt nicht mehr auf der Platte“.
  • Wand/Sidebar: Dateiname springt nicht mehr alle paar Sekunden, wenn Moonraker kurz keinen Namen liefert; 3D-Pfad-Caption flackert nicht mehr mit „wird gelesen …“.
  • Dateien: Hinweis zu fehlendem ACE-Trailer nur noch bei Mehrfarb (nicht als Warnung bei Monoteilen).
  • 3D-Pfad wirkte gesprenkelt: Ausdünnen behält ganze Schichten dicht (statt Stichproben entlang der Bahn); keine Parallel-Offsets.
  • Toolpath-API mit Cache-Control: no-store, damit der Browser keinen alten Pfad behält.
  • Senden: Dateinamen mit Nicht-ASCII (z. B. CJK) werden für Moonraker/Rinkhals auf ASCII normalisiert — sonst Fehler 10115 „gcode … not found“.

[2.2.2] – 2026-10-15

Behoben

  • 3D-Pfad: bei großen G-codes zerbrach das Ausdünnen die Segment-Paare — Viewer zeigte nur Objekt-Umrisse, keinen Druckfortschritt (grün/grau).

[2.2.1] – 2026-10-15

Geändert

  • Anleitungen mit relativen Bild- und Kapitelpfaden (../web/static/doku/…, Anleitung-*.md), damit Screenshots und Querverweise auch auf Git lesbar sind; die App schreibt sie beim Rendern auf /static/… bzw. /doku/… um.

[2.2.0] – 2026-10-15

Neu

  • Benutzerverwaltung: lokaler Login (Admin/Operator), Bootstrap „Ersten Admin anlegen“, Session-Cookies, CSRF, Login-Rate-Limit.
  • API-Tokens (grt_…) unter Einstellungen für App, Home-Automation und MCP; Shared-config.token bleibt als Migrationsbrücke (Admin).
  • MCP-Server (python -m grotti.mcp_server): Lesen + bestätigte Steuer-Tools; GROTTI_MCP_READ_ONLY; Doku docs/internal/MCP.md.
  • OIDC-Platzhalter in Config (oauth) für späteren Anschluss.
  • Schema: users, api_tokens, oauth_identities.
  • Logo / Favicon: Markenzeichen in der Sidebar und als Favicon (web/static/brand/).
  • Login: statt Nutzhinweis wechselnde Ingenieurszitate (ein Zitat pro Tag).
  • Umfangreiche Bedienungsanleitung unter /doku (docs/Anleitung-*.md) mit UI-Screenshots.
  • Task-Hygiene wie Rinkhals (Kobra 3 und S1): ensure_task_free vor Start; bei 10101 cancel + Retry.
  • Live-Snapshot anycubic_task auf der Wand.
  • Cursor-Regel .cursor/rules/grotti.mdc.

Geändert

  • /doku zeigt nur noch Anleitung-*.md; Technik/Debug unter docs/internal/ (nicht in der App). Changelog nicht mehr in der UI.
  • Anleitungen ohne interne Stack-/Debug-Details.
  • HTML und API hinter Auth (außer Setup/Login); kein Token mehr im Meta-Tag.
  • Kamera im Cockpit: Layout-Klassen bleiben erhalten; ohne erreichbare Webcam kein Platzreservierung; has_camera im Drucker-Payload.
  • POST /api/v1/druck-queue braucht confirm: true (wie Senden).

Behoben

  • Cockpit: periodisches Layout-Ruckeln durch className-Reset der Kamera-Folds.
  • Kameras-Seite und leere Flotte: echte Empty-States statt Raw-API-URL / leerem Raster.
  • Spulen-Etikett: QR-Code wieder sichtbar — qrcode.min.js lokal.

[2.0.0] – 2026-10-15

Neu

  • Einstellungen: FQDN (öffentliche Basis-URL) für QR-Codes auf Spulen-Etiketten; leer = Request-Host.

Geändert

  • Umbenennung Farm → Grotti, eigenes Repo.
  • Python-Paket farm/ → grotti/, Ausnahme GrottiError, Standard-Datenbank grotti.
  • Oberfläche, CSS (grotti.css), G-code-Viewer und localStorage-Schlüssel (mit Fallback von farm-display).
  • Doku-URLs ohne Farm--Präfix (/doku/Abraeumen, …).
  • Git-Tags vX.Y.Z statt farm-vX.Y.Z.

Behoben

  • Schieben: nach hinten nicht mehr mit G0 Z2 F3000 (Vollgas) senken — langsam F400; vor dem Senken Z ≥ ~15 mm prüfen.
  • Abkühlen: Slice-Ende hebt Z nicht — Park relativ Z+40, gekappt gegen toolhead.axis_maximum Z. Hub wird geprüft; sonst Abbruch vor Schieben.

[1.4.0] – 2026-10-15

Neu

  • Anzeige Desktop / Regal (Touch) in Einstellungen (nur dieser Browser, localStorage); Shortcut ?shelf=1.
  • Seitenmenü einklappbar (Icon-Rail).
  • Bibliothek: G-code-Footer-Metadaten (slice_meta: Schicht, Düse, Temps, …); Chips + Info-Popup.
  • Warteschlange zeigt Direktstarts unter „Läuft“ (wie Sidebar „Läuft jetzt“).
  • Cockpit: Bauraumtemperatur und zusätzliche Lüfter wenn Moonraker sie liefert; Icons für Düse/Bett/Lüfter.
  • Ablauf: Three.js-Draufsicht der Schiebe-Bahn.
  • Seitenfuß: © by [email protected].
  • Interne Notizen zu Markt, Recht und Homepage unter intern/ (nicht unter /doku).
  • Doku: Voraussetzungen (Moonraker, Kobra 3 und Kobra S1) und Haftung (Entwurf).
  • Statische Homepage-Vorschau site/index.html. Die Wand unter / bleibt.
  • Doku Abräumen: Slice-Ende Kobra 3 Present X250 Y220 + M84; Farm entfernt M84 bei Ablauf mit Cool/Sweep.

Geändert

  • Cockpit ohne leere Kamera-Fläche wenn Kamera zu oder fehlt (cam-collapsed, eine Spalte).
  • Schieben: Default/Limit Y hinten 250; Tasten-Grenze vorübergehend 3,0 mm (Düsen-Klumpen).

Behoben

  • Druckwarteschlange startete nur einen Drucker pro Tick (~8 s). Mehrere freie Drucker starten jetzt im selben Durchlauf parallel (Upload je Host im Worker).
  • Nach Druckstart kurz „Platte belegt“: needs_clear wurde schon beim Start gesetzt. Jetzt erst bei Druckende (Watcher); Streifen bleibt während Heizen/Queue ausgeblendet.
  • Abräumen robust: M84 aus Upload streichen; Idle während Druck/Cool; nach M84 SET_KINEMATIC nur mit echter XYZ; Schieben erst Y hinten dann Z; kein Extra-Mitten-Pass; Tasten mit Mesh/Result is z= (keine Fake-Z).
  • Abkühlen-Park: Retry + Meldung; Anzeige zeigt wieder Warte-Temps (nicht nur „Mitte“).
  • Druckstart: Worker weg → erneut starten; kein Jump auf Cool bei stale complete; kurzes Moonraker-cancelled beim LeviQ zählt nicht; keep_motors/row-Bug behoben.

[1.3.0] – 2026-10-14

Neu

  • Cockpit: Objekte ausschließen (Klipper Exclude-Object) — Polygone im 3D-Pfad, Liste, Zwei-Klick → EXCLUDE_OBJECT (Whitelist, nur printing/paused). Ohne [exclude_object] oder DEFINEs bleibt das Panel aus.
  • Seite Warteschlange: wartend, laufend, Fehler und Historie; Priorität und Abbrechen.
  • Automatik-Schalter und Drucker „gesperrt“ (Einstellungen): kein neuer „wenn frei“-Start.
  • Spulen an den Ort: Unique-Platz je Drucker, Auflösung beim Start, Material-Prüfung Datei vs. Rolle, „Einlegen“/„Ins Regal“, Material-Liste nach Ort.
  • Senden zeigt eingelegte Rollen je Ziel-Drucker statt freiem Spulen-Dropdown; Projektwahl im Flow.
  • ace_map und Bettnetz in sends für „Nochmal“; Protokoll-Select sortiert nach Drucker.
  • three.js lokal; Toolpath-Cache unter data/toolpath/; Tests unter tests/.
  • Watcher: Protokoll-Abgleich und Spulenabzug nach „fertig“; ACE-Abzug anteilig je Platz.
  • Seitenleiste „Aufgaben“: Drucker mit belegter Platte, die kein Ablauf räumt, mit Knopf „geräumt“ (Zwei-Klick). GET /api/v1/aufgaben.
  • Gestoppter Ablauf lässt sich in der Seitenleiste ab dem Schritt fortsetzen, an dem er stand (▶).
  • Druckerkarte zeigt einen gestoppten Ablauf als roten Streifen mit „Weiter ab …“ und „Verwerfen“.

Geändert

  • 3D-Pfad: freieres Orbit, Zoom delta-basiert (Chrome), Schwenken/Pinch, Doppelklick-Reset; gedruckt leicht verdickt, Rest transparent; Fortschritt nach Datei-progress; Toolpath version 5 (segmenttreu, E.39/Z.6); Bettgitter 10 mm mit mm-Sprites und Legende.
  • UI-Polish: konsistentes Icon-Set (Lucide-Stil), kürzere Microcopy, einheitliche Seitenköpfe/Buttons, kompakte Tabellen, Formular-Feldraster, Empty-States, ruhigere Sidebar und Mobile-Nav.
  • Material: Reiter Spulen / Sorten. Spulen-Liste ohne dauerhaft offenes Formular. Sorten CRUD per API. Ort zeigt Drucker + ACE/extern. Scan im Seitenkopf.
  • Bestätigungen überall Zwei-Klick (armButton), Rückmeldungen über Toast. Wortwahl „offline“ / „Auslastung“ vereinheitlicht.
  • Ablauf-Standard: Drucken → Abkühlen → Schieben → Tasten (Mesh aus, relativ +5 mm, PROBE Mitte, kein G28 Z, danach Lift z_clear).
  • Drucker-Details als Cockpit: Kamera, Status, Steuerung, 3D-Pfad, Bettnetz; zuklappbar (farm-desk-closed).

Behoben

  • Cockpit: Kamera-Polling ließ no-cam und Layout ruckeln; 3D-Orbit sprang zurück. Kamera lädt vor und behält das letzte Bild; Pfad setzt die Ansicht nur beim ersten Laden zurück.
  • Toolpath-Parser ignorierte E.39/Z.6 ohne führende Null — Extrusion/Infill fehlten fast komplett.
  • Ablauf hing nach Farm-Neustart bei „tastet Mitte…“ / „räumt ab…“: Worker fehlte, Phase blieb stehen — Schieben/Tasten starten erneut.
  • Kameras-Seite holte live=0 und zeigte alle Drucker als „weg“.
  • Steuerung setzte Flow immer auf 100 %; jetzt extrude_factor vom Drucker.
  • E-Stop nur noch bei aktivem Druck, Zwei-Klick, Hinweis auf Strom aus/an.
  • Ablauf: Phase starting vor Upload, Timeout wenn der Druck nicht anläuft; lange Schritte in Worker-Threads.
  • „Nächster freier“ übernahm die ACE-Map eines anderen Druckers.
  • Drucker Host ändern/löschen zieht Queue, Ereignisse und bed_status mit.
  • Live-Zustand kommt vom Watcher (eine Quelle).
  • Summary „frei“ ignorierte belegte Platte; Queue-Status von außen nicht mehr frei auf done setzbar.
  • „Läuft jetzt“ zeigte nur Queue-Aufträge; Direktstarts stehen mit Fortschritt dabei.
  • Abkühlen: Idle-Timeout / SET_KINEMATIC_POSITION, Anzeige mit Zielwerten, Düse zur Mitte, M107 nach Schieben.
  • MQTT-Druckstart-Timeout vs. info/query taskid; Prüfen/Timeouts/Bettnetz; Karten- und Sidebar-Randfälle.

[1.1.0] – 2026-10-13

Neu

  • Live-Leiste in der Sidebar: „Läuft jetzt“, „Wartet“, „Alerts“ und „Senden“ mit Zählern, scrollbar, immer sichtbar.
  • Druckerkarte zeigt laufenden Ablauf mit Schrittleiste (Drucken, Abkühlen, Schieben, Prüfen), Wiederholung und Abbrechen; wartende Jobs je Drucker.
  • Seite Aktivität: alle Ereignisse als Zeitstrahl, Filter nach Drucker, Art und Zeitraum.
  • Ereignisse für jeden Ablauf-Schritt, jede Wiederholung, geräumte Fehler und Abbrüche (Art ablauf). Telegram dafür abschaltbar (Standard aus).
  • Senden als Flow: Datei, Ziel (Drucker-Chips mit Live-Zustand), Start (Jetzt, Wenn frei, Nächster freier) mit Zwei-Klick-Bestätigung. Ablauf als eigener Reiter.
  • Version im Sidebar-Fuß, GET /api/v1/version, dieser Changelog und die Technik-Doku unter /doku.
  • Designsystem: Zustandsfarben, Chips, Schrittleiste, Kacheln, Temperaturbalken, Hinweise, Toasts.
  • Ereignisse auch für Druckstart, Pause, Fortsetzen (Art start), Abbruch (Art abbruch), „wieder erreichbar“, Einreihen und Abbrechen von Hand.
  • GET /api/v1/ereignisse filtert nach host, kind (kommagetrennt) und since.
  • Dateien hochladen per Ziehen auf die Bibliothek.
  • Handbuch unter /doku mit Inhaltsverzeichnis; README.md für Einrichtung und API.

Geändert

  • Druckerkarte neu geordnet: Fertig-Uhrzeit groß, Fortschritt mit Prozent, drei Kacheln statt Zahlenzeile, IP und Mainsail im Detailteil.
  • Technik-Doku liegt jetzt im Tool unter docs/; das Tool ist vom übrigen Repo unabhängig.
  • Alerts in der Sidebar verlinken auf die Aktivität. Ablauf-Schritte und Starts zählen nicht als Alert (gleich als gelesen gespeichert).
  • Telegram-Schalter „Ablauf-Schritte“ und „Druckstart und Pause“ in den Einstellungen; Abbrüche laufen unter „Fehler“.
  • Die Queue räumt einen hängenden Fehler nur noch, wenn für den Drucker wirklich ein Auftrag wartet.
  • Auf dem Handy wird „Wartet“ ausgeblendet, solange nichts wartet.

Behoben

  • Queue und Ablauf waren in der Sidebar unter dem Bildschirmrand abgeschnitten.
  • Ereignisse gingen durch die 30-s-Entprellung verloren; entprellt wird nur noch Telegram.
  • Leeres homed_axes im Leerlauf galt als Fehler und blockierte Abläufe; hängender print_stats=error wird vor dem Start geräumt.

[1.0.0] – 2026-10-13

Erster festgehaltener Stand.

Neu

  • Druckerwand mit Live-Zustand über Moonraker, Kamera, Bettnetz, 3D-Pfad und leichter Steuerung (Temperatur, Speed, Flow, Lüfter, E-Stop).
  • Dateien: Bibliothek mit Suche und Filter, Upload, Ordnerüberwachung, Metadaten aus G-code und 3MF.
  • Senden im Hintergrund mit Fortschritt an mehrere Drucker, ACE-Zuordnung mit .acm, Bettnetz vor dem Druck per Anycubic-MQTT.
  • Warteschlange „wenn frei“ mit Priorität; Ablauf für Kobra 3 (Drucken, Abkühlen, Schieben, Prüfen, mehrfach).
  • „Platte geräumt“ als Quittierung, die „wenn frei“ freigibt.
  • Material, Spulen, ACE-Plätze, Etiketten; Projekte mit Kalkulation; Protokoll mit Spulenabzug und „Nochmal“.
  • Einstellungen: Druckernamen, Telegram-Alerts, Energie.

Behoben

  • Hängender Fehlerzustand: „Fehler löschen“ statt Firmware-Restart (GoKlipper deadlockt bei FIRMWARE_RESTART).
  • Heizung aus nach Druckfehler.
  • Rinkhals-Kopfzeile vor dem Upload, damit die Kobra die Datei nicht doppelt liest.
  • Nach Abbruch zusätzlich MQTT-Stop, sonst blieb der Anycubic-Task aktiv (10101).