Shanx’s House

Randos, photos, et autres trucs

Script d’avertissement de batterie faible

Archlinux + openbox, c’est bien, mais il manque tout de même quelques fonctions de base – notamment une fonction pour gérer le niveau de la batterie. Et au bout de la 10ème fois que mon PC s’est éteint parce que je n’avais pas branché l’alimentation, je me suis dit qu’il serait pas mal que je fasse en sorte d’éviter ça. Après la 20ème fois, l’idée de faire un script s’est imposée. Et lors de la 30ème interruption impromptue, j’ai enfin écrit ce script.

Ce script utilise deux commandes : zenity (dispo dans tous les dépôts) et acpi. Ce paquet n’est pas présent par défaut, mais est dispo dans Community. Voilà son retour :

$ acpi
Battery 0: Charging, 78%, 00:22:17 until charged

Il y a quatre champs. Le premier est l’identifiant de la batterie (donc osef) ; le second, son état (Charging/Discharging : interessant pour éviter l’affichage de l’infobulle alors qu’on vient de brancher le chargeur) ; les deux derniers, le niveau actuel et le temps restant soit avant la fin de la charge, soit avant l’extinction du PC. Voici donc le script (simplissime) qui affiche une belle infobulle lorsque la batterie passe sous la barre des 15% et qu’elle n’est pas branchée au secteur :

EDIT : on m’a fait remarqué que l’infobulle ne faisait que s’afficher si on passait sous les 15%, sans prendre en compte le fait qu’elle a déjà été affichée. Pour corriger ça, voici un nouveau script qui vérifie laprésence du fichier /tmp/tag, qui marque si l’infobulle a déjà été affichée.

niveau=$(acpi | awk -F'[,%] *' '{ print $2}')
remaining=$(acpi | awk -F'[, ] *' '{ print $5}')
state=$(acpi | awk -F'[, ] *' '{ print $3}')

function zen() {
if [[ $state = 'Discharging' ]] 
then
    zenity --notification --window-icon="info" --text="Batterie faible: $niveau % et $remaining restant" --timeout=1
}

if [[ $niveau < 05 ]]
then
    echo teer
    zen

elif [[ $niveau < 65 &&  ! -f /tmp/tag ]]
then
        zen
        touch /tmp/tag

else
    [[ $niveau > 65 && -f /tmp/tag ]] && { rm /tmp/tag ;}
fi

Le script est pleinement fonctionnel, mais nesthib m’a assuré qu’on pouvait faire tenir ça en 5 lignes. Après une bonne séance d’arrachage de cheveux, le résultat final (pas forcément super lisible du coup) :

read state niveau remaining < <(acpi | awk -F'[,% ] *' '{ print $3,$4,$6}')

function zen() {
    [[ $state = 'Discharging' ]] && zenity --notification --window-icon="info" --text="Batterie faible: $niveau % et $remaining restant" --timeout=1
}

[[ $niveau < 05 ]] && { zen ;} || { [[ $niveau < 15 &&  ! -f /tmp/tag ]] && { zen ; touch /tmp/tag ;} || { [[ $niveau > 15 && -f /tmp/tag ]] && { rm /tmp/tag ;} ;} ;}

FIN DE L’EDIT

Ensuite, c’est simple : un petit coup de chmod +x sur le script pour le rendre exécutable, et insertion dans le cron pour qu’il soit lancé automatiquement à intervalles réguliers : crontab -e pour ouvrir crontab, et on ajoute la ligne suivante pour un lancement tout les 5 minutes :

*/5 * * * * DISPLAY=0: /home/user/script.sh

Le DISPLAY=0: est nécessaire pour que cron puisse lancer l’appli graphique qu’est zenity. Le echo 'Batterie OK dans le script et la partie > /home/user/retour.log dans le crontab n’ont pour but que de tester si le script est bien lancé.

Et normalement, l’ordi ne devrait plus s’éteindre à cause d’une batterie vide. ;)