Bagaimana saya bisa mendapatkan notifikasi menggunakan Notify-OSD ketika charger dimasukkan / dilepas?

9

Bagaimana saya bisa mendapatkan notifikasi di layar menggunakan notify-osd ketika saya mencolokkan / mencabut pengisi daya?

kernel_panic
sumber
Saya bisa membuat skrip untuk melakukan ini .. tapi itu bukan solusi yang sangat elegan.
Seth
@Seth Bagaimana skrip seperti itu terlihat? Bisakah Anda mempostingnya dalam jawaban? Saya secara khusus tertarik pada bagaimana Anda mengidentifikasi acara "charger unplugged" ...
landroni
@ Landroni Oh, tidak menyadari Anda bukan OP. Saya mengirim jawaban di bawah ini. Ini berfungsi dengan baik untuk saya tetapi beberapa teman saya mengalami masalah. Beri tahu saya jika itu tidak berhasil untuk Anda. Saya bekerja dengan cara yang lebih baik saat kita bicara.
Seth
@Tet Terima kasih banyak untuk melihat ini. Seperti yang terjadi, baterai saya mati dengan sangat cepat, jadi pertanyaan saya agak diperdebatkan sekarang. Tapi saya akan mengingat solusi ini untuk masa depan.
landroni

Jawaban:

6

Beralih antara daya AC dan daya baterai harus menghasilkan suatu peristiwa pada bus sistem D-Bus . Jalankan dbus-monitor --systemdan saksikan kejadian apa yang dihasilkan di sistem Anda.

Jika Anda memiliki upower berjalan, Anda mendapatkan lebih banyak khusus pemberitahuan dari 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

Anda juga dapat memperoleh acara dari acpi_listen.

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

Jalankan skrip ini ketika Anda ingin mulai melihat notifikasi, atau menambahkannya ke startup sesi Anda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

dbus

Beberapa orang melaporkan solusi udev saya yang sebelumnya mengirim pemberitahuan terlalu sering ketika kabel power dicolokkan. Saya tidak dapat mereproduksi itu tetapi saya menulis skrip python ini untuk menggunakan dbus, bukan udev. Simpan sebagai .pyfile di suatu tempat di hard drive Anda. Tandai file yang dapat dieksekusi dengan menjalankan:

sudo chmod +x yourFile.py  

dan menambahkannya ke aplikasi startup Anda seperti yang dijelaskan di sini . Skrip ini mengharuskan paket acpidiinstal.

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

Dengan sedikit eksperimen (dan sedikit bantuan) saya dapat memanfaatkan aturan udev untuk mencapai ini. Beberapa orang telah melaporkan bahwa kadang-kadang mengirimkan pemberitahuan lebih dari sekali tetapi saya tidak punya masalah. YMMV.

Buat skrip dengan konten berikut:

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

mengganti some_userdengan nama pengguna Anda. Tandai file yang dapat dieksekusi dengan menjalankan:

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

mengganti /path/to/script.shdengan jalur ke tempat Anda menyimpan skrip.

Selanjutnya buat file dengan /etc/udev/rules.dnama 10-power.rulesdengan konten:

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"

kembali /path/to/script.shdengan path ke skrip yang Anda buat sebelumnya.

Sekarang muat ulang aturan udev dengan menjalankan:

sudo udevadm control --reload-rules                              

Lepaskan kabel daya. Anda harus mendapat notifikasi.

Seth
sumber
Itu bekerja, tetapi itu membutuhkan akses root, dan mesin yang rumit untuk mendapatkan notifikasi ke desktop, atau mengkodekan pengguna seperti yang Anda lakukan. Saya pikir Anda juga perlu mengaturXAUTHORITY dengan beberapa manajer tampilan seperti gdm.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles IMO "memerlukan root" dan pengguna kode keras adalah nitpicks konyol, tapi saya akan menambahkan solusi cron nanti demi kelengkapan jika Anda pikir itu yang penting. Saya cantik ini berfungsi di bawah GDM tetapi saya akan mengecek.
Seth
1
Saya juga melihat pada python-dbus dan dbus messaging API udev untuk mungkin membuat daemon yang akan melakukan hal yang sama dengan aturan udev ini, tetapi satu-satunya masalah adalah bahwa itu harus terus berjalan dan restart pada setiap kegagalan, sesuatu yang saya percaya menambah jumlah kompleksitas yang lebih tinggi ke solusi yang sudah lumayan. Namun, jika ada solusi yang lebih baik, saya akan senang mendengarnya.
joshumax
Tidak semua orang menjalankan Ubuntu sebagai sistem pengguna tunggal. Cron tidak berguna di sini. Saya tahu Anda memerlukan langkah ekstra untuk menemukan lokasi file cookie X versi yang lebih lama dari Gdm, saya tidak tahu tentang versi terbaru tapi saya pikir ini tidak berubah. Masalah yang sama dengan KDM . @ joshumax Anda dapat memperoleh informasi dari sumber lain, dan bahkan melalui dbus, Anda dapat melakukannya dari shell dengan dbus-monitor. Lihat jawaban saya.
Gilles 'SO- stop being evil'
2

Sumber Skrip

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# 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 

Dapatkan skripnya

Script juga ditambahkan ke github saya ; versi itu akan diperbarui dan dikembangkan sedikit lebih banyak.

Anda bisa mendapatkannya dengan melakukan hal berikut:

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

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

Script akan berada di /opt/sergrepdirektori, bernamanotify_ac_change.sh

Desain konsep

Pertanyaan kuncinya adalah "Bagaimana kita memeriksa keberadaan adaptor AC?" dan "Bagaimana kita mendeteksi perubahan?"

Nah, masalah ini sudah lama dipecahkan oleh pengembang lain. Ubuntu secara default dilengkapi dengan skrip bernama on_ac_power , yang disimpan di /usr/bin/on_ac_power. Adaptor daya dapat disebutkan di bawah berbagai subsistem di kernel (ACPI atau APM), tetapi skrip ini membuat pekerjaan kita lebih sederhana - penulis telah membahas banyak variasi yang mungkin. Ini hanya mengembalikan status keluar sehingga sesuai untuk digunakan dalam ifpernyataan.

Mengapa itu on_ac_powerpilihan yang baik? Karena itu bergantung pada pengecekan beberapa subsistem. Ini juga menyediakan perintah yang cukup sederhana untuk dikerjakan - hasilnya benar atau salah.

Jadi kita memiliki alat pendeteksi keberadaan, tetapi bagaimana dengan logika? Kita perlu menyurvei keberadaan dan mendeteksi perubahan di negara bagian. Apa yang bisa kita lakukan adalah menyimpan status keluar on_ac_powerdan terus membandingkan keadaan saat ini dengan apa yang telah kita simpan, setelah itu berubah - kirim pemberitahuan, simpan status lagi, dan terus membandingkan lagi, berulang-ulang. Ide dasarnya adalah penggunaan bendera.

Singkatnya, kami menginisialisasi snapshot dari negara, dan kemudian terus menerus polling untuk perubahan dari snapshot; setelah perubahan terjadi - beri tahu dan setel ulang foto.

Sergiy Kolodyazhnyy
sumber