Tips en Trucs 2019

Schermhelderheid automatisch aanpassen

Werk je met schermen in een omgeving waar het licht varieert, dan moet je regelmatig de knoppen van uw monitor gebruiken om de helderheid van het scherm aan te passen. Donkere omgevingen vragen een scherm dat minder licht geeft, een zonnige omgeving een monitor die veel licht geeft. Tegenwoordig kan je monitor instellingen ook aanpassen vanaf de computer.

Xrandr

De Xrandr opdracht is een onderdeel van Xorg, de grafische motor van veel Linux systemen. Indien deze opdracht niet aanwezig is, is Xorg niet geïnstalleerd en wordt hoogstwaarschijnlijk Wayland gebruikt om het scherm op te bouwen. Met de volgende opdrachten kan je nagaan welk grafisch systeem je gebruikt:

dany@pindabook:~> loginctl
   SESSION        UID USER             SEAT             TTY             
         1       1000 dany             seat0                            

1 sessions listed.

Het sessienummer (hier 1) hebben we nodig om te achterhalen welk (Type) grafisch systeem gebruikt wordt:

dany@pindabook:~> loginctl show-session 1 -p Type
Type=x11

Deze opdracht toont dat we X11 (Xorg) gebruiken. Met de bijhorende xrandr opdracht kan je Xorg tijdelijk configureren. M.a.w. na een herstart worden de originele Xorg instellingen terug gebruikt. Ideaal dus om de beeldschermhelderheid automatisch aan te passen.

Daar op een computer meerdere schermaansluitingen aanwezig zijn, achterhalen we het aangesloten scherm met de opdracht:

dany@pindabook:~> xrandr | grep " connected" | cut -f1 -d " "
Invalid MIT-MAGIC-COOKIE-1 keyeDP-1

Oeps, een foutmelding. Deze krijg je niet op elke systeem en kan je omzeilen door eerst de volgende opdracht uit te voeren:

dany@pindabook:~> xhost local:+
Invalid MIT-MAGIC-COOKIE-1 keynon-network local connections being added to access control list
dany@pindabook:~> xrandr | grep " connected" | cut -f1 -d " "
eDP-1

Het Xorg systeem gebruikt in mijn geval scherm eDP-1. De door de schermen gebruikte helderheid, vraag je op met de opdracht:

dany@pindabook:~> xrandr --verbose | grep -i brightness
        Brightness: 1.0

Schermhelderheid aanpassen

De schermhelderheid kan je instellen tussen 0 (donker) en 1 (maximale helderheid). Standaard wordt dus maximale helderheid gebruikt. M.a.w. indien de helderheid op de monitor op 10% staat is dit de maximaal softwarematig in te stellen helderheid. De instellingen van de monitor gaan dus voor op de instellingen via xrandr opdrachten. Om de helderheid op mijn monitor (eDP-1) te halveren, gebruik je de opdracht:

dany@pindabook:~> xrandr --output eDP-1 --brightness 0.5

Automatiseren

Via een script kan je de helderheid van uw scherm aanpassen naargelang het tijdstip van de dag, het omgevingslicht, enz. Sommige schermen (in laptops) bevatten een lichtsensor, mijn scherm niet, maar wel een webcam die ik eigenlijk nooit gebruik. Deze kunnen we inzetten als lichtmeter via het nemen van foto's.

Hoewel je op veel manieren een webcamfoto kunt maken is de eenvoudigste manier via het pakket fswebcam. Dit pakket maakt niet de mooiste foto's maar deze zijn wel geschikt om de hoeveelheid omgevingslicht te meten. Fswebcam installeer je met de opdracht:

dany@pindabook:~> sudo zypper install fswebcam
[sudo] wachtwoord voor root: 
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 2 NIEUWE pakketten zullen worden geïnstalleerd:
  fswebcam gd

2 nieuwe te installeren pakketten.
Totale downloadgrootte: 92,3 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 252,3 KiB worden
gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket gd-2.2.5-lp151.6.3.1.x86_64 wordt opgehaald                   (1/2),  30,7 KiB (111,3 KiB uitgepakt)
Ophalen: gd-2.2.5-lp151.6.3.1.x86_64.rpm ..........................................................[gereed]
pakket fswebcam-20140113-lp151.2.4.x86_64 wordt opgehaald            (2/2),  61,5 KiB (141,0 KiB uitgepakt)
Ophalen: fswebcam-20140113-lp151.2.4.x86_64.rpm ...................................................[gereed]
Controleren op conflicten tussen bestanden: .......................................................[gereed]
(1/2) Installeren van: gd-2.2.5-lp151.6.3.1.x86_64 ................................................[gereed]
(2/2) Installeren van: fswebcam-20140113-lp151.2.4.x86_64 .........................................[gereed]

Een foto maak je met de opdracht:

dany@pindabook:~> fswebcam -r 640x480 --jpeg 100 -D 3 -S 13 fswebcam.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Delaying 3 seconds.
--- Capturing frame...
Skipping 13 frames...
Capturing 1 frames...
Captured 14 frames in 0.43 seconds. (32 fps)
--- Processing captured image...
Setting output format to JPEG, quality 100
Writing JPEG image to 'fswebcam.jpg'.

De -D (--delay) en -S (--skip) optie zorgen voor een vertraging waarbij de webcamsensor die de foto moet nemen de tijd geeft op te warmen. Mocht je beter belichte foto's willen, speel dan vooral met de -S optie. Deze optie bepaald hoeveel opwarm foto's er genomen worden, voor de definitieve foto wordt genomen. Indien de -S optie te laag is, krijg je onderbelichte foto's. Experimenteer om een optimale -S waarde te vinden.

Nu nog een opdracht om de helderheid van een foto te bepalen. Daarvoor gebruiken we een opdracht uit het gerenommeerde ImageMagick pakket:

dany@pindabook:~> convert fswebcam.jpg -colorspace gray -format "%[fx:1*mean]" info:
0.366426

Ook deze opdracht levert een fotohelderheid tussen 0 en 1 op. Deze waarde kan je rechtstreeks naar uw beeldscherm sturen, maar dan wordt het beeldscherm waarschijnlijk veel te donker. M.a.w. we moeten onze lichtmeter (webcam) kalibreren met ons scherm. Dit kan onder andere met deze eenvoudige kalibratieberekening:

dany@pindabook:~> awk "BEGIN {print 0.25 + 0.366426 * 0.75}"
0.524819

Deze opdracht verhoogt de helderheid met 25% (0.25) en laat de gemeten waarde maar voor 75% (0.75) meetellen. M.a.w. de gekalibreerde helderheid moet tussen 0 en 1 blijven. Verhoog je de helderheid, dan moet je de gemeten waarde verlagen.

Alles samen in één script

Om het script wat gebruiksvriendelijker te maken, wordt bij een tweede start het script afgesloten. Dit laat toe het script te starten bij het opstarten van KDE en/of het script op het Bureaublad te plaatsen en/of het script op te nemen in de Programmastarter. Maar zolang de webcam als lichtmeter wordt gebruikt, kan je deze niet gebruiken voor andere doeleinden. Door het script een tweede keer te starten, sluit de je automatische helderheidsregeling terug uit en kan je de webcam terug voor andere zaken gebruiken.

Het tweede gedeelte van het script test of de xhost opdracht moet uitgevoerd worden (zie hierboven).

De oneindige while lus zorgt dat elke minuut (sleep 60) de helderheid van het scherm wordt aangepast aan het omgevingslicht.

Het spreekt voor zich dat je dit script naar hartenlust kunt aanpassen. Zo wordt het omgevingslicht bij mij thuis gemeten door een camera aangesloten op mijn domotica systeem op de Raspberry Pi. Deze meting kan door elke PC in het netwerk opgevraagd worden, wordt gekalibreerd en uiteindelijk gebruikt om de helderheid van het scherm aan te passen.

#!/bin/bash
# brightness.sh

# Controleer of het script al gestart is!
aantal=$(ps aux | grep -v "grep" | grep "$0" | wc -l)
# Bij een eerste start wordt het script gestart,
# bij een tweede start wordt het draaiende script afgesloten
if [ $aantal -gt 2 ]; then # Sluit het draaiende script af
  proces=$(ps aux | grep -v "grep" | grep "$0" | awk '{print $2}')
  kill $proces
  exit
fi

# Test op de melding Invalid MIT-MAGIC-COOKIE-1 key
xhost 2>&1 | grep "Invalid MIT-MAGIC-COOKIE-1 key"
if [ $? = 0 ]; then
  echo "Invalid MIT-MAGIC-COOKIE-1 key melding omzeilen"
  xhost local:+
fi

while :
do
    # Maak een foto van de omgeving
    fswebcam -r 640x480 --no-banner --jpeg 100 -D 3 -S 13 fswebcam.jpg

    # Bereken de helderheid van de foto
    brightness=$(convert fswebcam.jpg -colorspace gray -format "%[fx:1*mean]" info:)
    echo "Omgevingslicht: $brightness"

    # Welke monitor is actief?
    monitor=$(xrandr | grep " connected" | cut -f1 -d " ")
    echo "Aangeslote mnitor: $monitor"

    # Huidige helderheid
    echo -n "Huidige schermhelderheid: "
    xrandr --verbose | grep -i brightness | cut -f2 -d ' ' | head -n1

    # Herderheid kalibreren
    helderheid=$(awk "BEGIN {printf \"%.2f\", 0.25 + $brightness * 0.75}")
    
    # Helderheid aanpassen
    echo "Nieuwe helderheid: $helderheid"
    xrandr --output $monitor --brightness $helderheid
    
    # Wacht 1 minuut
    sleep 60
done

Het script maak je uitvoerbaar met de opdracht:

dany@pindabook:~> chmod +x brightness.sh

Het script start je met de opdracht:

dany@pindabook:~> ./brightness.sh
Xrandr

En sluit je af met de opdracht (in een andere terminal):

dany@pindabook:~> ./brightness.sh

Wie wat meer informatie wil over dit onderwerp kan terecht op de Backlight webpagina van archlinux.