1
0

OhmNvme.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using LibreHardwareMonitor.Hardware;
  2. using LibreHardwareMonitor.Hardware.Storage;
  3. namespace OhmGraphite
  4. {
  5. // LibreHardwareMonitor doesn't expose all the SMART attributes on a generic NVMe drive
  6. // so we create our own pseudo-hardware class that exposes some important factors
  7. internal class OhmNvme
  8. {
  9. private readonly NVMeGeneric _nvme;
  10. public OhmNvme(NVMeGeneric nvme)
  11. {
  12. _nvme = nvme;
  13. var factor = LibreHardwareMonitor.Hardware.SensorType.Factor.ToString().ToLowerInvariant();
  14. ErrorInfoLogEntryCount = new OhmSensor
  15. {
  16. Identifier = new Identifier(nvme.Identifier, factor, "error_info_log_entries"),
  17. Name = "Error Info Log Entries",
  18. Hardware = nvme,
  19. SensorType = LibreHardwareMonitor.Hardware.SensorType.Factor,
  20. };
  21. MediaErrors = new OhmSensor
  22. {
  23. Identifier = new Identifier(nvme.Identifier, factor, "media_errors"),
  24. Name = "Media Errors",
  25. Hardware = nvme,
  26. SensorType = LibreHardwareMonitor.Hardware.SensorType.Factor,
  27. };
  28. PowerCycles = new OhmSensor
  29. {
  30. Identifier = new Identifier(nvme.Identifier, factor, "power_cycles"),
  31. Name = "Power Cycles",
  32. Hardware = nvme,
  33. SensorType = LibreHardwareMonitor.Hardware.SensorType.Factor,
  34. };
  35. UnsafeShutdowns = new OhmSensor
  36. {
  37. Identifier = new Identifier(nvme.Identifier, factor, "unsafe_shutdowns"),
  38. Name = "Unsafe Shutdowns",
  39. Hardware = nvme,
  40. SensorType = LibreHardwareMonitor.Hardware.SensorType.Factor,
  41. };
  42. }
  43. public OhmSensor UnsafeShutdowns { get; }
  44. public OhmSensor PowerCycles { get; }
  45. public OhmSensor MediaErrors { get; }
  46. public OhmSensor ErrorInfoLogEntryCount { get; }
  47. public void Update()
  48. {
  49. var health = _nvme?.Smart?.GetHealthInfo();
  50. ErrorInfoLogEntryCount.Value = health?.ErrorInfoLogEntryCount;
  51. MediaErrors.Value = health?.MediaErrors;
  52. PowerCycles.Value = health?.PowerCycle;
  53. UnsafeShutdowns.Value = health?.UnsafeShutdowns;
  54. }
  55. }
  56. }