Deel 4: Maken RRD database, python script uitlezen sensoren en script om graphs te maken


Onderstaand heeft mij een paar dagen gekost om het voor elkaar te krijgen.

Ik heb een Apache webserver op de Raspberry Pi geinstalleerd, middels:

sudo apt-get install apache2

Daarna met RRDTOOLS aan de gang.

Heel veel websites bezocht en voorbeelden bekeken en daarna heb ik, voor het aanmaken van de RRD database, het volgende gedaan:

pi@raspberrypi(gej): ~ $ sudo -i
root@raspberrypi:~# cd /var/www/   
root@raspberrypi:/var/www# mkdir rrdtemperature
root@raspberrypi:/var/www# cd rrdtemperature/
root@raspberrypi:/var/www/rrdtemperature# nano create_rrd_db.sh

onderstaand in de create_rrd_db.sh file gezet:

#!/bin/bash
rrdtool create temperature.rrd –start 1371018212 –step 60 \
DS:cv_aanvoer:GAUGE:900:-15:100 \
DS:cv_retour:GAUGE:900:-15:100 \
DS:b_aanvoer:GAUGE:900:-15:100 \
DS:b_retour:GAUGE:900:-15:100 \
DS:wp_aanvoer:GAUGE:900:-15:100 \
DS:wp_retour:GAUGE:900:-15:100 \
RRA:AVERAGE:0.5:1:525600 \
RRA:AVERAGE:0.25:60:87600

Daarna:

root@raspberrypi:/var/www/rrdtemperature# bash create_rrd_db.sh
root@raspberrypi:/var/www/rrdpower# ls -la

dan zie je dat de database temperature.rrd is aangemaakt:

-rw-r–r– 1 pi www-data 29436312 Apr 3 22:11 temperature.rrd

Uitleg:

Bovenstaand script maakt (create) een database genaamd temperature.rrd en start op UNIX time 1371018212 (in het verleden, maakt niet uit welke tijd) en –step 60 is de interval in seconden (1 minuut) waarbij de data in de *.rrd wordt gezet.

Deze krijgt zes waardes, namelijk “cv-aanvoer”, “cv-retour”, “b-aanvoer”, “b-retour”, “wp-aanvoer” en  “wp-retour”. Ik kreeg eerst alleen maar foutmeldingen, waarna bleek dat de waardes die ik tussen de aanhalingstekens had gezet veel te lang waren (bijvoorbeeld “warmtepanelenaanvoer” geeft foutmeldingen) Dus korte benamingen gebruiken.

GAUGE:900 is om met temperaturen te werken (in mijn geval van -15 tot 100), met een heartbeat van 900 (maximum aantal seconden tussen twee updates van data, voordat de waarde op *Unknown* wordt gezet. (heb ik niet zelf bedacht maar komt uit een voorbeel van internet).

RRA staat voor Round Robin Archive. Het formaat is als volgt RRA:CF:xff:steps:rows.

CF in mijn geval op AVERAGE=het gemiddelde van de gegevenspunten wordt opgeslagen.

xff= de xfiles-factor definieert welk deel van een consolidatie-interval kan worden samengesteld uit * unknown * -gegevens, terwijl de geconsolideerde waarde nog steeds als bekend wordt beschouwd. (in mijn geval 0.5 en 0.25 en komt uit een voorbeeld van internet).

steps= de resolutie van een archief. (in mijn geval 1 en 60 kom uit een voorbeeld van internet).

rows=de tijdspanne die een archief kan bevatten. Het aantal waarden dat in een archief kan worden opgeslagen. (in mijn geval 525600 en 87600 en komt uit een voorbeeld van internet)

Voor meer uitleg hierover in het Engels: Uitleg RRDTOOL.

Een voorbeeld van een database:

rrdtool create download.rrd \
        --step 300 \
        DS:inet_down_total:DERIVE:600:0:U \
        DS:inet_down_comp1:DERIVE:600:0:U \
        DS:inet_down_comp2:DERIVE:600:0:U \
        DS:inet_down_other:DERIVE:600:0:U \
        RRA:AVERAGE:0.5:1:288 \
        RRA:AVERAGE:0.5:3:672 \
        RRA:AVERAGE:0.5:12:744 \
        RRA:AVERAGE:0.5:72:1460

creates a database that

  • is updated every 5 minutes
  • has for data sources that that can save values from 0 to unlimited
  • saves 1 day in 5-minute resolution (288 * (300*1/60) / 60/24)
  • saves 1 week in in 15-minute resolution (672 * (300*3/60) / 60/24)
  • saves 1 month in 1-hour resolution (744 * (300*12/60) / 60/24)
  • saves 1 year in 6-hour resolution (1460 * (300*72/60) / 60/24)

Python script om de database gevuld te krijgen:

Hierbij heb ik (wederom) gebruik gemaakt van een voorbeeld vanaf het internet voor het uitlezen van twee 1-wire sensoren. Het is daarna gemakkelijk om meerdere sensoren toe te voegen in onderstaand script. Let wel op dat de naam van de sensor tussen aanhalingstekens hetzelfde is als welke is gebruikt voor het aanmaken van de database!

#!/usr/bin/python

import rrdtool

databaseFile = “/var/www/rrdtemperature/temperature.rrd”

MIN_TEMP = -30

ERROR_TEMP = -999.99

rrds_to_filename = {

“cv_aanvoer” : “/sys/bus/w1/devices/28-000009b7c37a/w1_slave”,

“cv_retour” : “/sys/bus/w1/devices/28-000009b84404/w1_slave”,

“b_aanvoer” : “/sys/bus/w1/devices/28-000009b82502/w1_slave”,

“b_retour” : “/sys/bus/w1/devices/28-000009b8818e/w1_slave”,

“wp_aanvoer” : “/sys/bus/w1/devices/28-000009b85d76/w1_slave”,

“wp_retour” : “/sys/bus/w1/devices/28-000009b833b8/w1_slave”,

}

def read_temperature(file):

tfile = open(file)

text = tfile.read()

tfile.close()

lines = text.split(“\n”)

if lines[0].find(“YES”) > 0:

temp = float((lines[1].split(” “)[9])[2:]) # (get rid of the t=)

temp /= 1000

return temp

return ERROR_TEMP

def read_all():

template = “”

update = “N:”

for rrd in rrds_to_filename:

template += “%s:” % rrd

temp = read_temperature(rrds_to_filename[rrd])

update += “%f:” % temp

update = update[:-1]

template = template[:-1]

rrdtool.update(databaseFile, “–template”, template, update)

read_all()

NOOT naar aanleiding van het maken van de Cronjobs in deel 5:

De tekst in het rood hierboven moest ik later nog invoegen omdat de crontab niet goed werkte (zie deel 5). Hieronder in de graph.sh had ik al wel verwijzingen gemaakt naar /var/www/html/dag.png (de plaats waar de graph.png komt te staan), maar nog niet in welke folder/map het bestand temperature.rrd stond, dus ook die moest aangepast worden (ook in het rood)

Script om een grafiek te maken met RRDTOOL:

Rest ons nog om een grafiek te maken. Ik heb onderstaand script gebruikt, afkomstig als voorbeeld van het internet en aangepast voor mijn eigen gebruik:

Commando: root@raspberrypi:/var/www/rrdtemperature# nano graph.sh

Met als inhoud (kopieren):

#!/bin/sh

rrdtool graph /var/www/html/dag.png \
–title “Temperatuur meting over periode van een dag” \
–start now-1d –end now \
–width=640 –height=480 \
–step=60 -v degreesC \
DEF:cv_aanvoer=/var/www/rrdtemperature/temperature.rrd:cv_aanvoer:AVERAGE \ DEF:cv_retour=/var/www/rrdtemperature/temperature.rrd:cv_retour:AVERAGE \
DEF:b_aanvoer=/var/www/rrdtemperature/temperature.rrd:b_aanvoer:AVERAGE \
DEF:b_retour=/var/www/rrdtemperature/temperature.rrd:b_retour:AVERAGE \
DEF:wp_aanvoer=/var/www/rrdtemperature/temperature.rrd:wp_aanvoer:AVERAGE \
DEF:wp_retour=/var/www/rrdtemperature/temperature.rrd:wp_retour:AVERAGE \
LINE2:cv_aanvoer#800000:”cv-aanvoer” \
LINE2:cv_retour#378000:”cv-retour” \
LINE2:b_aanvoer#007780:”boiler-aanvoer” \
LINE2:b_retour#220080:”boiler-retour” \
LINE2:wp_aanvoer#800080:”wp-aanvoer” \
LINE2:wp_retour#806000:”wp-retour”

Hiierbij wordt in de map www/html een afbeelding gegenereerd genaamd: dag.png, met een grootte van 640 x 480.

Bij mij is het dan met een browser naar het volgende adres gaan van de Raspberry Pi>>> Ip-adres/dag.png en dat levert het volgende op (momenteel gedeeltelijk gevuld omdat ik de metingen die erin staan handmatig heb gedaan, dus aantal keren achter de command line: python sensor.py uitgevoerd en daarna eenmaal bash graph.sh:

Nu moet ik nog een tweetal crontabs aan maken om beide scripts op gezette tijden te laten draaien.

Wordt vervolgd…………in het laatste deel 5.