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.