Create AC target (/etc/systemd/system/ac.target
):
[Unit]
Description=On AC power
DefaultDependencies=no
StopWhenUnneeded=yes
Create battery target (/etc/systemd/system/battery.target
):
[Unit]
Description=On battery power
DefaultDependencies=no
StopWhenUnneeded=yes
Create services that depend on that targets.
For battery (/etc/systemd/system/powersave.service
):
[Unit]
Description=Laptop battery savings
[Service]
Type=oneshot
ExecStart=/usr/local/bin/powersave
[Install]
WantedBy=battery.target
For AC (/etc/systemd/system/powerfull.service
):
[Unit]
Description=Laptop battery savings
[Service]
Type=oneshot
ExecStart=/usr/local/bin/powerfull
[Install]
WantedBy=ac.target
Enable services:
systemctl enable powerfull
systemctl enable powersave
Now it's time to create scripts run by services.
For powersave service (/usr/local/bin/powersave
):
#!/bin/bash
logger 'Running powersave script...'
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/power/control'
echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host3/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host4/link_power_management_policy';
echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';
prime-select intel
echo 13080 > /sys/class/backlight/intel_backlight/brightness
You can tune these actions running powertop
, it has a very interesting "Tunables" tab with plenty of optimization suggestions.
For powerfull (/usr/local/bin/powerfull
):
#!/bin/bash
logger 'Running powerfull script...'
echo 84360 > /sys/class/backlight/intel_backlight/brightness
Give execution permissions to scripts (chmod +x ....
)
When AC cable status changes (plugged, unplugged) make udev run some commands. Create /etc/udev/rules.d/99-powertargets.rules
with these contents:
SUBSYSTEM=="power_supply", KERNEL=="ADP1", ATTR{online}=="0", RUN+="/usr/bin/systemctl start battery.target"
SUBSYSTEM=="power_supply", KERNEL=="ADP1", ATTR{online}=="1", RUN+="/usr/bin/systemctl start ac.target"
ADP1
is the powersupply name. You can find this name doing:
udevadm monitor --environment
Now you can reload udev rules:
udevadm control --reload-rules
You can test with this:
sudo udevadm test /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:00/ACPI0003:00/power_supply/ADP1