Как написать сценарий для «прослушивания» состояния батареи и оповестить меня, когда он выше 60% или ниже 40%?

Я хочу сделать инструмент, предупреждающий о том, что батарея ниже 40% или выше 60%, поэтому я могу начать / остановить зарядку соответственно.

Я знаю, что некоторые инструменты предупреждают, когда батарея разряжена, этого недостаточно. Есть ли инструмент, который делает это, когда летучая мышь высока?

Я хотел бы написать скрипт – либо shell, либо python, который может это сделать. Я знаю команду для проверки статуса bat:

upower -i /org/freedesktop/UPower/devices/battery_BAT0 

Но не знаете, как «слушать» аккумулятор, так что всякий раз, когда он меняет статус, я могу автоматически выполнить действие. Ссылка на документы будет приятной, учебник еще лучше.

Хорошо, я думаю, я это знал. Вы хотите проверить состояние батареи в каждый промежуток времени Х. Это самый простой способ запустить его в фоновом режиме, внутри цикла while:

 while true do # Any script or command sleep [number of seconds] done 

И если вы хотите запустить сценарий при запуске и с этого момента каждые 5 минут, то это будет:

  • Добавьте строку в /etc/rc.local чтобы вызвать ваш скрипт (ваш battery_status.sh ) + "&", чтобы он 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}%" else [ $battery_level -le 40 ] 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 & 

Это все. Перезагрузите и увидите волшебство.

Если у вас нет instell 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() 

В итоге я использовал сценарий KasiyA с некоторыми изменениями:

 #!/bin/bash while true do export DISPLAY=:0.0 battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'` if [ $? -eq 0 ]; then if [ $battery_level -ge 55 ]; then notify-send -u critical "Battery charging above 60% (or nearing it). Please unplug your AC adapter!" "Charging: ${battery_level}% " aplay /home/zack/startup/beep-01a.wav fi else if [ $battery_level -le 45 ]; then notify-send -u critical "Battery is lower 40% (or nearing it). Please plug your AC adapter." "Charging: ${battery_level}%" aplay /home/zack/startup/beep-01a.wav fi if [ $battery_level -le 15 ]; then notify-send -u critical "Battery is critically low. System will shut-down in 5 minutes." "Charging: ${battery_level}%" aplay /home/zack/startup/beep-01a.wav sleep 300 on_ac_power if [ $? != 0 ]; then notify-send -u critical "System will shut-down now." "Charging: ${battery_level}%" shutdown -h 10 fi fi fi sleep 300 # 300 seconds or 5 minutes done 

ответ, который первоначально был частью вопроса ОП, был перемещен здесь как CW