Switch batteria -> cavo e viceversa!

Il mio notebook ha dei problemi con UDev/Upower in quanto quando inserisco o tolgo il cavo il gestore alimentazione non mi riconosce questi eventi.

È un problema che ho riscontrato su Ubuntu, Debian, Gentoo ed Archlinux e quindi con svariate versione di UDev/Upower ma sono finalmente riuscito a trovare una soluzione per questo fastidioso bug :)

Se anche voi siete afflitti da questo problema vi basterà creare uno script:

1
nano -w /home/$USER/SwitchBattery.sh
nano -w /home/$USER/SwitchBattery.sh

contenente il seguente codice (se usi YAD):

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
pass=$(yad --class="GSu" \
--title="Password" \
--text="Enter '$USER' password:" \
--image="dialog-password" \
--entry --hide-text --separator="")
if [ $? != 0 ];then
exit 0
fi
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null
#!/bin/bash
pass=$(yad --class="GSu" \
--title="Password" \
--text="Enter '$USER' password:" \
--image="dialog-password" \
--entry --hide-text --separator="")
if [ $? != 0 ];then
exit 0
fi
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null

oppure il seguente (se usi Zenity):

1
2
3
4
5
6
7
8
9
#!/bin/bash
pass=$(zenity \
--title="Password" \
--text="Enter '$USER' password:" \
--entry --hide-text)
if [ $? != 0 ];then
exit 0
fi
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null
#!/bin/bash
pass=$(zenity \
--title="Password" \
--text="Enter '$USER' password:" \
--entry --hide-text)
if [ $? != 0 ];then
exit 0
fi
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null

oppure questo se non vuoi inutili ”fronzoli”:

1
2
3
4
#!/bin/bash
echo "Inserisci PWD:"
read -rs pass
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null
#!/bin/bash
echo "Inserisci PWD:"
read -rs pass
echo $pass | sudo -S udevadm trigger --subsystem-match=power_supply &>/dev/null

Infine rendiamo eseguibile il file con:

1
chmod +x /home/$USER/SwitchBattery.sh
chmod +x /home/$USER/SwitchBattery.sh

 

PS: su Archlinux ho dovuto modificare il file sudoers per permettere all’utente non root di eseguire quel comando. Se vi interessa basta procedere in questo modo:

su
visudo

E ho quindi aggiunto questa riga:

%wheel ALL=(ALL) /usr/bin/udevadm

 

Enjoy:D

17 pensieri su “Switch batteria -> cavo e viceversa!

  1. 4javier

    Hai controllato se alla disconnessione del cavo almeno il kernel genera un evento? E se viene notificato ad Udev? Potrebbe darsi che sollevi un evento differente da quello che upower si aspetta.

    Replica
    1. Polslinux Autore articolo

      Mi succede questo:
      DA staccato AD attaccato:
      [ 1823.380506] EXT4-fs (sda1): re-mounted. Opts: user_xattr,acl,barrier=1,data=ordered,commit=0
      [ 1823.409020] NMI watchdog enabled, takes one hw-pmu counter.
      [ 1823.409061] NMI watchdog enabled, takes one hw-pmu counter.
      [ 1823.412423] NMI watchdog enabled, takes one hw-pmu counter.
      [ 1823.415792] NMI watchdog enabled, takes one hw-pmu counter.
      [ 1823.511721] ehci_hcd 0000:00:1a.0: setting latency timer to 64
      [ 1823.708237] ehci_hcd 0000:00:1d.0: setting latency timer to 64
      [ 1825.647661] EXT4-fs (sda1): re-mounted. Opts: commit=0

      DA attaccatto A staccato:
      [ 1876.213007] EXT4-fs (sda1): re-mounted. Opts: commit=600
      [ 1876.736399] EXT4-fs (sda1): re-mounted. Opts: user_xattr,acl,barrier=1,data=ordered,commit=60

      Replica
  2. 4javier

    Qualcosa viene notificato, infatti pm-utils rileva il cambiamento e modifica l’intervallo di flush coerentemente. Bisogna vedere perchè il resto non funzioni. Di preciso quale programma dovrebbe reagire alla dis/connessione del cavo? Sarebbe meglio se controllassi gli eventi sollevati da udev tramite udevadm monitor.

    Replica
    1. Polslinux Autore articolo

      Il programma che dovrebbe reagire sono i power-manager di gnome e kde!
      Riguardo a udevadm monitor ecco l’output quando INSERISCO il cavo:

      KERNEL[2895.968221] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2895.975357] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2899.615469] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2899.615980] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2899.621635] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2899.631920] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2899.639475] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      KERNEL[2899.639690] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      UDEV [2899.640286] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      UDEV [2899.640425] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)

      e questo quando LO TOLGO:

      KERNEL[2936.537698] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2936.540289] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2936.544835] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      UDEV [2936.545142] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      KERNEL[2936.545441] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      UDEV [2936.545589] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      KERNEL[2936.545790] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      UDEV [2936.546004] change /devices/pci0000:00/0000:00:02.0/backlight/acpi_video0 (backlight)
      KERNEL[2936.644102] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2936.644636] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2936.646674] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2936.649198] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2936.661615] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      KERNEL[2936.662168] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2936.664318] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
      UDEV [2936.667129] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

      Replica
      1. 4javier

        Come vedi viene sollevato un change sul device BAT0, che è parte del sottosistema power_supply, in entrambi i casi. È esattamente ciò che fa il tuo script, non capisco perchè senza non funzioni. :/
        Non capisco neppure perchè l’azione venga ripetuta così tante volte…
        Potresti provare a vedere cosa risponde udevadm monitor al”esecuzione del tuo script.

        Replica
        1. Polslinux Autore articolo

          Già non ci capisco nulla nemmeno io…mah!
          Comunque questo è quello che avviene quando avvio il mio script:

          KERNEL[18933.636786] change /devices/LNXSYSTM:00/device:00/ACPI0003:00/power_supply/AC (power_supply)
          UDEV [18933.638757] change /devices/LNXSYSTM:00/device:00/ACPI0003:00/power_supply/AC (power_supply)
          KERNEL[18933.639434] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
          UDEV [18933.642650] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

          Replica
          1. 4javier

            Ah…ora i conti tornano. Pensavo che il device fosse uno solo, BAT0, con due stati. Invece i device sono due, suppongo mutualmente esclusivi. Mi pare di capire quindi, che il sistema senza il tuo script gestisca solo il device riferito alla batteria, ma non quello relativo all’alimentazione di rete. Potresti postare marca e modello del tuo notebook?

          2. 4javier

            Il tempo di dirlo…che mi ero dimenticato di questo post :D
            Prova a caricare il modulo ac, e poi a vedere se la dis/connessione del cavo viene notificata:
            modprobe ac

          3. Polslinux Autore articolo

            Da ATTACCATO a STACCATO:

            KERNEL[3422.450926] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3422.452872] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            KERNEL[3422.780524] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            KERNEL[3422.781284] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3422.784166] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3422.787309] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

            E da STACCATO ad ATTACCATO:

            KERNEL[3489.171159] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3489.173960] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            KERNEL[3494.391463] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            KERNEL[3494.392159] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3494.394138] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
            UDEV [3494.397359] change /devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

            Ovviamente con ac modprobbato :)

          4. Polslinux Autore articolo

            Cioè la cosa strana è che viene visto correttamente da acpi l’evento batteria e quello ac (ovvero inseriti o meno)…solo che i power manager non si accorgono che lo stato del cavo è inserito o non inserito…e non capisco perché dato che acpi lo segnala correttamente..

          5. 4javier

            acpi segnala solo il cambiamento dell’alimentazione per ciò che concerne la batteria, ma come vedi non dice nulla riguardo al cavo (lo so che la logica vorrebbe, che o è uno o è l’altro, ma per udev non è così).

  3. 4javier

    Ho appena letto che il modulo ac dovrebbe venir caricato di default dagli initscript di arch, quindi non credo possa essere cambiato qualcosa. Provaa postare dmesg nel momento in cui s/colleghi il cavo.

    Replica

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *


*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">

Ricevi un avviso se ci sono nuovi commenti. Oppure iscriviti senza commentare.