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 ;)
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
Kommentare