Üdvözöljük az ubuntu.hu oldalán

Itt megtalálhatja a rendszerrel, illetve a nyílt forráskódú alkalmazásokkal kapcsolatos információkat, érdekességeket. Csatlakozzon a beszélgetésekhez, blogoljon, segítse Ön is a közösséget. Jó fórumozást kívánunk!
Egyéb témákAsztali felhasználásBlogokLeírások, bemutatók

DDCutil: monitorok fényerejének állítgatása desktop gépen

A gépemre egy nvidia GTX 1060-ra két darab BenQ GW2255 monitor csatlakozik.
Mostanában sokat dolgoztam este is, és elég macerás két monitoron lejjebb venni a fényerőt, nappal meg följebb.
Szerencsére van egy olyanunk, hogy ddcutil.
Viszont a beröffentéséhez kicsit utána kellett olvasni, végül is minden megvolt készen, de nem egy helyen 🙂
Tehát:
Ahhoz, hogy működjön, szükséges az i2c-dev modul betöltése. Ezt rendszerindításkor szeretném automatikusan megtenni, ennek a legegyszerűbb módja, hogy létrehozok egy fájlt/etc/modules-load.d/i2c-dev.conf néven (bármi lehetne a neve, csak .conf-ra végződjön), és beleírom, hogy
i2c-dev
Telepítenem kellett a ddcutil csomagot (apt install ddcutil).
Amikor telepítek/eltávolítok, vagy csak a rendszeren piszkálok valamit, azt mindig root-ként teszem, emiatt nem írkálok sok sudo kezdetű parancsot.
Szóval, ddcutil települt, de a
ddcutil detect
azt mondta, nem talál monitort. Ellenőriztem, mindkét monitoromon be van kapcsolva a DDC/CI opció.
Elolvastam, hogy nvidia kártyák esetében további beállításokra van szükség.

Az /etc/modprobe.d/nvidia-kernel-common.conf fájlhoz hozzácsaptam:
options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100

Majd reboot...

Most már a ddcutil szépen megtalálja a monitorokat:

#ddcutil detect
Display 1
   I2C bus:             /dev/i2c-8
   EDID synopsis:
      Mfg id:           BNQ
      Model:            BenQ GW2255
      Serial number:    T5D03192019
      Manufacture year: 2013
      EDID version:     1.3
   VCP version:         2.1

Display 2
   I2C bus:             /dev/i2c-10
   EDID synopsis:
      Mfg id:           BNQ
      Model:            BenQ GW2255
      Serial number:    T5D03200019
      Manufacture year: 2013
      EDID version:     1.3
   VCP version:         2.1

Viszont gyalogjúzerként (= nem root 😃 ) még nem működik, hozzá kell adnom a felhasználómat az i2c csoporthoz:

usermod <felhasználó> -aG i2c

Ki/bejelentkezés, és innetől minden rendben működik gyalgjúzerként is 🙂

/opt alatt elhelyeztem két rettentő bonyolult szkriptet, az egyik világosít, a másik sötétít:

/opt/brightnessup:

#!/bin/sh
if [ ! -f /tmp/brgght ]; then
touch /tmp/brgght
ddcutil -d 1 setvcp 10 + 10 
ddcutil -d 2 setvcp 10 + 10 
rm /tmp/brgght
fi

/opt/brightnessdown:

#!/bin/sh
if [ ! -f /tmp/brgght ]; then
touch /tmp/brgght
ddcutil -d 1 setvcp 10 - 10 
ddcutil -d 2 setvcp 10 - 10 
rm /tmp/brgght
fi

Mindkettő futtathatóvá lett téve természetesen.
Ezután kiválasztottam két nem használt billentyűkombinációt (Fn-F8, Fn-F6), amik eredetileg multimédia gombok a billentyűzeten, de sosem használom. A MATE gyorsbillentyűi között hozzáadtam, hogy ezekre a fenti szkriptek fussanak le.
Most úgy tudom állítani a monitoraim fényerejét (mindkettőt együtt, egy mozdulattal!), mint egy laptop kijelzőét.
Csak lassabban, a gomb megnyomása után 1 másodperccel lép az első monitor, 2 másodperccel a másik monitor fénye. De SOKKAL gyorsabb, mintha a monitorok menüjéből nyomkodnám ki a fényerő állítást!
Nagyon klassz, meg vagyok elégedve 😃

Szerk.: úgy tűnik, ha gyorsan nyomkodom a "fényerő" gombokat, a szkriptek egymásra futnak, az előző még nem fejezte be, de már indul az újabb. Ez okozhatja a kavarodást, hogy a két monitor fénye elcsúszik egymástól. Ezért kiegészítettem a szkripteket egy feltétellel, hogy ha már fut az egyik, ne induljon rá a másik.

Hozzászólások (1)

A hozzászólások nem engedélyezettek ennél a cikknél

A gépemre egy nvidia GTX 1060-ra két darab BenQ GW2255 monitor csatlakozik.
Mostanában sokat dolgoztam este is, és elég macerás két monitoron lejjebb venni a fényerőt, nappal meg följebb.
Szerencsére van egy olyanunk, hogy ddcutil.
Viszont a beröffentéséhez kicsit utána kellett olvasni, végül is minden megvolt készen, de nem egy helyen 🙂
Tehát:
Ahhoz, hogy működjön, szükséges az i2c-dev modul betöltése. Ezt rendszerindításkor szeretném automatikusan megtenni, ennek a legegyszerűbb módja, hogy létrehozok egy fájlt/etc/modules-load.d/i2c-dev.conf néven (bármi lehetne a neve, csak .conf-ra végződjön), és beleírom, hogy
i2c-dev
Telepítenem kellett a ddcutil csomagot (apt install ddcutil).
Amikor telepítek/eltávolítok, vagy csak a rendszeren piszkálok valamit, azt mindig root-ként teszem, emiatt nem írkálok sok sudo kezdetű parancsot.
Szóval, ddcutil települt, de a
ddcutil detect
azt mondta, nem talál monitort. Ellenőriztem, mindkét monitoromon be van kapcsolva a DDC/CI opció.
Elolvastam, hogy nvidia kártyák esetében további beállításokra van szükség.

Az /etc/modprobe.d/nvidia-kernel-common.conf fájlhoz hozzácsaptam:
options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100

Majd reboot...

Most már a ddcutil szépen megtalálja a monitorokat:

#ddcutil detect
Display 1
   I2C bus:             /dev/i2c-8
   EDID synopsis:
      Mfg id:           BNQ
      Model:            BenQ GW2255
      Serial number:    T5D03192019
      Manufacture year: 2013
      EDID version:     1.3
   VCP version:         2.1

Display 2
   I2C bus:             /dev/i2c-10
   EDID synopsis:
      Mfg id:           BNQ
      Model:            BenQ GW2255
      Serial number:    T5D03200019
      Manufacture year: 2013
      EDID version:     1.3
   VCP version:         2.1

Viszont gyalogjúzerként (= nem root 😃 ) még nem működik, hozzá kell adnom a felhasználómat az i2c csoporthoz:

usermod <felhasználó> -aG i2c

Ki/bejelentkezés, és innetől minden rendben működik gyalgjúzerként is 🙂

/opt alatt elhelyeztem két rettentő bonyolult szkriptet, az egyik világosít, a másik sötétít:

/opt/brightnessup:

#!/bin/sh
if [ ! -f /tmp/brgght ]; then
touch /tmp/brgght
ddcutil -d 1 setvcp 10 + 10 
ddcutil -d 2 setvcp 10 + 10 
rm /tmp/brgght
fi

/opt/brightnessdown:

#!/bin/sh
if [ ! -f /tmp/brgght ]; then
touch /tmp/brgght
ddcutil -d 1 setvcp 10 - 10 
ddcutil -d 2 setvcp 10 - 10 
rm /tmp/brgght
fi

Mindkettő futtathatóvá lett téve természetesen.
Ezután kiválasztottam két nem használt billentyűkombinációt (Fn-F8, Fn-F6), amik eredetileg multimédia gombok a billentyűzeten, de sosem használom. A MATE gyorsbillentyűi között hozzáadtam, hogy ezekre a fenti szkriptek fussanak le.
Most úgy tudom állítani a monitoraim fényerejét (mindkettőt együtt, egy mozdulattal!), mint egy laptop kijelzőét.
Csak lassabban, a gomb megnyomása után 1 másodperccel lép az első monitor, 2 másodperccel a másik monitor fénye. De SOKKAL gyorsabb, mintha a monitorok menüjéből nyomkodnám ki a fényerő állítást!
Nagyon klassz, meg vagyok elégedve 😃

Szerk.: úgy tűnik, ha gyorsan nyomkodom a "fényerő" gombokat, a szkriptek egymásra futnak, az előző még nem fejezte be, de már indul az újabb. Ez okozhatja a kavarodást, hogy a két monitor fénye elcsúszik egymástól. Ezért kiegészítettem a szkripteket egy feltétellel, hogy ha már fut az egyik, ne induljon rá a másik.

Ennyivel később: 16 nap

Kicsit felturbóztam.
Összeolvasztottam 1 szkriptbe, ezt kell "u" paraméterrel hívni fényesítéshez, "d" paraméterrel sötétítéshez.
Első futáskor lekéri az aktuális fényerőt az egyik monitorról, és elteszi egy fájlba /tmp alá.
A többi futáskor innen szedi elő, és a tárolt értékkel birizgálja a monitort.
Így kevesebb adatmozgás van az i2c-n (és végeredményben így gyorsabb).
A ddcutil kapott egy paramétert, sleep-multiplier 0.5: ettől gyorsabban kommunikál, de még jó. 0.4-gyel már gyakran hibázgat, ez nyilván monitor függő, hogy hol mi működik még jól.
Az állítgatás után a ddcutil visszatérési értékét vizsgálja a script, így ha valami hiba volt, újrapróbálja.
A két monitor fényerejét egyszerre igyekszik állítani a script a
setvcp 1 $curbrght & setvcp 2 $curbrght
sorban.

Az eredmény, hogy monitorok fényereje a gombnyomás után kb 0,8mp múlva vált (ezt nem sikerült lejjebb faragni), de majdnem majdnem egyszerre: 0,3...max. 0,5 másoderc az eltérés, a sorrend az véletlenszerű.
Sosem csúszik már el a fényerő a két monitoron.

#!/bin/sh

setvcp() {
rep=true
while $rep 
do
ddcutil -d $1 setvcp 10 $2 --sleep-multiplier .5
if [ $? -eq 0 ]; then 
  rep=false
  echo "set OK"
fi
done
}


if [ ! -f /tmp/brgght ]; then
touch /tmp/brgght
if [ ! -f /tmp/curbrght ]; then
 curbrght=$(ddcutil getvcp 10 | awk '{ print $9 }' | tr ',' '\n');
else
 curbrght=$(head -n 1 /tmp/curbrght)
fi

case $1 in
u) if [ $curbrght -lt 90 ] ; then 
        curbrght=$((curbrght + 10))
   else 
        curbrght=100;
   fi ;;
d) if [ $curbrght -gt 9 ] ; then 
       curbrght=$((curbrght - 10))
   else 
      curbrght=0;
   fi ;;
esac

echo $curbrght > /tmp/curbrght

setvcp 1 $curbrght & setvcp 2 $curbrght
sleep 0.5
rm /tmp/brgght
fi
Ennyivel később: egy év