Compare commits
3 Commits
v0.9.1-bet
...
v0.9.1-bet
| Author | SHA1 | Date | |
|---|---|---|---|
| 14400dd799 | |||
| 0fb9a71390 | |||
| e81cdefd71 |
@@ -1,6 +1,6 @@
|
|||||||
# KX-Bridge – Anycubic Kobra X Moonraker Bridge
|
# KX-Bridge – Anycubic Kobra X Moonraker Bridge
|
||||||
|
|
||||||
**Version:** 0.9.1-beta4
|
**Version:** 0.9.1-beta5
|
||||||
**Status:** Public Beta – suitable for home users, feedback welcome
|
**Status:** Public Beta – suitable for home users, feedback welcome
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|||||||
257
README.md
257
README.md
@@ -1,9 +1,25 @@
|
|||||||
# KX-Bridge – Anycubic Kobra X Moonraker Bridge
|
# KX-Bridge
|
||||||
|
|
||||||
**Version:** 0.9.1-beta4
|
Verbindet den Anycubic Kobra X mit OrcaSlicer – ohne Klipper, ohne Raspberry Pi.
|
||||||
**Status:** Public Beta – für Heimanwender geeignet, Feedback willkommen
|
|
||||||
|
|
||||||
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.
|
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-beta5
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -24,129 +40,93 @@ KX-Bridge ist eine Moonraker-kompatible HTTP/WebSocket-Bridge für den **Anycubi
|
|||||||
|
|
||||||
## Voraussetzungen
|
## Voraussetzungen
|
||||||
|
|
||||||
- Anycubic Kobra X im lokalen Netzwerk (LAN, nicht WLAN-Isolation)
|
- Anycubic Kobra X im LAN-Modus (Drucker muss über LAN erreichbar sein, nicht nur über Anycubic-Cloud)
|
||||||
- MQTT-Credentials des Druckers (→ siehe [Credentials extrahieren](#credentials-extrahieren))
|
- PC, NAS oder Server im gleichen Netzwerk (Windows oder Linux)
|
||||||
- Docker **oder** Python 3.9+ **oder** direkt die Linux-Binary
|
- Docker oder Python 3.9+
|
||||||
|
- MQTT-Zugangsdaten des Druckers → [Schritt 1](#schritt-1-zugangsdaten-ermitteln)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Schnellstart – Docker (empfohlen)
|
## Schnellstart
|
||||||
|
|
||||||
```bash
|
### Schritt 1: Zugangsdaten ermitteln
|
||||||
# 1. .env anlegen
|
|
||||||
cp .env.example .env
|
|
||||||
# .env mit deinen Druckerdaten befüllen (→ extract_credentials)
|
|
||||||
|
|
||||||
# 2. Bridge starten
|
Die Bridge benötigt druckerspezifische MQTT-Zugangsdaten.
|
||||||
docker compose up -d
|
|
||||||
|
|
||||||
# 3. In OrcaSlicer: Drucker → "Moonraker" → http://BRIDGE-IP:7125
|
> **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.
|
||||||
```
|
|
||||||
|
|
||||||
Logs prüfen:
|
AnycubicSlicerNext starten und mit dem Drucker verbinden (bis der Drucker-Status angezeigt wird), dann:
|
||||||
```bash
|
|
||||||
docker compose logs -f
|
|
||||||
```
|
|
||||||
|
|
||||||
Update:
|
|
||||||
```bash
|
|
||||||
docker compose pull && docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Schnellstart – Binary (Linux)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
chmod +x kx-bridge
|
|
||||||
./kx-bridge --printer-ip 192.168.x.x --username userXXXX --password XXXXX \
|
|
||||||
--device-id XXXXX --mode-id 20030
|
|
||||||
```
|
|
||||||
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Credentials extrahieren
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
```
|
```
|
||||||
extract_credentials.exe --write-env
|
extract_credentials.exe --write-env
|
||||||
```
|
```
|
||||||
|
|
||||||
Schreibt die gefundenen Credentials direkt in `.env`.
|
**Linux:**
|
||||||
|
|
||||||
### Linux
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chmod +x extract_credentials
|
chmod +x extract_credentials
|
||||||
./extract_credentials --write-env
|
./extract_credentials --write-env
|
||||||
```
|
```
|
||||||
|
|
||||||
### Ausgabe
|
Die Zugangsdaten werden automatisch in `.env` gespeichert.
|
||||||
|
|
||||||
```
|
> Falls das Ergebnis unsicher wirkt: `--verbose` zeigt alle gefundenen Kandidaten. Den richtigen Wert manuell in `.env` eintragen.
|
||||||
[*] 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.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Konfiguration (.env)
|
### Schritt 2: Konfiguration prüfen
|
||||||
|
|
||||||
```env
|
```bash
|
||||||
PRINTER_IP=192.168.x.x # IP des Druckers
|
cp .env.example .env
|
||||||
MQTT_PORT=9883 # Standard, nicht ändern
|
# .env öffnen und Werte kontrollieren
|
||||||
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
|
### Schritt 3: Bridge starten
|
||||||
|
|
||||||
1. Drucker hinzufügen → **Anycubic Kobra X** (oder generischer Klipper-Drucker)
|
**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
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option C – Python direkt:**
|
||||||
|
```bash
|
||||||
|
pip install aiohttp
|
||||||
|
python kobrax_moonraker_bridge.py
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Schritt 4: OrcaSlicer-Profil installieren
|
||||||
|
|
||||||
|
1. `kobra_x_orcaslicer_preset.zip` in OrcaSlicer importieren:
|
||||||
|
Datei → Konfigurationen importieren → ZIP auswählen
|
||||||
|
2. Anycubic Kobra X als Drucker auswählen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Schritt 5: OrcaSlicer verbinden
|
||||||
|
|
||||||
|
1. Drucker-Einstellungen öffnen
|
||||||
2. Verbindungstyp: **Moonraker**
|
2. Verbindungstyp: **Moonraker**
|
||||||
3. IP: `http://BRIDGE-HOST:7125`
|
3. Adresse: `http://IP-DES-BRIDGE-PC:7125` eintragen
|
||||||
4. Verbindung testen → sollte "Online" anzeigen
|
4. Auf „Test" klicken – bei erfolgreicher Verbindung erscheint eine Bestätigungsmeldung
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Web-UI
|
## Web-UI
|
||||||
|
|
||||||
Die Bridge stellt unter `http://BRIDGE-HOST:7125` eine Web-Oberfläche bereit:
|
Die Bridge stellt unter `http://BRIDGE-IP:7125` eine Web-Oberfläche bereit:
|
||||||
|
|
||||||
| Bereich | Funktion |
|
| Bereich | Funktion |
|
||||||
|---------|----------|
|
|---------|----------|
|
||||||
@@ -156,56 +136,55 @@ Die Bridge stellt unter `http://BRIDGE-HOST:7125` eine Web-Oberfläche bereit:
|
|||||||
| Druckgeschwindigkeit | Leise / Normal / Sport |
|
| Druckgeschwindigkeit | Leise / Normal / Sport |
|
||||||
| Lüfter / Licht | Lüfterdrehzahl und Drucklicht |
|
| Lüfter / Licht | Lüfterdrehzahl und Drucklicht |
|
||||||
| AMS | Filament einziehen / ausziehen |
|
| AMS | Filament einziehen / ausziehen |
|
||||||
| Kamera | Live-Vorschau (falls Drucker unterstützt) |
|
| Kamera | Live-Vorschau (falls vom Drucker unterstützt) |
|
||||||
| ⚙ Einstellungen | MQTT-Zugangsdaten, Poll-Intervall, Self-Update |
|
| ⚙ Einstellungen | MQTT-Zugangsdaten, Poll-Intervall, Self-Update |
|
||||||
|
|
||||||
### 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 die Bridge automatisch mit der neuen Version 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 sie automatisch neu.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## bridge.sh (Linux Service-Manager)
|
## bridge.sh – Service-Manager (Linux)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./bridge.sh start # Bridge im Hintergrund starten
|
./bridge.sh start # Im Hintergrund starten
|
||||||
./bridge.sh stop # Bridge beenden
|
./bridge.sh stop # Beenden
|
||||||
./bridge.sh restart # Neustarten
|
./bridge.sh restart # Neustarten
|
||||||
./bridge.sh status # Status und Port prüfen
|
./bridge.sh status # Status anzeigen
|
||||||
./bridge.sh log 50 # Letzte 50 Log-Zeilen
|
./bridge.sh log 50 # Letzte 50 Log-Zeilen
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Druckerzustände
|
## Docker – Nützliche Befehle
|
||||||
|
|
||||||
Die Bridge übersetzt die internen Kobra-Zustände in Moonraker-kompatible Zustände:
|
```bash
|
||||||
|
docker compose up -d # Starten
|
||||||
| Kobra-Zustand | Bedeutung |
|
docker compose down # Stoppen
|
||||||
|---------------|-----------|
|
docker compose logs -f # Logs verfolgen
|
||||||
| free | Bereit |
|
docker compose pull && docker compose up -d # Update
|
||||||
| printing / busy | Druckt |
|
```
|
||||||
| pausing / paused | Pausiert |
|
|
||||||
| resuming / resumed | Wird fortgesetzt |
|
|
||||||
| stopping / stoped | Wird gestoppt |
|
|
||||||
| finished | Abgeschlossen |
|
|
||||||
| canceled | Abgebrochen |
|
|
||||||
| failed | Fehler |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Fehlerbehebung
|
## Fehlerbehebung
|
||||||
|
|
||||||
**Port 7125 bereits belegt:**
|
**Port 7125 belegt:**
|
||||||
```bash
|
```bash
|
||||||
./bridge.sh stop # oder: fuser -k 7125/tcp
|
./bridge.sh stop
|
||||||
./bridge.sh start
|
./bridge.sh start
|
||||||
```
|
```
|
||||||
|
|
||||||
**Credentials ungültig / Verbindung abgelehnt:**
|
**Verbindungstest in OrcaSlicer schlägt fehl:**
|
||||||
- AnycubicSlicerNext starten, mit Drucker verbinden, `extract_credentials` erneut ausführen
|
- Firewall prüfen: Port 7125 muss erreichbar sein
|
||||||
- Falls das Ergebnis unsicher wirkt: `extract_credentials --verbose` zeigt alle Kandidaten an
|
- Bridge-Log prüfen: `./bridge.sh log` oder `docker compose logs`
|
||||||
- Den richtigen Kandidaten manuell in `.env` eintragen und Bridge neu starten
|
- 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
|
||||||
|
|
||||||
**Temperaturänderungen werden ignoriert:**
|
**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.
|
- Während eines laufenden Drucks werden Temperaturänderungen über einen separaten Kanal gesendet — das ist normal und wird von der Bridge automatisch erkannt.
|
||||||
@@ -213,26 +192,21 @@ Die Bridge übersetzt die internen Kobra-Zustände in Moonraker-kompatible Zust
|
|||||||
**Docker: Permission denied:**
|
**Docker: Permission denied:**
|
||||||
```bash
|
```bash
|
||||||
sudo usermod -aG docker $USER
|
sudo usermod -aG docker $USER
|
||||||
# Neu einloggen
|
# Neu einloggen, dann erneut versuchen
|
||||||
```
|
|
||||||
|
|
||||||
**Docker: .env nicht gefunden:**
|
|
||||||
```bash
|
|
||||||
# .env muss im gleichen Verzeichnis wie docker-compose.yml liegen
|
|
||||||
cp .env.example .env && nano .env
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Logs
|
## Konfigurationsreferenz (.env)
|
||||||
|
|
||||||
```bash
|
| Parameter | Beschreibung | Beispiel |
|
||||||
# Docker
|
|-----------|-------------|---------|
|
||||||
docker compose logs -f kx-bridge
|
| `PRINTER_IP` | IP-Adresse des Druckers | `192.168.1.100` |
|
||||||
|
| `MQTT_PORT` | MQTT-Port (nicht ändern) | `9883` |
|
||||||
# Binary / Python
|
| `MQTT_USERNAME` | Benutzername (beginnt mit „user") | `userXXXXXXXXXX` |
|
||||||
tail -f /tmp/bridge.log # bei Nutzung von bridge.sh
|
| `MQTT_PASSWORD` | Passwort (~15 Zeichen) | `***` |
|
||||||
```
|
| `DEVICE_ID` | Geräte-ID (32 Hex-Zeichen) | `xxxxxxxx...` |
|
||||||
|
| `MODE_ID` | Modell-ID (Kobra X Standard) | `20030` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -240,11 +214,14 @@ tail -f /tmp/bridge.log # bei Nutzung von bridge.sh
|
|||||||
|
|
||||||
- Die Bridge bindet standardmäßig auf `0.0.0.0:7125` — nur im lokalen Netzwerk nutzen
|
- Die Bridge bindet standardmäßig auf `0.0.0.0:7125` — nur im lokalen Netzwerk nutzen
|
||||||
- `.env` enthält Drucker-Credentials — nicht öffentlich teilen
|
- `.env` enthält Drucker-Credentials — nicht öffentlich teilen
|
||||||
- Die Credentials sind druckerspezifisch und haben keinen Zugang zu Anycubic-Cloud-Diensten
|
- Alle Zugangsdaten werden ausschließlich lokal verarbeitet — keine Übertragung an externe Server
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Lizenz & Rechtliches
|
## Hinweis zur Nutzung
|
||||||
|
|
||||||
Dieses Projekt entstand durch Interoperabilitätsforschung gem. §69e UrhG.
|
Dieses Projekt dient der privaten Nutzung und der Herstellung von Interoperabilität zwischen dem Anycubic Kobra X und freier Software (OrcaSlicer).
|
||||||
Ausschließlich für private, nicht-kommerzielle Nutzung.
|
|
||||||
|
`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.
|
||||||
|
|||||||
24
anycubic_slicer.crt
Normal file
24
anycubic_slicer.crt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEDTCCAvWgAwIBAgICAZAwDQYJKoZIhvcNAQEFBQAwgZsxCzAJBgNVBAYTAkNO
|
||||||
|
MRIwEAYDVQQIDAlHdWFuZ2RvbmcxETAPBgNVBAcMCFNoZW56aGVuMREwDwYDVQQK
|
||||||
|
DAhBbnljdWJpYzERMA8GA1UECwwIQW55Y3ViaWMxEzARBgNVBAMMCkFDIFJvb3Qg
|
||||||
|
Q0ExKjAoBgkqhkiG9w0BCQEWG2FueWN1YmljX2Nsb3VkQGFueWN1YmljLmNvbTAg
|
||||||
|
Fw0yMzA3MjAwMzI3NTFaGA8yMTIzMDcyMTAzMjc1MVowgZ8xCzAJBgNVBAYTAkNO
|
||||||
|
MRIwEAYDVQQIDAlHdWFuZ2RvbmcxETAPBgNVBAcMCFNoZW56aGVuMREwDwYDVQQK
|
||||||
|
DAhBbnljdWJpYzERMA8GA1UECwwIQW55Y3ViaWMxFzAVBgNVBAMMDkFueWN1Ymlj
|
||||||
|
U2xpY2VyMSowKAYJKoZIhvcNAQkBFhthbnljdWJpY19jbG91ZEBhbnljdWJpYy5j
|
||||||
|
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdoQ7g2F/yecfpdlqT
|
||||||
|
b8W/84r3vQ4ZEWx2PbSTBcGD55HmzJp2lwABHFHbn4CltT9YzoJWpOiVMHYnyPep
|
||||||
|
43tkNUIcGm7z0jrTD5djyYjVAzEitkNzJspKK/xcVmZe/V7Q3IAWXtzgWCd0YpVk
|
||||||
|
K3J0HqoqJvcTSnYe4VXxbIGwbpeYyji9W/DuG1M4Z+sFiPDWeR9xo5IXRU5ZwaTP
|
||||||
|
8OiCCLSBbeKgf0UFWTIZdJ1JXJ7efbbstZOjf5L9LhBIC0hLdL4jlMpF7r0ThecJ
|
||||||
|
cTx9Bnw/hhy+i32rJTRzZDIaLhKg/bka9ZrORZdxxQRiPoMjLjoxtr4+AUaeLWkI
|
||||||
|
ajSJAgMBAAGjUzBRMB0GA1UdDgQWBBRI4P3/uKdYYFPEcFIwYxdv1p9gETAfBgNV
|
||||||
|
HSMEGDAWgBQlkDqpFERfr3u1rR9gNbNKtgrHIjAPBgNVHRMBAf8EBTADAQH/MA0G
|
||||||
|
CSqGSIb3DQEBBQUAA4IBAQBP3ws80Y9eBR2lpjYP3rVvH8kA6+LnEXT4PpHj+fSw
|
||||||
|
jciaNskzpiwNvBy00m32ACR5YKlMUjevlQuyyw+LQbTUwAEOwyy9SDQpiXdjL6q3
|
||||||
|
SPQ4aB4A57nFXOGrthc/nb9yFcteWrZrKbwvVUu2vqU7U8n7lJKjhVuFRWSXS3SV
|
||||||
|
sPc9JZ21kpPYWKbGtfD6jUlW0Ip+PurLw9FrbVwnEcOMf/ezSlrH5c8mfJyo8pVk
|
||||||
|
aC/6PpReqijusOSRZ5oLyhPvtgddXseJFByun1Ud0CDlFA05nGGPmnVcXD+GMnHH
|
||||||
|
i6baCTeifwp5Jpdzv4imcCPvayKUNuX32vYNfNkWC/R5
|
||||||
|
-----END CERTIFICATE-----
|
||||||
28
anycubic_slicer.key
Normal file
28
anycubic_slicer.key
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdoQ7g2F/yecfp
|
||||||
|
dlqTb8W/84r3vQ4ZEWx2PbSTBcGD55HmzJp2lwABHFHbn4CltT9YzoJWpOiVMHYn
|
||||||
|
yPep43tkNUIcGm7z0jrTD5djyYjVAzEitkNzJspKK/xcVmZe/V7Q3IAWXtzgWCd0
|
||||||
|
YpVkK3J0HqoqJvcTSnYe4VXxbIGwbpeYyji9W/DuG1M4Z+sFiPDWeR9xo5IXRU5Z
|
||||||
|
waTP8OiCCLSBbeKgf0UFWTIZdJ1JXJ7efbbstZOjf5L9LhBIC0hLdL4jlMpF7r0T
|
||||||
|
hecJcTx9Bnw/hhy+i32rJTRzZDIaLhKg/bka9ZrORZdxxQRiPoMjLjoxtr4+AUae
|
||||||
|
LWkIajSJAgMBAAECggEASwRkC9lRiLqN30kvWW5g6hsec8KrTfLm2pMCVy2AlgxB
|
||||||
|
B3VD51YvKzERyBwSKITT/1RPK9K/4xe3NrpAkmGsd3vLd8W+vorvXFePr7gct7VP
|
||||||
|
4Wb+J7D+keKXlg2sswRiHqI0PN45Nzq/iBaCaJiIMiPbB0+PHBl9J/Cv7XsD3tq+
|
||||||
|
9WKhvXf2g1g9GMrLaCCcWXWCqcu0LlbqJnw3yMnJLSltmyFTmlVLjDHM75bMVz97
|
||||||
|
4emQzOlnRN2yA5cWWCaM+mgjNM2aWwUsXBZzCgwSqSaj1QD4B/epCuDBORWHS9D6
|
||||||
|
jL15w8xjly9q8OS+4d6beR5h9GiPyMK4Ff2wXImCXQKBgQDwXxtrL+kVZrQ/qftj
|
||||||
|
24F3+QDN0j5Z3lUMTfZPn6ng/E/aBfn8KcWJHj2vYkKZdB5wOXJr56BYe3Hukzfp
|
||||||
|
QF0E2+g1WAGskF1mb/vVab54geox5Y6CA+ionRn2kcCwybVkktR/0JK2UV9Qjb/z
|
||||||
|
k1WU+RUhNrW/GDBqYulaadnR+wKBgQDsCf2/yKGPxj4pIvAtn5RFSlfscddgkSnc
|
||||||
|
ouBkDXEp5ta+5PGrlrdzS/F0vFhvBPbfbVJxVwRnM/Oqj8c0/bj7oc5RpPxirciO
|
||||||
|
AaovKVPTiORaviytnB2HgkflkJfy5vdXv4ZQahAV/UwtSmLwBshe+Ya68MAFrQRa
|
||||||
|
7M4z6k4QSwKBgQCm7OVVoofzXMeADsONrTpT3pA4XvD95/CYAuwyj2ah35Z0igH4
|
||||||
|
o+mSN3YO/eXSO1mIBdz4Inqv98o/K+2ABjqSzUSNBvjipb63DL2Oj0i+1zmUPR6i
|
||||||
|
G6TOs4r8OGvgWbOmjHEV8fpwskHG5ymONZsRQYjy79N3SY0V1GrJZwjlUQKBgD0x
|
||||||
|
AeWcP7YkMK09b4KEYk3sTgrwIGPafj3Cw+VsTrAMNhPbCoPvWLO9NmWLBmoRoWae
|
||||||
|
0sarRmry3vKSv5QPSsuBURl9aiiy4NFfwRzk2+R1Eq4rqy1+0XD152muKJZCJlFL
|
||||||
|
R6jFNlJdDkiXhjqvp3ZnvfPswfs2tXBU/8gZsA8tAoGBALXfc5m9I5R1l1zN7tpa
|
||||||
|
ncA0S3EKzqmuCc3KzlS6OS0e9Lz1MsmfEsvxvW3w4SrdfTbwQpEy9RNg89dlgPtc
|
||||||
|
rdId1QdN2eWPY5M4lz9n9EYdzi9ufoKAEYu2a0lP+qz690JwmL1Jx49bvQEn5Nu0
|
||||||
|
4swn72uwBRlhjAw46MF77SBQ
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -3,12 +3,14 @@ env_loader.py – lädt Verbindungsparameter aus .env (Repo-Root oder Arbeitsver
|
|||||||
Umgebungsvariablen haben Vorrang vor .env-Werten.
|
Umgebungsvariablen haben Vorrang vor .env-Werten.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import pathlib
|
import pathlib
|
||||||
|
|
||||||
|
_BASE = pathlib.Path(sys.executable).parent if getattr(sys, "frozen", False) else pathlib.Path(__file__).parent
|
||||||
|
|
||||||
|
|
||||||
def _find_env_file() -> pathlib.Path | None:
|
def _find_env_file() -> pathlib.Path | None:
|
||||||
# Suche .env im selben Verzeichnis, dann im Parent (Repo-Root)
|
for base in (_BASE, _BASE.parent):
|
||||||
for base in (pathlib.Path(__file__).parent, pathlib.Path(__file__).parent.parent):
|
|
||||||
p = base / ".env"
|
p = base / ".env"
|
||||||
if p.is_file():
|
if p.is_file():
|
||||||
return p
|
return p
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import json
|
|||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import ssl
|
import ssl
|
||||||
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
@@ -27,7 +28,7 @@ from datetime import datetime
|
|||||||
|
|
||||||
import env_loader
|
import env_loader
|
||||||
|
|
||||||
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
_SCRIPT_DIR = os.path.dirname(sys.executable) if getattr(sys, "frozen", False) else os.path.dirname(os.path.abspath(__file__))
|
||||||
CERT_FILE = os.path.join(_SCRIPT_DIR, "anycubic_slicer.crt")
|
CERT_FILE = os.path.join(_SCRIPT_DIR, "anycubic_slicer.crt")
|
||||||
KEY_FILE = os.path.join(_SCRIPT_DIR, "anycubic_slicer.key")
|
KEY_FILE = os.path.join(_SCRIPT_DIR, "anycubic_slicer.key")
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,9 @@ import tempfile
|
|||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
# kobrax_client aus dem selben Verzeichnis importieren
|
# Bei PyInstaller-Binary liegt alles neben sys.executable, sonst neben __file__
|
||||||
sys.path.insert(0, os.path.dirname(__file__))
|
_BASE = os.path.dirname(sys.executable) if getattr(sys, "frozen", False) else os.path.dirname(os.path.abspath(__file__))
|
||||||
|
sys.path.insert(0, _BASE)
|
||||||
from kobrax_client import KobraXClient
|
from kobrax_client import KobraXClient
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -1960,7 +1961,7 @@ function toggleCam(){if(camOn)camStop();else camStart()}
|
|||||||
|
|
||||||
def _find_env_path(self) -> pathlib.Path:
|
def _find_env_path(self) -> pathlib.Path:
|
||||||
"""Gibt den Pfad zur .env-Datei zurück (neben Script oder im Parent)."""
|
"""Gibt den Pfad zur .env-Datei zurück (neben Script oder im Parent)."""
|
||||||
script_dir = pathlib.Path(__file__).parent
|
script_dir = pathlib.Path(_BASE)
|
||||||
for base in (script_dir, script_dir.parent):
|
for base in (script_dir, script_dir.parent):
|
||||||
p = base / ".env"
|
p = base / ".env"
|
||||||
if p.is_file():
|
if p.is_file():
|
||||||
@@ -2031,20 +2032,19 @@ function toggleCam(){if(camOn)camStop();else camStart()}
|
|||||||
GITEA_RAW_BASE = "https://gitea.it-drui.de/viewit/KX-Bridge-Release/raw/tag"
|
GITEA_RAW_BASE = "https://gitea.it-drui.de/viewit/KX-Bridge-Release/raw/tag"
|
||||||
|
|
||||||
def _read_version(self) -> str:
|
def _read_version(self) -> str:
|
||||||
for base in (pathlib.Path(__file__).parent, pathlib.Path(__file__).parent.parent):
|
for base in (pathlib.Path(_BASE), pathlib.Path(_BASE).parent):
|
||||||
p = base / "VERSION"
|
p = base / "VERSION"
|
||||||
if p.is_file():
|
if p.is_file():
|
||||||
return p.read_text(encoding="utf-8").strip()
|
return p.read_text(encoding="utf-8").strip()
|
||||||
return "unknown"
|
return "unknown"
|
||||||
|
|
||||||
def _write_version(self, version: str):
|
def _write_version(self, version: str):
|
||||||
for base in (pathlib.Path(__file__).parent, pathlib.Path(__file__).parent.parent):
|
for base in (pathlib.Path(_BASE), pathlib.Path(_BASE).parent):
|
||||||
p = base / "VERSION"
|
p = base / "VERSION"
|
||||||
if p.is_file():
|
if p.is_file():
|
||||||
p.write_text(version + "\n", encoding="utf-8")
|
p.write_text(version + "\n", encoding="utf-8")
|
||||||
return
|
return
|
||||||
# Fallback: neben dem Script
|
(pathlib.Path(_BASE) / "VERSION").write_text(version + "\n", encoding="utf-8")
|
||||||
(pathlib.Path(__file__).parent.parent / "VERSION").write_text(version + "\n", encoding="utf-8")
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _parse_version(v: str) -> "tuple[int, ...]":
|
def _parse_version(v: str) -> "tuple[int, ...]":
|
||||||
@@ -2090,7 +2090,7 @@ function toggleCam(){if(camOn)camStop();else camStart()}
|
|||||||
new_tag = data.get("tag", "")
|
new_tag = data.get("tag", "")
|
||||||
if not download_url:
|
if not download_url:
|
||||||
return web.json_response({"error": "download_url fehlt"}, status=400)
|
return web.json_response({"error": "download_url fehlt"}, status=400)
|
||||||
script_path = pathlib.Path(__file__).resolve()
|
script_path = pathlib.Path(sys.executable if getattr(sys, "frozen", False) else __file__).resolve()
|
||||||
try:
|
try:
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
async with session.get(download_url, timeout=aiohttp.ClientTimeout(total=30)) as resp:
|
async with session.get(download_url, timeout=aiohttp.ClientTimeout(total=30)) as resp:
|
||||||
|
|||||||
Reference in New Issue
Block a user