Brak powiadomienia o niskim poziomie baterii w 16.04

10

Używam Unity w 16.04. Z jakiegoś powodu nie otrzymuję powiadomień wyskakujących z powodu niskiego poziomu naładowania baterii. Muszę polegać na ikonie baterii na górnym panelu, aby sprawdzić, czy bateria znajduje się po stronie „niskiego poziomu baterii”. Czy domyślne zachowanie to 16.04? Czy nie pojawiają się wyskakujące okienka z powodu niskiego poziomu naładowania baterii?

użytkownik227495
źródło
Możesz spróbować zainstalować ponownie indicator-power pakiet。 Jeśli chcesz, mogę również dostarczyć skrypt, który może powiadomić Cię
Sergiy Kolodyazhnyy
Dzięki @Serg, uprzejmie daj mi polecenia, aby zrobić to samo.
user227495,
ok, opublikuję odpowiedź za kilka minut.
Sergiy Kolodyazhnyy
komentarze pod moim postem zostały przeniesione na czat. Możemy tam kontynuować rozwiązywanie problemów.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Czy jest to słaba bateria laptopa lub bateria płyty głównej. Czy omawiane rozwiązanie dotyczy również baterii cmos płyty głównej zwykle używanej do podtrzymywania zegara?
simgineer

Odpowiedzi:

5

Spróbuj zainstalować ponownie za indicator-powerpomocą tego polecenia:

sudo apt-get install --reinstall indicator-power

Jeśli to nie rozwiąże problemu, rozważ użycie skryptu monitorowania baterii podanego w jednej z moich poprzednich odpowiedzi: https://askubuntu.com/a/603322/295286

Poniżej znajduje się skrypt Pythona, który może powiadomić Cię, gdy poziom naładowania baterii przekroczy określony procent, i zawiesić system, gdy osiągnie 10%. Użycie jest proste:

python battery_monitor.py INT

Gdzie INT jest wartością całkowitą pożądanego procentu baterii, przy którym powinieneś otrzymać powiadomienie, na przykład 30.

Możesz także dodać powyższe polecenie do aplikacji startowych, aby uruchomić ten skrypt przy każdym logowaniu do sesji Unity

Kod źródłowy

Zgodnie z żądaniami OP w czacie i komentarzach, skrypt przyjmuje teraz dwa argumenty, pierwszy dla powiadomienia o rozładowaniu i drugi dla powiadomienia o obciążeniu.

Dostępny również jako 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
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji. Ta rozmowa została przeniesiona do czatu .
terdon
9

To nie jest normalne, mam uruchomiony 16.04 i otrzymuję wyskakujące okienka, ale używam tho powłoki gnome.

Możesz stworzyć skrypt, który da ci wiadomość.

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

Następnie zrób zadanie crona i uruchom je co kilka minut.

Cyber_Star
źródło
Dzięki @Arne N. Nie wiem jednak, jak uruchamiać kukurydzę. A także jakikolwiek sposób, aby fi pliki rdzenia, abyśmy mogli pominąć skrypt?
user227495,
Aby otworzyć zadanie crona, otwórz typ terminala, crontab -ewybierz edytor nano (tylko jeśli nigdy nie wykonałeś zadania crona), naciskając 2 i wchodząc, po czym plik otworzy się, przewiń w dół i dodaj nową linię. /2 * * * * my-script.sh Naciśnij, ctrl + xa następnie wpisz yi wprowadź. To powinno działać. Przepraszam, nie mam pojęcia o podstawowych plikach.
Cyber_Star
Zrobię Nadal próbuję tego jeden po drugim. Miałem nadzieję to naprawić za pomocą podstawowych plików.
user227495,
dzięki! Umieściłem to polecenie w 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
3

Tak, to normalne. Napisałem prosty skrypt bash do konfigurowania powiadomień baterii.

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

Mam również to i instrukcje na moim koncie github . Mam nadzieję, że ci to pomoże i ułatwi ci to.

Nicholas Neal
źródło