LINUX.ORG.RU

Мониторинг состояния батареи

 , ,


0

1

Собственно сам скрипт

#!/bin/bash

exec 2>&1
INTERVAL=60 # in seconds

while true
do
if [ ! "$(cat /sys/class/power_supply/BAT0/status)" = "Full" ]; then
        battery_level=$(cat /sys/class/power_supply/BAT0/capacity)
if [ "${battery_level}" -le "20" ]; then
        notify-send "Battery low" "Battery level is ${battery_level}%!"
        elif [ "${battery_level}" -le "10" ]; then
                notify-send "Battery very low" "Battery level is ${battery_level}%! Suspending system in 1 minute."
                sleep 60
                zzz -z
        fi
fi
sleep ${INTERVAL}
done
Как заряд ниже 20 падает появляется уведомление, но оно всплывает каждые 60 сек. Как сделать так, чтоб оно оповестило разок при заряде 20? Можно написать так
-eq "20"
и при 19 процентах уведомления перестанут донимать, но как то это не правильно, один черт этот 1 процент будет глаза мазолить

Как-то может сработает:

#!/bin/bash

exec 2>&1
INTERVAL=60 # in seconds

previous=100
while true; do
    if [ ! "$(cat /sys/class/power_supply/BAT0/status)" = "Full" ]; then
            current=$(cat /sys/class/power_supply/BAT0/capacity)
        if [ "${current}" -le "20" ] && [ "${previous}" -gt "20" ]; then
            notify-send "Battery low" "Battery level is ${current}%!"
        elif [ "${current}" -le "10" ] && [ "${previous}" -gt "10" ]; then
            notify-send "Battery very low" "Battery level is ${current}%! Suspending system in 1 minute."
            sleep 60
            zzz -z
        fi
        previous=$current
    else
        previous=100
    fi
    sleep ${INTERVAL}
done

Надо просто смотреть не только на текущий уровень заряда, но и на предыдущий.

xaizek ★★★★★
()
Ответ на: комментарий от achilles_85

Ты задал вопрос из серии «как правильно забить гвоздь микроскопом?», я тебе подсказал использовать молоток. Если, конечно, твоей целью не является углубление знаний в Linux и shell.

aquadon ★★★★★
()

Ну так у вас проблема в создании алгоритма, а не в «acpid, bash, ubuntu». И ладно бы, скрипт вызывался раз в минуту, но у вас же бесконечный цикл и потому проблемы сохранения предыдущего состояния нет никакой. То есть алгоритм уровня информатики первый класс. Не нравятся повторения, ну так не вызывайте их если разница в процентах с предыдущим состоянием меньше желаемой.

vodz ★★★★★
()

В цикле сделай переменную, куда загоняй состояние уведомления. При каждой итерации цикла, проверяй выводилось ли уведомление. При заряде выше 20 процентов сбрасывай значение переменной.

IPR ★★★★★
()
exec 2>&1
INTERVAL=60 # in seconds
battery20charge=20

while true; do
  if [ ! "$(cat /sys/class/power_supply/BAT0/status)" = "Full" ]; then
    battery_level=$(cat /sys/class/power_supply/BAT0/capacity)
    if [ "${battery_level}" -le "10" ]; then
      notify-send "Battery very low" "Battery level is ${battery_level}%! Suspending system in 1 minute."
      sleep 60
      zzz -z
    elif [ "${battery_level}" -le "$battery20charge" ]; then
      let battery20charge--
      notify-send "Battery low" "Battery level is ${battery_level}%!"
    fi
  fi
  sleep ${INTERVAL}
done
sudoapter
()
Последнее исправление: sudoapter (всего исправлений: 1)
Ответ на: комментарий от aquadon

Ты задал вопрос из серии «как правильно забить гвоздь микроскопом?»

Да не, у него был вопрос что-то типа «у меня есть образец на универсальном конструкторе и инструментах, но он неподзаточен под мои хочушки, сделайте мне хорошо, я знаю, что вы умеете.» :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

лор, что еще скажешь. Я не написал сделайте мне то се, сюда пришел совет получить от тех, кто лучше меня в этом шарит. Если б мне готовый инструмент нужен был, то использовал бы какой нить манагер питания и в ус не дул. Мне интересно это, но всего и вся в книгах нет, нужна практика. Че мне перед вами распинаться то? Кто хотел направить в правильном направлении тот направил. А остальные тупо играют с клавиатурой и звезды набивают

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Я не написал сделайте мне то се, сюда пришел совет получить от тех, кто лучше меня в этом шарит. Если б мне готовый инструмент нужен был, то использовал бы какой нить манагер питания

Вы так нихрена не поняли, зато апломба выше крыши. При чём тут манагер питания и шарить?

vodz ★★★★★
()
Ответ на: комментарий от vodz

он у меня в боевом режиме вызывается раз в 5 минут. А теги почему эти, а не те что вам нравятся, дак потому что мне так нравится

achilles_85
() автор топика
Ответ на: комментарий от vodz

эт вы так нихрена и не поняли на какой из ваших мульен постов не поделу я ответил

achilles_85
() автор топика
Ответ на: комментарий от aquadon

Моей целью является в первую очередь изучение.Все остальное второстепенно. Я днях глянул прошлые свои темы и понял на сколько те задачи для меня сейчас легкие. Но как все это изучать не задвая временами глупые вопросы? Глупые они для тех, кто закрытыми глазами такое решает

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

он у меня в боевом режиме вызывается раз в 5 минут.

Он вызывается по изменению статуса. И потому бесконечный скрипт тут скорее нужен для отдельного демона, а не скрипта от acpid.

А теги почему эти, а не те что вам нравятся, дак потому что мне так нравится

Здесь не ваш личный ресурс, каждый может высказаться, в чём у вас проблемы, тем более, когда это правда, чтоб там вам не хотелось.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Он вызывается по изменению статуса. И потому бесконечный скрипт >тут скорее нужен для отдельного демона, а не скрипта от acpid.

Ноут с void linux и openbox. Скрипт нужен как демон. Тег acpid написал потому что параллельно писал демона для контроля состояния AC и переключения режимов энергосбережения. Вот в голове и каша из всего. Так устроят объяснения?

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Так устроят объяснения?

Пока непонятно, как у вас укладывается, что «скрипт вызывается раз в 5 минут» и бесконечный цикл в скрипте. Оно тогда у вас каждые 5 минут будет вызывать ещё по одному циклу мониторинга. Если без цикла, то действительно надо внешние средства для хранения предыдущего состояния.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Ну в конце тела цикла sleep 300. Это разве не повторение цикла с паузой 5 минут? Я не утверждаю, я в баше зеленый еще, учусь

achilles_85
() автор топика
Ответ на: комментарий от vodz

Плюс runit пока темный лес, несколько дней как познакомился. Кроме системд ничего не видал

achilles_85
() автор топика
Ответ на: комментарий от shuck

лучше файлик в /tmp

Чем лучше? Состояние вывода уведомления не нужно сохранять после перезагрузки, а создание и наполнение файла лишняя активность процессора и, возможно, НЖМД.

IPR ★★★★★
()
Ответ на: комментарий от achilles_85

Ну в конце тела цикла sleep 300.

В том, что вы запостили у вас 60. И «но оно всплывает каждые 60 сек.» это тоже ваши слова.

В принципе скрипт от xaizek почти правильный, если не считать, что там у него всё равно будет выдавать каждую минуту сообщение, если меньше 20%, по идее надо сравнивать не previous < 20, а current < previous.

vodz ★★★★★
()
Ответ на: комментарий от achilles_85

Набейте мне звезду! А лучше две!

Всё Вам правильно написали.

Ещё есть пакет acpi, показывающий, что происходит с батареей (уровень зарядки, поключен ли AC и т.д.), но Вы с этой информацией, видимо, ничего не сделаете…

Vault_Boy
()
Ответ на: комментарий от IPR

Чем лучше?

ТС всех запутал. У него не apcid-скрипт, а собственный демон для событий acpi, да ещё и в своих секундах сам путается. Если действительно был бы acpid-скрипт, то предыдущее состояние надо сохранять внешне.

vodz ★★★★★
()
Ответ на: комментарий от Vault_Boy

acpi что такое я знаю, без этого пакета acpid все что нужно показывает. Поэтому с этой информацией ничего делать конечно же не буду

achilles_85
() автор топика
Ответ на: комментарий от vodz

он у меня в боевом режиме вызывается раз в 5 минут

Для невнимательных. В посте 60 потому что отладить 1 минуту проще чем 5 минут ждать.

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Аcpid что-то показывает? Вы меня удивили. А то, что у Вас в желаниях настроить - простой скрипт, который можно, например, впихнуть в автозапуск WM.

Vault_Boy
()
Ответ на: комментарий от Vault_Boy

У меня не установлен acpi. Из мана acpid «acpid is designed to notify user-space programs of ACPI events.» Скрипты-демоны я впихиваю runit'у

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Для невнимательных. В посте 60 потому что отладить 1 минуту проще чем 5 минут ждать.

Для хамов, никто тут не обязан расшифровывать ваши мысли по умолчанию. Для отладки удобнее вообще раз в секунду. Начальный пост можно понять только однозначно, вас не устраивает именно что раз в минуту и хочется реже.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Сорян, если я вас чем то оскорбил. Но по мне ничего плохого я не написал. Это вы тут, каждый второй, своим красноречием пытаетесь мериться

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Это вы тут, каждый второй, своим красноречием пытаетесь мериться

Это победа, ящитаю! Тролль из Вас слаб, тоньше надо, тоньше.

Vault_Boy
()
flag=1
while true
do
	if [ "$(cat /sys/class/power_supply/BAT0/status)" = "Discharging" ]
	then
		capacity=$(cat /sys/class/power_supply/BAT0/capacity)
		if [ "$capacity" -le 10 ]
		then
			notify-send
			zzz
		elif [ "$capacity" -le 20 ] && [ "$flag" -eq 1 ]
			notify-send
			flag=0
		fi
	else
		flag=1
	fi
	sleep 60
done
bowtda
()
Ответ на: комментарий от bowtda

а теперь выносим магические цЫфры.
И на топе делаем настроечку, чтобы качественнее.

Vault_Boy
()
Ответ на: комментарий от shuck

/tmp нормальные люди держат в памяти, поэтому - каждый.

Vault_Boy
()

Делал как-то раз такую штуку. Смысл такой: при отключении питания срабатывает правило udev, которое запускает таймер (на systemd), который с некоторой периодичностью запускает скрипт для проверки заряда и вывода уведомления, если он низкий.

/etc/udev/rules.d/battery.rules:

SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/bin/systemctl start battery.timer"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/bin/systemctl stop battery.timer"

/etc/systemd/system/battery.timer:

[Unit]
Description=Battery notifications

[Timer]
OnActiveSec=1min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

/etc/systemd/system/battery.service

[Unit]
Description=Battery notifications

[Service]
User=rassol
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
ExecStart=-/home/rassol/.local/bin/gattery

~/.local/bin/gattery:

#!/bin/zsh
(( (cp=`</sys/class/power_supply/BAT0/capacity`) < 50 )) &&
dunstify -u critical -r 50 -t 120000 "LOW BATTERY: $cp%"
rassol
()
Ответ на: комментарий от shuck

/tmp часто чистится каждый ребут

/var/tmp ещё есть. Но лучше переменная.

IPR ★★★★★
()
Ответ на: комментарий от shuck

Unix Way жеж

А переменные shell'а это что, windows-way?

IPR ★★★★★
()
Ответ на: комментарий от bowtda

Это уже было и вроде не то. Смысл говорить один раз на 20%? Правильнее говорить каждый процент, но не повторяя то же значение тупо по времени. То есть надо не флаг, а сравнение меньше чем предыдущее.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.