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)