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 cron
dan 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-hours
dan 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/edmonton
dengan negara dan kota Anda sendiri. Kunjungi situs www.timeanddate.com
untuk 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-hours
dan 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:
Catatan: Ini menggunakan kode Conky intel_backlight
yang 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:
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_backlight
dengan 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-config
dan 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-brightness
dan 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-brightness
dengan 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-brightness
untuk atur ulang tampilan. Ketika tampilan diatur ulang, perubahannya dramatis. Untuk mengatasi ini systemd
diperlukan sebuah skrip. Buat file yang /lib/systemd/system-sleep/display-auto-brightness
berisi:
#!/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:
Dalam contoh systray ini kecerahan ditetapkan 418
dan 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