Compare commits
9 Commits
v0.9.3
...
test/i18n-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a15762705 | ||
| ce63cc5e7a | |||
| 5c83cc6df0 | |||
| be11217896 | |||
| 0292785fd8 | |||
| 50419fb487 | |||
| f196b8d29a | |||
| 1d3c5a7e1b | |||
| c22296d880 |
@@ -21,3 +21,4 @@ DEVICE_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|||||||
|
|
||||||
# Modell-ID (Kobra X Standard: 20030)
|
# Modell-ID (Kobra X Standard: 20030)
|
||||||
MODE_ID=20030
|
MODE_ID=20030
|
||||||
|
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,5 +1,7 @@
|
|||||||
.env
|
.env
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
.agents/
|
||||||
|
.codex/
|
||||||
*.pyc
|
*.pyc
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
@@ -7,3 +9,4 @@ dist/
|
|||||||
releases/*/kx-bridge
|
releases/*/kx-bridge
|
||||||
releases/*/extract_credentials
|
releases/*/extract_credentials
|
||||||
releases/*/extract_credentials.exe
|
releases/*/extract_credentials.exe
|
||||||
|
config/config.ini
|
||||||
|
|||||||
@@ -1,5 +1,58 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.6.1] – 2026-05-02
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Upload-Banner:** Banner wird nach Stopp/Abbruch nicht mehr erneut angezeigt — `file_ready` und Thumbnail werden jetzt gecleared wenn der Drucker `stoped` oder `canceled` meldet
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.6] – 2026-05-02
|
||||||
|
|
||||||
|
### Neu
|
||||||
|
- **Fortschritts-Karte:** Verstrichen / Slicer-Schätzung / Restzeit als Mini-Cards (gleicher Stil wie Temperaturkarten)
|
||||||
|
- **Layer-Mini-Card:** Layerzahl als Mini-Card neben der Fortschrittsleiste
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Slicer-Schätzzeit:** OrcaSlicer schreibt die geschätzte Zeit ans Ende der GCode-Datei — Bridge liest jetzt auch die letzten 64 KB (vorher nur die ersten 16 KB)
|
||||||
|
- **start.sh:** `config/`-Verzeichnis wird jetzt automatisch erstellt und `config.ini.example` wird beim ersten Start hineinkopiert (Issue #15)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.5] – 2026-05-01
|
||||||
|
|
||||||
|
### Neu
|
||||||
|
- **Upload-Banner:** Nach „Nur hochladen" erscheint ein grüner Banner mit Dateiname — „▶ Druck starten" startet den Druck direkt, „✕ Abbrechen" schließt den Banner
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Auto-Print:** `auto_print` wurde nach dem Multipart-Loop immer auf `False` zurückgesetzt — OrcaSlicer „Hochladen und drucken" startete den Druck nie automatisch
|
||||||
|
- **Thumbnail:** Vorschaubild wird jetzt auch bei „Nur hochladen" angezeigt — Bridge fragt `fileDetails` direkt nach dem Upload an
|
||||||
|
- **Log Auto-Scroll:** Scroll-Position bleibt erhalten wenn Auto-Scroll deaktiviert ist — kein ungewollter Sprung nach oben mehr
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.4] – 2026-05-01
|
||||||
|
|
||||||
|
### Neu
|
||||||
|
- **AMS-Slot-Editor:** Slot im AMS-Panel anklicken → Dialog mit Farbpicker und Material-Auswahl (Schnellbuttons: PLA/PETG/ABS/ASA/TPU/PA/PC/HIPS oder Freitext) direkt im Browser
|
||||||
|
- **Verbessertes Log-Panel:** Vollständige MQTT-Payloads (keine Kürzung mehr), Richtungsfilter (Alle/RX/TX) und Topic-Schnellfilter (AMS / print / info / status)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **i18n:** Kamera-Placeholder-Text und Log-Richtungs-Button „Alle" werden jetzt korrekt beim Sprachwechsel übersetzt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.3] – 2026-05-01
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Update-Check:** Stable-User erhalten keine Dev-Pre-Releases mehr — `STABLE_RELEASE_API` hatte `pre-release=true`, wodurch stabile Installationen Dev-Builds statt stabiler Releases fanden (Issue #14)
|
||||||
|
- **Version nach Update:** `VERSION`-Datei wird jetzt im Docker-Image mitgeliefert (`COPY VERSION .`) — `_write_version()` benötigt eine vorhandene Datei, ohne die wurde die Version nach dem Self-Update nie aktualisiert (Issue #14)
|
||||||
|
|
||||||
|
### Neu
|
||||||
|
- **Version im Header:** Laufende Version wird im Web-UI-Header neben dem Druckernamen angezeigt — kein Öffnen der Einstellungen nötig (Issue #14)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [0.9.2] – 2026-04-29
|
## [0.9.2] – 2026-04-29
|
||||||
|
|
||||||
### ⚠️ Breaking Change: Konfiguration wechselt von `.env` zu `config/config.ini`
|
### ⚠️ Breaking Change: Konfiguration wechselt von `.env` zu `config/config.ini`
|
||||||
|
|||||||
53
CHANGELOG.md
53
CHANGELOG.md
@@ -1,5 +1,58 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.6.1] – 2026-05-02
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Upload banner:** Banner is no longer shown again after print stop/cancel — `file_ready` and thumbnail are now cleared when the printer reports `stoped` or `canceled`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.6] – 2026-05-02
|
||||||
|
|
||||||
|
### New
|
||||||
|
- **Progress card:** Elapsed / Slicer estimate / Remaining time shown as mini-cards (same style as temperature cards)
|
||||||
|
- **Layer mini-card:** Layer count displayed as mini-card next to the progress bar
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Slicer estimate time:** OrcaSlicer writes the estimated time at the end of the GCode file — bridge now also scans the last 64 KB (previously only the first 16 KB were checked)
|
||||||
|
- **start.sh:** `config/` directory is now created automatically and `config.ini.example` is copied into it on first run (Issue #15)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.5] – 2026-05-01
|
||||||
|
|
||||||
|
### New
|
||||||
|
- **Upload banner:** After "Upload only", a green banner appears with the filename — "▶ Start Print" starts the print directly, "✕ Cancel" dismisses the banner
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Auto-print:** `auto_print` was always reset to `False` after the multipart loop — OrcaSlicer "Upload and print" never started the print automatically
|
||||||
|
- **Thumbnail:** Preview image is now shown after "Upload only" — bridge requests `fileDetails` immediately after upload
|
||||||
|
- **Log auto-scroll:** Scroll position is preserved when auto-scroll is disabled — no more unwanted jump to top
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.4] – 2026-05-01
|
||||||
|
|
||||||
|
### New
|
||||||
|
- **AMS slot editor:** Click any slot in the AMS panel to open an edit dialog — set color (color picker) and material (preset buttons: PLA/PETG/ABS/ASA/TPU/PA/PC/HIPS or free text) directly from the browser
|
||||||
|
- **Improved log panel:** Full MQTT payloads (no truncation), direction filter (All/RX/TX) and topic quick-filter buttons (AMS / print / info / status)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **i18n:** Camera placeholder text and log direction "All" button now correctly translated on language switch
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [0.9.3] – 2026-05-01
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **Update check:** Stable users no longer receive dev pre-releases — `STABLE_RELEASE_API` had `pre-release=true` which caused stable installs to find dev builds instead of stable releases (Issue #14)
|
||||||
|
- **Version after update:** `VERSION` file is now included in the Docker image (`COPY VERSION .`) — `_write_version()` requires the file to exist, without it the version was never updated after self-update (Issue #14)
|
||||||
|
|
||||||
|
### New
|
||||||
|
- **Version in header:** Running version shown in the Web-UI header next to the printer name — no need to open Settings to check (Issue #14)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [0.9.2] – 2026-04-29
|
## [0.9.2] – 2026-04-29
|
||||||
|
|
||||||
### ⚠️ Breaking Change: Configuration moves from `.env` to `config/config.ini`
|
### ⚠️ Breaking Change: Configuration moves from `.env` to `config/config.ini`
|
||||||
|
|||||||
16
Dockerfile
16
Dockerfile
@@ -2,17 +2,17 @@ FROM python:3.11-slim
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY bridge/requirements.txt .
|
COPY requirements.txt .
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
COPY bridge/kobrax_moonraker_bridge.py .
|
COPY kobrax_moonraker_bridge.py .
|
||||||
COPY bridge/config_loader.py .
|
COPY config_loader.py .
|
||||||
COPY bridge/env_loader.py .
|
COPY env_loader.py .
|
||||||
COPY bridge/kobrax_client.py .
|
COPY kobrax_client.py .
|
||||||
COPY VERSION .
|
COPY VERSION .
|
||||||
COPY bridge/anycubic_slicer.crt .
|
COPY anycubic_slicer.crt .
|
||||||
COPY bridge/anycubic_slicer.key .
|
COPY anycubic_slicer.key .
|
||||||
COPY bridge/config/config.ini.example /app/config/config.ini.example
|
COPY config/config.ini.example /app/config/config.ini.example
|
||||||
|
|
||||||
# config/ ist ein Volume-Mountpoint – beim Start wird config.ini aus .env migriert
|
# config/ ist ein Volume-Mountpoint – beim Start wird config.ini aus .env migriert
|
||||||
# falls noch keine config.ini vorhanden ist.
|
# falls noch keine config.ini vorhanden ist.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# KX-Bridge – Anycubic Kobra X
|
# KX-Bridge – Anycubic Kobra X
|
||||||
|
|
||||||
**Version:** 0.9.2
|
**Version:** 0.9.6.1
|
||||||
|
|
||||||
Steuere deinen **Anycubic Kobra X** mit OrcaSlicer — ohne Klipper, ohne Raspberry Pi.
|
Steuere deinen **Anycubic Kobra X** mit OrcaSlicer — ohne Klipper, ohne Raspberry Pi.
|
||||||
KX-Bridge ist eine Moonraker-kompatible Bridge die direkt mit dem Drucker kommuniziert.
|
KX-Bridge ist eine Moonraker-kompatible Bridge die direkt mit dem Drucker kommuniziert.
|
||||||
@@ -46,6 +46,12 @@ Drucker → Verbindungstyp **Moonraker** → Host: `http://BRIDGE-IP:7125`
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 📺 Video Tutorial
|
||||||
|
|
||||||
|
[](https://www.youtube.com/watch?v=1Ql4wfH27fM)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## ⚠️ Update von 0.9.1 oder älter
|
## ⚠️ Update von 0.9.1 oder älter
|
||||||
|
|
||||||
Ab **0.9.2** speichert KX-Bridge Einstellungen in `config/config.ini` statt in `.env`.
|
Ab **0.9.2** speichert KX-Bridge Einstellungen in `config/config.ini` statt in `.env`.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# KX-Bridge – Anycubic Kobra X
|
# KX-Bridge – Anycubic Kobra X
|
||||||
|
|
||||||
**Version:** 0.9.2
|
**Version:** 0.9.6.1
|
||||||
|
|
||||||
Control your **Anycubic Kobra X** with OrcaSlicer — no Klipper, no Raspberry Pi.
|
Control your **Anycubic Kobra X** with OrcaSlicer — no Klipper, no Raspberry Pi.
|
||||||
KX-Bridge is a Moonraker-compatible bridge that communicates directly with the printer.
|
KX-Bridge is a Moonraker-compatible bridge that communicates directly with the printer.
|
||||||
@@ -46,6 +46,12 @@ Printer → Connection type **Moonraker** → Host: `http://BRIDGE-IP:7125`
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 📺 Video Tutorial
|
||||||
|
|
||||||
|
[](https://www.youtube.com/watch?v=1Ql4wfH27fM)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## ⚠️ Upgrading from 0.9.1 or earlier
|
## ⚠️ Upgrading from 0.9.1 or earlier
|
||||||
|
|
||||||
Starting with **0.9.2**, KX-Bridge stores settings in `config/config.ini` instead of `.env`.
|
Starting with **0.9.2**, KX-Bridge stores settings in `config/config.ini` instead of `.env`.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Bridge-Manager: start | stop | restart | status | log
|
# Bridge-Manager: start | stop | restart | status | log
|
||||||
SCRIPT="$(dirname "$0")/kobrax_moonraker_bridge.py"
|
SCRIPT="$(dirname "$0")/kobrax_moonraker_bridge.py"
|
||||||
LOGFILE="/tmp/bridge.log"
|
LOGFILE="/tmp/bridge.log"
|
||||||
PRINTER_IP="192.168.178.94"
|
PRINTER_IP="${PRINTER_IP:-}"
|
||||||
|
|
||||||
case "${1:-restart}" in
|
case "${1:-restart}" in
|
||||||
start)
|
start)
|
||||||
@@ -11,7 +11,11 @@ case "${1:-restart}" in
|
|||||||
fuser -k 7125/tcp 2>/dev/null || pkill -f kobrax_moonraker_bridge 2>/dev/null
|
fuser -k 7125/tcp 2>/dev/null || pkill -f kobrax_moonraker_bridge 2>/dev/null
|
||||||
sleep 1
|
sleep 1
|
||||||
fi
|
fi
|
||||||
nohup python3 "$SCRIPT" --printer-ip "$PRINTER_IP" > "$LOGFILE" 2>&1 &
|
CMD=(python3 "$SCRIPT")
|
||||||
|
if [[ -n "$PRINTER_IP" ]]; then
|
||||||
|
CMD+=(--printer-ip "$PRINTER_IP")
|
||||||
|
fi
|
||||||
|
nohup "${CMD[@]}" > "$LOGFILE" 2>&1 &
|
||||||
echo "Bridge gestartet PID=$!"
|
echo "Bridge gestartet PID=$!"
|
||||||
sleep 2; tail -3 "$LOGFILE"
|
sleep 2; tail -3 "$LOGFILE"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ class KobraXClient:
|
|||||||
data.get("curr_hotbed_temp", "?"), data.get("target_hotbed_temp", 0))
|
data.get("curr_hotbed_temp", "?"), data.get("target_hotbed_temp", 0))
|
||||||
else:
|
else:
|
||||||
log.info("RX %-25s state=%-12s data=%s",
|
log.info("RX %-25s state=%-12s data=%s",
|
||||||
suffix, state, json.dumps(payload.get("data"), ensure_ascii=False)[:120])
|
suffix, state, json.dumps(payload.get("data"), ensure_ascii=False))
|
||||||
|
|
||||||
# Resolve by report topic suffix (e.g. "info/report")
|
# Resolve by report topic suffix (e.g. "info/report")
|
||||||
if suffix in self._pending_report:
|
if suffix in self._pending_report:
|
||||||
@@ -366,7 +366,7 @@ class KobraXClient:
|
|||||||
topic = self._pub_topic(msg_type)
|
topic = self._pub_topic(msg_type)
|
||||||
log.info("TX %-25s action=%-12s data=%s",
|
log.info("TX %-25s action=%-12s data=%s",
|
||||||
f"{msg_type}/request", action,
|
f"{msg_type}/request", action,
|
||||||
json.dumps(data, ensure_ascii=False)[:120] if data else "null")
|
json.dumps(data, ensure_ascii=False) if data else "null")
|
||||||
try:
|
try:
|
||||||
with self._lock:
|
with self._lock:
|
||||||
self._sock.sendall(_build_publish(topic, payload))
|
self._sock.sendall(_build_publish(topic, payload))
|
||||||
@@ -414,7 +414,7 @@ class KobraXClient:
|
|||||||
topic = self._web_topic(msg_type)
|
topic = self._web_topic(msg_type)
|
||||||
log.info("TX(web) %-23s action=%-12s data=%s",
|
log.info("TX(web) %-23s action=%-12s data=%s",
|
||||||
f"{msg_type}/request", action,
|
f"{msg_type}/request", action,
|
||||||
json.dumps(data, ensure_ascii=False)[:120] if data else "null")
|
json.dumps(data, ensure_ascii=False) if data else "null")
|
||||||
try:
|
try:
|
||||||
with self._lock:
|
with self._lock:
|
||||||
self._sock.sendall(_build_publish(topic, payload))
|
self._sock.sendall(_build_publish(topic, payload))
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
9
start.sh
9
start.sh
@@ -15,6 +15,15 @@ if [[ ! -f .env ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# config/ Verzeichnis und config.ini.example anlegen falls nicht vorhanden
|
||||||
|
mkdir -p config
|
||||||
|
if [[ ! -f config/config.ini ]] && [[ ! -f config/config.ini.example ]]; then
|
||||||
|
if [[ -f config.ini.example ]]; then
|
||||||
|
cp config.ini.example config/config.ini.example
|
||||||
|
echo "[start] config/config.ini.example aus config.ini.example erstellt"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Docker verfügbar?
|
# Docker verfügbar?
|
||||||
if ! docker info > /dev/null 2>&1; then
|
if ! docker info > /dev/null 2>&1; then
|
||||||
echo "[start] Docker nicht gefunden – bitte Docker installieren."
|
echo "[start] Docker nicht gefunden – bitte Docker installieren."
|
||||||
|
|||||||
Reference in New Issue
Block a user