Dim the Raspberry Pi screen
The new Raspberry display works nice, but the screen is too bright. At night in the kitchen it enlightens the entire room - unnecessarily. Since I'm using the original Raspberry Pi 7" touch display, the brightness can be controlled in /sys/class/backlight/rpi_backlight/brightness. This "file" can hold a value from 0 (display off) to 255 (full bright).
My first idea was to use a light sensor. But the display itself does not have such a sensor, and if I connect one to the Pi, I somehow need to connect the sensor in a way that it can "see" the light in the room. Which means the sensor is clearly visible next to the display.
The next idea is a cron job, which dims the display, depending on the time of the day. A bit brighter over the day, and almost dark in the night. Cron job works fine, but let's make this an exercise in writing more code by using systemd timers. Because why not making it more complicated ...
A "cron job" in systemd needs two files. One is the timer:
[Timer]
OnCalendar=*-- 06..22:10:00
OnBootSec=60
Persistent=false
Unit=brightness-up.service
[Install]
WantedBy=timers.target
This file goes into "/etc/systemd/system/" and the filename needs to end in ".timer". In my case the filename is "brightness-up.timer". Here I run the timer every hour from 6:10 to 22:10. Why at :10, and not at :00? Because there is another cron job which reboots the Pi at 4:00.
The "OnBootSec=60" also runs this timer one minute after the Pi started. However I don't want systemd to trigger this timer when one occasion was missed - hence the "Persistant=false" setting.
Last but not least, the "Unit=" specifies which service should be executed once the timer fires. Which brings me to the second file:
[Unit]
Description=Increase display brightness
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/bin/echo 50 > /sys/class/backlight/rpi_backlight/brightness'
TimeoutStopSec=30
KillMode=none
RemainAfterExit=no
User=root
Group=root
This goes into the filename "brightness-up.service", and the interesting part is "ExecStart". That is the code which will set the brightness for the display. This needs a shell ("/bin/sh"), because systemd itself will not do the redirect for the echo command.
And because things can't be more easy with systemd, I need another set of timer/service combination for dimming the display down. "brightness-down.timer":
[Timer]
OnCalendar=*-- 23,00..05:10:00
Persistent=false
Unit=brightness-up.service
[Install]
WantedBy=timers.target
And "brightness-down.service":
[Unit]
Description=Decrease display brightness
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/bin/echo 15 > /sys/class/backlight/rpi_backlight/brightness'
TimeoutStopSec=30
KillMode=none
RemainAfterExit=no
User=root
Group=root
Now, everything I do with this Raspberry is automated, and I install the Pi using Ansible. Therefore I added the following code to my Playbook:
- name: Copy brightness systemd units and timers
copy:
src: "{{ playbook_dir }}/files/{{ item }}"
dest: "/etc/systemd/system/{{ item }}"
owner: root
group: root
mode: 0644
loop:
- brightness-up.service
- brightness-up.timer
- brightness-down.service
- brightness-down.timer
register: brightness_systemd
- block:
- name: Register brightness-up service
systemd:
daemon_reload: yes
name: brightness-up.timer
enabled: yes
state: restarted
- name: Register brightness-down service
systemd:
daemon_reload: yes
name: brightness-down.timer
enabled: yes
state: restarted
when: brightness_systemd.changed
The first Task uploads all 4 files to "/etc/systemd/system/", and the block only runs when anything changed. In such a case the systemd daemon is reloaded, and the two services are re-registered.
Comments
Display comments as Linear | Threaded