# P-Touch Web fuer Brother PT-P700 Kleine Flask-Weboberflaeche zum Erstellen von Etiketten und Drucken auf einem Brother P-Touch P700, der per USB an einem Unraid-Host haengt. Die Weboberflaeche bildet die wichtigsten P-touch-Editor-Funktionen nach: - Bandbreite, Laenge, Rand und Ausrichtung - frei positionierbare Objekte auf einem Etiketten-Canvas - Textfelder, Symbole, Rahmen/Formen, Linien und Tabellen - Bildimport mit Schwarz/Weiss-Konvertierung - QR-Code und Code128-Barcode - Layout speichern/laden im Browser - serverseitige Vorschau und Druck ueber `ptouch-print` - vereinfachte Mobile-Webansicht unter `/mobile` - Schnittmodi: normal, Halbschnitt ein/aus, Kettendruck, Schnittmarke, Kettendruck mit Schnittmarke ## Wichtig fuer den PT-P700 Der PT-P700 muss im normalen Druckermodus laufen, nicht im "Editor Lite" Massenspeicher-Modus. Falls er im Host als USB-Laufwerk erscheint, Editor Lite am Geraet deaktivieren bzw. das Laufwerk auswerfen und den Drucker neu verbinden. Wenn `lsusb` so etwas zeigt, ist der Drucker noch im falschen Modus: ```text Brother Industries, Ltd PT-P700 P-touch Label Printer RemovableDisk ``` Dann am PT-P700 die `Editor Lite`-Taste druecken, bis die Editor-Lite-LED aus ist. Danach USB kurz abziehen und wieder einstecken. Erst wenn der Drucker nicht mehr als `RemovableDisk` erscheint, kann `ptouch-print` drucken. Der Container braucht Zugriff auf USB. In Unraid geht das am einfachsten mit: - `/dev/bus/usb:/dev/bus/usb` - `privileged: true` ## Start lokal ```bash docker compose up --build ``` Danach: Mobile Ansicht: Beim Dockerfile-Image startet der Container ueber `/usr/local/bin/ptouch-web-start`. Bei der Unraid-GUI-Variante ohne eigenes Image wird stattdessen `sh /srv/ptouch-web/start.sh` als Container-Befehl gesetzt. ## Unraid Docker-GUI ohne eigenes Image Diese Variante nutzt ein fertiges Alpine/Python-Basisimage und mountet dieses Projekt in den Container. `start.sh` installiert beim Start Flask, Pillow und baut `ptouch-print`. Nachteil: Beim ersten Start braucht der Container Internet und der Start dauert laenger. Nach einem Container-Neuerstellen kann das erneut passieren. Dateien auf Unraid ablegen: ```text /mnt/user/appdata/ptouch-web/app /mnt/user/appdata/ptouch-web/start.sh /mnt/user/appdata/ptouch-web/requirements.txt /mnt/user/appdata/ptouch-web/labels ``` In Unraid: Docker -> Add Container. 1. `Name`: `ptouch-web` 2. `Repository`: `python:3.12-alpine` 3. `Network Type`: `bridge` 4. `Privileged`: `On` 5. `Post Arguments`: `sh /srv/ptouch-web/start.sh` 6. `Console shell command` ist egal 7. Bei `Command` oder `Entrypoint`, falls sichtbar: - `Command`: leer lassen, wenn `Post Arguments` gesetzt ist - `Entrypoint`: leer 8. Port hinzufuegen: - Container Port: `8080` - Host Port: `8080` - Protocol: `TCP` 9. Path hinzufuegen fuer die App: - Container Path: `/srv/ptouch-web` - Host Path: `/mnt/user/appdata/ptouch-web` - Access Mode: `Read/Write` 10. Path hinzufuegen: - Container Path: `/data/labels` - Host Path: `/mnt/user/appdata/ptouch-web/labels` - Access Mode: `Read/Write` 11. Path hinzufuegen fuer USB: - Container Path: `/dev/bus/usb` - Host Path: `/dev/bus/usb` - Access Mode: `Read/Write` 12. Variablen hinzufuegen: - `APP_DIR=/srv/ptouch-web` - `FLASK_APP=app.app` - `PRINT_ENABLED=1` - `PRINT_COMMAND=ptouch-print --image {image}` - `LABEL_DIR=/data/labels` - `LABEL_DPI=180` Wichtig: `/srv/ptouch-web` muss den Inhalt dieses Projektordners enthalten, also direkt `app/`, `start.sh` und `requirements.txt`. ## Konfiguration Umgebungsvariablen: - `PRINT_ENABLED=1` druckt wirklich. Mit `0` wird nur ein PNG erzeugt. - `PRINT_COMMAND=ptouch-print --image {image}` ist das Druckkommando. - `LABEL_DPI=180` passt zum PT-P700. - `LABEL_DIR=/data/labels` speichert erzeugte PNG-Dateien. Wenn `ptouch-print` auf deinem Setup andere Optionen braucht, nur `PRINT_COMMAND` anpassen. Der Platzhalter `{image}` wird von der App ersetzt. Wenn dein Kommando selbst Kopien unterstuetzt, kannst du zusaetzlich `{copies}` verwenden; sonst druckt die App mehrere Kopien durch mehrere Druckaufrufe. Fuer Schnittoptionen kannst du optional `{cut_args}` im Kommando platzieren; ohne Platzhalter haengt die App die Schnittargumente automatisch an. Hinweis: Der PT-P700-Halbschnitt ist in upstream `ptouch-print` nicht als CLI-Option vorhanden. Dieses Projekt patcht `ptouch-print` beim Containerstart um `--halfcut` und `--no-halfcut`. ## USB testen Im laufenden Container: ```bash ptouch-print --info ``` Wenn kein Drucker gefunden wird, zuerst pruefen: - Ist Editor Lite deaktiviert? - Sieht Unraid den Drucker unter USB? - Ist `/dev/bus/usb` im Container sichtbar? - Laeuft der Container privilegiert? Wenn `ptouch-print` meldet: ```text PT-P700 (PLite Mode) found ``` ist Editor Lite noch aktiv. Das ist kein Containerproblem, sondern der USB-Modus des Druckers. Wenn `ptouch-print` meldet: ```text PT-P700 found on USB bus ..., device ... libusb_open error :LIBUSB_ERROR_IO ``` sieht der Container den Drucker, kann ihn aber nicht oeffnen. Dann pruefen: - Container in Unraid wirklich mit `Privileged: On` starten. - `/dev/bus/usb` als Pfad `Read/Write` nach `/dev/bus/usb` mounten. - Keine zusaetzliche Device-Zeile nur fuer `/dev/usb/lp0` verwenden. - Auf dem Unraid-Host pruefen, ob `usblp` geladen ist: `lsmod | grep usblp` - Falls `usblp` geladen ist, testweise entladen: `modprobe -r usblp` - USB-Kabel danach kurz abziehen und wieder einstecken. Wenn das Entladen von `usblp` hilft, sollte `usblp` auf dem Host dauerhaft fuer diesen Drucker deaktiviert werden, weil `ptouch-print` direkt ueber libusb druckt. Wenn `usblp` entladen ist und `LIBUSB_ERROR_IO` trotzdem bleibt: 1. Im Container-Terminal pruefen: ```bash lsusb ls -l /dev/bus/usb/001/020 ptouch-print --info ``` Die Bus-/Device-Nummer muss zur Ausgabe von `lsusb` passen. 2. Auf dem Unraid-Host pruefen, ob ein Prozess das USB-Device offen hat: ```bash fuser -v /dev/bus/usb/001/020 lsof /dev/bus/usb/001/020 2>/dev/null ``` 3. Unraid-Container-Konfiguration pruefen: - `Privileged: On` - `/dev/bus/usb` als `Path`, nicht nur als Datei, nach `/dev/bus/usb` - Access Mode `Read/Write` - keine extra `/dev/usb/lp0`-Device-Zuordnung 4. Wenn die Device-Nummer nach USB-Neustecken anders ist, die Befehle mit der neuen Nummer wiederholen.