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 http://openv.wikispaces.com/ 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.

<?
include("class/pData.class.php");
include("class/pDraw.class.php");
include("class/pImage.class.php");

$mysqlhost="<rechnername>";
$mysqluser="<benutzer>";
$mysqlpwd="<passwort>";
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
$mysqldb="<datenbankname>";
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()";
$query = mysql_query($sql) or die("Anfrage nicht 1 erfolgreich");
while ($wert = mysql_fetch_array($query)) {
    $aussentemperatur[]=$wert[0];
    $warmwasser[]=$wert[1];
    $speicher_unten[]=$wert[2];
    $kollektor[]=$wert[3];
    $vorlauf[]=$wert[4];
    if ($zeit_tmp==$wert[5])
    { $zeit_tmp=NULL; }
    else
    { $zeit_tmp=$wert[5]; }
    $zeit[]=$zeit_tmp;
}
mysql_close($connection);

$MyData = new pData();
$MyData->addPoints($aussentemperatur,"TempA");
$MyData->addPoints($warmwasser,"TempW");
$MyData->addPoints($speicher_unten,"TempS");
$MyData->addPoints($kollektor,"TempK");
$MyData->addPoints($vorlauf,"TempV");
$MyData->addPoints($zeit,"Labels");
       
$MyData->setSerieWeight("TempA",5);
$MyData->setSerieWeight("TempS",5);
$MyData->setSerieWeight("TempW",5);
$MyData->setSerieWeight("TempK",5);
$MyData->setSerieWeight("TempV",5);

$MyData->setSerieOnAxis ("TempA", 0);
$MyData->setSerieOnAxis ("TempS", 0);
$MyData->setSerieOnAxis ("TempK", 0);
$MyData->setSerieOnAxis ("TempW", 0);
$MyData->setSerieOnAxis ("TempK", 0);
$MyData->setAxisName(0,"Temperatur");
       
$MyData->setSerieDescription("Labels","Uhrzeit");
$MyData->setSerieDescription("TempA","Aussentemperatur");
$MyData->setSerieDescription("TempS","Speicher");
$MyData->setSerieDescription("TempW","Warmwasser");
$MyData->setSerieDescription("TempK","Kollektor");
$MyData->setSerieDescription("TempV","Vorlauf");
$MyData->setAbscissa("Labels");
       
$serieSettings = array("R"=>0,"G"=>0,"B"=>200);
    $MyData->setPalette("TempA",$serieSettings);
$serieSettings = array("R"=>200,"G"=>0,"B"=>0);
    $MyData->setPalette("TempS",$serieSettings);
$serieSettings = array("R"=>0,"G"=>200,"B"=>0);
    $MyData->setPalette("TempW",$serieSettings);
$serieSettings = array("R"=>0,"G"=>100,"B"=>100);
    $MyData->setPalette("TempK",$serieSettings);
$serieSettings = array("R"=>100,"G"=>100,"B"=>100);
    $MyData->setPalette("TempV",$serieSettings);

$myPicture = new pImage(1205,330,$MyData);
$myPicture->Antialias = FALSE;
$myPicture->drawRectangle(0,0,1204,329,array("R"=>111,"G"=>143,"B"=>204));
$myPicture->setFontProperties(array("FontName"=>"/var/www/heizung/fonts/verdana.ttf","FontSize"=>11));
$myPicture->drawText(200,35,"Temperaturen der letzten 3 Tage",array("FontSize"=>12,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->setFontProperties(array("FontName"=>"/var/www/heizung/fonts/verdana.ttf","FontSize"=>7));
$myPicture->setGraphArea(50,40,1155,300);
$labelSkip = floor(count($zeit)/48);
$scaleSettings = array("XMargin"=>10,"YMargin"=>10,"Floating"=>TRUE,"GridR"=>180,"GridG"=>180,"GridB"=>180,"DrawSubTicks"=>FALSE,"CycleBackground"=>TRUE,"ScaleSpacing"=>10,"LabelSkip"=>$labelSkip,"DrawYLines"=>array(0));
$myPicture->drawScale($scaleSettings);
$myPicture->drawLegend(600,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
$myPicture->Antialias = FALSE;  
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
$myPicture->drawLineChart(array("DisplayValues"=>FALSE,"DisplayColor"=>DISPLAY_AUTO));
$myPicture->Render("/var/www/heizung/tmp/temperaturen.png");
?>

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

55 Gedanken zu „Viessmann Heizung auslesen

  • 2. September 2014 um 05:03
    Permalink

    Hallo,

    das ist wirklich ein tolles Projekt. Ich habe es inzwischen auch so lauffähig.
    Ich beschäftige mich gerade mit einer Seite ähnlich der Seite “Heizungsüberwachung Details”.
    Haben Sie für die Darstellung der Brennerstunden und Brennerstarts eine Zwischentabelle in MySql angelegt und berechnet oder schaffen Sie es, dies mit einer SQL-Abfrage abzufragen?

    viele Grüße
    Wolfgang

    Antwort
    • diefenbecker
      3. September 2014 um 14:55
      Permalink

      Hallo Wolfgang,

      die letzten Werte der Heizung und Stromzähler schreibe ich parallel zur kompletten Tabelle (Insert) als eine Zeile (Update) in eine “Snapshot-Tabelle” wie im Artikel beschrieben.
      Dadurch funktioniert die Anzeige der Werte in der Webseite recht schnell.

      Die Graphen zeichne ich mit den Daten aus der Gesamttabelle mit verschiedenen SQL-Querys. Das dauert dann schon etwas länger und funktioniert zum Beispiel so mit der Tabellenstruktur wie im Artikel beschrieben:

      Tägliche Durchschnittstemperatur
      SELECT avg(aussentemperatur),dayname(timestamp) FROM temperaturen WHERE DATE(timestamp) >= DATE_SUB(NOW(),INTERVAL 7 DAY) GROUP BY day(timestamp) ORDER BY timestamp

      Monatliche Durchschnittstemperatur
      SELECT avg(aussentemperatur),monthname(timestamp) FROM temperaturen WHERE DATE(timestamp) >= DATE_SUB(NOW(), INTERVAL 12 MONTH) GROUP BY year(timestamp), month(timestamp) ORDER BY year(timestamp) asc, month(timestamp)

      Tägliche Brennerstarts
      SELECT max(brennerstarts)-min(brennerstarts),dayname(timestamp) FROM brenner WHERE DATE(timestamp) >= DATE_SUB(NOW(),INTERVAL 7 DAY) GROUP BY day(timestamp) ORDER BY timestamp

      Tägliche Brennerstunden
      SELECT max(brennerstunden)-min(brennerstunden),dayname(timestamp) FROM brenner WHERE DATE(timestamp) >= DATE_SUB(NOW(),INTERVAL 7 DAY) GROUP BY day(timestamp) ORDER BY timestamp

      Durchschnitttemperatur
      SELECT avg(aussentemperatur) FROM temperaturen WHERE year(timestamp)='2014'

      Gruß
      Chris

      Antwort
  • 9. September 2014 um 16:43
    Permalink

    Hallo,
    Wirklich toll gemacht … ich konnte gute Anregungen fuer mein erstes RPi-Projekt (Loggen meine Vitodens 300) erhalten.
    Eine Frage habe ich bisher nirgends beantwortet gefunden:
    Wie kann ich neben der Außentemperatur (Ist … getTempA) die Raumtemperatur (Ist) abfragen
    Haben Sie eine Idee?

    Viele Gruesse
    Joerg

    Antwort
    • diefenbecker
      16. September 2014 um 19:33
      Permalink

      Hallo Jörg,

      mir ist leider auch keine Adresse bekannt unter der man die Innentemperatur der Viessmann-Anlage auslesen kann. Im openv-Forum ist auch nichts zu finden. Evtl. ist die Temperatur des Heizungsraumes nicht so interessant. Ganz gut funktioniert das mit FHEM und Homematic-Temperatursensoren. Da kannst Du dann beliebige Räume mit ausstatten.

      Gruß
      Chris

      Antwort
  • 5. November 2014 um 09:02
    Permalink

    Vielen Dank für den Blogeintrag!
    Dieser hat mir bei der Anbindung meiner Vitola sehr geholfen. Nun muss ich mich nur noch in die Datenpunkte reinfuxen, damit ich die Daten, welche noch nicht in der vito.xml stehen abfragen kann.

    Gruß vom Niederrhein.

    Antwort
  • 22. März 2015 um 08:57
    Permalink

    Hallo,

    erstmal Danek für diese guten Beschreibungen.

    Ich werde im Juni auch eine neue Heizung Vitodens300-w erhalten. Habe auch einen Raspi.
    Leider muss ich zugeben, das ich mit Datenbankerstellung usw. keine Ahnung habe.
    Können Sie vielleicht Ihre Tabellen usw. bereitstellen, das ich mir die Struktur im ganzen mal ansehen kann, ob ich als NOOB damit klar komme ?
    Gerade das Darstellen als Webseite fände ich toll, nur ist mir nicht ganz klar wie Sie das abfragen, dient der Raspi als Webserver oder laden Sie die Datenbank irgendwo hin ?

    Vielen Dank und bitte die Anfängerfragen entschuldigen, falls diese irgendwo schon stehen. Bin gerade dabei mich einzuarbeiten.

    Antwort
    • diefenbecker
      23. März 2015 um 20:58
      Permalink

      Hallo Hannes,

      ich habe zwei Raspberry PI laufen. Beide sammeln Daten von verschiedenen Sensoren. Die Daten werden in verschiedene Tabellen einer MySQL-Datenbank auf einem der beiden Rechner gespeichert. Auf diesem werkelt auch ein Apache, wo die Abfragen auf die Datenbank zur Darstellung einer Intranetseite gemacht werden. Ich kann Dir die Struktur der Datenbanken etc. zusenden und die zugehörigen Abfragen zeigen/erklären. Schreib mir einfach eine Mail.

      Gruß
      Chris

      Antwort
  • 29. März 2015 um 10:52
    Permalink

    Hallo Christopher,

    seit einiger Zeit betreib ich einen Vitodens 200W B2KA.
    Nach einigen Problemen mit dem Gerät (Steuerung, Betriebsart, Einstellungen) möchte ich mich etwas tiefer mit der Anlage beschäftigen.Mein erstes Interesse geht dahin, Parameter der Anlage auszulesen, und zwar zunächst insbesondere die Adresse, in der die aktuelle Anzahl der durchgeführten Brennerstarts abgelegt ist. Konkret:
    welches ist die Adresse wo die Brennerstarts abgelegt sind?
    Wie kann ich das Auslesen über die opt.-serielle Schnittstelle realisieren?
    (ich habe ein weing Erfahrung in Elektronikbasteln, Digitaltechnik)
    Über eine hilfreiche Information freue ich mich, wenn es geht auf meine Email. Grüsse Heinz

    Antwort
    • diefenbecker
      29. März 2015 um 11:25
      Permalink

      Hallo Heinz,

      die Adresse für die Brennerstarts sollte die “088A” sein.
      Hab Dir eine Mail geschrieben weil ich noch ein paar generelle Infos brauche. Helfe Dir dann gerne.

      Gruß
      Chris

      Antwort
  • 2. April 2015 um 16:29
    Permalink

    Hi, ich bin beeindruckt und hätte natürlich so etwas auch gerne. :-)))
    Den USB-Lesekopf für meine Vitodens 300 habe ich schon auch die meisten Adressen.
    Was mir fehlt sind die Adressen zum Thema Solar, d.h. Kollektortemperatur, etc.
    Die Info-Funktion der Vitodens spuckt mir die auch aus, also müsste das doch möglich sein. Mit welchen Adressen haben Sie die Funktionen
    getSolarStunden
    getSolarLeistung
    getPumpeStatusSolar
    getTempKol
    parametrisiert? Ich würde mich über ein Feedback freuen.
    PS: ich würde auch die XML-Datei nehmen… ;o)

    Thomas M.

    Antwort
    • diefenbecker
      2. April 2015 um 20:38
      Permalink

      Hallo Thomas,

      das bekommst Du auch hin :-).

      Ich habe eine Vitodens 200-W, Typ WB2C (20CB).
      Folgende Adressen nutze ich für die Daten der Solaranlage auszulesen:

      getSolarStunden: 6568
      getSolarLeistung: 6560
      getPumpeStatusSolar: 6552
      getTempKol: 6564

      Hier auch noch meine vito.xml (Rechte Maustaste -> Speichern unter).
      Die GET-Kommandos mit den zugehörigen Adressen sollten soweit alle funktionieren. Die SETs habe ich bisher noch nicht implementiert.

      Gruß
      Chris

      Antwort
  • 20. Januar 2016 um 09:14
    Permalink

    Hallo,

    sehr schöner und anschaulicher Blog. Und von meiner Seite auch vielen Dank für das Sharen Deiner vito.xml. Ich habe ebenfalls eine Vitodens 200W samt Solarthermie (VScotHO1), deren Zustände ich per Optolink-Adapter und Raspi 2 auslese. Auch das Schreiben von Zustandsänderungen (Betriebsart, Partybetrieb, Sparbetrieb, Kennlinienniveau und -neigung, etc.) funktioniert soweit mittels KW2-Protokoll. Ich möchte aber mittelfristig auf das P300-Protokoll umsteigen. Das Lesen der Zustände funktioniert damit auch sehr gut. Beim Schreiben gibt’s noch Probleme, aber da habe ich schon erste Lösungsansätze gefunden.

    Ich habe übrigens keinen Cronjob definiert, sondern steuere den Auslese- und Schreibprozess über meine HomeMatic. Da gibt es einen sehr schönen [url=http://homematic-forum.de/forum/viewtopic.php?f=48&t=21640&hilit=vitotronic]CCU.IO-Adapter[/url].

    Übrigens, binnen vier Jahren ist uns nun schon das zweite Mal der Controller der Vitodens abgeraucht. Beim ersten Mal (2013) wurde er auf Garantie ausgetauscht und nun glücklicherweise auf Kulanz von Viessmann. Die Vitodens hat keinerlei Fehlermeldungen ausgespuckt. Der Brenner wollte einfach nicht mehr starten. Anscheinend ein nicht ganz unbekanntes Problem bei Viessmann. Ansonsten sind wir mit der Anlage aber sehr zufrieden.

    Bis demnächst,

    Thorsten

    Antwort
    • diefenbecker
      20. Januar 2016 um 16:44
      Permalink

      Hallo Thorsten,

      gern geschehen! In die Heizung geschrieben habe ich bisher noch nichts, da ich nur zweimal im Jahr die Betriebsart wechsele und sonst nichts ändere.
      Warum willst Du auf das andere Protokoll wechseln? Was sind die Vorteile?
      Das Modul für FHEM schaue ich mir mal an. Danke für den Tipp!

      Mir ist die Steuerung der Vitodens auch vor 2 Monaten nach etwa 4 Jahren abgeraucht. Auch bei mir ist der Brenner nicht mehr gestartet. Hatte das erst nicht gemerkt da die Kollektoren auf dem Dach alles warm genug machten. Dann kam aber schlechtes Wetter… Der Viessmann-Kundendienst hat es dann ausgetauscht. Bisher mußte ich nichts zahlen. Viessmann sagte mir das es Einzelfälle wären! Bei diesem Fehler war irgendwo in den Tiefen der Heizung eine bestimmte Codieradresse mit einem bestimmten Wert belegt. Ich weiß aber leider nicht mehr genau wie das war. Aber auch ich bin mit der Heizung bisher zufrieden.

      Gruß
      Chris

      Antwort
    • 1. Oktober 2016 um 09:08
      Permalink

      Hallo Thorsten,

      mich würde Dein Ansatz für die Schreiboperationen interessieren. Hier klappt das Auslesen mittels 300-Protokoll einwandfrei, nicht aber das Absetzen von Befehlen. Bist Du hier weitergekommen?

      Antwort
  • 20. Januar 2016 um 14:13
    Permalink

    Nice project.
    Im in the middle of doing something like this on a raspberry. Would it be possible to send me the html pages ( and script) used to implement the web interface?

    Antwort
    • diefenbecker
      20. Januar 2016 um 17:23
      Permalink

      Hi Peter,

      My current website is based on http://metroui.org.ua/ front-end. You can love or hate the Windows like tiles but for this kind of visualization it fits for me.
      I will write an article about my new website in the next days. Nevertheless, the front-end is based on the data which is stored in the MYSQL DB. So the first step is to retrieve the data from the heating and store the values in the database. Have you already started with that?

      Chris

      Chris

      Antwort
      • 20. Januar 2016 um 18:07
        Permalink

        Hallo Chris

        I’ve used the rrdbtool package to create some graphs and put those on a simple web server.
        One thing I simplified is the template script used by vclient,I could not face writing the if error clauses for each parameter read from the boiler, use the following command for vclient:
        vclient -h localhost -p 3002 -f /etc/vcontrold/vc-commands.txt -t /etc/vcontrold/update.tmpl -x /etc/vcontrold/update.sh

        and used the following code for the update.tmp file

        #!/bin/sh
        DB=/etc/vcontrold/rrdbs/vito-temp.rrd
        ERRF=vc-err.txt
        # $1 = OutSideTemp
        # $2 = OutTempLow
        # $3 = OutTempAtt
        # $4 = TempRoom
        # $5 = TempRoomLow
        # $6 = SetRoomTemp
        # $7 = BoilerTempLp
        # $8 = BoilerTemp
        # $9 = TempDHW
        # $10= TempS2
        # $11= TempCol
        # $12= HWTempSol
        # $13= SetTempDHWSol
        # $14= TempFlueGas
        # $15= TempFlowA1M1
        # $16= TempSoll_A1M1
        # $17= CurveLevel
        # $18= CurveSlope
        # $19= BurnerStarts
        # $20= HoursBurner
        # $21= BoilerLoad
        # $22= BoilerCap
        # $23= RPMIntPump
        # $24= RPMPIntern
        # $25= DrehzahlHKP_A1
        NN=25
        while [ $NN -gt 0 ]
        do
        eval ERR=\\$E$NN
        eval COM=\\$C$NN
        if [ “x$ERR” != x ] ; then
        echo -n date >> /tmp/$ERRF
        echo “Error on command $COM: $ERR” >> /tmp/$ERRF
        exit 1;
        fi
        NN=$(( $NN – 1 ))
        done
        BS=echo $R19|cut -d '.' -f 1
        BH=echo $R20|cut -d '.' -f 1
        rrdtool update $DB N:$1:$2:$3:$4:$5:$6:$7:$8:$9:$10:$11:$12:$13:$14:$15:$16:$17:$18:$BS:$BH:$21:$22:$23:$24:$25

        Antwort
        • diefenbecker
          30. Januar 2016 um 13:22
          Permalink

          Peter,

          You are absolutely right. This is much clearer than using all the single if clauses. I´ve changed it in my environment.
          Thanks for sharing the code!

          Chris

          Antwort
          • 12. Oktober 2016 um 18:03
            Permalink

            This looks _really_ clean – but if I’m not mistaken, the error checks will not work.

            When using the template function of vclient, the update script is _not_ run with all the values as parameters or with variables preset – the template script is being processed and all variables are _replaced_ with their respective values (so e.g. from ‘echo $02’ in the template, you get ‘echo 12.50000’ in the processed script).

            So your error checks will always succeed, even if there should be an error, as the $Exx-variables are never set.

            Maybe you could do something like

            Err00=$E00
            Err01=$E01
            Err02=$E02

            and iterate over the $Errxx-variables.

            As the value parameters are all there in clear, they are properly replaced and the updating of the new values works fine.

            (I have to admit that I rewrote my whole update script before I realized this 😉 )

          • 30. Oktober 2016 um 18:46
            Permalink

            Als Antwordt an Sebastian; neues version fur die Template file\#!/bin/sh
            DB=/etc/vcontrold/rrdbs/vito-temp.rrd
            ERRF=vc-err.txt
            WWW=/var/www/html/vito/data/vito_data.txt
            # Num Used in rrdb code vito.xml
            S01=”$1 OutSideTemp = 5525 = $C1 $R1\n” ; ERR1=$E1
            S02=”$2 OutTempAtt = 0898 = $C2 $R2\n” ; ERR2=$E2
            S03=”$3 TempRoom = 2306 = $C3 $R3\n” ; ERR3=$E3
            S04=”$4 SetRoomTemp = 2306 = $C4 $R4\n” ; ERR4=$E4
            S05=”$5 BoilerTemp = 0810 = $C5 $R5\n” ; ERR5=$E5
            S06=”$6 TempDHW = 0804 = $C6 $R6\n” ; ERR6=$E6
            S07=”$7 TempCol = 6564 = $C7 $R7\n” ; ERR7=$E7
            S08=”$8 HWTempSol = 6566 = $C8 $R8\n” ; ERR8=$E8
            S09=”$9 SetTempDHWSol = 6300 = $C9 $R9\n” ; ERR9=$E9
            S10=”$10 TempFlueGas = 0808 = $C10 $R10\n” ; ERR10=$E10
            S11=”$11 SetTempFlowHC1 = 2544 = $C11 $R11\n” ; ERR11=$E11
            S12=”$12 SetTempBoiler = 555A = $C12 $R12\n” ; ERR12=$E12
            S13=”$13 CurveLevel = 27D4 = $C13 $R13\n” ; ERR13=$E13
            S14=”$14 CurveSlope = 27D3 = $C14 $R14\n” ; ERR14=$E14
            S15=”$15 BurnerStarts = 088A = $C15 $R15\n” ; ERR15=$E15
            S16=”$16 HoursBurner = 08A7 = $C16 $R16\n” ; ERR16=$E16
            S17=”$17 BoilerLoad = A38F = $C17 $R17\n” ; ERR17=$E17
            S18=”$18 BoilerCap = A305 = $C18 $R18\n” ; ERR18=$E18
            S19=”$19 BurnerGas = 55D3 = $C19 $R19\n” ; ERR19=$E19
            S20=”$20 BoilerPumpRPM = 7663 = $C20 $R20\n” ; ERR20=$E20
            ERR21=”OK”
            S22=”$22 BurnerStage1 = 0980 = $C22 $R21\n” ; ERR22=$E22
            S23=”$23 PumpStatus = 7660 = $C23 $R22\n” ; ERR23=$E23
            S24=”$24 PumpA1Status = 7663 = $C24 $R23\n” ; ERR24=$E24
            S25=”$25 SolarPumpStatus = 6552 = $C25 $R24\n” ; ERR25=$E25
            S26=”$26 SolarDHWSuppress = 6551 = $C26 $R26\n” ; ERR26=$E26
            S27=”$27 StatusPumpIntern = 7663 = $C27 $R27\n” ; ERR27=$E27
            S28=”$28 BurnerStatus = 55D3 = $C28 $R28\n” ; ERR28=$E28
            echo $S01$S03$S05$S06$S07$S08$S25$S17$S28 > $WWW
            NN=28
            while [ $NN -gt 0 ]
            do
            eval ERR=\\$ERR$NN
            eval COM=\\$S$NN
            if [ “$ERR” != “OK” ] ; then
            echo -n date >> /tmp/$ERRF
            echo “Error on command $COM: $ERR” >> /tmp/$ERRF
            exit 1;
            fi
            NN=$(( $NN – 1 ))
            done
            BS=echo $R15|cut -d '.' -f 1
            BH=echo $R16|cut -d '.' -f 1
            rrdtool update $DB N:$1:$2:$3:$4:$5:$6:$7:$8:$9:$10:$11:$12:$13:$14:$BS:$BH:$17:$18:$19:$20:$22:$23:$24:$25:$26:$27:$28:1:2:3:4:5:6:7:8:9

  • 20. Januar 2016 um 16:59
    Permalink

    Wie schaut es bei euch mit der Garantie aus? Auf Anfrage bei Viessmann sagte man mir, dass die Garantie sofort erlischt, wenn so ein Adapter genutzt wird. Man könnte den Zugriff auslesen… Habt Ihr da Erfahrungen?

    Antwort
    • diefenbecker
      20. Januar 2016 um 17:37
      Permalink

      Hallo Olli,

      ich habe den Adapter abgemacht bevor der Kundendienst kam. Allerdings baumelte er keine 30 cm neben der Heizung.
      Der Kundendienst war zu zweit da. Einer hat die Steuerung ausgelesen, ausgebaut, eingebaut und neu programmiert, der andere hat sich interessiert im Heizungraum umgeschaut.
      Beide haben mich aber nicht auf den Adapter angesprochen. Ich habe auch den Ball flach gehalten und nichts erwähnt, obwohl man bei mir im Heizungsraum nur 1×1 zusammenzählen muss da aus fast jedem Gerät ein Kabel zum Raspi geht 😉

      Dürfte der Heizungmonteur auch diesen Adapter nicht nutzen oder wie werden die Zugriffe auseinander gehalten?
      Gut, der Heizungsmonteur verbrachte nicht die letzten drei Jahre bei mir im Keller…

      Aber ein solcher Defekt kann m.E. nicht vom Anschluss eines optisch getrennten Adapters herrühren, oder?

      Gruß
      Chris

      Antwort
      • 20. Januar 2016 um 18:21
        Permalink

        Das vermag ich nicht zu beurteilen, allerdings finde ich das auslesen der Heizung momentan nicht so interessant. Ich beschäftige mich momentan mit dem optimalen steuern einer KWL von Helios und möchte gerne automatisch Strom und WMZ auslesen.
        Wenn man einmal dabei ist, dann hätte ich auch gerne die Heizung mit dazu gekommen. Da ich aber eine offizielle Anfrage an Viessmann gestellt habe, weiß ich nicht was die daraus machen…
        Ist hier wer der eine LWP mit der Vitocal betreibt und mal Zeit hast darüber zu ‘plauschen’?

        Antwort
        • 13. Mai 2017 um 21:54
          Permalink

          Hi,

          das kommt davon, wenn man nicht regelmäßig hier reinschaut…

          Ich habe eine Vitocal 200-S und lese die aus. Steuern der Anlage ist rudimentär möglich, aber nur mit Hack und ohne vernünftige Rückmeldung.

          Gruß
          Sebastian

          Antwort
    • 21. Januar 2016 um 07:47
      Permalink

      Das Auslesen der Werte mittels Optolink-Adapter dürfte nicht ursächlich für das Problem mit dem Controller der Vitodens sein. Zum Einen hatte ich den ersten Ausfall 2013, den ich übrigens ebenfalls erst zu Beginn der darauf folgenden Heizperiode bemerkte, weil die Solarthermie immer ausreichend warmes Wasser erzeugte, als noch gar kein Optolink-Adapter angeschlossen war, zum Anderen lief die Anlage mit angeschlossenem Optolink-Adapter bis zum letzten Wochenende gut ein Jahr völlig problemlos (ich lese einige Parameter alle zwei Minuten aus) und Viessmann tauschte das defekte Board aufgrund des von meinem Installateur ausgelesenen Fehlercodes sofort auf Kulanz aus. Dass Viessmann sagt, die Garantie würde beim Anschluss eines entsprechenden Adapters sofort erlöschen, ist legitim und durchaus verständlich. Eine Ursache für den Ausfall kann ich da aber nicht erkennen. Beim Fernsteuern der Anlage könnte das natürlich durchaus anders aussehen, wenn man z.B. Adressen anspricht, die zu Fehlzuständen führen können. Daher sollte man damit auch vorsichtig sein.

      Antwort
  • 21. Januar 2016 um 08:07
    Permalink

    Hallo Chris,

    dass ich lieber das P300-Protokoll verwenden möchte, liegt in der deutlich schnelleren Auslesegeschwindigkeit der Adressen begründet. Zudem hatte ich es gelegentlich, dass die Anlage per KW2-Protokoll geschriebene Zustandsänderungen nicht annahm, obwohl im Log eine positive Quittung angezeigt wurde. Bisher habe ich es aber noch nicht hin bekommen, Parameter mit dem P300-Protokoll zu schreiben, auch wenn es dazu hier (http://sourceforge.net/p/vcontrold/patches/3/) einen entsprechenden Workaround für die Dateien framer.c und parser.c gibt.

    Gruß,

    Thorsten

    Antwort
    • 13. Mai 2017 um 21:58
      Permalink

      Hallo Thorsten,

      ich habe durch Basteleien an der Protokolldefinition für jedes Schreibkommando ein eigenes Protokollkommando definiert. Da kann ich Parameter und Checksumme vorher berechnen, dann geht das auch.
      Nachteilig ist, dass trotz allem ein Fehlerstatus zurückgemeldet wird (obwohl der Schreibvorgang erfolgreich ist). Man muss also hinterher ggf. nochmal den Status auslesen, damit man sicher sein kann, dass die Änderung tatsächlich übernommen wurde.

      Schreiben kann ich allerdings bisher nur die Betriebsart. 1x Warmwasser hab ich noch nicht geschafft, Solltemperatur brauche ich nicht, habe ich daher nicht versucht.

      Gruß
      Sebastian

      Antwort
  • 28. Januar 2016 um 21:26
    Permalink

    Ich habe eine Vitodens 343 seit 11/2015 im Neubau in Betrieb. Diese hat eine LAN-Schnittstelle, die über den Router nach Hause funken will, was ich aber nicht will. Ich würde jedoch gerne die Daten vorher selber im Home-Netz “abfangen” und mit dem RasPi verarbeiten.
    Hat jemand dazu eine Idee ? Der Router zeigt die Viessmann an, ich habe deren Zugriff nach aussen erstmal geblockt. Ein Portscan meinte, alle (!) Ports der Viessman_LANCard seien geschlossen.

    Antwort
  • 28. Februar 2016 um 17:40
    Permalink

    Hallo Chris,
    mal wieder ein super Projekt von Dir.
    Habe den Stromzähler vom Blog hier bereits seit einiger Zeit am Laufen und bin begeistert.

    Möchte meine Vitodens 300-W nun aber auch anzapfen.
    Frage: Woher bekomme ich dieses USB-Modul?
    Die Email-Adresse aus diesem Link scheint nicht mehr zu funktionieren:
    http://openv.wikispaces.com/Bauanleitung+USB

    Gruß
    Johannes

    Antwort
    • 22. März 2016 um 13:03
      Permalink

      Hallo,
      tolle Seite. Respekt.

      Vielleicht könnt ihr mir auch dabei helfen, meinen Raspberry Pi so einzustellen, das ich die Werte aus meiner Vitodens 200 WB2 auslesen und grafisch darstellen kann.
      – Raspberry vorhanden und per WLAN und Remotedesktop zugriff von meinem PC (auf dem ich das ganze auch anschauen / auswerten möchte ).
      – Optolik-Adapter so wie hier (http://openv.wikispaces.com/Bauanleitung+RaspberryPi) angefertig und an GPIO des Raspi angeschlossen.
      – laut dieser Anleitung (http://openv.wikispaces.com/vcontrold+mit+Raspberry+Pi) vorrangetastet. Leider konnte ich nur bis Punkt 3 abschließen. Punkt 4 soll ja angeblich übersprungen werden. Aber bei Punkt 5 weiß ich nicht wie und wo genau ich das Ganze eingeben soll.

      Ich würde mich freuen, wenn sich jemand erbarmt und mich Schrittweise vorran bringen würde.

      Gruß Joe

      Antwort
      • diefenbecker
        23. März 2016 um 18:13
        Permalink

        Hallo Joe

        “Ihr” bin in diesem Blog nur ich 🙂 aber vielleicht kann ich Dir trotzdem etwas helfen.

        Punkt 4 würde ich nicht auslassen. Problem ist, falls Du an dem Raspi irgendwann ein weiteres USD-Gerät anhängen willst kann es sein, das nach einem Neustart des Raspi oder der USB-Devices die Reihenfolge geändert wird. Das hatte ich auch öfter. Mit Punkt 4 definierst Du einen eindeutigen Namen unabhängig vom USB-Port was später evtl. seltsame Fehler verhindert.

        Die Datei “vcontrold.xml” ist die zentrale Konfigdatei von “vcontrold”. Bei mir liegt diese nach der Installation unter “/opt/vcontrold/xml-32/xml/”.
        Dort definierst Du dann unter anderem den unter 4) definierten Port bzw. das USB-Device des Lesekopfes und den Port für die Kommunikation mit Telnet.
        Wenn Du 4) nicht ausführst musst Du unter “/dev” mit “ll” schauen, ob der Lesekopf an ttyUSB0 oder ttyUSB1 hängt. Eins der beiden trägst Du dann in die Datei wie im Beispiel vorgegeben inkl. den “/dev” ein.

        Schreib mir eine Mail wenn es noch irgendwo klemmt.

        Gruß
        Chris

        Antwort
        • 13. Mai 2017 um 18:27
          Permalink

          Hallo Chris,
          leider bin ich einige Zeit nicht mehr zu meinem Projekt gekommen.
          Ich habe es aktuell soweit, das ich über “telnet localhost 3002” und anschließend mit “getTempA” zumindest schon mal die Außentemperatur angezeigt bekomme.
          Aber wie geht es nun weiter, das ich auch eine grafische Anzeige hinbekomme, bzw. Werte speichere ?
          Bin mir gereade nicht sicher, mit was ich dabei fortfahre.
          Wäre schön, wenn Du mich dabei unterstützen könntest.
          Oder jemand, bei dem das alles schon stabil läuft.

          Ich freue mich über Unterstützung.

          Gruß Joe

          Antwort
  • 23. März 2016 um 22:13
    Permalink

    Hallo chris,

    danke für Deine Antwort.

    Ich bin noch am Probieren. Ich denke mein Skript in Punkt 6 hat noch ein Problem.

    Leider weiß ich auch nicht, ob die UART (GPIO) Schnittstelle funktioniert, bzw. ob mein Eigenbauadapter geht.

    Gibt es vielleicht ein komplett fertiges Image ?

    Ich verbinde mich mit dem Raspberry Pi per Remotedesktopverbindung. Oder gibt es vielleicht die Möglichkeit, das Du Dich auf den Pi aufschalten kannst, um dort direkt nachzusehen ?

    Bin momentan etwas am verzweifeln…..

    Aber Deine Visualisierung hat meinen Ehrgeiz erweckt 

    Gruß Joe

    Antwort
  • 16. Mai 2016 um 19:17
    Permalink

    Hallo Chris,

    danke für die Anregung und die tolle Anleitung.
    Die größte Inspiration war für mich die Darstellung der Daten, leider sind meine Webdesign Kenntnisse nahe null, daher wäre es denke ich für viele Einsteiger eine große Erleichterung wenn Du die php Scripte dafür zur Verfügung stellen könntest.

    Vielen Dank und Gruß
    Alex

    Antwort
  • Pingback: Amazon Kindle als Statusdisplay - Update - bubuxblog

  • 13. September 2016 um 00:26
    Permalink

    Hallo,

    vielen Dank für den hervorragenden Artikel. Ich habe selbst eine Vitotronic 200 HO1b (20CB) und bin aktuell auf der Suche nach den wichtigsten Adressen. Gibt es eine Möglichkeit, Ihre vito.xml und die vcontrold.xml zu bekommen, da mir vor allem im Solarbereich noch Adressen fehlen?

    Gruß
    Hilmar Acker

    Antwort
  • 4. Oktober 2016 um 17:22
    Permalink

    Hallo Chris,

    schönen Bericht hast du da geschrieben 🙂 Ich habe das bei mir so ähnlich umgesetzt, allerdings noch mit rrdb. Ich denke noch etwas darauf rum, wie ich das ggf. in MariaDB umsetze. Da neben dem RasPi noch ein Server mit ausreichend Power und Platten läuft, wären auch aufwendige SQL-Queries und -tables kein Problem.

    Mich würde interessieren, wie das Fehlerauslesen (statusstoerung und error0) funktioniert. Ich will bei mir (Vitocal 200-S / Vitotronic WO1C) die Fehleradressen mal isolieren, aber wenn die Arbeit schon gemacht ist… wäre ich für den entsprechenden Ausschnitt aus der XML-Datenbank dankbar (oder eine Erklärung zum Nachbau 😉 ).

    Für das Senden mit dem P300-Code habe ich einen Workaround für die Betriebsarten erarbeitet:

    GETADDR $addr $hexlen;RECV $len $unit

    SETADDR $addr $hexlen;SEND BYTES $unit;RECV 1 SR

    SEND 00 02 $addr $hexlen 00;RECV 1 SR

    SEND 00 02 $addr $hexlen 01;RECV 1 SR

    SEND 00 02 $addr $hexlen 02;RECV 1 SR

    SEND 00 02 $addr $hexlen 04;RECV 1 SR

    SEND 00 02 $addr $hexlen 05;RECV 1 SR

    SEND 00 02 $addr $hexlen 06;RECV 1 SR

    SEND 00 02 $addr $hexlen 07;RECV 1 SR

    So umgehe ich das Problem mit den Checksummen; den Patch auf sourceforge werde ich mir mal zu Gemüte ziehen.

    Gruß
    Sebastian

    Antwort
  • 31. Oktober 2016 um 21:53
    Permalink

    Hallo Chris,

    jetzt muß ich mich auch mal in Deinem Forum bedanken, ich habe das ja – im Prinzip – alles von Dir abgekupfert, und das läuft einfach superstabil, seit Jahren jetzt. Ich bin gar nicht mehr in der Lage zu Duschen, ohne vorher einen Blick in den Rechner zu werfen um die Speichertemperatur zu sehen 🙂

    Das absolute Highlight wäre jetzt, wenn Du auch noch Schreib-Zugriff auf die Viessmann hinbekommst. Also z. B. Uhrzeit (Sommer/Winterzeit), Betriebsart, Raum-Solltemperatur …

    Grüße, Gerd

    Antwort
    • diefenbecker
      1. November 2016 um 18:18
      Permalink

      Hallo Gerd,

      gerne doch :-). Das mit dem Blick vorm Duschen kommt mir bekannt vor 😉

      Ich muss zweimal im Jahr an die Heizung um auf “nur Warmwasser” um zu schalten… Ok! Da lohnt sich der Schreibzugriff 🙂
      Ist ja jetzt auch bald Winter und ich habe wieder mehr Zeit für solche Dinge.

      Wintergrillen bei uns?

      Gruß
      Chris

      Antwort
  • 19. Januar 2017 um 12:01
    Permalink

    Hallo Gerd,

    ich bin vor einem Monat auf dein Projekt Viessmann-Heizung gestoßen und war gleich infiziert. Vielen Dank für deine ausführlichen Erklärungen und Beispiele.
    Das auslesen und speichern der Daten funktioniert nun bei mir. Jedoch fehlt mir noch die Ausgabe für’s Auge.
    Hast du den Quellcode der Übersichtsseite irgendwo veröffentlicht? Ich würde mir gern die PHP-Seite installieren.

    Viele Grüße

    Daniel

    Antwort
    • diefenbecker
      23. Januar 2017 um 16:42
      Permalink

      Hallo Daniel,

      Du meinst die Seite mit der Hausskizze? Das habe ich leider nicht mehr. Aktuell nutze ich eine Kachel-Ansicht da ich mehr Informationen unterbringen musste. Grundlage für meine interne Webseite sind die Templates von http://metroui.org.ua/. Wie das aktuell auschaut sieht man in dem ein oder anderen Screenshot in neueren Artikeln. Schreib mir mal eine Mail dann schauen wir mal wo genau ich Dir helfen kann.

      Gruß
      Chris

      Antwort
  • 23. Januar 2017 um 15:57
    Permalink

    Hallo kann ich auch das Originale Anschlussleitung USB-Optolink Herstellnummer 7856059 verwenden?
    Ohne selbst das Kabel basteln zu müssen?

    MfG

    Antwort
    • diefenbecker
      23. Januar 2017 um 16:00
      Permalink

      Hallo,

      und dann mit diesem Kabel die openv-Software nutzen?
      Das sollte funktionieren.

      Gruß
      Chris

      Antwort
  • Pingback: Odroid C2 – Update 1 (Gas- und Wasserzähler) – bubuxblog

  • 21. Februar 2017 um 17:50
    Permalink

    Hallo, eine Anmerkung zum Kabel:
    Ich habe das originale Kabel um über € 140 gesehen.
    Ich habe in der Bucht vitoconnect um € 100 gesehen, da ist das Kabel auch dabei.
    BG,
    Gero

    Antwort
  • 17. Mai 2017 um 09:56
    Permalink

    Hallo noch mal,
    gibt’s denn keinen der mir weiterhelfen kann?
    Vitodens 200, Verbindung zum Raspberry funktioniert. Wie bekomme ich das auslesen, speichern und grafische Darstellen der Daten hin?
    Hat vielleicht jemand fertige Skripts die ich aufspielen kann?
    Oder kann mir dabei helfen es funktionsfähig zum laufen zu bekommen?
    Wäre super.

    Danke
    Joe

    Antwort
  • 4. November 2017 um 21:44
    Permalink

    Hallo,

    ich versuche gerade meine neue Viessmann in den Griff zu bekommen.. und habe eine Frage zum (zyklischen) Abfragen via vc.commannds/template. Frage ich die Schaltzeiten ab, erhalte ich nur folgendes:
    pi@Raspi4:~/openv $ vclient -h localhost:3002 -f vc-commands.txt -t data.tmpl

    getTimerM1Mo=1.000000

    anstatt:
    pi@Raspi4:~/openv $ vclient -h localhost:3002 -f vc-commands.txt

    getTimerM1Mo:
    1:An:13:00 Aus:20:30
    2:An:– Aus:–
    3:An:– Aus:–
    4:An:– Aus:–

    Wie bekomme ich die Schaltzeiten via Template zu fassen?

    Danke!

    Antwort
  • 3. April 2018 um 18:42
    Permalink

    Sehr geehrter Hr.Diefenbecker,
    bin leidenschaftlicher Follower und Nachahmer ihrer o.g. Veröffentlichung.
    Alles läuft super stabil, Viessman gibt Alles was ich von ihm möchte und das sogar störungsfrei. Eine MariaDB habe ich auch schon zum abspeichern am laufen. Leider bin ich jedoch nicht der HTML und PHP Freak. Gerne würde ich ihre Seiten mit meinen daten zur Anwendung bringen. Meine Frage bzw Anfrage deshalb wäre ob sie mir ihre HTML bzw. PhP`s zu obigem Beispiel freundlicherweise zur Verfügung stellen könnten.
    Mein überschwänglicher Dank wäre ihnen sicher.
    Viele Grüße
    Jürgen Ernst

    Antwort
  • 4. Mai 2018 um 21:42
    Permalink

    Hallo,

    ich habe eine Vitodens 200-W WB2C Uml. 19kn ECP.

    Das klingt so, als ob du die gleiche Heizung hast. Leider bin ich mir unsicher, bzgl. der passenden ID.
    Kannst Du mir weiterhelfen?

    Danke und Grüße
    Oliver

    Antwort
    • diefenbecker
      8. Mai 2018 um 18:08
      Permalink

      Hallo Oliver,

      ja, ich habe die gleiche Heizung. Die Device ID ist “2053”.
      Kann Dir auch meine vito.xml schicken falls noch Bedarf besteht.

      Gruß
      Chris

      Antwort

Schreibe einen Kommentar

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