Ви просили простий і надійний спосіб, як зробити, щоб вдень було світло й яскраво, а ввечері — темно і затишно. Тримайте! Нижче — покрокова інструкція для GNOME та KDE з використанням bash скриптів і systemd timers. Це легка автоматизація задач, яка працює навіть без відкритого терміналу.

Що саме ми автоматизуємо

Ми створимо один універсальний bash-скрипт, який уміє:

  • перемикати світлу/темну тему в GNOME або KDE;
  • регулювати яскравість екрану (через brightnessctl або ddcutil для зовнішніх моніторів);
  • запускатися за розкладом через systemd timers (аналог cron, але сучасніший і зручніший для користувацьких сесій).

Результат: наприклад, о 08:00 автоматично вмикається світла тема і 80% яскравості, а о 21:30 — темна тема і 30% яскравості. Звучить як маленьке диво, але це Linux, тож усе під контролем! ✨

Підготовка інструментів

Встановіть утиліти для керування яскравістю (приклади команд для Debian/Ubuntu; у Fedora використайте dnf, в Arch — pacman):

sudo apt update
sudo apt install brightnessctl ddcutil

Порада: для роботи brightnessctl інколи потрібно додати себе в групу video і перелогінитись:

sudo usermod -aG video $USER

How-to: створюємо скрипт і таймери systemd

1) Bash-скрипт перемикача теми та яскравості

Створіть файл ~/.local/bin/theme-switch.sh і зробіть його виконуваним. Це серце всієї магії bash скрипти.

mkdir -p ~/.local/bin
nano ~/.local/bin/theme-switch.sh

Вставте код:

#!/usr/bin/env bash
set -euo pipefail

DESKTOP="${XDG_CURRENT_DESKTOP:-${XDG_SESSION_DESKTOP:-}}"

set_theme() {
  local mode="$1" # light|dark
  if [[ "$DESKTOP" =~ GNOME ]]; then
    if [[ "$mode" == "light" ]]; then
      gsettings set org.gnome.desktop.interface color-scheme 'default'
    else
      gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
    fi
  elif [[ "$DESKTOP" =~ KDE|PLASMA ]]; then
    if command -v plasma-apply-colorscheme &>/dev/null; then
      if [[ "$mode" == "light" ]]; then
        plasma-apply-colorscheme Breeze || true
      else
        plasma-apply-colorscheme BreezeDark || true
      fi
    fi
    if command -v lookandfeeltool &>/dev/null; then
      if [[ "$mode" == "light" ]]; then
        lookandfeeltool -a org.kde.breeze.desktop || true
      else
        lookandfeeltool -a org.kde.breezedark.desktop || true
      fi
    fi
  fi
}

set_brightness() {
  local value="$1" # відсоток, напр. 30
  if command -v brightnessctl &>/dev/null; then
    brightnessctl set "${value}%"
  elif command -v ddcutil &>/dev/null; then
    # Спроба встановити яскравість на всіх знайдених моніторах (VCP 0x10)
    ddcutil detect | awk '/Display/ {print $NF}' | while read -r disp; do
      ddcutil --display "$disp" setvcp 10 "$value" || true
    done
  fi
}

case "${1:-}" in
  day)
    set_theme light
    set_brightness 80
    ;;
  night)
    set_theme dark
    set_brightness 30
    ;;
  *)
    echo "Usage: $0 {day|night}"
    exit 1
    ;;
esac

Надайте права на виконання:

chmod +x ~/.local/bin/theme-switch.sh

2) Користувацькі systemd-сервіси

Створіть два user-сервіси: денний та нічний. Це зручно поєднується з cron та systemd timers, але ми використовуємо саме systemd (краще інтегрований у GUI Linux-сесії).

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/theme-day.service

Вставте:

[Unit]
Description=Switch to day theme and brightness
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=%h/.local/bin/theme-switch.sh day

І нічний:

nano ~/.config/systemd/user/theme-night.service
[Unit]
Description=Switch to night theme and brightness
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=%h/.local/bin/theme-switch.sh night

3) Таймери за розкладом

Створіть таймери, які запускатимуть сервіси в заданий час. Змінюйте години під себе.

nano ~/.config/systemd/user/theme-day.timer
[Unit]
Description=Daily day theme switch at 08:00

[Timer]
OnCalendar=08:00
Persistent=true
Unit=theme-day.service

[Install]
WantedBy=timers.target
nano ~/.config/systemd/user/theme-night.timer
[Unit]
Description=Daily night theme switch at 21:30

[Timer]
OnCalendar=21:30
Persistent=true
Unit=theme-night.service

[Install]
WantedBy=timers.target

4) Активуємо

systemctl --user daemon-reload
systemctl --user enable --now theme-day.timer theme-night.timer
systemctl --user list-timers --all | grep theme-

Перевірте вручну:

systemctl --user start theme-night.service
# і
systemctl --user start theme-day.service

Альтернативні способи

  • cron замість systemd timers: працює, але гірше інтегрований із користувацькою сесією (D-Bus). Тим не менш, якщо любите трюки Linux — можна.
  • Тільки яскравість: використайте лише brightnessctl або ddcutil у таймерах.
  • За світанком/заходом сонця: додайте sunwait або скрипт, що обчислює час за геолокацією, й оновлює OnCalendar через systemd-run --user --on-calendar=....

GUI-спосіб (швидке налаштування)

  • GNOME: Налаштування → Вигляд → перемикайте Light/Dark. Для розкладу — розширення “Night Theme Switcher” (extensions.gnome.org). Воно дозволяє вибрати часові діапазони і навіть вмикати теми іконок.
  • KDE Plasma: System Settings → Appearance → Global Theme/Colors. Штатного планувальника тем немає, тому для розкладу зручніше використати наш підхід через systemd або сторонні скрипти.
  • Нагадування: Night Light/Night Color регулюють температуру кольору, а не яскравість. Тому їх можна поєднати з нашим рішенням 🌙

FAQ

1) Команда gsettings не працює в таймері.
Переконайтеся, що це саме користувацький сервіс (шлях ~/.config/systemd/user, а не системний) і ви запускали через systemctl --user. Також переконайтеся, що GNOME встановлено (не мінімальний сервер) і ви працюєте в графічній сесії.

2) brightnessctl каже: Permission denied.
Додайте користувача в групу video: sudo usermod -aG video $USER, перелогіньтесь. Для зовнішніх моніторів через ddcutil може знадобитись група i2c і модуль ядра i2c-dev (sudo modprobe i2c-dev).

3) На Wayland XRandR не працює.
Саме тому ми використовуємо brightnessctl (через /sys/backlight) та ddcutil для DDC/CI — вони незалежні від XRandR.

4) У KDE не застосовується тема або застосовується частково.
Спробуйте і plasma-apply-colorscheme, і lookandfeeltool (у скрипті це вже враховано). Переконайтеся, що пакети Plasma повністю встановлені. Деякі застосунки можуть підхопити тему після перезапуску.

5) Як подивитися логи сервісів?
journalctl --user -u theme-day.service -b і journalctl --user -u theme-night.service -b. Це допоможе зловити помилки шляху або прав доступу.

6) Чи вплине перехід на літній/зимовий час?
Ні, OnCalendar використовує локальний час, systemd сам подбає про коректне спрацювання.

7) Чи не конфліктує з GNOME-розширеннями?
Якщо розширення теж перемикає тему за розкладом, можливі гонки. Вимкніть одне з рішень або поставте різний час.

Порада від Kernelka

Перш ніж автоматизувати, вручну перевірте команди. Запустіть:

~/.local/bin/theme-switch.sh night
~/.local/bin/theme-switch.sh day

Якщо яскравість занадто різко стрибає — підкоригуйте значення (наприклад, 70% вдень і 40% ввечері). Маленькі кроки роблять робочий стіл комфортнішим щодня 💡

Підсумок

  • Створили універсальний скрипт для GNOME і KDE, що перемикає тему і яскравість.
  • Налаштували два systemd timers з розкладом на ранок і вечір.
  • Розглянули альтернативи (cron, sunrise/sunset, GUI-розширення для GNOME).
  • Розв’язали типові проблеми через FAQ (права доступу, Wayland, логи).
  • Це чиста автоматизація задач без зайвих залежностей і з повною керованістю.

Ви молодці! Тепер ваш налаштування робочого столу ще розумніші й зручніші. Якщо хочете — додайте більше таймерів для різних сцен (ранній ранок, пізня ніч) і експериментуйте з темами. Kernelka завжди поруч допомогти! 🐧