# Changelog ## [0.9.20] – 2026-06-08 ### Neu - **Französische Sprachunterstützung (PR #45 von @Nathacks)** - **Z-Höhe in der Print-UI (PR #49 von @Nathacks).** Zeigt die aktuelle Z-Position in mm unterhalb des Layer-Zählers. ### Behoben - **Kamera-Autostart ignorierte das "Kamera bei Druckstart einschalten"- Setting nach einem Bridge-Restart (Issue #50).** Das Setting wurde in der Prozessumgebung gecacht — nach dem Speichern in der UI überlebte der alte Wert den Restart und der neue Wert aus `config.ini` wurde nicht gelesen. - **Kamera startete nach manuellem Stopp während eines Drucks automatisch neu (Issue #50).** Ein neues `_camera_user_stopped`-Flag unterdrückt den Autostart für die aktuelle Drucksitzung. Es wird beim Druckende zurückgesetzt. - **Falscher "Stream nicht verfügbar"-Fehler-Toast beim manuellen Kamera-Stopp.** Der Bild-Fehler-Handler war noch registriert als `img.src` geleert wurde. - **JS-Fehler (`ReferenceError: br is not defined`) beim Licht-Toggle.** Variable wurde aus dem falschen Scope referenziert. - Webcam-URLs sind jetzt absolut, damit Mobileraker/Obico-Clients sie erreichen können. ## [0.9.19.1] – 2026-06-04 ### Behoben - Standalone-Binaries (Linux/Windows) zeigten `vunknown` als Version. Die `VERSION`-Datei ist jetzt ins PyInstaller-Onefile eingebettet. - Bei fehlenden TLS-Zertifikaten (`anycubic_slicer.crt`/`.key`) gab es nur den rohen Fehler `[Errno 2] No such file or directory`. Die Bridge meldet jetzt klar, wo die Dateien hingelegt werden müssen und dass `anycubic-certs.zip` aus dem Gitea-Release stammt. ### Geändert - Filament-Profil-Liste neu kuratiert: 209 statt 399 Einträge. Profile die nur für drucker-spezifische Vendor-Bundles existieren (z.B. Eryone Thinker X400, Artillery M1 Pro, WonderMaker ZR, Tiertime, Cubicon, CoLiDo, Afinia, Snapmaker) sind rausgeflogen — OrcaSlicer hätte sie im Standard-Kobra-X-Setup beim Sync ohnehin nicht gefunden, weil die jeweiligen Vendor-Bundles nur bei aktivem Drucker-Vendor geladen werden. Für solche Filamente bleibt der Custom-Profile-Import (Issue #41) der Weg. ## [0.9.19] – 2026-06-02 ### Neu - **🎯 Filament-Sync mit OrcaSlicer matched jetzt das richtige Preset** statt immer auf „Generic PLA" zu landen. Voraussetzung: ein OrcaSlicer-Build mit dem [PR #13719](https://github.com/SoftFever/OrcaSlicer/pull/13719) Empfangs-Patch (im OrcaSlicer-KX-Build dabei). Die Bridge sendet pro AMS-Slot jetzt `name` + `vendor_name` im Lane-Pfad UND `gate_filament_name` im Happy-Hare-MMU-Pfad (OrcaSlicer wechselt bei AMS-Setups automatisch auf den HH-Pfad). - **Eigene OrcaSlicer-Profile in die Bridge importieren (Issue #41).** Settings-Tab → „OrcaSlicer-Profile" oder direkt im Slot-Edit-Dialog („★ Eigene Profile importieren…") lädst du deine `.json`-Files aus `~/.config/OrcaSlicer/user//filament/` hoch — einzeln oder als ZIP. Erscheint dann im Slot-Dropdown unter „★ Eigene Profile" und wird beim Sync an Orca als User-Match weitergegeben. Funktioniert über HTTP, also auch wenn die Bridge im Docker auf Raspi/NAS läuft und OrcaSlicer auf dem Desktop. Auch reine Override-Profile mit nur `inherits: "Generic PLA @System"` + ein paar Tweaks werden korrekt erkannt — die Bridge resolved die vererbten Felder aus dem System-Parent. ### Fixes - **AMS-Sync landete hartnäckig auf „Generic PLA":** das Orca- Datenmodell hat 68 duplikate `filament_id`-Werte (`OGFL99` allein 136 mal), und die Bridge wählte oft eine ID die für den Kobra X nicht `is_compatible` war (z.B. `GFL92` aus dem Kobra-2-Profil → Orca verwarf es). Generator priorisiert jetzt Kobra-X-Varianten und filtert Phantom-Profile (Cross-Vendor-Overrides) raus — `orca_filaments.json` von 1035 → 400 saubere Profile. - **Slot ohne expliziten Override sendet jetzt `Generic `** statt einer impliziten Vendor-Annahme. Library-Generic-Profile haben `compatible_printers: []` (= alle Drucker), sind also immer sichtbar und matchen verlässlich. - **Slot-Karte zeigt den Hersteller direkt nach dem Speichern** — ohne Browser-Reload. `poll()` war async, das Re-Render kam erst beim nächsten Tick. - **ACE-Trockner-Toggle warf 502-Fehler obwohl der Trockner ein-/aus- ging (PR #42 von @gangoke):** `setDry` jetzt fire-and-forget wie `setAutoFeed`. Der Drucker antwortet auf diesem Push-Topic mit `code: 0` statt `code: 200`, das hat die Bridge fälschlich als Fehler interpretiert. ### Datenmodell / API - `orca_filaments.json` regeneriert: nur echte Vendor-Profile und OrcaFilamentLibrary-Profile bleiben drin. Bambu/Polymaker/SUNLU- Library-Profile dabei, Qidi-Cross-Bundles raus. - Neue Endpoints: `POST /kx/filament/profiles/user` (ZIP/JSON-Upload), `GET /kx/filament/profiles/user` (Liste der User-Imports), `DELETE /kx/filament/profiles/user[?vendor=…&name=…]`. Persistenz in `/orca_filaments.user.json` (Volume — überlebt Image-Updates). ### Build - Neues Modul `bridge/orca_filaments.py` (gemeinsame Parser-Helfer für Generator und Import-Endpoint). - Dockerfile + release.sh um `orca_filaments.py` erweitert. ## [0.9.18] – 2026-05-31 ### Neu - **🎉 Filament-Material und -Farbe pro AMS-Slot aus der Bridge an den Drucker senden:** Im Slot-Edit-Dialog gewählte Werte gehen jetzt tatsächlich an den Drucker und werden persistent übernommen — am Drucker-Display siehst du sofort dieselbe Belegung wie in der Bridge-UI. In 0.9.17 wurde der Befehl über das falsche MQTT-Topic (`slicer/printer/…`) gesendet, der Drucker hat ihn stillschweigend ignoriert. Jetzt geht er über `web/printer/…` wie der Anycubic Slicer Next es macht (verifiziert via Live-MQTT-Sniff + Workbench-Vue-Source). **Achtung:** der Drucker muss im Idle-Zustand sein, und leere Slots lassen sich nicht beschriften. - **Mehrsprachiges UI – spanische Übersetzung von Muttersprachler überarbeitet (PR #40 von @pezfisk):** fehlende Akzente (impresión, cámara, después, animación, …), Begriffe vereinheitlicht (Pause → Pausa, Start → Iniciar, Layer → Capa). Plus neues `README.es.md` und Cross-Links in den drei READMEs. - **Z-Höhen-Anzeige in Obico** funktioniert jetzt. Der Drucker liefert keine echte Z-Position via MQTT (per Live-Sniff bestätigt), die Bridge schätzt sie aus `curr_layer × layer_height + first_layer_height`. Layer-Heights kommen aus dem GCode-Header beim Upload, persistiert im GCode-Store; Fallback aus dem OrcaSlicer-Default-Filename (`…_0.2_…gcode`). `/server/files/metadata` liefert zusätzlich `object_height` (Gesamt-Z), damit Obicos `mmProgress`-Widget `aktuelles Z / Gesamt-Z` anzeigt. - **Slot-Karte zeigt den OrcaSlicer-Profil-Vendor** unter dem Material (z.B. „PLA / Polymaker"), mit Profil-Namen + interner ID als Tooltip. So ist auf einen Blick erkennbar welcher Slot-Override aktiv ist. ### Fixes - **Slot-Profil-Auswahl im AMS-Dialog (Issue #39 von @harrygeier):** drei separate Bugs in 0.9.17 sorgten dafür dass die gewählte Marke nach dem Speichern verschwand und beim erneuten Öffnen ein falsches Material angezeigt wurde. - `multiColorBox/setInfo` über das falsche MQTT-Topic — siehe oben. - Speichern lief in zwei parallelen Requests (Profil-Override + Material/Farbe) → Race-Bedingung. Läuft jetzt sequenziell und reloaded den lokalen State bevor der Dialog geschlossen wird. - OrcaSlicer-Filament-IDs sind nicht eindeutig — `orca_filaments.json` hat 68 duplikate IDs, `OGFL99` allein ist 136 Vendor-Profilen zugeordnet (Erkenntnis von @gangoke). Der primäre Selector ist jetzt `(vendor, name)` — über alle 1002 Profile eindeutig. - **MQTT-Reconnect (Issue #33 von @icebear):** wurde der Drucker über Nacht ausgeschaltet, schlug die Bridge nach 5 Reconnect-Versuchen (~60 s gesamt) endgültig fehl — Filament-Sync ging morgens noch (weil das HTTP ist), aber Print-Start scheiterte mit „connection refused", User musste die Bridge selbst neu starten. Reader-Thread reconnectet jetzt **endlos** (Backoff cappt bei 60 s) bis der Drucker wieder antwortet, mit DEBUG-Logging nach den ersten 5 Versuchen damit das Log nicht über Nacht zugemüllt wird. - **„Unknown child pid"-Warnungen im Log:** beim Killen der Kamera- `ffmpeg`-Prozesse fehlte das `wait()` — Children blieben als Zombies und asyncio meldete sie alle ~20 s. Gefixt im CameraCache + `/api/camera/stream`. ### UI-Aufräumen - **Pause-Button als Toggle:** druckt der Drucker → `⏸ Pause`, ist pausiert → `▶ Weiter`. Der separate „Weiter"-Button entfällt. - **Pause + Stopp komplett ausgeblendet wenn Drucker idle** — bei Standby waren beide Buttons vorher dauerhaft sichtbar, was beim Idle-Drucker verwirrend wirkte. ### Build - **GCode-Store-Migration:** neue Spalten `layer_height` + `first_layer_height` in `gcode_files` (automatisch beim ersten Start von 0.9.18 angelegt). ## [0.9.17] – 2026-05-30 ### Neu - **🧪 Obico-Anbindung (experimentell):** Die Bridge spielt jetzt einen Moonraker, der vom [moonraker-obico](https://github.com/TheSpaghettiDetective/moonraker-obico) Plugin akzeptiert wird. Damit funktionieren Time-Lapse, Layer-aligned First-Layer-Scan und WebRTC-Live-Stream gegen einen (selbst gehosteten oder Cloud-) Obico-Server. **Hinweis:** Das KI-Modell zur Spaghetti-Erkennung ist auf seitliche Kamera-Winkel (Ender/Voron) trainiert — wie zuverlässig es beim Kobra X mit Top-Down-Kamera funktioniert, muss empirisch getestet werden (bei uns ging es schon ganz gut). Stream, Time-Lapse und Telemetrie laufen, die Failure-Erkennung ist deshalb noch als experimentell markiert. - **Mehrsprachiges UI (PR #37 von @gangoke):** Inline-Translations sind raus, stattdessen wechselbares Sprach-Dropdown mit Globe-Icon. Auto-Auswahl nach Browser-Locale, manuelle Wahl wird im LocalStorage gemerkt. Sprachen: 🇩🇪 🇬🇧 🇪🇸 🇨🇳 (ES + ZH-CN sind KI-übersetzt und noch nicht von Muttersprachlern geprüft). - **OrcaSlicer-Filament-Profil pro AMS-Slot:** Im Slot-Bearbeiten-Dialog kannst du jetzt ein konkretes OrcaSlicer-Profil (z.B. „PolyTerra PLA — Polymaker") pro Slot wählen — die Bridge sendet diese Information beim AMS-Sync mit, statt nur „Generic PLA". Die Profil-Liste wird aus dem OrcaSlicer-Source generiert (~1000 Profile, 43 Hersteller). Damit OrcaSlicer den Hint vollständig respektiert, wird ein passender Patch im OrcaSlicer-KX-Build folgen. - **H.264-Direkt-Stream:** Neuer Endpunkt `/api/camera/h264` liefert den Drucker-Kamera-Stream ohne Re-Encoding als MPEG-TS — Latenz drastisch reduziert, Bridge-CPU bei Obico-Stream von ~13 % auf ~3 %. ### Fixes - **Temperatur-Setzen über Bridge-UI / Obico löste Drucker-Systemfehler aus:** Per Live-MQTT-Sniff vom Anycubic Slicer Next korrigiert — der Befehl `tempature/set` braucht ein `type`-Feld (0=Nozzle, 1=Bett, 2=beide) und muss über das `web/printer/…`-Topic, nicht `slicer/printer/…`. Nozzle/Bett über die Bridge heizen jetzt sauber. - **Große GCode-Uploads (>50 MB) brachen mit Timeout ab:** Der Connect-Timeout vom Socket lief auch während des `sendall()` — bei ~200 MB über LAN brauchte das Schieben mehr als die 30 s und wurde fälschlich als Connect-Timeout abgebrochen. Jetzt sind Connect-, Send- und Read-Phase separat getimeoutet. - **Kamera-Snapshot war langsam und konnte sich mit dem Live-Stream blockieren:** Die Bridge hält nun einen zentralen Kamera-Cache (ein einziger ffmpeg-Prozess zieht vom Drucker, alle Konsumenten teilen sich den Stream). Snapshots kommen in ~1.3 ms aus dem RAM statt nach 1-2 s per neuer ffmpeg-Instanz. Behebt außerdem das Single-Client-Limit am Drucker (HTTP 429 bei parallelen Zugriffen). - **Sprachwechsel aktualisierte den GCode-Browser nicht:** Die in die File-Karten eingebackenen Texte („Drucken", „Schätzung", „Download") blieben in der alten Sprache. Beim Sprachwechsel werden die Karten jetzt neu gerendert. - **GCode Web-Upload + Download + Verify-Dialog (PR #32 von @gangoke):** Dateien können direkt im Browser hoch/runtergeladen werden, mit Warn-Dialog wenn ein nicht durch OrcaSlicer hochgeladener GCode gestartet wird. ### CI/Build - Multi-Arch Docker-Image (amd64 + arm64) per Gitea-Actions automatisiert. - Release-Build über lokalen CodeBuilder für alle drei Targets (linux-amd64, linux-arm64, windows.exe). ## [0.9.16] – 2026-05-22 ### Neu - **Kamera bei Druckstart automatisch einschalten:** neue Einstellung „Kamera bei Druckstart einschalten" — die Bridge startet den Kamera-Stream automatisch, wenn ein Druck beginnt (für OrcaSlicer und die Bridge-UI). ### Fixes - **Einfarbiger Druck durch leeren AMS-Slot blockiert:** OrcaSlicer schreibt alle konfigurierten Filamente in den GCode-Header, auch wenn das Modell nur eines nutzt — die Bridge meldete dem Drucker dadurch alle Farben als nötig, und ein leerer ungenutzter Slot brach den Druck ab. Die Bridge mappt jetzt nur die im GCode tatsächlich genutzten Filamente. - **Filament-Sync jetzt positionstreu:** Bei einem leeren Slot in der Mitte (z.B. Slot 1 gelb, 2 leer, 3 rot, 4 weiß) zeigte OrcaSlicer die Farben auf den falschen Slots. Behoben — leere Slots behalten ihre Position, und das Sync-Farbformat folgt der Happy-Hare-Konvention (RRGGBB ohne `#`). - **Slicer-Zeit + Thumbnail fehlten nach Browser-Reload** (oder bei Druckstart direkt aus OrcaSlicer): beide werden jetzt aus dem GCode-Store anhand des Dateinamens wiederhergestellt statt aus flüchtigem State. - **Deutsche Übersetzungslücken** im ACE-Trockner-Dialog behoben. ### Logging - Wiederholte Log-Zeilen werden als Zähler („×N") zusammengefasst statt zu spammen; Status-Poll-Verkehr wird nicht mehr auf INFO geloggt. - Neuer Level-Filter (Alle / Fehler / Warnungen), Toast bei neuen Fehlern, volle Tracebacks im Browser-Log und ein Download-Dateiname mit Zeitstempel. ## [0.9.15] – 2026-05-21 ### Fixes (Issue #29) - **UI im OrcaSlicer-Device-Tab kaputt:** OrcaSlicers eingebetteter Webview lädt nur das nackte HTML und ignoriert externe `