[Script] notification batterie basse i3wm

Questions et astuces concernant l'installation et la configuration d'archlinux
Répondre
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

[Script] notification batterie basse i3wm

Message par WHOK-S »

Salut

Hier j'ai pris un peu de temps pour faire un petit script qui lancerais des alertes quand le niveau de batterie serait inférieur à 15% et qui suspend le pc à moins de 5%.
Tout marche le script n'est pas le problème, sauf le "systemctl suspend" qui ne marche pas dans le script. Bref le but est quand même d'avoir un script automatisé qui se lance dès le boot ou l'ouverture de la session.

J'ai donc rajouter une ligne dans ma config' d'I3, exec /usr/bin/script, et avant ça je lance le daemon de notification.
Une fois que j'ai logout et login je regarde les pid des process en cours et je vois bien "/usr/bin/script" avec le pid 499 donc ça devrait marcher. Mais malheureusement ça ne fonctionne pas.

Quand je lance le script en console tout marche parfaitement (sauf le suspend ^^)..

Bref c'est peut-être pas très clair, mais comment m'assurer qu'un script bash soit lancer au démarrage de la session graphique (c'est mieux pour des notification graphique) et qu'il fonctionne vraiment ?

+++

Pour le script ça se passe ici:

#!/bin/bash

LOW_BATTERY="15"
CRITICAL_BATTERY="5"

BATTERY_PATH="/sys/class/power_supply/BAT0/"
CURRENT_BATTERY=$(cat $BATTERY_PATH/capacity)

STOP="0"

function batteryAction {
NOTIFY="0"
if [ "$1" -lt "$LOW_BATTERY" ]; then
notify-send "Battery is low - $CURRENT_BATTERY%"
NOTIFY="1"
elif [ "$1" -lt "$CRITICAL_BATTERY" ]; then
systemctl suspend
fi
}

while true
do
BATTERY_STATUS=$(cat $BATTERY_PATH/status)

if [ "$BATTERY_STATUS" == "Discharging" ] && [ "$STOP" -eq "0" ]; then
batteryAction $CURRENT_BATTERY
if [ "$NOTIFY" -eq "1" ]; then
STOP="1"
fi
elif [ "$BATTERY_STATUS" == "Charging" ]; then
STOP="0"
elif [ "$BATTERY_STATUS" == "Full" ]; then
STOP="0"
fi

echo $BATTERY_STATUS #verification test

sleep 2
done
Avatar de l’utilisateur
Joffrey
Daikyu
Messages : 84
Inscription : mar. 08 sept. 2015, 23:42

Re: [Script] notification batterie basse i3wm

Message par Joffrey »

Bonjour,

Je suis un programmeur du dimanche, mais il y a plusieurs choses qui m’interpellent dans ton script.

Code : Tout sélectionner

var='1'   # type char
var=1     # type int

if [ "$var" -eq 1 ]; then    # Comparaison inutile 
    ...
if "$var"; then     # OK
    ...

while true     # Ça serait bien que ta boucle soit fausse un jour, 
                   # ou mets un exit dans une condition.
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

Re: [Script] notification batterie basse i3wm

Message par WHOK-S »

Salut,

J'ai préféré utilisé un char qu'un int pour le coup.
Pas bête pour la condition j'y avais pas penser ;)

Pourquoi exit la boucle ? Au final si je l'exit ça ne fera pas le taf demander, je sais bien qu'un while true c'est "dangeureux" mais c'est pas du Java Script et c'est un code relativement léger donc aucun problème de perf.
Après oui je peux faire en sorte d'exit quand je branche le chargeur, et une fois que le chargeur est débranché relancer un script. Le problème est encore le même :p me faut un moyen de lancer un script au boot puis de lancer un script quand le chargeur sera débranché...

Mon problème reste d'actualité, comment lancer ce script au démarrage système avec la certitude qu'il marche comme il le faut ?
Avatar de l’utilisateur
Joffrey
Daikyu
Messages : 84
Inscription : mar. 08 sept. 2015, 23:42

Re: [Script] notification batterie basse i3wm

Message par Joffrey »

J'aurai fais un truc comme ça pour le exit.

Code : Tout sélectionner

#!/bin/bash

battery=100

while true; do
    battery=$((battery - 5))

    if [ $battery -gt 15 ]; then  # Active Notification
        notify=true
    fi
    if [ $battery -le 15 ] && $notify; then  # Notifie seulement si activé
        notify-send 'Batterie faible' 'Branchez moi vite!' \
                    --icon=dialog-warning
        notify=false  # On est dejà au courant on desactive la notification
    elif [ $battery -le 5 ]; then
        notify-send 'Batterie très faible' 'Mise en veille dans 10 secondes' \  
                    --icon=dialog-error
        sleep 10  # On est sympa on laisse 10s pour brancher le chargeur
        if [ $battery -le 5 ]; then
            systemctl suspend 
            exit 0  # On quitte le programme a fait son taff
        fi
    fi
    
    sleep 1
done
Mais d'apres ce que tu dis le script est lancé donc ca ne viendrais pas de là.
Alors je vais peut-etre dire une grosse @*!# mais soit tu as un programme qui empeche la mise en veille soit ca peut être ton script qui ne se termine pas, d'où le exit..

Edit: Sans le exit ça fait ce que tu demande le programme tournera en continue. Donc le problème est ailleurs. chez moi mon exemple tourne bien.
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

Re: [Script] notification batterie basse i3wm

Message par WHOK-S »

Re,

J'aime bien ton code il est plus compact que le mien, après je pense que la problématique sera la même.

Je ne comprend vraiment pas d'où cela vient, quand je le lance en terminal ou alors à l'aide de dmenu, ça marche bien, mais quand c'est lancer avec i3 ça ne ressors pas de résultat graphique (la notification)

Après je ne pense pas mettre d'exit, que tu exit après le "systemctl suspend" ou même dès que tu branche un chargeur, il faudra faire un autre script qui tournera en continue pour dis que si le système n'est plus suspend ou dès que le chargeur est débranché alors on relance le script..

Mais le systemctl marche bien quand j'utilise mes raccourcis i3 ou même si je tape dans le terminal.
Je vais voir en rajoutant le exit si ça le fait bien :)

Bye

Edit: Je vais voir si je peux lancer un programme avec dmenu en terminal, ce qui marcherai peut-être
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

Re: [Script] notification batterie basse i3wm

Message par WHOK-S »

Re,

J'ai compris pourquoi mon systemctl suspend ne marchait pas ^^
Erreur d'algorithmie ahah

En gros j'utilise une fonction pour faire les 2 actions mais une fois que la notification à été envoyer je dis de ne plus utiliser la fonction pour ne plus faire tourner la fonction dans le vide.. bref un blaireau donc j'ai plus qu'à trouver une solution pour qu'il tourne tout seul.

++
Avatar de l’utilisateur
Joffrey
Daikyu
Messages : 84
Inscription : mar. 08 sept. 2015, 23:42

Re: [Script] notification batterie basse i3wm

Message par Joffrey »

..donc j'ai plus qu'à trouver une solution pour qu'il tourne tout seul.
Et bien tu les as tes solutions:
  • Tu veux que ça tourne en continue = boucle while (oublie le exit :))
  • Le niveau la batterie = tu récupères la ligne du fichier voulu (d'ailleurs tu peux utiliser "head" pour récupérer juste la ligne) tu l’exécutes et tu là testes à chaque tour de boucle.
Je pense que tu t'es beaucoup compliqué la vie avec ta fonction batteryAction :)
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

Re: [Script] notification batterie basse i3wm

Message par WHOK-S »

Re,

Quand je disais qu'il tourne tout seul c'était qui s'éxécute tout seul dès le boot :)
Au final j'ai trouver, j'ai donc utiliser systemd/user pour lancer le script automatiquement, je n'avais jamais utiliser systemd alors systemd/user encore moins :)

J'ai du utiliser systemd/user, car avec systemd les services sont lancés en root, ce qui pose problème pour envoyer des notifications sachant que pour la session root il n'y à pas de gui de lancer.
Quant au codes tout est bon, j'ai continuer à utiliser des fonctions pour faire les actions et tout marche nickel :)

J'ai utiliser des fonctions juste pour que le code soit plus agréable à l'oeil (du moins au mien) et c'était une meilleur organisation pour faire en sorte que toutes les 2 secondes le script n'envoie pas des notifs :p

Voici le code final:

#!/bin/bash

BATTERY_PATH="/sys/class/power_supply/BAT0/"

NOTIFY=false
SUSPEND=false

function notification {
if [ "$1" -lt 10 ]; then
notify-send --icon=battery "Battery is low - $1%"
NOTIFY=true
sleep 2
fi
}

function suspend {
if [ "$1" -lt 5 ] && [ "$SUSPEND" == "false" ]; then
notify-send --icon=battery "System will suspend in few seconds"
sleep 30
BATTERY_STATUS=$(cat $BATTERY_PATH/status)
if [ "$BATTERY_STATUS" == "Discharging" ]; then
systemctl suspend
SUSPEND=true
fi
fi
}

while true
do
BATTERY_STATUS=$(cat $BATTERY_PATH/status)
CURRENT_BATTERY=$(cat $BATTERY_PATH/capacity)

if [ "$BATTERY_STATUS" == "Discharging" ]; then
case $NOTIFY in
(false) notification $CURRENT_BATTERY;;
(true) suspend $CURRENT_BATTERY;;
esac

elif [ "$BATTERY_STATUS" == "Charging" ]; then
NOTIFY=false
SUSPEND=false
fi
echo $BATTERY_STATUS
sleep 2

done


et voici le code du systemd/user:

[Unit]
Description=BATalert

[Service]
ExecStart=/usr/bin/BATalert.sh

[Install]
WantedBy=multi-user.target

+++ et merci
Avatar de l’utilisateur
Joffrey
Daikyu
Messages : 84
Inscription : mar. 08 sept. 2015, 23:42

Re: [Script] notification batterie basse i3wm

Message par Joffrey »

Utiliser systemd pour un programme qui doit tourner seulement dans ton DE c'est moyen..
Ça aurait été mieux de laisser ton environnement de bureau le lancer au démarrage.
WHOK-S
Hankyu
Messages : 16
Inscription : dim. 23 juil. 2017, 00:47

Re: [Script] notification batterie basse i3wm

Message par WHOK-S »

J'ai pas de DE j'ai que i3
J'ai essayer de le run avec Xorg, i3 etc ça ne marche pas, le plus adaptés c'est systemd/user
Répondre