Автоматически скорректируйте яркость дисплея на основе восхода солнца и заката

Существуют подобные вопросы, и ответы в Спрашивают Ubuntu, которые указывают на эти решения:

но они или требуют ручной записи восхода солнца и времена заката, или они просто корректируют цветовой баланс и добавляют более красный ночью.

Я ищу решение, которое автоматически получает восход солнца и времена заката каждый день и физически корректирует яркость дисплея. Кроме того, я хочу эффект перехода в течение 60 - 120 минут, таким образом, я не замечаю изменения дисплея.

При реконфигурировании в облачные дни (затемнитель снаружи) или когда солнце, оказывается, устанавливает между два, три здания истории вместо их вершин крыши (более яркий до заката) должны быть быстрым и легким процессом.

10
задан 13 April 2017 в 05:24

4 ответа

Обновленное сообщение с 2019 - привлекательный

Привлекательный сценарий удара, работающий как deamon и спящий большую часть времени 24/7. Это автоматически корректирует яркость экрана (и дополнительно гамма также) для Вашего дисплея портативного компьютера через аппаратный интерфейс и до двух других мониторов с помощью программного управления xrandr.

В восходе солнца (время автоматически получается из Интернета каждый день), Ваша яркость экрана (и дополнительно гамма также) постепенно корректируется. Постепенная корректировка определяется Вами, но, работы 120 минут для меня. Сохранять корректировки незначимым набором интервал сна между корректировками. Где угодно между 15 и 60 секундами является, вероятно, лучшим, и значение по умолчанию равняется 60.

Привлекательный демон спит много часов, пока переход заката не запускается. Обратно пропорционально к переходу восхода солнца, переход заката постепенно уменьшает яркость экрана (и дополнительно гамма также), таким образом, это непримечательно. 90 минут до заката рекомендуются, но можно установить любой период, который Вы любите.

Во время заката гамма перехода может быть определена для увеличения. Например, Красная гамма может быть определена как 1,0 в течение дня и 1.2 в течение ночи для сокращения чрезмерного напряжения зрения. Синяя гамма в свою очередь может быть определена как 1,0 в течение дня и.8 в течение ночи, таким образом, она уменьшится вместо этого.

Уменьшать ресурсы, привлекательные сны весь период между переходами восхода солнца и закатом. Существуют исключения времени, когда возобновление от приостанавливает или заменяющий внешние мониторы в горячем режиме. Это зависит от того, где Вы живете и сезон года, но, средний сон составит 12 часов.

Можно загрузить Привлекательный с GitHub


Исходное сообщение с 2017

Введение

Это решение для удара без потребности установить дополнительные программы. Это требует Интернет-соединения (при чтении этого, у Вас есть один) автоматически получать восход солнца и времена заката каждый день. Это обеспечивает удобный для пользователя экран конфигурации. Это запускает автоматически с cron и не требует никакого взаимодействия с пользователем.

Этот ответ разделен на несколько частей

  • Автоматически получите восход солнца и времена заката каждый день с cron
  • Настройте подборы яркости и время перехода
  • Основной сценарий для корректировки яркости на основе времени суток
  • Запустите автоматическую яркость дисплея автоматически каждая начальная загрузка с cron
  • Мгновенная/прозрачная настройка яркости, возобновляющаяся от, приостанавливает
  • Сводка

Автоматически получите восход солнца и времена заката каждый день с кроном

Существует много веб-сайтов для создания отчетов о восходе солнца и времена заката для местоположения. Это использование сценария (https://www.timeanddate.com/), который был известным сайтом в течение долгого времени.

С sudo полномочиями редактируют файл /usr/local/bin/sun-hours и вставьте это:

#!/bin/bash

# Called daily from /etc/cron.daily/sun-hours
while true; do

### "-q"= quiet, "-O-" pipe output
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunrise Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunrise
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunset Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunset

## If network is down files will have one byte size
size1=$(wc -c < /tmp/sunrise)
size2=$(wc -c < /tmp/sunset)

if [ $size1 -gt 1 ] && [ $size2 -gt 1 ] ; then
    cp /tmp/sunrise /usr/local/bin/sunrise
    cp /tmp/sunset  /usr/local/bin/sunset
    chmod 666 /usr/local/bin/sunrise
    chmod 666 /usr/local/bin/sunset
    rm /tmp/sunrise
    rm /tmp/sunset
    exit 0
else
    logger "/etc/cron.daily/sun-hours: Network is down. Waiting 5 minutes to try again."
    sleep 300
fi

done

Прежде, чем сохранить сценарий заменяют два случаев /canada/edmonton с Вашей собственной страной и городом. Посетите сайт www.timeanddate.com получить точное имя или число. Например, "Париж, США" имеют десятки имен, таким образом, они будут содержать число такой как /worldclock/@5205082 для "Парижа, PA США".

Используйте крон для запущения скрипта часов солнца каждый день

С sudo полномочиями редактируют файл /etc/cron.daily/sun-hours и вставьте это:

#!/bin/sh
#
# Each day /etc/cron.daily/sun-hours will get sunrise and sunset times.

sleep 60 # give time for network to come up.
/usr/local/bin/sun-hours

Mark оба файла как исполняемый файл с sudo chmod a+x ___/sun-hours где "___" является каталогом для каждого файла.

Используйте Носатый для контроля восхода солнца / изменения времени заката каждый день

Носатый популярный инструмент для контроля Вашей системы. Вот команды для него для отображения восхода солнца, заката и подбора яркости:

${color orange}${voffset 2}${hr 1}
${color}${goto 5}Day: ${color green}${execpi 300 cat /usr/local/bin/sunrise}  ${color}Night: ${color green}${execpi 300 cat /usr/local/bin/sunset}  ${color}Level: ${color green}${execpi 10 cat cat /sys/class/backlight/intel_backlight/brightness}
${color orange}${voffset 2}${hr 1}

Это - то, на что это похоже:

display-auto-brightness conky

Примечание: этот Носатый код использование intel_backlight который необходимо изменить в зависимости от адаптера дисплея, как описано в разделах ниже.

Настройте подборы яркости и время перехода

Вы не хотите, чтобы Ваш дисплей изменился на максимальную яркость на восходе солнца и полный полумрак на закате. Переходный период необходим. Дополнительно конфигурационный файл требуется, чтобы записывать переменные для максимальной яркости и полный тусклый. Это - экран конфигурации:

display-auto-brightness-config

Экран создается с помощью стандарта zenity команда, и существующие значения как таковые показывают в маркировках со" (значением)" тег, и Вы вводите новые значения в случае необходимости. Иначе существующие файлы сохранены, когда новые значения являются пробелом.

Замена intel_backlight с Вашим драйвером дисплея, если отличающийся. Узнать Ваше использование имени: ls /sys/class/backlight/*/brightness.

Используя sudo полномочия создают файл /usr/local/bin/auto-brightness-config и вставка в этом коде:

#!/bin/bash

# Read hidden configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Display Auto Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write hidden configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > /usr/local/bin/.auto-brightness-config

Mark файл как исполняемое использование:

chmod a+x /usr/local/bin/auto-brightness-config

Основная программа display-auto-brightness

Используя sudo полномочия создают файл /usr/local/bin/display-auto-brightness и вставка в этом коде:

#!/bin/bash

# NAME: display-auto-brightness
# PATH: /usr/local/bin
# DESC: Set display brightness based on min/max values, sun rise/set time
#       and transition minutes.
# CALL: Called from cron on system startup with @reboot option.
# DATE: Feb 17, 2017. Modified: Dec 2, 2017.

# NOTE: Only sleep for 1 minute to make display brightness changes gradual.
#       Configuration file can change any time so variables reread when waking.
#       The file is maintained by /usr/local/bin/auto-brightness-config script.

#       Sunrise and sunset time obtained from www.dateandtime.com using
#       /usr/local/bin/sun-hours script. The script is called from cron using
#       /etc/cron.daily/cron-daily-sun-hours. Variables stored in am/pm format
#       in /usr/local/bin/sunrise and /usr/local/bin/sunset.

#       When suspending at 6 am it might be dark with setting at 300. When 
#       resuming at 4:30pm it might be full sun and setting needs to be 2000.
#       It will take between 1 and 59 seconds to adjust screen brightness with
#       sudden jump in brightness. To correct this create kill sleep command
#       during suspend with /lib/systemd/system-sleep/display-auto-brightness
#       script.

# TODO: Add support for external monitors connected via HDMI / DisplayPort.
#       xrandr --output HDMI-0  --brightness .799
#       xrandr --output DP-1-1  --brightness 1.15

if [[ $(id -u) != 0 ]]; then # root powers needed to call this script
    echo display-auto-brightness must be called with sudo powers
    exit 1
fi

# global variable
LastSetting=""

function set-and-sleep {
    if [[ "$1" != "$LastSetting" ]]; then
        sudo sh -c "echo $1 | sudo tee $backlight"
        echo "$1" > "/tmp/display-current-brightness"
        LastSetting="$1"
    fi
    sleep 60
}  

re='^[0-9]+$'   # regex for valid numbers

function calc-level-and-sleep {
    # Parms $1 = number of minutes for total transition
    #       $2 = number of seconds into transition

    secTotal=$(( $1 * 60 )) # Convert total transition minutes to seconds
    Adjust=$( bc <<< "scale=6; $transition_spread * ( $2 / $secTotal )" )
    Adjust=$( echo $Adjust | cut -f1 -d"." ) # Truncate number to integer

    if ! [[ $Adjust =~ $re ]] ; then
        Adjust=0   # When we get to last minute $Adjust can be non-numeric
    fi

    calc_bright=$(( $min_bright + $Adjust ))
    set-and-sleep "$calc_bright"
}


while true ; do

    # Although variables change once a day it could be weeks between reboots.
    sunrise=$(cat /usr/local/bin/sunrise)
    sunset=$(cat /usr/local/bin/sunset)

    # Read hidden configuration file with entries separated by " " into array
    IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config
    backlight="/sys/class/backlight/${CfgArr[0]}/brightness"
    max_bright="${CfgArr[1]}"
    after_sunrise="${CfgArr[2]}"
    min_bright="${CfgArr[3]}"
    before_sunset="${CfgArr[4]}"

    # Current seconds
    secNow=$(date +"%s")
    secSunrise=$(date --date="$sunrise today" +%s)
    secSunset=$(date --date="$sunset today" +%s)

    # Is it night time?
    if [ "$secNow" -gt "$secSunset" ] || [ "$secNow" -lt "$secSunrise" ]; then
        # MINIMUN: after sunset or before sunrise nightime setting
        set-and-sleep "$min_bright"
        continue
    fi

    # We're somewhere between sunrise and sunset
    secMaxCutoff=$(( $secSunrise + ( $after_sunrise * 60 ) ))
    secMinStart=$((  $secSunset  - ( $before_sunset * 60 ) ))

    # Is it full bright day time?
    if [ "$secNow" -gt "$secMaxCutoff" ] && [ "$secNow" -lt "$secMinStart" ]; then
        # MAXIMUN: after sunrise transition AND before nightime transition
        set-and-sleep "$max_bright"
        continue
    fi

    # Daytime - nightime = transition brightness levels
    transition_spread=$(( $max_bright - $min_bright ))

    # Are we between sunrise and full brightness?
    if [ "$secNow" -gt "$secSunrise" ] && [ "$secNow" -lt "$secMaxCutoff" ]; then
        # Current time - Sunrise = progress through transition
        secPast=$(( $secNow - $secSunrise ))
        calc-level-and-sleep $after_sunrise $secPast
        continue
    fi

    # Are we between beginning to dim and sunset (full dim)?
    if [ "$secNow" -gt "$secMinStart" ] && [ "$secNow" -lt "$secSunset" ]; then
        # Sunset - Current time = progress through transition
        secBefore=$(( $secSunset - $secNow ))
        calc-level-and-sleep $before_sunset $secBefore
        continue
    fi

    # At this stage brightness was set with manual override outside this program
    # or exactly at a testpoint, then it will change next minute so no big deal.
    sleep 60 # reset brightness once / minute.

done # End of forever loop

Mark файл как исполняемое использование:

chmod a+x /usr/local/bin/display-auto-brightness

Примечание: Неудачно пересмотренный 26 августа 2017 для исправления ошибки, где программа остановилась бы, когда последний уровень яркости был равен минимальной или максимальной яркости и значению корректировки текущей минуты, пробел (нуль). Успешно зафиксированный 2 декабря 2017, но не опубликованный до 17 февраля 2018. Ooops!

Запустите автоматическую яркость дисплея автоматически каждая начальная загрузка с cron

Крон используется для запущения главного приложения каждая начальная загрузка. Создайте файл /etc/cron.d/display-auto-brightness с sudo полномочиями и копией в этом:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/display-auto-brightness

Мгновенная настройка яркости, возобновляющаяся от, приостанавливает

Можно приостановить компьютер в 6:00, когда это перед повышениями солнца и установкой в 300. Можно возобновить его в 16:00, когда солнце ярко, и установка должна быть 2000, но необходимо ожидать 1 - 59 секунд display-auto-brightness сбрасывать дисплей. То, когда дисплей действительно сбрасывает изменение, поразительно. Решить этот a systemd сценарий необходим. Создайте файл /lib/systemd/system-sleep/display-auto-brightness содержа:

#!/bin/sh

# NAME: display-auto-brightness
# PATH: /lib/systemd/system-sleep/
# DESC: Restart display brightness when resuming from suspend
# CALL: Automatically called when system goes to sleep and wakes up
# DATE: August 2017. Modified: June 10, 2018.

# NOTE: Gives instant display brightness adjustment instead of waiting 1 to 59 seconds.

logger -t "logger -t "test" "\$0=$0, \$1=$1, \$2=$2" test" "\$0=$0, \$1=$1, \$2=$2"

case $1/$2 in
  pre/*)
    echo "/lib/systemd/system-sleep/display-auto-brightness: Going to $2..."
    ;;
  post/*)
    # March 28, 2018 On AW17R3 this script runs too fast
    sleep 2

    echo "/lib/systemd/system-sleep/display-auto-brightness: Resuming from $2..."

    # Find running tree processes containing "display-auto" AND "sleep"
    ProgramTree=$(pstree -g -p | grep display-auto | grep sleep)
    # echo's below will print in /var/log/syslog. Comment out with # to suppress
    echo "pstree -g -p | grep display-auto | grep sleep"
    echo "============================================="
    echo "$ProgramTree"

    # extract sleep program ID within `pstree`. eg we would want "16621" below:
    # |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(16621,1308)
    pID=$(echo "$ProgramTree" | cut -f 6 -d '(' )
    pID=$(echo "$pID" | cut -f1 -d",")

    kill $pID  # kill sleep command forcing screen brightness to adjust immediately
    rm /tmp/display-current-brightness
    echo "display-auto-brightness: sleep pID: '$pID' has been killed."
    ;;
esac

Mark файл как исполняемое использование:

chmod a+x /lib/systemd/system-sleep/display-auto-brightness

Сводка

Отобразитесь текущий уровень яркости является systray

В дополнение к Носатому примеру, представленному ранее, индикатор-sysmonitor, можно отобразить текущую яркость в systray через удар:

display-auto-brightness systray

В этом systray примере яркость установлена в 418 и это - приблизительно 20 минут до заката. На закате значение будет 250, и дневная максимальная яркость является 1200. На этой машине intel_backlight=4882 возможен, но, если Вы в закрытом помещении с занавесками, открываются, экран похож пристален на солнце.

systray индикатор является установкой с помощью этого кода:

#!/bin/bash

if [ -f ~/.lock-screen-timer-remaining ]; then
    text-spinner
    Spinner=$(cat ~/.last-text-spinner) # read last text spinner used
    Minutes=$(cat ~/.lock-screen-timer-remaining)
    systray=" $Spinner Lock screen in: $Minutes"
else
    systray=" Lock screen: OFF"
fi

if [ -f /tmp/display-current-brightness ]; then
    Brightness=$(cat /tmp/display-current-brightness)
    systray="$systray Brightness: $Brightness"
else
    systray="$systray Brightness: OFF"
fi

echo "$systray" # sysmon-indidicator will put echo string into systray for us.

exit 0

Это Вопросы и ответы (Bash может отобразиться в systray как индикатор приложения?) описывает, как установить индикатор-sysmonitor.

Будущие улучшения

  • Миграция сценариев удара для этого ответа GitHub
  • Добавление поддержки использования внешних мониторов xrandr
  • Добавление поддержки большего количества красного/меньшего количества синего использования xrandr
7
ответ дан 23 November 2019 в 04:33

Я только что написал программу, которая почти делает то, что вы ищете. Он изменяет яркость экрана на основе изображений, снятых вашей веб-камерой, для получения окружающей яркости. Вы можете выбрать интервал для определения яркости и скорости затемнения самостоятельно.

https://github.com/Wandersalamander/Dimmer

3
ответ дан 23 November 2019 в 04:33

Этот сценарий корректирует яркость подсветки дисплея на основе данных изображения веб-камеры. Возможно, это помогает Вам решить свою проблему.

https://github.com/unxed/brightness.sh/blob/master/backlight.sh

0
ответ дан 23 November 2019 в 04:33

Если у Вас нет доступа к Интернету, можно получить использование hdate:

hdate -s -l N50 -L E14 -z2

Вывод:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

- s восход солнца заката

- l-L высота и широта Праги (50°05′N 14°25′E)

- z зональный SELC = + 2

0
ответ дан 23 November 2019 в 04:33

Другие вопросы по тегам:

Похожие вопросы: