openv / openv

:fire: OpenV Wiki
https://github.com/openv/openv/wiki
250 stars 28 forks source link

Vitotronic 200 W10B #42

Open WikiSpaxe opened 7 years ago

WikiSpaxe commented 7 years ago

Hallo, ich habe seit Juli diesen Jahres eines Vitocal 300 mit o.g. Steuerung (Stand des Benutzerhandbuchs ist 02/2011). Nun wollte ich zwar die vielen Tips zum Einsatz des Optolink-Adapers nutzen, bin aber selbst programmiertechnisch keine Leuchte und frage mich, ob die Protokolle und Adresse auch auf diese (neue?) Steuerung W01B passen.

Hat jemand von euch Erfahrung hiermit?

WikiSpaxe commented 7 years ago

Bei mir dreht es sich um eine Vitocal 350-A mit der gleichen Steuerung Vitotronic 200 WO1B. Ich nutze vcontrold. Das einzige, was ich sinnvoll ausgelesen bekommen habe, ist die Gerätekennung: 20 49 02 0A

Das Suchen im Speicher nach irgendwelchen Werten ist naturgemäß nicht sehr praktisch. Bisher habe ich ca. 30 bekannte Adressen anderer Steuerungen ausprobiert, aber in den meisten Fällen erhalte ich nur FF zurück, manchmal 00. Auch die Suche in der Nähe der bekannten Adressen brachte bisher keinen Erfolg.

Hat jemand bereits Erfahrung mit dieser Steuerung?

WikiSpaxe commented 7 years ago

Hi Bernhard, bisher habe ich noch kein Optolink hier bestellt (selbst bauen kann ich nicht). Genau vor diesem Problem hatte ich bedenken. Noch mehr befürchte ich aber, dass ich die Anlage unbemerkt bzw. beim ausprobieren verstellen könnte.

WikiSpaxe commented 7 years ago

Der Fehler saß mal wieder vor der Tastatur. Ich hatte als Protokoll GWG statt KW2 genutzt. Ein paar sinnvolle Werte konnte ich bereits auslesen, muss aber noch testen.

WikiSpaxe commented 7 years ago

Hi Bernhard, ich würde über diese Lösung, ein zeitliches mitschreiben der Werte für AT, WP-VL und WP-RL sowie Puffer und HK-VL realisieren wollen. Sorry, dass ich Dich da als Versuchskaninchen missbrauche, mich würde aber interessieren, ob das die hier zur Verfügung gestellte Software hergibt. Wenn ja würde ich mit einsteigen wollen und weitere Parameter ermitteln (falls dann noch was zu ermitteln ist). Nutzt Du das ganze auf Windows oder Unix?

WikiSpaxe commented 7 years ago

Hi warmup,

das habe ich auch vor und das sollte auch möglich sein. AT und HK-VL (M2) hatte ich bereits ausgelesen. Ich nutze auf einem alten Notebook Ubuntu 11.10 Server. Wenn ich weiter bin, sage ich Bescheid. Leider habe ich wenig Zeit in den nächsten Tagen.

WikiSpaxe commented 7 years ago

Unter "Adressen" habe ich eine Spalte mit Adressen angefügt, die mit den Adressen anderer Anlagen übereinstimmen und funktionieren. Einige fehlen mir noch, insbesondere Soll-Werte. Danach gucke ich am Wochenende, dann bin ich auch wieder vor der Anlage.

WikiSpaxe commented 7 years ago

Hi Bernhard, ich bin nun auch soweit und habe heute erstmal meine Anlagenkennung ausgelesen. Hat alles super funktioniert (auch wenn der Adapter noch nicht richtig gut sitzt - meine Frage wäre nun mit welchem Tool Du die Datenpunkte ausliest? Änderst Du jedesmal die XML oder gibt es da was eleganteres

WikiSpaxe commented 7 years ago

Die wichtigsten Informationen stehen natürlich unter "XML-Konfiguration", "Hinweise zur XML Konfig", "Protokolle\KW".

Alles unten stehende habe ich ziemlich hastig zusammen geschraubt, da wir Probleme mit der Wärmepumpe hatten und ich dringend ein paar Diagramme vom Betrieb benötigte. Dank der genialen Software vcontrold und vclient hatte ich dann auch die entsprechenden Diagramme in Excel erstellen können. Besten Dank an den/die Autoren!

Ich habe mir testweise die Dateien vcontrold.xml und vito.xml ziemlich neu aufgebaut, da ich vorher den Überblick nicht bekommen habe. Ich hänge die XML Dateien unten an.

Vorweg zum Verständnis: In der vito.xml existiert der command "get", das ist nicht neu:


  <command name='get' protocmd='gettestaddr'>
    <description>Testabfrage, Adresse eingeben</description>
    <addr>dummy</addr>
    <len>2</len>
  </command>

In der vcontrold.xml existiert entsprechend dazu unter protocols "KW2" der command "gettestaddr":

<send>SYNC;GETADDR;SEND BYTES;SEND $len;RECV $len $unit</send>

Dazu werden die darüber stehenden Makros SYNC und GETADDR verwendet.


  <macro name='SYNC'>
    <command>SEND 04;WAIT 05;SEND 01</command>
  </macro>

  <macro name='GETADDR'>
    <command>SEND F7</command>
  </macro>

Per Telnet zum vcontrold lassen sich sich mit "get" zwei Bytes aus der Anlage auslesen. Beispiel für die Außentemperatur: get 01 01

Beim SYNC habe ich direkt die 01 als ACK auf das empfangene 05 gesendet, damit später vom vclient mehrere GETADDR direkt hinterinenader ausgeführt werden können. Das ist ja beim KW Protokoll möglich. Die in der vito.xml beschriebenen commands nutzen deswegen nicht "gettestaddr" (enthält SYNC), sondern "getaddr":


  <command name="getaddr">
    <retry>3</retry>
    <recvTimeout>150</recvTimeout>
    <send>GETADDR $addr $hexlen;RECV $len $unit</send>
  </command>

Das hat den Nachteil, dass alle commands der vito.xml nur über den vlcient und in Verbindung mit dem command "sync" ausgeführt werden können. SYNC und folgendes GETADDR muss (wenn ich das hier im Wiki richtig gelesen habe) innerhalb einer Sekunde erfolgen. Das lässt sich per telnet zum vcontrold nicht so gut umsetzen. Das SYNC vor jeder Abfrage dauerte mir bei vielen Werten über den vclient aber viel zu lange.

Hier die beiden XML Dateien, darunter die Datei vclient.cmd mit den vom vlcient abzusetzenden commands, darunter meine Einträge der crontab, damit die Werte jede Minute gelesen werden und in eine CSV Datei geschrieben werden. Die CSV Datei kann man gut in Excel improtieren und dann ein Diagramm erstellen. Das war bisher nur zum Testen, als nächstes möchte ich RRDB nuttzen, wie es hier im Wiki bereits beschrieben ist. Übrigens verliert die Anlage ab und zu die "Synchronisation", so dass der aktuelle und alle folgenden commands nicht ausgeführt werden. Das passiert aber relativ selten und in Excel konnte man das im Diagramm einfach interpolieren lassen. Durch den Eintrag 3 versucht der vlcient drei Mal den Wert auszulesen, kann aber kein Erfolg haben, da keine erneute Synchronisation stattfindet. Daher habe ich präventiv in der vclient.cmd ein weiteres SYNC in die Mitte gesetzt - dann besteht die Chance doch noch ein paar Werte auszulesen. Das ist noch nicht optimal. Dazu und zum 300er Protokoll gibt es aber auch interessante Diskussionen hier im Wiki.

vcontrold.xml


<?xml version="1.0"?>
<V-Control xmlns:vcontrol="http://www.openv.de/vcontrol">
  <unix>
     <config>
    <serial>
        <tty>/dev/ttyUSB0</tty>
    </serial>
    <net>
        <port>3002</port>
        <allow ip='127.0.0.1'/>
    </net>
    <logging>
        <file>/tmp/vcontrold.log</file>
        <syslog>y</syslog>
        <debug>y</debug>
    </logging>
    <device ID="2049"/>
     </config>
  </unix>
  <units>
    <unit name='Temperatur'>
      <abbrev>UT</abbrev>
      <calc get='V/10' set='V*10'/>
      <type>short</type>
      <entity>Grad Celsius</entity>
    </unit>
        <unit name='Temperatur 1Byte'>
          <abbrev>UT1</abbrev>
          <calc get='V/2' set='V*2'/>
          <type>char</type>
          <entity>Grad Celsius</entity>
        </unit>
    <unit name='Druck'>
      <abbrev>PS</abbrev>
      <calc get='V/10' set='V*10'/>
      <type>short</type>
      <entity>Bar</entity>
    </unit>
  </units>
  <protocols>
      <protocol name='KW2'>
      <macros>
        <macro name='SYNC'>
            <command>SEND 04;WAIT 05;SEND 01</command>
        </macro>
        <macro name='GETADDR'>
            <command>SEND F7</command>
        </macro>
        <macro name='SETADDR'>
            <command>SEND 01 F4</command>
        </macro>
      </macros>
      <commands>
        <command name="gettestaddr">
             <send>SYNC;GETADDR;SEND BYTES;SEND $len;RECV $len $unit</send>
        </command>
        <command name="sync">
             <send>SYNC</send>
        </command>
        <command name="getaddr">
             <retry>3</retry>
             <recvTimeout>150</recvTimeout>
             <send>GETADDR $addr $hexlen;RECV $len $unit</send>
        </command>
        <command name="settestaddr">
             <send>SYNC;SETADDR $addr $hexlen;SEND BYTES $unit;RECV 1 SR</send>
        </command>
      </commands>
      </protocol>
  </protocols>
  <extern xmlns:xi="http://www.w3.org/2003/XInclude">
     <xi:include href="vito.xml" parse="xml"/>
  </extern>
</V-Control>

vito.xml


<vito>
  <devices>
    <device ID="2049" name="V200WO1B" protocol="KW2"/>
  </devices>
  <commands> 
    <command name='sync' protocmd='sync'>
      <description>Synchronisation</description>
      <addr>dummy</addr>
      <len>0</len>
    </command>
    <command name='get' protocmd='gettestaddr'>
      <description>Testabfrage, Adresse eingeben</description>
      <addr>dummy</addr>
      <len>2</len>
    </command>
    <command name='get_10' protocmd='gettestaddr'>
      <description>Testabfrage 10 Bytes, Adresse eingeben</description>
      <addr>dummy</addr>
      <len>10</len>
    </command>
    <command name='getTempM2VList' protocmd='getaddr'>
      <description>Temperatur Istwert Vorlauf M2 in Grad C</description>
      <addr>0116</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempATS' protocmd='getaddr'>
      <description>Aussentemperatur (Sensor 1) in Grad C</description>
      <addr>0101</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempSTS1ist' protocmd='getaddr'>
      <description>Speichertemperatur (Sensor 5) Istwert in Grad C</description>
      <addr>010B</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempWWist' protocmd='getaddr'>
      <description>Warmwasser Sensor oben Istwert in Grad C</description>
      <addr>010D</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempLuftVL' protocmd='getaddr'>
      <description>Waermepumpe Temperatur Primaerkreis Luft Vorlauf in Grad C</description>
      <addr>0103</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempLuftRL' protocmd='getaddr'>
      <description>Waermepumpe Temperatur Primaerkreis Luft Ruecklauf in Grad C</description>
      <addr>0104</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempSekVL' protocmd='getaddr'>
      <description>Waermepumpe Temperatur Sekundaerkreis Vorlauf in Grad C</description>
      <addr>0105</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getTempSekRL' protocmd='getaddr'>
      <description>Waermepumpe Temperatur Sekundaerkreis Ruecklauf in Grad C</description>
      <addr>0106</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getDruckVerdampfer' protocmd='getaddr'>
      <description>Druck im Verdampfer in Bar</description>
      <addr>0680</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>PS</unit>
    </command>
    <command name='getDruckKondensator' protocmd='getaddr'>
      <description>Druck im Kondensator in Bar</description>
      <addr>0682</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>PS</unit>
    </command>
    <command name='getTempVerdampfer' protocmd='getaddr'>
      <description>Temperatur im Verdampfer in Grad C</description>
      <addr>0102</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getSpeicherladepumpe' protocmd='getaddr'>
      <description>Betriebsstatus Speicherladepumpe</description>
      <addr>0416</addr>
      <len>1</len>
      <unit></unit>
    </command>
    <command name='getTempA' protocmd='getaddr'>
      <description>Temperatur aussen in Grad C</description>
      <addr>0101</addr>
      <len>2</len>
      <error>05 05</error>
      <unit>UT</unit>
    </command>
    <command name='getStatusVerdichter' protocmd='getaddr'>
      <description>Temperatur Vorlauf Anlage</description>
      <addr>0400</addr>
      <len>1</len>
      <unit></unit>
    </command>
  </commands> 
</vito>

vclient.cmd


sync
getTempSTS1ist
getTempM2VList
getTempWWist
getTempLuftVL
getTempLuftRL
getTempSekVL
getTempSekRL
sync
getDruckVerdampfer
getDruckKondensator
getTempVerdampfer
getSpeicherladepumpe
getTempA
getStatusVerdichter

crontab -e


*/1 * * * * /usr/local/bin/vclient -h 127.0.0.1:3002 -f /etc/vcontrold/vclient.cmd -s /dev/stdout >>/tmp/vclient.csv
0 */1 * * * /bin/date >>/tmp/vclient.csv

... viel Erfolg

WikiSpaxe commented 7 years ago

Hi Bernhard,

vielen Dank für die Unterstützung, ich werd´ jetzt erstmal versuchen vcontrold unter Windows zum Laufen zu bringen. Ich hoffe bis zum Wochenende soweit zu sein -