19. Januar 2017

Viessmann Heizungswerte mit openv auslesen und mit Volkszähler darstellen

Stand 19.01.2017

Vorwort

Nachdem nun mein Volkszähler-Raspi einige Zeit erstaunlicherweise gut und Problemlos lief, gab es einen Rückschlag: Die Speicherkarte des Raspi war plötzlich defekt und nicht mehr lesbar.

Ich habe mich daher entschlossen das ganze System neu Aufzusetzen – mit einigen Erweiterungen! Meine Heizung ist eine Wärmepumpe Viessmann Vitocal 200S vom 2013 mit WO1C Steuerung, 300l Warmwasser VitoCell, 200l Pufferspeicher und Photovoltaik-Energiezähler. Im Prinzip geht das aber auch mit vielen weiteren Viessmann-Heizungen, siehe dazu die „unterstützen Geräte“ auf der openv Projektseite (https://github.com/openv/openv/wiki).

1. Hardware: Optolink Adapter und Kabel

Ziel ist es nun, nicht nur den Stromverbrauch der Anlage zu messen, sondern auch die Temperaturwerte, die die Heizung ermittelt. Das openv Projekt  ist dabei genau die richtige Anlaufstelle. Zuerst habe ich mir einen USB Optolink Adapter für den Anschluss an die Heizung besorgt und dort montiert.

Den Adapter gibts über die openv Projektseite zu kaufen oder direkt per email an optolink@bytelink.de. Mit Gehäuse kostet dieser ca 50EUR

Der Adapter wird in das „V“ der Diagnose-Schnittstelle der Heizung gesteckt und kommuniziert dann per Infrarot Impulse mit der Heizung. Stromversorgung geschieht über USB. Der Deckel musste allerdings weg (läßt sich aushacken, in dem man eine flache Metallplatte hineindrückt). Damit der allerdings an der Stelle kleben bleibt, habe ich die Ecken mit einigen Tropen Silikon versehen und angeklebt. Geht sicher auch mit anderen Mitteln, hatte aber nichts da.

Da die Entfernung über 5m war, habe ich mir ein aktives USB Verlängerungskabel besorgt (DELOCK Kabel USB 2.0 Verlaengerung, aktiv 5m). Ein Mikro-USB-Kabel hatte ich noch rumliegen.

Das ganze dann an den Rapi anschließen. Natürlich müssen die bisherigen Ports ebenfalls angeschlossen werden. Die Beiden USB IR Adapter stecken auf den Zählern:

2. Software

Die Installation geht entsprechend wie hier beschrieben: https://github.com/openv/openv/wiki

Das USB Gerät sollte über die USB-Serialnr eindeutig identifiziert und zugeordnet werden, da sonst nach dem Neustart die Adressen vertauscht sein könnten: Mit lsusb -v die Serialnr auslesen und in der /etc/udev/rules.d eintragen. Zusammen mit meinen beiden USB-IR-Leseköpfen sieht das bei mir so aus:

SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0093C0A8", SYMLINK+="lesekopf0"
SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0093CBD5", SYMLINK+="lesekopf1"
SUBSYSTEM=="tty", ATTRS{serial}=="AH04F6LM", SYMLINK+="vitoir0"

Bei neueren Systemen funktioniert das so:

SUBSYSTEM=="usb", ATTRS{serial}=="0093C0A8", SYMLINK+="lesekopf0"
SUBSYSTEM=="usb", ATTRS{serial}=="0093CBD5", SYMLINK+="lesekopf1"
SUBSYSTEM=="usb", ATTRS{serial}=="AH04F6LM", SYMLINK+="vitoir0"

nach einem Reboot steht dann mit /dev/lesekopf0, /dev/lesekopf1 und /dev/vitoir0 zur Verfügung – unabhängig in welchen USB-Port man die Stecker steckt!

  • Nun die eigentliche Software:
  • mit vcontrold steht ein Dienst zur Verfügung, mit der man die Viessmann Heizungswerte auslesen und Befehle übertragen kann. Hier bitte auch gleich vzclient installieren!
  • mit vzlogger und volkszaehler können die Ernergiedaten ausgelesen und visualisiert werden. Die Software gibts auf http://www.volkszaehler.org und sollte wie dort beschrieben installiert werden.

3. Konfiguration

Ums kurz zu machen, hier meine Konfiguration:

Konfigurations-Dateien

vcontrold.xml und vito.xml entsprechen der Dateien von der openv Seite.

Hinweis (Danke an Sebastian Vitt): Wenn der vclient vom vzlogger benutzt werden soll, so muss unter Umständen der vzlogger entsprechend kompiliert werden.

Dazu sollte die unter https://wiki.volkszaehler.org/software/controller/vzlogger/installation_cpp-version beschriebene Anleitung zum Building vzlogger mit folgender Änderung befolgt werden:

Statt einem einfachen „cmake ..“ ein „cmake -D METEREXEC_ROOTACCESS=true ..“ aufrufen. Anderenfalls vermerkt vzlogger bei entsprechendem Debug Level im Log:

[Apr 02 15:55:42][w1t] open found 5 w1 devices
[Apr 02 15:55:42][mtr4] Meter connection established
[Apr 02 15:55:42][exec] MeterExec::open: MeterExec protocol cannot be run with root privileges!
[Apr 02 15:55:42][exec] If you really want this, compile vzlogger with:
[Apr 02 15:55:42][exec] 'cmake -D METEREXEC_ROOTACCESS=true .'
[Apr 02 15:55:42][mtr5] Cannot open meter
[Apr 02 15:55:42][] Startup failed: Meter open failed.

vzlogger.conf nun hier im Detail. Die uuids müssen mit volkszähler angelegt und hier eingetragen werden!

{
"retry": 0,
"daemon": true,
"verbosity": 0,
"log": "/var/log/vzlogger.log",
"push": [],
"local": {
"enabled": false,
"port": 8080,
"index": true,
"timeout": 0,
"buffer": 0
},
"meters": [
{
"enabled" : true,
"protocol" : "sml",
"device" : "/dev/lesekopf0", // baudrate: 9600, parity: 8N1 Documentation
//"interval" : 180, /* alternative to aggrgate */
"aggtime" : 60, /* aggregate all signals and give one update to middleware every 'aggtime' seconds */
"aggfixedinterval" : true, /* round all timestamps to middleware to nearest aggtime */
"channels" : [
{
"uuid" : "xxxxxxxxxxxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:1.8.0", /* Wirkleistung */
"aggmode" : "MAX", /* add all s0 intervals in the aggregation. Possible Modes: SUM, AVG, MAXIMUM and NONE*/
"duplicates": 10
},
{
"uuid" : "xxxxxxxxxxxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.8.0", /* Einspeisung */
"aggmode" : "MAX", /* add all s0 intervals in the aggregation. Possible Modes: SUM, AVG, MAXIMUM and NONE*/
"duplicates": 10
}
] // channels
},
{
"enabled" : true,
"protocol" : "sml",
"device" : "/dev/lesekopf1", // baudrate: 9600, parity: 8N1 Documentation
//"interval" : 180, /* alternative to aggrgate */
"aggtime" : 60, /* aggregate all signals and give one update to middleware every 'aggtime' seconds */
"aggfixedinterval" : true, /* round all timestamps to middleware to nearest aggtime */
"channels" : [
{
"uuid" : "xxxxxxxxxxxxxxxxxxxxx",
"middleware" : "http://localhost/middleware.php",
"identifier" : "1-0:2.8.0", /* PV Produktion */
"aggmode" : "MAX", /* add all s0 intervals in the aggregation. Possible Modes: SUM, AVG, MAXIMUM and NONE*/
"duplicates": 10
}
] // channels
},
{
"enabled": true,
"allowskip": false,
"interval": 60,
"aggtime": -1,
"aggfixedinterval": false,
"channels": [
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "sum",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
}
],
//Trick: Um den Gesamtverbrauch bei Sonneneinstrahlung zu berechnen, verwenden wir ein Script:
//gawk muss installiert sein!
//in calc müssen die uuid
"protocol": "exec",
"command": "/root/calcsum.sh",
"format": "$i $t $v"
},
{
"enabled": true,
"allowskip": false,
"interval": 60,
"aggtime": -1,
"aggfixedinterval": false,
"channels": [
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempA.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempWWIstOben.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempSekVL.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempSekRL.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempPufferIst.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempKuehlVL.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempWWSoll.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getRT.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},
{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getEnergiePV.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
}
],
"protocol": "exec",
"command": "vclient -h 127.0.01 -p 3002 -m -c getTempA,getTempWWIstOben,getTempSekVL,getTempSekRL,getTempPufferIst,getTempKuehlVL,getTempWWSoll,getRT,getEnergiePV",
"format": "$i $v"
} // meters
]
}

4. Gesamtverbrauch berechnen

Volkszähler und vzlogger sehen leider nicht vor, mehrere Eingangswerte zu kombinieren. In meinem Fall habe ich das Problem, dass der Gesamtverbrauch auf 0 zurückgeht, sobald die Sonne scheint und die Photovoltaik (PV) Strom einspeist. Somit muss der Gesamtverbrauch berechnet werden. Damit dieser Tag und Nacht funktioniert, muss der Gesamtverbrauch wie folgt berechnet werden:

Gesamtverbrauch = Verbrauch + PV - Einspeisung

Mit dem Script „calcsum.sh“ wird die Summe berechnet. gawk muss installiert sein! Die uuids müssen auch hier entsprechend angepasst werden:

#!/bin/sh
# Energieverbrauch
VERBRAUCH="uuid-verbrauch"
PV="uuid-PV"
EINSPEISUNG="uuid-Einspeisung" 

VERBRAUCH_VAL=`/root/vzclient -u $VERBRAUCH -e data,max,1 get data from=now`
PV_VAL=`/root/vzclient -u $PV -e data,max,1 get data from=now`
EINSPEISUNG_VAL=`/root/vzclient -u $EINSPEISUNG -e data,max,1 get data from=now`
TIME=`/root/vzclient -u $VERBRAUCH -e data,max,0 get data from=now`
TIME=`gawk "BEGIN {print $TIME/1000}"` 

#echo $VERBRAUCH_VAL
#echo $PV_VAL
#echo $EINSPEISUNG_VAL
#echo $TIME 

RESULT=`gawk "BEGIN {print $VERBRAUCH_VAL+$PV_VAL-$EINSPEISUNG_VAL}"` echo "sum $TIME $RESULT"

Mit dem exec Befehl im vzlogger werden dann die Werte eingetragen

"protocol": "exec",
"command": "/root/calcsum.sh",
"format": "$i $t $v"

5. Temperaturen auslesen

nun wo alles eingestellt ist, können die Werte ausgelesen werden. Hier beispielhaft für die Außentemperatur:

Der Befehl für die Außentemperatur ist „getTempA“, diesen sin in der vito.xml definiert. mit „vclient -h 127.0.01 -p 3002 -m -c getTempA“ kann die Temperatur ausgelesen werden. Es wird dann der Wert

getTempA.value -6.000

ausgegeben. Damit vzlogger das erkennt, muss der vzlogger channel diesen Identifier erhalten:

{
"uuid": "xxxxxxxxxxxxxxxxxxxxx",
"identifier": "getTempA.value",
"middleware": "http://localhost/middleware.php",
"aggmode": "none",
"duplicates": 10
},

6. Ergebnis

Aktiviert man alle Werte, so erscheinen diese wie folgt:

Natürlich ist das wenig übersichtlich. Ich schalte hier zwischen den Gruppen um. Nur Energie:

und jetzt nur Temperaturen:

Man sieht hier schon, wie die PV-Funktion dem Warmwasser höhere Soll-Werte gibt und somit das Warmwasser heißer erwärmt.

Die Außentemperatur habe ich auf Achse 2 gelegt, alle anderen auf Achse 3 (siehe rechter Rand)

Übrigens kann mit einem Raspberry Pi noch viel mehr machen, z.B. den Garten automatisch bewässern mit OpenSprinkler.