# Mac CPU watts in the terminal, no sudo

Canonical: https://plottypus.com/blog/mac-cpu-watts-without-sudo

Last updated: 2026-09-24

> No live watts in macOS. plottypus prints system and CPU watts without sudo: SMC rails on the M5 Pro, a held IOReport value with its age on other chips.

macOS does not show live wattage. Activity Monitor has Energy Impact, which is a score, not watts. System Information shows charger wattage and battery current, not a live CPU figure. `powermetrics` samples power, and it asks for sudo every time.

plottypus prints watts in the terminal without sudo.

```sh
plottypus
```

The power panel leads with whole-system power, the SMC `PSTR` key: what the Mac is drawing from the adapter or the battery. Then the rails that currently have a reading: `cpu`, `gpu`, `ane`, `dram`. A rail with no reading is left out. Anything under 0.05 W counts as absent, so it is never printed as `0.0W` to fill a gap.

## Where the CPU number comes from

On one machine the CPU figure is live. That machine is the MacBook Pro with an M5 Pro, model Mac17,8. plottypus reads the SMC CPU power rails there, averages three sensor sweeps, and checks the sum against recent `PSTR`. On that Mac the rail sum lands within about 10% of IOReport's CPU energy rate. The calibration and the side-by-side runs are published: [SMC rail calibration](https://plottypus.com/data/smc-rails-calibration), [macmon and mactop beside plottypus](https://plottypus.com/data/macos27-cpu-power-side-by-side).

On every other Mac, CPU watts come from the IOReport `CPU Energy` counter. On macOS 27 that counter publishes in batches, 2 to 108 seconds apart in our captures on the M5 Pro, and sometimes not for much longer. plottypus does not divide one quiet second by one second and print 0 W. It divides by the driver's own timestamps between two publications, holds that rate, and marks it.

Two marks:

- `≈` means the value is held, or estimated, and the expanded power panel says how old it is (`held 4s`).
- `—` means there is no value. After 10 seconds a held reading is dropped, and the rail stays absent until the next publication. JSON uses `null`, not `0`.

GPU watts are the exception that stays live. They come from the IOReport `GPU Energy` channel, which was still publishing on every read in these captures, on every chip the tables cover.

The long version of the macOS 27 batching, with the traces, is [why CPU power reads 0.00 W](https://plottypus.com/blog/macos-27-cpu-power-0w). I did not run `powermetrics` for that. It is an IOReport client, so it may see the same batches, and "may" is not a measurement.

## One number, in a script

```sh
plottypus --json | jq '{cpu: .cpu_power, gpu: .gpu_power, system: .sys_power}'
```

`--json` takes one interval before it prints, so the rates exist, and waits up to about 2.5 seconds for the slow sensors. `null` means this Mac did not provide that rail for this sample. A real zero would be `0`. Field names and units are in [JSON output](https://plottypus.com/docs/json). `plottypus --demo --json` prints a canned session on a Mac with no sensors, if you want the shape without hardware.

The CPU watt figure from the SMC rails refreshes with the sensor sweep, about every 2 seconds at the default interval, on the M5 Pro capture. The headline in the panel can move faster than that when other tokens change.

## What was actually run

Everything dated in the power posts was measured on one MacBook Pro: Mac17,8, M5 Pro, macOS 27.0 (build 26A428), plottypus 1.0.0, no sudo. Other chips use the IOReport path above. They have not each been run on hardware. `plottypus doctor` says which path this Mac took. The model table is [Supported Macs](https://plottypus.com/docs/supported-macs). The panel reference is [Power and battery](https://plottypus.com/docs/panels#power-and-battery).

Temperatures and fan rpm, which this panel does not show, are [Check Mac CPU temperature in the terminal](https://plottypus.com/blog/mac-cpu-temperature-terminal).
