Вопрос или проблема
Я хочу отключать экран после 10 минут бездействия, а через 1 минуту, ЕСЛИ монитор все еще отключен, тогда заблокировать экран.
Я знаю, как отключить экран с помощью dbus
, как заблокировать экран и как получить состояние заставки (то есть, заблокирован ли экран). Но я не знаю, как узнать текущее состояние монитора ВКЛ/ВЫКЛ.
Поэтому я хочу, чтобы KDE вызывал этот скрипт после 10 минут бездействия:
#!/bin/bash
sleep 1
dbus-send --session --print-reply --dest=org.kde.kglobalaccel /component/org_kde_powerdevil org.kde.kglobalaccel.Component.invokeShortcut string:'Turn Off Screen'
sleep 60
[[ <ЯВЛЯЕТСЯ ЛИ МОНИТОР ВЫКЛ?> ]] && dbus-send --session --print-reply --dest=org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock
Так как же запросить состояние монитора (предпочтительно с помощью dbus
), а именно условие <ЯВЛЯЕТСЯ ЛИ МОНИТОР ВЫКЛ?>
в вышеупомянутом скрипте?
Раньше я делал xset -q | grep -i 'monitor is off'
, но теперь получаю ошибку: Сервер не имеет расширения DPMS
.
Утилита ddcutil упоминается на kde.org как используемая kde
.
Она общается с монитором через его I2C-канал (который используется для получения EDID
Расширенные данные идентификации дисплея, например).
Используйте sudo ddcutil detect
, чтобы пройтись по устройствам /dev/i2c-*
, чтобы узнать,
на каком шине находится ваш монитор, например /dev/i2c-7
.
Затем вы можете использовать ddcutil vcpinfo --verbose
для отображения известных VCP-кодов, и в частности кода D6:
VCP код D6: Режим питания
Статус DPM и DPMS
Версии MCCS: 2.0, 2.1, 3.0, 2.2
Группы спецификаций MCCS: Управление, Разное
Подмножества функций ddcutil:
Атрибуты: Чтение Запись, Непрерывный (простой)
Простые NC значения:
0x01: DPM: Вкл, DPMS: Выкл
0x02: DPM: Выкл, DPMS: Режим ожидания
0x03: DPM: Выкл, DPMS: Приостановка
0x04: DPM: Выкл, DPMS: Выкл
0x05: Только запись значения для отключения дисплея
Затем вы можете попробовать прочитать это значение с монитора и интерпретировать его, чтобы узнать, в каком состоянии он находится в данный момент.
sudo ddcutil --bus 7 getvcp 0xd6`
Если выдаст истечение времени с Превышено максимальное количество попыток
, значит, этот код не реализован.
Ответ или решение
Для решения задачи по определению состояния монитора в процессе автоматизации на базе KDE, мы можем использовать утилиту ddcutil
, которая взаимодействует с монитором через его интерфейс I2C. Ваша цель заключается в том, чтобы выключить экран после 10 минут неактивности и затем заблокировать экран, если через 1 минуту он все еще будет выключен. Для этого необходимо узнать текущее состояние монитора (включен он или выключен).
Шаги для определения состояния монитора с использованием ddcutil
-
Установите
ddcutil
:
Прежде всего, убедитесь, чтоddcutil
установлен в вашей системе. Если он еще не установлен, вы можете сделать это с помощью пакетного менеджера вашей дистрибуции. Например, для Ubuntu используйте команду:sudo apt install ddcutil
-
Определите шину, на которой подключен монитор:
Используйте командуddcutil detect
, чтобы обнаружить, на каких шинах находятся ваши мониторы. Это действие выведет список всех доступных устройств I2C. Например:sudo ddcutil detect
Обратите внимание на запись вида
/dev/i2c-7
или остальное, в зависимости от вашей конфигурации. -
Проверьте VCP-коды вашего монитора:
После идентификации шины можно узнать, какие VCP-коды поддерживает ваш монитор. В частности, нас интересует кодD6
, который отвечает за состояние питания и является частью протокола MCCS (Multimedia Command and Control Set). Выполните:sudo ddcutil --bus 7 vcpinfo --verbose
-
Получите состояние питания монитора:
С помощью следующей команды вы сможете прочитать состояние питания:sudo ddcutil --bus 7 getvcp 0xd6
Вывод будет содержать значения, которые указывают на состояние монитора:
0x01
: Включен0x02
: В режиме ожидания0x03
: Приостановлен0x04
: Выключен
-
Интеграция в ваш скрипт:
С учетом всего вышеизложенного, вы можете обновить ваш bash-скрипт. Пример будет выглядеть следующим образом:
#!/bin/bash
# СLEEP 1 для обеспечения стабилизации
sleep 1
# Отключаем экран
dbus-send --session --print-reply --dest=org.kde.kglobalaccel /component/org_kde_powerdevil org.kde.kglobalaccel.Component.invokeShortcut string:'Turn Off Screen'
# Ждем 60 секунд
sleep 60
# Проверяем состояние монитора
power_state=$(sudo ddcutil --bus 7 getvcp 0xd6 | grep 'Power mode' | awk '{print $NF}')
if [[ "$power_state" == "0x04" ]]; then
# Если состояние - выключен, блокируем экран
dbus-send --session --print-reply --dest=org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock
fi
Заключение
Используя ddcutil
для проверки состояния монитора, вы сможете реализовать автоматизацию управления экраном по вашему желанию. Этот метод является надежным и эффективным для пользователей окружения KDE. Главное, всегда проверяйте вывод команд и при необходимости подстраивайте скрипт под особенности вашего оборудования.