Raspberry Pi - rrd - slimme meter


De meeste vragen die ik krijg over het aansluiten van de rpi aan de slimme meter zijn vanwege het maken van de grafiekjes.

Ruwweg gebeurd dit in 5 stappen

rrd database aanmaken
Uitlezen data
extraheren precieze data en in rrd zetten
rrd grafiek maken
Bovenstaande laatste 3 akties elke 5 minuten uitvoeren

Basis

Voorwaarde voor dit alles is dat je al een p1uitlezen.py script actief hebt en snapt hoe dat werkt.
zie ook http://www.gejanssen.com/howto/Slimme-meter-uitlezen/index.html
Bij mij draait het python uitleesscript onder user gej.

Vervolgens heb ik via voorgaande link ook een webserver geinstalleerd (apache) en de bijbehorende php module die ik nodig heb.

Onder deze website zet ik ook mijn rrdpower neer. De locatie hiervoor wordt dan /var/www/rrdpower

Als de basis er is, zorg er dan natuurlijk ook voor dat rrdtool geinstalleerd is. Zie hiervoor ook de vorige pagina.

Aanmaken database

Dan kunnen we nu beginnen met het aanmaken van de database.

gej@raspberrypi(gej): ~ $ sudo -i
root@raspberrypi:~# cd /var/www/  
root@raspberrypi:/var/www# mkdir rrdpower
root@raspberrypi:/var/www# cd rrdpower/
root@raspberrypi:/var/www/rrdpower# vi create_rrd_db.sh
#!/bin/bash
rrdtool create power.rrd --start N --step 300 \
DS:powerin:GAUGE:600:U:U \
DS:powerout:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365

root@raspberrypi:/var/www/rrdpower# bash create_rrd_db.sh
root@raspberrypi:/var/www/rrdpower# ls -la
total 128
drwxr-xr-x 2 root root  4096 Jan 15 17:43 .
drwxr-xr-x 8 root root  4096 Nov 18 22:12 ..
-rwxr-xr-x 1 root root   236 Nov 18 22:15 create_rrd_db.sh
-rw-r--r-- 1 root root   780 Nov 18 22:27 power.php
-rw-r--r-- 1 root root 26820 Jan 15 17:40 power.rrd
-rwxr-xr-x 1 root root   320 Nov 18 22:49 update.sh
root@raspberrypi:/var/www/rrdpower#

We maken een database aan die heet "power.rrd" deze wordt gevult met stappen van 300 seconden (5 minuten)
Deze krijgt twee waardes, namelijk "powerin" en "powerout" en die overige getallen zijn er voor om de database kleiner te maken.
Als je namelijk over een maand een maandgrafiek wil zien, is het helemaal niet meer interessant met waardes om de 5 minuten te werken, dus rrdtool regelt dat voor je dat je dan in die maand bijvoorbeeld maar 100 ijkpunten hebt. Daardoor blijft die rrddatabase zo klein. (tot zover ik het dan snap .....)

Data uitlezen

Volgende stap is het uitlezen van de data en dit in een file omzetten:
gej@raspberrypi(gej): ~ $ su - gej -c "python /home/gej/P1uitlezer.py > /home/gej/P1uitlezer.txt"

Vanaf nu is /home/gej/P1uitlezer.txt het bestand waar we verder mee werken.

Dit bestand ziet er dan als volgt uit:

('DSMR P1 uitlezer', '1.0')
Control-C om te stoppen
daldag      00526
piekdag     00248
dalterug    00073
piekterug   00109
afgenomen vermogen       500  W
teruggeleverd vermogen   0  W
Gas                      436086  dm3

Extraheren power data

Als we nu een grep doen op dit bestand en zoeken naar "afgenomen", zien we het huidige afgenomen vermogen. Dit moet onze powerin worden
(de export staat ervoor om de variabele in de shell  te gebruiken, in het script is deze niet nodig)
gej@raspberrypi(gej): ~ $ export powerin=`/bin/grep afgenomen /home/gej/P1uitlezer.txt | /usr/bin/awk '{print $3}'`

Daarna doen we een grep op dit bestand op "teruggeleverd", dan zien het het huidige teruggeleverde vermogen. Dit moet powerout worden.
gej@raspberrypi(gej): ~ $ export powerout="-`/bin/grep teruggeleverd /home/gej/P1uitlezer.txt | /usr/bin/awk '{print $3}'`"

Nu we de powerin en de powerout hebben, kunnen we deze met rrdtool in de database zetten.
gej@raspberrypi(gej): ~ $ /usr/bin/rrdtool update /var/www/rrdpower/power.rrd N:$powerin:$powerout

Nu is de database gevuld en kunnen we deze uitlezen. Het makkelijkste is natuurlijk door een plaatje te maken.
Mijn voorkeur is om er geljk 4 te maken.
Dag, Week, Maand, Jaar.

Dit gaat als volgt: (voorbeeld van een dag grafiek)
gej@raspberrypi(gej): ~ $ rrdtool graph /var/www/rrdpower/power_daily.png --start -1d DEF:powerin=/var/www/rrdpower/power.rrd:powerin:AVERAGE LINE1:powerin#B5B690:"Ingaande stroom [W]" \
DEF:powerout=/var/www/rrdpower/power.rrd:powerout:AVERAGE LINE1:powerout#3B3131:"Uitgaande stroom [W]"

Zoals je ziet heb je nogal wat standaard waardes nodig, daarom gebruik ik in mijn script wat variabelen. zoals de kleur, en de directory waar alles staat.
# Genereren van de grafiekjes
DIR="/var/www/rrdpower"
INPOWER_COLOR="#B5B690"
OTPOWER_COLOR="#3B3131"
rrdtool graph $DIR/power_hourly.png --start -1h DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_daily.png --start -1d DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_weekly.png --start -1w DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_monthly.png --start -1m DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_yearly.png --start -1y DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"

Scripten

Ok, nu hebben we de basis. Even scripten.

Meestal zet ik mijn scriptjes neer onder root onder Script.

gej@raspberrypi(gej): ~ $ sudo -i
root@raspberrypi:~# cd /root/
root@raspberrypi:~# mkdir Script
root@raspberrypi:~# cd Script/
root@raspberrypi:~/Script#
root@raspberrypi:~/Script# vi uitlezen.sh

#!/bin/bash
sleep 30
# 1 keer per 5 minuten, uitlezen via seriele interface van de slimme meter
su - gej -c "python /home/gej/P1uitlezer.py > /home/gej/P1uitlezer.txt" 2>&1 >/dev/null

#####################################################################################
# Bijwerken stroomverbruik
#####################################################################################
powerin=`/bin/grep afgenomen /home/gej/P1uitlezer.txt | /usr/bin/awk '{print $3}'`
powerout="-`/bin/grep teruggeleverd /home/gej/P1uitlezer.txt | /usr/bin/awk '{print $3}'`"
/usr/bin/rrdtool update /var/www/rrdpower/power.rrd N:$powerin:$powerout

DIR="/var/www/rrdpower"
INPOWER_COLOR="#B5B690"
OTPOWER_COLOR="#3B3131"
rrdtool graph $DIR/power_hourly.png --start -1h DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_daily.png --start -1d DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_weekly.png --start -1w DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_monthly.png --start -1m DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"
rrdtool graph $DIR/power_yearly.png --start -1y DEF:powerin=$DIR/power.rrd:powerin:AVERAGE LINE1:powerin$INPOWER_COLOR:"Ingaande stroom [W]" \
DEF:powerout=$DIR/power.rrd:powerout:AVERAGE LINE1:powerout$OTPOWER_COLOR:"Uitgaande stroom [W]"


root@raspberrypi:~/Script# chmod a+x uitlezen.sh
root@raspberrypi:~/Script#

Schedulen via crontab

Script is klaar, nu elke 5 minuten uitvoeren.
Hiervoor gebruiken we crontab

root@raspberrypi:~/Script# crontab -e
No modification made

Aaarch, een of andere akelige editor. Even omzetten naar vi.

root@raspberrypi:~/Script# export EDITOR=vi
root@raspberrypi:~/Script# crontab -e
...
*/5 * * * *     /root/Script/uitlezen.sh

root@raspberrypi:~/Script#

Nu kun je nakijken in /var/log/syslog of hij ook netjes loopt. Elke 5 minuten moet er het volgende verschijnen.

Jan 15 20:00:01 raspberrypi /USR/SBIN/CRON[25235]: (root) CMD (/root/Script/uitlezen.sh)
Jan 15 20:00:39 raspberrypi /USR/SBIN/CRON[25234]: (CRON) info (No MTA installed, discarding output)


Daarnaast kunnen we ook in /var/www/rrdtool nakijken of alles bijgewerkt wordt.

root@raspberrypi:~/Script# ls -l /var/www/rrdpower/
total 120
-rwxr-xr-x 1 root root  1279 Nov 19 20:23 create_graphs.sh
-rwxr-xr-x 1 root root  2571 Nov 25 01:50 create_graphs_big.sh
-rwxr-xr-x 1 root root   236 Nov 18 22:15 create_rrd_db.sh
-rw-r--r-- 1 root root   780 Nov 18 22:27 power.php
-rw-r--r-- 1 root root 26820 Jan 15 21:30 power.rrd
-rw-r--r-- 1 root root  8295 Jan 15 21:30 power_daily.png
-rw-r--r-- 1 root root  7332 Jan 15 21:30 power_hourly.png
-rw-r--r-- 1 root root  8151 Jan 15 21:30 power_monthly.png
-rw-r--r-- 1 root root 10049 Jan 15 21:30 power_weekly.png
-rw-r--r-- 1 root root  8858 Jan 15 21:30 power_yearly.png
-rw-r--r-- 1 root root 17181 Nov 25 01:48 powerday.png
-rwxr-xr-x 1 root root   320 Nov 18 22:49 update.sh
root@raspberrypi:~/Script#


Even kijken naar de datum/tijd van de power.rrd en de png's.


En alle rommel bij elkaar waar ik mee werk:

rrdpower.zip