Viessmann Heizung auslesen

Viessmann Heizung auslesen

Wir haben eine Viessmann Vitodens 200-W Gastherme inkl. Solaranlage die über eine Vitotronic verfügt. Die Vitotronic hat eine optische Schnittstelle (Optolink) über die z.B. ein Heizungsmonteur verschiedene Parameter der Anlage auslesen und auch setzen kann.

vitotronic

Dafür benötigt man normalerweise den entsprechenden Lesekopf und eine passende Software der Fa. Viessmann.

Auf https://github.com/openv/openv/ gibt es aber auch eine andere Lösung! Die Jungs dort haben viel Arbeit in die “Entschlüsselung” des Viessmann-Protokolls gelegt und verschiedene Anwendungen zur einfachen Kommunikation mit der Heizung entwickelt.

An dieser Stelle nochmal meinen Dank an dieses hervorragende Forum!

Unter den verschiedenen Bauanleitungen für die Leseköpfe habe ich mich für die USB-Variante entschieden. Mein Raspi hat ja noch einen USB-Anschluss frei und kann neben der Stromzählung und der Homematic-Steuerung auch noch die Heizung auslesen. Nicht das ihm langweilig wird…

Das Platinchen muss über die V-Ausfräsung hinter der Klappe befestigt werden. Das habe ich dann “professionell” mit einem Papp-V und Tape erledigt. Hält!!

platine_frei

platine_tape

Ich nutze den vcontrold und da hier eine perfekte Anleitung zur Installation dieser Komponente auf dem Raspberry PI beschrieben ist, will ich auf die Installation und Konfiguration des Daemons auch nicht näher eingehen.

Der Daemon bietet eine Schnittstelle die z.B. mittels Telnet abgefragt werden kann. Ich nutze die Template-Möglichkeit (wird z.B. hier erklärt) um mehrere Heizungswerte auszulesen und die gelieferten Werte weiter verarbeiten zu können. Dazu wird bei mir folgendes Script (update.sh) alle 6 Minuten per Cron aufgerufen:

Der Eintrag in der Crontab sieht dann folgendermaßen aus:

Die Datei vc-commands.txt enthält eine Liste alle Werte die ausgelesen werden sollen. Diese Werte müssen auch in der “vito.xml” definiert sein.

In der Datei update.tmpl werden die zurück gelieferten Werte in Variablen geschrieben und können dann beliebig weiter verarbeitet werden (z.B. eine Prüfung ob ein Wert zurück gegeben wurde).

Auf der openv-Webseite wird oft eine rrdb zur Auswertung der Daten genutzt. Da ich mich mit einer rrdb nicht wirklich gut auskenne, schreibe ich die Daten lieber in eine MySQL-Datenbank.

Tabellenstruktur

Hierfür habe ich folgende Tabellen in der MySQL-Datenbank angelegt:

Tabellenstruktur für Tabelle brenner

Tabellenstruktur für Tabelle solar

Tabellenstruktur für Tabelle temperaturen

Tabellenstruktur für Tabelle snapshot

Die snapshot-Tabelle soll keine Historie enthalten, sondern immer nur eine Zeile mit den alle zwei Minuten ausgelesen Werten. Das hat sich nach ein paar Monaten Betrieb als sinnvoll erwiesen, da der Raspberry doch ganz schön ackern muss um aus einer Tabelle mit > 150.000 Zeilen (und wachsend) die aktuellen Werte auf der Webseite anzuzeigen.

Werte in Datenbank speichern

In oben beschriebene Datei update.tmpl werden dann die Werte genutzt, um sie in der MySQL-Datenbank zu speichen. Dazu nutze ich den Aufruf des Kommandozeilentools “mysql” welches bei der Installation der Datenbank enthalten ist.

Hier die drei Aufrufe mit INSERT-Statements für die Temperatur-, die Solar und die Brennerdaten. In $1, $2 , $3, … stehen die Werte gemäß der Reihenfolge der vc-commands.txt.

Für die Snapshot-Tabelle nutze ich ein Update-Statement da diese Tabelle immer nur eine Zeile enthalten soll.

Wenn der Cron eingerichtet ist, sollte die Datenbank alle 6 Minuten mit den ausgelesenen Werten gefüllt werden.

Anzeige der Daten

Die Anzeige der Daten erfolgt mittels Webseite und PHP-Script. Auf einer Übersichtsseite lese ich die Snapshot-Tabelle aus. Das geht Dank der Snapshot-Tabelle auch recht schnell.

temp_uebersicht

Auf einer weiteren Seite werden zusätzliche Werte aus der Snapshot-Tabelle angezeigt.

temp_details

Weil die Erstellung des Graphen nicht auf der Snapshot-Tabelle basiert, dauerte die Anzeige dieser Seite auch immer recht lange. Daher wird die PNG-Grafik für den Graph nun viertelstündlich per Script erstellt und nur noch das fertige Bild in der Webseite angezeigt.

Hier der Crontab-Eintrag für das Script zur Erstellung der Grafik:

und das Script selber. Zur Erstellung des Graphen nutze ich pChart.

<br><!--?
include("class/pData.class.php");
include("class/pDraw.class.php");
include("class/pImage.class.php");

$mysqlhost="";
$mysqluser="";
$mysqlpwd="";
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
$mysqldb="";
mysql_select_db($mysqldb,$connection) or die("Konnte die Datenbank nicht waehlen.");

$zeit_tmp="";
$sql = "SELECT aussentemperatur,warmwasser,speicher_unten,kollektor,vorlaufsolltemperaturM2,hour(timestamp) FROM temperaturen WHERE DATE_ADD(timestamp, INTERVAL 72 HOUR) -->= NOW()";<br>$query = mysql_query($sql) or die("Anfrage nicht 1 erfolgreich");<br>while ($wert = mysql_fetch_array($query)) {<br>$aussentemperatur[]=$wert[0];<br>$warmwasser[]=$wert[1];<br>$speicher_unten[]=$wert[2];<br>$kollektor[]=$wert[3];<br>$vorlauf[]=$wert[4];<br>if ($zeit_tmp==$wert[5])<br>{ $zeit_tmp=NULL; }<br>else<br>{ $zeit_tmp=$wert[5]; }<br>$zeit[]=$zeit_tmp;<br>}<br>mysql_close($connection);</p>
<p>$MyData = new pData();<br>$MyData-&gt;addPoints($aussentemperatur,"TempA");<br>$MyData-&gt;addPoints($warmwasser,"TempW");<br>$MyData-&gt;addPoints($speicher_unten,"TempS");<br>$MyData-&gt;addPoints($kollektor,"TempK");<br>$MyData-&gt;addPoints($vorlauf,"TempV");<br>$MyData-&gt;addPoints($zeit,"Labels");</p>
<p>$MyData-&gt;setSerieWeight("TempA",5);<br>$MyData-&gt;setSerieWeight("TempS",5);<br>$MyData-&gt;setSerieWeight("TempW",5);<br>$MyData-&gt;setSerieWeight("TempK",5);<br>$MyData-&gt;setSerieWeight("TempV",5);</p>
<p>$MyData-&gt;setSerieOnAxis ("TempA", 0);<br>$MyData-&gt;setSerieOnAxis ("TempS", 0);<br>$MyData-&gt;setSerieOnAxis ("TempK", 0);<br>$MyData-&gt;setSerieOnAxis ("TempW", 0);<br>$MyData-&gt;setSerieOnAxis ("TempK", 0);<br>$MyData-&gt;setAxisName(0,"Temperatur");</p>
<p>$MyData-&gt;setSerieDescription("Labels","Uhrzeit");<br>$MyData-&gt;setSerieDescription("TempA","Aussentemperatur");<br>$MyData-&gt;setSerieDescription("TempS","Speicher");<br>$MyData-&gt;setSerieDescription("TempW","Warmwasser");<br>$MyData-&gt;setSerieDescription("TempK","Kollektor");<br>$MyData-&gt;setSerieDescription("TempV","Vorlauf");<br>$MyData-&gt;setAbscissa("Labels");</p>
<p>$serieSettings = array("R"=&gt;0,"G"=&gt;0,"B"=&gt;200);<br>$MyData-&gt;setPalette("TempA",$serieSettings);<br>$serieSettings = array("R"=&gt;200,"G"=&gt;0,"B"=&gt;0);<br>$MyData-&gt;setPalette("TempS",$serieSettings);<br>$serieSettings = array("R"=&gt;0,"G"=&gt;200,"B"=&gt;0);<br>$MyData-&gt;setPalette("TempW",$serieSettings);<br>$serieSettings = array("R"=&gt;0,"G"=&gt;100,"B"=&gt;100);<br>$MyData-&gt;setPalette("TempK",$serieSettings);<br>$serieSettings = array("R"=&gt;100,"G"=&gt;100,"B"=&gt;100);<br>$MyData-&gt;setPalette("TempV",$serieSettings);</p>
<p>$myPicture = new pImage(1205,330,$MyData);<br>$myPicture-&gt;Antialias = FALSE;<br>$myPicture-&gt;drawRectangle(0,0,1204,329,array("R"=&gt;111,"G"=&gt;143,"B"=&gt;204));<br>$myPicture-&gt;setFontProperties(array("FontName"=&gt;"/var/www/heizung/fonts/verdana.ttf","FontSize"=&gt;11));<br>$myPicture-&gt;drawText(200,35,"Temperaturen der letzten 3 Tage",array("FontSize"=&gt;12,"Align"=&gt;TEXT_ALIGN_BOTTOMMIDDLE));<br>$myPicture-&gt;setFontProperties(array("FontName"=&gt;"/var/www/heizung/fonts/verdana.ttf","FontSize"=&gt;7));<br>$myPicture-&gt;setGraphArea(50,40,1155,300);<br>$labelSkip = floor(count($zeit)/48);<br>$scaleSettings = array("XMargin"=&gt;10,"YMargin"=&gt;10,"Floating"=&gt;TRUE,"GridR"=&gt;180,"GridG"=&gt;180,"GridB"=&gt;180,"DrawSubTicks"=&gt;FALSE,"CycleBackground"=&gt;TRUE,"ScaleSpacing"=&gt;10,"LabelSkip"=&gt;$labelSkip,"DrawYLines"=&gt;array(0));<br>$myPicture-&gt;drawScale($scaleSettings);<br>$myPicture-&gt;drawLegend(600,20,array("Style"=&gt;LEGEND_NOBORDER,"Mode"=&gt;LEGEND_HORIZONTAL));<br>$myPicture-&gt;Antialias = FALSE;<br>$myPicture-&gt;setShadow(TRUE,array("X"=&gt;1,"Y"=&gt;1,"R"=&gt;0,"G"=&gt;0,"B"=&gt;0,"Alpha"=&gt;10));<br>$myPicture-&gt;drawLineChart(array("DisplayValues"=&gt;FALSE,"DisplayColor"=&gt;DISPLAY_AUTO));<br>$myPicture-&gt;Render("/var/www/heizung/tmp/temperaturen.png");<br>?&gt;<br>

Hier noch eine Übersichtsseite verschiedener Durchschnittswerte. Diese werden direkt mit Aufruf der Seite generiert was entsprechend lange dauert. Diese Seite schaue ich aber nicht so oft an…

temp_details2

Viel Spaß mit dem Auslesen der Viessmann-Heizung!
Chris