Управляем монитором из скрипта

На всем известном форуме наткнулся на одну, для меня интересную тему: автоматическое пробуждение или отправление монитора в 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. Но вы вправе кидаться тапками - с точки зрения безопасности это неразумно.

5
Ваша оценка: Нет Средняя оценка: 5 (3 votes)
pomodor

Я не параноик, на федоре всегда деактивирую монстроподобный, неповоротливый selinux. Но вы вправе кидаться тапками — с точки зрения безопасности это неразумно.

Это как сказать. С одной стороны, он как бы нужен. С другой стороны, нужно владеть всеми нюансами настройки SELinux, иначе пользы от не него мало, а неожиданных проблем в разных местах много.

Ваша оценка: Нет Средняя оценка: 5 (2 votes)
Отправить комментарий
КАПЧА
Вы человек? Подсказка: зарегистрируйтесь, чтобы этот вопрос больше никогда не возникал. Кстати, анонимные ссылки запрещены.
CAPTCHA на основе изображений
Enter the characters shown in the image.