Commit 325324
2026-06-06 15:14:43 Carsten: Labor23-Terminal deleted.| labor23/01_infrastruktur/hardware-inventar/geräteliste/labor23-terminal.md .. /dev/null | |
| @@ 1,9 0,0 @@ | |
| - | # Shuttle Touch-Terminal (Labor23-Terminal) |
| - | |
| - | ## Hardware |
| - | |
| - | - Gerät: Shuttle Touch-PC (OEM Holco Enterprise), Intel Atom 330 |
| - | - Grafik/Chipsatz: Intel 945GC, GMA 950 (`82945G`), Treiber `i915` |
| - | - Display: fest verbautes **LVDS-Panel** (CCFL-Beleuchtung) |
| - | - BIOS: Phoenix AwardBIOS V6.00PG |
| - | - OS: Debian 13, Kernel 6.12 |
| labor23/01_infrastruktur/hardware-inventar/geräteliste/labor23-terminal/bildschirm-dimmung.md .. /dev/null | |
| @@ 1,147 0,0 @@ | |
| - | # Bildschirm-Dimmung – Shuttle Touch-Terminal (Labor23-Terminal) |
| - | |
| - | Dokumentation des Lösungswegs. |
| - | |
| - | ## Ausgangslage |
| - | |
| - | - Anzeige: greetd → labwc (Wayland) → Ungoogled-Chromium im Kiosk-Modus |
| - | (User `kiosk`, UID 1001), zeigt eine Home-Assistant-Seite |
| - | |
| - | --- |
| - | |
| - | ## Diagnose – was NICHT funktioniert (und warum) |
| - | |
| - | ### 1. Hardware-Backlight – kein Device vorhanden |
| - | ```bash |
| - | ls /sys/class/backlight/ # leer |
| - | ``` |
| - | |
| - | ### 2. DDC/CI – kein Monitor antwortet (bei internem LVDS nicht vorgesehen) |
| - | ```bash |
| - | sudo apt install ddcutil |
| - | sudo modprobe i2c-dev |
| - | sudo ddcutil detect # -> No displays found |
| - | ddcutil environment # bestätigt: Konfiguration ok, trotzdem kein Display |
| - | ``` |
| - | |
| - | ### 3. Anschluss-Prüfung – Panel ist intern (LVDS) |
| - | ```bash |
| - | grep -r . /sys/class/drm/*/status 2>/dev/null # card0-LVDS-1: connected |
| - | lsmod | grep -iE 'video|backlight' # 'video' geladen, kein backlight |
| - | echo $XDG_SESSION_TYPE # leer (Befehl lief auf Konsole/SSH) |
| - | ``` |
| - | |
| - | ### 4. Kernel-Parameter erzwingen – brachte ebenfalls kein Backlight-Device |
| - | Datei `/etc/default/grub`, Zeile `GRUB_CMDLINE_LINUX_DEFAULT` nacheinander mit |
| - | `acpi_backlight=vendor`, `acpi_backlight=native`, `acpi_backlight=video` getestet: |
| - | ```bash |
| - | sudo cp /etc/default/grub /etc/default/grub.backup |
| - | sudo nano /etc/default/grub |
| - | sudo update-grub |
| - | sudo reboot |
| - | # nach jedem Reboot: |
| - | ls /sys/class/backlight/ # blieb leer |
| - | dmesg | grep -iE 'backlight|acpi_video' # keine Ausgabe |
| - | ``` |
| - | |
| - | ### 5. BIOS – keine Helligkeitsoption vorhanden |
| - | Phoenix AwardBIOS V6.00PG bietet keinerlei Brightness-/Backlight-/LVDS-Einstellung. |
| - | |
| - | **Fazit der Diagnose:** Die Hintergrundbeleuchtung dieses Panels lässt sich vom |
| - | System aus nicht ansteuern (Hardware-/Firmware-Grenze). Lösung ist daher |
| - | **Software-Dimmen** über das Wayland-Gamma-Protokoll (labwc/wlroots unterstützt |
| - | `wlr-gamma-control-unstable-v1`). |
| - | |
| - | --- |
| - | |
| - | ## Lösung – Software-Dimmen über Wayland |
| - | |
| - | ### Schritt 1: Sitzung identifizieren |
| - | ```bash |
| - | ps -eo user,pid,cmd | grep -iE 'labwc|chromium' | grep -v grep |
| - | ls -la /run/user/ # kiosk = UID 1001 |
| - | loginctl list-sessions |
| - | ls -l /run/user/1001/wayland-* # -> wayland-0 |
| - | ``` |
| - | |
| - | ### Schritt 2: Funktionstest mit gammastep (setzt nur festen Wert) |
| - | ```bash |
| - | sudo apt install gammastep |
| - | # Test direkt mit Sitzungs-Umgebung: |
| - | XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 \ |
| - | gammastep -m wayland -O 6500 -b 0.6 |
| - | ``` |
| - | Bestätigte: Dimmen funktioniert grundsätzlich. Für dynamische/externe Steuerung |
| - | aber ungeeignet (kein Live-Ändern), daher wl-gammarelay-rs. |
| - | |
| - | ### Schritt 3: wl-gammarelay-rs installieren |
| - | (Vorkompilierte statische Binärdatei – kein Rust/Compiler auf dem Gerät nötig.) |
| - | |
| - | [wl-gammarelay-rs](./wl-gammarelay-rs) |
| - | |
| - | ```bash |
| - | install -m 755 wl-gammarelay-rs /usr/local/bin/wl-gammarelay-rs |
| - | /usr/local/bin/wl-gammarelay-rs --version |
| - | ``` |
| - | |
| - | ### Schritt 4: Daemon in der kiosk-Sitzung starten |
| - | ```bash |
| - | runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 \ |
| - | /usr/local/bin/wl-gammarelay-rs & |
| - | ``` |
| - | |
| - | ### Schritt 5: Helligkeit live setzen (funktionierender Steuerbefehl, als root) |
| - | ```bash |
| - | busctl --machine=kiosk@.host --user \ |
| - | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.5 |
| - | # weitere Werte: |
| - | busctl --machine=kiosk@.host --user \ |
| - | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.3 # dunkler |
| - | busctl --machine=kiosk@.host --user \ |
| - | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 1 # voll |
| - | ``` |
| - | > Hinweis: `busctl --user` allein scheitert als root, weil `XDG_RUNTIME_DIR` |
| - | > fehlt. Deshalb `--machine=kiosk@.host` (greift auf den User-Bus von kiosk zu). |
| - | |
| - | **Stand jetzt: Dimmen funktioniert flackerfrei und live. ✅** |
| - | |
| - | --- |
| - | |
| - | ## HTTP-Schnittstelle (für externe Steuerung / Home Assistant) |
| - | |
| - | [brightness-server.py](./brightness-server.py) |
| - | |
| - | Skript `brightness-server.py` (reines Python, Standardbibliothek) – läuft in der |
| - | kiosk-Sitzung und nimmt Web-Anfragen entgegen. |
| - | |
| - | ```bash |
| - | install -m 755 brightness-server.py /opt/kiosk/brightness-server.py |
| - | |
| - | # Test (Daemon muss laufen): |
| - | runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 \ |
| - | python3 /opt/kiosk/brightness-server.py |
| - | |
| - | # von einem anderen Gerät testen (IP anpassen): |
| - | curl "http://192.168.x.x:8080/set?b=0.3" |
| - | curl "http://192.168.x.x:8080/set?b=1" |
| - | curl "http://192.168.x.x:8080/get" |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## Noch offen (nächste Schritte) |
| - | |
| - | - [ ] wl-gammarelay-rs **und** brightness-server.py dauerhaft per labwc-Autostart |
| - | starten: `/home/kiosk/.config/labwc/autostart` |
| - | - [ ] Home Assistant: `rest_command` in `configuration.yaml` + Automationen |
| - | - [ ] Optional: Zugriffsschutz (Token im Server aktivieren) |
| - | |
| - | --- |
| - | |
| - | ## Kurz-Spickzettel (das Wesentliche) |
| - | |
| - | | Zweck | Befehl | |
| - | |---|---| |
| - | | Daemon starten | `runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 /usr/local/bin/wl-gammarelay-rs &` | |
| - | | Helligkeit setzen | `busctl --machine=kiosk@.host --user set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.5` | |
| - | | Helligkeit abfragen | `busctl --machine=kiosk@.host --user get-property rs.wl-gammarelay / rs.wl.gammarelay Brightness` | |
| labor23/01_infrastruktur/hardware-inventar/geräteliste/labor23-terminal/bildschirm-dimmung/brightness-server.py .. /dev/null | |
| @@ 1,128 0,0 @@ | |
| - | #!/usr/bin/env python3 |
| - | """ |
| - | Einfacher HTTP-Server zum Steuern der Bildschirmhelligkeit (und Farbtemperatur) |
| - | über wl-gammarelay-rs. |
| - | |
| - | Aufruf-Beispiele (z. B. aus Home Assistant per rest_command): |
| - | GET /set?b=0.5 -> Helligkeit auf 50 % |
| - | GET /set?b=0.3&t=4000 -> Helligkeit 30 %, Farbtemperatur 4000 K |
| - | GET /get -> aktuelle Helligkeit als Zahl (z. B. 0.5) |
| - | GET / -> kurze Hilfe / Status |
| - | |
| - | Laeuft als Benutzer 'kiosk' INNERHALB der labwc-Sitzung, damit 'busctl --user' |
| - | den Daemon direkt erreicht (XDG_RUNTIME_DIR ist dann korrekt gesetzt). |
| - | |
| - | Optional: einfacher Schutz per Token. Wenn unten TOKEN gesetzt ist, muss jede |
| - | Anfrage ?token=... mitschicken. Standard: aus (leer). |
| - | """ |
| - | |
| - | import os |
| - | import subprocess |
| - | from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer |
| - | from urllib.parse import urlparse, parse_qs |
| - | |
| - | # ----- Einstellungen (bei Bedarf anpassen) ----- |
| - | HOST = "0.0.0.0" # 0.0.0.0 = im ganzen LAN erreichbar |
| - | PORT = 8080 |
| - | TOKEN = "" # z. B. "geheim123" setzen, dann ?token=geheim123 noetig |
| - | DBUS_DEST = "rs.wl-gammarelay" |
| - | DBUS_PATH = "/" |
| - | DBUS_IFACE = "rs.wl.gammarelay" |
| - | |
| - | # Falls XDG_RUNTIME_DIR aus irgendeinem Grund fehlt, sinnvollen Default setzen |
| - | # (1001 ist die UID des kiosk-Users auf diesem Geraet). |
| - | os.environ.setdefault("XDG_RUNTIME_DIR", "/run/user/1001") |
| - | |
| - | |
| - | def busctl(*args): |
| - | """Ruft busctl --user auf und gibt (ok, ausgabe) zurueck.""" |
| - | cmd = ["busctl", "--user", *args] |
| - | try: |
| - | out = subprocess.run( |
| - | cmd, capture_output=True, text=True, timeout=5 |
| - | ) |
| - | if out.returncode != 0: |
| - | return False, (out.stderr or out.stdout).strip() |
| - | return True, out.stdout.strip() |
| - | except Exception as e: |
| - | return False, str(e) |
| - | |
| - | |
| - | def set_brightness(value): |
| - | value = max(0.0, min(1.0, float(value))) |
| - | return busctl("set-property", DBUS_DEST, DBUS_PATH, DBUS_IFACE, |
| - | "Brightness", "d", f"{value:.3f}") |
| - | |
| - | |
| - | def set_temperature(kelvin): |
| - | kelvin = int(max(1000, min(10000, int(kelvin)))) |
| - | return busctl("set-property", DBUS_DEST, DBUS_PATH, DBUS_IFACE, |
| - | "Temperature", "q", str(kelvin)) |
| - | |
| - | |
| - | def get_brightness(): |
| - | ok, out = busctl("get-property", DBUS_DEST, DBUS_PATH, DBUS_IFACE, |
| - | "Brightness") |
| - | if not ok: |
| - | return ok, out |
| - | # Ausgabe sieht aus wie: d 0.5 |
| - | parts = out.split() |
| - | return True, parts[-1] if parts else out |
| - | |
| - | |
| - | class Handler(BaseHTTPRequestHandler): |
| - | def _reply(self, code, text): |
| - | body = (text + "\n").encode() |
| - | self.send_response(code) |
| - | self.send_header("Content-Type", "text/plain; charset=utf-8") |
| - | self.send_header("Content-Length", str(len(body))) |
| - | self.end_headers() |
| - | self.wfile.write(body) |
| - | |
| - | def do_GET(self): |
| - | u = urlparse(self.path) |
| - | q = parse_qs(u.query) |
| - | |
| - | if TOKEN and q.get("token", [""])[0] != TOKEN: |
| - | return self._reply(403, "forbidden") |
| - | |
| - | if u.path == "/" or u.path == "/help": |
| - | return self._reply( |
| - | 200, |
| - | "brightness-server\n" |
| - | "/set?b=0.5 Helligkeit (0.0-1.0)\n" |
| - | "/set?b=0.3&t=4000 Helligkeit + Temperatur (K)\n" |
| - | "/get aktuelle Helligkeit", |
| - | ) |
| - | |
| - | if u.path == "/get": |
| - | ok, out = get_brightness() |
| - | return self._reply(200 if ok else 500, out) |
| - | |
| - | if u.path == "/set": |
| - | results = [] |
| - | if "b" in q: |
| - | ok, out = set_brightness(q["b"][0]) |
| - | results.append("brightness ok" if ok else f"brightness FEHLER: {out}") |
| - | if "t" in q: |
| - | ok, out = set_temperature(q["t"][0]) |
| - | results.append("temp ok" if ok else f"temp FEHLER: {out}") |
| - | if not results: |
| - | return self._reply(400, "fehlender Parameter b oder t") |
| - | failed = any("FEHLER" in r for r in results) |
| - | return self._reply(500 if failed else 200, "; ".join(results)) |
| - | |
| - | return self._reply(404, "unbekannter Pfad") |
| - | |
| - | # Logging in der Konsole knapp halten |
| - | def log_message(self, fmt, *args): |
| - | pass |
| - | |
| - | |
| - | if __name__ == "__main__": |
| - | srv = ThreadingHTTPServer((HOST, PORT), Handler) |
| - | print(f"brightness-server laeuft auf {HOST}:{PORT}") |
| - | try: |
| - | srv.serve_forever() |
| - | except KeyboardInterrupt: |
| - | pass |
| labor23/01_infrastruktur/hardware-inventar/geräteliste/labor23-terminal/bildschirm-dimmung/wl-gammarelay-rs .. /dev/null | |
| labor23/01_infrastruktur/hardware-inventar/geräteliste/labor23-terminal/grundstruktur.md .. /dev/null | |
| @@ 1,316 0,0 @@ | |
| - | # Grundstruktur |
| - | |
| - | # Home-Assistant-Kiosk auf Debian 13 (Trixie) |
| - | |
| - | Einrichtungs-Dokumentation – vom blanken Minimal-Debian bis zum aktuellen Stand. |
| - | |
| - | ## Überblick |
| - | |
| - | **Ziel:** Ein schwacher Rechner zeigt dauerhaft das Home-Assistant-Dashboard auf einem Touch-Panel an. |
| - | |
| - | **Boot-Kette:** `systemd → greetd (Autologin) → labwc (Wayland-Compositor) → ungoogled-chromium (Flatpak) → HA-Dashboard` |
| - | |
| - | **Touch-Hardware:** eGalax / D-WAV Titan6001 (USB-ID `0eef:0001`) |
| - | |
| - | **Hinweise zur Nutzung dieser Anleitung:** |
| - | - Alle Befehle werden **als root** ausgeführt (auf dem System ist `sudo` nicht zwingend nötig). |
| - | - Die HA-Adresse ist hier `http:///`. |
| - | - Die Touch-Kalibrierungswerte (`0eef:0001`, Bereichsgrenzen) stammen von genau dieser Hardware. Bei anderem Panel neu ermitteln (siehe Abschnitt „Diagnose"). |
| - | - **Wichtig:** Die Kiosk-Sitzung startet nur bei einem **echten Reboot**, nicht bei `systemctl restart greetd` (das landet im Greeter/Konsole). |
| - | |
| - | --- |
| - | |
| - | ## 1. APT-Quellen prüfen |
| - | ``` |
| - | apt-get update |
| - | apt-get full-upgrade -y |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 2. Grundpakete |
| - | |
| - | ```bash |
| - | apt install -y sudo labwc greetd |
| - | ``` |
| - | |
| - | (`labwc` ist der Compositor, `greetd` der Login-/Autologin-Daemon.) |
| - | |
| - | --- |
| - | |
| - | ## 3. Browser: ungoogled-chromium via Flatpak |
| - | |
| - | ungoogled-chromium ist nicht in den Debian-Repos, und das OBS-apt-Repo baut nur gegen Sid (scheitert auf Trixie an `libre2-9`). Sauberer Weg ist Flathub. `dbus-user-session` und die Portale verhindern, dass der Flatpak-Browser in der Kiosk-Sitzung sofort wieder verschwindet. |
| - | |
| - | ```bash |
| - | apt install -y flatpak dbus-user-session xdg-desktop-portal xdg-desktop-portal-wlr |
| - | flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo |
| - | flatpak install -y flathub io.github.ungoogled_software.ungoogled_chromium |
| - | flatpak override io.github.ungoogled_software.ungoogled_chromium --filesystem=home:ro |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 4. Kiosk-Benutzer anlegen |
| - | |
| - | Der Browser läuft nicht als root. Der User wird per Autologin gestartet (kein Passwort nötig). |
| - | |
| - | ```bash |
| - | useradd -m -s /bin/bash kiosk |
| - | usermod -aG video,render,input kiosk |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 5. Mauszeiger-Werkzeug (ydotool) |
| - | |
| - | Der Cursor wird beim Start kurz angezeigt und verschwindet, sobald das Panel per Touch bedient wird. `ydotool` (Kernel-Ebene, uinput) parkt ihn beim Start zusätzlich in der Ecke. |
| - | |
| - | |
| - | ```bash |
| - | apt install -y ydotool |
| - | echo uinput > /etc/modules-load.d/uinput.conf |
| - | echo 'KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"' > /etc/udev/rules.d/99-uinput.rules |
| - | udevadm control --reload |
| - | udevadm trigger |
| - | modprobe uinput |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 6. Touchscreen – Klassifizierung |
| - | |
| - | Der eGalax meldet fälschlich Stylus/Tablet- und Maus-Eigenschaften. Diese Regel zwingt das System, ihn als reinen Touchscreen zu behandeln. |
| - | |
| - | ```bash |
| - | cat > /etc/udev/rules.d/99-egalax-touchscreen.rules <<'EOF' |
| - | SUBSYSTEM=="input", ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0001", ENV{ID_INPUT_TABLET}="", ENV{ID_INPUT_TABLET_PAD}="", ENV{ID_INPUT_MOUSE}="", ENV{ID_INPUT_POINTINGSTICK}="", ENV{ID_INPUT_TOUCHSCREEN}="1" |
| - | EOF |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 7. Touchscreen – Kalibrierung |
| - | |
| - | ### 7a. Orientierung (Links/Rechts war gespiegelt) |
| - | |
| - | libinput-Kalibrierungsmatrix per udev. Der Wert `-1 0 1 0 1 0` spiegelt die X-Achse (Links/Rechts). |
| - | |
| - | ```bash |
| - | cat > /etc/udev/rules.d/99-egalax-calibration.rules <<'EOF' |
| - | SUBSYSTEM=="input", ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0001", ENV{LIBINPUT_CALIBRATION_MATRIX}="-1 0 1 0 1 0" |
| - | EOF |
| - | ``` |
| - | |
| - | Mögliche Matrix-Werte je nach Panel-Montage: |
| - | |
| - | | Korrektur | Matrix | |
| - | |---|---| |
| - | | Normal (keine) | `1 0 0 0 1 0` | |
| - | | Links/Rechts spiegeln | `-1 0 1 0 1 0` | |
| - | | Oben/Unten spiegeln | `1 0 0 0 -1 1` | |
| - | | 180° drehen | `-1 0 1 0 -1 1` | |
| - | |
| - | ### 7b. Wertebereich (Ränder waren nicht erreichbar) |
| - | |
| - | Der Controller meldet einen größeren Bereich, als physisch erreichbar ist. Per hwdb bekommt der Kernel die echten Grenzen. **Einrückung der `EVDEV_ABS`-Zeilen mit genau einem Leerzeichen ist Pflicht.** |
| - | |
| - | ```bash |
| - | cat > /etc/udev/hwdb.d/61-egalax-calibration.hwdb <<'EOF' |
| - | evdev:input:b0003v0EEFp0001* |
| - | EVDEV_ABS_00=361:3763 |
| - | EVDEV_ABS_01=608:3456 |
| - | EOF |
| - | systemd-hwdb update |
| - | udevadm trigger |
| - | ``` |
| - | |
| - | (`EVDEV_ABS_00` = X-Achse, `01` = Y-Achse, Format `min:max`. Werte aus der evtest-Messung – siehe „Diagnose". Erreichst du die Ränder noch nicht ganz, den Bereich enger ziehen, z. B. `400:3720`.) |
| - | |
| - | --- |
| - | |
| - | ## 8. Bildschirmtastatur (wvkbd) + Umschalt-Button (waybar) |
| - | |
| - | `wvkbd` legt sich über das Layer-Shell-Protokoll als Tastatur über den Bildschirm (das kann labwc, Cage konnte es nicht). Sie startet versteckt und wird per Button umgeschaltet. |
| - | |
| - | ```bash |
| - | apt install -y wvkbd waybar |
| - | ``` |
| - | |
| - | Umschalt-Skript (SIGRTMIN schaltet wvkbd um): |
| - | |
| - | ```bash |
| - | cat > /usr/local/bin/toggle-kbd.sh <<'EOF' |
| - | #!/bin/sh |
| - | pkill --signal SIGRTMIN wvkbd-mobintl |
| - | EOF |
| - | chmod +x /usr/local/bin/toggle-kbd.sh |
| - | ``` |
| - | |
| - | waybar als kleiner, schwebender Button unten rechts: |
| - | |
| - | ```bash |
| - | mkdir -p /home/kiosk/.config/waybar |
| - | |
| - | cat > /home/kiosk/.config/waybar/config.jsonc <<'EOF' |
| - | { |
| - | "layer": "top", |
| - | "position": "bottom", |
| - | "height": 44, |
| - | "exclusive": false, |
| - | "modules-right": ["custom/kbd"], |
| - | "custom/kbd": { |
| - | "format": "⌨", |
| - | "tooltip": false, |
| - | "on-click": "/usr/local/bin/toggle-kbd.sh" |
| - | } |
| - | } |
| - | EOF |
| - | |
| - | cat > /home/kiosk/.config/waybar/style.css <<'EOF' |
| - | * { font-size: 22px; border: none; } |
| - | window#waybar { background: transparent; } |
| - | #custom-kbd { |
| - | background: rgba(3,169,244,0.9); color: #fff; |
| - | padding: 2px 20px; margin: 8px; border-radius: 12px; |
| - | } |
| - | EOF |
| - | ``` |
| - | |
| - | > **Wichtig:** Damit Tastatur und Button nicht hinter dem Browser verschwinden, läuft der Browser als **maximiertes Fenster** (`--start-maximized`) statt im echten Vollbild (`--kiosk`). Mit dieser Einstellung erscheinen Button und Tastatur korrekt über dem Dashboard. |
| - | |
| - | --- |
| - | |
| - | ## 9. Start-Skript |
| - | |
| - | ```bash |
| - | cat > /usr/local/bin/ha-kiosk.sh <<'EOF' |
| - | #!/bin/sh |
| - | # ydotool-Dienst starten und Cursor in die Ecke parken |
| - | export YDOTOOL_SOCKET="$XDG_RUNTIME_DIR/.ydotool_socket" |
| - | ydotoold --socket-path="$YDOTOOL_SOCKET" --socket-own="$(id -u):$(id -g)" & |
| - | sleep 2 |
| - | ydotool mousemove -- -10000 -10000 |
| - | |
| - | exec flatpak run io.github.ungoogled_software.ungoogled_chromium \ |
| - | --ozone-platform=wayland \ |
| - | --start-maximized \ |
| - | --no-first-run --no-default-browser-check \ |
| - | --disable-infobars --disable-session-crashed-bubble \ |
| - | --app="http://192.168.1.226:8123/" |
| - | EOF |
| - | chmod +x /usr/local/bin/ha-kiosk.sh |
| - | ``` |
| - | |
| - | Syntax-Check (sollte „Syntax OK" ausgeben): |
| - | |
| - | ```bash |
| - | sh -n /usr/local/bin/ha-kiosk.sh && echo "Syntax OK" |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 10. labwc-Autostart |
| - | |
| - | labwc startet beim Sitzungsstart das Kiosk-Skript, die (versteckte) Tastatur und waybar. |
| - | |
| - | ```bash |
| - | mkdir -p /home/kiosk/.config/labwc |
| - | |
| - | cat > /home/kiosk/.config/labwc/autostart <<'EOF' |
| - | /usr/local/bin/ha-kiosk.sh & |
| - | wvkbd-mobintl --hidden -L 280 & |
| - | waybar & |
| - | EOF |
| - | ``` |
| - | |
| - | Besitzrechte für alle als root angelegten Konfig-Dateien korrigieren: |
| - | |
| - | ```bash |
| - | chown -R kiosk:kiosk /home/kiosk |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## 11. greetd – Autologin |
| - | |
| - | ```bash |
| - | cat > /etc/greetd/config.toml <<'EOF' |
| - | [terminal] |
| - | vt = 7 |
| - | |
| - | [default_session] |
| - | command = "/usr/sbin/agreety --cmd /bin/bash" |
| - | user = "_greetd" |
| - | |
| - | [initial_session] |
| - | command = "labwc" |
| - | user = "kiosk" |
| - | EOF |
| - | ``` |
| - | |
| - | **Erklärung der Blöcke:** |
| - | - `[initial_session]` = Autologin, läuft **genau einmal beim Booten** ohne Passwort → startet labwc als `kiosk`. |
| - | - `[default_session]` = Greeter (Fallback), erscheint nur, wenn die Kiosk-Sitzung beendet wird. |
| - | |
| - | (Pfad von `agreety` ggf. prüfen: `ls -l /usr/sbin/agreety /usr/bin/agreety`) |
| - | |
| - | --- |
| - | |
| - | ## 12. Aktivieren und neu starten |
| - | |
| - | ```bash |
| - | systemctl enable greetd |
| - | reboot |
| - | ``` |
| - | |
| - | Nach dem Reboot startet das Panel direkt ins HA-Dashboard. Einmalig in HA anmelden (physische Tastatur reicht), „Angemeldet bleiben" anhaken – das Flatpak-Profil bleibt erhalten. |
| - | |
| - | --- |
| - | |
| - | ## Diagnose – wie die Werte ermittelt wurden |
| - | |
| - | Touch-Controller und USB-ID finden: |
| - | |
| - | ```bash |
| - | apt install -y usbutils libinput-tools evtest |
| - | lsusb |
| - | libinput list-devices |
| - | ``` |
| - | |
| - | Roh-Koordinaten / Achsen-Bereich messen (für die Kalibrierung in Abschnitt 7): |
| - | |
| - | ```bash |
| - | evtest /dev/input/event2 |
| - | ``` |
| - | |
| - | In jede Ecke tippen, dann `ABS_X`/`ABS_Y` ablesen. Bei uns ergab das: erreichbar X `361–3763`, Y `608–3456` (gemeldet war X `30–4040`, Y `60–4035`) – daher die hwdb-Korrektur. |
| - | |
| - | Kontrollieren, ob die hwdb-Korrektur aktiv ist: |
| - | |
| - | ```bash |
| - | udevadm info /dev/input/event2 | grep EVDEV_ABS |
| - | ``` |
| - | |
| - | --- |
| - | |
| - | ## Wartung (alles über SSH) |
| - | |
| - | | Aufgabe | Befehl | |
| - | |---|---| |
| - | | Logs der Sitzung ansehen | `journalctl -u greetd -b` | |
| - | | Kiosk-Logs (Browser) | `cat /home/kiosk/kiosk.log` | |
| - | | HA-URL ändern | `/usr/local/bin/ha-kiosk.sh` editieren, dann `reboot` | |
| - | | Kiosk wirklich neu starten | `reboot` (nicht `systemctl restart greetd`!) | |
| - | |
| - | --- |
| - | |
| - | ## Bekannte Einschränkungen |
| - | |
| - | - **Auto-Start der Tastatur bei Textfeld-Fokus:** Mit Chromium auf Wayland nicht zuverlässig möglich – daher der manuelle Umschalt-Button unten rechts. |
| - | |
| - | --- |
| - | |
| - | ## Automatischer Neustart bei Absturz (Empfehlung, noch nicht umgesetzt) |
| - | |
| - | `initial_session` startet nur einmal beim Boot. Stürzt der Kiosk ab, landet das Gerät im Greeter statt zurück im Dashboard. Robuster wäre, den Kiosk als eigenen systemd-Dienst mit `Restart=always` zu betreiben statt über greetds Einmal-Autologin. |