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

apt-get update
apt-get full-upgrade -y

2. Grundpakete

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.

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).

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.

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.

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).

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.

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.

apt install -y wvkbd waybar

Umschalt-Skript (SIGRTMIN schaltet wvkbd um):

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:

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

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):

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 (→ 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 -n /usr/local/bin/ha-kiosk.sh && echo "Syntax OK"

10. labwc-Autostart /home/kiosk/.config/labwc/autostart

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:

chown -R kiosk:kiosk /home/kiosk

11. greetd – Autologin /etc/greetd/config.toml

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

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:

apt install -y usbutils libinput-tools evtest
lsusb
libinput list-devices

Roh-Koordinaten / Achsen-Bereich messen (für die Kalibrierung in Abschnitt 7):

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:

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.