Blame
|
1 | # Bildschirm-Dimmung – Labor23-Terminal |
||||||
| 2 | ||||||||
| 3 | Dokumentation des Lösungswegs. |
|||||||
| 4 | ||||||||
| 5 | ## Ausgangslage |
|||||||
| 6 | ||||||||
| 7 | - Anzeige: greetd → labwc (Wayland) → Ungoogled-Chromium im Kiosk-Modus |
|||||||
| 8 | (User `kiosk`, UID 1001), zeigt eine Home-Assistant-Seite |
|||||||
| 9 | ||||||||
| 10 | --- |
|||||||
| 11 | ||||||||
| 12 | ## Diagnose – was NICHT funktioniert (und warum) |
|||||||
| 13 | ||||||||
| 14 | ### 1. Hardware-Backlight – kein Device vorhanden |
|||||||
| 15 | ```bash |
|||||||
| 16 | ls /sys/class/backlight/ # leer |
|||||||
| 17 | ``` |
|||||||
| 18 | ||||||||
| 19 | ### 2. DDC/CI – kein Monitor antwortet (bei internem LVDS nicht vorgesehen) |
|||||||
| 20 | ```bash |
|||||||
| 21 | sudo apt install ddcutil |
|||||||
| 22 | sudo modprobe i2c-dev |
|||||||
| 23 | sudo ddcutil detect # -> No displays found |
|||||||
| 24 | ddcutil environment # bestätigt: Konfiguration ok, trotzdem kein Display |
|||||||
| 25 | ``` |
|||||||
| 26 | ||||||||
| 27 | ### 3. Anschluss-Prüfung – Panel ist intern (LVDS) |
|||||||
| 28 | ```bash |
|||||||
| 29 | grep -r . /sys/class/drm/*/status 2>/dev/null # card0-LVDS-1: connected |
|||||||
| 30 | lsmod | grep -iE 'video|backlight' # 'video' geladen, kein backlight |
|||||||
| 31 | echo $XDG_SESSION_TYPE # leer (Befehl lief auf Konsole/SSH) |
|||||||
| 32 | ``` |
|||||||
| 33 | ||||||||
| 34 | ### 4. Kernel-Parameter erzwingen – brachte ebenfalls kein Backlight-Device |
|||||||
| 35 | Datei `/etc/default/grub`, Zeile `GRUB_CMDLINE_LINUX_DEFAULT` nacheinander mit |
|||||||
| 36 | `acpi_backlight=vendor`, `acpi_backlight=native`, `acpi_backlight=video` getestet: |
|||||||
| 37 | ```bash |
|||||||
| 38 | sudo cp /etc/default/grub /etc/default/grub.backup |
|||||||
| 39 | sudo nano /etc/default/grub |
|||||||
| 40 | sudo update-grub |
|||||||
| 41 | sudo reboot |
|||||||
| 42 | # nach jedem Reboot: |
|||||||
| 43 | ls /sys/class/backlight/ # blieb leer |
|||||||
| 44 | dmesg | grep -iE 'backlight|acpi_video' # keine Ausgabe |
|||||||
| 45 | ``` |
|||||||
| 46 | ||||||||
| 47 | ### 5. BIOS – keine Helligkeitsoption vorhanden |
|||||||
| 48 | Phoenix AwardBIOS V6.00PG bietet keinerlei Brightness-/Backlight-/LVDS-Einstellung. |
|||||||
| 49 | ||||||||
| 50 | **Fazit der Diagnose:** Die Hintergrundbeleuchtung dieses Panels lässt sich vom |
|||||||
| 51 | System aus nicht ansteuern (Hardware-/Firmware-Grenze). Lösung ist daher |
|||||||
| 52 | **Software-Dimmen** über das Wayland-Gamma-Protokoll (labwc/wlroots unterstützt |
|||||||
| 53 | `wlr-gamma-control-unstable-v1`). |
|||||||
| 54 | ||||||||
| 55 | --- |
|||||||
| 56 | ||||||||
| 57 | ## Lösung – Software-Dimmen über Wayland |
|||||||
| 58 | ||||||||
| 59 | ### Schritt 1: Sitzung identifizieren |
|||||||
| 60 | ```bash |
|||||||
| 61 | ps -eo user,pid,cmd | grep -iE 'labwc|chromium' | grep -v grep |
|||||||
| 62 | ls -la /run/user/ # kiosk = UID 1001 |
|||||||
| 63 | loginctl list-sessions |
|||||||
| 64 | ls -l /run/user/1001/wayland-* # -> wayland-0 |
|||||||
| 65 | ``` |
|||||||
| 66 | ||||||||
| 67 | ### Schritt 2: Funktionstest mit gammastep (setzt nur festen Wert) |
|||||||
| 68 | ```bash |
|||||||
| 69 | sudo apt install gammastep |
|||||||
| 70 | # Test direkt mit Sitzungs-Umgebung: |
|||||||
| 71 | XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 \ |
|||||||
| 72 | gammastep -m wayland -O 6500 -b 0.6 |
|||||||
| 73 | ``` |
|||||||
| 74 | Bestätigte: Dimmen funktioniert grundsätzlich. Für dynamische/externe Steuerung |
|||||||
| 75 | aber ungeeignet (kein Live-Ändern), daher wl-gammarelay-rs. |
|||||||
| 76 | ||||||||
| 77 | ### Schritt 3: wl-gammarelay-rs installieren |
|||||||
| 78 | (Vorkompilierte statische Binärdatei – kein Rust/Compiler auf dem Gerät nötig.) |
|||||||
|
79 | [wl-gammarelay-rs](./wl-gammarelay-rs) |
||||||
|
80 | |||||||
| 81 | ```bash |
|||||||
| 82 | install -m 755 wl-gammarelay-rs /usr/local/bin/wl-gammarelay-rs |
|||||||
| 83 | /usr/local/bin/wl-gammarelay-rs --version |
|||||||
| 84 | ``` |
|||||||
| 85 | ||||||||
| 86 | ### Schritt 4: Daemon in der kiosk-Sitzung starten |
|||||||
| 87 | ```bash |
|||||||
| 88 | runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 \ |
|||||||
| 89 | /usr/local/bin/wl-gammarelay-rs & |
|||||||
| 90 | ``` |
|||||||
| 91 | ||||||||
| 92 | ### Schritt 5: Helligkeit live setzen (funktionierender Steuerbefehl, als root) |
|||||||
| 93 | ```bash |
|||||||
| 94 | busctl --machine=kiosk@.host --user \ |
|||||||
| 95 | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.5 |
|||||||
| 96 | # weitere Werte: |
|||||||
| 97 | busctl --machine=kiosk@.host --user \ |
|||||||
| 98 | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.3 # dunkler |
|||||||
| 99 | busctl --machine=kiosk@.host --user \ |
|||||||
| 100 | set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 1 # voll |
|||||||
| 101 | ``` |
|||||||
| 102 | > Hinweis: `busctl --user` allein scheitert als root, weil `XDG_RUNTIME_DIR` |
|||||||
| 103 | > fehlt. Deshalb `--machine=kiosk@.host` (greift auf den User-Bus von kiosk zu). |
|||||||
| 104 | ||||||||
| 105 | **Stand jetzt: Dimmen funktioniert flackerfrei und live. ✅** |
|||||||
| 106 | ||||||||
| 107 | --- |
|||||||
| 108 | ||||||||
| 109 | ## HTTP-Schnittstelle (für externe Steuerung / Home Assistant) |
|||||||
| 110 | ||||||||
| 111 | Skript `brightness-server.py` (reines Python, Standardbibliothek) – läuft in der |
|||||||
| 112 | kiosk-Sitzung und nimmt Web-Anfragen entgegen. |
|||||||
|
113 | [brightness-server.py](./brightness-server.py) |
||||||
|
114 | |||||||
| 115 | ```bash |
|||||||
| 116 | install -m 755 brightness-server.py /opt/kiosk/brightness-server.py |
|||||||
| 117 | ||||||||
| 118 | # Test (Daemon muss laufen): |
|||||||
| 119 | runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 \ |
|||||||
| 120 | python3 /opt/kiosk/brightness-server.py |
|||||||
| 121 | ||||||||
| 122 | # von einem anderen Gerät testen (IP anpassen): |
|||||||
| 123 | curl "http://192.168.x.x:8080/set?b=0.3" |
|||||||
| 124 | curl "http://192.168.x.x:8080/set?b=1" |
|||||||
| 125 | curl "http://192.168.x.x:8080/get" |
|||||||
| 126 | ``` |
|||||||
| 127 | ||||||||
|
128 | --- |
||||||
| 129 | ## Autostart & Kiosk-Absicherung (dauerhaft, erledigt ✅) |
|||||||
| 130 | ||||||||
| 131 | ### Daemon-Startskript mit Warte-Schleife |
|||||||
| 132 | `wl-gammarelay-rs` startet beim Booten sonst **zu früh** (bevor labwc den |
|||||||
| 133 | Wayland-Socket bereit hat) und beendet sich. Ein kleines Wrapper-Skript wartet |
|||||||
| 134 | auf den Socket und startet den Daemon erst dann. |
|||||||
| 135 | ||||||||
| 136 | `/usr/local/bin/start-gammarelay.sh`: |
|||||||
| 137 | ```sh |
|||||||
| 138 | #!/bin/sh |
|||||||
| 139 | # wartet auf den Wayland-Socket und startet dann den Dimmer-Daemon |
|||||||
| 140 | for i in $(seq 1 30); do |
|||||||
| 141 | [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ] && break |
|||||||
| 142 | sleep 0.5 |
|||||||
| 143 | done |
|||||||
| 144 | exec /usr/local/bin/wl-gammarelay-rs |
|||||||
| 145 | ``` |
|||||||
| 146 | ```bash |
|||||||
| 147 | chmod 755 /usr/local/bin/start-gammarelay.sh |
|||||||
| 148 | chown kiosk:kiosk /usr/local/bin/start-gammarelay.sh |
|||||||
| 149 | ``` |
|||||||
| 150 | ||||||||
| 151 | ### labwc-Autostart |
|||||||
| 152 | `/home/kiosk/.config/labwc/autostart`: |
|||||||
| 153 | ```sh |
|||||||
| 154 | /usr/local/bin/start-gammarelay.sh & |
|||||||
| 155 | python3 /opt/kiosk/brightness-server.py & |
|||||||
| 156 | /usr/local/bin/ha-kiosk.sh & |
|||||||
| 157 | wvkbd-mobintl --hidden -L 280 & |
|||||||
| 158 | waybar & |
|||||||
| 159 | ``` |
|||||||
| 160 | > In der Autostart-Datei läuft alles bereits als `kiosk` in der Sitzung – daher |
|||||||
| 161 | > KEIN `runuser`/`XDG_RUNTIME_DIR`/`WAYLAND_DISPLAY` nötig, und der Server kann |
|||||||
| 162 | > intern `busctl --user` ohne `--machine` verwenden. Das `&` ist Pflicht, sonst |
|||||||
| 163 | > blockiert labwc. |
|||||||
| 164 | ||||||||
| 165 | ### Chromium-Neustart-Schleife (gegen Alt+F4 / Absturz) |
|||||||
| 166 | In `/usr/local/bin/ha-kiosk.sh` ist der Chromium-Aufruf in eine Schleife |
|||||||
| 167 | gewickelt: Schließt sich der Browser (Alt+F4, Crash), startet er nach 2 s neu. |
|||||||
| 168 | ```sh |
|||||||
| 169 | while true; do |
|||||||
| 170 | flatpak run io.github.ungoogled_software.ungoogled_chromium "${FLAGS[@]}" \ |
|||||||
| 171 | > /home/kiosk/kiosk.log 2>&1 |
|||||||
| 172 | echo "$(date '+%F %T') Chromium beendet (Exit $?), Neustart in 2s" >> /home/kiosk/kiosk.log |
|||||||
| 173 | sleep 2 |
|||||||
| 174 | done |
|||||||
| 175 | ``` |
|||||||
| 176 | > `ydotoold` bleibt VOR der Schleife (nur einmal starten). Alt+F4 wurde bewusst |
|||||||
| 177 | > NICHT in labwc deaktiviert – dient als Notausstieg fürs Warten. |
|||||||
| 178 | ||||||||
|
179 | --- |
||||||
| 180 | ||||||||
| 181 | ## Noch offen (nächste Schritte) |
|||||||
| 182 | ||||||||
| 183 | - [ ] Home Assistant: `rest_command` in `configuration.yaml` + Automationen |
|||||||
| 184 | - [ ] Optional: Zugriffsschutz (Token im Server aktivieren) |
|||||||
| 185 | ||||||||
| 186 | --- |
|||||||
| 187 | ||||||||
| 188 | ## Kurz-Spickzettel (das Wesentliche) |
|||||||
| 189 | ||||||||
| 190 | | Zweck | Befehl | |
|||||||
| 191 | |---|---| |
|||||||
| 192 | | Daemon starten | `runuser -u kiosk -- env XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 /usr/local/bin/wl-gammarelay-rs &` | |
|||||||
| 193 | | Helligkeit setzen | `busctl --machine=kiosk@.host --user set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.5` | |
|||||||
| 194 | | Helligkeit abfragen | `busctl --machine=kiosk@.host --user get-property rs.wl-gammarelay / rs.wl.gammarelay Brightness` | |
|||||||