Nessuna notifica popup di batteria scarica in 16.04


10

Uso Unity in 16.04. Per qualche motivo, non ricevo notifiche popup per batteria scarica. Devo fare affidamento sull'icona della batteria nel pannello superiore per vedere se la batteria è sul lato "batteria scarica". Il comportamento predefinito è 16.04? O non visualizzo i popup per la batteria scarica?


Potresti provare a reinstallare il indicator-power pacchetto。 Se vuoi, potrei anche fornire uno script che può darti una notifica
Sergiy Kolodyazhnyy,

Grazie @Serg, gentilmente dammi i comandi per fare lo stesso.
user227495

ok, posterò una risposta tra qualche minuto.
Sergiy Kolodyazhnyy,

i commenti sotto il mio post sono stati spostati in chat. Possiamo continuare a risolvere i problemi lì.
Sergiy Kolodyazhnyy,

@SergiyKolodyazhnyy È una batteria per laptop scarica o batteria della scheda madre. La soluzione discussa si riferisce anche alla batteria cmos della scheda madre normalmente utilizzata per mantenere in vita l'orologio?
simgineer

Risposte:


5

Tentare di reinstallare indicator-powercon questo comando:

sudo apt-get install --reinstall indicator-power

Se ciò non risolve il problema, considera l'utilizzo dello script di monitoraggio della batteria fornito da una delle mie precedenti risposte: https://askubuntu.com/a/603322/295286

Di seguito è riportato lo script Python che può avvisare quando la carica della batteria supera una certa percentuale e sospendere il sistema una volta inferiore del 10%. L'uso è semplice:

python battery_monitor.py INT

Dove INT è il valore intero della percentuale di batteria desiderata alla quale si dovrebbe ricevere una notifica, ad esempio 30.

È inoltre possibile aggiungere il comando precedente alle applicazioni di avvio per avviare questo script ad ogni accesso alla sessione di Unity

Codice sorgente

Secondo le richieste di OP nella chat e nei commenti, lo script ora accetta due argomenti, il primo per la notifica di scarico e il secondo sistema operativo per la notifica di addebito.

Disponibile anche come 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()

I commenti non sono per una discussione estesa. Questa conversazione è stata spostata in chat .
terdon,

9

Questo non è normale ho un 16.04 in esecuzione e ottengo popup ma sto usando una shell gnome.

Puoi creare uno script che ti dia un messaggio.

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

Quindi crea un cron job ed eseguilo ogni pochi minuti.


Grazie @Arne N. Non so come eseguire i lavori di mais. Inoltre, un modo per salvare i file core in modo da poter saltare lo script?
user227495

Per fare in modo che un lavoro cron apra il tipo di terminale in crontab -escegli l'editor nano (solo se non hai mai fatto un lavoro cron) premendo 2 e invio, dopodiché un file si aprirà scorrere verso il basso e aggiungere una nuova riga. /2 * * * * my-script.sh Premere ctrl + xe quindi digitare ye inserire. Dovrebbe funzionare. Nessuna idea sui file core mi dispiace.
Cyber_Star,

Andrà bene. Lo sto ancora provando uno per uno. Speravo di risolverlo attraverso i file core.
user227495

grazie! Ho messo questo comando su 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

3

Sì, questo è normale. Ho scritto un semplice script bash per impostare le notifiche della batteria.

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

Ho anche questo e le istruzioni sul mio account github . Spero che questo ti aiuti e ti renda più facile.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.