SmartTaskTool / hardwarecheck_AMD.py
kalle07's picture
Upload 3 files
e477690 verified
import os
import clr
import time
#from difflib import get_close_matches
# DLL laden (Pfad ggf. anpassen)
dll_path = os.path.abspath("LibreHardwareMonitorLib.dll")
clr.AddReference(dll_path)
from LibreHardwareMonitor import Hardware
#from difflib import SequenceMatcher
# ----------------------------------------
# Hilfsfunktion: unscharfer Vergleich
# ----------------------------------------
#from rapidfuzz import fuzz
from rapidfuzz.fuzz import partial_ratio
def best_match_optional(filter_str, target_str, min_token_score=80):
"""
Für jedes Token im Filter suchen wir das bestpassende Token im Ziel (mit partial_ratio).
Der finale Score ist der Durchschnitt dieser besten Matches.
"""
if not filter_str:
return 1.0
filter_tokens = filter_str.lower().split()
target_tokens = target_str.lower().split()
if not target_tokens:
return 0.0
match_scores = []
for ftoken in filter_tokens:
best_score = max(
partial_ratio(ftoken, ttoken)
for ttoken in target_tokens
)
if best_score < min_token_score:
return 0.0 # Ein Filter-Token ist zu unähnlich → kein Match
match_scores.append(best_score)
return sum(match_scores) / (100 * len(match_scores)) # Normiert auf [0.0, 1.0]
# ----------------------------------------
# Einmalige GPU-Auslesung (alle Sensorwerte)
# ----------------------------------------
def lese_gpu_sensorwerte():
hw = Hardware.Computer()
hw.IsGpuEnabled = True
hw.IsCpuEnabled = False
hw.IsMemoryEnabled = False
hw.IsMotherboardEnabled = False
hw.IsStorageEnabled = False
hw.IsNetworkEnabled = False
hw.IsControllerEnabled = False
hw.Open()
daten = []
hardware_counter = 0
for hardware in hw.Hardware:
hardware.Update()
#if hardware.HardwareType.ToString().lower() != "gpu":
# continue
hardware_type = hardware.HardwareType.ToString()
hardware_name = hardware.Name
hardware_id = f"ID{hardware_counter}"
hardware_counter += 1
for sensor in hardware.Sensors:
eintrag = {
"ID": hardware_id,
"HardwareName": hardware_name,
"HardwareType": hardware_type,
"SensorName": sensor.Name,
"SensorType": sensor.SensorType.ToString(),
"Value": sensor.Value
}
daten.append(eintrag)
hw.Close()
return daten
# ----------------------------------------
# Filterfunktion mit flexiblen Feldern
# ----------------------------------------
def filter_sensordaten(daten, filterkriterien):
treffer = []
for eintrag in daten:
if all([
best_match_optional(filterkriterien.get("ID"), eintrag["ID"]),
best_match_optional(filterkriterien.get("HardwareName"), eintrag["HardwareName"]),
best_match_optional(filterkriterien.get("HardwareType"), eintrag["HardwareType"]),
best_match_optional(filterkriterien.get("SensorName"), eintrag["SensorName"]),
best_match_optional(filterkriterien.get("SensorType"), eintrag["SensorType"]),
(filterkriterien.get("Value") is None or eintrag["Value"] == filterkriterien["Value"])
]):
treffer.append(eintrag)
return treffer
# ----------------------------------------
# Hauptprogramm
# ----------------------------------------
if __name__ == "__main__":
# Alle GPU-Daten einmalig auslesen
alle_sensoren = lese_gpu_sensorwerte()
print("\n--- Alle ausgelesenen GPU-Sensorwerte ---")
for sensor in alle_sensoren:
val = sensor["Value"]
val_str = f"{round(val, 1)}" if isinstance(val, (float, int)) else str(val)
print(f"ID: {sensor['ID']} | HwType: <{sensor['HardwareType']}> | "
f"HwName: <{sensor['HardwareName']}> | Sensor: <{sensor['SensorName']}> | "
f"Typ: <{sensor['SensorType']}> = {val_str}")
print(f"\nInsgesamt {len(alle_sensoren)} Sensoren gefunden.")
# -------------------------------
# 10 definierbare Suchabfragen
# -------------------------------
suchabfragen = [
{
"aktiv": True,
"filter": {
"HardwareType": "GpuAmd",
"HardwareName": "AMD",
"SensorName": "Core",
"SensorType": "Temperature",
"ID": "",
"Value": None
}
},
{
"aktiv": True,
"filter": {
"HardwareType": "GpuAmd",
"HardwareName": "AMD",
"SensorName": "Core",
"SensorType": "Load",
"ID": "",
"Value": None
}
},
{
"aktiv": True,
"filter": {
"HardwareType": "GpuAmd",
"HardwareName": "AMD",
"SensorName": "GPU Memory Used",
"SensorType": "",
"ID": "",
"Value": None
}
},
{
"aktiv": True,
"filter": {
"HardwareType": "GpuAmd",
"HardwareName": "AMD",
"SensorName": "GPU Memory Free",
"SensorType": "",
"ID": "",
"Value": None
}
},
{
"aktiv": True,
"filter": {
"HardwareType": "GpuAmd",
"HardwareName": "AMD",
"SensorName": "GPU Memory Total",
"SensorType": "",
"ID": "",
"Value": None
}
},
{
"aktiv": False,
"filter": {
"HardwareType": "Check",
"HardwareName": "",
"SensorName": "",
"SensorType": "",
"ID": "",
"Value": None
}
},
# ... weitere Suchabfragen:
*[
{"aktiv": False, "filter": {}} # Platzhalter
for _ in range(10)
]
]
# -------------------------------
# Suchabfragen ausführen
# -------------------------------
for idx, suchanfrage in enumerate(suchabfragen):
if not suchanfrage["aktiv"]:
continue
print(f"\n--- Suche #{idx + 1} ---")
resultate = filter_sensordaten(alle_sensoren, suchanfrage["filter"])
if not resultate:
print("Keine passenden Sensorwerte gefunden.")
else:
for r in resultate:
val = r["Value"]
val_str = f"{round(val, 1)}" if isinstance(val, (float, int)) else str(val)
print(f"ID: {r['ID']} | HwType: <{r['HardwareType']}> | "
f"HwName: <{r['HardwareName']}> | Sensor: <{r['SensorName']}> | "
f"Typ: <{r['SensorType']}> = {val_str}")
time.sleep(0.01)
input("\nDrücke eine Taste zum Beenden...")