web-dev-qa-db-fra.com

Comment écrire un script pour "écouter" l'état de la batterie et m'avertir quand il dépasse 60% ou moins de 40%?

Je souhaite créer un outil qui alerte lorsque la batterie est inférieure à 40% ou supérieure à 60% afin que je puisse démarrer/arrêter la charge en conséquence.

Je sais que certains outils sont en alerte lorsque la batterie est faible, cela ne suffit pas. Y a-t-il un outil qui le fait quand la chauve-souris est haute?

Je voudrais écrire un script - Shell ou python, qui peut le faire. Je connais la commande pour vérifier le statut de la batte:

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

Mais je ne sais pas comment "écouter" la batterie afin que, chaque fois que son statut change, je puisse automatiquement exécuter une action. Un lien vers la documentation sera Nice, un tutoriel encore meilleur.

6
Yekhezkel Yovel


Ok, je pense que je le savais. Vous souhaitez vérifier l'état de la batterie à chaque X intervalle de temps. Il est plus simple de l'exécuter en arrière-plan, dans une boucle while:

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

Et si vous voulez exécuter le script au démarrage, puis toutes les 5 minutes, la construction sera la suivante:

  • Ajoutez une ligne dans /etc/rc.local pour appeler votre script (votre battery_status.sh) + "&" pour le faire sortir.
  • Ajoutez les commandes que vous souhaitez exécuter dans le battery_status.sh à exécuter dans une boucle while (à l'intérieur de battery_status.sh).

Notez que si vous voulez l'exécuter à partir de cron , vous devez définir le chemin complet, car crons'exécute avec un ensemble limité de variables d'environnement.

Exemple

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

Enregistrez ce fichier sous le nom battery_status.sh dans votre emplacement préféré (le mien est le répertoire Homename__) et ajoutez cette ligne dans le fichier /etc/rc.local (dans mon exemple, remplacez simplement votre emplacement battery_status.sh par /home/kasiya/):

sh /home/kasiya/battery_status.sh &

C'est tout. Redémarrez et voyez la magie.

Si vous n'avez pas instell acpiname__, installez-le simplement en utilisant Sudo apt-get install acpi

Un BONUS

Si vous souhaitez exécuter ce script avec un adaptateur secteur, vous n'avez pas besoin d'une variable supplémentaire pour vérifier cette exécution unique. Si votre adaptateur secteur est branché et que la batterie est chargée à plus de 60%, le message "Débranchez votre adaptateur!" S'affiche. jusqu'à ce que vous ne débranchez pas cela. Si alerte vous le dire

enter image description here

débranchez simplement l’adaptateur secteur pour que le message d’alerte ne s’affiche plus jusqu’à ce que votre batterie soit chargée à 40%. Puis un autre message alerte et vous dit

enter image description here

si vous ne débranchez pas l'adaptateur secteur au-dessus de 60% ou ne branchez pas l'adaptateur au-dessous de 40%, le message d'alerte s'affiche toutes les 5 minutes (vous pouvez le régler vous-même dans le code, voir sleep [seconds]) s'affiche et vous le rappellera.

 #!/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
18
αғsнιη

Vous ne pouvez pas écrire de tutoriel pour créer un script . Ce serait semblable à un tutoriel général python, que vous pouvez trouver à de nombreux endroits sur le Web.

Ce que j'ai fait est d'écrire un petit script, avec des commentaires pour expliquer ce que j'ai fait, pour vérifier la charge de la batterie toutes les 10 secondes. Cela pourrait être exagéré. Modifiez la ligne time.sleep(10) pour définir l'intervalle (en secondes). Les commandes peuvent être changées bien sûr, je lui ai fait envoyer une notification telle quelle.

enter image description here

Je lui ai fait exécuter le message, ou quelle que soit la commande que vous lui donniez, une seule exécution par incident. Ainsi, si la charge dépasse 80%, par exemple, la commande ne s'exécute qu'une fois, jusqu'à la prochaine fois qu'elle dépasse les valeurs définies.

Comment utiliser

Le script doit être exécuté en arrière-plan. copiez-le dans un fichier vide, enregistrez-le sous check_battery.py rendez-le exécutable et exécutez-le à la connexion: Dash> Applications de démarrage> Ajouter, ajoutez la commande suivante:

/path/to/check_battery.py

Le script

#!/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()
9
Jacob Vlijm