Bene, fornirò una risposta alla mia domanda, testata su Yosemite ma non ampiamente. Questo è il codice 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'
Non cercherò la sua accuratezza ma sembra funzionare. Dal momento che non conosco i componenti interni di Apple (sono nuovo di Mac OS X) ho invertito la progettazione con alcuni tentativi ed errori collegando e scollegando l'adattatore, sia durante il sonno che durante la veglia, per vedere quali voci del registro sono affidabili.
Noterai che ho provato a usare pmset -g log
per rilevare quando il potere è stato scollegato ma è inaffidabile. Al momento della disconnessione, la voce di registro è Summary- [System: DeclUser kDisp] Using Batt
, ma sfortunatamente la stessa voce di registro si verifica durante la sospensione mentre scollegata, quindi non è affidabile. Ho fatto ricorso a syslog
invece.
NOTA: riporta il tempo trascorso dall'ultimo evento non inserito. Questo potrebbe non essere quando la batteria è al 100%.
Potenziale problema: il codice sopra riportato prende il timestamp da syslog e le corrispondenze con pmset. Se pmset non ha una voce (qualsiasi voce) con lo stesso timestamp, allora non funzionerà. Questo non dovrebbe accadere, ma se lo fa, allora puoi convertire i timestamp in epoch secondi e rilevare il timestamp più vicino in pmset in questo modo.