Vaillant Therme über eBus steuern

Liebe Gemeinde,

ich möchte meine Vaillant über eBus steuern, insb. WW-Sollwert setzen, Party- und Urlaubsbetrieb schalten. Die eBus Implementierung von Vaillant macht es einem leider nicht einfach, deshalb trage ich hier all mein Wissen zusammen.

Der eBus selbst ist auf ebus.webhop.org sehr gut dokumentiert. Der Anhang zur Doku bietet erste Schritte für Herstellerspezifische Befehle, wie sie Vaillant fast ausschließlich benutzt. Weiterführende Doku zu Vaillant wird hier zusammengetragen, vor allem der letzte Anhang von März 2010 ist schon sehr ausführlich.

Mein Status Quo: Ich habe eine Vaillant EcoTec Plus mit eingebauter Calormatic 430 Regelung seit letztem Winter in Betrieb. Ohne Solar. Erst später dann auf IPS gestossen, sonst hätte ich mich wohl nicht für Vaillant entschieden.

Seit kurzem habe ich den Adapter eBus auf Seriell von Helmut, der Empfangen und Senden kann. Dazu das Software-Modul vom unermüdlichen Brownson sowie sein Auswerteskript (welches glaube ich wiederum auf dem vom Wupperi aufbaut). Ich habe es um mir bekannte Vaillant Telegramme erweitert und kann schon einige Parameter lesen (siehe Screenshot).

Meine ersten Versuche, Parameter zu setzen scheitern jedoch kläglich. Die CRC-Berechnung ist geklärt. Senden Ohne korrekte CRC-Werte führte zu Fehlern auf dem eBus („313030…“), mit korrecktem CRC kommen diese nicht (immerhin weis ich dadurch, das der Adpater lesen und Schreiben kann).

Ich sende in meinem folgendem Skript mit Quelladress 01h, laut Spec dem „Handprogramiergerät / Fernbedienung“ an Broadcast. Befehl B5h (Vailant spezifisch), Subbefehl 05h, also „Set Operational Data“. Ergebnis: Traffic auf dem Bus, teilweise auch Identifikationsanfragen der Steuerung an verschiedene Adressen, es ändert sich aber tatsächlich nichts.

<?
$myString = "01FEB505020198";
CSCK_SendText(14899 /*[Client Socket - eBus - EXSYS]*/, add_crc(hexToStr($myString)));
// COMPort_SendText (12345 /*[Objekt #12345 existiert nicht]*/, add_crc(hexToStr("FFFE0902031601020F")));

    // ----------------------------------------------------------------------------------------------------------------
    function build_crc_byte($byte, $crc) {
        $ChecksumArray = array (
         0x00, 0x9B, 0xAD, 0x36, 0xC1, 0x5A, 0x6C, 0xF7, 0x19, 0x82, 0xB4, 0x2F, 0xD8, 0x43, 0x75, 0xEE,
         0x32, 0xA9, 0x9F, 0x04, 0xF3, 0x68, 0x5E, 0xC5, 0x2B, 0xB0, 0x86, 0x1D, 0xEA, 0x71, 0x47, 0xDC,
         0x64, 0xFF, 0xC9, 0x52, 0xA5, 0x3E, 0x08, 0x93, 0x7D, 0xE6, 0xD0, 0x4B, 0xBC, 0x27, 0x11, 0x8A,
         0x56, 0xCD, 0xFB, 0x60, 0x97, 0x0C, 0x3A, 0xA1, 0x4F, 0xD4, 0xE2, 0x79, 0x8E, 0x15, 0x23, 0xB8,
         0xC8, 0x53, 0x65, 0xFE, 0x09, 0x92, 0xA4, 0x3F, 0xD1, 0x4A, 0x7C, 0xE7, 0x10, 0x8B, 0xBD, 0x26,
         0xFA, 0x61, 0x57, 0xCC, 0x3B, 0xA0, 0x96, 0x0D, 0xE3, 0x78, 0x4E, 0xD5, 0x22, 0xB9, 0x8F, 0x14,
         0xAC, 0x37, 0x01, 0x9A, 0x6D, 0xF6, 0xC0, 0x5B, 0xB5, 0x2E, 0x18, 0x83, 0x74, 0xEF, 0xD9, 0x42,
         0x9E, 0x05, 0x33, 0xA8, 0x5F, 0xC4, 0xF2, 0x69, 0x87, 0x1C, 0x2A, 0xB1, 0x46, 0xDD, 0xEB, 0x70,
         0x0B, 0x90, 0xA6, 0x3D, 0xCA, 0x51, 0x67, 0xFC, 0x12, 0x89, 0xBF, 0x24, 0xD3, 0x48, 0x7E, 0xE5,
         0x39, 0xA2, 0x94, 0x0F, 0xF8, 0x63, 0x55, 0xCE, 0x20, 0xBB, 0x8D, 0x16, 0xE1, 0x7A, 0x4C, 0xD7,
         0x6F, 0xF4, 0xC2, 0x59, 0xAE, 0x35, 0x03, 0x98, 0x76, 0xED, 0xDB, 0x40, 0xB7, 0x2C, 0x1A, 0x81,
         0x5D, 0xC6, 0xF0, 0x6B, 0x9C, 0x07, 0x31, 0xAA, 0x44, 0xDF, 0xE9, 0x72, 0x85, 0x1E, 0x28, 0xB3,
         0xC3, 0x58, 0x6E, 0xF5, 0x02, 0x99, 0xAF, 0x34, 0xDA, 0x41, 0x77, 0xEC, 0x1B, 0x80, 0xB6, 0x2D,
         0xF1, 0x6A, 0x5C, 0xC7, 0x30, 0xAB, 0x9D, 0x06, 0xE8, 0x73, 0x45, 0xDE, 0x29, 0xB2, 0x84, 0x1F,
         0xA7, 0x3C, 0x0A, 0x91, 0x66, 0xFD, 0xCB, 0x50, 0xBE, 0x25, 0x13, 0x88, 0x7F, 0xE4, 0xD2, 0x49,
         0x95, 0x0E, 0x38, 0xA3, 0x54, 0xCF, 0xF9, 0x62, 0x8C, 0x17, 0x21, 0xBA, 0x4D, 0xD6, 0xE0, 0x7B);

       $result = ($ChecksumArray[ord($byte)] ^ $crc);
       $result = ($ChecksumArray[$crc] ^ ord($byte));
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function build_crc($message) {
        $crc = 0;
       for ($i=0 ; $i<strlen($message) ; $i++) {
          $crc = build_crc_byte(substr($message,$i,1), $crc);
       }
       return chr($crc);
    }

    // ----------------------------------------------------------------------------------------------------------------
    function add_crc($message) {
        return $message.build_crc($message);
    }

    // ----------------------------------------------------------------------------------------------------------------
    function strToHex ($str) {
        $result = '';
        for ($i = 0; $i < strlen($str); $i++) {
            $result .= strtoupper(((strlen(dechex(ord($str[$i]))) < 2) ? '0' : '').dechex(ord($str[$i])));
        }
        return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function hexToStr($hex) {
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2) {
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }
?>

Ist jemand schon ein Schritt weiter?

Danke & Gruß,
Axel

P.S.: So warm wie im Screenshot ist es bei mir draussen dann doch nicht. Bekomme seit kurzem nur noch 00 auf dem eBus…

eBus_GetData.txt (15 KB)

Capture.GIF

Ja, an ähnlichen Stand bin ich auch.

Leider komm ich mit dem senden auch nicht wirklich weiter.

Sent using Tapatalk

Hat jemand eine Vaillant Fernbedienung VR 81? Dann könnte man mitsniffen und die Befehle evtl. reproduzieren. Die kostet aber rd. €100 in der Bucht, ist mir (noch?) zu teuer.

Danke & Gruß,
Axel

Moin Axel,

kann man deinen Regler nicht aus der Therme herausnehmen?
Das Bedienteil meines Reglers (Solar) hängt bei mir in der Küche , wärend der eigendliche Regler im Keller an der Wand hängt!
Auf der Rückseite ist nur der EBus angeschlossen!

Gruß
Stefan

Sehr interessant: die Software vrDIALOG 810 speist extrem viel Logik aus einer Access Datenbank. Diese liegt im Unterverzeichniss db\vrDIALOG810.mdb. Die Software kann man bekanntlich von Vaillant Polen downloaden.

In der Tabelle Types sind bspw. alle möglichen Variablentypen definiert. Neben den bekannten DATA1c und DATA1b auch die Struktur für „HolidayPeriods“.

Ich werde noch nicht schlau daraus, ist aber evtl. hilfreich…

Hallo Axel,

ich habe in den letzten Tagen schon ein paar Sachen in das Wiki von ebus.webhop.org eingearbeitet. Einige Sachen passen mit meinen Logs nicht über ein.
Vielleicht können wir ja gemeinschaftlich an dem Wiki weiter entschlüsseln, ggf. auch die Ergebnisse verifizieren.

Gruß
Maik

Hallo :loveips:
Ist noch jemand an der Thematik dran ?
Hätte auch großes Interesse an diesem Thema.
Hier mal kurz mein Vaillant-Equipment:
ecoCOMPACT VSC 126/3-5 140HL
Mischermodul VR 61
Witterungsgeführter Regler calorMATIC VRC 430 (Abgesetzt)
VRC DCF - Zeitzeichenempfänger mit Außenfühler
Diagnosesoftware vrDialog 810/2

Habe extra meinen VRC 430 im Wohnzimmer umgebaut
damit ich mein USB-vrDialog-Interface anschließen kann,
ohne jedesmal mit dem Notebook in den Keller zu laufen.

Ich bin wieder dran, nachdem ich jetzt ein neuen Buskoppler habe. Neuigkeiten hab ich aber noch keine…

Ja Prima :slight_smile:
Ich muß leider noch auf einen erschwinglichen Buskopler und die IPS warten.
Ich hoffe Teile kommen die nächsten Tage und ich kann los legen.
Mit der vrDialog-Soft bekomm ich den von Helmut stammenden Adapter leider bisher nicht ans laufen. :mad:

Nein Peter, das ist mir auch bekannt.

Die VrSoft, oder wie Die heißt, fragt was ab, was der einfache E-Bus-Koppler nicht liefert.

Aber wenn Du es in IPSymcon einarbeiten willst, dann kannst Du dir Vr-Soft auch nicht benutzen, oder?

Gruß Helmut

Ja wohl , das hab ich schon verstanden.
Haben mit ein paar Kollegen schon einmal so ein Problem gelöst.
Mussten damals nur die Abfrage des Dongles umgehen, dann lief es.
Aber ich glaub den Aufwand werd ich mir diesmal sparen, da ich mich
mit der IPS näher beschäftigen möchte. Rolladen steuern wäre nach der Heizung dann das nächste.

Oh,
ich bin ja nicht neugierig: „kollegales“ Problem gelöst mit der VR-Soft?

Gruß Helmut

Da gings um Dongle für GSM-Mobiltelefone mit denen man
Firmware-Updates und diverse Änderungen in den Geräten vornehmen konnte.
Mehr möchte ich dazu nicht sagen.

Hallo Peter,
der Adapter von Vaillant enthält einen µController mit ARM-Kern. vrDialog und der Adapter sprechen ein eignes Protokoll. Daher kann die Vaillant-SW nicht mit Helmuts oder einen anderen „serielen“ EBUS-Adapter funktionieren. Ein Lizenz Dongel ist der Adapter, glaube ich, nicht. Das geheimnis steckt wahrscheinlich in der ebus.dll. Wenn wir Glück haben, ist das evtl. eine Standard-DLL von der EBUS-Group…

Gruß
Maik

Vaillant und Standards… Aber die Hoffnung stirbt zuletzt. Ich meine mich aber erinnern zu können, die in der eBus.dll exportierten Funktionen angeschaut zu haben. Da war aber keine Logik abgelegt…

Hallo Axel,

du scheinst ja bereits einige Daten aus der Therme herauszubekommen. Ist das noch der aktuelle Stand, oder bist du mittlerweile weiter?

Ich bekomme zur Zeit immer nur

0364B5120202FE98

was ich jetzt, ohne tieferes Verständnis vom eBus-Protokoll (gibt es irgendwo den grundsätzlichen Aufbau eines Datentelegramms erklärt? Oder was z.B. bestimmt wer Master ist und wer Slave?) folgendermaßen interpretiere:

„03 sendet an 64: Vaillant-Befehl, Unterbefehl 12 (unknown command)“ mit allerhand weiteren Daten. Letztere sind jedes Mal gleich.

03 scheint die Therme zu sein (sonst hängt ja nichts auf dem Bus), 64 ist… ja, was eigentlich?

Um der Therme jetzt irgendwas spannendes zu entlocken (wie du es anscheinend schon geschafft hast) muss ich ihr wohl auch mal einen Befehl schicken, oder?

Hi Sokkerheld,

Ich habe den letzten dokumentierten Stand von ebus.webhop.org laufen. Schau mal im ersten Post, dort ist alles verlinkt.

Danke & Gruß, Axel

Hab es jetzt so gemacht wie im Beispiel. Es kommen keine sinnvollen Daten an, nur immer dieser o.g. Datensatz.

Wenn ich Dinge auf den Bus sende empfange ich sie immer selbst wieder, aber der Therme scheint das herzlich egal zu sein. Ich hatte ja gehofft, zumindest mal ein paar Statusmeldungen zu bekommen oder so.

Auf Befehle reagiert die Therme nur dann, wenn man die CRC-Checksumme falsch berechnet, dann mit entsprechenden Fehlermeldungen.

Update: Etwas scheint doch zu passieren. Wenn ich am Rad für die Brauchwassertemperatur drehe (die Therme macht gar keines, aber egal) bekomme ich z.B.

0315B5130306640063
0315B513030600000E

Der Befehl ist nun gar nicht dokumentiert. Jemand eine Idee?

Update 2: Habe jetzt mal am Raumthermostat gedreht und etwas „Wärmebedarf“ erzeugt. Statt

0364B5120202FE98

bekomme ich plötzlich

0364B51202020066

Hi Sokkerheld,

der B5 12-Befehl wurde schon untersucht, deine Werte scheinen normal. Schau dazu mal in das ODT-Dokument weiter unten im Wiki (dort steht mehr als im Wiki!). Demnach ist Gerät 03h der „Firing Automat 1“, Gerät 64h eine dort angeschlossene „Pump 1“. Ich bekomme den auch, obwohl ich keine extern angeschlossene Pumpe habe. Befehl B5 13 hatte ich auch schon auf dem Bus, kann mir aber kein Reim darauf bilden.

Danke & Gruß, Axel

So, allmählich scheint das in die richtige Richtung zu gehen. Ich sende also z.B.

0008B5040100 + CRC

Es handelt sich um ein Master-Slave-Telegramm.

Das erste Byte 00 = Absender PC/Modem Masteradresse (als Slaveadresse war irgendwo 05h angegeben, Masteradresse = Slaveadresse - 5 wie in der Doku steht)

Das zweite Byte ist dieser Firing Automat (dessen Slave-Adresse, ebenfalls Masteradresse + 5)

Dann der Befehl B504 (Datenblock lesen)

01 ist die Länge der Daten (1 Byte), das Byte hat den Wert 00 (Datum/Uhrzeit)

Daraufhin erhalte ich auf dem Bus (Leerzeichen der Übersicht halber eingefügt):

0008B504010018 00 0A 00455002FFFFFFFF0080 1F

Zunächst mal mein eigenes Telegramm, das vom Empfänger per ACK (00) bestätigt wird, dann die Angabe der Länge des folgenden Pakets (0A) und dann die Daten, dann nochmal eine Checksumme (1F)

Das Datenpaket bedeutet dann:
00 - kein DCF77-Empfang
45 - Sekunden
50 - Minuten
02 - Stunden
FF - Tag
FF - Monat
FF - Wochentag
FF - Jahr
00 - Lowbyte Außentemp
80 - Highbite Außentemp

Diese Uhr scheint tatsächlich durchzulaufen, wenngleich falsch gestellt (es gibt vmtl gar keinen DCF-77 Empfänger). Das Datum ist natürlich Murks. Bei der Temperatur bin ich nicht sicher wie man sie ausrechnen muss, das Auswerteskript macht daraus 0°C. Würde ja im Prinzip auch Sinn machen, da die Heizung keinen Außentemperaturfühler hat.

Ich nehme mal an, das alles ist jetzt keine bahnbrechende neue Erkenntnis, aber ich denke angesichts der fehlenden Quellen ist es im Zweifel sinnvoll, laut zu denken und jegliche Erfolge zu teilen :smiley: