Battery capacity monitoring: Difference between revisions
Alive4ever (talk | contribs) m →Preparation: Fix a typo |
Alive4ever (talk | contribs) →Preparation: fix fatal error on the script example |
||
Line 34: | Line 34: | ||
local red=red | local red=red | ||
until [ "$countdown" -eq 0 ]; do | until [ "$countdown" -eq 0 ]; do | ||
countdown="$((countdown-1))" && | |||
echo 100 > /sys/class/leds/"$red"/brightness && sleep 1 | echo 100 > /sys/class/leds/"$red"/brightness && sleep 1 | ||
echo 0 > /sys/class/leds/"$red"/brightness | echo 0 > /sys/class/leds/"$red"/brightness |
Revision as of 03:47, 17 February 2018
Introduction
Battery state can be monitored periodically. When the capacity is below certain level, an action can be triggered.
Battery capacity change doesn't trigger udev events, so udev can't be used for this purpose. Monitoring is performed periodically, using crond to perform the job.
Preparation
Create an executable script for action at various capacity level. The example script below will blink the notification light when the battery is at 25 percent and will blink the notification light again when the battery is at 15 percent and shutdown. The script below is for Xiaomi Redmi 1S (xiaomi-armani), so modification of sysfs path is needed for use on another devices.
#!/bin/sh # Replace BATTERY variable with the actual battery device # found under sysfs BATTERY="battery" # Turn off notification leds # Replace the value of leds according to the sysfs entry ledsoff() { local leds="red green blue" for led in $leds; do echo 0 > /sys/class/leds/"$led"/brightness done } # Blink notification leds for 100 times # Replace the red variable with actual red led device # found under sysfs blink() { local countdown=100 local red=red until [ "$countdown" -eq 0 ]; do countdown="$((countdown-1))" && echo 100 > /sys/class/leds/"$red"/brightness && sleep 1 echo 0 > /sys/class/leds/"$red"/brightness done } if [ -d /sys/class/power_supply/"$BATTERY" ]; then CAPACITY="$(cat /sys/class/power_supply/${BATTERY}/capacity)" if [ "$CAPACITY" -lt 25 ]; then logger "Battery capacity is less than 25 percent" ledsoff blink ledsoff fi if [ "$CAPACITY" -lt 15 ]; then logger "Battery capacity is less than 15 percent" ledsoff blink logger "Battery low. Powering off" poweroff fi fi
Place the script above as check_battery_state.sh inside /etc/periodic/2min directory. Create the directory if needed.
# mkdir -p /etc/periodic/2min
Make the script file executable.
# chmod 755 /etc/periodic/2min/check_battery_state.sh
Adding a crontab entry to do the job
A crontab entry is needed to perform the scheduled battery check. Modify root's crontab to do the scheduled task.
# crontab -u root -e
The command will open root's crontab file /var/spool/crontabs/root inside vi text editor.
Note that the busybox crontab command doesn't parse EDITOR environment variable, so if another text editor is pereferred, open the root crontab file directly.
# nano /var/spool/crontabs/root
Add a line to indicate that a new 2 minutes action will be performed.
# min hour day month weekday command */2 * * * * run-parts /etc/periodic/2min
Enabling crond service
To enable crond service so that crontab will be executed, execute the following command.
# rc-update add crond default
The crond service will be started automatically after rebooting.
To start the service immediately, run the following command.
# /etc/init.d/crond start
The crond will execute check_battery_state.sh every 2 minutes and the predefined low battery actions will be performed.