Como escrever um script para “ouvir” o status da bateria e alertar quando estiver acima de 60% ou abaixo de 40%?

5

Eu quero criar uma ferramenta que avise quando a bateria estiver abaixo de 40% ou acima de 60%, para que eu possa iniciar / parar o carregamento de acordo.

Eu conheço algumas ferramentas de alerta quando a bateria está fraca, isso não é suficiente. Existe uma ferramenta que faz isso quando o morcego está alto?

Eu gostaria de escrever um script - shell ou python, que possa fazer isso. Eu sei o comando para verificar o status do morcego:

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

Mas não sei como "ouvir" a bateria para que, sempre que houver alterações de status, eu possa executar uma ação automaticamente. Um link para os documentos será bom, um tutorial ainda melhor.

    
por Yekhezkel Yovel 02.09.2014 / 00:19

2 respostas

16


Ok, eu acho que sabia disso. Você quer verificar o status da bateria em cada intervalo X de tempo. É a maneira mais fácil de executá-lo em segundo plano, dentro de um loop while:

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

E se você quiser executar o script na inicialização e, a partir de então, a cada 5 minutos, a construção será:

  • Adicione uma linha em /etc/rc.local para chamar seu script (seu battery_status.sh ) + "& amp;" para fazê-lo sair.
  • Adicione os comandos que você deseja executar no battery_status.sh para executar em um loop while (dentro de battery_status.sh).

Observe que, se você quiser executá-lo a partir de cron , você precisa definir o caminho completo, pois cron é executado com um conjunto limitado de variáveis de ambiente.

Exemplo

#!/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

Salve este arquivo com o nome battery_status.sh em seu local favorito (o meu é Home directory) e adicione esta linha no arquivo /etc/rc.local (no meu exemplo, apenas substitua seu local battery_status.sh por /home/kasiya/ ):

sh /home/kasiya/battery_status.sh &

Isso é tudo. Reinicie e veja a mágica.

Se você não tiver instell acpi , instale isso usando sudo apt-get install acpi

Um BÔNUS

Se você deseja executar esse script como responsável pelo adaptador AC, não é necessário uma variável extra para verificar se ele é executado uma vez. Se o seu adaptador CA estiver conectado e a bateria estiver carregando acima de 60%, ele alertará para "Desconecte o adaptador!" até que você não desligue isso. Se o alerta lhe disser

desligueoadaptadorACevocêveráoalertademensagemnãoaparecernovamenteatéqueacargadasuabateriabaixepara40%.Emseguida,outramensagemavisaeavisa

se você não desconectar o adaptador de CA acima de 60% ou não conectar o adaptador de CA abaixo de 40%, a mensagem de alerta mostrada a cada 5 minutos (você pode ajustar isso no código, ver sleep [seconds] ) Vai te lembrar.

 #!/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
    
por devWeek 02.09.2014 / 01:27
8

Você não pode escrever um tutorial para criar um um script. Isso seria semelhante a um tutorial geral em Python, que você pode encontrar em muitos lugares na Web.

O que fiz foi escrever um pequeno script, com comentários para explicar o que fiz, para verificar a carga da bateria a cada 10 segundos. Isso pode ser exagerado. Altere a linha time.sleep(10) para definir o intervalo (em segundos). Os comandos podem ser alterados é claro, eu fiz o envio de uma notificação como é.

Euexecuteiamensagem,ouqualquercomandoquevocêforneça,sóexecuteumavezporincidente,portanto,seacargaexceder80%,porexemplo,ocomandoseráexecutadoapenasumavez,atéapróximavezqueexcederosvaloresdefinidos.

Comousar

Oscriptdeveserexecutadoemsegundoplano;copie-oemumarquivovazio,salve-ocomocheck_battery.py,torne-oexecutáveleexecute-onologin:Dash>Aplicativosdeinicialização>Adicione,adicioneocomando:

/path/to/check_battery.py

Oscript

#!/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()     
por Jacob Vlijm 02.09.2014 / 08:27