Как написать скрипт для "прослушивания" состояния батареи и оповещения меня, когда он выше 60% или ниже 40%?
Я хочу сделать инструмент, который предупреждает, когда уровень заряда батареи ниже 40% или выше 60%, чтобы я мог начать / остановить зарядку соответственно.
Я знаю, что некоторые инструменты предупреждают, когда батарея разряжена, этого недостаточно. Есть ли инструмент, который делает это, когда летучая мышь высока?
Я хотел бы написать скрипт - либо shell, либо python, который может это сделать. Я знаю команду для проверки статуса летучей мыши:
upower -i /org/freedesktop/UPower/devices/battery_BAT0
Но не знаю, как "прислушиваться" к аккумулятору, чтобы при каждом изменении его состояния я мог автоматически выполнять действие. Ссылка на документы будет хорошей, а учебник - еще лучше.
2 ответа
Хорошо, я думаю, что знал это. Вы хотите проверить состояние батареи в каждом интервале времени X. Проще всего запустить его в фоновом режиме внутри цикла while:
while true
do
# Any script or command
sleep [number of seconds]
done
И если вы хотите запускать скрипт при запуске и с тех пор каждые 5 минут, то конструкция будет выглядеть так:
- Добавить строку в
/etc/rc.local
назвать ваш сценарий (вашbattery_status.sh
) + "&", чтобы выйти. - Добавьте команды, которые вы хотите запустить в
battery_status.sh
выполнить в цикле while (внутри battery_status.sh).
Обратите внимание, что если вы хотите запустить его из cron, вам нужно установить полный путь, так как cron
работает с ограниченным набором переменных среды.
пример
#!/bin/bash
while true
do
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if [ $battery_level -ge 60 ]; then
notify-send "Battery is above 60%!" "Charging: ${battery_level}%"
elif [ $battery_level -le 40 ]; then
notify-send "Battery is lower 40%!" "Charging: ${battery_level}%"
fi
sleep 300 # 300 seconds or 5 minutes
done
Сохраните этот файл по имени battery_status.sh
в вашем любимом месте (мой Home
каталог) и добавьте эту строку в /etc/rc.local
файл (в моем примере просто замените местоположение battery_status.sh на /home/kasiya/
):
sh /home/kasiya/battery_status.sh &
Это все. Перезагрузитесь и увидите магию.
Если у вас нет прививки acpi
Просто установите это, используя sudo apt-get install acpi
Один БОНУС
Если вы хотите запустить сделать этот скрипт ответственным за адаптер переменного тока, вам не нужна дополнительная переменная, чтобы проверить, что он запускается один раз. Если ваш адаптер переменного тока подключен и аккумулятор заряжен выше 60%, он выдаст предупреждение "Отключите адаптер!" пока вы не отключите это. Если оповещение скажет вам
просто отключите адаптер переменного тока, и вы увидите, что сообщение не будет появляться снова, пока заряд аккумулятора не снизится до 40%. Затем еще одно сообщение, предупреждающее и сообщающее вам
если вы не отключаете адаптер переменного тока выше 60% или не подключаете адаптер переменного тока ниже 40%, предупреждающее сообщение отображается каждые 5 минут (вы можете настроить его для себя в коде, см. sleep [seconds]
) покажи и напомню.
#!/bin/bash
while true
do
export DISPLAY=:0.0
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if on_ac_power; then
if [ $battery_level -ge 60 ]; then
notify-send "Battery charging above 60%. Please unplug your AC adapter!" "Charging: ${battery_level}% "
sleep 20
if on_ac_power; then
gnome-screensaver-command -l ## lock the screen if you don't unplug AC adapter after 20 seconds
fi
fi
else
if [ $battery_level -le 40 ]; then
notify-send "Battery is lower 40%. Need to charging! Please plug your AC adapter." "Charging: ${battery_level}%"
sleep 20
if ! on_ac_power; then
gnome-screensaver-command -l ## lock the screen if you don't plug AC adapter after 20 seconds
fi
fi
fi
sleep 300 # 300 seconds or 5 minutes
done
Вы не можете написать учебник для создания одного сценария. Это было бы похоже на общее руководство по Python, которое вы можете найти во многих местах в Интернете.
Я написал небольшой скрипт с комментариями, чтобы объяснить, что я делал, чтобы проверять заряд батареи каждые 10 секунд. Это может быть преувеличено. Изменить линию time.sleep(10)
установить интервал (в секундах). Команды могут быть изменены, конечно, я сделал это отправить уведомление как есть.
Я сделал так, чтобы он запускал сообщение или любую другую команду, которую вы ему давали, только один раз для каждого инцидента, поэтому, если заряд превышает 80%, например, команда выполняется только один раз, пока в следующий раз она не превысит определенные значения.
Как пользоваться
Скрипт предназначен для запуска в фоновом режиме; скопируйте его в пустой файл, сохраните как check_battery.py
сделайте его исполняемым и запустите его при входе в систему: Dash > Startup Applications > Add, добавьте команду:
/path/to/check_battery.py
Сценарий
#!/usr/bin/env python3
import subprocess
import time
def read_status():
"""
This function reads the output of your command, finds the line with
'percentage' (line 17, where first line = 0) and reads the figure
"""
command = "upower -i $(upower -e | grep BAT) | grep --color=never -E percentage|xargs|cut -d' ' -f2|sed s/%//"
get_batterydata = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
return get_batterydata.communicate()[0].decode("utf-8").replace("\n", "")
def take_action():
"""
When the charge is over 60% or below 40%, I assume the action does
not have to be repeated every 10 seconds. As it is, it only runs
1 time if charge exceeds the values. Then only if it exceeds the
limit again.
"""
# the two commands to run if charged over 80% or below 60%
command_above = "notify-send 'charged over 80'%"
command_below = "notify-send 'charged below 80%'"
times = 0
while True:
charge = int(read_status())
if charge > 60:
if times == 0:
subprocess.Popen(["/bin/bash", "-c", command_above])
times = 1
elif charge < 40:
if times == 0:
subprocess.Popen(["/bin/bash", "-c", command_below])
times = 1
else:
times = 0
time.sleep(10)
take_action()