Aucune notification contextuelle de batterie faible en 16.04

10

J'utilise Unity en 16.04. Pour une raison quelconque, je ne reçois pas de notifications contextuelles pour une batterie faible. Je dois compter sur l'icône de la batterie dans le panneau supérieur pour voir si la batterie est du côté "batterie faible". Le comportement par défaut est-il en 16.04? Ou je ne reçois pas de fenêtres contextuelles pour une batterie faible?

user227495
la source
Vous pouvez essayer de réinstaller le indicator-power paquet。 Si vous le souhaitez, je pourrais également fournir un script qui peut vous donner une notification
Sergiy Kolodyazhnyy
Merci @Serg, veuillez me donner les commandes pour faire de même.
user227495
ok, je posterai une réponse dans quelques minutes.
Sergiy Kolodyazhnyy
les commentaires sous mon message ont été déplacés vers le chat. Nous pouvons continuer le dépannage là-bas.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Est-ce une batterie d'ordinateur portable faible ou la batterie de la carte mère. La solution discutée fait-elle également référence à la batterie cmos de la carte mère normalement utilisée pour maintenir l'horloge en vie?
simgineer

Réponses:

5

Essayez de réinstaller indicator-poweravec cette commande:

sudo apt-get install --reinstall indicator-power

Si cela ne résout pas le problème, envisagez d'utiliser le script de surveillance de la batterie fourni par l'une de mes réponses précédentes: https://askubuntu.com/a/603322/295286

Vous trouverez ci-dessous un script python qui peut vous avertir lorsque la charge de la batterie dépasse un certain pourcentage et suspendre le système une fois qu'il est inférieur à 10%. L'utilisation est simple:

python battery_monitor.py INT

Où INT est la valeur entière du pourcentage de batterie souhaité auquel vous devriez recevoir une notification, par exemple 30.

Vous pouvez également ajouter la commande ci-dessus aux applications de démarrage pour démarrer ce script à chaque connexion à la session Unity

Code source

Conformément aux demandes OP dans le chat et les commentaires, le script prend désormais deux arguments, le premier pour la notification de décharge et le deuxième os pour la notification de charge.

Aussi disponible en Github Gitst

#!/usr/bin/env python
from gi.repository import Notify
import subprocess
from time import sleep, time
from sys import argv
import dbus


def send_notification(title, text):
    try:
        if Notify.init(argv[0]):
            n = Notify.Notification.new("Notify")
            n.update(title, text)
            n.set_urgency(2)
            if not n.show():
                raise SyntaxError("sending notification failed!")
        else:
            raise SyntaxError("can't initialize notification!")
    except SyntaxError as error:
        print(error)
        if error == "sending notification failed!":
            Notify.uninit()
    else:
        Notify.uninit()


def run_cmd(cmdlist):
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout


def run_dbus_method(bus_type, obj, path, interface, method, arg):
    if bus_type == "session":
        bus = dbus.SessionBus()
    if bus_type == "system":
        bus = dbus.SystemBus()
    proxy = bus.get_object(obj, path)
    method = proxy.get_dbus_method(method, interface)
    if arg:
        return method(arg)
    else:
        return method()


def suspend_system():
    run_dbus_method('session',
                    'com.canonical.Unity',
                    '/com/canonical/Unity/Session',
                    'com.canonical.Unity.Session',
                    'Suspend', 'None')


def get_battery_percentage():
    output = run_cmd(['upower', '--dump']).decode().split('\n')
    found_battery = False
    for line in output:
        if 'BAT' in line:
            found_battery = True
        if found_battery and 'percentage' in line:
            return line.split()[1].split('%')[0]


def main():
    end = time()
    battery_path = ""
    for line in run_cmd(['upower', '-e']).decode().split('\n'):
        if 'battery_BAT' in line:
            battery_path = line
            break
    while True:
        notified = False
        while subprocess.call(['on_ac_power']) == 0:

            sleep(0.25)
            run_dbus_method('system', 'org.freedesktop.UPower',
                            battery_path, 'org.freedesktop.UPower.Device',
                            'Refresh', 'None')
            battery_percentage = int(get_battery_percentage())
            if battery_percentage == int(argv[2]) and not notified:
               subprocess.call( ['zenity', '--info','--text', 'Battery reached' + argv[2] + '%'  ]  ) 
               notified = True
        while subprocess.call(['on_ac_power']) == 1:

            sleep(0.25)
            run_dbus_method('system', 'org.freedesktop.UPower',
                            battery_path, 'org.freedesktop.UPower.Device',
                            'Refresh', 'None')
            battery_percentage = int(get_battery_percentage())

            if battery_percentage <= int(argv[1]):
                if battery_percentage <= 10:
                    send_notification('Low Battery',
                                      'Will suspend in 60 seconds')
                    sleep(60)
                    suspend_system()
                    continue
                if end < time():
                    end = time() + 600
                    send_notification('Low Battery', 'Plug in your charger')

if __name__ == '__main__':
    main()
Sergiy Kolodyazhnyy
la source
Les commentaires ne sont pas pour une discussion approfondie. Cette conversation a été déplacée vers le chat .
terdon
9

Ce n'est pas normal j'ai un 16.04 en cours d'exécution et j'obtiens des popups mais j'utilise un gnome shell tho.

Vous pouvez créer un script qui vous donne un message.

battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if [ $battery_level -le 10 ]
then
    notify-send "Battery low" "Battery level is ${battery_level}%!"
fi

Faites ensuite un travail cron et exécutez-le toutes les quelques minutes.

Cyber_Star
la source
Merci @Arne N. Je ne sais cependant pas comment gérer les travaux sur le maïs. De plus, est-il possible de fi les fichiers de base afin que nous puissions ignorer le script?
user227495
Pour faire un travail cron, ouvrez le type de terminal dans crontab -echoisissez l'éditeur nano (uniquement si vous n'avez jamais fait de travail cron) en appuyant sur 2 et entrez, après quoi un fichier s'ouvre, faites défiler vers le bas et ajoutez une nouvelle ligne. /2 * * * * my-script.sh Appuyez sur ctrl + xpuis tapez yet entrez. Cela devrait fonctionner. Aucune idée des fichiers de base désolés.
Cyber_Star
Ça ira. Je suis toujours en train de l'essayer un par un. J'espérais le réparer via les fichiers de base.
user227495
THX! J'ai mis cette commande à startupappsbash -c 'while true;do n="$(acpi -b |egrep "[[:digit:]]*%" -o |tr -d "%")";declare -p n;if((n<30));then notify-send "Low battery warning!" "$n%";fi;sleep $((5*60));done'
VeganEye Il y a
3

Oui, c'est normal. J'ai écrit un script bash simple pour configurer les notifications de batterie.

#!/usr/bin/env bash
# check if acpi is installed.
if [ `dpkg -l | grep acpi | grep -v acpi-support | grep -v acpid | grep -c acpi` -ne 1 ]; then
    echo "run 'sudo apt install acpi' then run '$0' again."
    exit
fi

if [ $# -eq 1 ] && [ "$1" == "--install" ]; then
    echo "installing battery notifier..."

    if [ ! -e "$HOME/bin" ]; then
        mkdir $HOME/bin
    fi  

    cp $0 $HOME/bin/bn.sh
    (crontab -l 2>/dev/null; echo "*/2 * * * * $HOME/bin/bn.sh") | crontab -

else
    # check if power adapter is plugged in, if not, check battery status.
    if [ -z "`acpi -a | grep on-line`" ]; then
        batlvl=`acpi -b | grep -P -o '[0-9]+(?=%)'`

        if [ $batlvl -le 15 ] && [ $batlvl -ge 11 ]; then
            notify-send "Battery is at $batlvl%. Please plug your computer in."
        elif [ $batlvl -le 10 ] && [ $batlvl -ge 6 ]; then
            notify-send "Battery is at $batlvl%. Computer will shutdown at 5%."
        elif [ $batlvl -le 5 ]; then
            notify-send "BATTERY CRITICALLY LOW, SHUTTING DOWN IN 3 SECONDS!"
            sleep 3
            shutdown -h now
        fi
    fi  
fi

Je dois aussi cela et des instructions sur mon compte github . J'espère que cela vous aide et vous facilite la tâche.

Nicholas Neal
la source