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