Real time grafiek CPU temperatuur Raspberry Pi

Ik gebruik mijn Raspberry Pi (RPI) voor basisfuncties zoals DNS filtering, VPN en als netwerkcontroller.

Om inzicht te hebben in het functioneren van mijn RPI wil ik real-time het dagelijkse temperatuurverloop van de CPU van RPI in een grafiek weergeven. Tevens wil ik in één oogopslag zien wat de hoogste gemeten CPU temperatuur is de afgelopen 24 uur. Het resultaat dat ik heb bereikt:

Voor het creëren van de grafiek maak ik gebruik van Python en Shell scripts, crontab en GNUplot. Op de RPI wordt met een Crontab job om de twee minuten een meting uitgevoerd en de meetresultaten in een file opgeslagen. Elke 5 minuten wordt een andere Crontab job de bovenstaande grafiek berekend en als PNG afbeelding geüpload naar deze website.

Ik heb gebruik gemaakt van de informatie van deze blogpost (hier ook de kopiepagina) en aangepast aan mijn wensen.

Als eerste heb ik de file datagen.py enigszins aangepast door het pad na ‘cmd =‘ weg te laten:

#!/usr/bin/env python

import sys, os, logging, urllib, datetime

def fetchtemp():
	cmd = 'vcgencmd measure_temp'
	line = os.popen(cmd).readline().strip()
	output = line.split('=')[1].split("'")[0]#+' C'
	return output 

format = "%Y-%m-%d,%H:%M:%S" 
today = datetime.datetime.today()
s = today.strftime(format)
output = s+' '+fetchtemp()+'\n'

print(output)

with open('/home/pi/plottemp/tempdata.dat', 'a') as f:
	f.write(output)

De metingen die met het python script worden uitgevoerd worden in een file genaamd tempdata.dat opgeslagen. Mijn uitgangspunt is om deze file in afmeting te beperken tot het aantal metingen die nodig zijn om een grafiek te maken over de laatste 24uur. Omdat ik elke 2 minuten een meting uitvoer moet de file tempdata.dat tenminste 720 metingen bevatten. Mijn aanvulling in de file plottemp.sh zorgt dat er maximaal 1050 meetingen worden opgeslagen. Bij de 1051ste meting worden automatisch de laatste 1000 metingen naar een file tempdata.bak file gekopieerd. Vervolgens wordt deze file over de oorspronkelijke tempdata.dat file gekopieerd.

Daarnaast heb ik de weergave van de tijd-as aangepast aan de Central European Timezone (CET).

En als laatste heb ik in de grafiek een horizontale lijn opgenomen die de hoogste temperatuurmeting weergeeft van de laatste 1050 metingen.

Ik heb de file plottemp.sh daarvoor als volgt aangepast:

#!/bin/bash

# use 2 files to store up to 1050 measurements
tempdata="/home/pi/plottemp/tempdata.dat"
tempdata_bak="/home/pi/plottemp/tempdata.bak"
output=$(cat $tempdata | wc -l 2>&1)

if
        [ $output -gt 1050 ];
then

cat $tempdata | tail -1000 > $tempdata_bak

cp $tempdata_bak $tempdata
fi

python3 /home/pi/plottemp/tempdata.py

# Current time adjust in CET
curr_time_utc=time(0)
time_diff=2*60*60
curr_time_cet=curr_time_utc + time_diff

echo "set terminal png size 1000, 400

set title '$(date +%Y-%m-%d) $(hostname -f) $(hostname -I | grep -Eo '^[^ ]+')'

# Variable declareren voor maximum gemeten Y waarde over de tijdperiode
stats '/home/pi/plottemp/tempdata.dat' u 2 nooutput name 'Y_'
set yrange [20:(Y_max)+10]
set ylabel 'CPU Temperature (degrees)'
set ytics 5

# Adjust X-axis settings for correct CET time display
set xdata time
set xlabel 'CET Time (hrs)'
set xrange [ curr_time_cet - 96400 : curr_time_cet ]   # 86400 sec = 1 day
set grid xtics
set grid ytics
set xtics 3600 rotate by 45 right

# Adjust timeformat according to the data in tempdata.dat
set timefmt '%Y-%m-%d,%H:%M:%S'
set format x '%H:%M'

set output '/home/pi/plottemp/tempplot.png'

plot Y_max w l lt 3 lc 'red' title 'Maximum Temperature' , '/home/pi/plottemp/tempdata.dat' using 1:2 with lines lc 'blue' lw 2 title 'CPU Temp deg C'" | gnuplot

Om dit ook toe te passen op mijn Apple computers maak ik gebruik van de applicatie OSX CPU Temp. Om de applicatie te installeren kun je of de binaries gebruiken als deze al voor jouw versie van MacOs gecompileerd zijn. Anders kun je het zelf via Homebrew compileren en installeren.

Met de MacOS versie Monterey op een van mijn Apple computers kon GNUplot het schaalbare lettertype Arial niet vinden en gebruikte in plaats daarvan een standaard niet schaalbaar lettertype. Om dit te verhelpen heb ik in de crontab het pad naar het lettertype Arial opgenomen. Ik heb ook 10 seconde wachttijd opgenomen voor het wegschrijven van de grafiek zodat het niet conflicteert met het genereren van de grafiek. De regels in de crontab zien er als volgt uit:

# GNUplot PATH variable naar de locatie van het schaalbare lettertype
# Arial definiëren
GDFONTPATH=/System/Library/Fonts/Supplemental/
GNUPLOT_FONTPATH=/System/Library/Fonts/Supplemental/

# Ophalen van CPU temperatuur
*/2 * * * * /Users/user/plottemp/plottemp.sh

# Wegschrijven van de CPU temperatuurgrafiek naar website.
*/5 * * * * sleep 10;/usr/local/opt/curl/bin/curl -sT /Users/user/plottemp/tempplotmacos.png -k sftp://user:password@website/data/sites/web/subsites/plottemp/