Viessmann ohne API – Optolink Splitter (1)

Immer wieder taucht bei community.viessmann.com  und anderen einschlägigen Foren der Wunsch auf, seine Viessmann Geräte ohne die ViCare API zu überwachen und zu steuern. Wie hier schon beschrieben, gibt es inzwischen funktionierende Lösungen, die lokal und direkt – also ohne den Umweg über die Viessmann Server – mit dem Viessmann Gerät kommunizieren.

Eine davon ist der Optolink-Splitter, den Phil, der Viessmann User HerrP, entwickelt hat. Diese Lösung wendet sich an die Betreiber von Viessmann Heizungen etc., welche über die Optolink Schnittstelle und das VitoConnect Kästchen ausgelesen und ferngesteuert werden.

Überblick & Setup

Weil mich die dauernden Ausfälle der Viessmann Server Infrastruktur genervt haben und über die ViCare API auch nicht alle interessanten Werte geliefert werden – oder wenn, dann nur mit Abokosten – habe ich das Ganze mal ausprobiert und meine Erfahrungen hier aufgeschrieben.

Die neueren Geräte der OneBase (3E) Generation können diese Lösung nicht einsetzen. Für diese gibt es aber open3e als lokale Anbindung. Informationen gibt's bei der Viessmann Community und/oder Github.

Das Tolle am Splitter ist, dass er optional zusammen mit VitoConnect funktioniert! Wegen Garantieverlängerung und/oder Anbindung an den Servicebetrieb will man VitoConnect ja oft weiter nutzen.

Im Prinzip wird der Splitter (Raspberry Pi mit Python Skript) zwischen das Optolik Anschlusskabel und das VitoConnect gehängt. Der Splitter empfängt Daten vom Gerät, verarbeitet sie und schickt sie quasi gleichzeitig unverändert weiter an VitoConnect. Für die Senderichtung funktioniert das umgekehrt.

Überblick

Vorteile

Der wesentliche Vorteil ist, dass man sich lokal mit dem Viessmann Gerät  verbinden kann ohne, dass irgendwelche Viessmann Server angesprochen werden müssen. Das ist deutlich betriebssicherer. Viessmann Server sind gerne einmal offline.

Die Abfrage wesentlicher Betriebsparameter kann deutlich schneller bzw. häufiger erfolgen. Aufgrund der limitierten Abrufzahl bei der API habe ich bisher ein Abfrageintervall von 90 Sekunden gehabt, mit Optolink 30 Sekunden. Auch hat Viessmann einige Werte aggregiert und nur in größeren Abständen upgedated – Außentemperatur, Speichertemperatur etc. Das ist nicht immer hilfreich.

Wer sehr viel tiefer einsteigt, kann möglicherweise auch Werte abfragen, die Viessmann sonst nur per kostenpflichtigem Abo anbietet.

Basiswerte lassen sich sehr viel einfacher mit Node-Red verarbeiten, da lediglich ein MQTT- In Node benötigt wird. Heizkurven, Zeitprogramme etc. sind generell schwierig zu verarbeiten, egal, ob mit der API- oder Optolink- Schnittstelle. Das machte ich tatsächlich noch über die App, da ich nur selten etwas daran verstelle.

Nachteile

Zunächst einmal ist der Optolink-Splitter keine Triviallösung. Es wird direkt auf Hexadezimalwerte im  internen Speicher der Steuereinheit (ab VitoControl 200 aufwärts) zugegriffen. Auch war die Optolink Schnittstelle nie dafür gedacht, vom Gerätebetreiber oder Endkunden genutzt zu werden. Es gibt daher so gut wie keine öffentlich zugängliche Dokumentation. Was es gibt, ist noch nicht vollständig und per Reverse-Engineering herausgefunden. In manchen Fällen artet der Umgang damit in ein Such- und Ratespiel aus. Da der Nutzerkreis derzeit überschaubar ist, bekommmt man aber prima Hilfestellung im Diskussionsbereich der github Projektseite.

Es spricht nichts dagegen, die ganze Sache einmal auszuprobieren. Phils Software kann direkt eingesetzt werden ohne Kompilieren oder andere Komplexitäten. Etwas technisches Verständnis, etwas Erfahrung im Umgang mit Linux (Raspberry Pi Command Line Interface via Putty o.ä.), Minimalkenntnisse in Python und dem Nano-Editor oder anderen sind schon nötig. Ferner detektivisches Gespür und Durchhaltevermögen zum Ermitteln der relevanten Datenpunkte für dein Gerät. Leider ist das nicht ganz Plug & Play.

Was man auch beachten sollte: Fällt der Optolink Splitter aus – sei es wegen Fehlkonfiguration der Parameterdatei, einem Systemhänger oder Hardwarefehler – funktioniert weder die ViCare App noch die API. Da ich oft keinen direkten Zugriff auf das Maschinchen habe, hängt der Raspberry Pi an einem Shelly WiFi Stecker, um ihn nach einem Systemabsturz ferngesteuert neu zu starten. Wenn ich nicht vor Ort bin, erfolgt das über einen Reverse SSH Tunnel.

N.B. Ich habe Vor- und Nachteile für mich abgewogen und habe mein Node-Red Viessmann Dashboard komplett auf den Splitter umgebaut.

Schritt für Schritt Anleitung

Die Optolink Splitter Dokumentation auf Github ist gut aber etwas puristisch und für Laien nicht immer leicht nachzuvollziehen. Ich versuche in diesem und zwei weiteren Kapiteln, eine sequentielle (Schritt für Schritt) Anleitung zu formulieren, mit der auch wohlmeinende Amateure zurecht kommen.

Hardware Installation

Ich gehe jetzt einmal davon aus, dass ein Raspberry Pi vorhanden ist. Schließlich haben sich die meisten von euch schon mit der Viessmann API rumgeschlagen und eventuell auch meine Node Red Anleitungen dazu befolgt.

Der Optolink-Splitter belastet den Raspberry Pi nur minimal, kann also locker auch auf dem evtl. vorhandenen "Viessmann API Pi " installiert werden.

Will man VitoConnect weiter nutzen, muss ein kleines, kostengünstiges Zusatzboard (CP2102 TTL-USB Wandler) an die GPIO Leiste des Raspberry Pi angesteckt werden. Gibt's z.B. bei Amazon.

Das Board wird wie folgt mit drei Kabeln an den Raspberry Pi angesteckt:

Einen Überblick über die Anschlüsse der GPIO Leiste gibt's hier. Die Pins 3V3 und +5V des CP2102 bleiben frei und werden nicht mit dem Raspi verbunden.

Wenn kein VitoConnect vorhanden ist – und damit auch kein Optolink Kabel, dann benötigt man zusätzlich die Viessmann Optolink Anschlussleitung, die am Display des VitoControl in das "V" gesteckt wird – Kostenpunkt ca. 60€. Das andere Ende kommt in einen freien USB Anschluss des Raspi.

Die CP2102 Schnittstelle wird entweder direkt in das VitoConnect Kästchen gesteckt oder über ein USB-A Verlängerungskabel damit verbunden

HW Konfiguration

Der Raspberry Pi muss jetzt noch gesagt bekommen, dass die Pins 8 und 10 künftig als serielle Schnittstelle genutzt werden. Dafür auf dem Raspberry Pi mit Putty oder einem andere Terminalprogramm einloggen und  sudo raspi-config eingeben.

Dann auf 3 Interface Options  gehen und dort 6 Serial Port  auswählen. Dann die Frage "Would you like a login shell to be accessible over serial?" mit Nein beantworten und die dann folgende Frage "Would you like the serial port hardware to be enabled?" mit Ja beantworten.

Das war's auch schon, was die Hardwareseite angeht.

SW Installation

Der Vollständigkeit halber beschreibe ich zuerst noch die für den Einsatz des Splitters nötige MQTT Tools, da dies der häufigste Zugangsweg zu den Daten ist. Wer das schon hat und nutzt kann das Kapitel überlesen.

MQTT Tools

Solltet ihr noch keinen MQTT Broker haben, so empfehle ich den Broker Mosquitto. Eine sehr verständliche Anleitung findet ihr im Elektronik-Kompendium. Ich muss für meinen Artikel ja nicht das ganze Internet abschreiben… Der Broker sorgt dafür, dass die Nachrichten (Messwerte), welche der Optolink Splitter erzeugt, später von Node Red oder eurer Hausautomatisierung empfangen werden können.

Allen, die sich mit MQTT noch nicht auskennen, empfehle ich den kostenlosen MQTT Online Videokurs von haus-automatisierung.com – Matthias Kleine hat eine ganze Reihe sehr guter und hochprofessioneller Tutorials zum Thema IoT geschrieben bzw. gedreht. Ich kann ihm dabei mit meinem kleinen Blog kaum das Wasser reichen.

Hat man MQTT installiert, braucht man noch einen MQTT Client zum Testen und Ausprobieren. Ich empfehle den kostenlosen MQTT-Explorer.

Optolink Splitter und Python Libraries

Zunächst einmal ziehen wir uns die Software direkt auf den Raspberry Pi. In unserem Heimatverzeichnis geben wir ein: wget https://github.com/philippoo66/optolink-splitter/archive/refs/heads/main.zip

Das Herunterladen des ZIP Files ist meines Erachtens am einfachsten, da man sich nicht mit "git" herumschlagen muss.

Das Zip File wird mit unzip main.zip entpackt und dadurch in ein Verzeichnis namens optolink geschrieben. Das ZIP File kann anschließend mit rm main.zip  gelöscht werden.

Der Optolink Splitter besteht aus einer Reihe von Python Skripten. Wir müssen aber später  nur die Konfigurationsdatei optolink/settings_ini.py bearbeiten.

Wir benötigen ein möglichst aktuelles Betriebssystem, das wir mit sudo apt update && apt upgrade aktualisieren. Ferner brauchen wir die Python Libraries für MQTT und die serielle Schnittstelle.

Bei neueren Versionen des Raspberry Pi OS kann man die Python Libraries nicht mehr direkt installieren sondern muss das in einer virtuellen Umgebung machen. Ich find's unpraktisch aber Phil sagt, dass die Virtualisierung durchaus hilfreich ist und für stabilere Verhältnisse sorgt.  Installiert man die Libraries einfach so, gibt es eine Fehlermeldung 510 error: externallymanagedenvironment ‐‐ venv

Wie man die zwei Libraries in einer virtuellen Umgebung installiert, hat Phil hier sehr gut beschrieben.

Wenn nach den ersten Tests alles läuft, haltet euch an die dort stehende Anleitung zum Starten des Splitters als Service – wir wollen das Programm ja nicht immer von Hand aufrufen. Zuerst einmal reicht es aber, das Programm von Hand zu starten wenn das folgende Thema abgearbeitet ist.

settings_ini.py

Jetzt müssen wir nochmal Hand anlegen: Das im Splitter angesprochene serielle Device /dev/ttyS0  hat bei neueren Rasperry Pis ein Problem – es kann nur einmal gestartet werden. Um neue Datenpunkte zu definieren , müssen wir später aber die Datei settings_ini.py sehr oft editieren und dann den Optolink-Splitter immer wieder neu mit sudo service optolink-splitter restart starten. Dann ist das Verhalten des tty Devices eher hinderlich – wir müssten nach jeder Änderung den Pi neu booten.

Also wird stattdessen in settings_ini.py das Device /dev/ttyAMA0 in Zeile 13 der Datei settings_ini.py auskommentiert ('#' löschen) und die Zeile 12 mit "#" als Kommentar markiert. "tty" steht übrigens für "Teletype" (Fernschreiber) aus der grauen Vorzeit der Computerei.

Das allein reicht leider noch nicht, denn /dev/ttyAMA0 wird auch von Bluetooth verwendet, das wir deshalb auf den Pis mit Bluetooth Hardware (Raspberry Pi 3 und folgende, Raspberry Pi Zero W und Zero 2 W) deaktivieren müssen. Das geschieht in der Regel wie folgt: In der Datei /boot/firmware/config.txt  wird am Ende dtoverlay=pi3-disable-bt eingetragen. Das pi3 gilt auch für den Raspi 3, Raspi 4 und wahrscheinlich auch für den 5er.
Bei Betriebssystemversionen unterhalb bullseye heißt die Datei /boot/config.txt. Sollte das trotzdem nicht funktionieren, bei Tante Google (oder besser DuckDuckGo) nachfragen: "raspberry pi disable bluetooth".

Sicherheitshalber die datei config.txt kopieren – z.B. so: sudo cp config.txt confitg.txt.backup . Die Datei config.txt gehört zum Eingemachten vom Betriebssystem. Ein Fehler und der Raspberry weigert sich zu starten. In diesem Falle die SD Karte in den PC einlegen und die Datei config.txt wieder zurückkopieren oder ggf. editieren.

Ferner müsst ihr noch im Abschnitt MQTT der Datei Settings_ini.py euren MQTT Server sowie Username und Passwort eintragen. GGf. auch das mqtt_topic (im Original heißt es Vitodens)  und mqtt_cmnd bzw. mqtt_resp ändern.

Erster Test

Nach Aufruf der virtuellen Umgebung mit source myenv/bin/activate können wir den Optolink-Splitter mit  python optolinkvs2_switch.py  starten. Das "Shebang" feht hier im Code, weshalb python davor geschrieben werden muss.

Netterweise hat Phil in die settings_ini.py Konfigdatei schon eine ganze Reihe an Datenpunkten eingetragen, von denen einige sicher auch bei eurem Gerät funktionieren. Somit können wir den Rohbau erst einmal testen.

Dazu starten wir den MQTT-Explorer auf dem PC und stellen – wenn nicht schon geschehen – als erstes den MQTT Server ein.

Name, Host, User und Passwort natürlich auf eure Verhältnisse anpassen. Port ist fast immer 1883.

Hat alles geklappt bekommt ihr einen Screen wie diesen hier:

Für die allerersten Schritte empfehle ich euch, das Youtube Video von Phil anzusehen, wo beschrieben ist, wie man Werte auslesen und ggf auch schreiben kann.

Alles okay? Dann empfehle ich, den Optolink-Splitter als Service aufsetzen.

Im nächsten Kapitel beschreibe ich, wie man sein Gerät identifiziert und die Adressen der Datenpunkte ermittelt.

Habt ihr den Splitter später einmal als Servcice gestartet, könnt ihr den Status wie folgt checken:
sudo service optolink-splitter status

Hier sollte in grün "active (running)" stehen und weiter unten CGroup: /system.slice/optolink-splitter.service

 

 

 

6 Gedanken zu „Viessmann ohne API – Optolink Splitter (1)

  1. Hallo, Vielen Dank für die umfassenden Informationen.
    ich habe einen USB optolink, unter Home Assistant, MQTT, Vconrol, ist schon traffic zu sehen.
    Ich habe den optolink noch nicht an die Heizung gesteckt, habe bedenken ob ich dabei die Programmierung der Heizung durcheinander bringe, Welche Risiken bestehen bei Fehlern?

    1. Hallo,
      Wenn du nur „read“ Befehle verwendest oder nur die Pollings aus der settings_ini.py dann besteht keine Gefahr. Aufpassen solltest du bei „write“ Befehlen. Lieber 3 mal kontrollieren, ob die Adresse stimmt und die Byte Länge.
      VG
      Chris

  2. Hier ist die zusammengefü
    Hallo,

    ich wollte eigentlich eine E-Mail an Phil schreiben, aber bei der Suche bin ich auf deine Adresse gestoßen. Vielleicht kannst du mir ja auch weiterhelfen.

    Am liebsten würde ich den ESP32 verwenden, da ich mich damit bereits auskenne. Es wäre aber wahrscheinlich einfacher, den Raspberry Pi zu nutzen, da dein Programm ja bereits darauf abgestimmt ist. Welches Modell des Raspberry Pi würdest du mir dafür empfehlen?

    Ich könnte mich theoretisch in MQTT einarbeiten, da ich das letztes Jahr schon zwei Monate für ein anderes Projekt gemacht habe. Gesundheitlich ist das momentan jedoch schwierig. Am einfachsten wäre es, die Programmzeilen für das Senden der Daten an ThingSpeak einzufügen, da ich damit bereits vertraut bin. Was denkst du – wäre das machbar?

    Welche Kabel und UART-Schnittstelle benötige ich? Ich gehe davon aus, dass ich eine 5V-Verbindung brauche (nicht 3,3V), wobei die Stromversorgung nur über das Vitoconnect erfolgt und keine direkte 5V an den Raspberry weitergeleitet wird.

    Anbei findest du die E-Mail, die ich ursprünglich an Phil schreiben wollte. Vielleicht hilft dir das als Hintergrundinformation.

    Vielen Dank schon mal und beste Grüße!

    Betreff: Unterstützung bei Temperaturverlauf-Aufzeichnung für Vitoladens 300C mit ESP32

    Vielen Dank für dein tolles Projekt und die Anleitung! Ich möchte aus meiner Vitoladens 300C über den Optolink/Viessmann Vitoconnect 100 möglichst einfach den Temperaturverlauf auslesen.

    Ich habe gesehen, dass es die Möglichkeit gibt, über einen größeren Server mit ioBroker oder einer ähnlichen Lösung zu arbeiten, aber damit kenne ich mich leider nicht aus. Da ich im Rollstuhl sitze und gerade gesundheitlich stark eingeschränkt bin, wäre eine einfache und schnelle Lösung ideal.

    Letztes Jahr habe ich einen ESP32 programmiert, der an ihn angeschlossene Sensoren für Gewicht, Feuchtigkeit und Temperatur ausliest und die Daten über WLAN an ThingSpeak sendet, wo sie gespeichert und grafisch angezeigt werden können (hier ein ähnliches Beispiel: https://gist.github.com/cyrusmeh/2fed550f34a637dca1d52d35f6dff66b). Diese Lösung könnte ich mir auch für meinen Heizungsverlauf vorstellen.

    Optimal wäre, wenn ich den ESP32 direkt am Optolink des Vitoconnect 100 anschließen und weiterhin über einen UART-Adapter den Vitoconnect 100 betreiben könnte. Da ich den Keller nicht selbstständig betreten kann, wäre eine online-basierte Lösung ideal.

    Die ViCare App von Viessmann bot für die Vitoladens 300C bisher keinen zeitlichen Temperaturverlauf, selbst mit ViCare+. Da ich aber meine Heizung genauer beobachten und besser einstellen möchte, ist eine solche Aufzeichnung essenziell. Optimal wäre zudem eine Funktion, um den Ölverbrauch grob anhand des Heizungsbetriebs (z. B. durch Zählung der Betriebsstunden) zu schätzen.

    Weißt du, ob es ein Programm gibt, das ähnlich wie dein Projekt funktioniert und ThingSpeak unterstützt? Alternativ, wie ich mit deiner Lösung eine zeitliche Darstellung der Temperaturdaten erreichen kann?

    Mir ist eine fast fertige Lösung wirklich sehr wichtig, da ich aufgrund meiner gesundheitlichen Situation keine Zeit für umfangreiche Programmierarbeiten habe.

    Vielen Dank für deine Hilfe und viele Grüße!
    Jörg

    1. Hallo Jörg,
      zum Thema ESP als Grundlage für den Splitter gabs schon eine Diskussion bei community.viessmann.com
      Leider sieht das nicht gut aus. Der Portierungsaufwand ist doch recht groß.
      Zu deinen Fragen: MQTT ist relativ easy. Ein Link zu einem Tutorial habe ich in meinem Beitrag.
      Wie auch immer du die Daten weiterverarbeitest, irgendwie muss die Heizung ja abgefragt werden. In der Zeit die du brauchst, bis du das mit ESP32 hinprogrammmiert hast, bist du auch MQTT und Raspberry Profi.
      Als Raspberry Pi reicht ein alter Raspberry 2 oder vielleicht auch ein RaspberryPi Zero.
      Raspberry Pi selbst arbeitet mit 5V, die GPIO Ports mit 3,3V – mehr Spannung zerstört den Pi. Der TTL USB Wandler wird vom Vitocontrol Kästchen über den USB Port mit Spannung versorgt. Keinesfalls die 5V/3V3 Ports mit dem Pi verbinden!
      Es gibt noch die Alternative über die ViCare API die Temperaturverläufe deiner Vitoladens zu erfassen und auszuwerten. Dafür müsstest du dich aber in Node-Red einarbeiten – ist aber auch keine Atomphysik. Wie man die API mit Node-Red nutzt habe ich hier schon vor einiger Zeit beschrieben. Node-Red hat auch fertige Schnittstellen zu ThingSpeak.
      Vielleicht hilft dir das ja.
      Freundliche Grüße und viel Spaß beim Basteln.
      Chris

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert