Tidak ada pemberitahuan popup baterai lemah di 16.04

9

Saya menggunakan Unity di 16.04. Untuk beberapa alasan, saya tidak mendapatkan pemberitahuan sembulan karena baterai lemah. Saya harus mengandalkan ikon baterai di panel atas untuk melihat apakah baterai ada di sisi "baterai lemah". Apakah perilaku default dalam 16,04? Atau saya tidak mendapatkan pop up untuk baterai rendah?

pengguna227495
sumber
Anda dapat mencoba menginstal ulang indicator-power paket。 Jika Anda mau, saya juga bisa memberikan skrip yang dapat memberi Anda pemberitahuan
Sergiy Kolodyazhnyy
Terima kasih @erg, tolong beri saya perintah untuk melakukan hal yang sama.
user227495
ok, saya akan memposting jawaban dalam beberapa menit.
Sergiy Kolodyazhnyy
komentar di bawah posting saya telah dipindahkan ke obrolan. Kami dapat melanjutkan pemecahan masalah di sana.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Apakah ini baterai laptop rendah atau baterai motherboard. Apakah solusi yang dibahas juga merujuk pada baterai cmos motherboard yang biasanya digunakan untuk menjaga jam tetap hidup?
pemain simgineer

Jawaban:

5

Coba instal ulang indicator-powerdengan perintah ini:

sudo apt-get install --reinstall indicator-power

Jika itu tidak menyelesaikan masalah, pertimbangkan untuk menggunakan skrip pemantauan baterai seperti yang disediakan oleh salah satu jawaban saya sebelumnya: https://askubuntu.com/a/603322/295286

Di bawah ini adalah skrip python yang dapat memberi tahu Anda ketika daya baterai melewati persentase tertentu, dan menangguhkan sistem setelah di bawah 10%. Penggunaannya sederhana:

python battery_monitor.py INT

Di mana INT adalah nilai integer dari persentase baterai yang Anda inginkan di mana Anda harus menerima notifikasi, misalnya 30.

Anda juga dapat menambahkan perintah di atas ke Aplikasi Startup untuk memulai skrip ini pada setiap login ke sesi Unity

Kode sumber

Sesuai permintaan OP dalam obrolan dan komentar, skrip sekarang mengambil dua argumen, pertama untuk pemberitahuan debit dan os kedua untuk pemberitahuan biaya.

Juga tersedia sebagai 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
sumber
Komentar bukan untuk diskusi panjang. Percakapan ini telah dipindahkan ke obrolan .
terdon
8

Ini tidak normal saya memiliki 16,04 berjalan dan mendapatkan popup tetapi saya menggunakan gnome shell tho.

Anda dapat membuat skrip yang memberi Anda pesan.

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

Kemudian buat pekerjaan cron dan jalankan setiap beberapa menit.

Cyber_Star
sumber
Terima kasih @ Andre N. Saya tidak tahu cara menjalankan pekerjaan jagung. Juga, ada cara untuk memperbaiki file inti sehingga kita dapat melewatkan skrip?
user227495
Untuk membuat pekerjaan cron membuka jenis terminal di crontab -epilih editor nano (hanya jika Anda tidak pernah membuat pekerjaan cron) dengan menekan 2 dan masuk, setelah itu file akan terbuka gulir ke bawah ke bawah dan tambahkan baris baru. /2 * * * * my-script.sh Tekan ctrl + xlalu ketik ydan masukkan. Itu seharusnya bekerja. Tidak tahu tentang file inti, maaf.
Cyber_Star
Akan melakukan. Saya masih mencobanya satu per satu. Berharap untuk memperbaikinya melalui file inti.
user227495
3

Ya, ini normal. Saya telah menulis skrip bash sederhana untuk mengatur notifikasi baterai.

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

Saya juga memiliki ini dan instruksi di akun github saya . Saya harap ini membantu dan mempermudah Anda.

Nicholas Neal
sumber