Как получить состояние монитора?

Вопрос или проблема

Я хочу отключать экран после 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

  1. Установите ddcutil:
    Прежде всего, убедитесь, что ddcutil установлен в вашей системе. Если он еще не установлен, вы можете сделать это с помощью пакетного менеджера вашей дистрибуции. Например, для Ubuntu используйте команду:

    sudo apt install ddcutil
  2. Определите шину, на которой подключен монитор:
    Используйте команду ddcutil detect, чтобы обнаружить, на каких шинах находятся ваши мониторы. Это действие выведет список всех доступных устройств I2C. Например:

    sudo ddcutil detect

    Обратите внимание на запись вида /dev/i2c-7 или остальное, в зависимости от вашей конфигурации.

  3. Проверьте VCP-коды вашего монитора:
    После идентификации шины можно узнать, какие VCP-коды поддерживает ваш монитор. В частности, нас интересует код D6, который отвечает за состояние питания и является частью протокола MCCS (Multimedia Command and Control Set). Выполните:

    sudo ddcutil --bus 7 vcpinfo --verbose
  4. Получите состояние питания монитора:
    С помощью следующей команды вы сможете прочитать состояние питания:

    sudo ddcutil --bus 7 getvcp 0xd6

    Вывод будет содержать значения, которые указывают на состояние монитора:

    • 0x01: Включен
    • 0x02: В режиме ожидания
    • 0x03: Приостановлен
    • 0x04: Выключен
  5. Интеграция в ваш скрипт:
    С учетом всего вышеизложенного, вы можете обновить ваш 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. Главное, всегда проверяйте вывод команд и при необходимости подстраивайте скрипт под особенности вашего оборудования.

Оцените материал
Добавить комментарий

Капча загружается...