Skip to content

Commit

Permalink
Initial support for nVidia GPU temp sensor
Browse files Browse the repository at this point in the history
  • Loading branch information
maclarsson committed Jul 23, 2022
1 parent 4d9f8e9 commit 240185a
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 26 deletions.
2 changes: 1 addition & 1 deletion cfancontrol/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.1.7"
__version__ = "1.1.8"
10 changes: 5 additions & 5 deletions cfancontrol/devicesensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def __exit__(self, exc_type, exc_val, exc_tb):
def get_temperature(self) -> float:
raise NotImplementedError()

def get_signature(self) -> float:
def get_signature(self) -> list:
raise NotImplementedError()


Expand Down Expand Up @@ -83,10 +83,10 @@ class HydroPlatinumSensor(AIODeviceSensor):
# Details: https://github.com/liquidctl/liquidctl/blob/main/liquidctl/driver/hydro_platinum.py

def __init__(self, device: HydroPlatinum):
device_description: str = device.description
device_name = "Corsair Hydro "
device_model = device_description.split(device_name, 1)[1]
super(HydroPlatinumSensor, self).__init__(device, device_model)
self.device_description: str = device.description
self.device_name = "Corsair Hydro "
self.device_model = self.device_description.split(self.device_name, 1)[1]
super(HydroPlatinumSensor, self).__init__(device, self.device_model)

def get_temperature(self) -> float:
LogManager.logger.debug(f"Reading temperature from {self.sensor_name} sensor")
Expand Down
60 changes: 60 additions & 0 deletions cfancontrol/nvidiasensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import subprocess
from subprocess import CompletedProcess, CalledProcessError
from typing import List, Dict

from .sensor import Sensor
from .log import LogManager

SMI_DETECT_COMMAND: List[str] = ['sh', '-c', 'nvidia-smi --query-gpu=index,gpu_name --format=csv,noheader,nounits']
SMI_SATUS_COMMAND: List[str] = ['sh', '-c', 'nvidia-smi --query-gpu=index,gpu_name,temperature.gpu,utilization.gpu,fan.speed --format=csv,noheader,nounits']


class NvidiaSensor(Sensor):

def __init__(self, index: int, device_name: str):
super().__init__()
self.index = index
self.device_name = device_name
self.device_description = device_name
self.sensor_name = "nVidia GPU"
self.current_temp = 0.0

def get_temperature(self) -> float:
LogManager.logger.debug(f"Reading temperature from {self.sensor_name}")
self.current_temp = 0.0
try:
command_result: CompletedProcess = subprocess.run(SMI_SATUS_COMMAND, capture_output=True, check=True, text=True)
result_lines = str(command_result.stdout).splitlines()
for line in result_lines:
if not line.strip():
continue
values = line.split(', ')
if int(values[0]) == self.index:
LogManager.logger.debug(f"{self.sensor_name} read-out: {line}")
temp = int(values[2])
if 0 <= temp <= 100:
self.current_temp = float(temp)
else:
LogManager.logger.warning(f"Invalid sensor data from {self.sensor_name}: {temp}")
except CalledProcessError:
LogManager.logger.warning(f"Problem getting status from nVidia GPU '{self.device_name}'")
return self.current_temp

def get_signature(self) -> list:
return [__class__.__name__, self.device_description, self.index, self.sensor_name]

@staticmethod
def detect_gpus() -> List['NvidiaSensor']:
detected_gpus = []
try:
command_result: CompletedProcess = subprocess.run(SMI_DETECT_COMMAND, capture_output=True, check=True, text=True)
result_lines = str(command_result.stdout).splitlines()
LogManager.logger.debug(f"Result of nVidia GPU detection: {result_lines}")
for line in result_lines:
if not line.strip():
continue
values = line.split(', ')
detected_gpus.append(NvidiaSensor(int(values[0]), values[1]))
except CalledProcessError:
LogManager.logger.debug(f"No nVidia GPU found")
return detected_gpus
2 changes: 1 addition & 1 deletion cfancontrol/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def get_name(self) -> str:
def get_temperature(self) -> float:
raise NotImplementedError()

def get_signature(self) -> tuple:
def get_signature(self) -> list:
raise NotImplementedError()


Expand Down
10 changes: 8 additions & 2 deletions cfancontrol/sensormanager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional, List
from typing import Optional, List, Dict

import liquidctl # liquidctl module
import sensors # PySensors module
Expand All @@ -7,6 +7,7 @@
from .sensor import Sensor, DummySensor
from .hwsensor import HwSensor
from .devicesensor import KrakenX3Sensor, HydroPlatinumSensor
from .nvidiasensor import NvidiaSensor
from .log import LogManager


Expand All @@ -17,7 +18,6 @@ class SensorManager(object):
@staticmethod
def identify_system_sensors():
# get sensors via PySensors and libsensors.so (part of lm_sensors) -> config in /etc/sensors3.conf
# sensors.init()
sensors.init(bytes(Environment.sensors_config_file, "utf-8"))
try:
for chip in sensors.iter_detected_chips():
Expand Down Expand Up @@ -45,6 +45,12 @@ def identify_system_sensors():
LogManager.logger.info(f"'{dev.description}' found")
SensorManager.system_sensors.append(HydroPlatinumSensor(dev))

# append sensors of GPUs (if found)
nvidia_gpus: List[NvidiaSensor] = NvidiaSensor.detect_gpus()
for gpu in nvidia_gpus:
LogManager.logger.info(f"nVidia GPU #{gpu.index} with name '{gpu.device_name}' found")
SensorManager.system_sensors.append(gpu)

@staticmethod
def get_system_sensor(signature: list) -> Optional[Sensor]:
for sensor in SensorManager.system_sensors:
Expand Down
18 changes: 9 additions & 9 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
setuptools~=45.2.0
pyqtgraph~=0.12.4
liquidctl~=1.6.1
numpy~=1.17.4
PyYAML~=5.3.1
PySensors~=0.0.4
pid~=3.0.4
PyQt5~=5.14.1
pyxdg~=0.28
setuptools
pyqtgraph
liquidctl
numpy
PyYAML
PySensors
pid
PyQt5
pyxdg
16 changes: 8 additions & 8 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ pythons_requires = >=3.7
setup_requires = setuptools_scm
install_requires =
setuptools~=45.2.0
pyqtgraph~=0.12.4
liquidctl~=1.6.1
numpy~=1.17.4
PyYAML~=5.3.1
PySensors~=0.0.4
pid~=3.0.4
PyQt5~=5.14.1
pyxdg~=0.28
pyqtgraph
liquidctl
numpy
PyYAML
PySensors
pid
PyQt5
pyxdg

[options.package_data]
cfancontrol = *
Expand Down

0 comments on commit 240185a

Please sign in to comment.