ฉันจะรับการแจ้งเตือนโดยใช้ Notify-OSD ได้อย่างไรเมื่อเสียบหรือถอดอุปกรณ์ชาร์จ


9

ฉันจะรับการแจ้งเตือนบนหน้าจอโดยใช้แจ้งเตือนเมื่อฉันเสียบ / ถอดปลั๊กเครื่องชาร์จได้อย่างไร


ฉันสามารถสร้างสคริปต์เพื่อทำสิ่งนี้ .. แต่นั่นไม่ใช่ทางออกที่หรูหรามาก
เซท

@Seth สคริปต์ดังกล่าวมีลักษณะอย่างไร คุณช่วยโพสต์ไว้ในคำตอบได้ไหม? ฉันสนใจเป็นพิเศษในการที่คุณระบุเหตุการณ์ "ที่เสียบปลั๊กไม่ได้" ...
landroni

@landroni โอ้ไม่ได้ตระหนักว่าคุณไม่ใช่ OP ฉันโพสต์คำตอบด้านล่าง มันใช้งานได้ดีสำหรับฉัน แต่เพื่อนของฉันบางคนกำลังมีปัญหา แจ้งให้เราทราบหากไม่ได้ผลสำหรับคุณ ฉันกำลังทำงานในวิธีที่ดีกว่าที่เราพูด
เซท

@ เซทขอบคุณมากที่มองดูสิ่งนี้ เมื่อมันเกิดขึ้นแบตเตอรีของฉันก็ตายเร็วมากดังนั้นเคียวรีของฉันก็มอดไปหน่อย แต่ฉันจะเก็บโซลูชันนี้ไว้ในอนาคต
landroni

คำตอบ:


6

การสลับระหว่างไฟฟ้ากระแสสลับและพลังงานแบตเตอรี่ควรสร้างเหตุการณ์บนบัสระบบD-Bus เรียกใช้dbus-monitor --systemและดูว่ามีกิจกรรมใดบ้างที่สร้างขึ้นในระบบของคุณ

ถ้าคุณมีupowerupower -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 'หยุดความชั่วร้าย'

@Gilles IMO "ต้องการรูท" และผู้ใช้ที่ใช้รหัสยากเป็น nitpicks ที่งี่เง่า แต่ฉันจะเพิ่มโซลูชัน cron ในภายหลังเพื่อความสมบูรณ์ถ้าคุณคิดว่ามันสำคัญ ฉันน่ารักมันใช้งานได้ภายใต้ GDM แต่ฉันจะตรวจสอบอีกครั้ง
เซท

1
ฉันยังดู python-dbus และ udev's API การส่งข้อความของ udev เพื่อสร้าง daemon ที่จะทำสิ่งเดียวกับกฎ udev เหล่านี้ แต่ปัญหาเดียวคือมันจะต้องทำงานตลอดเวลาและเริ่มใหม่ ความล้มเหลวสิ่งที่ฉันเชื่อว่าเพิ่มความซับซ้อนในปริมาณที่มากขึ้นให้กับโซลูชันที่เหมาะสมแล้ว อย่างไรก็ตามหากมีวิธีแก้ปัญหาที่ดีกว่านี้ฉันยินดีที่จะรับฟัง
joshumax

ไม่ใช่ทุกคนที่ใช้ Ubuntu เป็นระบบผู้ใช้คนเดียว Cron ไม่มีประโยชน์ที่นี่ ฉันรู้ว่าคุณต้องการขั้นตอนพิเศษในการค้นหาตำแหน่งของไฟล์คุกกี้ X เวอร์ชันเก่าของ Gdm ฉันไม่รู้เกี่ยวกับเวอร์ชันล่าสุด แต่ฉันคิดว่าสิ่งนี้จะไม่เปลี่ยนแปลง ปัญหาเดียวกันกับ KDM @joshumax คุณจะได้รับข้อมูลจากแหล่งข้อมูลอื่น ๆ และแม้กระทั่งผ่าน dbus dbus-monitorคุณสามารถทำมันได้จากเปลือกด้วย ดูคำตอบของฉัน
Gilles 'หยุดความชั่วร้าย'

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

แนวคิด / ออกแบบ

คำถามสำคัญคือ"เราจะตรวจสอบว่ามีอะแดปเตอร์ AC ได้อย่างไร" และ"เราจะตรวจจับการเปลี่ยนแปลงได้อย่างไร"

ดีปัญหานี้ได้รับการแก้ไขนานแล้วโดยนักพัฒนาอื่น ๆ อูบุนตูมาโดยเริ่มต้นด้วยสคริปต์ที่เรียกว่าon_ac_power/usr/bin/on_ac_powerซึ่งถูกเก็บไว้ใน อะแดปเตอร์ไฟฟ้าสามารถกล่าวถึงภายใต้ระบบย่อยที่แตกต่างกันในเคอร์เนล (ACPI หรือ APM) แต่สคริปต์นี้ทำให้งานของเราง่ายขึ้น - ผู้เขียนได้ครอบคลุมหลากหลายรูปแบบที่เป็นไปได้ ส่งคืนสถานะการออกเท่านั้นดังนั้นจึงเหมาะสำหรับใช้ในifคำสั่ง

ทำไมเป็นon_ac_powerทางเลือกที่ดี? เพราะมันขึ้นอยู่กับการตรวจสอบหลายระบบย่อย นอกจากนี้ยังให้คำสั่งที่ง่ายพอที่จะทำงานด้วย - ผลลัพธ์เป็นจริงหรือเท็จ

ดังนั้นเราจึงมีเครื่องมือตรวจจับการปรากฏตัว แต่สิ่งที่เกี่ยวกับตรรกะ? เราต้องสำรวจสถานะและตรวจสอบการเปลี่ยนแปลงในรัฐ สิ่งที่เราสามารถทำได้คือการเก็บสถานะทางออกของon_ac_powerและเปรียบเทียบสถานะปัจจุบันกับสิ่งที่เราบันทึกไว้อย่างต่อเนื่องเมื่อมีการเปลี่ยนแปลง - ส่งการแจ้งเตือนบันทึกสถานะอีกครั้งและทำการเปรียบเทียบอีกครั้งวนซ้ำ แนวคิดพื้นฐานคือการใช้ธง

ในระยะสั้นเราเริ่มต้นภาพรวมของรัฐและจากนั้นสำรวจความคิดเห็นอย่างต่อเนื่องสำหรับการเปลี่ยนแปลงจากภาพรวม; เมื่อมีการเปลี่ยนแปลงเกิดขึ้น - แจ้งและรีเซ็ตสแนปชอต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.