Comment puis-je obtenir une notification à l'écran à l'aide de notify-osd lorsque je branche/débranche le chargeur?
Certaines personnes ont signalé que ma précédente solution udev avait envoyé la notification trop souvent lorsque le câble d’alimentation était branché. Je ne pouvais pas reproduire cette copie, mais j’écrivais ce script python pour utiliser dbus au lieu de udev. Enregistrez-le en tant que fichier .py
quelque part sur votre disque dur. Marquez le fichier exécutable en lançant:
Sudo chmod +x yourFile.py
et ajoutez-le à vos applications de démarrage comme décrit ici . Ce script nécessite que le package acpi
soit 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()
Avec un peu d'expérimentation (et un peu d'aide), j'ai pu utiliser une règle dev pour accomplir cela. Certaines personnes ont signalé que la notification était parfois envoyée 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
en remplaçant some_user
par votre nom d'utilisateur. Marquez le fichier exécutable en lançant:
Sudo chmod +x /path/to/script.sh
en remplaçant /path/to/script.sh
par le chemin où vous avez enregistré le script.
Créez ensuite un fichier dans /etc/udev/rules.d
nommé 10-power.rules
avec 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"
en remplaçant à nouveau /path/to/script.sh
par le chemin du script que vous avez créé précédemment.
Rechargez maintenant les règles udev en lançant:
Sudo udevadm control --reload-rules
Débranchez le câble d'alimentation. Vous devriez recevoir une notification.
La commutation entre l'alimentation secteur et la batterie doit générer un événement sur le bus système D-Bus . Exécutez _dbus-monitor --system
_ et observez les événements générés sur votre système.
Si power 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.
Source du script
#!/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
Obtenir le script
Le script est également ajouté à mon github ; cette version sera mise à jour et développée un peu plus.
Vous pouvez l'obtenir en procédant comme suit:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Le script sera dans le répertoire /opt/sergrep
, nommé notify_ac_change.sh
Concept/Design
Les questions clés sont "Comment vérifier la présence de l'adaptateur secteur?" et "Comment détecter des modifications?"
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 secteur 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 renvoie uniquement le statut de sortie, il est donc approprié de l'utiliser dans les instructions if
.
Pourquoi on_ac_power
est-il un bon choix? Parce qu'il repose sur la vérification de plusieurs sous-systèmes. Il fournit également une commande assez simple pour travailler - 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 de on_ac_power
et de comparer en permanence l’état actuel à ce que nous avons enregistré, une fois que celui-ci a été modifié - envoyez une notification, enregistrez à nouveau l’état et continuez à comparer, en boucle. L'idée de base est l'utilisation de drapeaux.
En bref, nous initialisons un instantané de l'état, puis nous recherchons en permanence les modifications apportées à l'instantané. une fois que le changement a eu lieu - notifiez et réinitialisez l'instantané.