일출 및 일몰에 따라 디스플레이 밝기를 자동으로 조정


10

Ask Ubuntu 에는 다음과 같은 솔루션을 가리키는 유사한 질문과 답변 이 있습니다.

그러나 일출 및 일몰 시간을 수동으로 입력하거나 밤에 색상 균형을 조정하고 빨간색을 더 추가하기 만합니다.

매일 자동으로 일출과 일몰 시간을 얻고 디스플레이 밝기를 물리적으로 조정하는 솔루션을 찾고 있습니다. 또한 60 ~ 120 분 동안 전환 효과를 원하므로 디스플레이가 변경되지 않습니다.

흐린 날 (야외에서 어둡게) 또는 태양이 지붕 꼭대기 (두 개의 일몰 전보다 밝음) 대신 두 개의 3 층 건물 사이에 놓일 때 재구성하는 것은 빠르고 쉬운 과정이어야합니다.

답변:


7

2019에서 업데이트 된 게시물-Eyesome

Eyesome은 데몬으로 실행되고 24/7 대부분의 시간을 자고있는 bash 스크립트입니다. 하드웨어 인터페이스와 xrandr의 소프트웨어 제어를 사용하여 최대 2 개의 다른 모니터를 통해 랩탑 디스플레이의 화면 밝기 (및 선택적으로 감마도)를 자동으로 조정합니다.

일출 (매일 인터넷에서 시간이 자동으로 획득 됨)에 따라 화면 밝기 (및 선택적으로 감마도)가 점차 조정됩니다. 점진적인 조정은 귀하가 정의하지만 120 분이 효과적입니다. 조정을 눈에 띄지 않게 유지하려면 조정 사이에 휴면 간격을 설정하십시오. 15 초에서 60 초 사이가 가장 좋으며 기본값은 60입니다.

Eyesome 데몬은 일몰 전환이 시작될 때까지 여러 시간 동안 휴면 상태입니다. 일출 전환과 반대로 일몰 전환은 점차적으로 화면 밝기를 낮추고 (선택적으로 감마도) 눈에 띄지 않습니다. 일몰 90 분 전을 권장하지만 원하는 기간을 설정할 수 있습니다.

일몰 전환 동안 감마는 증가하도록 정의 될 수 있습니다. 예를 들어, 적 감마는 눈의 피로를 줄이기 위해 낮에는 1.0, 밤에는 1.2로 정의 될 수 있습니다. 블루 감마는 낮에는 1.0으로, 밤에는 0.8로 정의되어 대신 감소합니다.

자원을 줄이기 위해 eyeome은 일몰과 일출 전환 사이의 전체 기간을 잠들게합니다. 외부 모니터 일시 중지 또는 핫 플러그에서 다시 시작할 때 한 번 예외가 있습니다. 거주 지역과 계절에 따라 다르지만 평균 수면 시간은 12 시간입니다.

Github에서 Eyesome을 다운로드 할 수 있습니다


2017 년 원본 게시물

소개

추가 프로그램을 설치할 필요가없는 bash 솔루션입니다. 매일 일출과 일몰 시간을 자동으로 얻으려면 인터넷 연결이 필요합니다 (이것을 읽고 있다면). 사용자 친화적 인 구성 화면을 제공합니다. 자동으로 시작되며 cron사용자 상호 작용이 필요하지 않습니다.

이 답변은 여러 부분으로 나뉩니다

  • 매일 일출과 일몰 시간을 자동으로 얻습니다. cron
  • 밝기 설정 및 전환 시간 구성
  • 시간을 기준으로 밝기를 조정하는 기본 스크립트
  • 부팅 할 때마다 자동으로 디스플레이 자동 밝기 시작 cron
  • 일시 중단에서 재개되는 즉시 / 투명한 밝기 조정
  • 요약

cron으로 매일 일출과 일몰 시간을 자동으로 얻습니다.

귀하의 위치에 대한 일출 및 일몰 시간을보고하는 많은 웹 사이트가 있습니다. 이 스크립트는 오랫동안 잘 알려진 사이트 ( https://www.timeanddate.com/ )를 사용합니다 .

sudo powers로 파일을 편집 /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정확한 이름이나 번호를 얻으려면 사이트 를 방문하십시오 . 예를 들어 "Paris, USA"에는 수십 개의 이름이 있으므로 /worldclock/@5205082"Paris, PA USA" 와 같은 숫자가 포함됩니다 .

cron을 사용하여 매일 일요일 시간 스크립트를 실행하십시오.

sudo powers로 파일을 편집 /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

와 실행 파일과 두 파일 모두 표시 sudo chmod a+x ___/sun-hours"___"각 파일에 대한 디렉토리입니다를.

Conky를 사용하여 매일 일출 / 일몰 시간 변경을 모니터링

Conky 는 시스템 모니터링에 널리 사용되는 도구입니다. 일출, 일몰 및 밝기 설정을 표시하는 명령은 다음과 같습니다.

${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}

이것은 다음과 같습니다

디스플레이 자동 밝기

참고 : 이 Conky 코드는 intel_backlight아래 섹션에 설명 된대로 디스플레이 어댑터에 따라 변경해야합니다.

밝기 설정 및 전환 시간 구성

일출에서 디스플레이가 최대 밝기로, 일몰에서 최대 밝기로 변경되는 것을 원하지 않습니다. 전환 기간이 필요합니다. 또한 전체 밝기 및 전체 희미하게 변수를 기록하려면 구성 파일이 필요합니다. 구성 화면입니다.

디스플레이 자동 밝기 구성

화면은 표준 zenity 명령을 사용하여 작성 되며 기존 값은 "(value)"태그가있는 레이블에 표시되며 필요한 경우 새 값을 입력합니다. 그렇지 않으면 새 값이 비어 있으면 기존 파일이 유지됩니다.

intel_backlight다른 경우 디스플레이 드라이버로 교체하십시오 . 이름을 찾으려면 다음을 사용하십시오 ls /sys/class/backlight/*/brightness..

sudo powers를 사용하여 파일을 작성하고 /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

다음을 사용하여 파일을 실행 파일로 표시하십시오.

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

주요 프로그램 display-auto-brightness

sudo powers를 사용하여 파일을 작성하고 /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

다음을 사용하여 파일을 실행 파일로 표시하십시오.

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

참고 : 마지막 밝기 수준이 최소 또는 최대 밝기와 같고 현재 분의 조정 값이 비어있는 경우 프로그램이 중지되는 버그를 수정하기 위해 2017 년 8 월 26 일에 수정하지 못했습니다. 2017 년 12 월 2 일을 성공적으로 수정했지만 2018 년 2 월 17 일까지 게시되지 않았습니다.

부팅 할 때마다 자동으로 디스플레이 자동 밝기 시작 cron

Cron은 부팅 할 때마다 기본 응용 프로그램을 시작하는 데 사용됩니다. /etc/cron.d/display-auto-brightnesssudo powers로 파일 을 작성 하고 다음에 복사하십시오.

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

일시 중단에서 재개되는 즉각적인 밝기 조정

태양이 뜨고 설정이 300 일 때 오전 6시에 컴퓨터를 일시 중지 할 수 있습니다. 태양이 밝고 설정이 2000이어야하지만 오후 4시에서 1 ~ 59 초 정도 기다려야 display-auto-brightness합니다. 디스플레이를 재설정하십시오. 디스플레이가 재설정되면 변경이 극적으로 나타납니다. 이를 해결하려면 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

다음을 사용하여 파일을 실행 파일로 표시하십시오.

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

요약

디스플레이 현재 밝기 수준이 systray입니다

앞의 Conky 예제 외에도 indicator-sysmonitor 는 bash를 통해 시스템 트레이에 현재 밝기를 표시 할 수 있습니다.

디스플레이 자동 밝기 시스템 트레이

이 시스템 트레이 예에서는 밝기가 설정되어 418있으며 일몰 전 약 20 분입니다. 일몰시 값은 250이고 주간 최대 밝기는 1200입니다.이 시스템에서 intel_backlight = 4882는 가능하지만 커튼을 연 상태로 실내에 있으면 화면이 태양을 응시하는 것과 같습니다.

시스템 트레이 표시기는 다음 코드를 사용하여 설정됩니다.

#!/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

이 Q & A (시스템 트레이에 BASH를 응용 프로그램 표시기로 표시 할 수 있습니까? )는 indicator-sysmonitor를 설정하는 방법을 설명합니다.

향후 개선 사항

  • 이 답변에 대한 bash 스크립트를 github으로 마이그레이션
  • 다음을 사용하여 외부 모니터에 대한 지원 추가 xrandr
  • 다음을 사용하여 더 많은 빨강 / 파랑 파랑에 대한 지원 추가 xrandr

좋은 게시물이지만 전환 등을 구성하기 위해 화면에 들어가는 방법을 알려 주시겠습니까?
Marek Urbanowicz

@MU 당신의 친절한 의견에 감사드립니다. 몇 달 전에 작성된 Suspend / Resume 변경 사항으로 문서를 수정하는 중입니다. 또한 WSL (Linux for Windows Subsystem) 하이브리드 코드를 곧 작성할 예정입니다. 새 문서에 대한 귀하의 우려 사항도 해결하고 싶습니다. /usr/local/bin/auto-brightness-config스크립트 작성에 문제가 있습니까? /sys/class/backlight/??????/brightness드라이버 이름을 식별하는 데 문제가 있습니까? 나는 이것을 훌륭한 유틸리티로 만들고 싶습니다. 당신의 질문은 중요합니다.
WinEunuuchs2Unix

나는 얼마나 디스플레이 자동 Brithness 구성 얻는 게시물을 기반으로 아무 생각이 없습니다
마렉 Urbanowicz

@MU는 위의 코드를 라는 파일 /usr/local/bin/auto-brightness-config/usr/local/bin디렉토리에 복사합니다 auto-brightness-config. 그런 다음 터미널에서로 실행 가능으로 표시하십시오 chmod a+x /usr/local/bin/auto-brightness-config. 그런 다음을 입력하여 터미널에서 스크립트를 실행하십시오 /usr/local/bin/auto-brightness-config. 터미널을 열고 스크립트 이름을 입력하지 않도록 스크립트에 대한 바탕 화면 바로 가기를 설정할 수 있습니다.
WinEunuuchs2Unix

1
@dessert 마지막으로 eyesome다음 화신을 위해 github 페이지를 설정했습니다 display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome 인터페이스에 대한 문서화 및 개선으로 향후 몇 주 동안 자주 업데이트됩니다.
WinEunuuchs2Unix

3

방금 당신이 찾고있는 것을 거의하는 프로그램을 작성했습니다. 주변 밝기를 얻기 위해 웹캠으로 촬영 한 이미지에 따라 화면의 밝기를 변경합니다. 밝기와 디밍 속도를 직접 감지 할 간격을 선택할 수 있습니다.

https://github.com/Wandersalamander/Dimmer


1
웹캠을 통해 마스킹 테이프를 사용하는 우리를 제외하고는 대부분의 사람들에게 좋은 생각 인 것 같습니다.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix 캠 위에 테이프가있는 '관심이있는'사람들도 훌륭 할 수 있습니다! 캡처를 쓸모 없게 만들기 위해 검은 테이프로 웹캠을 가리지 않아도됩니다. 백서 한 장은 거의 동일한 익명 효과를 달성하면서도 카메라가 실내의 밝기를 측정 할 수있는 능력을 유지합니다. 실제로 종이는 실제로 카메라에 닿는 빛의 양을 더 균등하게 측정하기 때문에 실제로 용지를 개선 할 수 있습니다.이 소리는 카메라가 바로 위에 있으면 모니터 화면에 닿는 양과 거의 같습니다. =)
Vinícius M


0

인터넷에 액세스 할 수 없으면 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.