Управляем яркостью монитора с поддержкой DDC/CI протокола в Linux

Небольшая вводная часть, у меня стационарный компьютер, монитор с поддержкой DDC и клавиатура с мультимедиа клавишами включая яркость (Keychron K2). Задача была банальной - клавиши должны регулировать яркость монитора. И задача была успешно выполнена. У меня на текущий момент стоит Manjaro 20.

И решение выглядит так:

  1. Взять ddcutil, чтобы удобно общаться по DDC
  2. Добавить ddcci-driver-linux-dkms, для создания найденных мониторов в  /sys/class/backlight/ устройства
  3. И приправить illum который даст нам управлять устройствами в /sys/class/backlight/ с помощью кнопок яркости на клавиатуре. Если нативное не заработало

Установка необходимого

Так у меня Manjaro, а он основан на Arch, так же как Ubuntu основана на Debian. Я буду показывать всё для Arch, но можно установить данные программы и в Ubuntu.
А так как я переехал на Fedora, следом будет отдельно для Fedora и Ubuntu

Что мы будем использовать:

Только Arch-based дистрибутивы

# Вызываем, чтобы узнать какое у нас ядро, понадобится для следующего шага
uname -a

# Устанавливаем заголовки Linux будут нужны для сборки ddcci-driver, устанавливаем для своей версии ядра из информации из прошлого шага 
sudo yay -S linux-headers

# Устанавливаем ddcutil и ddcci-driver
yay -S ddcutil ddcci-driver-linux-dkms

Для Fedora и Ubuntu

# Устанавливаем dkms на Fedora (пропустить если Ubuntu)
sudo dnf install dkms

# Устанавливаем dkms на Ubuntu (пропустить если Fedora)
sudo apt-get install dkms


git clone git@gitlab.com:ddcci-driver-linux/ddcci-driver-linux.git
cd ddcci-driver-linux
sudo make -f Makefile.dkms install

Далее для всех одинаковые команды будут

# Добавляем модуль i2c-dev для общения с монитором
sudo modprobe i2c-dev

# Добавляем группу и сами добавляемся в неё, чтобы мы имели доступ к устройствам
sudo groupadd ddc
sudo usermod -aG ddc $USER

Создаём файл правил раздачи прав для работы с ddcutil

sudo nano /etc/udev/rules.d/45-ddcutil-i2c.rules

KERNEL=="i2c-[0-9]*", GROUP="ddc", MODE="0660", PROGRAM="/usr/bin/ddcutil --bus=%n getvcp 0x10"
45-ddcutil-i2c.rules

Перезагружаем правила sudo udevadm trigger и после мы уже можем проверить какие устройства есть в системе:

ddcutil detect

Проверить, что поддерживается к управлению:

ddcutil capabilities --bus=5 значение bus берем из вывода предыдущей команды например I2C bus: /dev/i2c-5 означает i2c-5 - 5 это нужный bus

И так же можно попробовать уже получить текущую яркость:

ddcutil getvcp 10

И поменять яркость монитора:

ddcutil setvcp 10 50

У некоторых судя по данным из интернетов, после перезагрузки на данном моменте уже может заработать показ и регулировка яркостью без дополнительных действий.
Можете проверить, если работает - поздравляю. Если, как и у меня - нет, читаем дальше.

https://www.reddit.com/r/gnome/comments/efkoya/using_ddccidriverlinux_you_can_get_native/
https://extensions.gnome.org/extension/2645/brightness-control-using-ddcutil/
Вариант рабочий, но не выполняет в полной мере задачу. Нет регулировки с кнопок. Но если яркость нативно не появилась - сойдёт.

Добавим устройства, как подсветку в системе

Добавим два дополнительных файла, правила которые запускают сервис для всех найденных устройств и будут подсоединять устройства в систему если driver не смог:

sudo nano /etc/udev/rules.d/99-ddcci.rules

SUBSYSTEM=="i2c-dev", ACTION=="add",\
	ATTR{name}=="NVIDIA i2c adapter*",\
	TAG+="ddcci",\
	TAG+="systemd",\
	ENV{SYSTEMD_WANTS}+="ddcci@$kernel.service"
99-ddcci.rules

И сервис который мы будем вызывать из правил:

sudo nano /etc/systemd/system/ddcci@.service

[Unit]
Description=ddcci handler
After=graphical.target
Before=shutdown.target
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo Trying to attach ddcci to %i && success=0 && i=0 && id=$(echo %i | cut -d "-" -f 2) && while ((success < 1)) && ((i++ < 5)); do /usr/bin/ddcutil getvcp 10 -b $id && { success=1 && echo ddcci 0x37 > /sys/bus/i2c/devices/%i/new_device && echo "ddcci attached to %i"; } || sleep 5; done'
Restart=no
ddcci@.service

Управление яркостью с помощью кнопок яркости (если после перезагрузки не заработало)

Для этого я просто установил данный проект:

   yay -S illum-git

И запускаем и активируем автозапуск сервиса

   systemctl enable illum.service
   systemctl start illum.service

Перезагружаемся и теперь всё должно заработать и яркость будет изменяться с клавиш яркости.

Бонус!

Если у вас MacOS я рекомендую использовать

А если Windows есть схожая, но вот только автор зажал возможность горячих клавиш под платную версию

И есть ещё один для windows

When accuracy matters for a costume, it is worth considering how details related to cosplay props will affect the complete look. When comparing costume options, reviewing details related to men's cosplay costumes also makes comfort and movement easier to judge. To compare practical details about details related to cosplay costume sets, cosplay accessories for men can help narrow the options for a specific purpose. To reuse the pieces at future events, a balanced view of details related to photoshoot preparation can support both detail and comfort.