AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Akkumanagement (Notifications)

Ein Thema von himitsu · begonnen am 5. Feb 2024 · letzter Beitrag vom 13. Feb 2024
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#1

Akkumanagement (Notifications)

  Alt 5. Feb 2024, 14:36
Gab es nicht mal eine Message (Broadcast), wenn sich der Akkustand (Prozent) ändert?
Die Restzeit wird jedenfalls nur bei Änderung neu berechnet (durch Windows).
MSDN-Library durchsuchenGetSystenPowerStatus

Mir ist so, als hätte ich ich da früher z.B. ein WM_POWERBROADCAST empfangen.
Win7/Win10/Win11, auch ohne sich vorher für eine Notification registrieren zu müssen, oder sowas.

Bei Netzteil anstecken/abziehen da kommt was rein, aber nicht bei Änderungen den Akkus.
(bei Standby und Co kommen auch viele Messages nicht an, in neueren Windowsen, aber das ist ja dokumentiert)

Aktuell habe ich einen Timer, der das aktualisiert, aber mir war, als ginge das mal automatisch, bei Änderung.
Anhang: https://www.delphipraxis.net/214584-...ml#post1533022
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Feb 2024 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Mantrid

Registriert seit: 6. Jun 2022
Ort: Deutschland
25 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Akkumanagement (Notifications)

  Alt 5. Feb 2024, 15:14
Hier sind noch Informationen https://learn.microsoft.com/de-de/wi...ry-information


Das geht über https://learn.microsoft.com/de-de/wi...eviceiocontrol

Laufzeit steht unter BatteryEstimatedTime


Wie man das aber genau programmiert, bin ich noch am testen, komme aber im Moment nicht weiter.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#3

AW: Akkumanagement (Notifications)

  Alt 5. Feb 2024, 15:53
Jupp, das Chaos der letzten Jahre mal bissl aufräumen ... wollte vor 'ner Weile ein/zwei Projekte machen, wo aber nichts so lief wie es sollte.
Drum versuche ich aktuell das Ganze in einer Test/Demo-App zum Laufen zu bringen und mal zusammenzufassen.


OK, bei IOCRL war ich jetzt noch garnicht vorbeigekommen.
Als Nächstes hatte ich einige Notifications geplant, wo man sich jeweils über GUIDs registriert. (wurde aber durch das Nicht-Aktualisierungsproblemchen aufgehalten)

Werde das IOCTL dann wohl aber erstmal angehn.
BATTERY_WAIT_STATUS und BATTERY_REPORTING_SCALE sieht aber so aus, wie im CallNrPowerInfo->Batter<State.

Aber das sind ja auch wieder "nur" Abfragen.
Was ich grade vermisse ist ja eine Notofocation, wo mir Windows sagt "Hey, die Batterie hat sich verändert ... schau dir mal die aktuellen Werte an" (anstatt da ständig mit einem Timer zu pollen)


Nervig war, dass ich zuletzt über paar Bugs in der alten WinAPI im Delphi stoperte, sowie dass Vieles einfach fehlt (und dann auch noch Schweigen oder gar Fehler in der Doku von Microsoft, beim Versuch so Einiges selbst nach Delphi zu übersetzen),
zuletzt dann die Hoffnung der neuen WinAPI, aber das sieht ja noch katastrophaler aus.
https://www.delphipraxis.net/214473-...vor-winmd.html


OHH, ein Problem mit großen Server-CPUs.

TThread.ProcessorCount sagt 32, aber eigentlich sind es 63 Kerne.
Und dann schlägt natürlich der Abruf der "ProcessorInfo" fehl, da der Array-Speicher zu gering reserviert wurde.




PS: Youtube im Firefox deaktiert die Monitor- und Standbytimeouts, siehe ExecutionState. (während der Wiedergabe)

Was mir auch noch aufgefallen war:
* im Taskmanager die %-Werte im Details-Tab stimmen oft garnicht (System ausgelastet, aber dort kein Prozess mit Auslastung zu sehn)
* auch stimmen oft die Werte unter Prozesse und Details nicht überein

* NtPowerInfo gibt mir die Frequenzen der Kerne (über WMI kommt man auch an sowas)
* aber im Taskmanager ... k.A. was der anzeigt ... hier z.B. unter "Leistung" oben rechts beim Namen 2.7 GHz, unten Basistakt 2,9 GHz (OK, WinServer2006 nennt es "Maximale Geschwindigkeit")
aber die großgeschriebene "aktuelle" Geschwindigkeit zeigt was an, das nichtmal annähernd dem ausProcessorInfo übereinstimmt (einzelner Kern, Minimal, Maximal, Durchschnitt oder sonstwas)


Die Laufzeit hab ich. Bei SystemPowerStatus sieht man auch das, was Windows überall anzeigt. (oben dei LifeTime)
OK, es stimmt nicht immer mit der Batterie überein (unten BatteryState), bzw. oben hängt etwas hinterher (aber egal, so lange es oben mit den Windows-Anzeigen korrespondiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Feb 2024 um 18:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#4

AW: Akkumanagement (Notifications)

  Alt 5. Feb 2024, 19:13
Für's DeviceIoControl mußt du dir erstmal über die SetupAPI den DeviceNamen für's CreateFile besorgen, um dessen Handle dann dafür nutzen zu können-

https://github.com/MicrosoftDocs/win...ery-devices.md
https://gist.github.com/ahawker/9715872

Schade, dass unser foreneigener SetupAPI-Guru schon vor vielen Jahren dahingeschieden ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 00:32
Hallo,
ev. das hier?

https://learn.microsoft.com/de-de/wi...ectedfrom=MSDN

oder eher das hier
https://www.codeproject.com/Articles...mputer-s-Power
Heiko

Geändert von hoika ( 6. Feb 2024 um 00:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#6

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 10:32
Zumindest das Log für PBT_POWERSETTINGCHANGE hatte ich schon drin.
RegisterPowerSettingNotification aber noch nicht implementiert.

Aber, wie gesagt, ich bin mir eigentlich fast sicher, früher in einem anderen Projekt, auch schonmal eine Message bekommen zu haben, wenn sich die Akku-Prozente ändern, auch ohne diese Registrierung.


IOCRL: Da Delphi keine "leeren" statischen Arrays kennt, ließ sich der Code anfangs nicht zum Laufen bringen, da SizeOf einen falschen anderen Wert bring, als die API verlangt.


Ich weiß grad garnicht, ob ich für codeproject.com ein Login hab, um mir die Demo mal anzusehn.
Angehängte Dateien
Dateityp: 7z PowerManagement.7z (80,7 KB, 2x aufgerufen)
Dateityp: 7z PowerManagement.exe.7z (797,7 KB, 2x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Feb 2024 um 10:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 10:41
Du könntest über WMI den Status abfragen und Änderungsevents anfordern.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#8

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 16:46
Mal wieder mein "Lieblingchatbot"
Zitat von Frage:
Gibt es unter Windows eine Message oder einen Broadcast, der meldet, wenn sich der Ladezustand des Akkus verändert?
Zitat von Antwort:
Ja, Windows kann Änderungen des Akkuzustands erkennen und darauf reagieren. Die spezifischen Mechanismen hängen von der Hardwaretopologie des Systems ab¹.

In Systemen, die einen eingebetteten Controller verwenden, führt Windows Abfragen durch und wird über die eingebettete ACPI-Controllerschnittstelle über das Energiesubsystem informiert¹. In Systemen, die einen Akkuladecontroller und eine Ladestandkomponente verwenden, die über einen einfachen Peripheriebus wie I²C direkt mit dem Kernprozessor der Plattform verbunden sind, führt Windows über den I²C-Bus Abfragen durch und wird darüber über Änderungen des Energiesubsystems informiert¹.

Darüber hinaus zeigt Windows 10 eine Benachrichtigung an, wenn der Akkustand niedrig oder kritisch ist². Diese Benachrichtigungen können in den Energieoptionen angepasst werden².

Bitte beachten Sie, dass die genauen Mechanismen und APIs, die verwendet werden, um auf Änderungen des Akkuzustands zu reagieren, von der spezifischen Windows-Version und der Hardwarekonfiguration abhängen können. Für detailliertere Informationen empfehle ich, die offizielle Dokumentation von Microsoft zu konsultieren¹.

Quelle: Unterhaltung mit Bing, 5.2.2024
(1) Hardwaredesign für Akku- und Energiesubsystem | Microsoft Learn. https://learn.microsoft.com/de-de/wi...ardware-design.
(2) Windows 10 Benachrichtigungen über schwachen Akkustand ändern - Gelöst. https://www.spickipedia.com/index.ph...n-geloest.html.
(3) Pflege des Akkus in Windows - Microsoft-Support. https://support.microsoft.com/de-de/...6-ed15320519e4.
Zitat von Frage:
Wie kann ich unter Delphi darauf reagieren, mir z. B. den aktuellen Akkuzustand anzeigen lassen?
Zitat von Antwort:
Ja, Sie können den aktuellen Akkuzustand in Delphi anzeigen lassen. Sie können die Windows-API-Funktion 'GetSystemPowerStatus' verwenden, um Informationen über den aktuellen Power-Status des Systems zu erhalten¹. Hier ist ein Beispiel, wie Sie es tun können:
Delphi-Quellcode:
procedure GetStatus;
var
  SystemPowerStatus: TSystemPowerStatus;
begin
  GetSystemPowerStatus(SystemPowerStatus);
  with SystemPowerStatus do begin
    // Wird das System mit Wechselstrom oder Akku betrieben ?
    case ACLineStatus of
      0: Label1.Caption := 'System wird mit Akku betrieben';
      1: Label1.Caption := 'System wird mit Wechselstrom betrieben';
      else Label1.Caption := 'Unbekannter Status';
    end;

    // Ladezustand der Batterie
    case BatteryFlag of
      1 : Label2.Caption := 'Hoher Ladezustand';
      2 : Label2.Caption := 'Niedriger Ladezustand';
      4 : Label2.Caption := 'Kritischer Ladezustand';
      8 : Label2.Caption := 'Die Batterie wird geladen';
      128: Label2.Caption := 'Es existiert keine System-Batterie';
      255: Label2.Caption := 'Unbekannter Status';
    end;

    // Ladezustand in Prozent
    if BatteryLifePercent <> 255 then
      Label3.Caption := IntToStr(BatteryLifePercent) + ' %'
    else
      Label3.Caption := 'Unbekannter Status';
  end;
end;
Zitat von Antwort (Fortsetzung):
In diesem Code wird der 'GetSystemPowerStatus'-Funktion ein 'TSystemPowerStatus'-Strukturparameter übergeben. Die Funktion füllt diese Struktur mit Informationen über den AC-Leitungszustand, den Batteriezustand und den Batterielebensprozentsatz¹. Bitte beachten Sie, dass Sie die 'Label1', 'Label2' und 'Label3' durch Ihre eigenen Label-Komponenten ersetzen müssen¹.

Quelle: Unterhaltung mit Bing, 5.2.2024
(1) Power-Status des Computers ermitteln - Delphi-Treff. https://www.delphi-treff.de/tipps-tr...ers-ermitteln/.
(2) Delphi-PRAXiS - Suche Unterstützung für Akku Status Anzeige. https://www.delphipraxis.net/printthread.php?t=214506.
(3) Suche Unterstützung für Akku Status Anzeige - Delphi-PRAXiS. https://www.delphipraxis.net/214506-...s-anzeige.html.
Zitat von Frage:
Für die einzelnen Windowsmessages sind in der API Konstanten deklariert. Gewöhnlich sind es nummerische Werte, für die es Konstanten gibt, deren Namen meist mit "WM_" beginnen. Gibt es etwas ähnliches auch für die Message, mit der über den Ladezustand informiert wird? Wie heißt diese Konstante oder wie ist ihr nummerischer Wert?
Zitat von Antwort:
Ja, es gibt eine Windows-Message, die über Änderungen im System-Stromstatus informiert. Sie heißt 'WM_POWERBROADCAST'. Diese Message wird an eine Anwendung gesendet, wenn sich der Stromzustand des Systems ändert, z. B. wenn sich der Akkuzustand ändert¹.

Die 'WM_POWERBROADCAST'-Message hat mehrere Parameter, die verschiedene Arten von Stromereignissen darstellen. Insbesondere repräsentiert der 'PBT_APMPOWERSTATUSCHANGE'-Parameter eine Änderung im Akkustatus¹.

Hier ist ein Beispiel, wie Sie auf diese Message in Delphi reagieren können:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;
  end;

...

procedure TForm1.WMPowerBroadcast(var Msg: TMessage);
begin
  if Msg.WParam = PBT_APMPOWERSTATUSCHANGE then
  begin
    // Der Akkustatus hat sich geändert
    // Führen Sie hier den Code aus, der auf diese Änderung reagieren soll
  end;
end;
Zitat von Antwort (Fortsetzung):
In diesem Code wird die 'WMPowerBroadcast'-Methode aufgerufen.

Quelle: Unterhaltung mit Bing, 5.2.2024
(1) Firmware-Implementierung für das ACPI-Akku- und Energiesubsystems. https://learn.microsoft.com/de-de/wi...implementation.
Kannste damit was anfangen?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 17:52
Diese Message kommt nicht bei einer Änderung des Ladezustands, sondern nur bei größeren Änderungen wie "low power" oder "Ladekabel getrennt".
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#10

AW: Akkumanagement (Notifications)

  Alt 6. Feb 2024, 18:04
Mir ist aber so, als hätte ich bei früheren Versuchen auch dann eine Message bekommen.


Auf WM_POWERBROADCAST reagiere ich bereits und führe dort auch die Erkennungs-/Aktualisierungsfunktion aus.
Aktuell bekomme ich nur beim Ändern des AC/DC eine Meldung, aber nicht wenn sich der Akkustand ändert, also Prozente/Restzeit ... nichtmal wenn es auf Kritisch oder so fällt.
Ohne den zusätzlichen Timer bekomme ich also nicht wirklich alles Wichtige mit, drum die Frage hier.

Alle derzeit implementierten Events werden rechts geloggt. (aktuell sogar der RefreshTimer, auch wenn dort nur der letzte Zustand angezeigt wird, damit das Log nicht zumüllt)

Das GetSystemPowerStatus nutzte ich ebenfalls (und auch noch ein paar Alternativen/Zusätzliches, aber grundsätzlich würde ich mich darauf beschränken wollen).
Anhang siehe Post #6.


PS: Das BatteryFlag ist "offiziell" ein BitSet.
Ja, ich weiß, dass Viele es wie einen Enum ausweten, aber
Zitat:
This member can contain one or more of the following flags
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz