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/