Mac OS X: informe sobre la batería desde la última vez que desconectó la CA, pero excluye el tiempo de suspensión

1

¿Existe una aplicación o comando existente para informar el tiempo de batería desde que la computadora portátil se desconectó por última vez de la CA pero excluye el tiempo que se gasta durante la suspensión de la batería?

Esto se puede inferir de pmset -g log , así que estoy buscando una manera de hacerlo sin usar una aplicación que permanezca residente para detectar eventos de conexión / desconexión.

    
pregunta Normadize 14.03.2015 - 22:06

1 respuesta

1

Bueno, daré una respuesta a mi propia pregunta, probada en Yosemite pero no extensivamente. Este es el código bash:

#!/bin/bash
humantime () { printf -v $1 "%dh%02dm%02ds" $(($2/3600)) $((($2/60)%60)) $(($2%60)); }
#unplugged='pmset -g log | grep 'Summary- \[System: DeclUser.*\] Using Batt' | tail -1 | cut -f1,2 -d' ''
unplugged='syslog -u -k Sender loginwindow | grep 'magsafeStateChanged state changed old 1 new 2' | tail -n 1 | cut -f1 -dZ'
onbatt=$(('date +%s' - 'date -j -f "%Y-%m-%d %H:%M:%S" "$unplugged" +%s'))
slept='pmset -g log | sed -n "/^$unplugged/,//p" | awk '/Entering Sleep.*[0-9]+ secs/ {n=split($0,a," ");sum+=a[n-1]} END {print sum}''
[[ -z $slept ]] && slept=0
awake=$((onbatt-slept))
humantime hawake $awake
humantime hslept $slept
printf "Awake on battery for $hawake (%.1f%%)\n" 'echo "$awake*100/$onbatt" | bc -l'
printf "Slept on battery for $hslept (%.1f%%)\n" 'echo "$slept*100/$onbatt" | bc -l'

No responderé por su precisión, pero parece funcionar. Como no conozco las partes internas de Apple (soy nuevo en Mac OS X), hice una ingeniería inversa con algunas pruebas y errores al enchufar y desenchufar el adaptador, tanto mientras está dormido como despierto, para ver qué entradas de registro son confiables.

Notarás que intenté usar pmset -g log para detectar cuándo se desconectó la alimentación, pero no es confiable. Al desenchufarlo, la entrada del registro es Summary- [System: DeclUser kDisp] Using Batt , pero desafortunadamente la misma entrada del registro ocurre durante la suspensión mientras está desenchufada, por lo que no es confiable. Recurrí a syslog en su lugar.

NOTA: Esto informa el tiempo transcurrido desde el último evento desconectado. Esto puede no ser cuando la batería estaba al 100%.

Problema potencial: el código anterior toma la marca de tiempo de syslog y compara con pmset. Si pmset no tiene una entrada (ninguna entrada) en la misma marca de tiempo, no funcionará. Eso no debería suceder, pero si lo hace, entonces puede convertir las marcas de tiempo a la época segundos y detectar la marca de tiempo más cercana en pmset de esa manera.

    
respondido por el Normadize 15.03.2015 - 02:33

Lea otras preguntas en las etiquetas