Ekran parlaklığını gün doğumu ve gün batımına göre otomatik olarak ayarlama


10

Ask Ubuntu'da şu çözümlere işaret eden benzer sorular ve cevaplar vardır :

ancak gün doğumu ve gün batımı zamanlarının manuel olarak girilmesini gerektirir veya sadece renk dengesini ayarlar ve geceleri daha fazla kırmızı ekler.

Her gün gün doğumu ve gün batımı zamanlarını otomatik olarak alan ve ekran parlaklığını fiziksel olarak ayarlayan bir çözüm arıyorum. Ayrıca 60 ila 120 dakikalık bir süre boyunca bir geçiş efekti istiyorum, böylece ekranın değiştiğini fark etmiyorum.

Bulutlu günlerde (dışarıda sönük) veya güneşin çatı üstleri (gün batımından önce daha parlak) yerine iki üç katlı bina arasında ayarlandığında yeniden yapılandırma hızlı ve kolay bir işlem olmalıdır.

Yanıtlar:


7

2019'dan Güncelleme Gönderisi - Eyesome

Eyesome bir deamon olarak çalışan ve çoğu zaman 7/24 uyuyan bir bash betiğidir. Donanım arayüzü ve dizüstü bilgisayar ekranınız için ekran parlaklığını (ve isteğe bağlı olarak gama) otomatik olarak xrandr'ın yazılım kontrolünü kullanarak diğer iki monitöre ayarlar.

Güneş doğarken (saat her gün internetten otomatik olarak alınır), ekran parlaklığınız (ve isteğe bağlı olarak gama da) kademeli olarak ayarlanır. Kademeli ayarlama sizin tarafınızdan tanımlanır, ancak 120 dakika benim için çalışır. Ayarlamaları fark edilmeden tutmak için ayarlamalar arasında bir uyku aralığı ayarlayın. 15 ila 60 saniye arasındaki herhangi bir yer muhtemelen en iyisidir ve varsayılan değer 60'tır.

Göz kamaştırıcı daemon, gün batımı geçişi başlayana kadar saatlerce uyur. Gün doğumu geçişinin tersine, gün batımı geçişi ekran parlaklığını kademeli olarak azaltır (ve isteğe bağlı olarak gama) da farkedilmez. Gün batımından 90 dakika önce önerilir, ancak istediğiniz süreyi ayarlayabilirsiniz.

Gün batımı geçişi sırasında gama artacak şekilde tanımlanabilir. Örneğin, kırmızı gama, göz yorgunluğunu azaltmak için gündüz 1,0 ve gece 1,2 olarak tanımlanabilir. Buna karşılık mavi gama gündüz 1,0 ve gece 0,8 olarak tanımlanabilir, bunun yerine azalır.

Kaynakları azaltmak için, eyeome gün batımı ve gün doğumu geçişleri arasındaki tüm dönemi uyur. Harici monitörleri askıya alma veya çalışırken takmaya devam ederken bir kez istisna vardır. Nerede yaşadığınıza ve yılın mevsimine bağlıdır, ancak ortalama uyku 12 saat olacaktır.

Eyesome'i Github'dan indirebilirsiniz


2017'den Orijinal Gönderi

Giriş

Bu ek programlar yüklemeye gerek kalmadan bash çözümü. Her gün gün doğumu ve gün batımı zamanlarını otomatik olarak almak için (bunu okuyorsanız) bir İnternet bağlantısı gerektirir. Kullanıcı dostu bir yapılandırma ekranı sunar. Otomatik olarak başlar cronve kullanıcı etkileşimi gerektirmez.

Bu cevap birden fazla bölüme ayrılmıştır

  • Her gün otomatik olarak gün doğumu ve gün batımı zamanlarını alın cron
  • Parlaklık ayarlarını ve geçiş süresini yapılandırma
  • Parlaklığı günün saatine göre ayarlayan ana komut dosyası
  • Ekran önyükleme parlaklığını her önyüklemede otomatik olarak başlat cron
  • Askıda kaldığı yerden devam ederek anlık / şeffaf parlaklık ayarı
  • özet

Her gün otomatik olarak gün doğumu ve gün batımı zamanlarını cron ile alın

Konumunuz için gün doğumu ve gün batımı zamanlarını bildirmek için birçok web sitesi vardır. Bu komut dosyası, uzun zamandır iyi bilinen bir site olan ( https://www.timeanddate.com/ ) kullanır .

Sudo powers ile dosyayı düzenleyin /usr/local/bin/sun-hoursve yapıştırın:

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

Betiği kaydetmeden önce, iki tekrarını /canada/edmontonkendi ülkeniz ve şehrinizle değiştirin. www.timeanddate.comTam adı veya numarayı almak için siteyi ziyaret edin . Örneğin, "Paris, ABD" nin onlarca adı vardır, bu nedenle /worldclock/@5205082"Paris, PA ABD" gibi bir sayı içerirler .

Her gün güneş saati komut dosyasını çalıştırmak için cron kullanın

Sudo powers ile dosyayı düzenleyin /etc/cron.daily/sun-hoursve yapıştırın:

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

Her iki dosyayı da yürütülebilir olarak işaretleyin; sudo chmod a+x ___/sun-hoursburada "___" her dosyanın dizinidir.

Her gün gün doğumu / gün batımı zamanı değişikliklerini izlemek için Conky'yi kullanın

Conky , sisteminizi izlemek için popüler bir araçtır. Gün doğumu, gün batımı ve parlaklık ayarını görüntüleme komutları şunlardır:

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

Öyle görünüyor:

display-auto-brightness conky

Not: Bu Conky kodu, intel_backlightaşağıdaki bölümlerde açıklandığı gibi ekran bağdaştırıcınıza bağlı olarak değiştirmeniz gerekenleri kullanır .

Parlaklık ayarlarını ve geçiş süresini yapılandırma

Ekranınızın gün doğarken tam parlaklığa ve gün batımında tam kararmaya geçmesini istemezsiniz. Bir geçiş dönemi gereklidir. Ayrıca değişkenleri tam parlaklık ve tam loş olarak kaydetmek için bir yapılandırma dosyası gerekir. Bu yapılandırma ekranıdır:

Ekran-otomatik parlaklık-config

Ekran standart zenity komutu kullanılarak oluşturulur ve mevcut değerler "(değer)" etiketli etiketlerde gösterilir ve gerekirse yeni değerler girersiniz . Aksi takdirde, yeni değerler boş olduğunda mevcut dosyalar tutulur.

Farklıysa intel_backlightekran sürücünüzle değiştirin . Adın kullanımını öğrenmek için: ls /sys/class/backlight/*/brightness.

Sudo powers kullanarak dosyayı oluşturun /usr/local/bin/auto-brightness-configve bu koda yapıştırın:

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

Aşağıdakileri kullanarak dosyayı yürütülebilir olarak işaretleyin:

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

Ana program display-auto-brightness

Sudo powers kullanarak dosyayı oluşturun /usr/local/bin/display-auto-brightnessve bu koda yapıştırın:

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

Aşağıdakileri kullanarak dosyayı yürütülebilir olarak işaretleyin:

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

NOT: Son parlaklık seviyesi minimum veya maksimum parlaklığa eşit olduğunda ve geçerli dakika ayar değeri boş olduğunda (sıfır) programın duracağı hatayı düzeltmek için 26 Ağustos 2017'de başarısız bir şekilde düzeltildi. 2 Aralık 2017 başarıyla düzeltildi, ancak 17 Şubat 2018 tarihine kadar yayınlanmadı.

Ekran önyükleme parlaklığını her önyüklemede otomatik olarak başlat cron

Her önyüklemede ana uygulamayı başlatmak için Cron kullanılır. Dosyayı /etc/cron.d/display-auto-brightnesssudo power ile oluşturun ve kopyalayın:

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

Askıya alma durumundan devam ederek anında parlaklık ayarı

Bilgisayarınızı güneş doğmadan ve saatiniz 300'den önce saat 6'da askıya alabilirsiniz. Güneşin parlak olduğu ve ayarın 2000 olduğu zaman saat 16: 00'da yeniden başlatabilirsiniz, ancak bunun için 1 ila 59 saniye beklemeniz gerekir display-auto-brightness. ekranı sıfırlayın. Ekran sıfırlandığında değişiklik çarpıcıdır. Bunu çözmek için bir systemdkomut dosyasına ihtiyaç vardır. Şunları /lib/systemd/system-sleep/display-auto-brightnessiçeren dosyayı oluşturun:

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

Aşağıdakileri kullanarak dosyayı yürütülebilir olarak işaretleyin:

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

özet

Ekran mevcut parlaklık seviyesi systray

Daha önce sunulan Conky örneğine ek olarak, gösterge-sysmonitor , sistemde mevcut parlaklığı bash yoluyla görüntüleyebilirsiniz:

display-auto-brightness systray

Bu sistemde örnek parlaklık olarak ayarlanır 418ve gün batımından yaklaşık 20 dakika önce olur. Günbatımında değer 250 olacak ve gündüz tam parlaklık 1200 olacaktır. Bu makinede intel_backlight = 4882 mümkündür, ancak perdeler açıkken iç mekandaysanız, ekran güneşe bakmak gibidir.

Systray göstergesi şu kodu kullanarak ayarlanır:

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

Bu Soru-Cevap ( BASH, uygulama göstergesi olarak sistemde görüntülenebilir mi? ) Gösterge-sismonitörün nasıl kurulacağını açıklar.

Gelecekteki Geliştirmeler

  • Bu komut için bash betiklerini github'a geçirme
  • Harici monitörler için destek ekleme xrandr
  • Kullanarak daha fazla kırmızı / daha az mavi için destek ekleme xrandr

Harika gönderi ama geçişi yapılandırmak için ekrana nasıl girebileceğimi bana yardımcı olabilir misiniz?
Marek Urbanowicz

@MU Nazik yorumunuz için teşekkürler. Birkaç ay önce yazılan Askıya Al / Sürdür değişiklikleriyle dokümanı yenileme sürecindeyim. Ayrıca yakında WSL (Linux için Windows Alt Sistemi) karma kodunu yazacağım. Endişelerinizi yeni dokümanda da ele almak istiyorum. /usr/local/bin/auto-brightness-configKomut dosyasını oluştururken sorun mu yaşıyorsunuz ? /sys/class/backlight/??????/brightnessSürücü adını tanımlamakta sorun mu yaşıyorsunuz ? Bunu harika bir yardımcı program haline getirmek istiyorum ve sorunuz önemlidir.
WinEunuuchs2Unix

Gönderinizi Otomatik Brithness Yapılandırmasını nasıl alacağınıza dair hiçbir fikrim yok
Marek Urbanowicz

@MU için yukarıdaki kodu kopyalayıp /usr/local/bin/auto-brightness-configsenin içine /usr/local/binisimli dosyada dizindeki auto-brightness-config. Sonra terminal ile çalıştırılabilir işaretleyin chmod a+x /usr/local/bin/auto-brightness-config. Ardından komut dosyasını terminalden yazarak çalıştırın /usr/local/bin/auto-brightness-config. Terminal açıp komut dosyası adını yazmaktan kaçınmak için komut dosyasına bir masaüstü kısayolu ayarlayabilirsiniz.
WinEunuuchs2Unix

1
@dessert Sonunda bir eyesomesonraki enkarnasyon için bir github sayfası ayarladımdisplay-auto-brightness : github.com/WinEunuuchs2Unix/eyesome Arabirim belgeleri ve iyileştirmeleri ile önümüzdeki birkaç hafta içinde sık sık güncellenecektir.
WinEunuuchs2Unix

3

Az önce aradığınızı yapan bir program yazdım. Ortam parlaklığını elde etmek için web kameranız tarafından çekilen görüntülere bağlı olarak ekranın parlaklığını değiştirir. Parlaklığı ve karartma hızını kendiniz tespit etmek için aralığı seçebilirsiniz.

https://github.com/Wandersalamander/Dimmer


1
Çoğu insan için harika bir fikir gibi geliyor - web kamerası üzerinde maskeleme bandı olanlarımız hariç ...
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix Kam üzerinde bant ile 'ilgili' olanlar için bile harika olabilir! Yakalamaları işe yaramaz hale getirmek için web kamerasını siyah bantla kaplamanız gerekmez - bir parça beyaz kağıt hemen hemen aynı anonimlik efektine ulaşır ve yine de kameranın odanın parlaklığını ölçme yeteneğini korur. Aslında, kameranın tam üzerinde olması durumunda, kameranın gerçekten vuracağı ışık miktarını daha eşit bir şekilde ölçeceği için kağıt aslında bunu iyileştirebilir. =)
Vinícius M


0

İnternet erişiminiz yoksa, hdate'yi kullanabilirsiniz:

hdate -s -l N50 -L E14 -z2

Çıktı:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s gün batımı gündoğumu

-l -L Prag'ın Yüksekliği ve Enlemi (50 ° 05′N 14 ° 25′E)

-z bölgesi SELC = + 2

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.