Skip to content

Pi-Specific Features

This page details the Raspberry Pi hardware features that pitop monitors, including which boards support them and how the data is collected.


PMIC power rails (Pi 5 only)

The Raspberry Pi 5 includes a Dialog DA9090 PMIC that provides per-rail voltage and current telemetry.

Data source

vcgencmd pmic_read_adc

This returns 12 voltage rails and 12 current rails. The output format varies by firmware version:

Standard format:

VDD_CORE_V=0.8750V
VDD_CORE_A=1.2340A
VDD_CPU_V=0.9000V
VDD_CPU_A=0.5670A
...

Pi 5 alternate format (newer firmware):

RAIL_A current(7)=0.1234A
RAIL_A voltage(7)=0.8750V
...

pitop's PMIC parser handles both formats.

Available rails

Rail Description
VDD_CORE SoC core power
VDD_CPU CPU cluster power
VDD_IO General I/O power
EXT5V_V Input voltage from USB-C power supply
BATT_V RTC backup battery voltage

Estimated wattage

Total estimated power draw is calculated using a correction factor:

total_watts = sum(voltage * current for all rails) * 1.1451 + 0.5879

The correction factor accounts for PMIC conversion losses that are not captured in the rail measurements.


Fan monitoring (Pi 5 only)

The Pi 5 has a dedicated 4-pin PWM fan header.

Data source

pitop discovers the fan hwmon device by scanning /sys/class/hwmon/ and matching the device with name equal to cooling_fan or pwmfan (the name varies depending on the device tree overlay and fan type).

No hardcoded hwmon numbers

hwmon numbers (e.g., hwmon2) change across reboots. pitop always discovers devices by enumerating all hwmon entries and matching by the name file content.

Readings

File Description
fan1_input Current fan speed in RPM
pwm1 PWM duty cycle (0-255, displayed as 0-100%)

Display

The Overview tab shows fan status as: Fan: 3054 RPM (45%)

If no fan hwmon device is found, the fan section is hidden.


The Pi 5 exposes a single-lane PCIe interface (x1 Gen 2.0 by default, configurable to Gen 3.0) for NVMe SSDs and other PCIe devices via the HAT+ connector.

Data source

PCIe link information is read from:

/sys/bus/pci/devices/*/current_link_speed
/sys/bus/pci/devices/*/current_link_width

Display

The Power tab shows:

  • Link speed (e.g., Gen 2 5.0 GT/s, Gen 3 8.0 GT/s)
  • Lane width (typically x1)
  • Downgrade warning if the link speed is running below the device's maximum capability

Width mismatches are not flagged

The Pi 5 M.2 HAT connector is x1 by design. A device that is x4-capable running at x1 on the Pi 5 is expected behavior. Only speed drops (e.g., Gen 3-capable device running at Gen 2) are flagged as downgrades.


PoE HAT detection (Pi 5, Pi 4B)

pitop detects Power over Ethernet HATs by scanning for power supply devices:

Data source

/sys/class/power_supply/rpi-poe*

If a PoE HAT is detected, the Power tab shows whether PoE power is being supplied and the current draw.

When the PoE power supply device exists and reports type=Mains, pitop infers online=true even if the online sysfs attribute is absent. This handles cases where the kernel driver does not explicitly expose the online status.

Supported HATs

  • Raspberry Pi PoE HAT (Pi 4B)
  • Raspberry Pi PoE+ HAT (Pi 5, Pi 4B)

Voltage monitoring (Pi 4B, Zero 2W)

Boards without a PMIC use vcgencmd measure_volts for basic voltage readings.

Data source

vcgencmd measure_volts core      # SoC core voltage
vcgencmd measure_volts sdram_c   # SDRAM controller voltage
vcgencmd measure_volts sdram_i   # SDRAM I/O voltage
vcgencmd measure_volts sdram_p   # SDRAM PHY voltage

Output format: volt=1.2000V


Thermal monitoring

SoC temperature (all boards)

Read from /sys/class/thermal/thermal_zone0/temp. The value is in millidegrees Celsius (e.g., 52300 = 52.3C).

Additional thermal zones (Pi 5)

The Pi 5 exposes additional thermal zones:

Zone Description
SoC Main processor temperature
PMIC Power management IC temperature
RP1 Southbridge chip temperature
NVMe NVMe SSD temperature (discovered via hwmon)

These are discovered by scanning /sys/class/thermal/ and matching by the type file.

hwmon temperature sensors

pitop also discovers temperature sensors via /sys/class/hwmon/ by matching the name file content. This catches sensors that are not exposed as thermal zones, including NVMe drive temperature sensors.


Throttle detection (all Pi boards)

Data source

vcgencmd get_throttled

Returns a hex bitmask, e.g., throttled=0x0.

Bitmask fields

Bit Meaning
0 Under-voltage detected
1 ARM frequency capped
2 Currently throttled
3 Soft temperature limit active
16 Under-voltage has occurred
17 ARM frequency capping has occurred
18 Throttling has occurred
19 Soft temperature limit has occurred

Bits 0-3 indicate current status. Bits 16-19 indicate events that have occurred since boot but may not be active now.

Display

The header bar shows a color-coded throttle indicator:

  • Green: 0x0 -- no throttle events
  • Yellow: bits 16-19 set but bits 0-3 clear -- past events, not currently active
  • Red: any of bits 0-3 set -- active throttling right now

GPU monitoring (all Pi boards)

GPU data is collected via multiple vcgencmd calls:

Command Data
vcgencmd measure_clock v3d V3D GPU clock frequency in Hz (Pi 5; falls back to measure_clock core on other boards)
vcgencmd measure_clock core GPU core frequency in Hz (Pi 4B, Pi 3, Zero 2W)
vcgencmd get_mem gpu GPU memory allocation in MB (shown as "Shared" on Pi 5)
vcgencmd measure_temp GPU temperature
vcgencmd codec_enabled H264 H.264 hardware decode status
vcgencmd codec_enabled HEVC HEVC/H.265 hardware decode status (shown as "Hardware HEVC (BCM2712)" on Pi 5)

vcgencmd availability

All vcgencmd calls go through a centralized runner (VcgencmdRunner) that:

  • Uses tokio::process::Command with a 2-second timeout
  • Caches results for 1 second minimum to reduce subprocess overhead
  • Returns None if vcgencmd is not installed or fails
  • Never panics on errors