Die Viessmann Heizzentralen werden mit dem Steuerungssystem Vitotronic gesteuert. Ein LCD-Display erlaubt die Einstellungen und Anzeigen der wichtigsten Betriebsparameter - und dies funktioniert auch ganz gut. Der einziger Nachteil ist, dass eine externe Weiterverarbeitung nicht ohne weiteres möglich ist. Um z.B. die Heizung auf das Gebäude bzw. das Nutzerverhalten optimal einstellen zu können dachte ich mir es wäre doch sinnvoll die Istzustände über den Tages- und Wochenverlauf aufzuzeichnen. Neben den Daten die die Heizung liefert sollen auch unabhängige Temperaturmessungen möglich sein - aber dazu später mehr. Das führte zu meinem Projekt

Heizung & Schnittstelle zur Hausautomatisierung.

Die Steuerung kann man über eine Infrarotschnittstelle "ausfragen". Hierzu hat Viessmann auf der Vorderseite der Steuerung eine Möglichkeit geschaffen mit einer spezielen Viessmann-Software (ich denke für Servicetechniker) die Daten auszulesen oder auch eine Parametrierung vorzunehmen. Aber ich bin nur an Ausgabedaten interessiert. Daher habe ich im ersten Schritt ein Infrarotinterface gebaut welches die Infrarotdaten in standardisierte TTL-Signale umwandelt. Diese TTL-Daten kann man dann über ein USB-TTL Converter in einem PC oder einem kleinen Einplatinencomputer z.B. Raspberry Pi. weiterverarbeiten.

 

Die Schaltung ist wirklich sehr einfach aufgebaut. Es ist aber unbedingt darauf zu achten, dass die IR-Sendediode nicht in die Empfängerdiode einstrahlt, sonst empfängt man nur Müll. Im nachfolgenden Bild habe ich zwei Platinenabstandshalter als Blenden aufgeklebt. Das ganze wird noch mit Heisskleber eingeschmolzen damit man es (DANACH) an der Frontplatte der Heizungssteuerung befestigen kann. Man erkennt die beiden IR-Sender und Empfänger die durch die Platine schauen.

Nachfplgend die EAGLE Schaltbilder:

 

Ich habe die Schaltung in diese beiden Teile getrennt damit man später die Infrarotschnittstelle auch direkt an einen Mikrocontroller ankoppeln könnte.

Die Daten kann man entweder mit einem Windowsrechner oder - wie in meinem Fall - mit einem kleinen Linuxcomputer einlesen und aufzeichen.

Aber wie funktioniert die Kommunikation ?

Protokoll

ACHTUNG: Die hier wiedergegebenen Informationen sind völlig unverbindlich und dienen nur als Einführung in die Technologie. Jede Verwendung gleich welcher Art erfolgt auf eigene Gefahr.

Die Kommunikation mit der Infrarotschnittstelle erfolgt seriell mit den folgenden Schnittstellenparametern: 4800 Baudrate, 1 Startbit, 2 Stopbit, 8 Datenbits. Die nachfolgenden Zeilen sind aus dem Pythoninterfaceprogramm entnommen:

ser = serial.Serial (
        port='/dev/vitoif',
        baudrate=4800,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_TWO,
        bytesize=serial.EIGHTBITS,
        timeout=0.02
    )

Im Ruhezustand sendet die Steuerung mit ca. 1Hz das Zeichen 05h.

Um die Steuerung dazu zu bewegen Daten auszugeben muss man sich zunächst an der Steuerung anmelden. Hierzu einfach (eventuell mehrfach) die folgenden 3 Bytes senden:

"0x16 0x00 0x00" --> ,

die Steuerung antwortet dann meist sofort mit

<-- "0x06"

Jetzt ist die Steuerung bereit um auf Anfragen zu antworten. Dazu sendet man ein Anfragetelegramm:

'4105' '0001' '5525' '02' '82' um z.B. die Aussentemperatur (0x5525) auszulesen.

Beispiel '4105000155250282' ist das gesamte Bytetelegramm. Das letzte Byte (82) ist die Checksumme. Die Steuerung antwortet mit: '0101552502 5F00 E4' was 9.5 deg C (5F00) entspricht.

Nachfolgend die Struktur der Datentelegramme:

Zum Abmelden an der Steuerung einfach wieder 0x04 senden.

Um die Daten der Steuerung quasi per Webbrowser im Onlinezugriff zu haben, habe ich die Daten in einer eigenen Datenbank abgelegt. Von dort können sie dann per Webbrowser oder auch über ein Smartphone ausgelesen werden.

Das Programm um die Heizungsdaten der Viessmann-Zentrale im Rechner aufzuzeichnen habe ich als Python Programm ausgeführt. Dieses liest die verschiedenen "Labels" der Steuerung aus. Die Labels die ausgelesen werden sollen stehen mit Ihrer Adressdefinition, dem Bezeichner und den Skalierungsfaktoren in einer MySQL-Datenbank. Man kann also jederzeit neue Adressen hinzufügen oder die Skalierung ändern.

Der Link mit den Informationen über die verschiedenen Labels auf der Viessmann Seite ist leider nicht mehr erreichbar (vitogate-200-eib_en.html)

Hier ein paar Bilder der MySQL Tabelleneinträge bzw. Webseiten zur Anzeige.

Die Ablage der abgefragten Daten erfolgt in einer weiteren MySQL Tabelle. Aus dieser kann dann eine Webseite die Werte herauslesen und grafisch darstellen.

Was ist also jetzt nötig ?

1. Datenbank innerhalb mysql anlegen, z.B. mit mySQLAdmin oder über die Kommandozeile:

# mysql -u root -p

dann eine neue Datenbank anlegen:

#mysql> CREATE DATABASE heizung;

dann noch einem Benutzer Zugriffsrechte geben:

mysql> GRANT ALL ON heizung.* TO loguser@localhost;

2. Jetzt die Tabellen anlegen - dies kann man mit dem folgenden SQl-Script erledigen

Hier ist der Downloadlink zu einem SQL-Script zur Anlage der Datenbankstruktur in MySQL (Verwendung auf eigene Gefahr):

 

3. Cronjob anlegen der das folgende Pythonprogramm alle 5 Minuten zyklisch aufruft.

# 0-55/5  * * * * root    cd /var/www;python vito.py >> vito.log

Das Pythonprogram (Python2) zur zyklischen Abfrage und Datenablage in der MySQL Datenbank findet sich hier:

 

Update 2023 für Python3 auf Ubuntu:

Das Pythonprogram (Python3) zur zyklischen Anfrage und Datenablage in der MySQL Datenbank findet sich hier:

 

Man muss aber darauf achten die richtige Schnittstelle USBSerial für den Infrarotempfänger auszuwählen.

Jetzt werden zyklisch alle konfigurierten Labels ausgelesen und in die neue MySQL-Tabelle vito_values eingefügt. Es werden aber nur die Labels abgerufen die in der vito_lables Tabelle auf enable=true stehen.

"Der tut nix"

Hier ein paar Tipps was man macht wenn es nicht gleich funktioniert und was man prüfen kann.

1. Infrarot-Interface

Die Ankopplung an die Sende- und Empfangsdioden ist einigermaßen kritisch wenn man die Schnittstelle als Platine selbstbaut. Das liegt an der hohen Empfindlichkeit der Bauteile die schnell zu einem optischen Kurzschluss führen wenn Sender und Empfänger nicht sorgfältig getrennt sind. Da hat Viessmann meiner Meinung nach das Design über die Funktion gestellt. Warum muss es denn ein V-Stecker sein der die IR-Schnittstelle ankoppelt ?

Was ist denn jetzt überhaupt der Sender und was der Empfänger ?

Im nachfolgenden Bild sieht man die Ansicht von vorn auf die Steuerung. Rechts ist der IR-Sender - links der IR-Empfänger.

Hier ist immer darauf zu achten dass man den Empfänger und Sender ordentlich ankoppelt. Das heisst nicht dass die beiden exakt übereinander oder besonders nahe an der Steuerung sein müssen sondern lediglich: Sie müssen optisch gut voneinander getrennt sein, das übernimmt beim Orginaladapter das V. Ich empfehle kleine Hülsen auf die Adapterplatine zu kleben. Ein kleiner Steg aus Aluminium ist sicher auch ganz gut. Ich habe einfach ein kleines Stück Balsaholz verwendet in das ich Aluminiumröhrchen eingesetzt habe. Wer einen fertigen Adapter von Viessmann verwendet, hat die Probleme natürlich grundsätzlich erstmal nicht.

2. Serielle Schnittstelle

Für einen ersten Test der Hardware reicht eine normale serielle Schnittstelle aus. Hier kann man mit dem auf dieser Seite vorgestellten SUB/TTL Wandler leicht den IR-Adapter anschliessen und bekommt direkt einen USB-Anschluss. Hier sollte man zunächst herausfinden an welcher Schnittstelle des PCs ist denn überhaupt der IR-Wandler zu finden ? 

Nun - man kann einfach ein Terminalprogramm starten und schauen welche COM1...COMx Schnittstellen werden denn überhaupt im System angeboten. Dazu steckt man den Adapter zunächst ab und später wieder an. Durch die automatische Konfiguration des FTDI-Chips aus der Anleitung oben kann man dann - sowohl in Windows als auch in Linux - leicht herausfinden welche neue Schnittstelle hinzugekommen ist.

Ein Terminalprogram z.B. HTerm kann man dann für die weiteren Tests verwenden.  Die Schnittstellenparameter müssen wie folgt eingestellt sein: baudrate=4800,parity=EVEN,stopbits=2,databits=8.

Jetzt sollte man dem Terminalprogram noch beibringen, dass es empfangene Daten als HEX darstellt - nicht als ASCII. Dann sollte zumindest schon mal zyklisch (ca. 1/s) der Hexwert 05h empfangen werden, dann funktioniert die Empfangsrichtung.

Das Terminalprogramm zum Senden auf HEX-Eingabe stellen und mehrfach "16 00 00" senden. Das funktioniert am besten wenn man 4 * hintereinander die Sequenz als Kette: "160000160000160000160000" eintippt und dann alles auf einmal sendet. Die Steuerung antwortet bei korrektem Empfang dann mit dem Wert "06".

Wenn man versucht die 3 Bytes "160000" quasi langsam über das Terminalprogramm einzutippen, dann ist dies für die Steuerung zu langsam und sie antwortet garnicht bzw. sendet einfach weiter die 05. Hier nicht gleich aufgeben -das Login kann durchaus mehrfach nötig sein.

Die Steuerung am Ende wieder durch senden des Wertes "04" in den Defaultmode setzen.

Immer darauf achten das das Terminalprogram KEIN CR oder LF mitsendet, das führt immer zum Misserfolg. Die Kommunikation erfolgt nicht über ASCII-Befehle sondern ausschlieslich im Binärmode.

Sofern die Daten jetzt so langsam in die MySQL Datenbank abgelegt werden, kann man diese natürlich auch auswerten. Hier steht wie das denn geht.