Keine Popup-Benachrichtigung für niedrigen Batteriestand in 16.04


9

Ich benutze Unity in 16.04. Aus irgendeinem Grund erhalte ich keine Popup-Benachrichtigungen für niedrigen Batteriestand. Ich muss mich auf das Batteriesymbol im oberen Bereich verlassen, um zu sehen, ob sich die Batterie auf der Seite "Batterie schwach" befindet. Ist das Standardverhalten in 16.04? Oder bekomme ich keine Popups für schwache Batterie?


Sie könnten versuchen, indicator-power Paket neu zu installieren 。 Wenn Sie möchten, könnte ich auch ein Skript bereitstellen, das Sie
benachrichtigen

Danke @Serg, gib mir bitte die Befehle, dasselbe zu tun.
user227495

ok, ich werde in ein paar Minuten eine Antwort posten.
Sergiy Kolodyazhnyy

Kommentare unter meinem Beitrag wurden in den Chat verschoben. Dort können wir die Fehlerbehebung fortsetzen.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Ist dies ein schwacher Laptop-Akku oder der Motherboard-Akku? Bezieht sich die besprochene Lösung auch auf den cmos-Akku des Motherboards, der normalerweise verwendet wird, um die Uhr am Leben zu erhalten?
Simgineer

Antworten:


5

Versuchen Sie indicator-powermit diesem Befehl eine Neuinstallation :

sudo apt-get install --reinstall indicator-power

Wenn sich das Problem dadurch nicht beheben lässt, sollten Sie das Skript zur Batterieüberwachung verwenden, das in einer meiner vorherigen Antworten angegeben ist: /ubuntu//a/603322/295286

Im Folgenden finden Sie ein Python-Skript, das Sie benachrichtigen kann, wenn die Batterieladung einen bestimmten Prozentsatz überschreitet, und das System aussetzen kann, sobald es unter 10% liegt. Die Verwendung ist einfach:

python battery_monitor.py INT

Wobei INT ein ganzzahliger Wert Ihres gewünschten Batterieprozentsatzes ist, bei dem Sie beispielsweise eine Benachrichtigung erhalten sollen 30.

Sie können den obigen Befehl auch zu Startanwendungen hinzufügen, um dieses Skript bei jeder Anmeldung in der Unity-Sitzung zu starten

Quellcode

Gemäß den OP-Anforderungen in Chat und Kommentaren verwendet das Skript jetzt zwei Argumente: erstens für die Entlassungsbenachrichtigung und zweitens für die Gebührenbenachrichtigung.

Auch als Github Gitst erhältlich

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

Kommentare sind nicht für eine ausführliche Diskussion gedacht. Diese Konversation wurde in den Chat verschoben .
Terdon

8

Dies ist nicht normal. Ich habe einen 16.04 und bekomme Popups, aber ich benutze eine Gnome-Shell.

Sie können ein Skript erstellen, das Ihnen eine Nachricht gibt.

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

Machen Sie dann einen Cron-Job und führen Sie ihn alle paar Minuten aus.


Danke @Arne N. Ich weiß allerdings nicht, wie man Maisjobs ausführt. Auch eine Möglichkeit, die Kerndateien zu fi, damit wir das Skript überspringen können?
user227495

Um einen Cron-Job zu öffnen, öffnen Sie den Terminaltyp in. crontab -eWählen Sie den Nano-Editor (nur wenn Sie noch nie einen Cron-Job gemacht haben), indem Sie 2 drücken und die Eingabetaste drücken. Danach wird eine geöffnete Datei nach unten gescrollt und eine neue Zeile hinzugefügt. /2 * * * * my-script.sh Drücken Sie ctrl + xund geben Sie ein yund geben Sie ein. Das sollte funktionieren. Keine Ahnung von den Kerndateien sorry.
Cyber_Star

Wird besorgt. Ich versuche es immer noch eins nach dem anderen. Ich hatte gehofft, es durch Kerndateien zu beheben.
user227495

3

Ja, das ist normal. Ich habe ein einfaches Bash-Skript zum Einrichten von Batteriemeldungen geschrieben.

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

Ich habe auch diese und Anweisungen auf meinem Github-Konto . Ich hoffe das hilft und macht es dir leichter.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.