Storage Temperature sensor freezes at its first value and never updates again (0.9.6)

Author: tczkqqCreated Sep 14, 2026Updated Sep 14, 2026

LHM version: 0.9.6 (NuGet LibreHardwareMonitorLib 0.9.6)

Symptom: After the first successful read, a Storage device's Temperature sensor (and its child sensors, e.g. NVMe Temperature #1..#8) never changes value again, for the lifetime of the process — not "updates slowly", genuinely frozen. Confirmed the drive's real temperature does change over the same window using a different tool (HWiNFO), swinging ~20°C within seconds under light load, so this isn't the drive/controller failing to report changing data.

Where I think this comes from, reading StorageDevice.Update() in this version:

csharp
hasChanges = StorageDIT.Refresh(_storage, refreshSmartData);

if (!hasChanges)
{
    if (!_initialized)
    {
        _initialized = true;
    }
    else
    {
        UpdatePerformanceSensors();
        _lastUpdate = DateTime.UtcNow;
        return; // <-- every other sensor update, including Temperature, is skipped here
    }
}

...
_sensors.ForEach(s => s.Update(_storage)); // only reached when hasChanges == true

If DiskInfoToolkit's Storage.Refresh(...) decides nothing "changed" on a given call, Update() returns early and _sensors.ForEach(s => s.Update(_storage)) — the line that actually refreshes the Temperature sensor's value — never runs. In my case this appears to get stuck: hasChanges seems to go permanently false after the first update, so the Temperature sensor is stuck at whatever value it had on the very first successful read, indefinitely, even though the underlying drive temperature keeps changing.

This looks like it might be the same underlying DiskInfoToolkit-based storage refactor behind #2154 (min/max temps not populating on startup in 0.9.6) — different symptom, same subsystem and same release, so flagging as possibly related rather than assuming duplicate.

How I'm calling Update() (for context, in case polling cadence matters): once per tick, every 30s for Storage specifically (own app-level throttle, independent of anything in LHM):

csharp
public void Update(Func<IHardware, bool>? shouldUpdate = null)
{
    foreach (var hardware in _computer.Hardware)
        UpdateRecursively(hardware, shouldUpdate);
}

private static void UpdateRecursively(IHardware hardware, Func<IHardware, bool>? shouldUpdate)
{
    if (shouldUpdate is null || shouldUpdate(hardware))
        hardware.Update();

    foreach (var sub in hardware.SubHardware)
        UpdateRecursively(sub, shouldUpdate);
}

Happy to share more detail (drive model/controller, full GetReport() output) if useful — let me know what would help narrow this down.

Source: LibreHardwareMonitor/LibreHardwareMonitor