Source code for piview.CPU

# Project:    PiView
# Filename:   CPU.py
# Location:   ./piview
# Author:     Adrian Gould <adrian.gould@nmtafe.wa.edu.au>
# Created:    10/04/21
#
# This file provides the following features, methods and associated supporting
# code:
# - speed
# - maximum load
# - temperature

import subprocess

import psutil

from piview.Utils import Utils


[docs]class CPU: @staticmethod
[docs] def speed(): """ Get the CPU frequency using the vcgencmd on Linux based systems If frequency cannot be determined, returns -1 :rtype: integer :return: The CPU frequency in MHz """ try: output = subprocess.check_output( ['vcgencmd', 'get_config', 'arm_freq']) output = output.decode() lines = output.splitlines() line = lines[0] freq = line.split('=') freq = float(freq[1]) except: freq = -1 return freq
@staticmethod
[docs] def max_load(random=False): """ This function returns the maximum "CPU load" across all CPU cores, or -1 if no value determined. Providing a random=True parameter value will return a random value if the actual CPU load can't be determined. :param random: boolean default False :rtype: float :return: The maximum CPU Load in range 0-100 """ value = -1 if psutil is not None: value = max(psutil.cpu_percent(percpu=True)) if random: value = Utils.random_percentage() return float(value)
@staticmethod
[docs] def temperature(): """ Requests the CPU temperature from the vcgencmd returning the result to the caller as a floating point value to 2DP If no value can be determined, uses -999.99 as the returned "error" value. :rtype: float :return: The CPU temperature in degrees Celsius """ try: temp = subprocess.check_output(['vcgencmd', 'measure_temp']) temp = float(temp[5:-3]) except: temp = -999.99 temp = round(temp, 2) return temp
@staticmethod
[docs] def temperature_k(): """Provide temperature of the CPU in degrees Kelvin :return: CPU Temperature in Kelvin """ temp_k = CPU.temperature() if temp_k == -999.99: return temp_k return temp_k - 273.16