Laptop akksi hátralévő idő számítás (Linux)

Pontosabban és testre szabottabban számítom magamnak automatikusan a gépem minimum várható hátralévő idejét. Hasonlóan, mint amit E-autókhoz írtam. Ahogy telik az idő, úgy lesz egyre pontosabb és felhasználási módra hajlított.

Miért nem jó a rendszer által kijelzett érték? Mert engem a hosszabb távon várható érték érdekel. Ha például elviszem magammal a gépem és úton kell dolgoznom, akkor látni akarom hogy nagy eséllyel minimum mennyi munkára elég az én szokásaimnak megfelelően. Kulcsszó a minimum. Mely ha túl kevésre csökken, akkor korábban kérek akksi cserét, növelve ezzel a kiszámíthatóságot.

Ruby script folyamatosan fut és csak 5 percenként terheli minimálisan a CPU-t. Bármikor megszakítható, tudja folytatni a pontosítást a mentett adatokból. Suspend mellett is jól működik.

#!/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
}

Hozzászólások

Szerkesztve: 2022. 12. 03., szo – 15:17

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.

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.

https://imgur.com/D2pMROs

Monitorozni tervezem még automatizáltan az akksi amortizációt és jósolni a csere pontot.