Comment puis-je recevoir une notification à l'aide de Notify-OSD lorsque le chargeur est inséré / retiré?


9

Comment puis-je recevoir une notification à l'écran à l'aide de notify-osd lorsque je branche / débranche le chargeur?


Je pourrais faire un script pour faire ça .. mais ce n'est pas une solution très élégante.
Seth

@Seth À quoi ressemblerait un tel script? Pourriez-vous l'afficher dans une réponse? Je suis particulièrement intéressé par la façon dont vous identifiez un événement "chargeur débranché" ...
landroni

@landroni Oh, je ne savais pas que tu n'étais pas l'OP. J'ai posté une réponse ci-dessous. Cela fonctionne bien pour moi, mais quelques-uns de mes amis ont des problèmes. Faites-moi savoir si cela ne fonctionne pas pour vous. Je travaille sur une meilleure façon que nous parlons.
Seth

@Seth Merci beaucoup d'avoir étudié cela. En l'occurrence, ma batterie est morte sur moi une mort très rapide, donc ma requête est un peu théorique maintenant. Mais je garderai cette solution à l'esprit pour l'avenir.
landroni

Réponses:


6

La commutation entre l'alimentation CA et l'alimentation par batterie doit générer un événement sur le bus système D-Bus . Exécutez dbus-monitor --systemet regardez quels événements sont générés sur votre système.

Si votre ordinateur est en cours d'exécution, vous recevez des notifications plus spécialisées de 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

Vous pouvez également obtenir des événements de acpi_listen.

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

Exécutez ce script lorsque vous souhaitez commencer à voir les notifications ou ajoutez-le au démarrage de votre session.


6

entrez la description de l'image ici entrez la description de l'image ici

dbus

Certaines personnes ont signalé que ma solution udev précédente avait envoyé la notification trop de fois lorsque le câble d'alimentation était branché. Je n'ai pas pu reproduire cela, mais j'ai écrit ce script python pour utiliser dbus au lieu d'udev. Enregistrez-le sous forme de .pyfichier quelque part sur votre disque dur. Marquez le fichier exécutable en exécutant:

sudo chmod +x yourFile.py  

et ajoutez-le à vos applications de démarrage comme décrit ici . Ce script nécessite que le package acpisoit installé.

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

Avec un peu d'expérimentation (et un peu d'aide), j'ai pu utiliser une règle udev pour accomplir cela. Certaines personnes ont signalé qu'il envoyait parfois la notification plusieurs fois, mais je n'ai eu aucun problème. YMMV.

Créez un script avec le contenu suivant:

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

remplacer some_userpar votre nom d'utilisateur. Marquez le fichier exécutable en exécutant:

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

en remplaçant /path/to/script.shpar le chemin d'accès à l'endroit où vous avez enregistré le script.

Créez ensuite un fichier dans /etc/udev/rules.dnamed 10-power.rulesavec le contenu:

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"

remplaçant à nouveau /path/to/script.shpar le chemin d'accès au script que vous avez créé précédemment.

Rechargez maintenant les règles udev en exécutant:

sudo udevadm control --reload-rules                              

Débranchez le câble d'alimentation. Vous devriez recevoir une notification.


Cela fonctionne, mais il nécessite un accès root et un mécanisme complexe pour obtenir la notification sur le bureau ou coder en dur l'utilisateur comme vous l'avez fait. Je pense que vous devrez également définirXAUTHORITY avec certains gestionnaires d'affichage tels que gdm.
Gilles 'SO- arrête d'être méchant'

@Gilles IMO "requiert root" et l'utilisateur codé en dur sont des idioties idiotes, mais j'ajouterai une solution cron plus tard pour être complet si vous pensez que c'est si important. Je suis jolie, cela fonctionne sous GDM, mais je vais vérifier.
Seth

1
Je jette également un œil à python-dbus et à l'API de messagerie dbus d'udev pour peut-être créer un démon qui fera la même chose que ces règles udev, mais le seul problème est qu'il devra être constamment exécuté et redémarrer sur n'importe quel échecs, quelque chose qui, à mon avis, ajoute une plus grande complexité à une solution déjà plutôt décente. S'il y a de meilleures solutions, cependant, je serais heureux de les entendre.
joshumax

Tout le monde n'exécute pas Ubuntu en tant que système mono-utilisateur. Cron n'est pas utile ici. Je sais que vous aviez besoin de l'étape supplémentaire pour trouver l'emplacement du fichier de cookies X des anciennes versions de Gdm, je ne sais pas pour les versions récentes mais je pense que cela n'a pas changé. Même problème avec KDM . @joshumax Vous pouvez obtenir les informations d'autres sources, et même via dbus, vous pouvez le faire à partir du shell avec dbus-monitor. Voir ma réponse.
Gilles 'SO- arrête d'être méchant'

2

Source de 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 

Obtenir le script

Le script est également ajouté à mon github ; cette version sera mise à jour et développée un tout petit peu plus.

Vous pouvez l'obtenir en procédant comme suit:

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

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

Le script sera dans le /opt/sergreprépertoire, nomménotify_ac_change.sh

Concept de design

Les questions clés sont "Comment vérifier la présence de l'adaptateur secteur?" et "Comment détectons-nous les changements?"

Eh bien, ce problème a été résolu il y a longtemps par d'autres développeurs. Ubuntu est livré par défaut avec un script appelé on_ac_power , qui est stocké dans /usr/bin/on_ac_power. L'adaptateur d'alimentation peut être mentionné sous différents sous-systèmes du noyau (ACPI ou APM), mais ce script simplifie notre travail - les auteurs ont couvert de nombreuses variantes possibles. Il ne renvoie que l'état de sortie, il est donc approprié pour une utilisation dans les ifinstructions.

Pourquoi est on_ac_power-ce un bon choix? Parce qu'il repose sur la vérification de plusieurs sous-systèmes. Il fournit également une commande suffisamment simple pour fonctionner - le résultat est vrai ou faux.

Nous avons donc un outil de détection de présence, mais qu'en est-il de la logique? Nous devons interroger la présence et détecter les changements dans l'état. Ce que nous pouvons faire est de stocker l'état de sortie on_ac_poweret de comparer en permanence l'état actuel avec ce que nous avons enregistré, une fois qu'il change - envoyer une notification, enregistrer à nouveau l'état et continuer à comparer à nouveau, en boucle. L'idée de base est l'utilisation de drapeaux.

En bref, nous initialisons un instantané de l'état, puis nous interrogeons continuellement les changements à partir de l'instantané; une fois le changement effectué - notifiez et réinitialisez l'instantané.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.