Vaillant Therme über eBus steuern

Vorlauf- und Rücklauftemperatur meldet mir die Anlage jetzt auch, wenn ich dem Brenner ein B5110101 schicke. Ich nehme mal an, damit bin ich da angelangt, wo alle anderen auch schon sind? :rolleyes:

Andere Sache:
das gelegentlich abgefangene

0364B5120202FE98

bzw.

0364B51202020066

scheint unter Anderem Auskunft über den Status der Zirkulationspumpe zu geben (oben: aus, unten: an) da 64 die Slave-Adresse der Pumpe ist und sich das letzte Byte vor dem CRC ändert, wenn man Wärmebedarf ein/ausschaltet.

Wahnsinn, das doch schon mal ein Riesenschritt! So weit war ich noch nicht - hatte bisher noch nicht erfolgreich senden können. Aber jetzt geht’s los!

Oh, ich dachte dass du so an die Daten gekommen bist (Screenshot aus deiner Visu). Oder laufen die Daten bei dir anderweitig über den Bus? Ich habe ja leider gar keine Busteilnehmer außer dem was in der Therme selbst drin steckt, daher ist bei mir nicht viel mitzusniffen…

Die Infos bekomme ich über periodische B511 und 12 Telegramme. Ein Master-Slave hatte ich bisher noch nicht hinbekommen, das eröffnet ganz neue Möglichkeiten.

Auf die „Set Operational Data“-Befehle habe ich z.T. auch schon ACKs bekommen, befürchte aber dass das erstmal die Standardreaktion auf ein korrekt formatiertes Telegramm ist, unabhängig davon ob es zu Änderungen geführt hat oder nicht… einige der Befehle traue ich mich auch ehrlich gesagt nicht zu senden, bevor ich nicht genau weiß was sie tun und wie ggf. man die Defaults wieder herstellt. Stichwort Heizkurve etc.

Periodische Telegramme mit wirklich interessanten Daten bekomme ich nicht bei mir, ich nehme an dass sowas nur gesendet wird, wenn man einen Bus-Raumregler in Betrieb hat. Das ist bei mir nicht der Fall.

Ich will nicht zu viel versprechen, aber ich glaube ich habe es gerade geschafft, bei mir die Vorlauftemperatur zu setzen :wink:

Später mehr dazu.

Wie versprochen, das Update:

Der aus IPS abgesendete Befehl

0008 B510 09 0000 64 0F FFFF00FF00 + CRC

(Leerzeichen der Übersicht halber eingefügt)

setzt bei mir die Vorlauf-Solltemperatur auf 50°C und die Brauchwasser-Solltemperatur auf 8°C

Die Werte wurden zum Testen gewählt und müssen keinen Sinn ergeben. Andere Werte wurden ebenfalls ausprobiert. Brauchwasser erhitzt die Therme bei mir eh nicht.

Der Sollwert bleibt allerdings nicht dauerhaft bestehen, sondern er setzt sich irgendwann wieder zurück auf das, was mit dem Handrad an der Therme eingestellt ist (scheint jedenfalls so). Abhilfe könnte möglicherweise dadurch geschaffen werden, dass man ihn periodisch wiederholt.

Aufschlüsselung des Befehls, nach Blöcken die ich durch Leerzeichen getrennt habe:

-geht von 00 (PC/Modem Master) an 08 (Brenner Slave)
-Vaillant-Proprietärer-Mist-Befehl 0x10
-09 Datenbits folgen
-Unbekannte Bytes die lt. Doku immer 0 sind
-Byte für die Vorlauftemperatur, entspricht dem Temperaturwert in °C * 2 (0x64 ist dezimal 100, bedeutet 50°C)
-Byte für Brauchwassertemperatu entsprechend
-einige unbekannte Bytes mit den lt. Doku „beobachteten“ Werten

Update 2:


Man sieht hier, was mit der Kesseltemperatur passiert, wenn ich im laufenden Betrieb per Bus-Telegramm einfach mal die Solltemperatur auf 30°C ändere. Er übernimmt das, hört auf zu heizen, bis nach einer Weile aus noch nicht geklärten Gründen die Solltemperatur zurück auf (glaube ich) 55°C geändert wird. Ein Grund hiefür könnte der am analogen 7-8-9-Anschluss angeschlossene Thermostat sein. Ich werde auf jeden Fall nochmal probieren, wie die Therme reagiert wenn ich diesen trenne und dann einen Befehl sende (normalerweise heizt die Therme ohne angeschlossenen Regler auf voller Leistung).

So, mal wieder eine aktuelle Statusmeldung. Ich habe gestern den analogen 7-8-9-Regler abmontiert. Das Verhalten der Therme ist aber das selbe, er heizt normalerweise bis zu der am Drehknopf (an der Therme) eingestellten Maximaltemperatur. Setzt man per eBus eine höhere, so wird dies ignoriert bzw. eben ensprechend der mechanischen Einstellung begrenzt. Setzt man eine niedrigere, so wird diese etwa 10 Minuten lang beibehalten, dann schaltet er wieder zurück. Vermutlich ist das so, um bei Reglerausfall einen Notbetrieb zu gewährleisten(?). Letztlich geht ja nichts kaputt wenn die Vorlauftemperatur zu hoch ist (es sei denn man hat eine Fußbodenheizung ohne Begrenzer oder sowas), sondern es ist bloß ineffizient.

Ich kann an dem blöden Drehknopf der Therme leider gerade nichts ändern, weil die Achse abgebrochen ist (Plastikschrott! Bloß vorsichtig damit, bei mir ist sogar der Brauchwasserknopf abgebrochen obwohl ich gar kein Brauchwasser erwärme und diesen Knopf nur ein paarmal zum Testen bewegt habe…). Habe schon neue Knöpfe bestellt, sind zum Glück einzeln zu bekommen und nicht völlig utopisch bepreist. Dennoch… Sch***teile.

Ich teste jetzt gerade, wie die Therme darauf reagiert wenn ich das „Solltemperatur“-Paket alle paar Sekunden erneut absende. Mit etwas Glück sollte er dann nicht zurück „springen“.

Ich teste und werde berichten.

Eigentlich bin ich dann mit dem was ich erreicht habe auch schon recht zufrieden:

-Auslesen Ist-Temperatur möglich
-Setzen Soll-Temperatur möglich
-Anzeigen ob Zündflamme brennt (nice to have)
-evtl. Anzeigen ob Zirkulationspumpe läuft (muss ich nochmal genauer ansehen)

Was ich jetzt gern noch hätte wäre eine Anzeige des Betriebsdrucks (ist digital auf dem Display anzeigbar durch Drücken von „-“ Taste).

Ansonsten bin ich eigentlich ganz zufrieden.

Update: Sieht soweit gut aus, kein Zurückspringen zur Höchsttemperatur mehr.

Hi Sokkerheld,

das geht bei mir auch, nur meine aussentemperaturgeführte Steuerung Calormatic 630 stellt periodisch (mehr oder weniger sofort) alles wieder sofort auf die eigenen Vorgabewerte zurück. Ich muß es also jetzt schaffen die Werte der Steuerung zu setzen. Aber das sind schon mal 13. Schritte weiter!

Halt uns bitte weiter auf dem Laufenden - liest sich gut.

Danke & Gruß, Axel

Ich nehme an, du empfängst auch die entsprechenden Telegramme auf dem Bus, wenn das passiert? Dann würde deine Steuerung ja quasi genau das tun, das bei mir zur Zeit IPS tut.

Ich bin nicht so sicher, ob das möglich ist. Die Steuerung ist ja normalerweise Befehlsgeber und nicht -empfänger. Das was mit den Befehlen aus IPS heraus möglich ist, ist ja bloß das was jede Steuerung auch macht. Im Display meiner Therme erscheint z.B. auch wenn ich Solltemp sehr niedrig setze „Kein Wärmebedarf eBus Regler“. Die Therme hält mein Skript also für einen normalen Regler.

Es kann gut sein, dass du hier eine Highlander-Situation hast. Denn müsstest du irgendwie dafür sorgen, dass die Calormatic bei dir nur als Fallback einspringt… dafür hätte ich jetzt aber spontan auch keine Idee.

Ich bin ja ganz glücklich, auch mal hilfreich zu sein und nicht immer bloß doofe Fragen zu stellen. :smiley:

Wenn es Neuigkeiten gibt, sage ich bescheid.

Gibt es eigentlich irgendwo schon ein Skript um bei empfangenen Telegrammen zu prüfen ob die CRC stimmt? Momentan habe ich das noch quick & dirty gelöst (gucken ob der Wert <> 0) und da sorgt jeder kleien Bitkipper für fehlerhafte Messwerte (plötzlich angeblich 100°C, dann wieder normal).

Meine Hoffnung ist, dass die Steuerung Vorgaben setzen lässt, wie es bspw. Eine schnöde Fernbedienung macht. Calormatic abklemmen wäre schon heftig, nur auf IPS möchte ich mich dann doch nicht verlassen…

Hat jemand einen Fernbedienung oder ein Raumfühler und kann mir die Befehle durchgeben?

Danke & Gruß, Axel

Ich verstehe, dass du dich nicht allein auf IPS verlassen möchtest. Ich habe mir dazu auch Gedanken gemacht und arbeite gerade an „meiner“ Lösung:

Ich bastle gerade einen Baustein auf Arduino-Uno-Basis, der unter Anderem Gas- und Wasserzählerimpulse erfasst, die Türklingel und einen Reedkontakt für den Postmelder usw…

Diesem habe ich zusätzlich einen 1wire-Anschluss verpasst, an dem ein Temperaturfühler hängt, den ich in die Schalterdose der Türklingel hineinmogeln werde. Mit dem Fühler werde ich per IPS eine außentemperaturgeführte Steuerung realisieren.

Außerdem hat der Baustein einen PWM-Ausgang, den ich über eine Schaltung galvanisch getrennt und im Pegel angepasst zur Steuerung der 7-8-9-Schnittstelle verwenden kann.

Der Baustein agiert normalerweise also in Bezug auf die Heizung lediglich als Schnittstelle zu dem 1wire-Fühler. Er bekommt aber für den Notbetrieb eine simple Heizkurve eingestellt, so dass er zur Not autark die Heizung fahren kann.

Im Normalbetrieb wird er regelmäßig aus IPS heraus abgefragt. Dadurch „weiß“ er auch, dass er sich um die Heizung zur Zeit nicht kümmern muss. Bleiben die Abfragebefehle allerdings für eine bestimmte Zeit aus, so schaltet der Baustein auf autark und gibt einen entsprechenden Spannungspegel auf die 7-8-9-Schnittstelle.

Ich habe also quasi eine Steuerung aus IPS heraus mit Watchdog-Funktion und autark funktionierender Notsteuerung.

Das klingt spannend, ist für mich aber mangels Hardware bzw. E-Technik Know-how nicht realisierbar. Aber btw, warum Aussentemp-Steuerung und nicht direkt Bedarfsgerecht nach Anwesenheit bzw. Wärmeanforderung? Hast doch bestimmt HM oder Konsorten im Spiel. Ein Kollege hat bei seiner alten Heizung einfach den Aussenfühler abgeklemmt und gaukelt der Therme je nach Wärmeanforderung entsprechende Aussentemp vor. Sehr clever und spart massig Gas…

Es sind ja zwei paar Schuhe: Einerseits die Vorlauftemperatur, angepasst an die Außentemperatur, andererseits die Frage ob überhaupt Heizwasser benötigt wird, ob also Wärmebedarf besteht. Aus IPS heraus kann ich das natürlich maximal intelligent regeln, weil ich ja relativ genaue Informationen über die Nutzung der Räume habe. Die Notsteuerung hingegen weiß nichts von den HM-Thermostaten, kann also „nur“ nach der Außentemperatur gehen.

Zusätzliche Komplexität gewinnt die Sache noch durch die Fußbodenheizung in Bad und Küche: Hier möchte man, auch wenn ansonsten kein Wärmebedarf besteht, ggf. zu bestimmten Zeiten noch einen gewissen Durchfluss bei niedriger Vorlauftemperatur haben, damit der Boden angenehm warm bleibt.

Die „Hochintelligente Heizungssteuerung“ wird sicherlich noch einiges Kopfzerbrechen bereiten, aber so will ich es ja auch. Dennoch ist die aktuelle Außentemperatur dafür durchaus eine hilfreiche Größe. :wink:

Das Byte S10 aus dem Paket B511 / B1 scheint übrigens Auskunft darüber zu geben, ob eine Störung vorliegt. Der Wert ist normalerweise 00 (im Wiki steht, der Wert sei immer 00).

Gestern hatte ich aber leider ein Problem mit Luft im Heizkreislauf und daraufhin hat die Therme mit einer Störungsmeldung abgeschaltet. In diesem Zustand hatte besagtes Byte den Wert 01.

Welche Art von Störung vorliegt, bekommt man so aber leider noch nicht heraus.

Ich hab jetzt bzgl. Perl ein wenig Hilfe gefunden und würde gern mal ein paar CRC-Berechnungen durchführen.
Kann mir jemand dazu ein paar Befehle und die entsprechenden richtigen CRCs geben? Ich würde das gern erstmal trocken testen.

Gruß Mirko

Gibt es ein Telegramm was eine Antwort erfordert? Ich habe jetzt den eBus-Adapter hier und kann fleissig lesen. Nur das senden gelingt mir nicht. Ich sehe auch nix aufälliges nachdem ich gesendet habe … wie würde sich eine falsche crc bemerkbar machen?

Bei falscher CRC wird die Sendung als fehlerhaft betrachtet und per NACK quittiert, so sollte es zumindest sein. Hier mal ein Skript, das bei mir die Therme dazu bringt, ein paar nützliche Daten zu senden:

<?

// Slave-Addr eines Master entspricht Master-Addr + 5

// Uhr auslesen
/*
$sourceAddr = 	0x00;
$destAddr =    0x03 + 5;

$primCmd =     0xB5;
$secCmd =      0x04;

$dataBytes[] = 0x00;//*/

// Vorlauf und Rücklauf auslesen
///*
$sourceAddr = 	0x00;
$destAddr =    0x03 + 5;

$primCmd =     0xB5;
$secCmd =      0x11;

$dataBytes[] = 0x01; // 1 bzw 2 //*/

// Kesseltemp. setzen?
/*
$sourceAddr = 	0x00;
$destAddr =    0x08;

$primCmd =     0xB5;
$secCmd =      0x05;

$dataBytes[] = 0x2D;
$dataBytes[] = 0x00;
$dataBytes[] = 0x32;
$dataBytes[] = 0x00; //*/

$myString = zeropad(dechex($sourceAddr)) .
	zeropad(dechex($destAddr)) .
	zeropad(dechex($primCmd)) .
	zeropad(dechex($secCmd)) .
	zeropad(count($dataBytes));
for($i = 0; $i < count($dataBytes); $i++)
	$myString .= zeropad(dechex($dataBytes[$i]));

echo $myString;

COMPort_SendText (54486 /*[USB (virt. RS232) für eBus-Koppler]*/ , add_crc(hexToStr($myString)));

function zeropad($num)
{
    return (strlen($num) == 1) ? '0'.$num : $num;
}

    // ----------------------------------------------------------------------------------------------------------------
    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;
    }
?>

Hübsch formatiert und gekapselt gibt es das ganze leider noch nicht, ist halt alles noch in der „Hacking“-Phase.

Hacking soll mir recht sein, arbeite ja nicht mit IPS.

Ich nutze gerade hterm mit Windows aber hab das Gefühl dass ich nicht sende. Es gibt eben Null-Reaktion. Ich hab die Steuerung bzw. das Bedienteil bis an den Schreibtisch verlängert, der VR-90 ist leider noch nicht da. Mein Adapter ist der von eservice-online und sollte ja eigentlich senden können.

Womit schaut ihr euch den eBus an?

Eine Sache noch, wenn ich mit hterm den eBus mit Nachrichten zumülle (kann man ja machen alle 0,1s die Nachricht wiederholen) leuchtet die „Active“ Lampe am eBus-Adpater nicht. Bei anderen Telegrammen die ich empfange aber schon … ist das normal ?

Gruß