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


9

Як я можу отримати екранне сповіщення за допомогою notify-osd, коли я підключаю / вимикаю зарядний пристрій?


Я міг би зробити сценарій для цього .. але це не дуже елегантне рішення.
Сет

@Seth Як би виглядав такий сценарій? Чи можете ви опублікувати його у відповіді? Мене конкретно цікавить, як ви визначаєте подію "
вимкнено

@landroni О, не зрозумів, що ти не ОП. Відповідь я розмістив нижче. Для мене це працює добре, але у деяких моїх друзів виникають проблеми. Дайте мені знати, якщо це не працює для вас. Я працюю над кращим способом, коли ми говоримо.
Сет

@ Дуже дякую за те, що вивчив це. Як це буває, моя батарея померла від мене дуже швидкою смертю, тому мій запит на сьогоднішній день трохи спірний. Але я буду мати на увазі це рішення на майбутнє.
landroni

Відповіді:


6

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

Якщо у вас більше запущено, ви отримуєте більш спеціалізовані сповіщення від 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 для цього. Деякі люди повідомляють, що іноді воно надсилає повідомлення не раз, але у мене не було жодних проблем. 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 "вимагає корінця", а користувач із жорстким кодом - досить нерозумні нітпіки, але я додам рішення крона пізніше заради повноти, якщо ви вважаєте, що це так важливо. Я досить, що це працює під GDM, але я ще раз перевірю.
Сет

1
Я також дивлюся на API для обміну повідомленнями dbus python-dbus і udev, можливо, щоб створити демон, який буде робити те саме, що і ці правила udev, але єдина проблема полягає в тому, що це потрібно буде постійно працювати і перезавантажувати будь-який невдачі, те, що, на мою думку, додає більш високу складність і без того гідному рішенню. Однак, якщо є кращі рішення, я би радий їх почути.
joshumax

Не всі працюють Ubuntu як однокористувацька система. Cron тут не корисний. Я знаю, що вам потрібен був додатковий крок пошуку місця розташування файлу cookie X у старих версіях 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хороший вибір? Тому що він покладається на перевірку декількох підсистем. Він також забезпечує досить просту команду для роботи - результат є істинним, або хибним.

Таким чином, у нас є інструмент виявлення присутності, а як щодо логіки? Нам потрібно опитати наявність та виявити зміни в державі. Що ми можемо зробити, це зберігати статус виходу on_ac_powerта постійно порівнювати поточний стан із тим, що ми зберегли, як тільки він зміниться - надіслати повідомлення, зберегти стан ще раз і продовжувати порівнювати, циклічно. Основна ідея - використання прапорів.

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

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