जब चार्जर डाला / हटाया जाता है तो मैं नोटिफ़-ओएसडी का उपयोग करके एक सूचना कैसे प्राप्त कर सकता हूँ?


9

जब मैं चार्जर को प्लग / अनप्लग करता हूं, तो मैं नोटिफ़िकेशन-ओएसडी का उपयोग करके ऑन-स्क्रीन अधिसूचना कैसे प्राप्त कर सकता हूं?


मैं ऐसा करने के लिए एक स्क्रिप्ट बना सकता था .. लेकिन यह बहुत ही सुंदर समाधान नहीं है।
सेठ

@ सेठ ऐसी स्क्रिप्ट कैसी लगेगी? क्या आप इसे उत्तर में पोस्ट कर सकते हैं? मुझे विशेष रूप से दिलचस्पी है कि आप "चार्जर अनप्लग्ड" ईवेंट की पहचान कैसे करते हैं ...
लैंड्रोनी

@landroni ओह, महसूस नहीं किया कि आप ओपी नहीं थे। मैंने नीचे एक उत्तर पोस्ट किया। यह मेरे लिए ठीक काम करता है लेकिन मेरे कुछ दोस्तों के मुद्दे हैं। मुझे पता है अगर यह आपके लिए काम नहीं करता है। जैसे ही हम बोलते हैं मैं बेहतर तरीके से काम कर रहा हूं।
सेठ

@ सेठ इस में देखने के लिए बहुत बहुत धन्यवाद। जैसा कि होता है, मेरी बैटरी मुझ पर बहुत जल्दी मर गई, इसलिए मेरी क्वेरी अब तक थोड़ी मूट है। लेकिन मैं भविष्य के लिए इस समाधान को ध्यान में रखूंगा।
लैंडरोनी

जवाबों:


6

एसी पावर और बैटरी पावर के बीच स्विच करने से डी-बस सिस्टम बस पर एक घटना उत्पन्न होनी चाहिए । चलाएं 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

कुछ लोगों ने रिपोर्ट किया कि मेरे पहले के udv समाधान ने कई बार अधिसूचना भेजी थी जब पावर केबल को प्लग किया गया था। मैं इसे पुन: पेश नहीं कर सका, लेकिन मैंने udv के बजाय dbus का उपयोग करने के लिए इस पायथन स्क्रिप्ट को लिखा। इसे .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

थोड़ा प्रयोग (और थोड़ी मदद) के साथ मैं इसे पूरा करने के लिए एक udv नियम का उपयोग करने में सक्षम था । कुछ लोगों ने बताया है कि यह कभी-कभी अधिसूचना को एक से अधिक बार भेजता है लेकिन मुझे कोई समस्या नहीं हुई है। 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आपके द्वारा पहले बनाई गई स्क्रिप्ट के पथ के साथ फिर से प्रतिस्थापित करना।

अब चलकर udv नियमों को फिर से लोड करें:

sudo udevadm control --reload-rules                              

पावर केबल को अनप्लग करें। आपको एक अधिसूचना प्राप्त करनी चाहिए।


यह काम करता है, लेकिन डेस्कटॉप पर अधिसूचना प्राप्त करने के लिए इसे रूट एक्सेस और जटिल मशीनरी की आवश्यकता होती है, या उपयोगकर्ता को हार्ड-कोडिंग करना जैसा आपने किया था। मुझे लगता है कि आपको कुछ प्रदर्शन प्रबंधकों जैसे कि जीडीएम के साथ भी सेटXAUTHORITY करना होगा।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स IMO को "रूट की आवश्यकता है" और हार्ड कोडित उपयोगकर्ता बहुत मूर्खतापूर्ण नाइटपिक्स हैं, लेकिन मैं पूर्णता के लिए बाद में क्रोन समाधान जोड़ूंगा यदि आपको लगता है कि यह महत्वपूर्ण है। मैं सुंदर हूं कि यह GDM के तहत काम करता है लेकिन मैं दोबारा जांच करूंगा।
सेठ

1
मैं भी अजगर-डब और udev के डबस मैसेजिंग एपीआई पर एक नज़र डाल रहा हूं कि शायद एक ऐसा डेमॉन बनाया जाए जो इन udv नियमों के समान काम करेगा, लेकिन एकमात्र समस्या यह है कि इसे लगातार चलाने और किसी भी पर पुनरारंभ करने की आवश्यकता होगी विफलताओं, कुछ ऐसा है जो मेरा मानना ​​है कि पहले से ही सभ्य समाधान के लिए जटिलता की एक उच्च मात्रा जोड़ता है। यदि कोई बेहतर उपाय हैं, तो, मुझे उन्हें सुनकर खुशी होगी।
2

हर कोई उबंटू को एकल-उपयोगकर्ता प्रणाली के रूप में नहीं चलाता है। क्रोन यहाँ उपयोगी नहीं है। मुझे पता है कि आपको जीडीएम के पुराने संस्करणों के एक्स कुकी फ़ाइल के स्थान को खोजने के अतिरिक्त चरण की आवश्यकता थी, मुझे हाल के संस्करणों के बारे में नहीं पता है लेकिन मुझे लगता है कि यह नहीं बदला है। केडीएम के साथ भी यही समस्या है । @joshumax आप अन्य स्रोतों से जानकारी प्राप्त कर सकते हैं, और यहां तक ​​कि डब के माध्यम से, आप इसे शेल से कर सकते हैं 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 

स्क्रिप्ट मिल रही है

स्क्रिप्ट को मेरे गितुब में भी जोड़ा गया है ; उस संस्करण को अद्यतन किया जाएगा और एक छोटे से अधिक विकसित किया जाएगा।

आप इसे निम्न करके प्राप्त कर सकते हैं:

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

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

स्क्रिप्ट /opt/sergrepडायरेक्टरी में होगी , जिसका नाम हैnotify_ac_change.sh

संकल्पना रचना

प्रमुख प्रश्न हैं "हम एसी एडाप्टर की उपस्थिति की जांच कैसे करते हैं?" और "हम परिवर्तनों का पता कैसे लगाते हैं?"

खैर, इस मुद्दे को अन्य डेवलपर्स द्वारा बहुत पहले हल किया गया है। उबंटू डिफ़ॉल्ट रूप से on_ac_power नामक एक स्क्रिप्ट के साथ आता है , जिसे अंदर संग्रहीत किया जाता है /usr/bin/on_ac_power। पावर एडाप्टर को कर्नेल (एसीपीआई या एपीएम) में अलग-अलग उप प्रणालियों के तहत उल्लेख किया जा सकता है, लेकिन यह स्क्रिप्ट हमारे काम को सरल बनाती है - लेखकों ने बहुत सारे संभावित बदलावों को कवर किया है। यह केवल निकास स्थिति लौटाता है इसलिए यह ifबयानों में उपयोग के लिए उपयुक्त है ।

on_ac_powerअच्छा विकल्प क्यों है ? क्योंकि यह कई सबसिस्टम की जाँच पर निर्भर करता है। यह काम करने के लिए सरल पर्याप्त आदेश भी प्रदान करता है - परिणाम या तो सच है या गलत है।

इस प्रकार हमारे पास उपस्थिति का पता लगाने वाला उपकरण है, लेकिन तर्क के बारे में क्या? हमें राज्य में उपस्थिति का पता लगाने और परिवर्तन का पता लगाने की आवश्यकता है। हम क्या कर सकते हैं बाहर निकलने की स्थिति को स्टोर करने के लिए on_ac_powerऔर वर्तमान स्थिति की तुलना करें कि हमने क्या बचाया है, एक बार जब यह बदल जाता है - अधिसूचना भेजें, स्थिति को फिर से सहेजें, और फिर से तुलना करते रहें, लूपिंग। मूल विचार झंडे का उपयोग है।

संक्षेप में, हम राज्य के एक स्नैपशॉट को आरंभीकृत करते हैं, और फिर स्नैपशॉट से परिवर्तन के लिए लगातार चुनाव करते हैं; एक बार परिवर्तन होने पर - स्नैपशॉट को सूचित और रीसेट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.