diff --git a/README.en.md b/README.en.md index 95ac7da..7d83f2a 100644 --- a/README.en.md +++ b/README.en.md @@ -1,25 +1,9 @@ -# KX-Bridge +# KX-Bridge – Anycubic Kobra X Moonraker Bridge -Connects the Anycubic Kobra X to OrcaSlicer – no Klipper, no Raspberry Pi required. +**Version:** 0.9.1-beta4 +**Status:** Public Beta – suitable for home users, feedback welcome -KX-Bridge runs on your PC or NAS and provides a Moonraker-compatible interface so OrcaSlicer can control the printer directly: print start, temperatures, progress, pause/resume/cancel, AMS filament changes, print speed, and more. - -**Version:** 0.9.1-beta4 - ---- - -## Included files - -| File | Description | -|------|-------------| -| `kobrax_moonraker_bridge.py` | Bridge main program | -| `kx-bridge` | Pre-built Linux binary | -| `extract_credentials.exe` | Read credentials from AnycubicSlicerNext (Windows) | -| `extract_credentials` | Read credentials from AnycubicSlicerNext (Linux) | -| `kobra_x_orcaslicer_preset.zip` | OrcaSlicer printer profile for the Kobra X | -| `bridge.sh` | Linux service manager | -| `Dockerfile` / `docker-compose.yml` | Docker deployment | -| `.env.example` | Configuration template | +KX-Bridge is a Moonraker-compatible HTTP/WebSocket bridge for the **Anycubic Kobra X** 3D printer. It allows you to control the printer through OrcaSlicer and other Moonraker-compatible software — no Klipper, no Raspberry Pi required. --- @@ -40,93 +24,129 @@ KX-Bridge runs on your PC or NAS and provides a Moonraker-compatible interface s ## Requirements -- Anycubic Kobra X in LAN mode (printer must be reachable via LAN, not only through Anycubic Cloud) -- PC, NAS, or server on the same network (Windows or Linux) -- Docker or Python 3.9+ -- Printer MQTT credentials → [Step 1](#step-1-extract-credentials) +- Anycubic Kobra X on your local network (LAN, no Wi-Fi client isolation) +- Printer MQTT credentials (→ see [Extracting credentials](#extracting-credentials)) +- Docker **or** Python 3.9+ **or** the pre-built Linux binary --- -## Quick start - -### Step 1: Extract credentials - -The bridge needs printer-specific MQTT credentials. - -> **Important:** The printer must be in LAN mode. The credentials can only be extracted when the printer is reachable directly over LAN (not solely through Anycubic Cloud). - -Start AnycubicSlicerNext and connect to the printer (wait until the printer status is shown), then: - -**Windows:** -``` -extract_credentials.exe --write-env -``` - -**Linux:** -```bash -chmod +x extract_credentials -./extract_credentials --write-env -``` - -The credentials are saved automatically to `.env`. - -> If the result looks uncertain: `--verbose` shows all found candidates. Enter the correct value manually in `.env`. - ---- - -### Step 2: Check configuration +## Quick start – Docker (recommended) ```bash +# 1. Create .env cp .env.example .env -# Open .env and verify the values +# Fill in your printer data (→ extract_credentials) + +# 2. Start the bridge +docker compose up -d + +# 3. In OrcaSlicer: add printer → "Moonraker" → http://BRIDGE-IP:7125 +``` + +Check logs: +```bash +docker compose logs -f +``` + +Update: +```bash +docker compose pull && docker compose up -d ``` --- -### Step 3: Start the bridge +## Quick start – Binary (Linux) -**Option A – Docker (recommended):** -```bash -docker compose up -d -``` -Runs in the background and restarts automatically after a system reboot. - -**Option B – Linux binary:** ```bash chmod +x kx-bridge -./kx-bridge -# Or with the service manager: -./bridge.sh start +./kx-bridge --printer-ip 192.168.x.x --username userXXXX --password XXXXX \ + --device-id XXXXX --mode-id 20030 ``` -**Option C – Python directly:** +Or place a `.env` file in the same directory — the bridge reads it automatically. + +--- + +## Quick start – Python directly + ```bash pip install aiohttp +python kobrax_moonraker_bridge.py --printer-ip 192.168.x.x ... +# Or fill in .env and start without arguments python kobrax_moonraker_bridge.py ``` --- -### Step 4: Install OrcaSlicer profile +## Extracting credentials -1. Import `kobra_x_orcaslicer_preset.zip` into OrcaSlicer: - File → Import → Import Configs → select ZIP -2. Select Anycubic Kobra X as your printer +The MQTT credentials are printer-specific and are generated on first connection with AnycubicSlicerNext. The `extract_credentials` tool reads them from the memory of the running slicer. + +**Requirement:** AnycubicSlicerNext must be running and connected to the printer. + +### Windows + +``` +extract_credentials.exe --write-env +``` + +Writes the found credentials directly to `.env`. + +### Linux + +```bash +chmod +x extract_credentials +./extract_credentials --write-env +``` + +### Output + +``` +[*] Process found: AnycubicSlicerNext.exe (PID 1234) +[*] 1986 memory segments read (738.8 MB) +[*] Analyzing ... 100% (739 MB) + +======================================================= + RESULTS +======================================================= + Username userXXXXXXXXXX (hits: 47) + Password *************** (hits: 1046) + Device-ID xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (hits: 3504) + Printer IP 192.168.x.x (hits: 3036) +======================================================= + +Hint: pass --write-env to save credentials to '.env'. +``` + +All credentials are **processed locally only** — nothing is sent to external servers. --- -### Step 5: Connect OrcaSlicer +## Configuration (.env) -1. Open printer settings +```env +PRINTER_IP=192.168.x.x # Printer IP address +MQTT_PORT=9883 # Default, do not change +MQTT_USERNAME=userXXXXXXXX # Starts with "user" +MQTT_PASSWORD=XXXXXXXXXXXXXX # ~15 characters, mixed case +DEVICE_ID=xxxxxxxx... # 32-character hex string +MODE_ID=20030 # Kobra X default +``` + +--- + +## OrcaSlicer setup + +1. Add printer → **Anycubic Kobra X** (or generic Klipper printer) 2. Connection type: **Moonraker** -3. Host: `http://BRIDGE-PC-IP:7125` -4. Click "Test" — a success message confirms the connection +3. Host: `http://BRIDGE-HOST:7125` +4. Test connection → should show "Online" --- ## Web UI -The bridge serves a web interface at `http://BRIDGE-IP:7125`: +The bridge serves a web interface at `http://BRIDGE-HOST:7125`: | Section | Function | |---------|----------| @@ -136,7 +156,7 @@ The bridge serves a web interface at `http://BRIDGE-IP:7125`: | Print Speed | Silent / Normal / Sport | | Fan / Light | Fan speed and work light | | AMS | Load / unload filament | -| Camera | Live preview (if supported by the printer) | +| Camera | Live preview (if supported by printer) | | ⚙ Settings | MQTT credentials, poll interval, self-update | ### Self-update @@ -145,26 +165,32 @@ The ⚙ menu in the web UI lets you check for new versions and update the bridge --- -## bridge.sh – Service manager (Linux) +## bridge.sh (Linux service manager) ```bash -./bridge.sh start # Start in background -./bridge.sh stop # Stop -./bridge.sh restart # Restart -./bridge.sh status # Show status -./bridge.sh log 50 # Show last 50 log lines +./bridge.sh start # Start bridge in background +./bridge.sh stop # Stop bridge +./bridge.sh restart # Restart +./bridge.sh status # Check status and port +./bridge.sh log 50 # Show last 50 log lines ``` --- -## Docker – Useful commands +## Printer states -```bash -docker compose up -d # Start -docker compose down # Stop -docker compose logs -f # Follow logs -docker compose pull && docker compose up -d # Update -``` +The bridge translates internal Kobra states into Moonraker-compatible states: + +| Kobra state | Meaning | +|-------------|---------| +| free | Ready | +| printing / busy | Printing | +| pausing / paused | Paused | +| resuming / resumed | Resuming | +| stopping / stoped | Stopping | +| finished | Complete | +| canceled | Cancelled | +| failed | Error | --- @@ -172,19 +198,14 @@ docker compose pull && docker compose up -d # Update **Port 7125 already in use:** ```bash -./bridge.sh stop +./bridge.sh stop # or: fuser -k 7125/tcp ./bridge.sh start ``` -**OrcaSlicer connection test fails:** -- Check firewall: port 7125 must be reachable -- Check bridge log: `./bridge.sh log` or `docker compose logs` -- Is the printer IP in `.env` correct? - -**Credentials rejected:** -- Start AnycubicSlicerNext and connect to the printer -- Run `extract_credentials --verbose` and check all candidates -- Enter the correct value manually in `.env`, then restart the bridge +**Invalid credentials / connection refused:** +- Start AnycubicSlicerNext, connect to the printer, then run `extract_credentials` again +- If the result looks uncertain: `extract_credentials --verbose` shows all candidates +- Manually enter the correct candidate in `.env` and restart the bridge **Temperature changes are ignored:** - During an active print, temperature changes are sent via a separate channel — this is normal and the bridge handles it automatically. @@ -192,21 +213,26 @@ docker compose pull && docker compose up -d # Update **Docker: Permission denied:** ```bash sudo usermod -aG docker $USER -# Log out and back in, then try again +# Log out and back in +``` + +**Docker: .env not found:** +```bash +# .env must be in the same directory as docker-compose.yml +cp .env.example .env && nano .env ``` --- -## Configuration reference (.env) +## Logs -| Parameter | Description | Example | -|-----------|-------------|---------| -| `PRINTER_IP` | Printer IP address | `192.168.1.100` | -| `MQTT_PORT` | MQTT port (do not change) | `9883` | -| `MQTT_USERNAME` | Username (starts with "user") | `userXXXXXXXXXX` | -| `MQTT_PASSWORD` | Password (~15 characters) | `***` | -| `DEVICE_ID` | Device ID (32 hex characters) | `xxxxxxxx...` | -| `MODE_ID` | Model ID (Kobra X default) | `20030` | +```bash +# Docker +docker compose logs -f kx-bridge + +# Binary / Python +tail -f /tmp/bridge.log # when using bridge.sh +``` --- @@ -214,14 +240,11 @@ sudo usermod -aG docker $USER - The bridge binds to `0.0.0.0:7125` by default — use on your local network only - `.env` contains printer credentials — do not share publicly -- All credentials are processed locally only — nothing is sent to external servers +- The credentials are printer-specific and have no access to Anycubic cloud services --- -## Disclaimer +## License & legal -This project is intended for private use and to enable interoperability between the Anycubic Kobra X and free software (OrcaSlicer). - -`extract_credentials` only reads the memory of the AnycubicSlicerNext process running on your own PC. No data is transmitted or stored anywhere other than the local `.env` file. - -This project is not affiliated with Anycubic and is not operated commercially. +This project was created through interoperability research under §69e UrhG (German copyright law). +For private, non-commercial use only. diff --git a/README.md b/README.md index 49e9daa..c944172 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,9 @@ -# KX-Bridge +# KX-Bridge – Anycubic Kobra X Moonraker Bridge -Verbindet den Anycubic Kobra X mit OrcaSlicer – ohne Klipper, ohne Raspberry Pi. +**Version:** 0.9.1-beta4 +**Status:** Public Beta – für Heimanwender geeignet, Feedback willkommen -KX-Bridge läuft auf deinem PC oder NAS und stellt eine Moonraker-kompatible Schnittstelle bereit, über die OrcaSlicer den Drucker direkt steuern kann: Druckstart, Temperatur, Fortschritt, Pause/Fortsetzen/Abbrechen, AMS-Farbwechsel, Druckgeschwindigkeit und mehr. - -**Version:** 0.9.1-beta4 - ---- - -## Enthaltene Dateien - -| Datei | Beschreibung | -|-------|-------------| -| `kobrax_moonraker_bridge.py` | Bridge-Hauptprogramm | -| `kx-bridge` | Vorkompilierte Linux-Binary | -| `extract_credentials.exe` | Zugangsdaten aus AnycubicSlicerNext auslesen (Windows) | -| `extract_credentials` | Zugangsdaten aus AnycubicSlicerNext auslesen (Linux) | -| `kobra_x_orcaslicer_preset.zip` | OrcaSlicer-Druckerprofil für den Kobra X | -| `bridge.sh` | Service-Manager für Linux | -| `Dockerfile` / `docker-compose.yml` | Docker-Deployment | -| `.env.example` | Konfigurationsvorlage | +KX-Bridge ist eine Moonraker-kompatible HTTP/WebSocket-Bridge für den **Anycubic Kobra X** 3D-Drucker. Sie ermöglicht die Steuerung des Druckers über OrcaSlicer und andere Moonraker-kompatible Software, ohne dass Klipper oder ein Raspberry Pi benötigt wird. --- @@ -40,93 +24,129 @@ KX-Bridge läuft auf deinem PC oder NAS und stellt eine Moonraker-kompatible Sch ## Voraussetzungen -- Anycubic Kobra X im LAN-Modus (Drucker muss über LAN erreichbar sein, nicht nur über Anycubic-Cloud) -- PC, NAS oder Server im gleichen Netzwerk (Windows oder Linux) -- Docker oder Python 3.9+ -- MQTT-Zugangsdaten des Druckers → [Schritt 1](#schritt-1-zugangsdaten-ermitteln) +- Anycubic Kobra X im lokalen Netzwerk (LAN, nicht WLAN-Isolation) +- MQTT-Credentials des Druckers (→ siehe [Credentials extrahieren](#credentials-extrahieren)) +- Docker **oder** Python 3.9+ **oder** direkt die Linux-Binary --- -## Schnellstart - -### Schritt 1: Zugangsdaten ermitteln - -Die Bridge benötigt druckerspezifische MQTT-Zugangsdaten. - -> **Wichtig:** Der Drucker muss sich im LAN-Modus befinden. Nur wenn der Drucker direkt über LAN (nicht ausschließlich über die Anycubic-Cloud) erreichbar ist, können die Zugangsdaten ermittelt und die Bridge genutzt werden. - -AnycubicSlicerNext starten und mit dem Drucker verbinden (bis der Drucker-Status angezeigt wird), dann: - -**Windows:** -``` -extract_credentials.exe --write-env -``` - -**Linux:** -```bash -chmod +x extract_credentials -./extract_credentials --write-env -``` - -Die Zugangsdaten werden automatisch in `.env` gespeichert. - -> Falls das Ergebnis unsicher wirkt: `--verbose` zeigt alle gefundenen Kandidaten. Den richtigen Wert manuell in `.env` eintragen. - ---- - -### Schritt 2: Konfiguration prüfen +## Schnellstart – Docker (empfohlen) ```bash +# 1. .env anlegen cp .env.example .env -# .env öffnen und Werte kontrollieren +# .env mit deinen Druckerdaten befüllen (→ extract_credentials) + +# 2. Bridge starten +docker compose up -d + +# 3. In OrcaSlicer: Drucker → "Moonraker" → http://BRIDGE-IP:7125 +``` + +Logs prüfen: +```bash +docker compose logs -f +``` + +Update: +```bash +docker compose pull && docker compose up -d ``` --- -### Schritt 3: Bridge starten +## Schnellstart – Binary (Linux) -**Option A – Docker (empfohlen):** -```bash -docker compose up -d -``` -Läuft im Hintergrund, startet automatisch nach Systemneustart. - -**Option B – Linux Binary:** ```bash chmod +x kx-bridge -./kx-bridge -# Oder mit Service-Manager: -./bridge.sh start +./kx-bridge --printer-ip 192.168.x.x --username userXXXX --password XXXXX \ + --device-id XXXXX --mode-id 20030 ``` -**Option C – Python direkt:** +Oder mit `.env`-Datei im gleichen Verzeichnis – die Bridge liest sie automatisch. + +--- + +## Schnellstart – Python direkt + ```bash pip install aiohttp +python kobrax_moonraker_bridge.py --printer-ip 192.168.x.x ... +# Oder .env befüllen, dann ohne Argumente starten python kobrax_moonraker_bridge.py ``` --- -### Schritt 4: OrcaSlicer-Profil installieren +## Credentials extrahieren -1. `kobra_x_orcaslicer_preset.zip` in OrcaSlicer importieren: - Datei → Konfigurationen importieren → ZIP auswählen -2. Anycubic Kobra X als Drucker auswählen +Die MQTT-Zugangsdaten sind druckerspezifisch und werden beim ersten Verbindungsaufbau mit dem AnycubicSlicerNext generiert. Das Tool `extract_credentials` liest sie aus dem RAM des laufenden Slicers aus. + +**Voraussetzung:** AnycubicSlicerNext muss gestartet und mit dem Drucker verbunden sein. + +### Windows + +``` +extract_credentials.exe --write-env +``` + +Schreibt die gefundenen Credentials direkt in `.env`. + +### Linux + +```bash +chmod +x extract_credentials +./extract_credentials --write-env +``` + +### Ausgabe + +``` +[*] Prozess gefunden: AnycubicSlicerNext.exe (PID 1234) +[*] 1986 Speichersegmente gelesen (738.8 MB) +[*] Analysiere ... 100% (739 MB) + +======================================================= + ERGEBNISSE +======================================================= + Username userXXXXXXXXXX (Treffer: 47) + Password *************** (Treffer: 1046) + Device-ID xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Treffer: 3504) + Drucker-IP 192.168.x.x (Treffer: 3036) +======================================================= + +Hinweis: --write-env übergeben um Credentials in '.env' zu speichern. +``` + +Alle Credentials werden **ausschließlich lokal verarbeitet** — keine Übertragung an externe Server. --- -### Schritt 5: OrcaSlicer verbinden +## Konfiguration (.env) -1. Drucker-Einstellungen öffnen +```env +PRINTER_IP=192.168.x.x # IP des Druckers +MQTT_PORT=9883 # Standard, nicht ändern +MQTT_USERNAME=userXXXXXXXX # Beginnt mit "user" +MQTT_PASSWORD=XXXXXXXXXXXXXX # ~15 Zeichen, gemischt +DEVICE_ID=xxxxxxxx... # 32-stelliger Hex-String +MODE_ID=20030 # Kobra X Standard +``` + +--- + +## OrcaSlicer verbinden + +1. Drucker hinzufügen → **Anycubic Kobra X** (oder generischer Klipper-Drucker) 2. Verbindungstyp: **Moonraker** -3. Adresse: `http://IP-DES-BRIDGE-PC:7125` eintragen -4. Auf „Test" klicken – bei erfolgreicher Verbindung erscheint eine Bestätigungsmeldung +3. IP: `http://BRIDGE-HOST:7125` +4. Verbindung testen → sollte "Online" anzeigen --- ## Web-UI -Die Bridge stellt unter `http://BRIDGE-IP:7125` eine Web-Oberfläche bereit: +Die Bridge stellt unter `http://BRIDGE-HOST:7125` eine Web-Oberfläche bereit: | Bereich | Funktion | |---------|----------| @@ -136,55 +156,56 @@ Die Bridge stellt unter `http://BRIDGE-IP:7125` eine Web-Oberfläche bereit: | Druckgeschwindigkeit | Leise / Normal / Sport | | Lüfter / Licht | Lüfterdrehzahl und Drucklicht | | AMS | Filament einziehen / ausziehen | -| Kamera | Live-Vorschau (falls vom Drucker unterstützt) | +| Kamera | Live-Vorschau (falls Drucker unterstützt) | | ⚙ Einstellungen | MQTT-Zugangsdaten, Poll-Intervall, Self-Update | ### Self-Update -Über das ⚙-Menü in der Web-UI kann die Bridge auf neue Versionen prüfen und sich selbst aktualisieren — ohne Neuinstallation. Nach dem Download startet sie automatisch neu. +Über das ⚙-Menü in der Web-UI kann die Bridge auf neue Versionen prüfen und sich selbst aktualisieren — ohne Neuinstallation. Nach dem Download startet die Bridge automatisch mit der neuen Version neu. --- -## bridge.sh – Service-Manager (Linux) +## bridge.sh (Linux Service-Manager) ```bash -./bridge.sh start # Im Hintergrund starten -./bridge.sh stop # Beenden -./bridge.sh restart # Neustarten -./bridge.sh status # Status anzeigen -./bridge.sh log 50 # Letzte 50 Log-Zeilen +./bridge.sh start # Bridge im Hintergrund starten +./bridge.sh stop # Bridge beenden +./bridge.sh restart # Neustarten +./bridge.sh status # Status und Port prüfen +./bridge.sh log 50 # Letzte 50 Log-Zeilen ``` --- -## Docker – Nützliche Befehle +## Druckerzustände -```bash -docker compose up -d # Starten -docker compose down # Stoppen -docker compose logs -f # Logs verfolgen -docker compose pull && docker compose up -d # Update -``` +Die Bridge übersetzt die internen Kobra-Zustände in Moonraker-kompatible Zustände: + +| Kobra-Zustand | Bedeutung | +|---------------|-----------| +| free | Bereit | +| printing / busy | Druckt | +| pausing / paused | Pausiert | +| resuming / resumed | Wird fortgesetzt | +| stopping / stoped | Wird gestoppt | +| finished | Abgeschlossen | +| canceled | Abgebrochen | +| failed | Fehler | --- ## Fehlerbehebung -**Port 7125 belegt:** +**Port 7125 bereits belegt:** ```bash -./bridge.sh stop +./bridge.sh stop # oder: fuser -k 7125/tcp ./bridge.sh start ``` -**Verbindungstest in OrcaSlicer schlägt fehl:** -- Firewall prüfen: Port 7125 muss erreichbar sein -- Bridge-Log prüfen: `./bridge.sh log` oder `docker compose logs` -- Drucker-IP in `.env` korrekt? - -**Zugangsdaten werden abgelehnt:** -- AnycubicSlicerNext starten, mit Drucker verbinden -- `extract_credentials --verbose` ausführen und alle Kandidaten prüfen -- Richtigen Wert manuell in `.env` eintragen, Bridge neu starten +**Credentials ungültig / Verbindung abgelehnt:** +- AnycubicSlicerNext starten, mit Drucker verbinden, `extract_credentials` erneut ausführen +- Falls das Ergebnis unsicher wirkt: `extract_credentials --verbose` zeigt alle Kandidaten an +- Den richtigen Kandidaten manuell in `.env` eintragen und Bridge neu starten **Temperaturänderungen werden ignoriert:** - Während eines laufenden Drucks werden Temperaturänderungen über einen separaten Kanal gesendet — das ist normal und wird von der Bridge automatisch erkannt. @@ -192,21 +213,26 @@ docker compose pull && docker compose up -d # Update **Docker: Permission denied:** ```bash sudo usermod -aG docker $USER -# Neu einloggen, dann erneut versuchen +# Neu einloggen +``` + +**Docker: .env nicht gefunden:** +```bash +# .env muss im gleichen Verzeichnis wie docker-compose.yml liegen +cp .env.example .env && nano .env ``` --- -## Konfigurationsreferenz (.env) +## Logs -| Parameter | Beschreibung | Beispiel | -|-----------|-------------|---------| -| `PRINTER_IP` | IP-Adresse des Druckers | `192.168.1.100` | -| `MQTT_PORT` | MQTT-Port (nicht ändern) | `9883` | -| `MQTT_USERNAME` | Benutzername (beginnt mit „user") | `userXXXXXXXXXX` | -| `MQTT_PASSWORD` | Passwort (~15 Zeichen) | `***` | -| `DEVICE_ID` | Geräte-ID (32 Hex-Zeichen) | `xxxxxxxx...` | -| `MODE_ID` | Modell-ID (Kobra X Standard) | `20030` | +```bash +# Docker +docker compose logs -f kx-bridge + +# Binary / Python +tail -f /tmp/bridge.log # bei Nutzung von bridge.sh +``` --- @@ -214,14 +240,11 @@ sudo usermod -aG docker $USER - Die Bridge bindet standardmäßig auf `0.0.0.0:7125` — nur im lokalen Netzwerk nutzen - `.env` enthält Drucker-Credentials — nicht öffentlich teilen -- Alle Zugangsdaten werden ausschließlich lokal verarbeitet — keine Übertragung an externe Server +- Die Credentials sind druckerspezifisch und haben keinen Zugang zu Anycubic-Cloud-Diensten --- -## Hinweis zur Nutzung +## Lizenz & Rechtliches -Dieses Projekt dient der privaten Nutzung und der Herstellung von Interoperabilität zwischen dem Anycubic Kobra X und freier Software (OrcaSlicer). - -`extract_credentials` liest ausschließlich den Arbeitsspeicher des auf deinem eigenen PC laufenden AnycubicSlicerNext-Prozesses. Es werden keine Daten übertragen oder gespeichert, außer in die lokale `.env`-Datei. - -Das Projekt steht in keiner Verbindung zu Anycubic und wird nicht kommerziell betrieben. +Dieses Projekt entstand durch Interoperabilitätsforschung gem. §69e UrhG. +Ausschließlich für private, nicht-kommerzielle Nutzung. diff --git a/VERSION b/VERSION index f588e50..6302101 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.1-beta4 +0.9.1-beta5 diff --git a/kobrax_client.py b/kobrax_client.py index e219aa5..1f73b90 100644 --- a/kobrax_client.py +++ b/kobrax_client.py @@ -394,14 +394,14 @@ class KobraXClient: def stop_camera(self) -> dict | None: return self.publish("video", "stopCapture") - def pause_print(self) -> dict | None: - return self.publish("print", "pause") + def pause_print(self, taskid: str = "-1") -> dict | None: + return self.publish("print", "pause", {"taskid": taskid}) - def resume_print(self) -> dict | None: - return self.publish("print", "resume") + def resume_print(self, taskid: str = "-1") -> dict | None: + return self.publish("print", "resume", {"taskid": taskid}) - def stop_print(self) -> dict | None: - return self.publish("print", "stop") + def stop_print(self, taskid: str = "-1") -> dict | None: + return self.publish("print", "stop", {"taskid": taskid}) # -- G-Code Upload ------------------------------------------------------- diff --git a/kobrax_moonraker_bridge.py b/kobrax_moonraker_bridge.py index 56d510e..4f4c054 100644 --- a/kobrax_moonraker_bridge.py +++ b/kobrax_moonraker_bridge.py @@ -48,6 +48,12 @@ KOBRA_TO_KLIPPER_STATE = { "checking": "printing", "updated": "printing", "init": "printing", + "pausing": "paused", + "paused": "paused", + "resuming": "printing", + "resumed": "printing", + "stopping": "printing", + "stoped": "standby", "finished": "complete", "failed": "error", "canceled": "standby", @@ -118,6 +124,9 @@ class KobraXBridge: self._state["print_state"] = KOBRA_TO_KLIPPER_STATE.get(kobra_state, "printing") if kobra_state: self._state["kobra_state"] = kobra_state + if kobra_state in ("stoped", "canceled"): + self._state["progress"] = 0.0 + self._state["filename"] = "" self._state["filename"] = d.get("filename", self._state["filename"]) if "progress" in d: self._state["progress"] = float(d["progress"]) / 100.0 @@ -519,17 +528,20 @@ class KobraXBridge: async def handle_print_pause(self, request): loop = asyncio.get_event_loop() - await loop.run_in_executor(None, self.client.pause_print) + taskid = self._state.get("taskid", "-1") + await loop.run_in_executor(None, lambda: self.client.pause_print(taskid)) return web.json_response({"result": "ok"}) async def handle_print_resume(self, request): loop = asyncio.get_event_loop() - await loop.run_in_executor(None, self.client.resume_print) + taskid = self._state.get("taskid", "-1") + await loop.run_in_executor(None, lambda: self.client.resume_print(taskid)) return web.json_response({"result": "ok"}) async def handle_print_cancel(self, request): loop = asyncio.get_event_loop() - await loop.run_in_executor(None, self.client.stop_print) + taskid = self._state.get("taskid", "-1") + await loop.run_in_executor(None, lambda: self.client.stop_print(taskid)) return web.json_response({"result": "ok"}) async def handle_octoprint_version(self, request): @@ -1118,7 +1130,7 @@ function toggleTheme(){ // ── i18n ── var LANG_DE={ header_status_standby:'Bereit',header_status_printing:'Druckt',header_status_complete:'Fertig',header_status_error:'Fehler', - kobra_free:'Bereit',kobra_busy:'Beschäftigt',kobra_printing:'Druckt',kobra_preheating:'Aufheizen',kobra_auto_leveling:'Nivellierung',kobra_checking:'Prüfung',kobra_updated:'Aktualisierung',kobra_init:'Initialisierung',kobra_finished:'Abgeschlossen',kobra_failed:'Fehler',kobra_canceled:'Abgebrochen',kobra_offline:'Offline', + kobra_free:'Bereit',kobra_busy:'Beschäftigt',kobra_printing:'Druckt',kobra_preheating:'Aufheizen',kobra_auto_leveling:'Nivellierung',kobra_checking:'Prüfung',kobra_updated:'Aktualisierung',kobra_init:'Initialisierung',kobra_pausing:'Pausiert...',kobra_paused:'Pausiert',kobra_resuming:'Fortsetzen...',kobra_resumed:'Fortgesetzt',kobra_stopping:'Stoppt...',kobra_stoped:'Gestoppt',kobra_finished:'Abgeschlossen',kobra_failed:'Fehler',kobra_canceled:'Abgebrochen',kobra_offline:'Offline', nav_dashboard:'Dashboard',nav_print:'Druck',nav_temps:'Temperaturen',nav_motion:'Achsen',nav_ams:'AMS',nav_extras:'Licht / Lüfter',nav_console:'Konsole', card_progress:'Fortschritt',card_temps:'Temperaturen',card_light_fan:'Lüfter',card_speed:'Druckgeschwindigkeit',card_cam:'Kamera', speed_silent:'🐢 Leise',speed_normal:'⚡ Normal',speed_sport:'🚀 Sport', @@ -1143,7 +1155,7 @@ var LANG_DE={ }; var LANG_EN={ header_status_standby:'Ready',header_status_printing:'Printing',header_status_complete:'Complete',header_status_error:'Error', - kobra_free:'Ready',kobra_busy:'Busy',kobra_printing:'Printing',kobra_preheating:'Preheating',kobra_auto_leveling:'Auto Leveling',kobra_checking:'Checking',kobra_updated:'Updating',kobra_init:'Initializing',kobra_finished:'Finished',kobra_failed:'Error',kobra_canceled:'Cancelled',kobra_offline:'Offline', + kobra_free:'Ready',kobra_busy:'Busy',kobra_printing:'Printing',kobra_preheating:'Preheating',kobra_auto_leveling:'Auto Leveling',kobra_checking:'Checking',kobra_updated:'Updating',kobra_init:'Initializing',kobra_pausing:'Pausing...',kobra_paused:'Paused',kobra_resuming:'Resuming...',kobra_resumed:'Resumed',kobra_stopping:'Stopping...',kobra_stoped:'Stopped',kobra_finished:'Finished',kobra_failed:'Error',kobra_canceled:'Cancelled',kobra_offline:'Offline', nav_dashboard:'Dashboard',nav_print:'Print',nav_temps:'Temperatures',nav_motion:'Motion',nav_ams:'AMS',nav_extras:'Light / Fan',nav_console:'Console', card_progress:'Progress',card_temps:'Temperatures',card_light_fan:'Fan',card_speed:'Print Speed',card_cam:'Camera', speed_silent:'🐢 Silent',speed_normal:'⚡ Normal',speed_sport:'🚀 Sport',