Как я могу получить уведомление с помощью Notify-OSD, когда зарядное устройство вставлено / удалено?

9

Как я могу получить уведомление на экране, используя notify-osd, когда я подключаю / отключаю зарядное устройство?

kernel_panic
источник
Я мог бы сделать сценарий для этого ... но это не очень элегантное решение.
Сет
@Seth Как будет выглядеть такой сценарий? Не могли бы вы опубликовать это в ответе? Меня особенно интересует, как вы определяете событие «отключено зарядное устройство» ...
landroni
@landroni О, не знал, что ты не ОП. Я разместил ответ ниже. Это хорошо работает для меня, но у некоторых из моих друзей есть проблемы. Дайте мне знать, если это не сработает для вас. Я работаю над лучшим способом, пока мы говорим.
Сет
@ Сидит Большое спасибо за изучение этого. Так получилось, что моя батарея скончалась на мне очень быстро, поэтому мой запрос пока немного спорный. Но я буду помнить это решение на будущее.
Ландрони

Ответы:

6

Переключение между питанием от сети и аккумулятором должно генерировать событие на системной шине D-Bus . Запустите dbus-monitor --systemи посмотрите, какие события генерируются в вашей системе.

Если у вас работает upower , вы получаете более специализированные уведомления от upower -m.

#!/bin/sh
upower -m |
while read -r _time _2 _3 device; do
  [ "$device" = "/org/freedesktop/UPower/devices/line_power_AC" ] || continue
  notify-send "$(acpi -a)"
done

Вы также можете получить события от acpi_listen.

#!/bin/sh
acpi_listen |
while read -r what junk; do
  [ "$what" = "ac_adapter" ] || continue
  notify-send "$(acpi -a)"
done

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

Жиль "ТАК - прекрати быть злым"
источник
6

введите описание изображения здесь введите описание изображения здесь

DBus

Некоторые люди сообщали, что мое предыдущее решение udev отправляло уведомление слишком много раз, когда был подключен кабель питания. Я не мог воспроизвести это, но я написал этот скрипт на python, чтобы использовать dbus вместо udev. Сохраните его как .pyфайл где-нибудь на жестком диске. Отметьте исполняемый файл, выполнив:

sudo chmod +x yourFile.py  

и добавьте его в свои приложения запуска, как описано здесь . Этот скрипт требует установки пакета acpi.

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
import subprocess


dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

onMessage="Power plugged in!"
offMessage="Power unplugged!"
onImage="/usr/share/icons/gnome/32x32/devices/ac-adapter.png"
offImage="/usr/share/icons/gnome/32x32/status/battery-full.png"

def callback():
    state = subprocess.check_output(["acpi", "-a"]).split(':')[1].strip()
    if state == "on-line":
        subprocess.call(["notify-send", "-i", onImage, onMessage])
    elif state == "off-line":
        subprocess.call(["notify-send", "-i", offImage, offMessage])

bus.add_signal_receiver(callback, 'Changed', 'org.freedesktop.UPower.Device', 'org.freedesktop.UPower', '/org/freedesktop/UPower/devices/line_power_AC')

loop = gobject.MainLoop()
loop.run()

Udev

Немного поэкспериментировав (и немного помог), я смог использовать правило udev для достижения этой цели. Некоторые люди сообщают, что иногда он отправляет уведомление более одного раза, но у меня не было никаких проблем. YMMV.

Создайте скрипт со следующим содержимым:

#!/bin/bash

# Set this to your username
USER="some_user"

if [ "$POWER" == "on" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/devices/ac-adapter.png "Power cable plugged in."'
elif [ "$POWER" == "off" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/status/battery-full.png "Power cable unplugged."'
fi

заменить some_userна ваше имя пользователя. Отметьте исполняемый файл, выполнив:

sudo chmod +x /path/to/script.sh  

заменив /path/to/script.shпуть, по которому вы сохранили скрипт.

Затем создайте файл с /etc/udev/rules.dименем 10-power.rulesс содержанием:

SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="0", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="off"
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="1", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="on"

снова замените /path/to/script.shпуть к сценарию, который вы создали ранее.

Теперь перезагрузите правила udev, выполнив:

sudo udevadm control --reload-rules                              

Отключите кабель питания. Вы должны получить уведомление.

Сет
источник
Это работает, но требует рут-доступа и сложного механизма для отправки уведомлений на рабочий стол или жесткого кодирования пользователя, как вы это сделали. Я думаю, вам также нужно установитьXAUTHORITY некоторые дисплеи, такие как gdm.
Жиль "ТАК - перестань быть злым"
@Gilles IMO «требует рута», а жестко запрограммированный пользователь - довольно глупый придурок, но позже я добавлю решение cron ради полноты, если вы считаете, что это так важно. Я довольно, это работает под GDM, но я проверю еще раз.
Сет
1
Я также смотрю на python-dbus и API-интерфейс обмена сообщениями udev для dbus, возможно, для создания демона, который будет делать то же самое, что и эти правила udev, но единственная проблема заключается в том, что он должен постоянно работать и перезапускаться на любом неудачи, что, я считаю, добавляет большую сложность к и без того приличному решению. Однако, если есть какие-то лучшие решения, я буду рад их услышать.
joshumax
Не все используют Ubuntu как однопользовательскую систему. Крон здесь не полезен. Я знаю, что вам потребовался дополнительный шаг, чтобы найти местоположение файла X cookie более старых версий Gdm, я не знаю о последних версиях, но я думаю, что это не изменилось. Та же проблема с KDM . @joshumax Вы можете получить информацию из других источников, и даже через dbus, вы можете сделать это из оболочки с помощью dbus-monitor. Смотри мой ответ.
Жиль "ТАК - перестань быть злым"
2

Источник скрипта

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# Date: March 11, 2016
# Purpose: Script to detect connection/disconnection
#          of the ac adapter
#          
# 
# Written for: http://askubuntu.com/q/542986/295286
# Tested on: Ubuntu 14.04 LTS
# Version: 0.2
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
#set -x
ARGV0="$0"
ARGC=$#

test_presence()
{
  on_ac_power
  echo $?
}

notify_change()
{
   pgrep -f '/usr/bin/X' > /dev/null && GUI=true
   connected='AC adapter connected'
   disconnected='AC adapter disconnected'

   if [ $1 -eq 0 ]
   then
           wall <<< $connected        
           $GUI && DISPLAY=:0 notify-send 'AC adapter connected'

   else
           wall <<< $connected
           $GUI && DISPLAY=:0 notify-send 'AC adapter disconnected'
   fi
}

main()
{
  FLAG=$(test_presence)

  while true
  do
     STATUS=$(test_presence)

     if [ $STATUS -eq $FLAG   ]
     then
        continue
     else
        notify_change $STATUS
        FLAG=$STATUS
     fi

  sleep 3 #0.25
  done
}  

main 

Получение сценария

Скрипт также добавлен в мой github ; эта версия будет обновлена ​​и разработана чуть больше.

Вы можете получить это, выполнив следующие действия:

  1. sugo apt-get install git
  2. cd /opt

  3. git clone https://github.com/SergKolo/sergrep.git

Сценарий будет в /opt/sergrepкаталоге с именемnotify_ac_change.sh

Концепция / Дизайн

Ключевые вопросы: «Как мы проверяем наличие адаптера переменного тока?» и "Как мы обнаруживаем изменения?"

Ну, эта проблема давно решена другими разработчиками. Ubuntu поставляется по умолчанию со скриптом on_ac_power , который хранится в /usr/bin/on_ac_power. Адаптер питания можно упомянуть в разных подсистемах ядра (ACPI или APM), но этот скрипт упрощает нашу работу - авторы рассмотрели множество возможных вариантов. Он возвращает только состояние выхода, поэтому он подходит для использования в ifоператорах.

Почему это on_ac_powerхороший выбор? Потому что он опирается на проверку нескольких подсистем. Он также предоставляет достаточно простую команду для работы - результат либо true, либо false.

Таким образом, у нас есть инструмент обнаружения присутствия, но как насчет логики? Нам нужно опросить присутствие и обнаружить изменения в состоянии. Что мы можем сделать, это сохранить состояние выхода on_ac_powerи постоянно сравнивать текущее состояние с тем, что мы сохранили, как только оно изменится - отправьте уведомление, сохраните статус снова и продолжите сравнение, повторяя цикл. Основная идея - использование флагов.

Короче говоря, мы инициализируем снимок состояния, а затем постоянно запрашиваем изменения из снимка; как только произойдет изменение - сообщите и сбросьте снимок.

Сергей Колодяжный
источник