Evento basado en el nivel de carga de la batería.

11

Todavía no he encontrado nada, así que esperaba que alguien aquí tuviera una idea.

Quiero comenzar incluso con una batería en una computadora portátil Apple que alcanza un cierto nivel de carga, o cuando la batería está completamente cargada.

Sé que puedo hacer que algo se ejecute periódicamente, verificar el nivel de batería y decidir qué hacer, pero prefiero un evento controlado si es posible.

Juggler defectuoso
fuente

Respuestas:

5

Power Manager no es gratuito, pero admite eventos de activación en función de los niveles de batería (interna o UPS). Los eventos pueden ejecutar scripts, iniciar aplicaciones o realizar tareas como cerrar.

Power Manager se basa en eventos y no sondea los cambios de batería.

En cambio, Power Manager se conecta a la capa IOKit de OS X y espera actualizaciones del hardware. Los eventos se pueden activar cuando nadie está conectado; No depende de un usuario activo.

Power Manager: ejecute un script con la batería restante

Las tareas integradas del Asistente de programación se centran en el rendimiento cuando la batería cae a un nivel particular, pero se pueden ajustar para verificar aumentos en el porcentaje de batería o el tiempo restante.

Estas dos publicaciones hablan sobre las fuentes de alimentación de UPS, pero se adaptan fácilmente a la batería interna de su MacBook:

Divulgación: Soy un ingeniero de software detrás de Power Manager.

Graham Miln
fuente
3

Quiero que esto esté basado en el sistema operativo, por lo que no necesito una conexión a Internet o un navegador abierto, etc. Simplemente es algo que puede suceder en segundo plano.

La forma más fácil de hacerlo sería con una aplicación, pero aquí se explica cómo hacerlo solo con comandos integrados del sistema operativo. Sé que quieres que sea impulsado por eventos, pero no estoy seguro de cómo lograrlo, así que aquí hay una forma de verificar el nivel de la batería, y luego hacer otra cosa si está por encima / por debajo de un umbral.

Puede considerar un launchdproceso, esta es básicamente una tarea programada que se ejecuta cada xminuto. A menudo son utilizados por usuarios avanzados, pero no son demasiado difíciles de configurar. Configura una tarea programada de lanzamiento con un archivo .plist que coloca en este directorio: Macintosh HD\Library\LaunchDaemonsy así es como estructura el archivo .plist;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Debug</key>
<true/>
<key>ExitTimeOut</key>
<integer>120</integer>
<key>Label</key>
<string>com.me.BatteryInfo</string>
<key>ProgramArguments</key>
<array>
    <string>/Users/yourusername/batt.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>

Si guardara ese archivo como com.me.BatteryInfoen la LaunchDaemonscarpeta mencionada anteriormente, crearía una tarea programada que se ejecuta cada 30 minutos. El número, 1800directamente arriba, </dict>es el tiempo en segundos de la frecuencia con la que desea que se ejecute la tarea. Donde dice <string>/Users/yourusername/batt.sh</string>es donde especifica qué script se ejecuta según lo programado. Debes irte <string>e </sting>intacto.

La línea <string>com.me.BatteryInfo</string>es el nombre único de la tarea programada. Si va a hacer más de uno, asegúrese de que cada .plist tenga un nombre único aquí.

Lo siguiente que debe hacer es cambiar la propiedad de .plist a root. Esto se requiere como una característica de seguridad (supongo que para detener el software / usuarios que crean tareas maliciosas programadas). Para cambiar la propiedad del archivo, haga sudo chown root \Library\LaunchDaemons\yourtask.plist(reemplace yourtask.plist con el nombre real del archivo del .plist que creó). Esta tarea le pedirá una contraseña.

Ahora necesita crear el script que se ejecutará periódicamente. Necesita hacer un archivo .sh (un script bash) para decirle a la computadora qué hacer. Para crear un archivo .sh, abra un editor de texto de programadores, como Sublime Text o Komodo Edit . NO use Text Edit, ya que a menudo agrega texto a sus archivos que interferiría con su script. La edición de texto no debería usarse realmente para el código.

Cree un script (archivo .sh) con el siguiente código;

#!/bin/sh

percent=$(ioreg -l | awk '$3~/Capacity/{c[$3]=$5}END{OFMT="%.3f";max=c["\"MaxCapacity\""];print(max>0?100*c["\"CurrentCapacity\""]/max:"?")}')

if [ $percent > 95 ]
    then
        echo 'charged.'
fi
exit 0

Reemplácelo echo 'charged.'con los comandos del terminal que le gustaría ejecutar cuando la batería esté cargada. open /Applications/Notes.appabrirá la aplicación de Notas; Puede cambiar el directorio para abrir una aplicación diferente.

$percent > 95Esto le indica a la siguiente línea que solo se ejecute cuando la batería está más que 95cargada. Puedes cambiar esto a lo que quieras. El nivel de batería aquí a menudo será ligeramente diferente al que se muestra en la barra de menú en la parte superior. Si desea "funcionar cuando la batería está completamente cargada", le recomiendo dejar esto como> 95 . Si desea que la tarea se ejecute cuando la batería esté por debajo del 20%, por ejemplo, cámbiela a$percent < 20

NOTA: Debido a que esta es una tarea programada, su secuencia de comandos se ejecutará cada xnúmero de minutos. Esto significa que si coloca open \Applications\Notes.appdentro de su script, la aplicación de Notes comenzará cada xminuto (si su batería está cargada)

Esta tarea se ejecutará incluso si nadie ha iniciado sesión.

Sé que hiciste esta pregunta hace un tiempo, pero espero que esto ayude a alguien.

José
fuente
2

Esto no es específico de Mac, pero Mozilla Aurora tiene una API incorporada que contiene una variedad de funciones relacionadas con la batería. Se puede detectar el estado de la batería (ya sea que se esté cargando o no), cuánto tiempo más tardará la batería en descargarse / cargarse y su nivel. Hay un ejemplo simple de cómo agregar un EventListener para llamar a una función cuando el nivel de la batería está en cierto punto.

Andrew Ng
fuente
Quiero que esto esté basado en el sistema operativo, por lo que no necesito una conexión a Internet o un navegador abierto, etc. Simplemente es algo que puede suceder en segundo plano.
FaultyJuggler