-
Notifications
You must be signed in to change notification settings - Fork 0
Quirks and Troubleshooting
Every numeric read means one of three things:
| Value | Meaning |
|---|---|
-2 |
Plugin-level error — bad handle, or the module/category failed to initialize |
-1 |
Not supported on this hardware/driver/BIOS — not an error, genuinely unavailable |
0 or positive |
A real reading |
-1 is common and expected — no vendor SDK or motherboard exposes every value. It's
distinct from a real 0: internally an unsupported metric carries supported = false,
never conflated with a zero reading.
String metrics (Name, Vendor, VolumeLabel, ThrottleReasons, MemoryType,
Architecture, …) only fill the measure's string side. Bind one to a numeric-only
meter (Bar, Line, Histogram, Roundline) and you get -1, because those meters read the
number. Put string metrics in a Meter=String and reference %1. See
Configuring Measures.
There is no CPU temperature metric, and CPU Voltage usually reads -1.
Real per-core voltage and true die temperature (Tctl/Tdie) are only readable through Model-Specific Registers (MSR) or vendor SMU telemetry — both need a signed kernel driver plus a service to load it. This plugin ships a single user-mode DLL and installs nothing else, permanently, by design. So these values aren't "coming later"; they're out of scope.
Voltage does try Win32_Processor.CurrentVoltage over WMI, but on most boards that
field is a legacy placeholder, so it returns -1 even where a number might appear in other
tools (those tools use a driver). This is a BIOS/WMI limitation a driverless fix can't
solve anyway.
Storage speeds/IOPS/throughput and other PDH-counter-based rates need two samples to compute a delta. On the very first update cycle after a measure loads, expect a zero or junk value — it settles on the second tick.
All clocks report in Hz, converted from the SDK's MHz. A "5000" MHz core clock reads
5000000000. Add AutoScale=2k to the meter (or divide) to display GHz/MHz.
Manufacturer and similar RAM-identity strings come from SMBIOS/WMI. If the motherboard
leaves an SMBIOS field unpopulated, the value is Unknown — a firmware gap, not a plugin
bug. Identity is read from the first module (sticks are near-always identical) plus a
total ModuleCount.
PcieLinkGen and PcieLinkWidth on the AMD/ADLX path are implemented but not yet
runtime-tested on AMD hardware. Treat them as provisional until confirmed on an AMD GPU;
the NVIDIA/NVML path for the same metrics is verified.
The entire Intel path (IGCL via ControlLib.dll) is implemented but not yet
runtime-tested on Intel hardware — neither of the author's machines has an Intel GPU. All
metrics in the IGCL column of the Metrics Reference are provisional
until confirmed on an Arc/Xe GPU. Two known caveats even once verified: EncoderUsage and
DecoderUsage return the same value (IGCL reports media engines combined, no
encode/decode split), and VbiosVersion is often blank (Intel drivers frequently leave the
firmware version unpopulated). Where ControlLib.dll is absent (no Intel driver), the
provider simply reports no Intel device — other vendors are unaffected.
Have an Intel Arc/Xe GPU? You can help confirm the readings:
- Add
Debug=2to a GPU measure (the bundledplugin_test/gpu.inialready has it), or a minimal one:[MeasureIntelDump] Measure=Plugin Plugin=NativeHardwareMonitor Category=GPU Device=0 ; the Intel GPU's index — try 0, or 1/2 if you also have a dGPU Metric=Usage Debug=2
- Refresh the skin and let it run a few seconds (so counter-based values like
Usage/Powerseed past the first tick). - Grab the file it writes:
%TEMP%\NativeHardwareMonitor\GPU_dev0.txt(paste%TEMP%into Explorer's address bar). It lists every GPU metric with its value. - Open an issue with that file attached, plus your GPU model and driver version.
Values that read -1 (unsupported) are expected for sensors your GPU doesn't expose;
what's most useful is spotting anything that looks wrong (e.g. clocks or temps off by an
order of magnitude, or a metric stuck at 0).
-
Rttis milliseconds. On a timeout or an unresolved host it reads9999— a sentinel, not a real 9.999 s round-trip. -
PacketLossis a percentage over recent samples. - Ping ignores
Device=. Each measure names aHost=; every distinct host becomes its own target with its own background poller, firing everyPingIntervalms (default1000). - An unresolvable host keeps being retried on the interval, so a name that resolves later starts reporting without a reload.
- Confirm the DLL is at
%APPDATA%\Rainmeter\Plugins\NativeHardwareMonitor.dlland you restarted Rainmeter after copying it. - A
-2means the category or metric name didn't parse. They're case-insensitive but must match a known value — check spelling against Metrics Reference. - Set
Debug=1on the measure and read the Rainmeter log (About → Log) to see whether it registered. It never logs metric values, only registration/init events.