Как написать скрипт для "прослушивания" состояния батареи и оповещения меня, когда он выше 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()
Другие вопросы по тегам