wie schon vor einiger Zeit angekündigt, habe ich meine Viessmann-Heizung mit Hilfe des Optolink-Splitters in meine Hausautomation integriert.
Ich möchte die Integration hier beschreiben. Dabei werde ich nicht auf alle Details eingehen, sondern nur auf die spezifischen Aspekte meines Projekts.
Ausgangslage:
Viessmann Vitodens mit Vitotronic und Vitoconnect, Baujahr 2011, aufgestellt im Heizungsraum, zu weit entfernt vom Timberwolf Server für eine direkte USB-Verbindung.
vcontrold auf dem Timberwolf, in Portainer, schied daher aus.
Über die Viessmann-Community bin ich auf den Optolink-Splitter von Phil aufmerksam geworden: https://github.com/philippoo66/optolink-splitter.
Dieser Splitter hat zudem den Vorteil, dass die Vitoconnect parallel weiterbetrieben werden kann, zum Beispiel als Backup.
Der Optolink-Splitter läuft bei mir auf einem Raspberry Pi in der Nähe der Heizung und ist per LAN mit dem Heimnetz verbunden.
Für das Aufsetzen des Raspberry Pi verweise ich auf die umfangreiche Literatur im Internet. Für die grundsätzliche Einrichtung des Optolink-Splitters gibt es neben der Github-Seite und dem Youtube-Video von Phil noch die Seite https://www.rustimation.eu/index.php/vi ... splitter-1.
Hardware:
1. Vitodens 200-W mit Vitotronic
2. Vitoconnect 100 mit Optolink-Kabel
3. Raspberry Pi 3B+ (reicht locker aus für das schlanke Projekt; Vorteil: geringerer Stromverbrauch als neuere Modelle)
4. microSD-Karte (SanDisk High Endurance)
5. Gehäuse und Spannungsversorgung
6. CP2102 USB zu TTL Konverter (https://www.amazon.de/dp/B089QJZ51Z?ref ... title&th=1)
7. USB-A-Verlängerung (Stecker zu Buchse)
Vorgehensweise:
1. Raspberry Pi mit Raspian aufsetzen
2. Nutzer einrichten
3. Schnittstellen einrichten wie im Optolink-Splitter-Wiki beschrieben, Bluetooth und WLAN deaktivieren
4. USB-TTL-Konverter anschließen
5. Optolink-Splitter klonen und einrichten (Details siehe unten)
6. Optolink-Splitter als Service einrichten und starten
7. Optolink-Kabel von der Heizung an einen USB-Port des Raspberry Pi anschließen
8. Vitoconnect mit dem USB-TTL-Konverter verbinden mittels USB-A-Verlängerung
9. Raspian aktualisieren, falls nötig
Konfiguration:
Für die Konfiguration verwende ich WinSCP, um komfortabel auf die Textdateien auf dem Raspberry Pi zugreifen zu können.
Die Konfiguration ist natürlich abhängig von der eigenen Installation. Hier sind ein paar Beispiele für Einstellungen, die ich in der settings_ini.py vorgenommen habe:
- port_vitoconnect = '/dev/ttyAMA0' (weil älteres Pi-Modell)
- mqtt = "192.168.xxx.xxx:1883" (IP-Adresse meines Timberwolf Servers, darauf läuft Mosquitto2 als MQTT-Broker in Portainer)
- mqtt_user = "user:password" (falls der MQTT-Broker so konfiguiert ist, dass er keine anonymen Verbindungen zulässt)
- mqtt_topic = "vitodens" (Geschmackssache

- mqtt_listen = "vitodens/cmd" (ebenfalls Geschmackssache

- mqtt_retain = False
- show_opto_rx = False (damit keine sinnlosen Daten auf die SD-Karte geschrieben werden)
- data_hex_format = '02X' (Geschmackssache

- resp_addr_format = '04X' (vereinfacht die Auswertung von Antworten)
- poll_interval = 1
Ich habe eine separate Polling-Liste erstellt, finde ich übersichtlicher, als die Daten in die settings_ini.py zu schreiben. Sobald im Verzeichnis des Optolink-Splitters eine Datei namens poll_list.py gefunden wird, wird diese anstelle der Einträge in der settings_ini.py verwendet.
Meine Polling-Liste habe ich als Beispiel beigefügt. Diese ist natürlich in hohem Maße abhängig von der Viessmann-Anlage - und von den Parametern, für die man sich interessiert.
Datenpunkt-Adressen der eigenen Viessmann-Anlage findet man in einem weiteren Projekt von Phil auf Github: https://github.com/philippoo66/ViessData21.
Es ist etwas mühselig, den Typ der eigenen Anlage und dann die entsprechenden Adressen herauszufinden (selbst wenn man die Adresse kennt, können Länge und Umrechungsfaktor manchmal nur durch Ausprobieren gefunden werden. Die - halboffizielle - Dokumentation von Viessmann, die in verschiedenen Foren und der Viessmann-Community zu finden ist, stimmt leider nicht immer). Wenn man einen Zugang zu Vitoguide hat, dann findet man den Anlagencode auch dort (in meinem Fall: VScotHO1_40).
Aber nach einigem Ausprobieren kommt man in der Regel zu ganz guten Ergebnissen.
Für eine erste Ergebniskontrolle, welche Werte vom Optolink-Splitter an MQTT gesendet werden, empfiehlt sich der MQTT Explorer. Damit kann man auch Lese- und Schreibbefehle schicken, um Adressen zu testen und Parameter zu ändern.
Die Syntax für Lese- und Schreibbefehle könnt ihr dem Wiki des Optolink-Splitters entnehmen: https://github.com/philippoo66/optolink ... and-Syntax
Das Ergebnis für meine Heizung sieht im MQTT Explorer dann so aus:

Bitte zwei Dinge beachten:
- Obwohl laut MQTT-Spezifikation theoretisch möglich, mag der Optolink-Splitter keine Umlaute und kein ß in Topics
- Nach jeder Änderung von settings_ini.py oder poll_list.py muss der Optolink-Splitter-Service neu gestartet werden, damit die Änderungen wirksam werden.
Einrichtung auf dem Timberwolf Server:
Nachdem das soweit läuft, habe ich auf dem Timberwolf Server ein neues MQTT-Gerät angelegt und dort die einzelnen Werte jeweils als eigenes App Level Topic:

Eine Temperatur z. B. als Float:

Alle interessanten Werte schreibe ich in Zeitreihen, um diese in Grafana detailliert auswerten zu können.
In der poll_list.py kann man für jeden Parameter angeben, wie oft er gepollt werden soll. In der settings_ini.py habe ich als Grundintervall eine Sekunden eingetragen (poll_interval = 1), die Angaben in der Polling-Liste sind jeweils Vielfache des Grundintervalls, z. B.
Code: Alles auswählen
(60, "Kesseltemperatur", 0x0810, 2, 0.1, False),
Einige Parameter frage ich (derzeit) recht häufig ab. Ob das von Nutzen ist, werde ich später durch die Auswertung herausfinden und die Intervalle dann ggf. vergößern.
Allerdings schreibe ich nicht alle Parameter mit den kurzen Intervallen direkt in Zeitreihen, damit diese nicht zu groß werden. Leider gibt es im MQTT-Subystem noch keinen Sendefilter wie z. B. für 1-Wire, aber den kann man sich mit einer Logik ja schnell selbst erstellen.
Alle hochfrequenten Anfragen gehen bei mir über einen solchen Sendefilter in die entsprechende Zeitreihe:

Die Logik wird bei Änderung des Eingangswertes ausgelöst und zusätzliche alle 43.200 s (= alle zwölf Stunden) über einen Trigger. Der Ausgang wird bei Änderung und Triggerung beschrieben, dann direkt in die entsprechende Zeitreihe.
Der Trigger hat den Vorteil, damit auch Werte, die sich über Tage nicht ändern, von Zeit zu Zeit in die Zeitreihe geschrieben werden, um in Grafana oder in Visu-Widgets keine leeren Graphen zu haben.
Ein Beispiel für eine Auswertung in Grafana sehr ihr hier:

Ich schreibe übrigens auch die Topics "/cmd" und "/resp" in Zeitreihen, um auch später noch nachvollziehen zu können, was hier so los war. Das wird interessant, wenn man über die Visu (oder andere TWS-Objekte, z. B. KNX) Befehle an die Heizung schicken möchte.
Befehle und Visu dazu stelle ich in einem zweiten Teil vor.
Ich hoffe, das Vorgehen ist hinreichend detailliert beschrieben und es gibt hier noch den einen oder anderen mit einer Viessmann-Heizung, der den Optolink-Splitter gebrauchen kann.
Viele Grüße
Falk