Für meine Viessmann Vitodens 200 wollte ich schon länger eine lokale Integration in Homeassistant aufbauen - ohne Cloud und möglichst ohne zusätzliche Systeme. Bei meiner Recherche bin ich immer wieder auf Lösungen mit selbstgebauten Optolink-Leseköpfen, Raspberry Pi, vcontrold, MQTT und weiterer Middleware gestoßen. Das funktioniert zwar, war aber nicht das, was ich gesucht habe. Irgendwann kam dann die einfache Frage auf:

Warum eigentlich einen eigenen Optolink-Lesekopf bauen, wenn Viessmann bereits ein originales USB-Optolink-Kabel anbietet?

Mit dem ESP32-S3 gibt es inzwischen USB-Host-Unterstützung. Also müsste es doch eigentlich möglich sein, das Originalkabel direkt an einen ESP32 anzuschließen und alles mit ESPHome zu erledigen. Gesagt, getan ;)

Verwendete Komponenten

Umsetzung

Der eigentliche Knackpunkt war die USB-Kommunikation. Das originale Viessmann-Kabel verwendet einen CP210x-USB-UART-Adapter. Nachdem die passenden UART-Parameter gefunden waren (8 Datenbits, Even Parity, 2 Stopbits), lief die Kommunikation auf Anhieb stabil. Als Basis kam hierbei die bestehende esphome_vitoconnect Komponente zum Einsatz, die sich anschließend direkt und ohne Änderungen am Quellcode verwenden ließ. Nach wenigen Minuten standen die ersten Werte direkt in Homeassistant zur Verfügung:

  • Temperatur (Außen)
  • Temperatur (Kessel)
  • Temperatur (Warmwasser)
  • Solltemperatur (Heizung)
  • Solltemperatur (Warmwasser)
  • Brennerstatus bzw. Brennermodulation
  • Betriebsart
  • Störung

Für einen ersten Test hätte ich ehrlich gesagt nicht mit einem so guten Ergebnis gerechnet. Genau das war aber die Idee des Projekts: Keine Bastellösung mit eigenem Lesekopf, sondern die vorhandene Viessmann-Hardware weiterverwenden.

Fazit

Der eigentliche Meilenstein ist für mich nicht die Anzahl der ausgelesenen Register, sondern der Nachweis, dass das originale Viessmann USB-Optolink-Kabel direkt an einem ESP32-S3 mit USB-Host betrieben werden kann und sich die Heizung vollständig lokal über ESPHome auslesen lässt. Damit entfällt je nach Anwendungsfall der Raspberry Pi ebenso wie zusätzliche Middleware oder ein selbstgebauter Optolink-Lesekopf.

Im nächsten Schritt möchte ich auf dieser Grundlage eine eigene ESPHome-Komponente entwickeln, die die Register automatisch aus den OpenV-Definitionen ableitet und dadurch ganz ohne manuelle Registeradressen auskommt.

Bis dahin zeigt dieses Projekt, dass sich eine Viessmann Vitodens bereits heute mit dem originalen USB-Optolink-Kabel direkt an einem ESP32 und vollständig lokal in Homeassistant betreiben lässt.

Konfiguration

esphome:
  name: heizung
  friendly_name: Heizung

esp32:
  variant: esp32s3
  framework:
    type: esp-idf

ethernet:
  type: W5500
  mosi_pin: GPIO11
  miso_pin: GPIO12
  clk_pin: GPIO13
  cs_pin: GPIO14
  reset_pin: GPIO9
  interrupt_pin: GPIO10

external_components:
  - source: github://dannerph/esphome_vitoconnect

usb_host:

usb_uart:
  - type: cp210x
    channels:
      - id: uart_vitoconnect
        baud_rate: 4800
        data_bits: 8
        parity: EVEN
        stop_bits: 2

vitoconnect:
  uart_id: uart_vitoconnect
  protocol: P300
  update_interval: 30s

sensor:
  - platform: vitoconnect
    name: "Temperatur (Außen)"
    address: 0x0800
    length: 2
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: vitoconnect
    name: "Temperatur (Kessel)"
    address: 0x0802
    length: 2
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: vitoconnect
    name: "Brennerstatus"
    address: 0x55D3
    length: 1
    unit_of_measurement: "%"
    accuracy_decimals: 0