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 --userallein scheitert als root, weilXDG_RUNTIME_DIRfehlt. 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
kioskin der Sitzung – daher KEINrunuser/XDG_RUNTIME_DIR/WAYLAND_DISPLAYnötig, und der Server kann internbusctl --userohne--machineverwenden. 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
ydotooldbleibt 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_commandinconfiguration.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 |