2022-11-06 22:08:18 -06:00
#!/bin/bash
2022-06-26 19:22:50 -05:00
2022-07-27 02:16:16 -05:00
# this is a script to set my external monitor's brightness
2023-02-24 11:43:46 -06:00
# to high (70% is my personal preference) or low (40% is my personal preference)
# automatically according to day/night.
2022-07-27 02:16:16 -05:00
# it uses ddcutil to access the monitor's settings and sunwait to know
2022-06-26 19:22:50 -05:00
# if it's day or night. It expects a file in the following format in
# the .config directory (the values should be according to location)
2023-02-24 11:43:46 -06:00
## ~/.config/brightness-by-daylight.conf
## Setup for brightness-by-daylight.sh
2022-06-26 19:22:50 -05:00
# latitude="0.000000N"
# longitude="0.000000E"
2022-07-10 21:56:21 -05:00
# scriptdir=<location-of-this-script>
2022-07-11 23:52:48 -05:00
# high=70
# low=40
2022-06-26 19:22:50 -05:00
2022-07-27 02:16:16 -05:00
# just run this script one manually to set it up to run perpetually (hopefully) using 'at'
# (some distros don't come with 'at' preinstalled, so you might need to install 'at' and enable the 'atd' service.)
2022-06-26 19:22:50 -05:00
2022-07-27 23:45:05 -05:00
# it might also be a good idea to add '<location-of-this-script> scheduler' to your DE's autostart list, or to '.profile' so that it launches on system login
2022-07-27 02:16:16 -05:00
# (sometimes I forget to turn on the monitor when I start my PC, so this is better than having a crontab)
2022-07-07 13:38:22 -05:00
2022-08-01 21:43:35 -05:00
# avoid running two concurrent processes
2022-08-01 21:47:07 -05:00
[ " ${ BRTNESSLOCKER } " != "running" ] && exec env BRTNESSLOCKER = "running" flock -en "/tmp/brightness-by-daylight.lock" " $0 " " $@ " || :
2022-08-01 21:43:35 -05:00
# set location of the config file
2023-02-24 11:43:46 -06:00
[ -z " $XDG_CONFIG_HOME " ] && confdir = " $HOME /.config " || confdir = " $XDG_CONFIG_HOME "
2022-06-26 19:22:50 -05:00
2022-07-27 02:16:16 -05:00
# read from the config file
2023-02-24 11:43:46 -06:00
if [ -f $confdir /brightness-by-daylight.conf ] ; then
source $confdir /brightness-by-daylight.conf
2022-06-26 19:22:50 -05:00
else
2022-07-27 23:46:16 -05:00
echo "No config file found!"
2023-02-24 11:43:46 -06:00
echo "It should be located at [config-dir]/brightness-by-daylight.conf"
2022-06-26 21:53:58 -05:00
exit
2022-06-26 19:22:50 -05:00
fi
2022-07-27 02:16:16 -05:00
# get sun status
2022-07-24 21:03:47 -05:00
sun_status = $( sunwait poll $latitude $longitude )
2022-07-27 02:16:16 -05:00
# check if we want to access the scheduler. If yes, create a schedule using `at`
2022-07-24 21:03:47 -05:00
if [ " $1 " = = "scheduler" ] ; then
2022-07-27 23:45:05 -05:00
# get the timings for twilight events and current time
sunrise_time = $( sunwait report 35.221050N 97.445938W | grep "Daylight:" | awk '{print $4}' )
sunset_time = $( sunwait report 35.221050N 97.445938W | grep "Daylight:" | awk '{print $6}' )
now_time = $( date "+%H:%M" )
# try to figure out if it's twilight right now, then need to adjust sun_status
[ $sunrise_time = = $now_time ] && sun_status = "DAY"
[ $sunset_time = = $now_time ] && sun_status = "NIGHT"
2023-02-24 11:43:46 -06:00
2022-07-27 23:45:05 -05:00
# figure out the time of the next twilight
[ $sun_status = = "DAY" ] && time_next = $sunset_time || time_next = $sunrise_time
# query all `at` tasks
2022-07-24 21:03:47 -05:00
task_list = $( atq | grep $time_next | awk '{print $1}' )
2022-07-27 02:16:16 -05:00
# loop through all `at` entries to see if a task already exists
flag = true
2023-02-24 11:43:46 -06:00
for item in $task_list ; do
2022-07-27 23:45:05 -05:00
[ " $( at -c $item | sed 'x;$!d' ) " = = " $scriptdir /brightness-by-daylight.sh scheduler " ] && flag = false
2022-07-24 21:03:47 -05:00
done
2022-07-27 23:45:05 -05:00
# create the schedule
2023-02-24 11:43:46 -06:00
$flag && at -m $time_next <<< " $scriptdir /brightness-by-daylight.sh scheduler "
2022-07-27 23:45:05 -05:00
fi
# do the brightness adjustment using ddcutil
[ $sun_status = = "DAY" ] && target = $high || target = $low
ddcutil setvcp 10 $target
2023-02-24 11:43:46 -06:00
echo " Monitor brightness set to $target %, since it's $( echo $sun_status | tr '[:upper:]' '[:lower:]' ) time "