Script para controlar los ciclos de carga y descarga de la batería de tu Laptop

Dicen los que saben, que para mantener en buen estado la batería de litio de una Laptop, se debe conectar a la corriente cuando está en un 40% de descarga, y desconectar cuando tiene un 80% de carga.

Muchos fabricantes, incluyen en el bios la opción de “desactivar” el flujo de corriente hacia la batería cuando llega a un determinado porciento, y que el equipo solo use la corriente a partir de ese momento, sin embargo, en mi caso particular, mi Lenovo IdeaPad U510 no tiene esa opción.

No conozco en Linux ninguna aplicación que haga esto a nivel de Software, o que tan solo nos notifique cuando la batería llega a un % en específico, por lo que decidí crear un pequeño Script que me notifica cuando necesito conectar y desconectar la corriente.

Requisitos del Script para controlar los ciclos de carga y descarga de la batería de tu Laptop

Lo primero que necesitamos es tener instalado el paquete acpi en nuestro ordenador. En mi caso como uso ArchLinux solo tengo que ejecutar:

$ sudo pacman -S acpi

¿Para que necesitamos ACPI? Pues para saber el estado de nuestra batería. Si lo ejecutamos nos devuelve algo como esto:

leni :: ~ » acpi
Battery 0: Discharging, 76%, 02:20:07 remaining

Lo siguiente es crear el fichero que ejecutará la notificación, en mi caso, lo puse dentro de la carpeta ~/.bateria, y lo nombré bat_notificacion.sh. Adentro le puse lo siguiente:

#!/bin/bash
#
# -*- ENCODING: UTF-8 -*-
# Este programa es software libre. Puede redistribuirlo y/o
# modificarlo bajo los términos de la Licencia Pública General
# de GNU según es publicada por la Free Software Foundation,
# bien de la versión 2 de dicha Licencia o bien (según su
# elección) de cualquier versión posterior.
#
# Si usted hace alguna modificación en esta aplicación,
# deberá siempre mencionar al autor original de la misma.
#
# DesdeLinux.net CC-BY-SA 2015
# Autor: ELAV <elav@desdelinux.net> <http://www.systeminside.net>

# Obtenemos el estado de la batería, pero solamente el porciento:
BATERIA=`acpi | awk '{print $4}'`

# Pasamos al estado a un fichero de texto:
echo $BATERIA > tmp_bateria.txt

# Eliminamos información innecesaria del fichero de texto:
RESULTADO=`cut -c 1-2 tmp_bateria.txt`

if [ $RESULTADO -ge 80 ]; then
        notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Desconecta la corriente eléctrica por favor"
elif [ $RESULTADO -le 40 ]; then
        notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Conecta la corriente eléctrica por favor"
else
    $BATERIA > /dev/null

fi

Cómo funciona el Script para controlar los ciclos de carga y descarga de la batería de tu Laptop

La explicación de como funciona está adentro, pero lo explico brevemente.

Primero, usando awk extraigo solamente el valor del porciento de la batería, lo cual me devuelve algo como 76%,. Este resultado lo paso a un fichero de texto para posteriormente, eliminar los caracteres innecesarios dejando solamente el valor numérico.

Le damos los permisos necesarios al fichero:

$ chmod a+x ~/.bateria/bat_notificacion.sh

Como ArchLinux usa SystemD y no tiene el viejo crontab, me instalo cronie. Ahora editamos el crontab para que el script esté chequeando el estado de la batería todo el tiempo.

$ crontab -e

Y le añado adentro:

# Revisión de la Batería
* *     * * *   cd /home/elav/.bateria/ && ./bat_notificacion.sh

Y listo, cuando el porciento de la batería sea igual o menor de 40%, o sea igual o mayor que 80%, obtendré una notificación como esta:

Y esto es todo.. Cualquier aporte que quieran hacer, sugerencia de código y demás, pueden hacerlo mediante mi repositorio en Bitbucket.


32 comentarios

  1.   Derpie dijo

    Muy bueno, me gustaria probarlo pero uso mas que todo un equipo de escritorio :/
    una duda, ¿donde queda guardado el archivo temporal?. Si queda por ejemplo en el home ¿se podria ponerle un punto adelante para no tener que verlo? 😛

    1.    elav dijo

      Bueno, en mi caso como yo ejecuto el script dentro de una carpeta oculta en el home, no tengo ese problema. El archivo temporal se aloja junto el script.. 😀

  2.   NaM3leSS dijo

    Esta bueno el script pero he leído acerca del tema de la batería en los portátiles, y aún no me queda claro el tema de desconectar o no la batería cuando esta cargada al 100%.
    Vaya que llevo más de 2 años con un Lenovo y no tengo problemas (toco madera) :v
    En fin sería bueno que alguien explicará si es verdad o es solo un mito el tema de la batería.
    Saludos!

    1.    BlackNeto dijo

      Yo tengo una laptop Dell Inspiron, que ya va para los cuatro años, trato de siempre tenerla conectada, y la bateria todavía le dura cerca de una hora sin conectar (dependiendo claro del trabajo). Creo que es un excelente consejo, voy a tratar de instalarlo… Saludos

  3.   Staff dijo

    Si tienes systemd (sin mayúsculas, error que yo también he cometido) puedes usar timers y no hay necesidad de instalar terceras aplicaciones.

    https://wiki.archlinux.org/index.php/Systemd/Timers#As_a_cron_replacement

    Sobre la batería, tengo entendido que la propia circuitería de la batería de litio desconecta la carga al llegar al limite, sin depender del SO, de lo contrario explosión segura 🙂
    Y es que, si para proteger la vida de la batería tengo usar solo el 40% de su capacidad siempre, seria lo mismo que tener una batería dañada.
    Hay que desconectar el cargador cuando llegue al 100% o poco antes, pero solo para evitar lo que se conoce como “estresar” la batería (iniciar y terminar el proceso de carga rápida y constantemente entre el 99% y el 100%).

    1.    elav dijo

      Pues en realidad no sé, hay muchas opiniones diferentes y no sé a quién hacerle caso.

      1.    rain dijo

        pues es tu pc usa lo que prefieras pero siempre es bueno conocer diferentes formas de hacerlo 🙂

      2.    rain dijo

        pues es tu pc usa lo que prefieras, siempre habra gente que diga que es mejor usar x cosa en vez de y por blah blah blah.

        y en linux si que hay muchas formas de hacer lo mismo xD

        aproposito de alternativas
        una alternativa acpi desde el kernel 2.6 para saber la carga es:
        cat /sys/class/power_supply/BAT1/capacity

  4.   rain dijo

    hay quienes les gusta tener que todas las tareas programadas esten unificadas en un solo archivo. En vez de crear un archivo por cada una de estas.

    a mi me parece un poco excesivo xD

    1.    elav dijo

      Si te refieres al cron de systemd a ni me parece excesivo, me parece una mierda pinchada en un palo. Vaya forma de complicarse la vida uno.

  5.   koprotk dijo

    Yo no soy ningun experto, pero aquí hay documentación muy buena respecto al tema:

    http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries

    http://batteryuniversity.com/learn/article/charging_lithium_ion_batteries

    Saludos

  6.   ThecaTTony dijo

    Está muy buena la idea, se agradece.

    Habría que adaptar el script con el dato sobre la carga de la batería que paso rain en los comentarios, eliminando la dependencia sobre acpi.
    Lo que le veo raro es que una vez que se pasan los límites establecidos empiezan a llegar notificaciones repetidas ¿verdad? De ser así se debería agregar un control adicional, ej:

    #!/bin/sh
    BATLVL=$(cat /sys/class/power_supply/BAT0/capacity)
    if [ $BATLVL -ge 80 ]; then
    if [ ! -a /tmp/batwarn ]; then
    notify-send –urgency=critical –expire-time=5000 –app-name=Bateria –icon=battery “Notificacion de Bateria” “Desconecta la corriente eléctrica por favor” ;
    touch /tmp/batwarn ;
    fi
    elif [ $BATLVL -le 40 ]; then
    if [ ! -a /tmp/batwarn ]; then
    notify-send –urgency=critical –expire-time=5000 –app-name=Bateria –icon=battery “Notificacion de Bateria” “Conecta la corriente eléctrica por favor”
    touch /tmp/batwarn ;
    fi
    else
    if [ -a /tmp/batwarn ]; then
    rm -f /tmp/batwarn ;
    fi
    fi

    (Lo de arriba no se probó, aunque creería que funciona ok)

    Saludos!”

    1.    elav dijo

      Gracias por el aporte, lo pruebo ahora mismo y te digo.

  7.   edu dijo

    Alguien sabe como controlar y suavizar la temperatura de la portátil?, es que la temperatura sube a mas de 40 Grados Centígrados y consume mucho mas recurso de la maquina al momento de mirar un vídeo en youtube.

    1.    pep dijo

      Limpiar el ventilador puede ayudar, por ejemplo con un aspirador. Desmontarlo para limpiarlo y depende de tus habilidades y que estés seguro de lo que haces.

      Las bases con ventilador también vienen bien, pero que el ventilador sea lo más grande posible, ya que moverá más aire.
      Hace unos años, con un dell xps, sin la base era imposible trabajar. Según se calentaba se volvía más lento, y más se calentaba. Con una base con un ventilador conseguía que funcionase muy decentemente.

      Espero que te sea útil.

  8.   Gonzalo Martínez dijo

    Muy buen script!

    Yo lo que hacía era dejar cargar al 100, la sacaba y la usaba con corriente directo. La batería la usaba cuando no tenia corriente cerca.

    Ahora con Mac no puedo 🙁

  9.   Luciano Lagassa dijo

    hola, muy buena tu idea, te comento que tenia la misma idea en mente, ahora me puse a ver tu script y lo adapte y modifique para que solo te alerte cuando corresponde. te paso el resultado.

    ESTADO=acpi | awk '{print $3}'
    NUMERO=acpi | awk '{print $4}' | cut -c 1-2
    echo $ESTADO $NUMERO%
    if [ "$ESTADO"=="Discharging," ]
    then
     if [ $NUMERO -le 40 ]
     then
      notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Conecta la corriente eléctrica por favor"
     fi
    elif [ "$ESTADO"=="Charging," ]
    then
     if [ $NUMERO -ge 80 ]
     then
      notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Desconecta la corriente eléctrica por favor"
     fi
    fi
    1.    elav dijo

      Genial, aunque a sugerencia de algunos comentarios y demás, ahora mismo lo tengo así:

      #!/bin/bash
      #
      # -*- ENCODING: UTF-8 -*-
      # Este programa es software libre. Puede redistribuirlo y/o
      # modificarlo bajo los términos de la Licencia Pública General
      # de GNU según es publicada por la Free Software Foundation,
      # bien de la versión 2 de dicha Licencia o bien (según su
      # elección) de cualquier versión posterior.
      #
      # Si usted hace alguna modificación en esta aplicación,
      # deberá siempre mencionar al autor original de la misma.
      #
      # DesdeLinux.net CC-BY-SA 2015
      # Autor: ELAV  
      
      BATLVL=$(cat /sys/class/power_supply/BAT1/capacity)
      
      if [ $BATLVL -ge 80 ]; then
      
          if [ ! -a /tmp/batwarn ]; then
              notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificación de Batería" "Desconecta la corriente eléctrica por favor" ;
              touch /tmp/batwarn ;
          elif [ $BATLVL -le 40 ]; then
      
              if [ ! -a /tmp/batwarn ]; then
                  notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificación de Batería" "Conecta la corriente eléctrica por favor"
                  touch /tmp/batwarn ;
              fi
          else
              if [ -a /tmp/batwarn ]; then
                  rm -f /tmp/batwarn ;
              fi
         fi     
      fi
      1.    xxxtonixxx dijo

        Lo que no entiendo es la necesidad de crear un fichero vacío que no almacena ningún valor ni tampoco es necesario almacenar nada ya que lo que examinas lo necesitas examinar en el momento que se ejecuta el script y no después ni tampoco comparar valores ni nada por el estilo. Pienso que crear un fichero no es la mejor opción. ¿Lo estás creando para tomarlo como punto de control o algo para que no se ejecute más de una vez o algo por el estilo?

    2.    Luciano Lagassa dijo

      hola, el fuente que pase tenia unos errores ya lo tengo mas limpio, parece funcionar muy bien.

      ESTADO=acpi | awk '{print $3}'
      NUMERO=acpi | awk '{print $4}' | cut -c 1-2
      if expr match "$ESTADO" "Discharging"
      then
       echo "Descargando $NUMERO%"
       if [ $NUMERO -le 40 ]
       then
        echo "Conecta la corriente eléctrica por favor"
        notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Conecta la corriente eléctrica por favor"
       fi
      elif expr match "$ESTADO" "Charging"
      then
       echo "Cargando  $NUMERO%"
       if [ $NUMERO -ge 80 ]
       then
        echo "Desconecta la corriente eléctrica por favor"
        notify-send --urgency=critical --expire-time=5000 --app-name=Bateria --icon=battery "Notificacion de Bateria" "Desconecta la corriente eléctrica por favor"
       fi
      fi
  10.   jony127 dijo

    Hola, eso que comentas es mas una leyenda urbana que otra cosa. Yo hace poco me compré un portátil y me puse a buscar información sobre ese tema, conclusión: cargar siempre la batería al 100% y también descargarla lo máximo posible antes de cargarla de nuevo.

    La batería tiene x ciclos de carga de vida útil, por lo tanto, entre más la cargas mas reduces esa vida útil.

    Yo he contactado con servicio técnico de fujitsu y motorola y ambos me dijeron lo que comento arriba. Ningún fabricante te va a recomendar que cargues la batería solo hasta un 80% o que no la dejes descargar por debajo de x porcentaje pues eso es erróneo repito, lo mejor es aprovechar toda la capacidad de la batería tanto en carga como en descarga.

    Además usando los límites que propones haría que tuviéramos que cargar la batería cada poco tiempo y eso tampoco tiene mucho sentido digo yo ?no?

    Quita ese script pues la batería se usa como explico arriba.

    Saludos

  11.   Armando Ocio dijo

    Un tema muy interesante, para mí la notificación me parece algo muy útil, es una característica que se puede implementar en cualquier distro.
    Alguien la ha implementado en Linux MInt? sería interesante ver como ha funcionado.

    1.    Slimbook Team dijo

      Buenas,
      Para Linux Mint puedes usar el de Ubuntu, lo tienes aquí:
      https://slimbook.es/tutoriales/linux/45-script-linux-para-avisar-de-batearia-cargada
      Un saludo,
      Slimbook Team

  12.   Toño dijo

    Hombre que buen blog este,lo acabo de descubrir,llevo unos 15 dias probando Ubuntu y me parace todo muy interesante,rápido y…en fin , me esta gustando mucho este mundillo,y este blog de los que e visitado me parece ,creo,el mejor.

  13.   FredericLinux dijo

    Bueno pss yo cree JBattery hace unos cuantos meses, es una app java que permite de modo gráfico hacer lo mismo, además en su mas reciente version permite conocer hasta el estado de salud de la bateria. pueden conocer el proyecto en

    http://niconsystem.zz.mu/proyectos/jbattery

    1.    elav dijo

      Interesante

  14.   David dijo

    He aprendido varias cosas con tu script. Sobre las baterías te han comentado varios puntos interesantes ya, pero anotare varios aspectos que opino son importantes acerca de las baterías. Soy aficionado al radiocontrol, las baterías Lipo que usamos son más delicadas pero muy similares a las de Litio usadas en portátiles, en nuestro medio somos y debemos ser bastante más cautelosos con las baterías, son algo más peligrosas(LiPo) y nos cuestan un ojo de la cara, por lo que nos interesa mantenerlas en buen estado.

    1.- No se debe nunca descargar en exceso, ni sobrecargar. Esto lo controla bien la circuitería de tu portátil, de otra forma no sería seguro y los fabricantes tendrían más de un susto y retirada del mercado. Por eso cualquier dispositivo con baterías de Litio se apaga solo cuando le queda poca batería (móviles por ejemplo). Cuando en la carga llegan al 100% mantienen una corriente mínima de mantenimiento. (fijaros en un móvil como cuando llega al 100% el calor se reduce). En portátiles modernos toman la corriente preferentemente de la entrada de corriente en vez de la batería cuando está enchufado, por lo que no debería ser problema mantenerlo enchufado aunque esté en el 100%. Eso si, para mantener una buena salud de la batería sería bueno evitar que llegue a apagarse por haber llegado al mínimo, pero 40% sería excesivo. Pienso que con un 10-15% sería suficiente.

    2.- El calor degrada mucho estas baterías, es preferible cargarlo y usarlo en un sitio fresco, es probable que os tarde menos en cargar en un sitio fresco que en uno caluroso, por no hablar de la descarga. El problema es que los portátiles se calientan bastante, si lográis reducir la temperatura os durará algunos minutos más.

    3.- Cuando más reduzcamos la cantidad de veces que cargamos la batería mejor. Las baterías de calidad tienen una vida útil aproximada de unos 1000 ciclos de carga o más. Si la habéis tratado bien os durará más, si ha sido tratada duramente se reducirá su vida útil antes. Fijaros como al cabo de unos años la batería de los móviles o portátiles cada vez duran menos. Si cargamos de 20% a 100% os durará bastante más que de 40 a 80%.

    4.- La circuitería interna de los portátiles modernos dejan configurar el perfil de uso de la batería, si mayormente conectado a la toma de corriente o en modo portátil. Si vais a estar conectados a la corriente configurad ese método (lamentablemente los software del fabricante que hacen esto solo vienen para windows, pero puede que se pueda establecer en la BIOS), el caso es que en modo enchufado lo que hace es desconectar la carga cuando llega al 80%, por que es como se mantiene y conserva mejor cuando una batería no está en uso. La carga empieza cuando la batería baja de unos 40%. Es mi configuración preferente, tan solo he de tener en cuenta que si en cualquier momento necesitas su uso desenchufado la cantidad inicial de la batería estará en 80%. Si la ponéis en modo portátil entonces la cargará hasta el 100% pero también si no recuerdo mal no la empezará a cargar de nuevo hasta que baje de un valor mínimo (quizá entre 40 y 60%), por lo que podríais trabajar enchufados perfectamente con este modo si soléis moveros bastante con el.

    5.- La tecnología actual suele ser de Litio, por lo que no sufren de efecto memoria, ya no tiene sentido esas opciones que habían hace muchos años en las bios que hacían varios ciclos de carga/descarga para sanear o intentar recuperar la batería. Eso tenía más sentido en las de Níquel Cadmio y en menor medida las de Níquel Metal Hidruro pero no en las de Litio (Lithium, Life, Lipo).

    6.- Si tenéis en cuenta lo dicho en el punto 1 y 3, no dejéis las baterías descargadas por mucho tiempo, ya que poco a poco se van descargando. Este script sería un buena manera de avisar si tenéis el portátil con la batería en “modo portátil” y vais a dejarlo mucho tiempo sin usar, por lo que lo ideal sería dejar la batería entorno al 80-85% de carga, ya que es como mejor mantienen la carga con el paso del tiempo y en realidad es como os debería llegar cuando lo comprasteis en su día.

    Como nota sabed que el último 5%(95-100%) de la batería cuesta bastante más en cargar, por lo que si tenéis prisa en iros con el muchas veces no valdrá la pena esperar a que llegue al 100% por solo un 5%.

    Un saludo,
    David.

    1.    elav dijo

      Excelente explicación.. muchas gracias

  15.   Fabián dijo

    Buenas tardes estoy tratando de editar tu scrip aumentando hint con la finanidad de reproducir un sonido como las demas notificaciones, pero no lo reproduce, me pueden ayudar diciendome q estoy haciendo mal.
    ejemplo.

    notify-send -h string:sound-file:/usr/share/sounds/KDE-Sys-Error-Printing.ogg “prueba” “Esto es una prueba de notificación con sonido”

  16.   Diego dijo

    Buenas…
    Mas que un cut

    RESULTADO=cut -c 1-2 tmp_bateria.txt

    ¿no se debería hacer un tr?

    RESULTADO=tr "%," " " < tmp_bateria.txt

    Sino con el cut, si la batería esta en 100 te la va a tomar por 10 ( -c 1-2) y va a pedir que conectes.
    Ah… me contesto solo. Con este script en funcionamiento nunca deberias llegar al 100 🙂 Como es mi caso en este momento con el adaptador conectado :p
    Gracias.

  17.   Mario dijo

    Hola. Excelente script, estoy pensando en hacer algo similar, pero en lugar de eso utilizar el controlador electrónico de carga que se encarga por ejemplo de cuando la batería llega al 100% deja de enviarle cargar y toma la energía directamente de la fuente. De tal forma que se elija por.ejemplo cargar hasta el 80℅ y cuando llegué a ese nivel, el controlador deje de enviar energía a la batería y que tome sólo la corriente de la fuente, sin necesidad de estar conectado y desconectando, gastando innecesariamente ciclos y a la vez que la.bateria siempre este trabajando en los rangos que evitan su degradación prematura

  18.   Jose Alberto Chavez Alvarez dijo

    Disculpa crees que se pueda hacer que el script pueda activar un relevador para que desactive la carga de la laptop y activarlo cuando este a un nivel de carga bajo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.