Управляем монитором из скрипта
На всем известном форуме наткнулся на одну, для меня интересную тему: автоматическое пробуждение или отправление монитора в standby при засыпании/пробуждении самой машины. Интересно будет тем, у кого стационарный компьютер или к ноутбуку подключен внешний монитор.
Программа называется ddccontrol - довольно древняя, но до сих пор находится в репах многих дистрибутивов. Она использует протокол DDC/CI, с ее помощью можно изменять яркость, контрастность изображени, управлять питанием и использовать некоторые другие возможности монитора. К сожалению не все мониторы поддерживают этот протокол или просто отсутствуюут в базе данных программы. Тестировалась мной на федоре, для убунты необходимо поправить путь к бинарнику. Кстати, мой монитор довольно новый ( > 3 лет), распознался без проблем. Итак, установка очень простая
$ sudo dnf install ddccontrol
или
$ sudo apt install ddccontrol
после установки запустите программу с параметром -p, чтобы узнать, поддерживается ли ваш монитор. Выполнять необходимо с правами администратора
$ sudo ddccontrol -p
При положительном результате вы получите гору информации. В нашем случае интересны строки находящиеся в самом верху - найденные мониторы
Detected monitors :
- Device: dev:/dev/i2c-2
DDC/CI supported: No
Monitor Name: VESA standard monitor
Input type: Digital
- Device: dev:/dev/i2c-1
DDC/CI supported: Yes
Monitor Name: VESA standard monitor
Input type: Analog
(Automatically selected)
"Device: dev:/dev/i2c-1" - это мой внешний монитор. И информация в самом низу, в разделе "> Power control":
> Power control
> id=dpms, name=DPMS Control, address=0xd6, delay=-1ms, type=2
Possible values:
> id=on - name=On, value=1
> id=standby - name=Standby, value=4
supported, value=1, maximum=4
Интересующие нас параметры address=0xd6 - идентификатор управления питанием , "value=1" - включение и "value=4" - standby.
На сайте можно найти различную документацию, я приведу команду, которая отправляет монитор в standby
$ sudo ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 4
В начале, для того чтобы запускать команду каждый раз, когда ноут засыпает, я создал как обычно скрипт systemd (что кстати сработало), но пользователь intelfx предложил более юзабельный вариант - с sh скриптом. Для этого используем директорию /usr/lib/systemd/system-sleep (в вашей можетбыть другой), скрипты в которой будут автоматически запущены c различными аргументами: pre - для засыпания и post - пробуждения. В принципе из простого скрипта и так все понятно. Обзавем его monitor.sh
#!/bin/sh
case $1/$2 in
pre/*)
/usr/bin/ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 4
;;
post/*)
/usr/bin/ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 1
;;
esac
Скрипт надо сделать исполняемым. К сожалению права на выполнения только для рута не хватает, почему я еще не выяснил. Так что
$ sudo a+x /usr/lib/systemd/system-sleep/monitor.sh
Вот в принципе и все. Потестировать можно так
$ systemctl suspend
или
$ systemctl hibernate
ЗЫ: Могут быть проблемы с запуском скрипта из usr/lib/systemd/... , у кого активирован apparmor на убунте или selinux на федоре - для этого нужно добавлять соответствующие правила, но это уже отдельная тема. Я не параноик, на федоре всегда деактивирую монстроподобный, неповоротливый selinux. Но вы вправе кидаться тапками - с точки зрения безопасности это неразумно.
Комментарии
pomodor
22 июля, 2016 - 12:40
Это как сказать. С одной стороны, он как бы нужен. С другой стороны, нужно владеть всеми нюансами настройки SELinux, иначе пользы от не него мало, а неожиданных проблем в разных местах много.
Комментировать