16.04에 배터리 부족 팝업 알림 없음


10

16.04에서 Unity를 사용합니다. 어떤 이유로 배터리 부족에 대한 팝업 알림이 표시되지 않습니다. 배터리가 "배터리 부족"쪽에 있는지 확인하려면 상단 패널의 배터리 아이콘을 사용해야합니다. 16.04의 기본 동작입니까? 또는 배터리 부족으로 팝업이 나타나지 않습니까?


indicator-power 원하는 경우 패키지를 다시 설치할 수도 있습니다 . 원하는 경우 알림을 제공하는 스크립트를 제공 할 수도 있습니다
Sergiy Kolodyazhnyy

감사합니다 @ Serg, 친절하게도 똑같은 명령을 내립니다.
user227495

좋아, 몇 분 안에 답변을 게시 할 것입니다.
Sergiy Kolodyazhnyy

내 게시물 아래의 댓글이 채팅으로 이동되었습니다. 문제 해결을 계속할 수 있습니다.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy 이것은 노트북 배터리 또는 마더 보드 배터리입니다. 논의 된 솔루션은 일반적으로 시계를 유지하기 위해 일반적으로 사용되는 마더 보드의 cmos 배터리를 참조합니까?
simgineer 2019

답변:


5

indicator-power이 명령으로 다시 설치 하십시오 :

sudo apt-get install --reinstall indicator-power

그래도 문제가 해결되지 않으면 이전 답변 중 하나에서 제공 한 배터리 모니터링 스크립트를 사용하는 것이 좋습니다 : https://askubuntu.com/a/603322/295286

아래는 배터리 충전량이 일정 비율을 초과했을 때 알려주고 10 %가되면 시스템을 일시 중단시키는 python 스크립트입니다. 사용법은 간단합니다.

python battery_monitor.py INT

여기서 INT는 알림을 받아야하는 원하는 배터리 비율의 정수 값입니다 (예 :) 30.

Unity 세션에 로그인 할 때마다 위의 명령을 시작 응용 프로그램에 추가하여이 스크립트를 시작할 수도 있습니다

소스 코드

채팅 및 댓글의 OP 요청에 따라 이제 스크립트는 첫 번째 방전 알림에 대한 두 번째 인수와 청구 알림에 대한 두 번째 인수를 사용합니다.

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()

의견은 확장 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
terdon

9

이것은 정상이 아니며 16.04가 실행 중이며 팝업이 표시되지만 그놈 쉘 tho를 사용하고 있습니다.

메시지를 제공하는 스크립트를 만들 수 있습니다.

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. 그래도 옥수수 작업을 실행하는 방법을 모르겠습니다. 또한 스크립트를 건너 뛸 수 있도록 코어 파일을 수정하는 방법은 무엇입니까?
user227495

cron 작업이 터미널 유형을 열도록하려면 crontab -e2를 눌러 nano 편집기 (cron 작업을 수행 한 적이없는 경우에만)를 선택하고 Enter를 누른 후 파일을 열고 아래로 스크롤하여 새 행을 추가하십시오. /2 * * * * my-script.sh 를 누른 ctrl + x다음 입력 y하고 입력하십시오. 작동합니다. 코어 파일에 대해 잘 모르겠습니다.
Cyber_Star

할 것이다. 나는 아직도 그것을 하나씩 시도하고 있습니다. 핵심 파일을 통해 문제를 해결하려고했습니다.
user227495

고마워! 나는이 명령을 startupapps에 넣었다bash -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

예, 이것은 정상입니다. 배터리 알림 설정을위한 간단한 bash 스크립트를 작성했습니다.

#!/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 계정 에 이것을 가지고 있습니다 . 도움이 되었으면 좋겠습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.