Come posso ricevere una notifica utilizzando Notify-OSD quando il caricabatterie viene inserito / rimosso?


9

Come posso ottenere una notifica sullo schermo usando notify-osd quando collego / scollego il caricabatterie?


Potrei creare una sceneggiatura per farlo .. ma non è una soluzione molto elegante.
Seth,

@Seth Come sarebbe simile una sceneggiatura del genere? Potresti postarlo in una risposta? Sono particolarmente interessato al modo in cui identifichi un evento "caricatore non collegato" ...
Landroni

@landroni Oh, non avevo capito che non eri l'OP. Ho pubblicato una risposta qui sotto. Funziona bene per me, ma alcuni dei miei amici stanno avendo problemi. Fammi sapere se non funziona per te. Sto lavorando su un modo migliore mentre parliamo.
Seth

@Seth Grazie mille per aver esaminato questo. Accade che la mia batteria si sia esaurita molto rapidamente, quindi ormai la mia domanda è un po 'controversa. Ma terrò a mente questa soluzione per il futuro.
landroni,

Risposte:


6

Il passaggio tra alimentazione CA e batteria dovrebbe generare un evento sul bus di sistema D-Bus . Esegui dbus-monitor --systeme guarda quali eventi vengono generati sul tuo sistema.

Se hai il potenziamento in esecuzione, ricevi notifiche più specializzate da 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

Puoi anche ricevere eventi da acpi_listen.

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

Esegui questo script quando desideri iniziare a visualizzare le notifiche o aggiungilo all'avvio della sessione.


6

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

dbus

Alcune persone hanno riferito che la mia precedente soluzione udev ha inviato la notifica troppe volte quando è stato collegato il cavo di alimentazione. Non sono riuscito a riprodurlo ma ho scritto questo script Python per utilizzare dbus anziché udev. Salvalo come .pyfile da qualche parte sul tuo disco rigido. Contrassegnare il file eseguibile eseguendo:

sudo chmod +x yourFile.py  

e aggiungilo alle tue applicazioni di avvio come descritto qui . Questo script richiede l' acpiinstallazione del pacchetto .

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

Con un po 'di sperimentazione (e un piccolo aiuto) sono stato in grado di utilizzare una regola udev per raggiungere questo obiettivo. Alcune persone hanno riferito che a volte invia la notifica più di una volta, ma non ho avuto problemi. YMMV.

Crea uno script con i seguenti contenuti:

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

sostituendo some_usercon il tuo nome utente. Contrassegnare il file eseguibile eseguendo:

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

sostituendo /path/to/script.shcon il percorso in cui è stato salvato lo script.

Quindi creare un file nel /etc/udev/rules.dnome 10-power.rulescon il contenuto:

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"

sostituendolo nuovamente /path/to/script.shcon il percorso dello script creato in precedenza.

Ora ricarica le regole di udev eseguendo:

sudo udevadm control --reload-rules                              

Scollegare il cavo di alimentazione. Dovresti ricevere una notifica.


Funziona, ma richiede l'accesso come root e macchine complesse per ottenere la notifica sul desktop o codificare l'utente come hai fatto tu. Penso che dovrai anche impostareXAUTHORITY con alcuni display manager come gdm.
Gilles 'SO- smetti di essere malvagio'

@Gilles IMO "richiede root" e l'utente hard coded è abbastanza stupido, ma aggiungerò una soluzione cron in seguito per completezza se pensi che sia così importante. Sono piuttosto che funziona sotto GDM ma ricontrollerò.
Seth

1
Sto anche dando un'occhiata all'API di messaggistica python-dbus e udev per creare forse un demone che farà la stessa cosa di queste regole udev, ma l'unico problema è che dovrà essere costantemente in esecuzione e riavviare su qualsiasi fallimenti, qualcosa che credo aggiunge una maggiore complessità a una soluzione già piuttosto decente. Se ci sono soluzioni migliori, comunque, sarei felice di ascoltarle.
joshumax,

Non tutti usano Ubuntu come sistema a utente singolo. Cron non è utile qui. So che hai bisogno del passaggio aggiuntivo per trovare la posizione del file X cookie versioni precedenti di Gdm, non conosco le versioni recenti ma penso che questo non sia cambiato. Lo stesso problema con KDM . @joshumax Puoi ottenere le informazioni da altre fonti e, anche tramite dbus, puoi farlo dalla shell con dbus-monitor. Vedi la mia risposta
Gilles 'SO- smetti di essere malvagio'

2

Fonte dello script

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

Ottenere la sceneggiatura

La sceneggiatura viene anche aggiunta al mio github ; quella versione verrà aggiornata e sviluppata un po 'di più.

Puoi ottenerlo nel modo seguente:

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

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

Lo script sarà nella /opt/sergrepdirectory, denominatonotify_ac_change.sh

Concetto / Design

Le domande chiave sono "Come controlliamo la presenza dell'adattatore CA?" e "Come rileviamo le modifiche?"

Bene, questo problema è stato risolto molto tempo fa da altri sviluppatori. Ubuntu viene fornito di default con uno script chiamato on_ac_power , che è archiviato in /usr/bin/on_ac_power. L'adattatore di alimentazione può essere citato in diversi sottosistemi nel kernel (ACPI o APM), ma questo script semplifica il nostro lavoro: gli autori hanno trattato molte possibili varianti. Restituisce solo lo stato di uscita, quindi è appropriato per l'uso nelle ifistruzioni.

Perché è on_ac_poweruna buona scelta? Perché si basa sul controllo di più sottosistemi. Fornisce inoltre un comando abbastanza semplice su cui lavorare: il risultato è vero o falso.

Quindi abbiamo uno strumento di rilevamento della presenza, ma per quanto riguarda la logica? Dobbiamo sondare la presenza e rilevare il cambiamento nello stato. Ciò che possiamo fare è memorizzare lo stato di uscita on_ac_powere confrontare continuamente lo stato corrente con ciò che abbiamo salvato, una volta modificato: invia una notifica, salva di nuovo lo stato e continua a confrontare nuovamente, eseguendo il ciclo. L'idea di base è l'uso delle bandiere.

In breve, inizializziamo un'istantanea dello stato e quindi eseguiamo continuamente il polling per il cambiamento dall'istantanea; una volta avvenuta la modifica: notifica e ripristina l'istantanea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.