Heizungskennwerte (Viessmann) auslesen

Warum Heizungskennwerte erfassen?

Im Jahr 2014 tobte bei uns ein Orkan, welcher unserer Solarthermie Anlage etwas zugesetzt hatte. Ein Temperatursensor war aus der Halterung herausgefallen. Dieser Sensor soll die Pumpe ansteuern, wenn die Sonne scheint und warmes Wasser produziert werden soll. Das ist aber nicht sofort aufgefallen und über Tage wurde die Sonnenenergie nicht genutzt. Wenn ich zu dem Zeitpunkt die Heizungskennwerte hätte auslesen können, hätte ich das sofort repariert…

Was sind die Voraussetzungen für dieses Projekt?

Diese Vorgehensweise funktioniert nur mit einer Viessmann Heizung! Für dieses Projekt ist ein sogenannter USB-Opto-Koppler erforderlich. Diesen kann man selber zusammenlöten, oder sich kaufen. Ich habe ihn gekauft und er ist das Geld wert!

Hardware:

Raspberry Pi
USB-Opto-Koppler

Installation

Als erstes wird eine rrd Datenbank aufgesetzt. Darin sollten die Daten abgelegt und daraus die Graphiken erstellt werden.

sudo rrdtool create vito.rrd --step 120 \
DS:getTempA:GAUGE:300:-50:100 \
DS:getTempWWist:GAUGE:300:-50:100 \
DS:getTempKist:GAUGE:300:-50:100 \
DS:getTempVListM2:GAUGE:300:-50:100 \
DS:getTempKol:GAUGE:300:-50:100 \
DS:getTempSpu:GAUGE:300:-50:100 \
DS:getBrennerStarts:GAUGE:300:-50:100 \
DS:getBrennerStunden1:GAUGE:300:-50:100 \
DS:getPumpeStatusM1:GAUGE:300:-50:100 \
DS:getPumpeStatusSp:GAUGE:300:-50:100 \
DS:getPumpeStatusZirku:GAUGE:300:-50:100 \
DS:getPumpeStatusSolar:GAUGE:300:-50:100 \
DS:getPumpeStatusM2:GAUGE:300:-50:100 \
DS:getMischerM1:GAUGE:300:-50:100 \
DS:getSolarStunden:GAUGE:300:-50:100 \
RRA:AVERAGE:0.5:2:22500 \
RRA:MIN:0.5:12:4000 \
RRA:MAX:0.5:12:4000 \
RRA:AVERAGE:0.5:15:12000

Die Daten werden alle 2 min erfasst! Ich habe die Datenbank auf dem NAS abgelegt. Unter /nas/data liegt sie. Nun die Installation des Daemons: Sie ist komplett und sehr ausführlich auf github dokumentiert.

Meine Konfiguration, bzw. die Abfrage der Werte erfolgt über dieses Script:

#!/bin/bash

   CHECKER=0

rm /nas/data/heizung/output.txt
touch /nas/data/heizungoutput.txt
sudo vclient -h 127.0.0.1:3002 -f /home/pi/input.txt -s /nas/data/heizung/output.txt 
solarcheck=0
aTIME=($(date +%s))

CHECKER=($(sed -r 's/(.{1}).*/\1/;q'  /nas/data/heizung/output.txt))

if [ $CHECKER = ";" ]
   then
      echo "$aTime Fehler! Messung wiederholen!" >> /nas/data/heizung/log.file
      rm /nas/data/heizung/output.txt
      vclient -h 127.0.0.1:3002 -f /home/pi/input.txt -s /nas/data/heizung/output.txt 
fi       

getTempA=($(cat /nas/data/heizung/output.txt | cut -d';' -f1))
getTempWWist=($(cat /nas/data/heizung/output.txt | cut -d';' -f2)) 
getTempKist=($(cat /nas/data/heizung/output.txt | cut -d';' -f3))
getTempVListM2=($(cat /nas/data/heizung/output.txt | cut -d';' -f4))
getTempKol=($(cat /nas/data/heizung/output.txt | cut -d';' -f5))
getTempSpu=($(cat /nas/data/heizung/output.txt | cut -d';' -f6))
getBrennerStarts=($(cat /nas/data/heizung/output.txt | cut -d';' -f7 | cut -d'.' -f1))
getBrennerStunden1=($(cat /nas/data/heizung/output.txt | cut -d';' -f8))
getPumpeStatusM1=($(cat /nas/data/heizung/output.txt | cut -d';' -f9))
getPumpeStatusSp=($(cat /nas/data/heizung/output.txt | cut -d';' -f10))
getPumpeStatusZirku=($(cat /nas/data/heizung/output.txt | cut -d';' -f11))
getPumpeStatusSolar=($(cat /nas/data/heizung/output.txt | cut -d';' -f12))
getPumpeStatusM2=($(cat /nas/data/heizung/output.txt | cut -d';' -f13))
getMischerM1=($(cat /nas/data/heizung/output.txt | cut -d';' -f14))
getSolarStunden=($(cat /nas/data/heizung/output.txt | cut -d';' -f15))

rrdtool update /nas/data/heizung/vito.rrd N:$getTempA:$getTempWWist:$getTempKist:$getTempVListM2:$getTempKol:$getTempSpu:$getBrennerStarts:$getBrennerStunden1:$getPumpeStatusM1:$getPumpeS
tatusSp:$getPumpeStatusZirku:$getPumpeStatusSolar:$getPumpeStatusM2:$getMischerM1:$getSolarStunden

solarcheck=($(rrdtool lastupdate /nas/data/heizung/vito.rrd |  cut -d " " -f13 | tail -1))
solarcheck=($(echo "scale=1; $solarcheck * 2" | bc))
echo $aTIME $solarcheck >> /nas/data/solarcheck.txt
echo $solarcheck >> /nas/data/Solarminuten.txt
awk '{sum+=$1}END{print sum}' /nas/data/Solarminuten.txt > /nas/data/solarreal.txt

sudo ./tempgraphik.sh 

rrdtool lastupdate /nas/data/heizung/vito.rrd | tail -1 > /nas/data/heizungakt.txt
./delta.sh
./anaus.sh

Wenn sie erfolgreich durchgeführt wurde, kann man die Daten direkt aus der rrd Datenbank visualisieren. Dazu habe ich das folgende Skripte erstellt. Das erste (tempgraphik.sh) zeigt die Werte der Anlage, das zweite zeigt den Status der Pumpen.

rrdtool graph /web/graph.png -a PNG -v "Grad Celsius" \
--start "now-24h" --end "now" --width 800 --height 300 \
--title "Heizung-Messwerte - `date`" \
--slope-mode \
DEF:getTempA=/nas/data/heizung/vito.rrd:getTempA:AVERAGE \
DEF:getTempKist=/nas/data/heizung/vito.rrd:getTempKist:AVERAGE \
DEF:getTempWWist=/nas/data/heizung/vito.rrd:getTempWWist:AVERAGE \
DEF:getTempVListM2=/nas/data/heizung/vito.rrd:getTempVListM2:AVERAGE \
DEF:getTempKol=/nas/data/heizung/vito.rrd:getTempKol:AVERAGE \
DEF:getTempSpu=/nas/data/heizung/vito.rrd:getTempSpu:AVERAGE \
DEF:getBrennerStunden1=/nas/data/heizung/vito.rrd:getBrennerStunden1:AVERAGE \
HRULE:-20#AAAAAA HRULE:-10#AAAAAA HRULE:0#AAAAAA HRULE:10#AAAAAA \
HRULE:20#AAAAAA \
HRULE:30#AAAAAA HRULE:40#AAAAAA HRULE:50#AAAAAA HRULE:60#AAAAAA \
LINE2:getTempA#000000:"Aussen [C]" \
LINE2:getTempKist#3A5FCD:"Kessel ist [C]" \
LINE2:getTempWWist#0000FF:"WW ist [C]" \
LINE2:getTempVListM2#8BBFFF:"Vorlauftemp. [C]" \
LINE2:getTempKol#B54FC6:"Kollector [C]" \
LINE2:getTempSpu#03E101:"Speicher unten [C]\\n" \
VDEF:tempAkt=getTempA,LAST \
VDEF:tempAmax=getTempA,MAXIMUM \
VDEF:tempAmin=getTempA,MINIMUM \
VDEF:brennerst=getBrennerStunden1,AVERAGE \
GPRINT:tempAmin:"Aussentemperatur\:  %03.1lf  min [C]" \
GPRINT:tempAmax:"%03.1lf  max [C]" \
GPRINT:tempAkt:"%03.1lf  akt [C]\\n" 

Das 2. Skript heißt anaus.sh.

rrdtool graph /web/anaus.png -a PNG -v "An / Aus" \
--start "now-24h" --end "now" --width 800 --height 300 \
--title "Pumpenstatus - `date`" \
--slope-mode \
DEF:getPumpeStatusM1=/nas/data/heizung/vito.rrd:getPumpeStatusM1:AVERAGE \
DEF:getPumpeStatusSp=/nas/data/heizung/vito.rrd:getPumpeStatusSp:AVERAGE \
DEF:getPumpeStatusZirku=/nas/data/heizung/vito.rrd:getPumpeStatusZirku:AVERAGE \
DEF:getPumpeStatusSolar=/nas/data/heizung/vito.rrd:getPumpeStatusSolar:AVERAGE \
DEF:getPumpeStatusM2=/nas/data/heizung/vito.rrd:getPumpeStatusM2:AVERAGE \
CDEF:getPumpeStatusM1a=getPumpeStatusM1,0.75,* \
CDEF:getPumpeStatusSpa=getPumpeStatusSp,0.75,*,1,+ \
CDEF:getPumpeStatusZirkua=getPumpeStatusZirku,0.75,*,2,+ \
CDEF:getPumpeStatusSolara=getPumpeStatusSolar,0.75,*,3,+ \
CDEF:getPumpeStatusM2a=getPumpeStatusM2,0.75,*,4,+ \
HRULE:-20#AAAAAA HRULE:-10#AAAAAA HRULE:0#AAAAAA HRULE:10#AAAAAA \
HRULE:20#AAAAAA \
HRULE:30#AAAAAA HRULE:40#AAAAAA HRULE:50#AAAAAA HRULE:60#AAAAAA \
LINE2:getPumpeStatusSpa#3A5FCD:"Speicherpumpenstatus" \
LINE2:getPumpeStatusZirkua#B54FC6:"Zirkulationspumpenstatus" \
LINE2:getPumpeStatusSolara#8BBFFF:"Solarpumpenstatus"

Mit dem Skript delta.sh ermittel ich die Tageswerte:

#!/bin/bash
getBrennerStundenvortag=($(cat /nas/data/heizungvortag.txt | tail -1 | cut -d " " -f9))
getBrennerStundenakt=($(cat /nas/data/heizungakt.txt | tail -1 | cut -d " " -f9))
echo "scale=3; $getBrennerStundenakt - $getBrennerStundenvortag" | bc | awk '{printf "%.2f\n", $1}' > /nas/data/brennerstundentag.txt
getBrennerStartsvortag=($(cat /nas/data/heizungvortag.txt | tail -1 | cut -d " " -f8))
getBrennerStartsakt=($(cat /nas/data/heizungakt.txt | tail -1 | cut -d " " -f8))
echo "scale=5; $getBrennerStartsakt - $getBrennerStartsvortag" | bc  > /nas/data/brennerstartstag.txt

Das untere Skript heißt Vortag.sh und es damit werden die Werte des Vortags gelöscht! Das ist wichtig, damit die korrekten Werte alle ermittelt werden. Deshalb läuft das Skript um 0:00 h:

#!/bin/bash
sleep 55
cd
rrdtool lastupdate /nas/data/heizung/vito.rrd | tail -1 > /nas/data/heizungvortag.txt
cat /nas/data/solarreal.txt >> /nas/data/solarwoche.txt
cat /nas/data/solarwoche.txt | tail -7 > /nas/data/solarwoche.txt 
sudo rm /nas/data/solarstundentag.txt 
sudo rm /nas/data/Solarminuten.txt
sudo rm /nas/data/solarreal.txt
sudo rm Solarminuten.txt solarcheck.txt

Um die Solar-Stunden eines Tages zu ermitteln, habe ich einen Trick verwendet. Es werden die Solarpumpen Minuten dazu herausgezogen. Diese werden in eine Tabelle eingetragen und alle 2 min addiert und wieder auf dem NAS gespeichert.

#!/bin/bash
aTIME=($(date +%s))
START=($(cat /nas/data/solarcheck.txt | grep -v "0.000000" | head -1 | cut -d " " -f1))
LAST=($(cat /nas/data/solarcheck.txt | grep -v "0.000000" | tail -1 | cut -d " " -f1))
dTIME=($(echo "scale=2; ( $LAST - $START ) / 3600" | bc ))
sudo echo $dTIME > /nas/data/solarstundentag.txt

Alle Skripte habe ich im Home Verzeichnis des pi abgelegt!

Oberes Foto: Werte Brennerstunden und Solarstungen, sowie Brennerstarts pro Tag.

Foto (Mitte): Kennwerte Aussentemperatur, Kessel, Solar, Warmwasser, Vorlauf.

Unteres Foto: Pumenstatus für Speicher, Zirkulation und Solar.

 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.