Commit 1ab972
2026-06-06 15:25:00 Carsten: new| /dev/null .. labor23/01_infrastruktur/terminal/ha-kiosk.md | |
| @@ 0,0 1,338 @@ | |
| + | # HA-Kiosk-Einrichtung – Labor23-Terminal |
| + | |
| + | Home-Assistant-Kiosk auf Debian 13 (Trixie) – 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) → home-assistant-boot.html → 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 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 |
| + | |
| + | ```bash |
| + | 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 `/usr/local/bin/ha-kiosk.sh` |
| + | |
| + | ```bash |
| + | cat > /usr/local/bin/ha-kiosk.sh <<'EOF' |
| + | #!/bin/bash |
| + | export YDOTOOL_SOCKET="$XDG_RUNTIME_DIR/.ydotool_socket" |
| + | ydotoold --socket-path="$YDOTOOL_SOCKET" --socket-own="$(id -u):$(id -g)" & |
| + | sleep 2 |
| + | |
| + | #BOOT="file:///home/kiosk/.var/app/io.github.ungoogled_software.ungoogled_chromium/data/boot.html" |
| + | BOOT="file:///opt/kiosk/home-assistant-boot.html" |
| + | |
| + | FLAGS=( |
| + | --ozone-platform=wayland |
| + | # --kiosk |
| + | --start-maximized |
| + | --disable-gpu |
| + | --disable-gpu-compositing |
| + | --disable-features=VaapiVideoDecoder,VaapiVideoEncoder,UseChromeOSDirectVideoDecoder,InfiniteSessionRestore |
| + | --no-first-run |
| + | --no-default-browser-check |
| + | --disable-infobars |
| + | --disable-session-crashed-bubble |
| + | --hide-crash-restore-bubble |
| + | --app="$BOOT" |
| + | ) |
| + | |
| + | flatpak run io.github.ungoogled_software.ungoogled_chromium "${FLAGS[@]}" \ |
| + | > /home/kiosk/kiosk.log 2>&1 |
| + | EOF |
| + | chmod +x /usr/local/bin/ha-kiosk.sh |
| + | ``` |
| + | |
| + | Boot-HTML nach `/opt/kiosk/` kopieren (Datei liegt im Wiki): |
| + | |
| + | ```bash |
| + | mkdir -p /opt/kiosk |
| + | cp home-assistant-boot.html /opt/kiosk/home-assistant-boot.html |
| + | ``` |
| + | |
| + | **Änderungen gegenüber der ersten Version:** |
| + | - `#!/bin/bash` statt `#!/bin/sh` (Bash-Array `FLAGS` benötigt Bash) |
| + | - HA-URL nicht mehr direkt eingebettet – stattdessen lokale Boot-HTML als Startseite; diese leitet zu HA weiter (→ [[01_infrastruktur/terminal/home-assistant-boot|home-assistant-boot.html]]) |
| + | - `--disable-gpu` / `--disable-gpu-compositing` stabilisieren Chromium auf der schwachen Intel-945-Grafik |
| + | - `--disable-features=VaapiVideoDecoder,...` deaktiviert VA-API-Pfade, die auf GMA 950 nicht funktionieren |
| + | - `--hide-crash-restore-bubble` unterdrückt den Wiederherstellungs-Dialog nach unsauberem Herunterfahren |
| + | - stdout + stderr landen gemeinsam in `/home/kiosk/kiosk.log` |
| + | |
| + | Syntax-Check: |
| + | |
| + | ```bash |
| + | bash -n /usr/local/bin/ha-kiosk.sh && echo "Syntax OK" |
| + | ``` |
| + | |
| + | --- |
| + | |
| + | ## 10. labwc-Autostart `/home/kiosk/.config/labwc/autostart` |
| + | |
| + | ```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 `/etc/greetd/config.toml` |
| + | |
| + | ```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 + Fehler) | `cat /home/kiosk/kiosk.log` | |
| + | | HA-URL ändern | `/opt/kiosk/home-assistant-boot.html` 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. |