Compare commits

...

2 Commits

Author SHA1 Message Date
ce416f3b9a ci: release.yml nur noch Docker-Build (Release macht release.sh)
All checks were successful
Nightly Build / build (push) Successful in 3m43s
- "Create Gitea Release"-Step entfernt → keine doppelte Release-Erstellung
  mehr (release.sh legt Release + englischen Auto-Changelog + Assets an).
- Image-Tag strippt fuehrendes 'v' (VERSION-Datei hat keins).
- Tag-Pattern auf 'v*' erweitert (vorher matchte v0.9.x.y-Hotfixes nicht).
2026-06-26 23:45:23 +02:00
67c013f4ff nightly: 0.9.27-nightly9
All checks were successful
Nightly Build / build (push) Successful in 3m41s
2026-06-26 23:19:02 +02:00
4 changed files with 11 additions and 261 deletions

View File

@@ -3,7 +3,7 @@ name: Stable Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'v*'
jobs:
release:
@@ -56,9 +56,10 @@ jobs:
echo "${{ secrets.REGISTRY_TOKEN }}" | \
docker login gitea.it-drui.de -u "${{ secrets.REGISTRY_USER }}" --password-stdin
# Strip fuehrendes 'v' fuer den Image-Tag (VERSION-Datei hat kein 'v').
- name: Build & push (amd64 + arm64)
run: |
VERSION="${GITHUB_REF#refs/tags/}"
VERSION="${GITHUB_REF#refs/tags/v}"
docker buildx build \
--platform linux/amd64,linux/arm64 \
--push \
@@ -68,20 +69,6 @@ jobs:
-t "gitea.it-drui.de/viewit/kx-bridge:${VERSION}" \
.
- name: Create Gitea Release
env:
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
VERSION="${GITHUB_REF#refs/tags/}"
CHANGELOG=$(awk "/^## \[${VERSION}\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md || echo "")
curl -s -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
"https://gitea.it-drui.de/api/v1/repos/viewit/KX-Bridge-Release/releases" \
-d "{
\"tag_name\": \"${VERSION}\",
\"name\": \"KX-Bridge ${VERSION}\",
\"body\": $(echo "$CHANGELOG" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))'),
\"draft\": false,
\"prerelease\": false
}"
# Hinweis: Das Gitea-Release (inkl. englischem Auto-Changelog + Binaries als
# Assets) erstellt release.sh synchron, da es die lokal via CodeBuilder
# gebauten Binaries direkt hochlaedt. Dieser Workflow baut nur das Docker-Image.

View File

@@ -1,9 +1,10 @@
## KX-Bridge 0.9.27-nightly8 — Nightly Build
## KX-Bridge 0.9.27-nightly9 — Nightly Build
[experimentell] Ungetestete Features, nur für Tester geeignet.
### Änderungen seit `v0.9.13`
### Änderungen seit `v0.9.26`
- fix(spoolman): Status-Dot beim Seitenload initialisieren
- chore: CHANGES.md mit echtem Changelog aus Dev-Repo ins Release-Repo schreiben
- fix(spoolman): SPOOLMAN_* env-Cache bei Restart leeren, Status-Dot nach Save aktualisieren
- chore: README.es.md + CONTRIBUTING.md in release.sh-Sync aufnehmen
@@ -20,245 +21,6 @@
- feat(release): Nightly/Stable Release-Workflow mit eigenem Docker-Tag
- feat(spoolman): optionale Spoolman-Filamentverbrauch-Integration (PR #65, @p2l)
- fix(release): Artifact-Download per HTTP statt lokalem Dateipfad
- feat(ui): PR #60 — Print-Workflow + Skip-Dialog Fixes (@gangoke)
- Revert "feat(ui): PR #60 — Print-Workflow + Skip-Dialog Fixes (@gangoke)"
- feat(ui): PR #60 — Print-Workflow + Skip-Dialog Fixes (@gangoke)
- fix(release): PyInstaller-Cache zwischen Builds via extra_git_cmds leeren
- fix(upload): File-Browser nur GCode zulassen (Issue #59)
- fix(mqtt): TLS-Socket Read/Write-Race — Segfault in libcrypto (Issue #53)
- feat(ui): Slot-Mapper Skip-Parität + konkrete Profilnamen (Issue #57)
- feat(print): Auto-Open-Druckdialog + Per-Print-Auto-Leveling + Skip-Fix (PR #56)
- feat(ui): Idle-Buttons im Progress-Card + fix(moonraker): Mobileraker-Kompatibilität (Issue #48, #55)
- feat(filament): Vendor-Visibility-Filter für Profil-Dropdown (Issue #41)
- feat(ui): Settings als Master-Detail-Panel mit Kategorie-Sidebar
- chore: CodeBuilder-URL auf 192.168.178.204 gesetzt
- docs(changelog): 0.9.21 — Android-Kamera, IPv4, Debian-Bookworm, Mobileraker-Fix
- fix(ui): Kamera-Stream auf Android via Snapshot-Polling
- fix(docker): python:3.11-slim-bookworm pinnen (glibc 2.41 GPF auf älteren Kerneln, Issue #53)
- fix(moonraker): configfile extruder-Stub um sensor_type + filament_diameter erweitert (Mobileraker #48)
- fix(release): Artifact-Pfad /app/ → Host-Pfad umschreiben
- docs(changelog): 0.9.20 — French, Z-height, camera fixes, light bug
- fix(docker): ffmpeg ins Image aufnehmen
- chore(i18n): Log-Meldungen auf Englisch umgestellt
- chore(security): 04_configs/decrypted/ zu .gitignore hinzugefügt
- fix(camera): Kamera-Autostart ignoriert Setting nach Bridge-Restart (#50)
- feat(i18n): Französisch hinzugefügt (PR #45, @Nathacks)
- merge: PR #49 — Z-Höhe in der Print-UI anzeigen (@Nathacks)
- Revert "fix(ace): ACE-Slot-Offset um 1 korrigiert (Issue #47)"
- fix(ace): ACE-Slot-Offset um 1 korrigiert (Issue #47)
- fix(compat): configfile-Stub + absolute Webcam-URLs für Mobileraker/Obico
- docs(claude): CLAUDE.md auf aktuellen Stand 0.9.19.1
- docs(changelog): translate 0.9.19.1 entry to English (CHANGELOG.md was German by mistake)
- fix(spec): VERSION-Datei ins Onefile einbetten — beseitigt vunknown in standalone Binaries
- chore: CHANGELOG 0.9.19.1 + VERSION zurueck fuer release.sh-Bump
- feat(filaments): nur Kobra-X-sichtbare Profile (209 statt 399)
- fix(mqtt): klare Meldung wenn anycubic_slicer.crt/.key fehlen (statt Errno 2)
- chore(gitignore): ignore lokale Build-/Test-/TODO-Pfade
- fix(spec): VERSION-Datei ins Onefile einbetten — beseitigt vunknown in standalone Binaries
- docs(changelog): 0.9.19.1 hotfix entry
- docs(changelog): remove internal test-profile name 'Bert - PLA'
- docs: README — Features für 0.9.17/18/19 + OrcaSlicer-KX-PR-Liste + Kobra S1/S1Max-Hinweis
- chore: 0.9.19 — filament sync matches real presets, custom profile import
- fix(profile-import): User-Profile mit Inherits-Kette parsen
- fix(ui): Slot-Card direkt nach Speichern neu rendern
- fix(filament-sync): Default ist Generic <Typ> statt Anycubic <Typ>
- fix(filament-sync): Phantom-Profile raus, Default-Lookup aus JSON
- feat(filament-sync): gate_filament_name im HH-MMU-Objekt befüllen
- feat(filament-sync): sende name + vendor_name pro Lane (PR #13719-kompatibel)
- fix(ace-dryer): setDry fire-and-forget (PR #42 von @gangoke)
- feat(filament): Custom-Profile-Import via Bridge-UI Upload (Issue #41)
- fix(filament): Kobra-X-kompatible IDs in orca_filaments.json + Defaults
- chore: 0.9.18 — Filament set from bridge works, Obico Z-height, slot profile picker fixes
- feat(ui): Slot-Profil-Dropdown auf (vendor,name) + Pause/Resume-Toggle + Vendor-Badge auf Slot-Karte
- feat(bridge): Slot-Profil-Roundtrip + Z-Höhe für Obico + multiColorBox/setInfo via web/printer (Issue #39)
- feat(filament): (vendor,name)-Selector statt filament_id im config-Schema
- feat(i18n): sync Spanish translation refactor from KX-Bridge-Release PR #40
- fix(mqtt): persistenter Reconnect — Bridge erkennt Drucker-Reboot (Issue #33)
- chore: 0.9.17 — Obico (experimental), multi-language UI, filament-profile sync, H.264 stream
- fix(i18n): GCode-Browser nach Sprachwechsel neu rendern
- fix(upload): trennt Connect-/Send-/Read-Timeout für große GCode-Uploads
- feat(bridge): CameraCache + Translations-Route + h264-Endpoint
- feat(i18n): sync translation refactor from KX-Bridge-Release PR #37
- fix(temp): tempature/set über web/printer-Topic mit type-Feld
- fix(obico): Klipper-SET_HEATER_TEMPERATURE + korrekter MQTT-Pfad für Temp-Set
- fix(filament-list): erweiterte Vendor-Profile + Dropdown-Refresh bei Material-Wechsel
- feat(ams-sync): User-Override pro Slot für konkrete OrcaSlicer-Filament-Marke
- refactor(release): alle 3 kx-bridge-Targets via CodeBuilder-API
- feat(obico): Layer-aligned Time-Lapse + First-Layer-Scan Pseudo-Macros
- fix(obico): start_time/end_time als Unix-Timestamp (float) statt ISO-String
- feat(obico): Moonraker-Kompatibilität für moonraker-obico-Plugin
- feat: GCode Web-Upload + Download + Verify-Dialog (PR #32 von @gangoke)
- docs: OrcaSlicer-KX (gepatchter Slicer) im README verlinken
- docs: CHANGELOG 0.9.16 — Filament-Sync-Fix ergänzt
- fix: Filament-Sync positionstreu + Happy-Hare-Farbformat (OrcaSlicer)
- docs: CHANGELOG 0.9.16
- fix: i18n-Lücken im ACE-Dry-Dialog (DE-Übersetzungen + fehlender Key)
- fix: Slicer-Zeit + Thumbnail nach Reload / bei OrcaSlicer-Druck anzeigen
- feat: Settings-Option "Kamera bei Druckstart einschalten"
- feat: Log-Verbesserungen (Dedup-Zähler, Level-Filter, Fehler-Toast, mehr Infos)
- fix: einfarbiger Druck blockiert durch leeren AMS-Slot (OrcaSlicer)
- fix: release.sh resynct Windows-Agent hart vor dem Build
- docs: CHANGELOG 0.9.15 (Issue #29 OrcaSlicer-Webview-Fixes)
- fix: Print-Banner + UI im OrcaSlicer-Webview (Issue #29)
- fix: Upload-Banner nach Druckende ausblenden (Issue #29)
- docs: CHANGELOG 0.9.14 (Theme-System #27, API-Restart #28)
- feat: POST /api/restart Endpoint (PR #28 von @gangoke)
- fix: release.sh stellt kx-bridge.spec im Release-Repo sicher (Windows-Theme-Build)
- chore: kx-bridge.spec von *.spec-ignore ausnehmen
- build: kx-bridge.spec ins Repo aufnehmen (war durch *.spec geignored)
- build: einheitlicher PyInstaller-Spec für Linux + Windows (Theme-Einbettung)
- feat: Theme-System (PR #27 von hirnwunde/Olli)
- docs: klare Update-Warnung (EXE/Docker) im 0.9.13-CHANGELOG
- docs: CHANGELOG 0.9.13 (Self-Update-Fix)
- fix: Self-Update lädt alle Bridge-Module (nicht nur Hauptdatei)
- docs: CHANGELOG 0.9.12
- docs: Downloads-Badge in READMEs (800+ App-Downloads)
- docs: Home-Assistant-Integration (Community) verlinken (Issue #24)
- revert: Moonraker-UI-Integration entfernen (Mainsail/Fluidd/Mobileraker)
- fix: Mainsail Live-Werte + Pause-State (Issue #25)
- feat: Moonraker-Kompatibilität für Mainsail/Fluidd/Mobileraker (Issue #25)
- refactor: Frontend aus kobrax_moonraker_bridge.py auslagern
- docs: CHANGELOG 0.9.11 (ACE Pro 2 experimentell) + Version-Bump
- feat: ACE Pro 2 Support (PR #26 von gangoke)
- release: LICENSE + NOTICE.md ins Release-Repo syncen
- docs: GPLv3-Lizenz + NOTICE für Anycubic-Drittmaterial
- release: PyBuilder statt GitHub Actions fuer Windows-Build
- release: Versions-Marker-Check entfernt (Binary enthaelt VERSION nicht)
- release: verify_binary nutzt kobrax_moonraker_bridge + VERSION als Marker
- docs: CHANGELOG fuer 0.9.10 + Fokus-Hinweis Stabilisierung
- release: release.sh haerten Sanity-Checks + Build-Verifikation
- feat: Part-Skip (Exclude Object) pre-print + mid-print
- release: rohe kx-bridge + kx-bridge.exe Binaries als Release-Assets hochladen
- docs: CHANGELOG für 0.9.9 (bridge_url + Windows config_loader)
- fix: bridge_url leer im Single-Printer-Modus → relative Pfade (Issue #21)
- fix: release.sh kopiert config_loader.py ins Windows-Build-Repo
- docs: README EN/DE getrennt — README.md englisch, README.de.md deutsch (neues Design); release.sh kopiert beide ins Release-Repo
- docs: CHANGELOG für 0.9.8
- feat: Standalone-Tauglichkeit + Drucker add/remove + leerer Zustand
- feat: Multi-Printer in einer Bridge-Instanz
- feat: T14 Suche/Filter/Sortierung im Browser-Tab + T17 GCode-Filamente
- feat: Drucker-Name editierbar in Settings
- fix: Settings und Update-Check zeigen aktiven Drucker (via _apiUrl)
- fix: i18n für Drucker-Tab (DE/EN)
- feat: Drucker-Tab mit Live-Status aller Instanzen
- feat: Print-History im Browser-Tab (T10)
- fix: CORS-Middleware für alle Endpunkte + bridge_url via request.host
- feat: Slot-Auswahl auch im Upload-Banner (3. Button)
- feat: Filament-Slot-Dialog + POST /kx/print (T06+T08)
- feat: Multi-Printer WebUI + Routing (T05)
- feat: Multi-Printer Config-Format (T04)
- feat: i18n für Browser-Tab (DE/EN)
- chore: Browser-Tab umbenennen (Store → Browser)
- feat: GCode Store Tab in WebUI (T03)
- feat: GCode Store — SQLite-Persistenz, /kx/ API, Thumbnail-Extraktion (T01+T02)
- feat: Happy Hare MMU-Emulation für OrcaSlicer Filament-Sync
- chore: Changelog für 0.9.7 ergänzt
- fix: Upload großer GCode-Dateien (client_max_size 256MB, Socket-Timeout 120s)
- docs: CHANGELOG 0.9.6 nachgetragen (Licht-Sync, Zeit-Cards, Status-Strings, Fixes)
- build: fetch_credentials in release.sh ergänzt, build.sh auf Linux-only bereinigt
- build: sudo durch rm+cp ersetzt für Windows EXE-Copy (Docker root-owned)
- build: fetch_credentials Linux + Windows Binary in build.sh ergänzt
- docs: fetch_credentials als primärer Setup-Weg, Ko-fi Button ergänzt
- feat: fetch_credentials --write-config ersetzt extract_credentials Workflow
- feat: fetch_credentials.py aus PR #19 übernommen
- fix: YouTube Thumbnail auf hqdefault (maxresdefault nicht verfügbar)
- feat: Licht-Status live vom Drucker synchronisieren, Video Tutorial in README
- fix: Zeiten (verstrichen/rest/slicer) werden bei Stopp/Abbruch zurückgesetzt
- fix: file_ready-Banner nach Stopp/Abbruch wird nicht mehr angezeigt
- feat: Progress-Card mit Zeit-Minicards und Layer-Badge, Slicer-Zeit aus GCode-Ende (OrcaSlicer)
- fix: start.sh erstellt config/ und kopiert config.ini.example automatisch (Issue #15)
- feat: Upload-Banner mit Start/Abbrechen, Thumbnail bei Nur-hochladen, Auto-Print-Fix, Log-Scroll-Fix
- fix: auto_print-Reset nach Multipart-Loop entfernt, Log-Scroll-Position bei deaktiviertem Auto-Scroll erhalten
- feat: file_ready Banner nach Upload-only Druck-Start-Button anzeigen
- fix: Upload-only vs. Upload+Print korrekt unterscheiden
- fix: release.sh Release-Name einheitlich als 'v0.9.x' (wie bisherige Releases)
- fix: release.sh CHANGELOG-Body automatisch in Gitea-Release schreiben
- fix: release.sh stabile Releases nicht als Pre-Release markieren
- fix: i18n Kamera-Placeholder und Log-Dir-Button übersetzt
- feat: AMS-Slot-Dialog vollständig i18n (DE/EN)
- fix: AMS-Slot onclick JSON.stringify im HTML-Attribut vermeiden
- feat: AMS-Slot-Editor Farbe und Material per Klick ändern
- feat: Log-Tab erweitert volle Payload + TX/RX/Topic-Filter
- docs: CHANGELOG und README auf v0.9.3 aktualisiert
- fix: Update-Check liefert stable statt Dev, VERSION im Dockerfile, Version im Header (#14)
- docs: README.de.md hinzugefügt, README.en.md entfernt einheitliche Benennung
- docs: CHANGELOG.de.md deutsche Version des Changelogs
- chore: README und CHANGELOG auf Englisch, UI-Fehlertexte englisch, i18n für connection_error Banner
- chore: 0.9.2 CHANGELOG, toter Code in config_loader entfernt
- chore: Dev-Version auf 0.9.1-dev+1a8ee2a gesetzt
- chore: Release-Binaries und Logs aus Git-Index entfernen, .gitignore erweitert
- fix: Verbindungsfehler in Web-UI als Banner anzeigen (#11); README: OrcaSlicer-URL und extract_credentials-Link präzisiert (#12/#13)
- feat: config.ini statt .env persistente Settings über docker-compose restart
- docs: CHANGELOG dev Slicer-Schätzzeit und Update-Dialog Changelog ergänzt
- chore: Dev-Version auf 0.9.1-dev+14cfb27 gesetzt
- feat: Slicer-Schätzzeit im Fortschritts-Panel anzeigen
- revert: Obico-Integration entfernt
- feat(obico): Kamera-Snapshots aktiv zu Obico hochladen
- fix(obico): BRIDGE_URL für Docker-Netzwerk-Kompatibilität
- feat(obico): Layer-Fortschritt in Obico anzeigen
- fix(obico): Snapshot-Endpoint und Layer-Anzeige
- feat(obico): Obico Selfhosted Integration vollständig
- chore: Dev-Version auf 0.9.1-dev+ea587fc gesetzt
- feat: Obico Verbindungsstatus Badge im Header, connected-Tracking in ObicoAgent
- chore: Dev-Version auf 0.9.1-dev+aca91a5 gesetzt
- feat: Obico Selfhosted Integration ObicoAgent, Snapshot-Endpoint, Settings-Modal
- chore: Dev-Version auf 0.9.1-dev+5ddfa13 gesetzt
- feat: Changelog aus Gitea-Release im Update-Dialog anzeigen
- chore: Dev-Version auf 0.9.1-dev+60d4287 gesetzt
- docs: CHANGELOG für dev-Branch ergänzt
- chore: Dev-Version auf 0.9.1-dev+374af9e gesetzt
- chore: Log-Buffer auf 500 Einträge vereinheitlicht (Server + Browser)
- chore: Dev-Version auf 0.9.1-dev+1aa8a75 gesetzt
- feat: Log-Tab Auto-Scroll toggle, Textfilter, Error-Badge im Nav-Tab
- chore: Dev-Version auf 0.9.1-dev+da0bf51 gesetzt
- feat: Server-Log live in Browser-Console (SSE) + Download-Button
- chore: Dev-Version auf 0.9.1-dev+a52f76f gesetzt
- feat: MQTT-Logging strukturiertes TX/RX-Log mit Duplikat-Filter
- chore: Dev-Version auf 0.9.1-dev+1828eec gesetzt
- feat: Dev-Infrastruktur Versionsschema 0.9.1-dev+hash, separater Update-Kanal, README.dev.md
- feat: AMS Slot-Auswahl und Auto-Leveling-Option im Settings-Modal (Issue #6)
- chore: _archive/releases Binaries aus Git-Tracking entfernt
- chore: knlogo.png aus Dev-Repo entfernt (nur Release-Repo)
- fix: Bridge zeigt beim Start lokale IP statt 0.0.0.0; README-Hinweis verbessert
- chore: release.sh aktualisiert Version in Release-Repo-READMEs und kopiert Logo
- feat: Logo ins englische README hinzugefügt
- feat: Logo ins README und Projektverzeichnis hinzugefügt
- fix: AMS leere Slots in UI grau darstellen (Issue #5)
- fix: use_ams nur true wenn belegte Slots vorhanden
- fix: leere AMS-Slots beim Druckstart filtern (status!=5), material_type-Feld korrigiert
- fix: apt ffmpeg entfernt, imageio-ffmpeg übernimmt
- fix: Home X/Y entfernt, homeAxis durch homeZ/homeXY ersetzt
- feat: beta14 imageio-ffmpeg, Z-Buttons fix, Home XY/All, Motors Off
- feat: beta13 Windows-Fixes, Projektstruktur-Reorganisation
- refactor: Projektstruktur überarbeitet
- feat: Changelog, Tests, start.sh und Dockerfile-Fixes hinzufügen
- docs: Version auf 0.9.1-beta10 korrigieren
- docs: LAN-Modus korrekt beschreiben (Drucker-Menüoption)
- feat: Offline-Start + Verbinden/Trennen-Button im Header
- feat: Release-ZIPs mit Zertifikaten (linux/windows/certs-only)
- fix: PyInstaller frozen-Binary __file__ durch sys.executable-Pfad ersetzen
- feat: Windows kx-bridge.exe via GitHub Actions bauen
- fix: release.sh kopiert READMEs nicht mehr (Release-Repo hat eigene)
- docs: README.md aktualisiert, README.en.md hinzugefügt, release.sh kopiert READMEs
- docs: Benutzerdoku aktualisiert (v0.9.1-beta4) + englische Version hinzugefügt
- fix: progress und filename auf 0 zurücksetzen bei stoped/canceled
- feat: neue Drucker-Zustände pausing/paused/resuming/resumed/stopping/stoped
- fix: release.sh rm Fehler nach Docker-Build abfangen
- fix: release.sh Windows-EXE Build korrigiert (leeres Workdir, richtiger dist-Pfad)
- feat: release.sh Binaries bauen + als Gitea-Assets hochladen
- feat: Print-Speed-Card, Übersetzungen vervollständigt
- fix: Temperatursteuerung während des Drucks
- chore: release.sh Version-Bump und Release-Sync Skript
- feat: UI-Komplettüberarbeitung Settings, Self-Update, Dashboard, Responsive
- feat: UI-Überarbeitung KX-Bridge Titel, ViewIT Footer, Kobra-State-Anzeige, Dashboard-Erweiterung
- feat: UI Titel KX-Bridge, Footer ViewIT 2026
- fix: README Fehlerbehebung Credential-Rotation entfernt, --verbose Hinweis ergänzt
- fix: sensible Credentials aus README entfernt (Beispielausgabe anonymisiert)
- docs: CLAUDE.md Projektstruktur + Deployment-Status aktualisiert
- feat: Public Beta 0.9.0-beta1 Docker, Binaries, README, Build-Prozess
- feat: extract_credentials.py + Bridge Tip-Forming & lane_data Endpoint
- feat: AMS Einziehen/Ausziehen UI + feedFilament-Protokoll dokumentiert
- Initial commit: KX-Bridge + Protokoll-Dokumentation
---

View File

@@ -1 +1 @@
0.9.27-nightly8
0.9.27-nightly9

View File

@@ -550,6 +550,7 @@ function ensureAceDryCards(){
// defer until DOM ready
window.addEventListener('DOMContentLoaded',function(){
setLanguage(currentLang).catch(function(){});
_loadSpoolmanStatus();
// Kein Drucker konfiguriert? → direkt in den Drucker-Tab (zeigt "+ Drucker hinzufügen")
fetch('/kx/printers').then(function(r){return r.json()}).then(function(d){
if(!d.result||!d.result.length){showPanel('printers');loadPrinterTab();}