openv icon indicating copy to clipboard operation
openv copied to clipboard

VitoConnect 100 mit Raspberry PI als Proxy

Open muu55 opened this issue 6 years ago • 50 comments

Meine neue Heizung (Vitodens-222 F) kann ich mittels der ViCare App "fernbedienen", leider ist der Funktionsumfang dieser App, na sagen wir mal, "begrenzt". Das schreit nach einer Verbesserung, wobei ich die wesentlichen Komponenten ja bereits habe und auch in ihrer bisherigen Funktion erhalten möchte.

Am schönsten wäre natürlich, ich könnte mich auf der VitoConnect anloggen und direkt (also ohne das Internet) meine Heizung abfragen und steuern. Das wüde den Nutzen so einer Box erheblich steigern, ist vom Hersteller aber wohl nicht vorgesehen (?). Also hab ich mir etwas ausgedacht.

Benötigte Bauteile: Eine Viessman Heizumg mit VitoConnect 100 Typ OPTO1, ein Raspberry PI Zero WH und ein CP2102 USB-Seriell Adapter.

Um sowohl zu verstehen, was die VitoConnect 100 mit meiner Heizung redet, als auch eigene Kommandos zu senden, habe ich zwischen das original OPTO-Link Kabel und die VitoConnect 100 einen Raspberry PI Zero gehängt, den ich um einen CP2102 USB-Seriell-Adapter erweitert habe.

Das Optolink Kabel verbinde ich über ein "USB-A Buchse auf Micro-USB Stecker"-Kabel mit der USB-Buchse vom PI-Zero. Den CP2102 Adapter verbinde ich über drei Leitung (GND, Tx, Rx) mit dem seriellen Port des PI Zero auf der GPIO Pinleiste und auf der USB-Seite mit der Vitoconnect 100. Fertig ist die Hardware. Dazu noch ein kleines Programm, das die beiden seriellen Schnitstellen miteinander verbindet und die Daten beim Durchreichen mitprotokolliert. Schon hat man einen einfachen Proxy mit man-in-the-middle Option.

Erste Erkenntnis: Die VitoConnect 100 redet ununterbrochen mit der Heizung. Also nicht nur, wenn ich mit der ViCare App eine Verbindung aufbaue oder etwas abfrage. Offenbar wird dabei das Protokoll 300 (bzw. eine erweiterte Variante) verwendet.

Ich sammle erstmal noch Daten. Sobald ich mehr davon verstehe, versuche ich auch eigene Kommandos auszuführen. Wer so einen Proxy nachbauen will oder wem diese kurze Beschreibung nicht konkret genug war, bitte einfach melden.

muu55 avatar Oct 05 '18 14:10 muu55

Zum Thema Mitschneiden des Datenverkehrs der vitoconnect 100 s.a. Bauanleitung USB_Duo Sniffer. Dort ist eine alternative Hardware dafür beschrieben und es sind ein paar daraus gewonnene Erkenntnisse beschrieben.

GolterU avatar Oct 05 '18 19:10 GolterU

Ja, diese Bauanleitung habe ich gesehen und gelesen, da hatte ich meine Hardware schon fertig. Schaue ich mein Logfile an, kann ich die dort berichteten Ergebnisse bestätigen. Wenn ich die Verbindung zwischen VitoConnect100 und der Heizung im Proxy abschalte, dann "pingt" die Vitoconnect nach der Heizung mit 0x04 0x16 0x00 0x00. Dauert die Auszeit nicht zu lang, dann findet die VitoConnect die Heizung wieder und plappert erneut drauf los.

muu55 avatar Oct 05 '18 19:10 muu55

Ich schau mal, ob ich das vcontrold auf dem PI an meinen Proxy "anflanschen" kann. Sobald das klappt, poste ich wie es geht.

muu55 avatar Oct 05 '18 19:10 muu55

Hallo muu55,

ich habe einen ähnlichen Aufbau mit meinem Raspi3 versucht:

  • Optolink-Kabel an /ttyUSB0
  • USB-UART-Adapter1 an /ttyUSB1
  • VitoConnect mit zweitem USB-UART-Adapter2
  • die beiden USB-UARTs mit GND und gekreuzten TX und RX verbunden

Mit python ein paar zeilen Code geschrieben:

  • beide serielle Schnittstellen werden mit ( 4800, 8, 2, E) geöffnet
  • in zwei Threads wird jeweils die eine Schnittstelle gelesen und die Daten an die andere gesendet

Bisher kann ich sehen, dass vom Optrolink periodisch 0x05 geschickt wird, was auch an den VitoConnect rausgeht - dieser reagiert aber garnicht (sendet auch nichts von sich aus ...)

Habe ich etwas vergesen? Hast Du vielleicht eine Idee oder Dein Beispiel-Code?

P.S.: Losgelöst von diesem Versuch funktioniert die ViCare-App und ich kann auch einige Daten manuell auslesen.

DivisionDurchNull avatar Oct 07 '18 16:10 DivisionDurchNull

Also ich vermute, die VitoConnect erwartet an ihrem USB-Port einen USB-Seriell Adapter mit CP210x Chip, der dieselbe Vendor:Chip ID wie das Optolink-Kabel hat. Also z.B. die in Uwes Bauanleitung aufgeführten "CJMCU CP2102 MICRO USB to UART TTL Module 6 Pin serial Converter". Genau so einen habe ich auch benutzt.

muu55 avatar Oct 07 '18 19:10 muu55

Das kleine C-Programm findet sich hier: https://github.com/muu55/vitolog.git

muu55 avatar Oct 07 '18 19:10 muu55

Hier die Addressen+Länge, die von "meiner" VitoConnect100 laufend abgefragt werden:

00 F0 02
00 F8 01 00 F8 08 GWG_SystemIdent 00 F9 01 GWG_Kennung 00 FA 01 WPR_Hardware_Index 00 FB 01 SystemIdent_SW1 00 FC 01 WPR_Protokollversion_LDAP 00 FD 01 WPR_Protokollversion_RDAP 00 FE 01 WPR_Software_Version_Byte1 00 FF 01 WPR_Software_Version_Byte2

08 10 04 TiefpassTemperaturwert_KTS 08 3A 01 TemperaturFehler_ATS 08 3B 02 TemperaturFehler_KTS 08 8E 08 Uhrzeit 08 96 06 TiefpassTemperatur_RTS_A1M1 08 9C 03 NRF_TemperaturFehler_RTS_M1

20 00 30 WPR_HK1_Normaltemperatur 20 30 08 Durchfluss 21 00 30 21 30 08 mBusNRZ012130Stichtag02 22 00 30 22 30 08 23 06 2C BedienRTSolltemperaturA1M1 23 09 19 FerienBeginnA1M1 25 00 16 HK_RaumsolltemperaturaktuellA1M1 25 35 15 HK_FerienbetriebA1M1 27 D3 02 KD3_KonfiNeigungA1 29 00 02 Vorlauftemperatur 29 04 01 Vorlauftemperaturstatus 30 00 30 WPR_HK2_Normaltemperatur 30 30 08 31 00 30 31 30 08 32 00 30 32 30 08 33 06 2C BedienRTSolltemperaturM2 33 09 19 FerienBeginnM2 35 00 36 HK_AktuelleBetriebsartM2 35 49 01 ExtBetriebsartenumschaltung_M2 37 D3 02 KD3_KonfiNeigungM2D 39 00 02 VorlauftemperaturM2 39 04 01 Status_2_M2 40 00 30 WPR_HK3_Normaltemperatur 40 30 08 41 00 30 41 30 08 42 00 30 42 30 08 43 06 2C BedienRTSolltemperaturM3 43 09 10 FerienBeginnM3 45 00 16 45 35 01 45 49 01 47 D3 02 49 00 02 49 04 01 Status_2_M3 55 25 02 TiefpassTemperaturwert_ATS 55 D3 09 GWG_Flamme 57 21 03 K21_KonfiBetriebsstdBrenner_Wartung 57 24 01 K24_KonfiStatusWartung 57 38 01 K38_KonfiFehlerByteGFA 63 00 01 Bedien_WW_Solltemperatur 75 07 36 Fehlerhistorie 75 3D 24 75 61 0A 75 6C 08 LetzteIntervallWartung 77 00 01 77 7F 01 F0 00 20

muu55 avatar Oct 07 '18 20:10 muu55

Danke für den Hinweis. Ich habe 3 verschiedene USB-UARTs ... leider alle mit einem PL2303-Chip :( Mal sehen wann die Bestellung vom CP2102 eintrudelt (gab genau 1 Angebot aus DE auf ebay ...). Dann setze ich mich wieder dran ...

DivisionDurchNull avatar Oct 07 '18 20:10 DivisionDurchNull

Hast du @muu55 eine Möglichkeit, die Kommunikation der VitoConnect mit dem Viessmann-Server mitzuschneiden (z.B. mitmproxy? Ggf. liesse sich das API des Viessmann-Servers dann zu weiteren Erkenntnisgewinnen über Featuresets/Adressen/EventTypes anderer Anlagen nutzen. Die XML-Dateien der VitoSoft-Demo sind zwar schon sehr umfassend, allerdings auch relativ alt und nicht fehlerfrei.

Kannst du in den Logs Kommunikation finden, die nicht ReadData/0x01/Virtual_Read oder WriteData/0x02/Virtual_Write, sondern z.B. Funktion Calls/0x07/Remote_Procedure_Call sind? (wg. Ergänzung der Dokumentation von Protokoll 300)


Falls du die XML-Dateien der VitoSoft mal angeschaut hast:

Es gibt EventTypes mit der gleichen Adresse, aber unterschiedlicher BytePosition (quasi Offset). Kannst du erkennen, ob der Zugriff dann auf Adresse+BytePosition in ByteLength Länge stattfindet oder ob die Adresse in voller BlockLength abgefragt wird? Und wie sieht das beim Schreiben von EventTypes aus, die eine BitLength > 0 haben? Hintergrund ist der, dass ich zunächst dachte, der Adressraum wäre linear und direkt adressierbar (was z.B. 0x00F8 ff. nahelegt), bis ich dann herausbekommen habe, dass das nicht so ist (konkret war das bei der Fehlerhistorie, die ich mal nicht in Vielfachen von (BlockLength/BlockFactor) ausgelesen hatte).

speters avatar Oct 08 '18 07:10 speters

Ich habe längere Zeit die Daten mit dem Sniffer aufgezeichnet, die Vitoconnect mit der Heizung (also auf der seriellen Ebene) austauscht. Zum Viessmann-Server sollte er dann wohl nichts anderes schicken können, als er von der Heizung geliefert bekommt. Auszug siehe Excel-Datei hier. In dieser Datei Vitoconnect-Output.zip sind noch mehr Daten gespeichert, z.T. mit grafischer Auswertung, um 'rauszufinden, wann und wie häufig die Adressen abgefragt werden. Darin sieht man zwar die zyklischen Abfragen, aber auch, dass die Abfragen variiert werden und sich nicht 100% gleichartig wiederholen.

Was den beschriebenen Adressraum anbelangt: Ich glaube jetzt, dass die Adressen eher als Befehle zu verstehen sind, die die Heizungssteuerung mit unterschiedlich langen Datensätzen beantwortet. Damit werden nicht einfach Speicherplätze im Bereich von 0x0000 bis 0xFFFF adressiert und das dort gespeicherte Byte zurückgegeben. Beispiel: Die Abfrage der Adresse 0x2500 (Status Heizkreis A1M1) mit

41 05 00 41 25 00 16 81

liefert

xx xx xx xx xx xx xx 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 xx
41 1B 01 41 25 00 16 02 02 53 25 04 00 47 01 01 00 00 01 C8 00 00 00 00 47 01 00 C8 00 3A

Im Antwortdatensatz mit 22 Byte Nutzdaten stecken laut "ecnEventType.xml" (aus der Vitosoft-Demo) an der Byteposition 1 (wird ab 0 gezählt) mit Länge 1 der Heizungsstatus als Integer, ab Pos. 2 mit 4 Byte Länge der Aufheiztimer als Double in Sekunden, ab Pos. 6 mit 2 Byte Länge die Vorlauf-Solltemperatur als Double (hier 32,7°C, Berechnung wie hier), an Pos. 8 mit 1 Byte Länge der Heizkreisfreigabe-Status als Integer, an Pos. 10 mit 1 Byte Länge der Status der Heizkreispumpe als Integer, an Pos. 11 mit 1 Byte Länge die RSWS-Betriebsart (was immer das ist) als Integer, ab Pos. 12 mit 2 Byte Länge die Raumsolltemperatur als Double (hier 20°C), an Pos. 16 mit 1 Byte Länge der Zustand Frostgefahr.

Was mich irritiert: An der gleichen Adresse kann auch ein Datensatz mit 17 Byte Datensatzlänge abgefragt werden kann. Laut der obigen XML-Datei sind dann andere Daten unter den genannten Bytepositionen/Offsets verfügbar. Z.B. an Pos. 2 steht anstelle "HK_AufheiztimerA1M1" der Wert von "NRF_HK_VT_Solltemperatur_A1M1".

GolterU avatar Oct 08 '18 13:10 GolterU

Danke für dein Log. Habe gerade erst gesehen, dass da ja ganze 19 Sheets mit Daten drin sind.

Im 4. Byte der Antwort wo der klassischen P300 Protokolldefinition nach nur 0x01, 0x02, 0x07 vorkommen dürfte, sind Bits 7,6,5 offenbar als Zähler (0..7) verwendet worden (da kann man sich Anwendungsmöglichkeiten ausdenken: Erkennung fehlender Pakete, Zuordnen von Anfragen zu Antworten, ...). Den Daten nach hast Du eine Systemkennung 0x20CB0009. Also 20CB Hardwarereindex 0, Softwarereindex 9. Bei meiner 0x20CB000B (ähnlich, nur Softwarerevision 11) kann ich diese Zählersache nicht beobachten.

Hast du ein Log, wo die Anfragen der Vitoconnect auch auftauchen? Ein wenig stutzig macht mich die Logzeile 06 | 41 | 06 | 03 | 21 | 00 | F0 | 01 | 01 | 1C Was für eine Anfrage produziert diesen Fehler? Die Adresse 0x00F0 (ecnsysDeviceIdentF0) und die Länge 1 müsste doch valide sein.

PS: Ich kann auf die Schnelle nix sehen, aber hast du irgendwo geloggt, wie die Fehlerhistorie und die Fehlerhistorie des Feuerungsautomaten gelöscht werden?

speters avatar Oct 08 '18 18:10 speters

Danke für dein Log. Habe gerade erst gesehen, dass da ja ganze 19 Sheets mit Daten drin sind.

Hallo Sönke, die Logs in den ersten Blättern obiger Datei sind während der Zeit entstanden, als ich mir den USB-Sniffer ausdachte. Am Anfang war die Hardware so, dass nur die Antwortdaten der Heizungsregelung an die Vitoconnect aufgezeichnet wurden. Die Erläuterungen und Kommentare auf den einzelnen Blättern sind wahrscheinlich auch nicht sehr aufschlussreich. Es war halt nicht zur Veröffentlichung gedacht. Ab Tabellenblatt T8 sind auch Sendedaten enthalten. Jetzt (so auch hier) ist standardmäßig der Datenverkehr in beiden Richtungen gespeichert.

Im 4. Byte der Antwort wo der klassischen P300 Protokolldefinition nach nur 0x01, 0x02, 0x07 vorkommen dürfte, sind Bits 7,6,5 offenbar als Zähler (0..7) verwendet worden (da kann man sich Anwendungsmöglichkeiten ausdenken: Erkennung fehlender Pakete, Zuordnen von Anfragen zu Antworten, ...). Den Daten nach hast Du eine Systemkennung 0x20CB0009. Also 20CB Hardwarereindex 0, Softwarereindex 9. Bei meiner 0x20CB000B (ähnlich, nur Softwarerevision 11) kann ich diese Zählersache nicht beobachten. Hast du ein Log, wo die Anfragen der Vitoconnect auch auftauchen?

Meine Vermutungen zu diesen drei ominösen Bits (und was mir sonst noch so aufgefallen ist) hatte ich hier geschildert. Da die drei Bits schon in den Anfragen an die Heizung hin und wieder als gesetzt auftauchen, kann es eigentlich nicht mit dem Softwarestand der Regelung zusammenhängen. Die scheint in ihren Antworten dieses Byte einfach aus der Anfrage zu wiederholen. Logs dazu siehe ebenfalls hier. Eine Systematik bezüglich der Werte dieser drei Bits habe ich bislang nicht erkannt.

Ein wenig stutzig macht mich die Logzeile 06 | 41 | 06 | 03 | 21 | 00 | F0 | 01 | 01 | 1C Was für eine Anfrage produziert diesen Fehler? Die Adresse 0x00F0 (ecnsysDeviceIdentF0) und die Länge 1 müsste doch valide sein.

Die Adresse 0x00F0 erscheint in der "ecnDataPointType.xml" (aus der Vitosoft-Demo) nicht, jedenfalls nicht unter Device-ID "VScotHO1_4" - die hier zutreffen sollte. In der "ecnEventType.xml" (auch aus der Vitosoft-Demo) steht sie mit der Bezeichnung "KBUS_V300_T03_VirtKanal_07" und der Länge von zwei Byte. Ich vermute, Du hast die Zeile aus dem Blatt T1 der "Vitoconnect-Output.xlsm". Dort hatte ich einfach mal den Beginn des Datenverkehrs zwischen Vitoconnect und Heizung aufgezeichnet, allerdings wie gesagt, nur die Antwortdaten. Warum Vitoconnect die Adresse benutzt, bevor der Typ der Steuerung abgefragt wird, erschließt sich mir nicht. Jedenfalls ist die Adresse 0x00F0 bei mir ungültig. Ich hatte mal die Heizung mit Hilfe des Programms "Vies-sion" mit allen Adressen 0...0xFFFF traktiert, dabei gibt es bei 0x00F0 auch einen Fehler. Wenn es Dich interessiert, kann ich nochmal ein Log vom Startvorgang der Vitoconnect erzeugen, diesmal mit den Daten aus beiden Richtungen.

PS: Ich kann auf die Schnelle nix sehen, aber hast du irgendwo geloggt, wie die Fehlerhistorie und die Fehlerhistorie des Feuerungsautomaten gelöscht werden?

Bislang habe ich nur ganz wenige Schreibvorgänge manuell ausgelöst und mitgeloggt. Die Fehlerhistorie (an 0x7507) habe ich nicht angefasst. Da dieser Datenpunkt als read/write ausgewiesen ist, kann man den Inhalt evtl. einfach auf Null setzen??

Gruß Uwe aka Golter

GolterU avatar Oct 08 '18 20:10 GolterU

Mein Programm schreibt die Kommunikation zwischen Heizung und VitoConnect100 nach stdout. Hier das Log der letzten Tage: vito100.log.gz Entpackt sind das 112 MB, die Datei enthält 987817 Frage/Antwort Pärchen.

Die Zeilen mit 0: kommen von der VitoConnect100, die Zeilen mit 1: von der Heizung. Am Anfang sieht man wie sich die Geräte finden und danach beginnt das endlose Frage/Antwort-Spiel.

0: 04 1: 06 05 0: 16 00 00 1: 06 0: 41 05 00 81 00 F0 02 78 1: 06 41 07 01 81 00 F0 02 0B 00 86 0: 41 05 00 A1 00 F8 08 A6 1: 06 41 0D 01 A1 00 F8 08 20 CB 28 CB 00 00 01 0A 98 0: 41 05 00 C1 49 04 01 14 1: 06 41 06 01 C1 49 04 01 06 1C 0: 41 05 00 E1 39 04 01 24 1: 06 41 06 01 E1 39 04 01 06 2C 0: 41 05 00 01 29 04 01 34 1: 06 41 06 01 01 29 04 01 00 36 ...

Um die Kommunikation von der VitoConnect nach Hause (Viessmann Server) zu analysieren, müsste ich erst noch den Network Setup um die Box herum etwas umbauen.

muu55 avatar Oct 09 '18 02:10 muu55

  • Optolink-Kabel an /ttyUSB0
  • USB-UART-Adapter1 an /ttyUSB1
  • VitoConnect mit zweitem USB-UART-Adapter2
  • die beiden USB-UARTs mit GND und gekreuzten TX und RX verbunden

Mit python ein paar zeilen Code geschrieben:

  • beide serielle Schnittstellen werden mit ( 4800, 8, 2, E) geöffnet
  • in zwei Threads wird jeweils die eine Schnittstelle gelesen und die Daten an die andere gesendet

Könntest du den Python-Code sharen? Ich habe einen ähnlichen Aufbau vor, es geht erstmal nur darum die Daten mitzulesen. In meinem Fall ein Pellet-Kessel (Vitoligno 300-C), bei dem es nützlich wäre einige Werte zu erfassen (Anzahl Zündvorgänge, Brenndauer, Pelletverbrauch,...). Leider bietet die App nichts davon an, ich vermute aber das das Vitoconnect die Werte ausliest. Ziel wäre es, dieses auf dem Raspi abzuzweigen und separat wegzuschreiben (z.B. Grafana).

hendrikland avatar Dec 13 '18 13:12 hendrikland

Hallo hendrikland,

hier mein Beispiel. Aufruf ist dann z.B. python3 "programm.py" > "logfile"

Und es ist ein UART mit dem Chip CP2102 notwendig (PL2303 geht definitiv nicht) .


#!/usr/bin/python
#!/usr/bin/env python
import serial
import time
import threading

__ready  = b'\x05'

serv = serial.Serial("/dev/ttyUSB1",
                     baudrate=4800,
                     parity=serial.PARITY_EVEN,
                     stopbits=serial.STOPBITS_TWO,
                     bytesize=serial.EIGHTBITS,
                     timeout=0.3)

sero = serial.Serial("/dev/ttyUSB0",
                     baudrate=4800,
                     parity=serial.PARITY_EVEN,
                     stopbits=serial.STOPBITS_TWO,
                     bytesize=serial.EIGHTBITS,
                     timeout=0.3)

def serial_read(s,t, info):
    while True:
        msg = s.read(24)
        if msg:
            start_time = time.strftime("%d.%m.%Y %H:%M:%S")
            print(info,  end="")
            print(start_time, end="")
            print(" ", end="")
            for c in msg:
                print("%02x " % c, end="")
            print()
 
            t.write(msg)

#serial_read(sero, serv)

thread1 = threading.Thread(target=serial_read, args=(serv, sero, 'S ',),)
thread2 = threading.Thread(target=serial_read, args=(sero, serv,'R ',),)
thread2.start()
thread1.start()

DivisionDurchNull avatar Dec 14 '18 09:12 DivisionDurchNull

@hendrikland Hi. Ich habe auch eine Vitoligno 300-C und suche verzweifelt nach Adressen, vor allem den FehlerStatus. Ich bekomme korrekte Antworten bei der Fehlerhistorie der letzten 10 Fehler, aber der Status selbst funktioniert noch nicht. Hattest du schon Erfolg und würdest du die Adressen mit mir teilen? Grüsse Richard

hydrax0 avatar Apr 08 '20 20:04 hydrax0

Please tell me the request address V100 boiler pump in operation or not / It is not in the list of addresses of Viessmann-adresses

dima-357 avatar Nov 22 '20 07:11 dima-357

Könntest du den Python-Code sharen? Ich habe einen ähnlichen Aufbau vor, es geht erstmal nur darum die Daten mitzulesen. In meinem Fall ein Pellet-Kessel (Vitoligno 300-C), bei dem es nützlich wäre einige Werte zu erfassen (Anzahl Zündvorgänge, Brenndauer, Pelletverbrauch,...). Leider bietet die App nichts davon an, ich vermute aber das das Vitoconnect die Werte ausliest. Ziel wäre es, dieses auf dem Raspi abzuzweigen und separat wegzuschreiben (z.B. Grafana).

@hendrikland Bist du mit dem Vitoligno 300-C weiter gekommen? Ich würde meinen auch gerne anbinden und die Werte von dir interessieren mich auch. Danke und Gruß

TheCutter avatar May 10 '22 06:05 TheCutter

Wir standen vor dem gleichen Problem und wollten die VitoConnect 100 noch weiter laufen lassen. Da mir ein Raspberry für die Arbeit zu schade war und es mittlerweile für <10 € einen ESP32 DevBoard (mit CP2102 USB / UART Chip) gibt, wurde es dann eben eine minimale ESPHome Lösung.

Netterweise kann man den ESP direkt in den USB Port der VitoConnect 100 stecken und fleißig als Proxy den Traffic verfolgen oder eben weitere Requests einfließen lassen. Kleiner Bonus: Es läuft demnächst auch auf dem ESP ein kleiner Modbus Slave der unserer VitoCal 200-S die frei "verfügbare" PV-Strom Messwerte übergibt. IMG_0912

Für Viessmann ist diese Variante ohne größeren Aufwand und bei ausschließlich mitlesendem Gebrauch quasi nicht detektierbar.

Wichtig! Es reicht kein ESP8266 und kein Software UART, da die Kommunikation doch schon sehr (A) zeitkritisch erfolgen muss und (B) doch einiges von der VitoConnect 100 abgerufen wird.

idstein avatar Jul 23 '22 19:07 idstein

@idstein wärst du bitte so nett und teilst kurz dein ESP Sources/Aufbau und eine kurze Beschreibung was du mit deinem DEV Board gemacht hast? Braucht keine große Beschreibung, vorallem interessiert mich wie du den USB Traffic forwardest / interceptest

h0nIg avatar Sep 04 '22 21:09 h0nIg

ich hab mir jetzt eine Bridge gebaut, womit man vcontrold und vitoconnect parallel betreiben kann und die fehlenden Werte kriegt: https://github.com/h0nIg/vcontrol-vitoconnect-bridge/

h0nIg avatar Sep 11 '22 08:09 h0nIg

Hi @idstein das sieht ja sehr spannend aus, kannst du deine ESPhome config teilen?

egnerfl avatar Sep 15 '22 15:09 egnerfl

Hy @idstein

Echt cooles Projekt :) würd auch gerne mehr darüber erfahren :)

mfg Mike

m1k3f15h avatar Sep 27 '22 11:09 m1k3f15h

@idstein wärst du bitte so nett und teilst kurz dein ESP Sources/Aufbau und eine kurze Beschreibung was du mit deinem DEV Board gemacht hast? Braucht keine große Beschreibung, vorallem interessiert mich wie du den USB Traffic forwardest / interceptest

Aktueller Stand baut das ganze auf ESPHome bei mir lokal auf fürs Management, Updates, ein bisschen Security usw. Die Funktionalität die Werte konkret auszulesen habe ich noch nicht finalisiert, ich hoffe aber demnächst hier weiter zu kommen.

Funktion

  • VitoConnect Passthrough (ohne Sniffing)
  • ALE Energy Meter Simulator (Photovoltaik)

Roadmap

  • Parse data points already accessed via VitoConnect
  • Allow asking for specific data points independent of VitoConnect

Hardware

  • ESP32 Dev Kit C V4 [Pinout]((https://github.com/openv/openv/files/9732491/ESP32_DevKit_C_V4_Pinout.pdf)
  • Kabel Micro-USB
  • IR-Emitter SFH4556 OSRAM 860nm 5mm 20° (https://www.ebay.de/itm/333428475405)
  • IR-Receiver No-Name 5mm 940nm? Diode (https://www.amazon.de/dp/B08WCT6ZJ4)

Software

  • ESPHome
  • Fork VitoWifi (https://github.com/bertmelis/VitoWifi)
substitutions:
  # Unique device ID
  device_id: "heating01"
  device_name: "Heizung Optolink"

esphome:
  name: ${device_id}
  includes:
    - viessmann-vitoconnect/optolink.h
    - viessmann-vitoconnect/optolink.cpp

external_components:
  - source: github://epiclabs-io/esphome-modbus-server@master
    refresh: 60s
    components:
      - modbus_server

esp32:
  board: az-delivery-devkit-v4

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    password: !secret wifi_ap_password

# Enable Home Assistant API
api:
  password: !secret api_password
  encryption:
    key: !secret api_encryption
# Enable over-the-air updates
ota:
  password: !secret ota_password

# Enable Web server
web_server:
  version: 2
  local: true
  port: 8080
  auth:
    username: !secret web_user
    password: !secret web_password

logger:
  baud_rate: 0 #disable logging over uart

uart:
 - id: vitoconnectOpto2
   tx_pin: GPIO1
   rx_pin: GPIO3
   baud_rate: 4800
   data_bits: 8
   parity: EVEN
   stop_bits: 2
#   debug:
#    direction: RX
#    after:
#      delimiter: [0x41]
 - id: vitocal200S
   tx_pin: GPIO17
   rx_pin: GPIO16
   baud_rate: 4800
   data_bits: 8
   parity: EVEN
   stop_bits: 2
#   debug:
#    after:
#      delimiter: [0x06, 0x41]
 - id: ale3energymeter
   tx_pin: GPIO32
   rx_pin: GPIO33
   baud_rate: 19200
   data_bits: 8
   parity: EVEN
   stop_bits: 1
#   debug:
#    dummy_receiver: true
#    after:
#      bytes: 8

sensor:
  # TODO replace with local Optolink reading; current value is based on reading EEBUS via GridX Box
  - platform: homeassistant
    id: heatpump_power_consumption
    entity_id: sensor.heatpump_power_consumption
    device_class: power
    unit_of_measurement: W
    accuracy_decimals: 0
  - platform: homeassistant
    id: meter_l1_power_supply
    entity_id: sensor.meter_l1_power_supply
    device_class: power
    unit_of_measurement: W
    accuracy_decimals: 0
  - platform: homeassistant
    id: meter_l2_power_supply
    entity_id: sensor.meter_l2_power_supply
    device_class: power
    unit_of_measurement: W
    accuracy_decimals: 0
  - platform: homeassistant
    id: meter_l3_power_supply
    entity_id: sensor.meter_l3_power_supply
    device_class: power
    unit_of_measurement: W
    accuracy_decimals: 0

button:
#  - platform: template
#    name: "Vitocal Send EOT"
#    on_press:
#      - uart.write: 
#          id: vitocal200S
#          data: [0x04]
#  - platform: template
#    name: "Vitocal Send Sync"
#    on_press:
#      - uart.write: 
#          id: vitocal200S
#          data: [0x16, 0x00, 0x00]
  - platform: template
    name: "Vitocal Request AT"
    on_press:
      - uart.write: 
          id: vitocal200S
          data: [0x41, 0x05, 0x00, 0x01, 0xF8, 0x02, 0x00]

custom_component:
  lambda: |-
    auto my_custom = new UartOptoLinkSensor(id(vitoconnectOpto2), id(vitocal200S));
    return {my_custom};

modbus_server:
  - id: modbuserver
    uart_id: ale3energymeter
    address: 60 # slave address
    holding_registers:
      - start_address: 0 # REG_FIRMWARE
        default: 10
      - start_address: 1 # REG_MODBUS_REG
        default: 52
      - start_address: 2 # REG_MODBUS_FLAGS
      - start_address: 3 # REG_BAUDRATE_HIGH
      - start_address: 4 # REG_BAUDRATE_LOW
        default: 0x4B00
      - start_address: 5 # REG_TYP_ASN_FN_1
        on_read: return atoi("AL");
      - start_address: 6 # REG_TYP_ASN_FN_2
        on_read: return atoi("E3");
      - start_address: 7 # REG_TYP_ASN_FN_3
        on_read: return atoi("D5");
      - start_address: 8 # REG_TYP_ASN_FN_4
        on_read: return atoi("FD");
      - start_address: 9 # REG_TYP_ASN_FN_5
        on_read: return atoi("10");
      - start_address: 10 # REG_TYP_ASN_FN_6
        on_read: return atoi("C2");
      - start_address: 11 # REG_TYP_ASN_FN_7
        on_read: return atoi("A0");
      - start_address: 12 # REG_TYP_ASN_FN_8
        on_read: return atoi("00");
      - start_address: 13 # REG_HW_VERSION
        default: 11
      - start_address: 14 # REG_SN_HIGH
        default: 0x1234
      - start_address: 15 # REG_SN_LOW
        default: 0x5678
      - start_address: 21 # REG_STATUS
        on_read: |
          // No problem=0, Communication problem=1
          return api_apiserver->is_connected() ? 0 : 1; 
      - start_address: 24 # REG_ERROR_REG
        default: 0 # None=0, L1=1, L2=2, L1L2=3, L3=4, L1L3=5, L2L3=6, L1L2L3=7
      - start_address: 26 # REG_TARIFF
        default: 0 # TARIF_T1=0, TARIF_T2=4
      - start_address: 27 # REG_TARIF1_ENERGY_TOTAL_HIGH
      - start_address: 28 # REG_TARIF1_ENERGY_TOTAL_LOW
      - start_address: 29 # REG_TARIF1_ENERGY_PARTIAL_HIGH
      - start_address: 30 # REG_TARIF1_ENERGY_PARTIAL_LOW
      - start_address: 31 # REG_TARIF2_ENERGY_TOTAL_HIGH
      - start_address: 32 # REG_TARIF2_ENERGY_TOTAL_LOW
      - start_address: 33 # REG_TARIF2_ENERGY_PARTIAL_HIGH
      - start_address: 34 # REG_TARIF2_ENERGY_PARTIAL_LOW
      - start_address: 35 # REG_PHASE_1_VOLTAGE
      - start_address: 36 # REG_PHASE_1_CURRENT
      - start_address: 37 # REG_PHASE_1_POWER 1545 = 15,45 kVA
        on_read: |
          if (!api_apiserver->is_connected() || !id(meter_l1_power_supply)->has_state() || !id(heatpump_power_consumption)->has_state())
            return 0;
          return (id(meter_l1_power_supply)->state - id(heatpump_power_consumption)->state / 3) / 10;
      - start_address: 38 # REG_PHASE_1_REACTIVE_POWER
      - start_address: 39 # REG_PHASE_1_COS_PHI
      - start_address: 40 # REG_PHASE_2_VOLTAGE
      - start_address: 41 # REG_PHASE_2_CURRENT
      - start_address: 42 # REG_PHASE_2_POWER 1545 = 15,45 kVA
        on_read: |
          if (!api_apiserver->is_connected() || !id(meter_l2_power_supply)->has_state() || !id(heatpump_power_consumption)->has_state())
            return 0;
          return (id(meter_l2_power_supply)->state - id(heatpump_power_consumption)->state / 3) / 10;
      - start_address: 43 # REG_PHASE_2_REACTIVE_POWER
      - start_address: 44 # REG_PHASE_2_COS_PHI
      - start_address: 45 # REG_PHASE_3_VOLTAGE
      - start_address: 46 # REG_PHASE_3_CURRENT
      - start_address: 47 # REG_PHASE_3_POWER 1545 = 15,45 kVA
        on_read: |
          if (!api_apiserver->is_connected() || !id(meter_l3_power_supply)->has_state() || !id(heatpump_power_consumption)->has_state())
            return 0;
          return (id(meter_l3_power_supply)->state - id(heatpump_power_consumption)->state / 3) / 10;
      - start_address: 48 # REG_PHASE_3_REACTIVE_POWER
      - start_address: 49 # REG_PHASE_3_COS_PHI
      - start_address: 50 # REG_TOTAL_POWER
      - start_address: 51 # REG_TOTAL_REACTIVE_POWER

idstein avatar Oct 07 '22 09:10 idstein

Hy @idstein

Echt ein MEGA-COOLES Projekt :) Werde das gespannt weiterverfolgen und hoffentlich hab ich bald mal Zeit das "Nachzubauen". Erstmals werde ich das ohne dem "Modbus-Energymeter-Simulator" machen... Soll aber mit der PV dann auch noch folgen.

Danke, dass du das Projekt mit uns teilst 😄

Mfg Mike

m1k3f15h avatar Oct 13 '22 06:10 m1k3f15h

Hi @idstein, cooles Projekt ich verwende momentan die Viessmann API um über das Vitoconnect100 die Daten in mein Loxone Smarthome zu bekommen. Allerdings ist die API sehr eingeschränkt und teilweise jetzt auch kostenpflichtig. Wegen der Garantieverlängerung würde ich aber gerne das Vitoconnect weiter in betrieb lassen. Daher wäre es echt cool wenn man mit deiner einfachen Lösung das Vitoconnect weiterverwenden kann und zusätzlich Daten lokal abfragen und auch setzen kann. Bin mit ESP Home bisher noch nicht ganz firm. Kannst du kurz den aktuellen Stand nochmal etwas detaillierter beschreiben? Ich habe verstanden, dass die Daten zwischen dem IR Modul und dem Vitoconnect in beide Richtungen durchgereicht werden. Zusätzlich schleifst du PV Daten hier ein. Können auch Daten aus dem Traffic ausgelesen werden ? Vorlauftemperatur oder so? Wie läuft die Installation auf dem ESP32. ESPHome flashen und dann zusätzlich VitoWifi?

Vielen Dank!

challo2018 avatar Dec 07 '22 10:12 challo2018

Hi @idstein, Gibts zu dem Projekt schon was neues?

mfg Mike

m1k3f15h avatar Jan 16 '23 13:01 m1k3f15h

Moin ihr! hab ich das richtig verstanden - ihr habt eine Wärmepumpe mit Optolink? Wenn dem so ist, könnt ihr mir mal die 4 Bytes ab Adr. F8 und ein Byte an Adr. F0 sagen? danke & beste Grüsse! Phil

philippoo66 avatar Jan 27 '23 05:01 philippoo66

Morgen, Kann ich leider nicht, da bei mir noch alles original ist und ich nichts auslese.

mfg mike

m1k3f15h avatar Jan 27 '23 05:01 m1k3f15h

aber da is eine Vitotronic drin, oder? da könnte dan im Menü unter 'Service' ganz hinten ein Punkt 'Software Information' oder so sein. Das Passwort dafür ist 'vimaster'

grafik

HW/SW Index sind das 3. und 4. Byte von F8, ich glaube die Zahl vor dem Punkt ist F0. Ich gehe davon aus, dass bei einer Vitotronic die ersten beiden F8 Bytes 20 CB sind...

philippoo66 avatar Jan 27 '23 05:01 philippoo66