Hallo liebe Community, und liebe Leser!
In dieser kleinen Anleitung werde ich Ihnen zeigen wie Sie auf verschiedenste Methoden die Temperaturen von bestimmten Hardware-Komponenten ermitteln können.
Aufgrund mehrerer Probleme und mangels Alternativen ist dieses Tutorial entstanden.
Allgemeines
Dieses Tutorial fokusiert sich grundsätzlich auf das Auslesen der Temperatur der CPU,
trotzdem sind die Methoden grundsätzlich (mit ein paar Ausnahmen) auch auf andere Komponenten anwendbar.
Dies ist natürlich nur der Fall sofern die Komponente den benötigten Sensor besitzt.
Ich werde Ihnen in dieser Anleitung mehrere unterschiedliche Methoden zeigen, die alle unterschiedliche Vorraussetzungen benötigen,
doch dazu später mehr. Fangen wir an!
Methode 1 - Auslesen der Temperatur mittels Windows Management Instrumentation (WMI)
Grundvorraussetzungen:
Die Methode mittels WMI setzt das Einbinden bzw. Vorhandensein der System.Management.dll vorraus.
Diese ist ab .NET Framework 3.0 standardmäßig vorhanden, davor kann sie manuell importiert werden.
Literatur:
MSDN: msdn.microsoft.com/en-us/libra…op/aa394582(v=vs.85).aspx
Wikipedia: en.wikipedia.org/wiki/Windows_Management_Instrumentation
VB-Paradise: Systeminformationen mit WMI auslesen ab .NET 3.0 oder früher
Zu Beginn müssen Sie den Verweiß auf die System.Management.dll setzen.
Im Anschluss sollten Sie (der Einfachheit) die Library mittels
Nun muss ein ObjectSearcher Objekt erstellt werden, und diesem ein bestimmter Querystring übergeben werden.
Anschließend darin weiter nach der Temperatur gesucht werden:
Sollte es zu einem Fehler kommen, gibt die Funktion ein Objekt vom Typ Double mit dem Wert -1 zurück.
Dies ist unter anderem der Fall wenn der von WMI verwendete Sensor nicht unterstützt wird.
Methode 2 - Auslesen der Temperatur mittels CoreTemp
Grundvorraussetzungen:
Hier greifen wir auf das externe Programm CoreTemp zurück, und verwenden die mitgelieferte GetCoreTempInfoNet.dll (zu finden im Anhang).
Problematisch ist, dass bei dieser Methode die Anwendung gestartet werden, sowie, zum Zeitpunkt der Überprüfung laufen muss.
Es wird also eine laufende CoreTemp Instanz benötigt.
Externe Anwendung:
alcpu.com/CoreTemp/
Die ersten Schritte sind ähnlich wie bei Methode 1.
Sie müssen den Verweis setzen, beziehungsweise sollten die Library importieren. (
Nun kann die durchschnittliche Temperatur aller Kerne wie folgt ermittelt werden:
Einzelne Kerntemperaturen können mittels,
Als kleiner Trick kann die Anwendung vor dem Verwenden der Methode noch im versteckten Modus gestartet werden:
Methode 3 - Auslesen der Temperatur mittels OpenHardwareMonitor und ohne externe Anwendung
Grundvorraussetzungen:
Methode 3 setzt das Einbinden der vom OpenHardewareMonitor bereitgestellten Library vorraus.
Die .dll kann einfach ohne der Anwendung eingebunden werden.
Sie setzt lediglich das starten der Anwendung als Administrator vorraus. (diesbezüglich siehe: vb-paradise.de/allgemeines/tip…stratorrechte-und-vb-net/ )
Literatur:
openhardwaremonitor.org/documentation/
Der OpenHardwareMonitor ist eine weitere externe Anwendung, welche in diesem Fall jedoch nicht mitgeliefert beziehungsweise laufen muss.
Die mitgelieferte Bibliothek, -OpenHardwareMonitorLib.dll-, muss wie bei den vorherigen Methoden mittels Verweiß eingebunden werden.
Im Anschluss ist das Setzten der Importe
Wie folgt kann nun die Durchschnittstemperatur der CPU ermittelt werden:
Wie im Codebeispiel jedoch beschrieben kann es hier ab und zu, zu Problemen beim Auslesen der einzelnen Temperaturen kommen.
Temperaturen anderer Hardware-Komponenten ermitteln
Das Ermitteln von Temperaturen anderer Hardware-Komponenten ist natürlich ebenfalls möglich.
Grundsätzlich können als Ansatz die oben genannten Methoden verwendet werden.
Mit OHM kann zum Beispiel einfach die GPU Temperatur ausgelesen werden:
Beachten sollte man hierbei, dass es eine Unterscheidung zwischen ATI und NVIDIA Grafikkarten gibt.
Speziell für NVIDIA gibt es weitere Methoden:
Quelle: dotnet-snippets.de/snippet/nvi…entemperatur-auslesen/139
Das Auslesen der Temperatur einer Festplatte ist ebenfalls möglich.
Dazu kann zum Beispiel WMI (mittels root\WMI Namespace und der Klasse MSStorageDriver_ATAPISmartData) verwendet werden.
Desweiteren gibt es diesbezüglich diverse Bibliotheken welche auf S.M.A.R.T aufbauen.
Mehr dazu: vbnet.mvps.org/index.html?code/disk/smartide.htm
Welche Methode ist nun die Beste?
Welche der angebenen Methoden nun die Beste ist, ist schwer zu beantworten da alle prinzipiell ihre Vor- und Nachteile besitzen.
Bei meinem Test haben sich folgende Ergebnise evaluieren lassen:
Problematisch ist jedoch, dass OHM keine konstanten richtigen Ergebnisse bei mir geliefert hat, da es öfters zu Komplikationen beim Auslesen der Temperaturen für einzelne Kerne kam.
Durchgehen richtige Ergebnisse hingegen lieferte CoreTemp. Der offensichtliche Nachteil jedoch ist, dass diese Methode eine laufende Instanz benötigt.
Ich hoffe dieses Tutorial hat Ihnen geholfen!
Mit freundlichen Grüßen
Martin Pfeiffer aka. Gather_
In dieser kleinen Anleitung werde ich Ihnen zeigen wie Sie auf verschiedenste Methoden die Temperaturen von bestimmten Hardware-Komponenten ermitteln können.
Aufgrund mehrerer Probleme und mangels Alternativen ist dieses Tutorial entstanden.
Allgemeines
Dieses Tutorial fokusiert sich grundsätzlich auf das Auslesen der Temperatur der CPU,
trotzdem sind die Methoden grundsätzlich (mit ein paar Ausnahmen) auch auf andere Komponenten anwendbar.
Dies ist natürlich nur der Fall sofern die Komponente den benötigten Sensor besitzt.
Ich werde Ihnen in dieser Anleitung mehrere unterschiedliche Methoden zeigen, die alle unterschiedliche Vorraussetzungen benötigen,
doch dazu später mehr. Fangen wir an!
Methode 1 - Auslesen der Temperatur mittels Windows Management Instrumentation (WMI)
Grundvorraussetzungen:
Die Methode mittels WMI setzt das Einbinden bzw. Vorhandensein der System.Management.dll vorraus.
Diese ist ab .NET Framework 3.0 standardmäßig vorhanden, davor kann sie manuell importiert werden.
Literatur:
MSDN: msdn.microsoft.com/en-us/libra…op/aa394582(v=vs.85).aspx
Wikipedia: en.wikipedia.org/wiki/Windows_Management_Instrumentation
VB-Paradise: Systeminformationen mit WMI auslesen ab .NET 3.0 oder früher
Zu Beginn müssen Sie den Verweiß auf die System.Management.dll setzen.
Im Anschluss sollten Sie (der Einfachheit) die Library mittels
Import System.Management
importieren.Nun muss ein ObjectSearcher Objekt erstellt werden, und diesem ein bestimmter Querystring übergeben werden.
Anschließend darin weiter nach der Temperatur gesucht werden:
VB.NET-Quellcode
- ''' <summary>
- ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels WMI.
- ''' </summary>
- Private Function GetCPUTemperatureWithWMI() As Double
- Try
- Dim TempSearcher As New Management.ManagementObjectSearcher( _
- "root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature")
- Dim Temperature As Double = 0
- For Each TempSensor As Management.ManagementObject In TempSearcher.Get()
- Temperature = CDbl(TempSensor("CurrentTemperature")) : Exit For
- Next
- Return (Temperature - 2732) / 10.0 'Umrechnung in Celsius
- Catch err As Management.ManagementException
- Return -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird!
- End Try
- End Function
Sollte es zu einem Fehler kommen, gibt die Funktion ein Objekt vom Typ Double mit dem Wert -1 zurück.
Dies ist unter anderem der Fall wenn der von WMI verwendete Sensor nicht unterstützt wird.
Methode 2 - Auslesen der Temperatur mittels CoreTemp
Grundvorraussetzungen:
Hier greifen wir auf das externe Programm CoreTemp zurück, und verwenden die mitgelieferte GetCoreTempInfoNet.dll (zu finden im Anhang).
Problematisch ist, dass bei dieser Methode die Anwendung gestartet werden, sowie, zum Zeitpunkt der Überprüfung laufen muss.
Es wird also eine laufende CoreTemp Instanz benötigt.
Externe Anwendung:
alcpu.com/CoreTemp/
Die ersten Schritte sind ähnlich wie bei Methode 1.
Sie müssen den Verweis setzen, beziehungsweise sollten die Library importieren. (
Imports GetCoreTempInfoNET
)Nun kann die durchschnittliche Temperatur aller Kerne wie folgt ermittelt werden:
VB.NET-Quellcode
- ''' <summary>
- ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels CoreTemp.
- ''' </summary>
- Private Function GetCPUTemperatureWithCoreTemp() As Double
- Dim CTInfo As New CoreTempInfo
- CTInfo.GetData()
- Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird, _
- ' oder CoreTemp nicht im Hintergrund läuft!
- If CTInfo.GetTemp IsNot Nothing Then
- For i As Integer = 0 To CTInfo.GetTemp.Count - 1
- temp += CTInfo.GetTemp(i)
- Next
- temp /= CTInfo.GetCoreCount ' Durchschnittswert errechnen.
- End If
- Return temp
- End Function
Einzelne Kerntemperaturen können mittels,
CTInfo.GetTemp(0)
, wobei der Integer den gewünschten Kern angibt, ausgelesen werden.Als kleiner Trick kann die Anwendung vor dem Verwenden der Methode noch im versteckten Modus gestartet werden:
VB.NET-Quellcode
- ''' <summary>
- ''' Startet die Anwendung CoreTemp im verstecken Modus.
- ''' </summary>
- ''' <param name="filename">Pfad zur CoreTemp.exe (standardmäßig im Dateiordner) dieser Anwendung.</param>
- Private Sub PrelaunchCoreTemp(Optional ByVal filename As String = "Core Temp.exe")
- If IO.File.Exists(filename) Then
- Dim pInfo As New ProcessStartInfo With {.WindowStyle = ProcessWindowStyle.Hidden, .FileName = filename}
- Process.Start(pInfo)
- End If
- End Sub
Methode 3 - Auslesen der Temperatur mittels OpenHardwareMonitor und ohne externe Anwendung
Grundvorraussetzungen:
Methode 3 setzt das Einbinden der vom OpenHardewareMonitor bereitgestellten Library vorraus.
Die .dll kann einfach ohne der Anwendung eingebunden werden.
Sie setzt lediglich das starten der Anwendung als Administrator vorraus. (diesbezüglich siehe: vb-paradise.de/allgemeines/tip…stratorrechte-und-vb-net/ )
Literatur:
openhardwaremonitor.org/documentation/
Der OpenHardwareMonitor ist eine weitere externe Anwendung, welche in diesem Fall jedoch nicht mitgeliefert beziehungsweise laufen muss.
Die mitgelieferte Bibliothek, -OpenHardwareMonitorLib.dll-, muss wie bei den vorherigen Methoden mittels Verweiß eingebunden werden.
Im Anschluss ist das Setzten der Importe
OpenHardwareMonitor
und OpenHardwareMonitor.Hardware
ratsam.Wie folgt kann nun die Durchschnittstemperatur der CPU ermittelt werden:
VB.NET-Quellcode
- ''' <summary>
- ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels OpenHardwareMonitor.
- ''' </summary>
- Private Function GetCPUTemperatureWithOHM() As Double
- Dim c As New Computer()
- c.Open()
- c.CPUEnabled = True 'In diesem Fall da wir lediglich Informationen der CPU auslesen wollen.
- Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird.
- For i As Integer = 0 To c.Hardware.Count - 1
- Dim hw = c.Hardware(i)
- If hw.HardwareType = HardwareType.CPU Then
- For j As Integer = 0 To hw.Sensors.Count - 1
- Dim sensor = hw.Sensors(j)
- If sensor.SensorType = 3 Then 'Abfrage ob Typ dem Typen Temperature entspricht.
- 'OHM hat hier ein gelegentlich ein Problem beim Auslesen der Temperatur einzelner Kerne.
- 'Der Sensor mit dem Namen CPU Total gibt den von uns gesuchten Wert daher manchmal falsch zurück.
- If sensor.Name = "CPU Total" Then temp = CDbl(sensor.Value) : Exit For
- End If
- Next
- End If
- Next
- Return temp
- End Function
Wie im Codebeispiel jedoch beschrieben kann es hier ab und zu, zu Problemen beim Auslesen der einzelnen Temperaturen kommen.
Temperaturen anderer Hardware-Komponenten ermitteln
Das Ermitteln von Temperaturen anderer Hardware-Komponenten ist natürlich ebenfalls möglich.
Grundsätzlich können als Ansatz die oben genannten Methoden verwendet werden.
Mit OHM kann zum Beispiel einfach die GPU Temperatur ausgelesen werden:
VB.NET-Quellcode
- ''' <summary>
- ''' Ermittelt die derzeitige Durchschnittstemperatur der GPU mittels OpenHardwareMonitor.
- ''' </summary>
- Private Function GetGPUTemperatureWithOHM() As Double
- Dim c As New Computer()
- c.Open()
- c.GPUEnabled = True 'In diesem Fall da wir lediglich Informationen der GPU auslesen wollen.
- Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird.
- For i As Integer = 0 To c.Hardware.Count - 1
- Dim hw = c.Hardware(i)
- If hw.HardwareType = HardwareType.GpuNvidia Then
- For j As Integer = 0 To hw.Sensors.Count - 1
- Dim sensor = hw.Sensors(j)
- If sensor.SensorType = 3 Then 'Abfrage ob Typ dem Typen Temperature entspricht.
- temp = CDbl(sensor.Value)
- End If
- Next
- End If
- Next
- Return temp
- End Function
Beachten sollte man hierbei, dass es eine Unterscheidung zwischen ATI und NVIDIA Grafikkarten gibt.
Speziell für NVIDIA gibt es weitere Methoden:
VB.NET-Quellcode
- Public Declare Function NvCplGetThermalSettings Lib "nvcpl.dll" ( _
- ByVal nWindowsMonitorNumber As Integer, _
- ByRef pdwCoreTemp As Integer, _
- ByRef pdwAmbientTemp As Integer, _
- ByRef pdwUpperLimit As Integer) _
- As Long
- Public Function GetNvidiaTemp() As Long()
- Dim TempArray(2) As Long
- NvCplGetThermalSettings(0, TempArray(0), TempArray(1), TempArray(2))
- Return TempArray
- End Function
Das Auslesen der Temperatur einer Festplatte ist ebenfalls möglich.
Dazu kann zum Beispiel WMI (mittels root\WMI Namespace und der Klasse MSStorageDriver_ATAPISmartData) verwendet werden.
Desweiteren gibt es diesbezüglich diverse Bibliotheken welche auf S.M.A.R.T aufbauen.
Mehr dazu: vbnet.mvps.org/index.html?code/disk/smartide.htm
Welche Methode ist nun die Beste?
Welche der angebenen Methoden nun die Beste ist, ist schwer zu beantworten da alle prinzipiell ihre Vor- und Nachteile besitzen.
Bei meinem Test haben sich folgende Ergebnise evaluieren lassen:
Problematisch ist jedoch, dass OHM keine konstanten richtigen Ergebnisse bei mir geliefert hat, da es öfters zu Komplikationen beim Auslesen der Temperaturen für einzelne Kerne kam.
Durchgehen richtige Ergebnisse hingegen lieferte CoreTemp. Der offensichtliche Nachteil jedoch ist, dass diese Methode eine laufende Instanz benötigt.
Ich hoffe dieses Tutorial hat Ihnen geholfen!
Mit freundlichen Grüßen
Martin Pfeiffer aka. Gather_