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. ;)