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.