Windows 11 PowerShell: Batterieladestand Bluetooth-verbundener Geräte anzeigen/ausgeben

CyborgBeta

Lt. Commander
Registriert
Jan. 2021
Beiträge
1.852
Hallo,

https://stackoverflow.com/a/71737852
das hatte ich versucht, aber es funktioniert bei mir nicht. Ich kann mit dem "ps1"-Script nicht den Batterieladestand meines Bluetooth-Headsets herausfinden. Hat vielleicht jemand eine Idee?

Bisheriger Versuch:

PowerShell:
[string]$bats = Get-PnpDevice -Class 'Bluetooth' -FriendlyName 'abcd...' | Get-PnpDeviceProperty -KeyName 'DEVPKEY_Device_PowerData' | Select-Object 'Data' | Out-String
[int]$bati = [convert]::ToInt32(($bats -replace '[^0-9]', '').Substring(0, 2), 10)
$bats
$bati
Pause

Das gibt leider immer 56 aus.
 
Wenn ich mich nicht täusche, gab es genau das Thema hier im Forum vor wenigen Tagen erst, auch mit Lösung.
Sollte doch wiederzufinden sein.

E: unterstützt dein ungenanntes Headset es denn generell? Also kannst du den Ladestand auf nem Smartphone sehen?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CyborgBeta
kartoffelpü schrieb:
unterstützt dein ungenanntes Headset es denn generell? Also kannst du den Ladestand auf nem Smartphone sehen?

Ja, schau mal

1686494998607.png


In den Einstellungen unter Bluetooth und Geräte > Geräte wird es sogar (zumindest in Zehnerschritten) angezeigt.

Es ist ein "JBL TUNE510BT"-Headset. Ich möchte diesen Wert aber gerne "programmatisch" ermitteln, also am besten so, wie Windows das auch macht.

kartoffelpü schrieb:
Wenn ich mich nicht täusche, gab es genau das Thema hier im Forum vor wenigen Tagen erst,

Das war wahrscheinlich ich selber gewesen, weil ich erst dachte, dass es funktioniert, bis mir dann aufgefallen ist, dass der Ausgabewert immer 56 ist ...

Also irgendwie muss man doch an diesen Wert dran kommen.
 
der keyname kann unterschiedlich sein je nachdem was für ein typ von gerät es ist.

probier mal diesen

Code:
-KeyName '{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2'

ansonsten müsstest du dir den keyname selber "raussuchen". also alle device properties listen lassen und die datenfelder mit deinem am handy gemessenen wert vergleichen. sprich diese zeile in powershell absetzen

Code:
Get-PnpDevice -Class 'Bluetooth' -FriendlyName 'abcd...' | Get-PnpDeviceProperty

und dann die tabelle durchforsten.
 
  • Gefällt mir
Reaktionen: CyborgBeta
Danke, ich begebe mich gleich nochmal auf die Suche und melde mich dann nochmal hier...
 
Ich hab es leider noch nicht hinbekommen.

PowerShell:
[int]$dpower = (Get-PnpDevice -Class 'Bluetooth' -FriendlyName 'TP-Link Bluetooth 5.0 USB Adapter' | Get-PnpDeviceProperty -KeyName '{A92F26CA-EDA7-4B1D-9DB2-27B68AA5A2EB} 2').Data
$dpower
Pause

Das scheint als einzigstes einen halbwegs vernünftigen Wert (93) auszugeben. In den Einstellungen wird jedoch 100 % angezeigt.
 
die frage ist halt, verändert sich der abgefragte wert wenn die batterie mal 10-20 prozentpunkte absinkt.
 
Nö, leider nicht
Ergänzung ()

E: Also in den Windows-Einstellungen natürlich schon, aber ich habe noch nicht den richtigen Wert erwischt

Jemand eine Idee?
 
Habe eine Lösung gefunden. :)

Folgendes Scipt bzw. folgende Funktion gibt das Batterielevel in Prozent aus:

1692635577218.png


PowerShell:
function global:BtBattery() {
    $StartTime = Get-Date
    $BTDeviceFriendlyName = "WH204A Hands-Free AG"
    $Shell = New-Object -ComObject "WScript.Shell"
    #$BTHDevices = Get-PnpDevice -FriendlyName "*$($BTDeviceFriendlyName)*"
    $BTHDevices = Get-PnpDevice -FriendlyName "*$($BTDeviceFriendlyName)*" -Class "System" -Status OK

    if ($BTHDevices) {
        $BatteryLevels = foreach ($Device in $BTHDevices) {
            $BatteryProperty = Get-PnpDeviceProperty -InstanceId $Device.InstanceId -KeyName '{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2' |
                Where-Object { $_.Type -ne 'Empty' } |
                Select-Object -ExpandProperty Data

            if ($BatteryProperty) {
                $BatteryProperty
                Write-Host $Device
            }
        }

        if ($BatteryLevels) {
            $ElapsedTime = (Get-Date) - $StartTime
            $ElapsedTimeMilliseconds = [math]::Round($ElapsedTime.TotalMilliseconds, 0)
            $ElapsedTimeStr = "$($ElapsedTimeMilliseconds) ms"
            if ($ElapsedTimeMilliseconds -gt 1000) {
                $ElapsedTimeSeconds = $ElapsedTime.TotalSeconds
                $ElapsedTimeStr = "$($ElapsedTimeSeconds) sec"
            }
            $Message = "Battery Level of $($BTDeviceFriendlyName): $($BatteryLevels) %`n`nElapsed Time: $($ElapsedTimeStr)"
            $Button = $Shell.Popup($Message, 0, "Battery Level", 0)
        }
        else {
            Write-Host "No battery level information found for $($BTDeviceFriendlyName) devices."
        }
    }
    else {
        Write-Host "Bluetooth device found."
    }
}

Export-ModuleMember -function BtBattery

Installation:
  • Passe die Zeile $BTDeviceFriendlyName = "WH204A Hands-Free AG" durch deinen Bluetooth-Namen an.
  • Speichere das Modul-Script unter "C:\Windows\System32\WindowsPowerShell\v1.0\Modules\MeineScripts\MeineScripts.psm1" (ja, lege einen Ordner "MeineScripts" an).
  • Erlaube "fremde" Scripte: Führe Set-ExecutionPolicy -ExecutionPolicy Unrestricted als Admin aus.

Danach einfach BtBattery aufrufen und ca. 1 Sekunde warten. :)
 
Zurück
Oben