# Changelog ## [0.9.19.1] – 2026-06-04 ### Fixed - 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. ### Changed - 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 ### New - **🎯 Filament sync with OrcaSlicer now picks the right preset** instead of always falling back to "Generic PLA". Requires an OrcaSlicer build with the [PR #13719](https://github.com/SoftFever/OrcaSlicer/pull/13719) receive-side patch (included in the OrcaSlicer-KX build). The bridge sends `name` + `vendor_name` per AMS slot on the lane path AND `gate_filament_name` per gate on the Happy-Hare MMU path (OrcaSlicer switches to the HH path automatically for AMS setups). - **Import your own OrcaSlicer profiles into the bridge (issue #41).** Settings → "OrcaSlicer Profiles" or directly in the slot-edit dialog ("★ Import own profiles…") lets you upload `.json` files from `~/.config/OrcaSlicer/user//filament/` — single files or as a ZIP. They show up in the slot dropdown under "★ Own profiles" and are passed through to Orca on sync as user matches. Works over HTTP so the bridge can run in Docker on a Raspi/NAS while OrcaSlicer lives on a desktop. Override-only profiles with just `inherits: "Generic PLA @System"` + a few tweaks are detected correctly — the bridge resolves the inherited fields from the system parent. ### Fixes - **AMS sync stuck on "Generic PLA":** the Orca data model has 68 duplicate `filament_id` values (`OGFL99` alone shared by 136 profiles), and the bridge often picked an ID that was not `is_compatible` with the Kobra X (e.g. `GFL92` from the Kobra-2 profile → Orca rejected it). The generator now prioritises Kobra-X variants and filters out phantom profiles (cross-vendor overrides) — `orca_filaments.json` dropped from 1035 to 400 clean profiles. - **Slot without an explicit override now sends `Generic `** instead of an implicit vendor guess. Library generic profiles have `compatible_printers: []` (= all printers), so they are always visible and match reliably. - **Slot card shows the vendor right after save** without a browser reload. `poll()` was async, the re-render only happened on the next tick. - **ACE dryer toggle threw a 502 even though the dryer worked (PR #42 by @gangoke):** `setDry` is now fire-and-forget like `setAutoFeed`. The printer answers on that push topic with `code: 0` instead of `code: 200`, which the bridge wrongly treated as an error. ### Data model / API - `orca_filaments.json` regenerated: only real vendor profiles and OrcaFilamentLibrary profiles. Bambu/Polymaker/SUNLU library profiles in, Qidi cross-bundles out. - New endpoints: `POST /kx/filament/profiles/user` (ZIP/JSON upload), `GET /kx/filament/profiles/user` (list user imports), `DELETE /kx/filament/profiles/user[?vendor=…&name=…]`. Persisted in `/orca_filaments.user.json` (volume — survives image updates). ### Build - New module `bridge/orca_filaments.py` (shared parser helpers used by the generator and the import endpoint). - Dockerfile + release.sh updated to include `orca_filaments.py`. ## [0.9.18] – 2026-05-31 ### New - **🎉 Push filament material and colour from the bridge to the printer:** The values you pick in the slot-edit dialog now actually reach the printer and stick — the printer display shows the same slot setup as the bridge UI right away. In 0.9.17 the command was sent over the wrong MQTT topic (`slicer/printer/…`) and the printer silently dropped it. It now goes via `web/printer/…` like the Anycubic Slicer Next does (verified by live MQTT sniff + Workbench-Vue source). **Note:** the printer must be idle, and empty slots can not be labelled. - **Spanish translation reviewed by a native speaker (PR #40 by @pezfisk):** missing accents (impresión, cámara, después, animación, …) and term consistency (Pause → Pausa, Start → Iniciar, Layer → Capa). New `README.es.md` and cross-links between the three READMEs. - **Z-height now shows up in Obico.** The printer does not report a real Z position over MQTT (live-sniff confirmed), so the bridge estimates it from `current_layer × layer_height + first_layer_height`. Layer heights are parsed from the gcode header at upload time and persisted in the gcode store; fallback for prints started directly from the slicer is the OrcaSlicer default filename pattern (`…_0.2_…gcode`). `/server/files/metadata` also serves `object_height` (total Z) so Obicos `mmProgress` widget can render `current Z / total Z`. - **Slot card shows the OrcaSlicer profile vendor** under the material (e.g. `PLA / Polymaker`), with the profile name + internal ID as tooltip. Lets you see at a glance which slot override is active. ### Fixes - **Slot profile picker in the AMS dialog (issue #39 by @harrygeier):** three separate bugs in 0.9.17 caused the chosen brand to disappear after save and a different material to show up on re-open. - `multiColorBox/setInfo` was sent on the wrong MQTT topic — see above. - Save fired two parallel requests (profile override + material/ colour) → race. Now sequential, and the local state is reloaded before the dialog closes. - OrcaSlicer filament IDs are not unique — `orca_filaments.json` has 68 duplicate IDs, `OGFL99` alone is shared by 136 vendor profiles (caught by @gangoke). The primary selector is now `(vendor, name)` — unique across all 1002 profiles. - **MQTT reconnect (issue #33 by @icebear):** if the printer was powered off overnight the bridge gave up after 5 reconnect attempts (~60 s total) — filament sync still worked in the morning (its HTTP), but starting a print failed with `connection refused` and the user had to restart the bridge itself. The reader thread now reconnects **forever** (backoff caps at 60 s) until the printer responds again, with logs dropping to DEBUG after the first 5 attempts so an overnight outage does not spam the log. - **`Unknown child pid` warnings in the log:** the camera ffmpeg helpers were killed without awaiting their `wait()` — children lingered as zombies and asyncio reported them every ~20 s. Fixed in CameraCache + `/api/camera/stream`. ### UI polish - **Pause button is now a toggle:** while printing → `⏸ Pause`, while paused → `▶ Resume`. The separate resume button is gone. - **Pause + stop hidden when the printer is idle** — both used to be visible at all times, which was confusing on a standby printer. ### Build - **gcode store migration:** new columns `layer_height` + `first_layer_height` on `gcode_files` (added automatically on first start of 0.9.18). ## [0.9.17] – 2026-05-30 ### New - **🧪 Obico integration (experimental):** The bridge now exposes a Moonraker-compatible surface that the [moonraker-obico](https://github.com/TheSpaghettiDetective/moonraker-obico) plugin accepts. Time-lapses, layer-aligned first-layer scan and WebRTC live streaming work against a (self-hosted or cloud) Obico server. **Note:** the spaghetti-detection ML model is trained on side-view cameras (Ender/Voron); how well it works with the Kobra X's top-down camera is still to be evaluated empirically (it already looked promising in our tests). Stream, time-lapse and telemetry work — the failure-detection side stays flagged as experimental for now. - **Multi-language UI (PR #37 by @gangoke):** Inline translations have moved into JSON files; a globe-icon dropdown lets you switch language. Browser locale is auto-detected; manual choice persists in LocalStorage. Languages: 🇩🇪 🇬🇧 🇪🇸 🇨🇳 (ES + ZH-CN are AI-translated and not verified by native speakers yet). - **OrcaSlicer filament profile per AMS slot:** The slot-edit dialog now lets you pick a concrete OrcaSlicer profile (e.g. "PolyTerra PLA — Polymaker") per slot; the bridge sends it along on AMS sync instead of just "Generic PLA". Profile list is generated from the OrcaSlicer source (~1000 profiles, 43 vendors). A matching patch in OrcaSlicer-KX is on the way so OrcaSlicer fully honours the hint. - **H.264 direct stream:** New `/api/camera/h264` endpoint serves the printer camera stream as MPEG-TS without re-encoding — dramatically reduces latency, bridge CPU during Obico streaming drops from ~13 % to ~3 %. ### Fixes - **Setting temperature via bridge UI / Obico caused a printer system error:** Fixed via live MQTT capture from Anycubic Slicer Next — the `tempature/set` command needs a `type` field (0=nozzle, 1=bed, 2=both) and must go over the `web/printer/…` topic, not `slicer/printer/…`. Nozzle/bed heating from the bridge now works. - **Large GCode uploads (>50 MB) timed out:** The socket connect timeout was active during `sendall()` too — pushing ~200 MB over LAN took more than 30 s and was falsely aborted. Connect / send / read phases are now timed out separately. - **Camera snapshots were slow and could collide with the live stream:** The bridge now keeps a central camera cache (one ffmpeg pulls from the printer, all consumers share it). Snapshots return in ~1.3 ms from RAM instead of 1–2 s per spawned ffmpeg. Also resolves the single-client limit on the printer (HTTP 429 on parallel access). - **Language switch did not refresh the GCode browser:** Strings baked into the file cards ("Print", "Estimate", "Download") stayed in the previous language. Cards are now re-rendered on language switch. - **GCode web upload + download + verify dialog (PR #32 by @gangoke):** Files can be uploaded / downloaded directly in the browser, with a warning dialog when starting a GCode that was not uploaded via OrcaSlicer. ### CI/Build - Multi-arch Docker image (amd64 + arm64) automated via Gitea Actions. - Release builds for all three targets (linux-amd64, linux-arm64, windows.exe) via the local CodeBuilder. ## [0.9.16] – 2026-05-22 ### New - **Auto-start camera on print:** new setting "Turn camera on at print start" — when enabled, the bridge starts the camera stream automatically when a print begins (works for both OrcaSlicer and the Bridge UI). ### Fixes - **Single-color print blocked by an empty AMS slot:** OrcaSlicer writes all configured filaments into the GCode header even when the model uses only one, so the bridge told the printer it needed every color — and an empty unused slot aborted the print. The bridge now maps only the filaments actually used by the GCode. - **Filament sync now position-accurate:** with an empty slot in the middle (e.g. slot 1 yellow, 2 empty, 3 red, 4 white) OrcaSlicer showed the colors shifted onto the wrong slots. Fixed — empty slots keep their position, and the sync color format follows the Happy Hare convention (RRGGBB without `#`). - **Slicer time + thumbnail missing after a browser reload** (or when a print was started directly from OrcaSlicer): both are now restored from the GCode store by filename instead of relying on volatile state. - **German translation gaps** in the ACE dryer dialog fixed. ### Logging - Repeated log lines are collapsed into a counter ("×N") instead of spamming the console; status-poll traffic is no longer logged at INFO. - New log level filter (All / Errors / Warnings), a toast on new errors, full tracebacks forwarded to the browser log, and a timestamped download filename. ## [0.9.15] – 2026-05-21 ### Fixes (Issue #29) - **UI in the OrcaSlicer device tab was broken:** OrcaSlicer's embedded webview only loads the bare HTML and ignores external `