RRDtool HowTo

Från Temperatur.nu
Hoppa till navigeringHoppa till sök

Bakgrund

Detta är en fortsättning på HowTo OWFS skulle man kunna säga och syftet är att kunna göra sin första graf över temperaturen. Detta är inte så knepigt, eller i alla fall inte lika knepigt som att få igång OWFS! Dock är inte RRDtool helt solklart direkt från början, det skiljer sig lite från en traditionell databas. Antingen så gör ni guiden uppifrån och ned utan att ställa frågor, eller så börjar ni med att läsa på lite om RRDtool från början, se Läs vidare nedan.

Mål

Få igång vår första loggning av temperatur och spara det till en RRD databas, samt att rita en enkel graf med hjälp av RRDtool

Programvaror

Beskrivning

Jag förutsätter att du har OWFS igång redan (eller annan programvara), för att kunna läsa av ditt 1-wire nätverk. Om du inte har det så läs HowTo OWFS först. Den här är gjord på Ubuntu, men som vanligt så bör det funka även på andra distributioner.

Till att börja med så måste vi installera RRDtool, och även stöd för Perl.

sudo apt-get install rrdtool perl librrdp-perl librrds-perl

Bör inte vara några konstigheter

Sen för att visa själva grafen så behövs även Apache2 installerat. Om ni inte redan har den igång installera den då

sudo apt-get install apache2

Sen vill vi skapa katalogerna där vi tänkt spara rrddata'n och script katalogen.

sudo mkdir ~/bin
sudo mkdir ~/rrddata

Jag har valt att lägga skripten i /home/anders/bin/ och rrd-filer (databaser) i /home/anders/rrddata/. Ni skall givetvis skriva ert användarnamn istället för anders. Alternativt om ni väljer att spara skripten/filerna någon annanstans så får ni anpassa de sökvägar som berörs nedan.

Sen skall vi skapa vår första rrd databas. Antingen så kan man skriva allt direkt i prompten, men jag tycker det är lättare att skapa ett enkelt shell script för att då har man kvar vad man gjort. ;-) Vissa kanske tycker att det är en om väg, men i slutändan lönar det sig, i alla fall i utbildningssyfte.

 cd /home/anders/rrddata/
 sudo nano create_rrd.sh

Lägg till följande...

#!/bin/bash
# Script to create rrd-file 

# 24h with 2,5 min resolution
# 7d with 5 min resolution
# 1y with 10 min resolution
# 20y with 1h resolution

directory="/home/anders/rrddata/"
filename="outside_temp.rrd"

# Check i file already exists
if [ ! -f "$directory$filename" ]
then
	# File doesn't exist, create new rrd-file
	echo "Creating RRDtool DB for outside temp sensor"
	rrdtool create $directory$filename \
		 --step 150 \
		 DS:outsidetemp:GAUGE:300:-50:60 \
		 RRA:AVERAGE:0.5:1:576 \
		 RRA:AVERAGE:0.5:2:2016 \
		 RRA:AVERAGE:0.5:4:52560 \
		 RRA:AVERAGE:0.5:24:175200 \
		 RRA:MAX:0.5:1:5760 \
		 RRA:MAX:0.5:2:2016 \
		 RRA:MAX:0.5:4:52560 \
		 RRA:MAX:0.5:24:175200 \
		 RRA:MIN:0.5:1:5760 \
		 RRA:MIN:0.5:2:2016 \
		 RRA:MIN:0.5:4:52560 \
		 RRA:MIN:0.5:24:175200
	echo "Done!"
else
	echo $directory$filename" already exists, delete it first."
fi

...och spara sen. (i nano, CTRL-X) Tidsrymden och upplösningen på den sparade datan kanske är i överkant, men det kan ni ändra sen om ni vill.

Ändra så att vi får kör rättigheter på scriptet.

sudo chmod +x create_rrd.sh

Kör scriptet

create_rrd.sh

och förhoppningsvis så skall det ha skapats en outside_temp.rrd fil.

Nu har vi själva filen för att spara information i. Nu skall vi skapa script som loggar temperaturen.

cd /home/anders/bin
sudo nano get_temp.sh

Lägg till följande

#!/bin/bash

OutsideTempSensor="10.51777C010800"
RRDDataDirectory="/home/anders/rrddata/"
RRDDataFile="outside_temp.rrd"

# Get temps form OWFS
OutsideTemp=`cat /mnt/1wire/$OutsideTempSensor/temperature|sed -e s/" "//g|awk '{$1=$1 + 0.005;printf "%.2f", $1}'`

#Update RRD database
rrdtool update $RRDDataDirectory$RRDDataFile N:$OutsideTemp
echo $OutsideTemp

och spara.

Ändra så att vi får kör rättigheter på scriptet.

sudo chmod +x get_temp.sh

Nu har vi en rrd fil som sparar information, vi har ett script som hämtar information och uppdaterar rrd filen, återstår gör biten med att rita en graf. Så nu fixar vi det! Detta görs med ett Perl script.

sudo nano graph_temp.pl

lägg till följande

#!/usr/bin/perl

use RRDs;

my $cur_time = time();
my $start_time = $cur_time - 86400;     # set end time to 24 hours ago 
                
RRDs::graph "/var/www/graph_temp.png",   
			"--start= $start_time",
			"--end= $cur_time",
			"--title= Temp ute",
			"--height= 300",
			"--width= 500",
			"--vertical-label= °C",
	      "DEF:OutsideTemp=/home/anders/rrddata/outside_temp.rrd:outsidetemp:AVERAGE",                          
			"COMMENT:\t\t\t\tNu     Medel    Max    Min\\n",
			"HRULE:0#0000FF",         
	      "LINE2:OutsideTemp#0000FF:Ute\t\t\t",    
			"GPRINT:OutsideTemp:LAST:%6.1lf",
			"GPRINT:OutsideTemp:AVERAGE:%6.1lf",
			"GPRINT:OutsideTemp:MAX:%6.1lf",
			"GPRINT:OutsideTemp:MIN:%6.1lf\\n";

my $err=RRDs::error;
if ($err) {print "problem generating the graph: $err\n";}

print "Done!\n"

Det här läser från vår rrd fil och skapar en graf med senaste 24h i /var/www/

För att det här skall "gå av sig själv" så måste vi lägga till två jobb i crontab för att det skall funka. Öppna crontab för redigering

sudo crontab -e

lägg till

*/2.5 * * * *           /home/anders/bin/get_temp.sh
*/2.5 * * * *           export LANG=sv_SE.utf8 && /home/anders/bin/graph_temp.pl

och spara.

Om nu allt funkar som det skall så loggas temperatur och det skapas en ny graf var 5:e minut. För att se grafen gå till http://localhost/graph_temp.png eller http://mindoman/graph_temp.png

Läs vidare

Som jag skrev ovan så är det inte självklart hur RRDtool funkar, i alla fall tycker inte jag det. Så tipset för att komma vidare är att läsa på deras hemsida, och speciellt deras rrdtutorial. Läser ni den och gör exemplen så har ni kommit en bra bit på vägen. Sen är det bara att ändra/lägga_till/testa i era script för att se vad som händer ;-). Mer info exakt vad dom olika delarna i skapandet av rrd databasen och graferna betyder läser ni om i RRDtools dokumentation. Om ni vill gå vidare och logga er elförbrukning sen så kan jag rekommendera Eriks guide Mäta elförbrukning med rrdtool.

Det här är ETT sätt att få ingång loggning, det går att göra på hur många olika sätt som helst. Kanske inte är det enklaste eller bästa sättet som jag beskrivit men det bör fungera och hjälpa er att komma igång. Som alltid så kan det finnas felaktigheter. Hittar ni några så skriv gärna en kommentar så ser jag till att hålla HOWTO'n uppdaterad. Håll till godo (...än en gång)! ;-)

Källor