#!/usr/bin/env ruby
#
# info: print the expected minimum battery time left periodically
# settings
wait = 300
file_bat = "/sys/class/power_supply/BAT0/energy_now"
file_bat2 = "/sys/class/power_supply/BAT0/status"
file_data = "#{ Dir.home }/.#{ File.basename( $0 )[/^[^.]+/i] }_data.csv"
def time_human( sec )
res = nil
mul = 1.0
[ [60,"s"],
[60,"m"],
[24,"h"],
[30.4375,"d"],
[12,"mo"],
[-1,"y"] ].each{|time,text|
mul *= time
if sec < mul or time < 0
res = "#{ ( sec.to_f * time / mul ).round(1) }#{ text }"
break
end
}
return res
end
# load previous data if any
if File.exist?( file_data )
data = File.read( file_data ).split("\n").map{|x| x.split.map(&:to_f) }
else
data = []
end
print "expected minimum battery time left at every #{ time_human( wait ) }: "
# check energy decrease periodically
time_prev = nil
energy_prev = nil
loop {
time = Time.now.to_f
energy = File.read( file_bat ).to_i
status_ok = File.read( file_bat2 ).to_s[/discharging/i]
if data.size >= 2
# determine how much energy decreases in a second
d = data.map{|t,e| e.to_f / t.to_f }
# dividing energy by the upper limit of energy per second
m = d.sum / d.size.to_f
s = ( d.map{|x| ( x - m )**2 }.sum / d.size.to_f )**0.5
limit3 = energy / ( m + s * 3 ).to_f
# print info
print "#{ time_human( limit3 ) } "
end
if time_prev
time_diff = time - time_prev
energy_decrease = energy_prev - energy
# check if there was a time loss from shutdown or suspend
if time_diff < ( wait * 2 ) and energy_decrease > 0 and status_ok
# store new info permanently
f = File.open( file_data, "a" )
data << [ time_diff, energy_decrease ]
f.write( data.last.join("\t") + "\n" )
f.close
end
end
time_prev = time
energy_prev = energy
sleep wait
}
- sinexton blogja
- A hozzászóláshoz be kell jelentkezni
Hozzászólások
Közben 2 napja futtatom és 2.2 órát ír a laptop üzemidejére egy teljes feltöltés után a fenti kód az én felhasználási módommal. Erre a szoftveres becslése az oprendszernek néha 6 óra, néha 3 óra. Ez nem segít. Viszont a 2.2 óra az 3 szigmás megbízhatósággal van, így tudom hogy úton vagy bárhol töltés nélkül ennyi rendelkezésre állást mindenképpen várhatok a géptől. Ez egy erős alsó limit.
- A hozzászóláshoz be kell jelentkezni
Ez tetszik, lájkolom.
- A hozzászóláshoz be kell jelentkezni
Részlet infó: Normál eloszlású az energia csökkenések mértéke, ami várható volt (mert véletlen rezgések összege). Ezért a számítás helyes.
Ez 7 órányi akksiról használat 5 percenként mintavételezve az energia csökkenést. 1e6-al le van osztva az érték.
Monitorozni tervezem még automatizáltan az akksi amortizációt és jósolni a csere pontot.
- A hozzászóláshoz be kell jelentkezni