No hay notificación emergente de batería baja en 16.04

9

Yo uso Unity en 16.04. Por alguna razón, no recibo notificaciones emergentes por poca batería. Tengo que confiar en el icono de la batería en el panel superior para ver si la batería está en el lado de "batería baja". ¿Es el comportamiento predeterminado en 16.04? ¿O no obtengo ventanas emergentes con poca batería?

usuario227495
fuente
Puede intentar reinstalar el indicator-power paquete。 Si lo desea, también podría proporcionarle una secuencia de comandos que le pueda dar una notificación
Sergiy Kolodyazhnyy
Gracias @Serg, amablemente dame los comandos para hacer lo mismo.
user227495
Ok, publicaré una respuesta en unos minutos.
Sergiy Kolodyazhnyy
los comentarios debajo de mi publicación se han movido al chat. Podemos continuar con la resolución de problemas allí.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy ¿Se trata de una batería de portátil baja o de la batería de la placa base? ¿La solución discutida también se refiere a la batería cmos de la placa base que normalmente se usa para mantener vivo el reloj?
simgineer

Respuestas:

5

Intente reinstalar indicator-powercon este comando:

sudo apt-get install --reinstall indicator-power

Si eso no resuelve el problema, considere usar el script de monitoreo de batería tal como lo proporciona una de mis respuestas anteriores: https://askubuntu.com/a/603322/295286

A continuación se muestra un script de Python que puede notificarle cuando la carga de la batería supera cierto porcentaje, y suspender el sistema una vez que esté por debajo del 10%. El uso es simple:

python battery_monitor.py INT

Donde INT es el valor entero del porcentaje de batería deseado en el que debe recibir una notificación, por ejemplo 30.

También puede agregar el comando anterior a las Aplicaciones de inicio para iniciar este script en cada inicio de sesión en la sesión de Unity

Código fuente

Según las solicitudes de OP en el chat y los comentarios, el script ahora toma dos argumentos, primero para la notificación de descarga y el segundo sistema operativo para la notificación de cargo.

También disponible como 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
fuente
Los comentarios no son para discusión extendida. Esta conversación se ha movido al chat .
terdon
8

Esto no es normal, tengo un 16.04 ejecutándose y obtengo ventanas emergentes, pero estoy usando un gnome shell.

Puedes hacer un script que te de un mensaje.

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

Luego haga un trabajo cron y ejecútelo cada pocos minutos.

Cyber_Star
fuente
Gracias @Arne N. Sin embargo, no sé cómo ejecutar trabajos de maíz. Además, ¿hay alguna forma de reparar los archivos principales para que podamos omitir el script?
user227495
Para hacer que un trabajo cron abra el tipo de terminal, crontab -eelija el nano editor (solo si nunca hizo un trabajo cron) presionando 2 e ingrese, después de eso se abrirá un archivo, desplácese hacia abajo y agregue una nueva línea. /2 * * * * my-script.sh Presione ctrl + xy luego escriba ye ingrese. Eso debería funcionar. No tengo idea de los archivos principales lo siento.
Cyber_Star
Lo haré Todavía lo estoy intentando uno por uno. Esperaba solucionarlo a través de los archivos principales.
user227495
3

Si, esto es normal. He escrito una secuencia de comandos bash simple para configurar las notificaciones de batería.

#!/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

También tengo esto e instrucciones en mi cuenta de github . Espero que esto ayude y te lo haga más fácil.

Nicholas Neal
fuente