Laufzeit des Akkus herausfinden

  • Hallo möchte gerne herausfinden wie lange ein Akku bei einem Notebook hält,
    da wir viele gebrauchte Laptops verkaufen und dort mit angegeben werden
    soll, wie lange der Aku hält wollte ich ein Programm schreiben.

    Hänge jetzt aber schon an der Aktualisierung der GUI fest.
    Es sollen die Minuten gezählt werden, diese sollen in eine
    TXT-Datei geschrieben werden. Die man nach dem herunterfahren
    des Laptops, wenn der Akku leer ist, auslesen kann.
    Dabei habe ich mir gedacht, das in der GUI die Anzahl der Minuten
    und Prozentanzeige des Akkus stehen.

    Irgendwie aktualisiert sich die GUI aber nicht.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    $s = ""
    $battery= _BatteryQuery()

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    $Label1 = GUICtrlCreateLabel("", 176, 152, 120, 90)
    $Button1 = GUICtrlCreateButton("Button1", 56, 32, 81, 25, 0)
    GUISetState(@SW_SHOW)
    ;MsgBox(0,'', $battery[0])
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(0,'', $s)
    ;AdlibEnable("_batteryquery", 500)
    ;GUICtrlSetData($Label1,$battery[3] / 60)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    ExitLoop
    case $nMsg = $Button1
    ;AdlibEnable("_batteryquery", 500)
    GUICtrlSetData($Label1,$battery[3] / 60)
    MsgBox(0,'', $battery[3] /60)
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BatteryQuery()
    local $SystemPower, $ret, $array[4]
    ;GUICtrlSetData($Label1,$array[3] / 60)
    ; Setup $array and $SystemPower
    $SystemPower = DllStructCreate("ubyte;ubyte;ubyte;ubyte;ulong;ulong")
    If @error Then
    SetError(-1)
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; make the DllCall
    $ret = DllCall("kernel32.dll", "int", "GetSystemPowerStatus", "ptr", DllStructGetPtr($SystemPower))
    If @error Then;DllCall Failed
    SetError(-2)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not $ret[0] Then; GetSystemPowerStatus Failed
    SetError(-3)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Fill the array
    $array[0] = DllStructGetData($SystemPower, 1);AC
    $array[1] = DllStructGetData($SystemPower, 2);Battery Charge
    $array[2] = DllStructGetData($SystemPower, 3);Battery Charge %
    $array[3] = DllStructGetData($SystemPower, 5);Sec Battery Left

    [/autoit] [autoit][/autoit] [autoit]

    ; free the struct
    $SystemPower = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $array

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlSetData($Label1,$array[3] / 60)
    EndFunc ;==>_BatteryQuery

    [/autoit]

    Einmal editiert, zuletzt von Atom-As (24. März 2009 um 14:25)

  • Hey,

    muss er sich von selbst aktualisieren?

    Wenn ich deinen Code lese, dann aktualisiert er das ganze nur wenn du auf den Button klickst.

    Was von diesen beiden Dingen funktioniert nicht? ;)

    PS: ich hab selbst n Notebook, ich tests mal :D

    Gruß

    Prajoss

    Edit: Das Problem ist weniger das setzten des Labels, sondern eher dass sich Array[3] nie ändert ;)

    "Never touch a running System!"

    Einmal editiert, zuletzt von Prajoss (24. März 2009 um 09:09)

  • Du aktualisierst die Variable $battery nicht mehr. Du musst die in der While Schleife aktualisieren, zB so:

    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    ExitLoop
    case $nMsg = $Button1
    ;AdlibEnable("_batteryquery", 500)
    GUICtrlSetData($Label1,$battery[3] / 60)
    MsgBox(0,'', $battery[3] /60)
    EndSelect
    $battery = _BatteryQuery()
    Sleep(100) ; Um die CPU zu entlasten
    WEnd

    [/autoit]
  • Super!! Vielen Dank, da hätte man auch selber drauf kommen können

    So sieht es bis jetzt aus, jetzt muß ich noch herausfinden wie ich
    die Dauer einsetzte und in eine Datei speichere

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    $s = ""
    $battery= _BatteryQuery()

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    $Label1 = GUICtrlCreateLabel("1", 176, 152, 200, 90)
    $Label2 = GUICtrlCreateLabel("2", 176, 180, 200, 90)
    $Label3 = GUICtrlCreateLabel("3", 176, 210, 200, 90)
    $Label4 = GUICtrlCreateLabel("4", 176, 230, 200, 90)
    $Label5 = GUICtrlCreateLabel("4", 176, 230, 200, 90)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nmsg = $GUI_EVENT_CLOSE
    ExitLoop
    EndSelect
    GUICtrlSetData($Label2,"Dauer noch: " & $battery[3] / 60 & " Minuten")
    GUICtrlSetData($Label3,"Dauer noch: " & $battery[3] / 3600 & " Stunden")
    GUICtrlSetData($Label1,"Dauer noch: " & $battery[3] & " Sekunden")
    GUICtrlSetData($Label4,$battery[2] & "%")
    Select
    case BitAnd($battery[1],4)
    GUICtrlSetData($label5, "Kritisch")
    case BitAnd($battery[1],2)
    GUICtrlSetData($label5, "Niedrig")
    case BitAnd($battery[1],1)
    GUICtrlSetData($label5, "Hoch " & "(" & $battery[2] & "%)")
    EndSelect
    $battery= _BatteryQuery()
    Sleep(100) ; Um die CPU zu entlasten

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BatteryQuery()
    local $SystemPower, $ret, $array[4]
    $SystemPower = DllStructCreate("ubyte;ubyte;ubyte;ubyte;ulong;ulong")
    If @error Then
    SetError(-1)
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; make the DllCall
    $ret = DllCall("kernel32.dll", "int", "GetSystemPowerStatus", "ptr", DllStructGetPtr($SystemPower))
    If @error Then;DllCall Failed
    SetError(-2)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not $ret[0] Then; GetSystemPowerStatus Failed
    SetError(-3)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Fill the array
    $array[0] = DllStructGetData($SystemPower, 1);AC
    $array[1] = DllStructGetData($SystemPower, 2);Battery Charge
    $array[2] = DllStructGetData($SystemPower, 3);Battery Charge %
    $array[3] = DllStructGetData($SystemPower, 5);Sec Battery Left

    [/autoit] [autoit][/autoit] [autoit]

    ; free the struct
    $SystemPower = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $array

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_BatteryQuery

    [/autoit]
  • Die Aktualisierung machst du besser unabhängig von der While-Schleife:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Label[5]
    ; GUI
    GUICreate("Form1", 300, 140, 100, 100)
    For $i = 0 To 4
    $Label[$i] = GUICtrlCreateLabel("1", 20, 20+$i*20, 200, 20)
    Next
    $Level = GUICtrlCreateProgress(20,20+$i*20,260,10)
    GUISetState(@SW_SHOW)
    ;===============================================================================
    _Update()
    AdLibEnable("_Update",10000) ; alle Sekunden Daten Abfragen und die Anzeige aktualisieren

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}","_Exit") ; Programm beenden

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If GuiGetMsg() = $GUI_EVENT_CLOSE Then _Exit()
    Sleep(50) ; Um die CPU zu entlasten
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    ;===============================================================================
    Func _Update()
    Local $battery = _BatteryQuery()
    Local $sLabel
    GUICtrlSetData($Label[0], "Dauer noch: " & Round($battery[3] / 3600,2) & " Stunden")
    GUICtrlSetData($Label[1], "Dauer noch: " & Round($battery[3] / 60) & " Minuten")
    GUICtrlSetData($Label[2], "Dauer noch: " & Round($battery[3]) & " Sekunden")
    Select
    Case BitAND($battery[1], 4)
    $sLabel = "Kritisch"
    Case BitAND($battery[1], 2)
    $sLabel = "Niedrig"
    Case BitAND($battery[1], 1)
    $sLabel = "Hoch"
    EndSelect
    GUICtrlSetData($Label[3], $sLabel & " (" & $battery[2] & "%)")
    GUICtrlSetData($Level,$battery[2])

    [/autoit] [autoit][/autoit] [autoit]

    Switch $battery[0]
    Case 0
    $sLabel = "Offline"
    Case 1
    $sLabel = "Online"
    Case Else
    $sLabel = "Unknown status"
    EndSwitch
    GUICtrlSetData($Label[4], "AC Status: " & $sLabel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BatteryQuery()
    Local $SystemPower, $ret, $array[4]
    $SystemPower = DllStructCreate("ubyte;ubyte;ubyte;ubyte;ulong;ulong")
    If @error Then
    SetError(-1)
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; make the DllCall
    $ret = DllCall("kernel32.dll", "int", "GetSystemPowerStatus", "ptr", DllStructGetPtr($SystemPower))
    If @error Then;DllCall Failed
    SetError(-2)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not $ret[0] Then; GetSystemPowerStatus Failed
    SetError(-3)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Fill the array
    $array[0] = DllStructGetData($SystemPower, 1);AC
    $array[1] = DllStructGetData($SystemPower, 2);Battery Charge
    $array[2] = DllStructGetData($SystemPower, 3);Battery Charge %
    $array[3] = DllStructGetData($SystemPower, 5);Sec Battery Left

    [/autoit] [autoit][/autoit] [autoit]

    ; free the struct
    $SystemPower = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $array

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_BatteryQuery

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    juhu 8o mein Akku reicht noch 1120000 Stunden ... da kann ich mein Netzteil wohl nun entsorgen :D

    [EDIT]
    Hmm klar war auch im Betrieb mit Netzteil, vielleicht solltest du da ne Überprüfung auf Netzbetrieb einbauen.

    [EDIT2]
    Programm ein bisschen überarbeitet, wobei der Batterie Status unter Vista immer "Online" ist, oder habe ich da nen Fehler?

    Grüße
    Stilgar

    2 Mal editiert, zuletzt von Stilgar (24. März 2009 um 15:41)

  • WOW das sieht ja gut aus, habe es jetzt noch so gemacht,
    wie ich mir das gedacht habe. Teste es gerade:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Label[5]
    local $sek, $min, $std
    $sek = 0
    $min = 0
    $std = 0

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI
    GUICreate("Form1", 300, 140, 100, 100)
    For $i = 0 To 4
    $Label[$i] = GUICtrlCreateLabel("1", 20, 20+$i*20, 200, 20)
    Next
    $Level = GUICtrlCreateProgress(20,20+$i*20,260,10)
    $zeit3 = GUICtrlCreateLabel("1", 230, 40, 100, 20)
    $zeit2 = GUICtrlCreateLabel("1", 230, 60, 100, 20)
    $zeit1 = GUICtrlCreateLabel("1", 230, 80, 100, 20)
    GUICtrlCreateLabel("Läuft seit:", 230, 20, 100, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ;===============================================================================
    _Update()
    ;sek()
    AdLibEnable("_Update",1000); alle Sekunden Daten Abfragen und die Anzeige aktualisieren
    ;AdlibEnable("sek",1000)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}","_Exit") ; Programm beenden

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If GuiGetMsg() = $GUI_EVENT_CLOSE Then _Exit()
    Sleep(50) ; Um die CPU zu entlasten
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    ;===============================================================================
    Func _Update()
    Local $battery = _BatteryQuery()
    Local $sLabel
    GUICtrlSetData($Label[0], "Dauer noch: " & Round($battery[3] / 3600,2) & " Stunde(n)")
    GUICtrlSetData($Label[1], "Dauer noch: " & Round($battery[3] / 60) & " Minuten")
    GUICtrlSetData($Label[2], "Dauer noch: " & Round($battery[3]) & " Sekunden")
    Select
    Case BitAND($battery[1], 4)
    $sLabel = "Kritisch"
    Case BitAND($battery[1], 2)
    $sLabel = "Niedrig"
    Case BitAND($battery[1], 1)
    $sLabel = "Hoch"
    EndSelect
    GUICtrlSetData($Label[3], $sLabel & "(" & $battery[2] & "%)")
    GUICtrlSetData($Level,$battery[2])

    [/autoit] [autoit][/autoit] [autoit]

    Switch $battery[0]
    Case 0
    $sLabel = "Offline"
    Case 1
    $sLabel = "Online"
    Case Else
    $sLabel = "Unknown status "
    EndSwitch
    GUICtrlSetData($Label[4], "AC Status: " & $sLabel)
    if $sLabel = "online" then
    GUICtrlSetData($Label[0], "Dauer noch: Netzteil angeschlossen")
    GUICtrlSetData($Label[1], "Dauer noch: Netzteil angeschlossen")
    GUICtrlSetData($Label[2], "Dauer noch: Netzteil angeschlossen")
    GUICtrlSetData($Label[3], $sLabel & " (" & $battery[2] & "%) LADEND")
    EndIf


    $sek = $sek +1
    if $sek = 60 Then
    $sek = 0
    $min = $min +1
    if $min = 60 Then
    $min = 0
    $std = $std + 1
    EndIf
    EndIf

    GUICtrlSetData($zeit1, $sek & " Sekunden")
    GUICtrlSetData($zeit2, $min & " Minuten")
    GUICtrlSetData($zeit3, $std & " Stunden")
    ;sleep(1000)
    FileOpen("c:\test.txt",2)
    Filewrite("c:\test.txt", $std & " Stunden " & $min & " Minuten " & $sek & " Sekunden")
    fileclose("c:\test.txt")


    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BatteryQuery()
    Local $SystemPower, $ret, $array[4]
    $SystemPower = DllStructCreate("ubyte;ubyte;ubyte;ubyte;ulong;ulong")
    If @error Then
    SetError(-1)
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; make the DllCall
    $ret = DllCall("kernel32.dll", "int", "GetSystemPowerStatus", "ptr", DllStructGetPtr($SystemPower))
    If @error Then;DllCall Failed
    SetError(-2)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not $ret[0] Then; GetSystemPowerStatus Failed
    SetError(-3)
    $SystemPower = 0
    Return $array
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Fill the array
    $array[0] = DllStructGetData($SystemPower, 1);AC
    $array[1] = DllStructGetData($SystemPower, 2);Battery Charge
    $array[2] = DllStructGetData($SystemPower, 3);Battery Charge %
    $array[3] = DllStructGetData($SystemPower, 5);Sec Battery Left

    [/autoit] [autoit][/autoit] [autoit]

    ; free the struct
    $SystemPower = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $array

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_BatteryQuery

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func sek()

    $sek = $sek +1
    if $sek = 60 Then
    $sek = 0
    $min = $min +1
    if $min = 60 Then
    $min = 0
    $std = $std + 1
    EndIf
    EndIf

    GUICtrlSetData($zeit1, $sek & " Sekunden")
    GUICtrlSetData($zeit2, $min & " Minuten")
    GUICtrlSetData($zeit3, $std & " Stunden")
    sleep(1000)
    FileOpen("c:\test.txt",2)
    Filewrite("c:\test.txt", $std & " Stunden " & $min & " Minuten " & $sek & " Sekunden")
    fileclose("c:\test.txt")
    EndFunc

    [/autoit]
  • Hi, wenn ich das richtig verstanden hab, dann willst du mit dem prog nur herrausfinden, wie lange der akku hält.

    Mein Tipp:
    Guck mal bei google, gib die bezeichnung des Labtops ein und guck mal was raus kommt.
    Meist findet man schon nach wenigen Sekunden Information zu dem angegeben labtop.
    Darunter sind meist auch infos über den akku...

  • Schon richtig, es sind aber keine neue Laptops, sondern Leasingrückläufer
    und da ist der Akku schon in gebraucht gewesen.