Como posso obter uma notificação usando o Notify-OSD quando o carregador é inserido / removido?

9

Como posso obter uma notificação na tela usando o notify-osd quando eu conecto / desconecto o carregador?

    
por kernel_panic 29.10.2014 / 03:39

3 respostas

6

A alternação entre a energia CA e a energia da bateria deve gerar um evento no barramento de sistema D-Bus . Execute dbus-monitor --system e observe quais eventos são gerados em seu sistema.

Se você tiver upower em execução, receberá notificações mais especializadas em 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

Você também pode obter eventos em acpi_listen .

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

Execute este script quando quiser começar a ver as notificações ou adicione-o à inicialização da sua sessão.

    
por Gilles 01.04.2015 / 04:14
6

dbus

Algumas pessoas relataram que minha solução anterior do udev enviou a notificação muitas vezes quando o cabo de alimentação estava conectado. Eu não consegui reproduzir isso, mas escrevi este script python para utilizar o dbus em vez do udev. Salve-o como um arquivo .py em algum lugar no seu disco rígido. Marque o arquivo executável executando:

sudo chmod +x yourFile.py  

e adicione-o aos seus aplicativos de inicialização conforme descrito aqui . Este script requer que o pacote acpi esteja instalado.

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

Com um pouco de experimentação (e uma pequena ajuda), pude utilizar uma regra udev para realizar isso . Algumas pessoas relataram que às vezes envia a notificação mais de uma vez, mas eu não tive nenhum problema. YMMV.

Crie um script com o seguinte conteúdo:

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

substituindo some_user pelo seu nome de usuário. Marque o arquivo executável executando:

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

substituindo /path/to/script.sh pelo caminho para onde você salvou o script.

Em seguida, crie um arquivo em /etc/udev/rules.d chamado 10-power.rules com o conteúdo:

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"

novamente substituindo /path/to/script.sh pelo caminho do script criado anteriormente.

Agora recarregue as regras do udev executando:

sudo udevadm control --reload-rules                              

Desconecte o cabo de energia. Você deve receber uma notificação.

    
por Seth 01.04.2015 / 03:46
2

Origem do 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 

Como obter o script

O script também é adicionado ao meu github ; essa versão será atualizada e desenvolvida um pouquinho mais.

Você pode consegui-lo fazendo o seguinte:

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

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

O script estará no diretório /opt/sergrep , denominado notify_ac_change.sh

Conceito / Design

As principais questões são "Como verificamos a presença do adaptador AC?" e "Como detectamos as alterações?"

Bem, esse problema foi resolvido há muito tempo por outros desenvolvedores. O Ubuntu vem por padrão com um script chamado on_ac_power , que é armazenado em /usr/bin/on_ac_power . O adaptador de energia pode ser mencionado em diferentes subsistemas no kernel (ACPI ou APM), mas esse script torna nosso trabalho mais simples - os autores cobriram muitas variações possíveis. Ele retorna apenas o status de saída, portanto, é apropriado para uso nas instruções if .

Por que on_ac_power é uma boa escolha? Porque depende da verificação de vários subsistemas. Também fornece comando simples o suficiente para trabalhar - o resultado é verdadeiro ou falso.

Assim, temos uma ferramenta de detecção de presença, mas e a lógica? Precisamos pesquisar a presença e detectar mudanças no estado. O que podemos fazer é armazenar o status de saída de on_ac_power e comparar continuamente o estado atual com o que salvamos, uma vez que ele muda - envia uma notificação, salva o status novamente e continua comparando novamente, dando um loop. Idéia básica é o uso de bandeiras.

Em suma, inicializamos um instantâneo do estado e, em seguida, pesquisamos continuamente por alterações a partir do instantâneo; uma vez que ocorrer a mudança - notifique e redefina o instantâneo.

    
por Sergiy Kolodyazhnyy 11.03.2016 / 20:05