Немає сповіщення про розряджання акумулятора 16.04


10

Я використовую Unity 16.04. З якихось причин я не отримую сповіщення про спливаючі вікна щодо низького рівня заряду. Мені потрібно покластися на значок батареї на верхній панелі, щоб побачити, чи батарея знаходиться на стороні "низького рівня заряду". Чи поведінка за замовчуванням у 16.04? Або я не отримую спливаючих вікон за низького рівня заряду акумулятора?


Ви можете спробувати перевстановити indicator-power пакет。 Якщо хочете, я можу також надати сценарій, який може надіслати вам сповіщення
Сергій Колодяжний

Дякую @Serg, ласкаво дай мені команди зробити те саме.
користувач227495

ОК, я опублікую відповідь через кілька хвилин.
Сергій Колодяжний

коментарі під моєю публікацією переміщені до чату. Ми можемо продовжувати усунення несправностей там.
Сергій Колодяжний

@SergiyKolodyazhnyy Це низький акумулятор ноутбука або батарея материнської плати. Чи стосується обговорюваного рішення також cmos батареї материнської плати, яка зазвичай використовується для збереження годинника?
simgineer

Відповіді:


5

Спроба перевстановлення за indicator-powerдопомогою цієї команди:

sudo apt-get install --reinstall indicator-power

Якщо це не вирішує проблему, спробуйте скористатися сценарієм моніторингу акумулятора, як це передбачено однією з моїх попередніх відповідей: https://askubuntu.com/a/603322/295286

Нижче наводиться скрипт python, який може повідомити вас, коли заряд акумулятора перевищить певний відсоток, і призупинити роботу системи, як тільки нижче 10%. Використання просте:

python battery_monitor.py INT

Де INT - ціле значення бажаного відсотка акумулятора, наприклад, ви повинні отримувати повідомлення 30.

Ви також можете додати вищезазначену команду до програм запуску, щоб запустити цей скрипт під час кожного входу в сеанс Unity

Вихідний код

Відповідно до запитів ОП у чаті та коментарях, тепер сценарій бере два аргументи: перший для сповіщення про звільнення та другий os для повідомлення про стягнення.

Також доступний як 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()

Коментарі не для розширеного обговорення. Ця розмова переміщена до чату .
тердон

9

Це не нормально, я працюю 16.04 і отримую спливаючі вікна, але я використовую тхо оболонку гнома.

Ви можете зробити сценарій, який дає вам повідомлення.

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

Потім зробіть роботу з кроном і запустіть її кожні кілька хвилин.


Дякую @Arne N. Я не знаю, як запускати кукурудзяні роботи. Крім того, будь-яким способом закріпити основні файли, щоб ми могли пропустити сценарій?
користувач227495

Щоб зробити завдання Cron відкрити тип терміналу, crontab -eвиберіть наноредактор (лише якщо ви ніколи не робив роботу з cron), натиснувши кнопку 2 і введіть, після чого файл відкриється прокручуванням донизу та додайте новий рядок. /2 * * * * my-script.sh Натисніть, ctrl + xа потім введіть yі введіть. Це має спрацювати. Не маю уявлення про основні файли вибачте.
Cyber_Star

Зроблю. Я все ще пробую це по черзі. Сподівався виправити це через основні файли.
користувач227495

Дякую! Я поставив цю команду в 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

Так, це нормально. Я написав простий скрипт для налаштування сповіщень про акумулятор.

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

Я також маю це та інструкції на своєму акаунті github . Я сподіваюся, що це допомагає та полегшує вам.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.