The following CLI command will show the current Raspberry Pi operating state... wheather the Pi is throttling the CPU due to overheating or an under-voltage condition. "vcgencmd get_throttled" The outputs of that command are as follows... Bit Hex value Meaning 0 1 Under-voltage detected 1 2 Arm frequency capped 2 4 Currently throttled 3 8 Soft temperature limit active 16 10000 Under-voltage has occurred 17 20000 Arm frequency capping has occurred 18 40000 Throttling has occurred 19 80000 Soft temperature limit has occurred A value of 0x50000 means 16 & 18 -- from the boot moment up to now Under-Voltage has occurred at some point as well as Throttling has occurred. "vcgencmd measure_temp" - will show CPU temp in Celcius Raspberry Pi CPU will throttle CPU at: 60C - soft temp limit - low throttle - Pi 3B+ and above models 80C - high temp throttle - mid throttle - all models 85C - max temp limit - high throttle - all models "vcgencmd measure_volts" - shows the core CPU voltage Outputs are as follows... volt=0.8xxx - 0.9xxx - proper voltage for Pi 4 volt=1.2xxx - 1.3xxx - proper voltage for Pi 2 and 3 Write the following script into a file called checkthrottle.sh and run it with "sudo bash checkthrottle.sh" for a more plain-English output of the vcgencmd get_throttled command... #!/bin/bash -e # Check whether a Raspberry Pi is currently experiencing insufficient # power or overheating or if it has had such problems in the past. # From vcgencmd(1) # get_throttled # Returns the throttled state of the system. This is a bit # pattern - a bit being set indicates the following meanings: # 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 # A value of zero indicates that none of the above conditions # is true. A=( [ 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" ) for ((i=0; i<32; i++)); do if [[ ! ${A[i]} ]]; then A[i]="set, but meaning is unknown. See vcgencmd(1)." fi done # vcgencmd get_throttled returns a string like "throttled=0x50000" eval $(vcgencmd get_throttled) # If user supplied a number (e.g., 0x50005), use it instead. if [[ "$1" ]]; then throttled="$1"; fi if (( throttled == 0 )); then echo "No problems with voltage or temperature since boot." elif (( (throttled & 0xFF) == 0 )); then echo "Problems have occurred but are not happening now." fi for ((i=0; i<32; i++)); do if (( throttled & 2**i )); then echo "bit $i: ${A[$i]}" fi done # Exit with a non-zero value if problems are occurring now. exit $(( throttled & 0xFF )) To see all the commands available with vcgencmd type "vcgencmd commands" commands="vcos, ap_output_control, ap_output_post_processing, vchi_test_init, vchi_test_exit, pm_set_policy, pm_get_status, pm_show_stats, pm_start_logging, pm_stop_logging, version, commands, set_vll_dir, set_backlight, set_logging, get_lcd_info, arbiter, cache_flush, otp_dump, test_result, codec_enabled, get_camera, get_mem, measure_clock, measure_volts, enable_clock, scaling_kernel, scaling_sharpness, get_hvs_asserts, get_throttled, measure_temp, get_config, hdmi_ntsc_freqs, hdmi_adjust_clock, hdmi_status_show, hvs_update_fields, pwm_speedup, force_audio, hdmi_stream_channels, hdmi_channel_map, display_power, read_ring_osc, memtest, dispmanx_list, get_rsts, schmoo, render_bar, disk_notify, inuse_notify, sus_suspend, sus_status, sus_is_enabled, sus_stop_test_thread, egl_platform_switch, mem_validate, mem_oom, mem_reloc_stats, hdmi_cvt, hdmi_timings, readmr, pmicrd, pmicwr, bootloader_version, bootloader_config, file, vctest_memmap, vctest_start, vctest_stop, vctest_set, vctest_get"