Skip to content

Instantly share code, notes, and snippets.

@vwbusguy
Last active March 25, 2025 18:09
Show Gist options
  • Save vwbusguy/02992061b3054e6b1cafe9b94bad500e to your computer and use it in GitHub Desktop.
Save vwbusguy/02992061b3054e6b1cafe9b94bad500e to your computer and use it in GitHub Desktop.
Auto Update for power-profiles-daemon
#!/bin/bash
dbus-monitor --system "type='signal',path='/org/freedesktop/UPower/devices/battery_BAT0',member='PropertiesChanged'" | while read LINE; do
echo ${LINE} | grep battery_BAT0 | grep -q PropertiesChanged
if [ $? -eq 0 ]; then
BATT_STAT=$(dbus-send --print-reply=literal --system --dest=org.freedesktop.UPower /org/freedesktop/UPower/devices/battery_BAT0 org.freedesktop.DBus.Properties.Get string:org.freedesktop.UPower.Device string:State | awk '{ print $3; }')
if [ $BATT_STAT -eq 1 ] || [ $BATT_STAT -eq 4 ]; then
LEVEL=$(tuned-adm list | grep -q throughput-performance && echo "throughput-performance" || echo "balanced")
elif [ $BATT_STAT -eq 5 ]; then
LEVEL="balanced"
else
LEVEL="powersave"
fi
if [[ "$(tuned-adm active | sed 's,.*: ,,')" != "$LEVEL" ]] ; then
echo "Changing power level to ${LEVEL}"
tuned-adm profile $LEVEL
[[ $? -ne 0 ]] && echo "Could not change power level to ${LEVEL}!"
fi
fi
done
@winstonrc
Copy link

Where do you place this script?

@vwbusguy
Copy link
Author

/usr/local/bin would be a good place, then have systemd call it from there via service. It logs to the system log that way.

@vwbusguy
Copy link
Author

vwbusguy commented Sep 12, 2023

Assuming the script is executable in /usr/local/bin, here's a working systemd service file for it:

[Unit]
Description=Automatically Adjust Power Profile
After=upower.service

[Service]
Type=simple
ExecStart=/usr/local/bin/auto_profile

[Install]
WantedBy=multi-user.target

Put that in /etc/systemd/system/auto-power-profile.service then sudo systemctl daemon-reload && sudo systemctl enable --now auto-power-profile

From there, logs for it should show up in journald whenever you have a power status change and it should persist automatically on reboots.

@Shuddown
Copy link

Shuddown commented Mar 3, 2025

Just for any new users, the path referred to by ExecStart should be the name of the bash file, so if you named it "auto-profile-update.sh" (as stated at the top), then it should be /usr/local/bin/auto-profile-update.sh .

Also, make sure to give auto-profile-update.sh (or whatever you've called it) executable permissions by running the command
chmod a+x <file-name-here.sh> in /usr/local/bin

@vwbusguy
Copy link
Author

vwbusguy commented Mar 10, 2025

Thanks for that. I should note that this script is probably no longer useful For Fedora users as of Fedora 41 since Fedora has since moved to upower by default.

@vwbusguy
Copy link
Author

vwbusguy commented Mar 25, 2025

I just updated this to work for Fedora 41 via tuned. Use the previous version if you're on Fedora 40 or otherwise using the powerprofiles daemon. I also updated the name to match the systemd service example. It'll also spam the logs less since it won't output anything if the level isn't changing now.

Note that tuned also has a "recommended" and "auto_profile" mode already, so you might consider just using the existing tuned methods. If you specifically want these modes based on the battery/charging status, then this script should still be useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment