Plugwise med RRDTool på Fedora Linux - en guide

Hur gör man för att ... ? Hur fungerar ... ? Steg för steg-guider och förklarande artiklar finns i detta forum.
Många guider finner också på vår blogg: https://blog.m.nu/
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
lix
Wannabe
Inlägg: 20
Blev medlem: 23 jan 2011, 12:23
Ort: Göteborg

Plugwise med RRDTool på Fedora Linux - en guide

Inlägg av lix »

Hej,

Köpte nyligen ett antal Plugwise-enheter. Efter att ha provkört dom i Windows nån vecka var det så dags att ge sig på att få dom att funka i Linux. Jag var lyckligt lottad och fick tag på ett antal med version 1.0-firmware vilket innebär att dom funkar utmärkt med PlugWise-On-Linux-skriptet. Ca. 20h jobb senare kan jag nu få ut snygga grafer i RRDtool som visar energiförbrukningen momentant och över tid på olika enheter i hemmet, inkl. total energiförbrukning i kWh för varje enhet.

Så för att hjälpa andra och bidra till communityn så kommer här en guide till min lösning.

Min server som hanterar detta kör Fedora 14. Denna distribution kommer med Python 2.7 installerat. Plugwise-On-Linux funkar inte med Python 2.7 då man slagit ihop och bytt namn på vissa moduler. Därför måste vi först installera Python 2.5 parallellt med Python 2.7. I Fedora-distributionen heter Python-2.7-binären /usr/bin/python och 2.5-binären kommer hamna i /usr/local/bin/python.

Ladda ner Python-2.5.4.tgz från http://www.python.org/download/releases/2.5.4/
Packa upp, byt till katalogen filerna hamnat i och kör sedan:
./configure
make
make install
Detta skall ge dig en ny python-2.5-binär i /usr/local/bin/python (kör /usr/local/bin/python -V för att verifiera)

Plugwise-On-Linux behöver tillgång till Python-modulen för seriell kommunikation, kallas pyserial. Jag installerade först de binärerna via Fedora's repository men fick det inte att funka. Därför fick jag göra följande:
Ladda ner pyserial 2.5 från http://pypi.python.org/pypi/pyserial
Packa upp, byt till katalogen filerna hamnat i och kör sedan:
/usr/local/bin/python setup.py install

Nu har vi en fungerande Python 2.5-installation parallellt med 2.7 och Plugwise-On-Linux har det som behövs för att den skall fungera. Nu är det dags att ladda ner Plugwise-On-Linux:

Ladda ner pol 0.2 sources från http://www.maartendamen.com/downloads/
Skapa en katalog under root som heter pol: mkdir /root/pol
Packa upp pol0.2_sources.tar.gz till /root/pol
Byt katalog till /root/pol och kör sedan:
/usr/local/bin/python pol.py
Detta skall ge dig hjälptexten i pol.py. Får du det så funkar Plugwise-On-Linux och Python-installationen. Dags att gå vidare.

För att resten skall fungera behöver du också RRDTool. Om du inte redan har den så installera den via Fedora's repository.

För att sy ihop lösningen har jag skapat två skript. Det ena heter pollplugwise.sh och det andra graphplugwise.sh. Pollplugwise läser av Plugwise-enheterna och sparar momentanförbrukningen i en RRD-databas. Detta skript körs varje minut via cron. Graphplugwise läser RRD-databasen och skapar grafer med momentan- och max-förbrukning, samt totalt förbrukad el i kWh.

pollplugwise.sh

Kod: Markera allt

#!/bin/bash
# Script to poll Plugwise devices and update RRDTool database
# v1.1 2011-02-15

# Devices contains the name and the last 6 characters of the MAC address
# For devices which are not connected and therefore should not be polled append a trailing dash (-) to the MAC address.
# They will then be given zero watts consumption. This is useful if you want to create your RRD database once
# and move your Plugwise units around your house perhaps once a month, to see how much your devices consume. 
devices="Datorer:1C7CBC TV:38C07B- Disk:38BE59- Tvatt:38C1C8 Avfuktare:37B22D Solpump:3FD280 VVberedare:000000- Varmepump:000000- Kyl:38BE59 Sval:38C07B Mikro:000000- Ugn:000000- Spis:000000- MCEDator:000000- Utebelysning:000000- Element:000000- Extra1:000000- Extra2:000000-"

port=/dev/ttyUSB0
macprefix=000D6F0000
db=/var/lib/plugwise/plugwise.rrd
pythonbin=/usr/local/bin/python
polpy=/root/pol/pol.py
poltimeout=3

# Print current date and time
echo `date +%Y-%m-%d%t%H:%M:%S`

# Check if RRD database exists, if not create it
if [ ! -f "$db" ]
then
   echo "Creating RRDtool database $db for the following devices:"
   for x in $devices;
   do
     echo $x
     device=`echo $x | awk -F: '{ print $1 }'`
     ds="$ds DS:$device:GAUGE:1200:0:U"
   done;

# sample interval is 1 minute
# 1 samples per minute on 24h -> 1:1440
# 1 sample per 5 minute on 7 days -> 5:2016
# 1 sample per 15 minutes on 1 month -> 15:2976 
# 1 sample per hour on 1 year -> 60:8760
# 1 sample per 4hours on 10 years -> 240:21900

   rrdtool create $db --step 60    \
    $ds                            \
    RRA:AVERAGE:0.5:1:1440         \
    RRA:AVERAGE:0.5:5:2016         \
    RRA:AVERAGE:0.5:15:2976        \
    RRA:AVERAGE:0.5:60:8760        \
    RRA:AVERAGE:0.5:240:21900      \
    RRA:MAX:0.5:1:1440             \
    RRA:MAX:0.5:5:2016             \
    RRA:MAX:0.5:15:2976            \
    RRA:MAX:0.5:60:8760            \
    RRA:MAX:0.5:240:21900
fi

# Poll each device and save into database
values="N"
for x in $devices; 
do
  device=`echo $x | awk -F: '{ print $1 }'`
  mac=`echo $x | awk -F: '{ print $2 }'`
  watt=0
  if [ ${#mac} -eq 6 ]
  then
    echo -n "$device  "
    watt=`timeout $poltimeout $pythonbin $polpy -p $port -w $macprefix$mac`
    if [ -z $watt ]; then 
      watt=0
    else
      watt=`echo "($watt+0.5)/1"|bc`
    fi
    echo "$watt"
  fi
  values="$values:$watt"
done
rrdtool update $db $values
Skriptet är ganska självförklarande. I början listar jag de Plugwise-enheter jag har och deras MAC-adresser. Jag har tänkt flytta omkring mina enheter lite då och då för att se hur mycket energi olika prylar i hemmet drar. För att slippa generera om RRD-databasen i tid och otid har jag därför angett alla de enheter som jag kan tänka mig vilja mäta. Detta ligger i devices-variabeln. De enheter som jag inte mäter för tillfället har ett minustecken efter MAC-adressen, och dessa kommer då ges noll i förbrukning.

Om RRD-databasen inte finns kommer skriptet skapa den. Detta gör det enkelt att byta till en annan databas ifall jag skulle vilja testa något.

I mitt fall har jag också en Plugwise Stealth som är inkopplad så att den mäter när pumpen till min solfångare går. När den inte går är Stealthen strömlös och syns därför inte i Plugwise-nätet. Tyvärr hänger Plugwise-On-Linux när den skall läsa av enheter som inte är tillgängliga. Därför har jag fått sätta en timeout på anropet till pol.py-skriptet. För mig funkar det bra med 3 sekunder. Så om pol.py inte svarat inom 3 sekunder så antar jag att enheten är bortkopplad och därför ger jag den noll watt förbrukning.

graphplugwise.sh

Kod: Markera allt

#!/bin/bash
# Script to generate energy consumption graphs
# v1.1 2011-02-15
#
# Devices contains the name and the graph color
# For devices available in the database but which should not be plotted, add trailing dash to the color
devices="Datorer:#6DB5EF TV:#2222AA- Disk:#50AA50- Tvatt:#EEA01D Avfuktare:#FF5500 Solpump:#ECE1B3 VVberedare:#000000- Varmepump:#000000- Kyl:#0000AA Sval:#3333FF Mikro:#000000- Ugn:#000000- Spis:#000000- MCEDator:#000000- Utebelysning:#000000- Element:#000000-"

# Graphs contains the title (before colon) and duration (after colon). The duration is also used as the graph's filename.
graphs="timmen:1h timmarna:8h dygnet:1d veckan:1w manaden:1m aret:1y"

db=/var/lib/plugwise/plugwise.rrd
targetdir=/var/www/html/plugwise
indexfile="$targetdir/index.html"

color_back="#4F5444"
color_canvas="#5C665A"
color_shadea="#4F5444"
color_shadeb="#4F5444"
color_grid="#4F5444"
color_mgrid="#82AE81"
color_font="#FFFFFF"
color_frame="#000000"
color_arrow=$color_back
color_border=$color_canvas
width=600
height=300
textpos=15

# Generate RRD graph command for each device
# Note: the VDEF, CDEF, dummy stuff is just to work around
# RRDTool's limitations when computing the total kWh consumed
cmd=""
for x in $devices;
do
  device=`echo $x | awk -F: '{ print $1 }'`
  color=`echo $x | awk -F: '{ print $2 }'`
  if [ ${#color} -eq 7 ] 
  then
    devicelen=${#device}
    spaces=`echo "...................." | cut -c-$textpos | cut -c$devicelen-`
    cmd="$cmd DEF:$device=$db:$device:AVERAGE"
    cmd="$cmd VDEF:avg_$device=$device,AVERAGE"
    cmd="$cmd CDEF:mod_$device=$device,UN,avg_$device,$device,IF"
    cmd="$cmd VDEF:tot_$device=mod_$device,TOTAL"
    cmd="$cmd CDEF:dummy_$device=$device,POP,tot_$device,60,/,60,/,1000,/"
    cmd="$cmd VDEF:kwh_$device=dummy_$device,MAXIMUM"
    cmd="$cmd LINE:$device$color:$device"
    cmd="$cmd GPRINT:$device:LAST:$spaces%7.0lf"
    cmd="$cmd GPRINT:$device:AVERAGE:%13.0lf"
    cmd="$cmd GPRINT:$device:MAX:%13.0lf"
    cmd="$cmd GPRINT:kwh_$device:%14.2lf\n"
  fi
done

# Generate combined graphs for all devices
for x in $graphs;
do
  title=`echo $x | awk -F: '{ print $1 }'` 
  duration=`echo $x | awk -F: '{ print $2 }'`
  echo "Generating $targetdir/$duration.png"
rrdtool graph "$targetdir/$duration.png"  \
  --title "Senaste $title" \
  --imgformat "PNG" --width "$width" --height "$height" \
  --end now --start end-$duration \
  --color "BACK$color_back" --color "CANVAS$color_canvas" \
  --color "SHADEA$color_shadea" --color "SHADEB$color_shadeb" \
  --color "GRID$color_grid" --color "MGRID$color_mgrid" \
  --color "FONT$color_font" --color "FRAME$color_frame" \
  --color "ARROW$color_arrow" \
  --vertical-label "Watt" \
  "COMMENT:     \t\t\t " \
  "COMMENT:Aktuell\t\t" \
  "COMMENT:Medel\t\t" \
  "COMMENT:Max\t\t" \
  "COMMENT:kWh\n" \
  $cmd
done

# If the index.html file does not exist, create a simple one
if [ ! -f $indexfile ]
then
   echo "Creating $indexfile file"
   echo "<html><head><title>Elforbrukare</title></head><body bgcolor=$color_back>" > $indexfile
   for x in $graphs;
   do
     duration=`echo $x | awk -F: '{ print $2 }'`
     echo "<img src='$duration.png' style='border: 1px $color_border solid'  />" >> $indexfile
     echo "<br /><br />" >> $indexfile
   done
   echo "</body></html>" >> $indexfile
fi
På samma sätt som pollplugwise listar de enheter jag vill mäta listar graphplugwise de enheter som jag vill plotta. I variabeln devices finns enheterna samt den färg som deras respektive graf skall ritas med. Om en enhet inte mäts för tillfället (den har ett minustecken efter MAC-adressen i pollplugwise) så sätt ett minustecken efter färgen i graphplugwise också.

Variabeln graphs listar de grafer som skall ritas, med namn (titel) och tid. Jag skapar grafer för senaste timmen, 8 timmarna, dygnet, veckan, månaden och året.

Graferna skapas i katalogen som pekas ut av variabeln targetdir. Om det inte finns en index.html-fil i den katalogen så skapas också en enkel fil som bara visar graferna. Vill man göra en mer avancerad HTML-sida så kan man göra den själv eftersom skriptet inte skriver över index.html om den redan finns där.

För att automatiskt köra dessa två skript så skapa en fil /etc/cron.d/plugwise och lägg till följande rader i den:

Kod: Markera allt

*/1 * * * *    root    /root/pol/pollplugwise.sh       >/var/log/plugwise.log 2>&1
*/10 * * * *    root    /root/pol/graphplugwise.sh       >/dev/null 2>&1
Detta gör så att pollplugwise.sh körs varje minut och graphplugwise.sh körs var 10:e minut. Output från pollplugwise.sh hamnar i /var/log/plugwise.log så vill man se senaste värdena kan man köra tail -f på den filen.

Hoppas att detta kan hjälpa andra som också vill komma igång med Plugwise på Linux. Vad jag sett så verkar det finnas ett nytt Python-skript som funkar med de nyare Plugwise-firmware-versionerna. Detta finns på https://bitbucket.org/hadara/python-plugwise/wiki/Home. Jag har dock inte laddat ner eller testat det så kan inte svara på några frågor om det.

Mitt nästa steg är att även skriva data till en MySQL-databas så att jag lättare kan bearbeta och räkna på det och skapa andra typer av grafer och diagram.

Lycka till!

//Henrik
Bilagor
Exempel på graf som genererats
Exempel på graf som genererats
polrrd_1d.png (28.11 KiB) Visad 11050 gånger
affe@rappens.se
Wannabe
Inlägg: 6
Blev medlem: 05 apr 2009, 15:34
Ort: Nittkvarn

Re: Plugwise med RRDTool på Fedora Linux - en guide

Inlägg av affe@rappens.se »

Har du fått till något script för att logga till MySQL?

Tänkte försöka få igång något och ville inte "uppfinna hjulet på nytt"?
Skriv svar