Bildschirm-Dimmung – 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

ls /sys/class/backlight/        # leer

2. DDC/CI – kein Monitor antwortet (bei internem LVDS nicht vorgesehen)

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)

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:

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

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)

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

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

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)

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)

Skript brightness-server.py (reines Python, Standardbibliothek) – läuft in der kiosk-Sitzung und nimmt Web-Anfragen entgegen. brightness-server.py

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"

Autostart & Kiosk-Absicherung (dauerhaft, erledigt ✅)

Daemon-Startskript mit Warte-Schleife

wl-gammarelay-rs startet beim Booten sonst zu früh (bevor labwc den Wayland-Socket bereit hat) und beendet sich. Ein kleines Wrapper-Skript wartet auf den Socket und startet den Daemon erst dann.

/usr/local/bin/start-gammarelay.sh:

#!/bin/sh
# wartet auf den Wayland-Socket und startet dann den Dimmer-Daemon
for i in $(seq 1 30); do
  [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ] && break
  sleep 0.5
done
exec /usr/local/bin/wl-gammarelay-rs
chmod 755 /usr/local/bin/start-gammarelay.sh
chown kiosk:kiosk /usr/local/bin/start-gammarelay.sh

labwc-Autostart

/home/kiosk/.config/labwc/autostart:

/usr/local/bin/start-gammarelay.sh &
python3 /opt/kiosk/brightness-server.py &
/usr/local/bin/ha-kiosk.sh &
wvkbd-mobintl --hidden -L 280 &
waybar &

In der Autostart-Datei läuft alles bereits als kiosk in der Sitzung – daher KEIN runuser/XDG_RUNTIME_DIR/WAYLAND_DISPLAY nötig, und der Server kann intern busctl --user ohne --machine verwenden. Das & ist Pflicht, sonst blockiert labwc.

Chromium-Neustart-Schleife (gegen Alt+F4 / Absturz)

In /usr/local/bin/ha-kiosk.sh ist der Chromium-Aufruf in eine Schleife gewickelt: Schließt sich der Browser (Alt+F4, Crash), startet er nach 2 s neu.

while true; do
  flatpak run io.github.ungoogled_software.ungoogled_chromium "${FLAGS[@]}" \
    > /home/kiosk/kiosk.log 2>&1
  echo "$(date '+%F %T') Chromium beendet (Exit $?), Neustart in 2s" >> /home/kiosk/kiosk.log
  sleep 2
done

ydotoold bleibt VOR der Schleife (nur einmal starten). Alt+F4 wurde bewusst NICHT in labwc deaktiviert – dient als Notausstieg fürs Warten.


Noch offen (nächste Schritte)

  • 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