Projects: Automatic Keyboard Backlight for Dell XPS in Linux
My Dell XPS 9380 laptop
Last night I finished a fun mini project as part of Unix Tutorials Projects. I have writted a basic enough script that can be added as root cronjob for automatically controlling keyboard backlight on my Dell XPS 9380.
Bash Script for Keyboard Backlight Control
As I’ve written just a couple of days ago, it’s actually quite easy to turn keyboard backlight on or off on a Dell XPS in Linux (and this probably works with other Dell laptops).
Armed with that knowledge, I’ve written the following script:
#!/bin/bash
WORKDIR=/home/greys/scripts/backlight
LOCKFILE=backlight.kbd
LOGFILE=${WORKDIR}/backlight.log
KBDBACKLIGHT=`cat /sys/devices/platform/dell-laptop/leds/dell::kbd_backlight/brightness`
HOUR=`date +%H`
echo "---------------->" | tee -a $LOGFILE
date | tee -a $LOGFILE
if [ $HOUR -lt 4 -o $HOUR -gt 21 ]; then
echo "HOUR $HOUR is rather late! Must turn on backlight" | tee -a $LOGFILE
BACKLIGHT=3
else
echo "HOUR $HOUR is not too late, must turn off the backlight" | tee -a $LOGFILE
BACKLIGHT=0
fi
if [ $KBDBACKLIGHT -ne $BACKLIGHT ]; then
echo "Current backlight $KBDBACKLIGHT is different from desired backlight $BACKLIGHT" | tee -a $LOGFILE
FILE=`find ${WORKDIR} -mmin -1440 -name ${LOCKFILE}`
echo "FILE: -$FILE-"
if [ -z "$FILE" ]; then
echo "No lock file! Updating keyboard backlight" | tee -a $LOGFILE
echo $BACKLIGHT > /sys/devices/platform/dell-laptop/leds/dell::kbd_backlight/brightness
touch ${WORKDIR}/${LOCKFILE}
else
echo "Lockfile $FILE found, skipping action..." | tee -a $LOGFILE
fi
else
echo "Current backlight $KBDBACKLIGHT is the same as desired... No action needed" | tee -a $LOGFILE
fi
How My Dell Keyboard Backlight Script Works
This is what my script does when you run it as root (it won’t work if you run as regular user):
it determines the WORKDIR (I defined it as /home/greys/scripts/backlight)
it starts writing log file backlight.log in that $WORKDIR
it checks for lock file backlight.kbd in the same $WORKDIR
it confirms current hour and checks if it’s a rather late hour (when it must be dark). For now I’ve set it between 21 (9pm) and 4 (4am, that is)
if checks current keyboard backlight status ($KDBBACKLIGHT variable)
it compares this status to the desired state (based on which hour that is)
if we need to update keyboard backlight setting, we check for lockfile.
If a recent enough file exists, we skip updates
Otherwise, we set the backlight to new value
all actions are added to the $WORKDIR/backlight.log file
Log file looks like this:
greys@xps:~/scripts $ tail backlight/backlight.log
---------------->
Tue May 28 00:10:00 BST 2019
HOUR 00 is rather late! Must turn on backlight
Current backlight 2 is different from desired backlight 3
Lockfile /home/greys/scripts/backlight/backlight.kbd found, skipping action...
---------------->
Tue May 28 00:15:00 BST 2019
HOUR 00 is rather late! Must turn on backlight
Current backlight 2 is different from desired backlight 3
Lockfile /home/greys/scripts/backlight/backlight.kbd found, skipping action...
How To Activate Keyboard Backlight cronjob
I have added this script to the root user’s cronjob. In Ubuntu 19.04 running on my XPS laptop, this is how it was done:
greys@xps:~/scripts $ sudo crontab -e
[sudo] password for greys:
I then added the following line:
_/5 _ \* \* \* /home/greys/scripts/backlight.sh
Depending on where you place similar script, you’ll need to update full path to it from /home/greys/scripts. And then update WORKDIR variable in the script itself.
Keyboard Backlight Unix Tutorial Project Follow Up
Here are just a few things I plan to improve:
see if I can access Ubuntu’s Night Light settings instead of hardcoding hours into the script
fix the timezone – should be IST and not BST for my Dublin, Ireland location
Just for fun, try logging output into one of system journals for journalctl
I'm a principal consultant with Tech Stack Solutions. I help with cloud architectrure, AWS deployments and automated management of Unix/Linux infrastructure. Get in touch!