In the last post we setup InfluxDB, now we are going to start storing system parameters every minute. It will work out of the box for Raspberry Pi and probably for some other Linux distros.
We are going to log the system uptime, the CPU & GPU Temperatures, the current CPU usage as well as the average CPU usage since boot.
The code is available here or copy from the end of this post. Put the code in a file called soc.sh, don’t forget to update your IP address in the code and make it executable by:
chmod +x soc.sh
We are going to log to database rpi_01, if you don’t have this created already complete the below:
influx create database rpi_01 exit
Test our script run:
bash soc.sh
To confirm it works we can check the database:
influx use rpi_01 select * from system_status
and you should see something like: (type exit when you are done)
name: system_status time cpu_temp cpu_usage gpu_temp system system_model uptime 15329 39.5 14 40.1 RPI-01 ZeroW_V1.1 1386.68
Now we want the system status to be logged every minute, we do this by adding it to crontab:
crontab -e
Add this line and save and close: (ensure path is correct to your file)
*/1 * * * * /home/pi/influx_scripts/soc.sh
Check back after a while to ensure the logging is happening. In the next post we are going to show the status in graphical form using Grafana like the below:
soc.sh code:
#!/bin/bash # Gets SOC GPU Temperatures gpu_temp_0=$(/opt/vc/bin/vcgencmd measure_temp | tr -cd '0-9.') # Gets System Uptime uptime=0 uptime=$(awk '{print $1}' /proc/uptime) # Gets SOC CPU Temperatures cpu_temp_0=$(cat /sys/class/thermal/thermal_zone0/temp) cpu_temp_1=$(($cpu_temp_0/1000)) cpu_temp_2=$(($cpu_temp_0/100)) cpu_temp_3=$(($cpu_temp_2 % $cpu_temp_1)) cpu_temp_4=$cpu_temp_1"."$cpu_temp_3 # Converts the total CPU Usage into % PREV_TOTAL=0 PREV_IDLE=0 Average=0 for i in {1..6} do # Since the CPU fluctuates, it discards the first reading and averages the next 5. CPU=(`sed -n 's/^cpu\s//p' /proc/stat`) # Discards the cpu prefix IDLE=${CPU[3]} # Just the idle CPU time. # Calculate the total CPU time. TOTAL=0 for VALUE in "${CPU[@]}"; do let "TOTAL=$TOTAL+$VALUE" done # Calculate the CPU usage since we last checked. let "DIFF_IDLE=$IDLE-$PREV_IDLE" let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL" let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10" # Remember the total and idle CPU times for the next check. PREV_TOTAL="$TOTAL" PREV_IDLE="$IDLE" if [ $i -gt 1 ] # Ignores 1st reading as this is CPU average since boot then let Average="$DIFF_USAGE+$Average" fi # Wait 1s before checking again. sleep 1 done let Average="$Average/5" curl -i -XPOST 'http://your.influxDB.ip.address:8086/write?db=rpi_01' --data-binary 'system_status,system=RPI-01,system_model=Insert_Model_Name cpu_usage='$Average',cpu_temp='$cpu_temp_4',gpu_temp='$gpu_temp_0',uptime='$uptime''
Credit to resources I used:
https://hwwong168.wordpress.com/2015/10/12/raspberry-pi-2-gpu-and-cpu-temperature-logger-with-influxdb/
How does the command look like for sendig the data to an influxdb v2.1?
Have a look here perhaps: https://docs.influxdata.com/influxdb/v2.2/write-data/developer-tools/api/