Datenauswertung mit der Round Robin Database

Mit Hilfe der Round Robin Database (RRDB)ist eine einfache Erfassung und Visualisierung der Messdaten möglich.

vito.png

Ablauf:
  1. Abfrage der Messwerte mit vclient
  2. Schreiben der Messwerte in die RRDB
  3. Visualisierung der Messwerte mit den rrdbtools.

Abfrage der Messwerte

Zuerst muss festgelegt werden, welche Messwerte abgefragt und in der Datenbank gespeichert werden sollen.

./vclient -h 192.168.1.4:3002 -c commands
commands:
getTempA: Ermittle die Aussentemeratur in Grad C
getTempWWist: Ermittle die Warmwassertemperatur in Grad C
getTempWWsoll: Ermittle die Warmwassersolltemperatur in Grad C
getTempKist: Ermittle die Kesseltemperatur in Grad C
getTempKsoll: Ermittle die Kesselsolltemperatur in Grad C
getTempVListM2: Ermittle die Vorlauftemperatur M2 in Grad C
getTempVLsollM1: Ermittle die Vorlaufsolltemperatur M1 in Grad C
getTempVLsollM2: Ermittle die Vorlaufsolltemperatur M2 in Grad C
getTempRaumNorSollM1: Ermittle die Raumsolltemperatur normal M1 in Grad C
getTempRaumRedSollM1: Ermittle die Raumsolltemperatur reduziert M1 in Grad C
getBrennerStatus: Ermittle den Brennerstatus
getBrennerStunden1: Ermittle die Brennerstunden Stufe 1
getPumpeStatusM1: Ermittle den Status der Pumpe M1
getPumpeStatusZirku: Ermittle den Status der Zirkulationspumpe
getBetriebArtM1: Betriebsart M1
setPumpeStatusZirku: Setze den Status der Zirkulationspumpe
getError0: Ermittle Fehlerhistory Eintrag 1
getNeigungM1: Ermittle Neigung Heizkennlinie M1
getNeigungM2: Ermittle Neigung Heizkennlinie M2
getNiveauM1: Ermittle Niveau Heizkennlinie M1
getNiveauM2: Ermittle Niveau Heizkennlinie M2
getDevType: Ermittle Device Typ der Anlage
init: Inintialisierung
get: Testabfrage, Adresse eingeben
vget: Testabfrage, Virtuelle Adresse eingeben
bget: Testabfrage, Bedienteil Adresse eingeben
pget: Testabfrage, Port Adresse eingeben
eget: Testabfrage, EEProm Adresse eingeben
xget: Testabfrage, XRAM Adresse eingeben
kmget: Testabfrage, KM-Bus EEProm Adresse eingeben
getExtBA: Ermittle Zustand der externen Betriebsartenumschaltung
getPumpeSollM1: Ermittle Solldrehzahl Pumpe M1
getVentilStatus: Ermittle Zustand Umschaltventil WW/Heizen
getHKPTyp: Ermittle Typ der Heizkreispumpe
getTempRueck: Ermittle die Rueckauftemepratur
getX4Func: Ermittle Funktion des Eingang X4.1 X4.2
setX4Func: Setze Funktion des Eingang X4.1 X4.2

Anmerkung: get: Testabfrage usw. sind im v-controld.xml nur für GWG Protokoll hinterlegt. Für KW# nicht!


Aus dieser Liste sollen nun folgende Befehle abgefragt werden:
  • getTempA
  • getTempWWist
  • getBetriebsArtM1

Wir müssen nun die Details der Antwort ermitteln, um diese entsprechend in die RRDB zu schreiben:
/vclient -h 192.168.1.4:3002 -c 'detail getTempA'
detail getTempA:
getTempA: SEND 04;WAIT 05;SEND 01 CB 6F 01 04;RECV 1 UT1
        RECV Timeout: 150 ms
        Retry: 5
        Bit (BP): 255
        Unit: Temperatur 1Byte (UT1)
          Type: char
          Get-Calc: V/2
          Set-Calc: V*2
         Einheit: Grad Celsius
 
Die Einheit ist also hier Grad Celsius (wie auch bei getTempWWist).

Für die Betriebsart sieht die Definition hingegen anderes aus:
/vclient -h 192.168.1.4:3002 -c 'detail getBetriebArtM1'
detail getBetriebArtM1:
getBetriebArtM1: SEND 04;WAIT 05;SEND 01 CB 51 01 04;RECV 1 BA
        RECV Timeout: 150 ms
        Retry: 5
        Bit (BP): 255
        Unit: BetriebsArt (BA)
          Type: enum
          Get-Calc: (null)
          Set-Calc: (null)
         Einheit: (null)
          Enum Bytes:00 Text:WW
          Enum Bytes:01 Text:RED
          Enum Bytes:02 Text:NORM
          Enum Bytes:04 Text:H+WW
          Enum Bytes:03 Text:H+WW
          Enum Bytes:05 Text:ABSCHALT
          Enum Bytes:<default> Text:UNKNOWN
 

Da wir in der RRDB zu Zahlen verarbeiten können, müssen wir mit dem Befehl 'unit off' die Enum-Berücksichtigung ausschalten.
Es ergeben sich so vier auszuführende Befehle:
  1. getTempA
  2. getTempWWist
  3. unit off
  4. getBetriebArtM1

Konfiguration der RRDB


Die RRDB wird mit dem Befehl
rrdtool create (siehe Dokumentation)
konfiguriert.
Wer das rrdtool noch nicht hat, kann es über den Paketmanager des Vertrauens nachinstallieren. Auf einem RaspberryPi z.B. mit
apt-get install rrdtool

Für jede zu speichernde Größe müssen folgende Punkte festgelegt werden:
  • Typ
  • Timeout
  • Min
  • Max
Für die Messwerte wir im Allgemeinen GAUGE genutzt.
Die RRA Deklarationen dienen zur Zusammenfassung von Messwerten.
Hier ein Beispiel:
  • Intervall 300s
  • nach 700s wird ein Messwert ungültig
rrdtool create /home/marcus/rrdb/vito.rrd --step 300 \
DS:tempA:GAUGE:700:-50:100 \
DS:tempWWist:GAUGE:700:0:100 \
DS:BetriebsArt:GAUGE:700:0:5 \
RRA:AVERAGE:0.5:1:1200 \
RRA:MIN:0.5:12:2400 \
RRA:MAX:0.5:12:2400 \
RRA:AVERAGE:0.5:12:2400
 

Schreiben der Messwerte in die RRDB


Um die Messwerte in die RRDB zu schreiben, wird die Template Fähigkeit von vclient genutzt.
Um das Template entsprechend zu definieren, müssen die Variablen richtig gewählt werden
Befehl
Variable
Bemerkung
getTempA
$1
Float Wert der Rückgabe
getTempWWist
$2
Float Wert der Rückgabe
unit off

schaltet die Enum Berücksichtigung für die folgende Befehle aus
getBetrebArtM1
$R4
Return Wert wie zurückgeliefert
Die eventuell auftretenden Fehler sind in der Variablen $E1..$E4 abzufragen.

Das eigentliche Befüllen der RRDB geschieht mit dem Befehl
rrdtool update /home/marcus/rrdb/vito.rrd N:$1:$2:$R4

Hier das Template unter Berücksichtigung der Fehlerbehandlung (rrdb-update.tmpl):
if  [ "x$E1" != x ]; then
        echo -n `date`  >>/tmp/vc-err.txt
        echo "es ist ein Fehler aufgetreten: $C1:$E1" >>/tmp/vc-err.txt
        exit 1;
fi
if  [ "x$E2" != x ]; then
        echo -n `date`  >>/tmp/vc-err.txt
        echo "es ist ein Fehler aufgetreten: $C2:$E2" >>/tmp/vc-err.txt
        exit 1;
fi
if  [ "x$E3" != x ]; then
        echo -n `date`  >>/tmp/vc-err.txt
        echo "es ist ein Fehler aufgetreten: $C3:$E3" >>/tmp/vc-err.txt
        exit 1;
fi
if  [ "x$E4" != x ]; then
        echo -n `date`  >>/tmp/vc-err.txt
        echo "es ist ein Fehler aufgetreten: $C4:$E4" >>/tmp/vc-err.txt
        exit 1;
fi
rrdtool update /home/marcus/rrdb/vito.rrd N:$1:$2:$R4

Der komplette Aufruf, der per cron alle 5min ausgeführt wird:
./vclient -h vito:3002 -f rrdb/vc-commands.txt -t rrdb/rrdb-update.tmpl -x rrdb/rrdb-update.sh
Wobei vc-commands.txt die vier Befehle enthält und rrdb-update.tmpl das oben aufgeführte Template.

Visualisierung der Messwerte

Um die Messwerte zu visualisieren, muss man die verschiedenen Werte sinnvoll in einem Graphen zusammenfassen.
Im oberen Beispiel werden die Temperaturen erfasst, ebenso wie die Betriebsart, die jedoch nur Werte von 0-5 annehmen kann.
RRDB bietet hier eine einfache Möglichkeit, die Werte vor der Anzeige mathematisch zu beeinflussen.
Es ist außerdem möglich, bestimmte Werte (hier MIn. und Max.) mit in dem Graphen auszugeben.

Hinweis:
Für die Farbauswahl bietet sich das Programm xcolorsel an, das im 'Display Format' 8bit truncated rgb, die Werte im passenden Format anzeigt.

Hier eine Zusammenfassung der Definitionen für einen Graphen:
Befehl
DS Name (aus rrdtool create)
Graph-Befehle
Bemerkungen
getTempA
tempA
DEF:tempA=/home/marcus/rrdb/vito.rrd:tempA:AVERAGE
LINE1:tempA#0000FF:tempA
VDEF:tempAmax=tempA,MAXIMUM
VDEF:tempAmin=tempA,MINIMUM
GPRINT:tempAmin:" Min. %02.1lf Grad C"
GPRINT:tempAmax:"Max. %02.1lf Grad C"
Es wird eine Definition tempA festgelegt, die die Duschschnittswerte des DS-Feldes tempA der DB enthält.
Diese Werte werden als Linie dargestellt.
Es wird eine VDEF Definition für den min. und max. Wert definiert. Die dort ermittelten Werte werden in der Legende ausgegeben.
gettempWWist
tempWWist
DEF:tempWWist=/home/marcus/rrdb/vito.rrd:tempWWist:AVERAGE
LINE1:tempWWist#FF00FF:tempWWist
VDEF:tempWWmax=tempWWist,MAXIMUM
VDEF:tempWWmin=tempWWist,MINIMUM
GPRINT:tempWWmin:"Min. %02.1lf Grad C"
GPRINT:tempWWmax:"Max. %02.1lf Grad C"

getBetriebArtM1
BetriebsArt
DEF:BetriebsArt=/home/marcus/rrdb/vito.rrd:BetriebsArt:AVERAGE
CDEF:BA=BetriebsArt,10,*
LINE1:BA#555555:Betriebsart
Die Werte der Betriebsart werden mit dem Faktor 10 multipliziert (CDEF). Diese neuen Werte stehen als BA zur Verfügung. Die BA Werte werden dann als Linie ausgegeben, in der Legende wird 'Betriebsart' ausgegeben.

Mit diesen Informationen kann nun der Graph definiert werden:
rrdtool graph vito.png -a PNG \
--start end-1d  --end now --width 800 --height 300 \
--title 'Vito-Messwerte' \
DEF:tempA=/home/marcus/rrdb/vito.rrd:tempA:AVERAGE \
DEF:tempWWist=/home/marcus/rrdb/vito.rrd:tempWWist:AVERAGE \
DEF:BetriebsArt=/home/marcus/rrdb/vito.rrd:BetriebsArt:AVERAGE \
CDEF:BA=BetriebsArt,10,* \
LINE1:tempA#0000FF:tempA \
LINE1:tempWWist#FF00FF:tempWWist \
LINE1:BA#555555:Betriebsart \
VDEF:tempAmax=tempA,MAXIMUM \
VDEF:tempAmin=tempA,MINIMUM \
VDEF:tempWWmax=tempWWist,MAXIMUM \
VDEF:tempWWmin=tempWWist,MINIMUM \
COMMENT:"\l" \
COMMENT:"Aussentemp." \
GPRINT:tempAmin:"    Min. %02.1lf Grad C" \
GPRINT:tempAmax:"Max. %02.1lf Grad C" \
COMMENT:"\l" \
COMMENT:"Warmwassertemp." \
GPRINT:tempWWmin:"Min. %02.1lf Grad C" \
GPRINT:tempWWmax:"Max. %02.1lf Grad C"
 
 

vito-example.png