Secara otomatis menyesuaikan kecerahan tampilan berdasarkan matahari terbit dan terbenam

10

Ada pertanyaan dan jawaban serupa di Ask Ubuntu yang menunjukkan solusi ini:

tetapi keduanya membutuhkan entri manual waktu matahari terbit dan terbenam atau mereka hanya menyesuaikan keseimbangan warna dan menambahkan lebih banyak merah di malam hari.

Saya mencari solusi yang secara otomatis mendapatkan waktu matahari terbit dan terbenam setiap hari dan secara fisik menyesuaikan kecerahan tampilan. Selain itu saya ingin efek transisi selama 60 hingga 120 menit jadi saya tidak melihat perubahan tampilan.

Mengkonfigurasi ulang pada hari berawan (redup di luar) atau ketika matahari terjadi di antara dua bangunan berlantai tiga alih-alih atapnya (lebih cerah sebelum matahari terbenam) harus menjadi proses yang cepat dan mudah.

WinEunuuchs2Unix
sumber

Jawaban:

7

Pos Diperbarui dari 2019 - Eyesome

Eyesome adalah skrip bash yang berjalan sebagai deamon dan tidur sebagian besar waktu 24/7. Secara otomatis menyesuaikan kecerahan layar (dan juga gamma opsional) untuk tampilan laptop Anda melalui antarmuka perangkat keras dan hingga dua monitor lain menggunakan kontrol perangkat lunak xrandr.

Saat matahari terbit (waktu secara otomatis diperoleh dari internet setiap hari), kecerahan layar Anda (dan juga gamma opsional) disesuaikan secara bertahap. Penyesuaian bertahap ditentukan oleh Anda tetapi, 120 menit bekerja untuk saya. Agar penyesuaian tidak terlalu mencolok, atur interval tidur di antara penyesuaian. Di mana saja antara 15 dan 60 detik mungkin yang terbaik dan standarnya adalah 60.

Daemon mata-mata tidur berjam-jam sampai transisi matahari terbenam dimulai. Berbanding terbalik dengan transisi matahari terbit, transisi matahari terbenam secara bertahap mengurangi kecerahan layar (dan juga gamma opsional) sehingga tidak terlalu mencolok. Dianjurkan 90 menit sebelum matahari terbenam tetapi Anda dapat mengatur periode apa pun yang Anda suka.

Selama transisi matahari terbenam, gamma dapat didefinisikan meningkat. Misalnya Red gamma dapat didefinisikan sebagai 1.0 pada siang hari dan 1.2 pada malam hari untuk mengurangi ketegangan mata. Gamma biru pada gilirannya dapat didefinisikan sebagai 1,0 pada siang hari dan 0,8 pada malam hari sehingga akan berkurang.

Untuk mengurangi sumber daya, tidur nyenyak sepanjang periode antara transisi matahari terbenam dan matahari terbit. Ada satu kali pengecualian ketika melanjutkan dari menangguhkan atau mencolokkan monitor eksternal. Itu tergantung di mana Anda tinggal dan musim tahun ini tetapi, rata-rata tidur akan menjadi 12 jam.

Anda dapat mengunduh Eyesome dari Github


Pos Asli dari 2017

pengantar

Ini solusi bash tanpa perlu menginstal program tambahan. Dibutuhkan koneksi Internet (jika Anda membaca ini, Anda memilikinya) untuk secara otomatis mendapatkan waktu matahari terbit dan terbenam setiap hari. Ini menyediakan layar konfigurasi yang mudah digunakan. Itu dimulai secara otomatis dengan crondan tidak memerlukan interaksi pengguna.

Jawaban ini dibagi menjadi beberapa bagian

  • Secara otomatis mendapatkan waktu matahari terbit dan terbenam setiap hari cron
  • Konfigurasikan pengaturan kecerahan dan waktu transisi
  • Skrip utama untuk menyesuaikan kecerahan berdasarkan waktu hari
  • Mulai display-auto-brightness secara otomatis setiap boot dengan cron
  • Penyesuaian kecerahan instan / transparan dilanjutkan dari penangguhan
  • Ringkasan

Secara otomatis mendapatkan waktu matahari terbit dan terbenam setiap hari dengan cron

Ada banyak situs web untuk melaporkan waktu matahari terbit dan terbenam untuk lokasi Anda. Skrip ini menggunakan ( https://www.timeanddate.com/ ) yang telah lama menjadi situs terkenal.

Dengan kekuatan sudo, edit file /usr/local/bin/sun-hoursdan tempel ini:

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

Sebelum menyimpan skrip, ganti dua kejadian /canada/edmontondengan negara dan kota Anda sendiri. Kunjungi situs www.timeanddate.comuntuk mendapatkan nama atau nomor yang tepat. Misalnya, "Paris, AS" memiliki lusinan nama sehingga mereka akan berisi nomor seperti /worldclock/@5205082"Paris, PA AS".

Gunakan cron untuk menjalankan skrip sun-jam setiap hari

Dengan kekuatan sudo, edit file /etc/cron.daily/sun-hoursdan tempel ini:

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

Tandai kedua file sebagai file yang dapat dieksekusi dengan sudo chmod a+x ___/sun-hours"___" adalah direktori untuk setiap file.

Gunakan Conky untuk memantau perubahan waktu matahari terbit / terbenam setiap hari

Conky adalah alat yang populer untuk memonitor sistem Anda. Berikut adalah perintah untuk menampilkan pengaturan matahari terbit, terbenam dan kecerahan:

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

Seperti inilah tampilannya:

display-auto-brightness conky

Catatan: Ini menggunakan kode Conky intel_backlightyang perlu Anda ubah tergantung pada adaptor layar Anda seperti yang dijelaskan dalam bagian di bawah ini.

Konfigurasikan pengaturan kecerahan dan waktu transisi

Anda tidak ingin tampilan Anda berubah menjadi kecerahan penuh saat matahari terbit dan redup saat matahari terbenam. Diperlukan periode transisi. Selain itu file konfigurasi diperlukan untuk merekam variabel untuk kecerahan penuh dan redup penuh. Ini adalah layar konfigurasi:

display-auto-brightness-config

Layar dibangun menggunakan perintah standar zenity dan karena itu nilai yang ada ditampilkan dalam label dengan tag "(nilai)" dan Anda memasukkan nilai baru jika diperlukan. Kalau tidak, file yang ada disimpan ketika nilai baru kosong.

Ganti intel_backlightdengan driver tampilan Anda jika berbeda. Untuk mengetahui nama Anda gunakan: ls /sys/class/backlight/*/brightness.

Menggunakan kekuatan sudo buat file /usr/local/bin/auto-brightness-configdan rekatkan dalam kode ini:

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

Tandai file sebagai executable menggunakan:

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

Program utama display-auto-brightness

Menggunakan kekuatan sudo buat file /usr/local/bin/display-auto-brightnessdan rekatkan dalam kode ini:

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

Tandai file sebagai executable menggunakan:

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

CATATAN: Tidak berhasil direvisi 26 Agustus 2017 untuk memperbaiki bug di mana program akan berhenti ketika tingkat kecerahan terakhir sama dengan kecerahan minimum atau maksimum dan nilai penyesuaian menit saat ini kosong (nol). Berhasil memperbaiki 2 Desember 2017 tetapi tidak diterbitkan hingga 17 Februari 2018. Ooops!

Mulai display-auto-brightness secara otomatis setiap boot dengan cron

Cron digunakan untuk memulai aplikasi utama setiap boot. Buat file /etc/cron.d/display-auto-brightnessdengan kekuatan sudo dan salin ini:

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

Penyesuaian kecerahan instan dilanjutkan dari penangguhan

Anda dapat menangguhkan komputer Anda pukul 6 pagi ketika sebelum matahari terbit dan pengaturan Anda pada 300. Anda dapat melanjutkannya pukul 4 sore ketika matahari cerah dan pengaturan harus 2000 tetapi Anda harus menunggu 1-59 detik untuk display-auto-brightnessuntuk atur ulang tampilan. Ketika tampilan diatur ulang, perubahannya dramatis. Untuk mengatasi ini systemddiperlukan sebuah skrip. Buat file yang /lib/systemd/system-sleep/display-auto-brightnessberisi:

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

Tandai file sebagai executable menggunakan:

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

Ringkasan

Tampilan tingkat kecerahan saat ini adalah systray

Selain contoh Conky yang disajikan sebelumnya, indikator-sysmonitor Anda dapat menampilkan kecerahan saat ini di systray melalui bash:

display-auto-brightness systray

Dalam contoh systray ini kecerahan ditetapkan 418dan sekitar 20 menit sebelum matahari terbenam. Saat matahari terbenam nilainya akan 250 dan kecerahan penuh siang hari adalah 1200. Pada mesin ini intel_backlight = 4882 dimungkinkan tetapi, jika Anda berada di dalam ruangan dengan gorden terbuka, layarnya seperti menatap matahari.

Indikator systray diatur menggunakan kode ini:

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

T&J ini ( Bisakah BASH ditampilkan dalam systray sebagai indikator aplikasi? ) Menjelaskan cara mengatur indikator-sysmonitor.

Peningkatan di Masa Depan

  • Migrasi skrip bash untuk jawaban ini ke github
  • Menambahkan dukungan untuk monitor eksternal menggunakan xrandr
  • Menambahkan dukungan untuk lebih banyak menggunakan merah / kurang biru xrandr
WinEunuuchs2Unix
sumber
Posting yang bagus tetapi bisakah Anda membantu saya cara masuk ke layar untuk mengkonfigurasi transisi dll?
Marek Urbanowicz
@MU Terima kasih atas komentar baik Anda. Saya sedang dalam proses pembenahan dokumen dengan penangguhan / Lanjutkan perubahan yang ditulis beberapa bulan lalu. Plus saya akan segera menulis kode hybrid WSL (Windows Subsystem untuk Linux). Saya ingin menyampaikan kekhawatiran Anda ke dalam dokumen baru juga. Apakah Anda mengalami masalah dalam membuat /usr/local/bin/auto-brightness-configskrip? Apakah Anda mengalami kesulitan mengidentifikasi /sys/class/backlight/??????/brightnessnama pengemudi? Saya ingin menjadikan ini utilitas yang bagus dan pertanyaan Anda penting.
WinEunuuchs2Unix
Saya hanya tidak tahu berdasarkan posting Anda bagaimana cara mendapatkan Display Auto Brithness Configuration
Marek Urbanowicz
@MU salin kode di atas untuk /usr/local/bin/auto-brightness-configke /usr/local/bindirektori Anda dalam file bernama auto-brightness-config. Kemudian dari tanda terminal itu dieksekusi dengan chmod a+x /usr/local/bin/auto-brightness-config. Kemudian jalankan skrip dari terminal dengan mengetik /usr/local/bin/auto-brightness-config. Anda dapat mengatur pintasan desktop ke skrip untuk menghindari membuka terminal dan mengetik nama skrip.
WinEunuuchs2Unix
1
@dessert Saya akhirnya menyiapkan halaman github untuk eyesomeinkarnasi berikutnya display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome Ini akan sering diperbarui selama beberapa minggu ke depan dengan dokumentasi dan penyempurnaan antarmuka.
WinEunuuchs2Unix
3

Saya baru saja menulis sebuah program yang hampir melakukan apa yang Anda cari. Ini mengubah kecerahan layar berdasarkan gambar yang diambil oleh webcam Anda untuk mendapatkan kecerahan sekitar. Anda dapat memilih interval untuk mendeteksi kecerahan dan kecepatan peredupan sendiri.

https://github.com/Wandersalamander/Dimmer

pengembara
sumber
1
Kedengarannya seperti ide bagus bagi kebanyakan orang - kecuali kita yang menggunakan selotip di atas webcam ...
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Bahkan untuk orang-orang yang 'peduli' dengan selotip di atas kamera, itu bisa sangat bagus! Anda tidak perlu menutupi webcam dengan selotip hitam untuk membuat hasil tangkapan tidak berguna - selembar kertas putih mencapai efek anonimitas yang hampir sama, dan masih mempertahankan kemampuan kamera untuk mengukur kecerahan ruangan. Bahkan selembar kertas benar-benar dapat memperbaikinya, karena akan mengukur lebih banyak jumlah cahaya yang benar-benar mengenai kamera, yang suaranya kira-kira sama dengan jumlah yang mengenai layar monitor, jika kamera tepat di atasnya. =)
Vinícius M
0

Jika Anda tidak memiliki akses ke Internet, Anda dapat menggunakan hdate:

hdate -s -l N50 -L E14 -z2

Keluaran:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

matahari terbenam matahari terbenam

-L -L Ketinggian dan Lintang Praha (50 ° 05′N 14 ° 25′E)

-z zona SELC = + 2

xerostomus
sumber