web-dev-qa-db-fra.com

Comment surveiller l'état de la batterie et la notification contextuelle?

Essentiellement, je voudrais ce commentaire dans une réponse fonctionnelle.

Je sais comment extraire le pourcentage de batterie de Comment vérifier l'état de la batterie à l'aide d'un terminal? :

upower -i $(upower -e | grep BAT) | grep --color=never -E percentage|xargs|cut -d' ' -f2|sed s/%//

Et comment faire apparaître une notification de base:

notify-send "battery low"

Mais comment puis-je configurer un script (bash?) Pour surveiller en permanence la sortie et envoyer une notification selon ce pseudo-code:

si battery_status < 10% alors notify-send "battery low" et mettre mon système en état de veille Sudo pm-suspend

4
landroni

Première étape: rendre pm-suspend accessible à tous les utilisateurs, aucun mot de passe n’est demandé

Faites Sudo visudo et ajoutez cette ligne à la fin du fichier: yourusername ALL=NOPASSWD: /usr/sbin/pm-suspend

Source: Comment exécuter des commandes Sudo spécifiques sans mot de passe?

Étape 2: création du fichier batwatch.desktop:

C'est le fichier qui lancera automatiquement le script de surveillance. Le fichier doit être stocké dans le dossier $HOME/.config/autostart/.

[Desktop Entry]
Type=Application
Exec=/home/serg/bin/batwatch.sh
Hidden=false
NoDisplay=false
Name=Battery Monitor Script

Notez que le script se trouve dans mon dossier /home/serg/bin. Vous pouvez utiliser le dossier de votre choix, mais pour des raisons de standards, il serait préférable d’utiliser/usr/bin ou/home/username/bin.

Source: Comment exécuter un script au démarrage

Etape 3: créez le script actuel, enregistrez-le au même emplacement qu'Exec = line .

Voici le script actuel. Remarquez, j'utilise bash ici, mais cela devrait également fonctionner avec korn Shell. J'ai ajouté quelques commentaires, alors lisez ceux-ci pour comprendre ce que le script fait exactement

#!/bin/bash

# Check if the battery is connected
if [ -e /sys/class/power_supply/BAT1 ]; then

    # this line is for debugging mostly. Could be removed
    #notify-send --icon=info "STARTED MONITORING BATERY"
    zenity --warning --text "STARTED MONITORING BATERY"

    while true;do   
            # Get the capacity
            CAPACITY=$( cat /sys/class/power_supply/BAT1/uevent | grep -i capacity | cut -d'=' -f2 )

            case $CAPACITY in
            # do stuff when we hit 11 % mark
            [0-9]|11)
                # send warning and suspend only if battery is discharging
                # i.e., no charger connected
                STATUS=$(  cat /sys/class/power_supply/BAT1/uevent | grep -i status | cut -d'=' -f2 )
                 if [ $(echo $STATUS) == "Discharging" ]; then

                    #notify-send --urgency=critical --icon=dialog-warning "LOW BATTERY! SUSPENDING IN 30 sec"
                    zenity --warning --text "LOW BATTERY! SUSPENDING IN 30 sec"
                    sleep 30
                    gnome-screensaver-command -l && Sudo pm-suspend
                    break
                 fi
                ;;
            *)
            sleep 1
                continue
                ;;
            esac
    done
fi

Étape 4: redémarrez et testez si le script fonctionne

Pour cela, vous pouvez régler le nombre [0-9]|11) sur la valeur de votre choix, par exemple 65) pour suspendre à 65%. Vous ne pourrez suspendre l’application que si vous n’êtes pas branché à l’alimentation (c’est-à-dire sans charger).

Faites-moi savoir si vous aimez cela, et si cela fonctionne, assurez-vous de vote positif et cliquez sur la coche grise à gauche de ma réponse!

À votre santé !

5

J'avais créé un script similaire pour mon Vaio afin de m'avertir lorsque la batterie est complètement chargée. J'avais utilisé UPOWER pour me fournir les mises à jour sur l'état de la batterie et en extraire la section correspondante. Voici le code:

#!/bin/bash

while true;do 

STATE=$( upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "state:" | cut -b 26- )

if [ $STATE = "fully-charged" ]
then 

zenity --info --text "Battery Full!"
break

fi

done
2
Rubal