-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsysTemp.py
executable file
·95 lines (79 loc) · 3.33 KB
/
sysTemp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
## @package stepper.py
## @brief ReadTemperatures measure CPU /GPU temperature
## @author Jeroen Veen
import os
import traceback
from objectSignals import ObjectSignals
from PyQt5.QtCore import QTimer, QObject, pyqtSlot, pyqtSignal
## @brief Periodically read temperatures and signal an alarm if threshold is exceeded
## @author Jeroen Veen
class SystemTemperatures(QObject):
timer = QTimer()
signals = ObjectSignals()
alarm = pyqtSignal()
alarmRemoved = pyqtSignal()
failure = pyqtSignal()
def __init__(self, interval=1, alarm_temperature = 50, failure_temperature = 65):
super().__init__()
self.interval = 1000*interval
self.threshold = alarm_temperature
self.fail_threshold = failure_temperature
self.timer.timeout.connect(self.update)
self.timer.start(self.interval)
self.alarmed = False
def update(self):
try:
cpu_temp = float(self.get_cpu_tempfunc())
self.msg('info;T_CPU={:.1f}°C'.format(cpu_temp))
if (cpu_temp > self.fail_threshold):
self.failure.emit()
self.msg("error;temperature gets too high")
elif (cpu_temp > self.threshold) and not self.alarmed:
self.alarm.emit()
self.alarmed = True
self.msg("info;temperature alarm on")
elif (cpu_temp < 0.95*self.threshold) and self.alarmed:
self.alarmRemoved.emit()
self.alarmed = False
self.msg("info;temperature alarm off")
except Exception as err:
traceback.print_exc()
self.signals.error.emit((type(err), err.args, traceback.format_exc()))
@pyqtSlot()
def resetAlarm(self):
self.alarmRemoved.emit()
self.alarmed = False
@pyqtSlot()
def stop(self):
self.msg("info;stopping")
if self.timer.isActive():
self.timer.stop()
self.signals.finished.emit()
def msg(self, text):
if text:
text = self.__class__.__name__ + ";" + str(text)
self.signals.message.emit(text)
## @brief Return CPU temperature as a string, based on https://github.com/gavinlyonsrepo/raspberrypi_tempmon
def get_cpu_tempfunc(self):
""" Return CPU temperature """
result = 0
try:
mypath = "/sys/class/thermal/thermal_zone0/temp"
with open(mypath, 'r') as mytmpfile:
for line in mytmpfile:
result = line
result = float(result)/1000
result = round(result, 1)
except Exception as err:
traceback.print_exc()
self.signals.error.emit((type(err), err.args, traceback.format_exc()))
return str(result)
## @brief Return GPU temperature as a string, based on https://github.com/gavinlyonsrepo/raspberrypi_tempmon
# a some point os.popen keeps throwing an OSError: [Errno 12] Cannot allocate memory
# no clue how to solve this, so just skip GPU temperature
def get_gpu_tempfunc(self):
""" Return GPU temperature as a character string"""
res = os.popen('/opt/vc/bin/vcgencmd measure_temp').readline()
res = res.replace("temp=", "")
res = res.replace("'C", "")
return res