โพสต์ล่าสุดจาก 2019 - Eyesome
Eyesome เป็นสคริปต์ทุบตีที่ทำงานเป็นคนเลวทรามและนอนหลับตลอดเวลา 24/7 มันจะปรับความสว่างของหน้าจอโดยอัตโนมัติ (และเป็นทางเลือกแกมม่าเช่นกัน) สำหรับจอแสดงผลแล็ปท็อปของคุณผ่านทางอินเตอร์เฟสฮาร์ดแวร์และอีกสองจอภาพโดยใช้การควบคุมซอฟต์แวร์ของ xrandr
เมื่อพระอาทิตย์ขึ้น (เวลาที่ได้รับโดยอัตโนมัติจากอินเทอร์เน็ตในแต่ละวัน) ความสว่างหน้าจอของคุณ (และแกมมาเป็นทางเลือกด้วย) จะถูกปรับทีละน้อย การปรับแบบค่อยเป็นค่อยไปนั้นถูกกำหนดโดยคุณ แต่ 120 นาทีเหมาะกับฉัน เพื่อให้การปรับไม่สามารถสังเกตได้ให้ตั้งช่วงเวลาสลีประหว่างการปรับ ทุกที่ระหว่าง 15 ถึง 60 วินาทีน่าจะดีที่สุดและค่าเริ่มต้นคือ 60
Eyesome daemon หลับไปหลายชั่วโมงจนกระทั่งพระอาทิตย์ตกดินเริ่มขึ้น การเปลี่ยนพระอาทิตย์ขึ้นการเปลี่ยนพระอาทิตย์ตกจะค่อยๆลดความสว่างของหน้าจอ (และแกมม่าที่เป็นทางเลือกด้วย) ดังนั้นจึงไม่สามารถสังเกตเห็นได้ แนะนำก่อนพระอาทิตย์ตก 90 นาที แต่คุณสามารถกำหนดช่วงเวลาใดก็ได้ตามต้องการ
ในช่วงพระอาทิตย์ตกดินแกมมาอาจถูกกำหนดให้เพิ่มขึ้น ตัวอย่างเช่น Red gamma อาจถูกกำหนดเป็น 1.0 ในระหว่างวันและ 1.2 ในช่วงกลางคืนเพื่อลดอาการปวดตา แกมมาสีฟ้าอาจถูกกำหนดให้เป็น 1.0 ในระหว่างวันและ 0.8 ในช่วงกลางคืนดังนั้นมันจะลดลงแทน
เพื่อลดทรัพยากรดวงตาที่หลับสนิทตลอดช่วงเวลาระหว่างพระอาทิตย์ตกและพระอาทิตย์ขึ้น มีข้อยกเว้นครั้งเดียวเมื่อกลับมาทำงานอีกครั้งจากการหยุดชั่วคราวหรือการเสียบจอภาพภายนอกแบบร้อน ขึ้นอยู่กับว่าคุณอาศัยอยู่ที่ไหนและฤดูใดของปี แต่การนอนเฉลี่ยจะอยู่ที่ 12 ชั่วโมง
คุณสามารถดาวน์โหลดEyesome จาก Github
โพสต์ต้นฉบับจาก 2017
บทนำ
นี่เป็นวิธีทุบตีโดยไม่จำเป็นต้องติดตั้งโปรแกรมเพิ่มเติม มันต้องมีการเชื่อมต่ออินเทอร์เน็ต (ถ้าคุณอ่านข้อความนี้คุณมี) เพื่อรับเวลาพระอาทิตย์ขึ้นและตกโดยอัตโนมัติในแต่ละวัน มันมีหน้าจอการตั้งค่าที่ใช้งานง่าย มันเริ่มต้นขึ้นโดยอัตโนมัติด้วย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มาตรฐานและค่าที่มีอยู่ดังกล่าวจะแสดงในป้ายกำกับที่มีแท็ก "(ค่า)" และคุณจะป้อนค่าใหม่หากจำเป็น มิฉะนั้นไฟล์ที่มีอยู่จะถูกเก็บไว้เมื่อค่าใหม่ว่างเปล่า
แทนที่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
หมายเหตุ:แก้ไขไม่สำเร็จ 26 สิงหาคม 2017 เพื่อแก้ไขข้อผิดพลาดที่โปรแกรมจะหยุดเมื่อระดับความสว่างล่าสุดเท่ากับความสว่างขั้นต่ำหรือความสว่างสูงสุดและค่าการปรับนาทีปัจจุบันว่างเปล่า (ศูนย์) แก้ไขสำเร็จเมื่อวันที่ 2 ธันวาคม 2560 แต่ยังไม่เผยแพร่จนกว่าจะถึงวันที่ 17 กุมภาพันธ์ 2018 อุ๊ย!
เริ่มการแสดงผล - ความสว่างอัตโนมัติโดยอัตโนมัติทุกครั้งที่บู๊ตเครื่อง cron
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
การปรับความสว่างทันทีกลับมาทำงานต่อจากการหยุดชั่วคราว
คุณสามารถระงับคอมพิวเตอร์ของคุณที่ 06:00 เมื่อก่อนดวงอาทิตย์ขึ้นและการตั้งค่าของคุณอยู่ที่ 300 คุณสามารถดำเนินการได้ในเวลา 4 โมงเย็นเมื่อดวงอาทิตย์อยู่ที่สดใสและการตั้งค่าที่ควรจะเป็น 2000 แต่คุณต้องรอ 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 ตัวอย่างที่นำเสนอก่อนหน้านี้ตัวบ่งชี้ sysmonitorคุณสามารถแสดงความสว่างปัจจุบันใน systray ผ่าน bash:
ในตัวอย่าง 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