Vailant Ecotec Plus und VCR430 mit eBus steuern

So etwas habe ich in Perl auch schon geschrieben, macht aber auf Dauer nicht glücklich … zumindest mich nicht.

Die Applikation (welche auch immer) muss sich mit dem ganzen „dreckigen“ Mist (CRC, Datenkonvertierung, etc.) beschäftigen und darf dann auch für jedes Gerät wieder neu erfunden werden. Ausserdem „belastest“ man die Applikation mit Telegrammen die sie nicht braucht.

Bei „uns“ soll es eben kein ständiges senden der eBus-Befehle geben sondern nur gezielte Abfragen. Um die ganze Umrechnung (data1b, bcd, etc.) und die CRC und SYN Geschichte soll sich der Daemon kümmern. Dazu soll es dann ein gerätespezifisches Config-File geben dass die Befehle übersetzt (Applikationsunabhängig). Ein einfaches „set WW_soll 50“ oder „get WW_soll“ via Telnet oder UDP sorgt dann für den Rest -> setzt WW-Solltemperatur oder fragt sie ab. Das ist dann theoretisch vom Smartphone, über den Linux-Server bis hin zur Windows-Dose oder Mac absolut universal. „Wir“ kommen aber auch nicht aus der IP-Symcon Ecke sondern aus ganz verschiedenen Lagern.

Trotzdem eine schöne Sache ein eBus-Connector.

Gruß

Das macht Sinn und das sehe ich genauso - nur dass ich eben genau IP-Symcon und Skripts dort für die genannten „Drecksarbeit“-Funktionen verwende.

Wie schon an anderer Stelle erwähnt, bin ich fast fertig und werde meine Ergebnisse bald posten. Wer will, kann die PHP-Skripts dann nach eigenem Bedarf portieren, z.B. nach C (für euren Daemon), nach C# (um es zum Windows-Service dazuzutun) usw.

Hallo,
ich bin hier neu im Forum, habe zwar schon vor drei Jahren mich mit dem eBus an meiner ecoTEC VC136 mit VRC430 beschäftigt, hatte es aber nicht gedacht, dass man den proprietären Vailant-Code knacken könnte.

Von eservice.online habe ich mit den „eBus Koppler USB“ besorgt und ca. 1 Woche programmiert. Der Koppler läuft übrigens bestens. Selbst die Schaltschwelle war schon optimal eingestellt.

Bisher habe ich nur Telegramme mitgelesen. Ich würde gerne in erster Linie die Vorlauftemperatur steuern.


[INFO] 10 08 B5 10 09 00 00 AD 78 FF FF 00 FF 00 D9 00 01 01 9A 00 
[INFO] Regler: VT=86,5°C SP=60°C Stopp=Nichts
[INFO] 10 08 B5 11 01 01 89 00 09 74 64 00 02 FF 70 01 00 6C 50 00 
[INFO] Heizung: HZ=An WW=Aus VT=58°C RT=50°C SP=56°C
[INFO] 10 08 B5 11 01 02 8A 00 05 03 3C 74 50 78 30 00 
[INFO] Heizung: SPmax=60°C

Die Wassertemperatur des Speichers ist plausibel. Der Sollwert ist auf 60°C eingestellt. Dies gibt die Angabe zum Regler und „Heizung: SPmax“ wieder. Den Vorlauf habe ich auf ursprünglich 58°C und jetzt zum Testen verändert auf 60°C stehen. In beiden Fällen zeigt der Regler > Regler: VT=86,5°C.

Übrigens gestern stand der Wert auf 90°C.

Ich möchte die php - Funktionen von Thomas Terényi nutzen. Aber ich befürchte hiermit kann ich nur den Wert „Regler: VT=86,5°C“ verändern. Wer weiss Rat?

function EBUS_HeizungSteuern($Vorlauftemperatur, $Speichertemperatur, $StoppHeizung, $StoppWarmwasser, $StoppUnbekannt)
{
	// Stopp-Bits bestimmen
	if(!$StoppUnbekannt)
	{
		if($StoppHeizung && $StoppWarmwasser)
		   $Stopp = "05";
		else if($StoppHeizung)
		   $Stopp = "01";
	   else if($StoppWarmwasser)
		   $Stopp = "04";
	   else
		   $Stopp = "00";
	}
	else
	{
		if($StoppHeizung && $StoppWarmwasser)
		   $Stopp = "45";
		else if($StoppHeizung)
		   $Stopp = "41";
	   else if($StoppWarmwasser)
		   $Stopp = "44";
	   else
		   $Stopp = "40";
	}
	
	// Heizung mit dem Befehl B5 10 steuern
	EBUS_NachrichtSenden(EBUS_NachrichtErstellen(EBUS_COMPUTER, EBUS_BRENNER_SLAVE, "B5", "10", "00 00 " . EBUS_Kodieren($Vorlauftemperatur, "DATA1c") . " " . EBUS_Kodieren($Speichertemperatur, "DATA1c") . " FF FF $Stopp FF 00"));
}

Gruss Klaus

Hallo Klaus!

Zu allererst, freut mich, dass bei dir soweit alles funktioniert.

Ein paar Infos:

Heizung: SPmax=60°C

Das ist die am Drehrad an der Therme eingestellte maximale Speichertemperatur.

Regler: VT=86,5°C SP=60°C Stopp=Nichts

SP=60°C ist die am Regler eingestellte und von der Therme angeforderte Soll-Speichertemperatur (könnte auch weniger oder mehr als SPmax sein, die Therme sollte dann aber nur bis SPmax aufheizen).

Heizung: HZ=An WW=Aus VT=58°C RT=50°C SP=56°C

SP=56°C ist die von der Heizung gemeldete aktuelle Ist-Speichertemperatur.

Mit der Funktion EBUS_HeizungSteuern() lässt sich ein Befehl in der Form von

Regler: VT=86,5°C SP=60°C Stopp=Nichts

erzeugen, der die Heizung direkt steuert. D.h. man „tut so“, als ob man selbst der Regler wäre. Damit kann man direkt die Vorlauftemperatur und/oder die Speichertemperatur steuern. Nur wird das nicht viel bringen, solange der Regler auch noch angeschlossen ist, denn der wird ein paar Sekunden später selbst so einen Befehl schicken und somit die gerade gesendeten Werte wieder überschreiben.

Daher müsste man entweder den Regler abklemmen oder ich mache es so, dass ich nicht die Therme direkt steuere, sondern die Soll-Raumtemperatur bzw. Soll-Speichertemperatur am Regler setze und dann den Regler weiterhin die Therme entsprechend steuern lasse.

Bei dem Befehl

Regler: VT=86,5°C SP=60°C Stopp=Nichts

sendet der Regler für VT bei mir immer entweder 0° (Heizung aus) oder 90° (Heizung ein). Die Heizung kürzt die angeforderten 90° dann auf die in der Heizung eingestellte Maximal-Vorlauftemperatur (Default 75° für Heizung und 80° für Warmwasser) herunter.

Hoffe, das macht Sinn.

lg
Thomas

Hallo Thomas,
vielen Dank für die Antwort. Übrigens Dein eBus Connector ist wirklich elegant programmiert und der php-Code zeugt auch von reichlich Erfahrung.

Ich werde mich mal mit der Raumtemperatur beschäftigen. Der Regler sitzt bei mir in dem Heizkessel im Heizungsraum. Die Regelung einer Raumtemperatur ist primär nicht nötig. Mir kommt es auf die Vorlauftemperatur an. Die einzelnen Räume werden mit Stellgliedern in den Etagenverteilern geregelt. Hinzu kommt, ich habe eine Fussbodenheizung mit Wärmetauscher um den Heizkessel von den Heizschlangen zu trennen. Dadurch bekommt der Heizkessel nicht richtig mit was der sekundäre Kreis für einen Wärmebedarf hat. Das äussert sich darin, dass der primäre Heizkreis des Kessels eine konstante Temperatur hat und der sekundäre Kreis in der Temperatur schwankt. Dies Verhalten ist an sich für die Funktion nicht besonders störend aber man muss sich darauf einstellen. Im Prinzip muss man mit dem Vorlauf des Heizkessels immer unter einer gewissen Grenze, abhängig vom Wärmebedarf, bleiben. Dies ist eben nicht optimal.

Da der Regler selber die nötige Vorlauftemperatur über Raumtemperatur - Soll/Ist und Aussentemperatur ermittelt, müsste das Setzen der Soll-Raumtemperatur genügen. Ggf. wäre dann noch die Steilheit der Heizkurve zu optimieren. Ich werde mal berichten.

Gruss Klaus.

Ah, verstehe - bei dir ist die Situation ganz anders, du hast ein Haus und deine Heizung ist außentemperaturgeführt. Ich habe eine Wohnung, wo der Thermostat über die Innentemperatur geht und daher gibt es bei mir nur Heizung an (90° VT) oder aus (0° VT).

Wie gesagt, direkt die Heizung und VT steuern geht prinzipiell, nur müsste man dafür den Regler abklemmen und überhapt alles über IPS steuern, wo dann die Frage ist, ob man dadurch nicht mehr verliert als gewinnt.

Man könnte natürlich, immer wenn der Regler eine VT anfordert, diese gleich überschreiben, nur ist die Frage, ob das auf Dauer der Heizung gut tut.

Daher vielleicht eben der Ansatz, versuchen mit den Parametern am Regler (wie z.B. Soll-Temperatur) zu spielen. Ansonsten gibt es aber sowohl am Regler, als auch auf der Heizung eine Reihe von sonstigen Einstellungen (z.B. Heizkurve, maximale Temperaturen usw.), die man auch noch probieren könnte (die sind in irgendwelchen Service-Menüs versteckt, können dort oder aber auch über den eBus gesetzt werden).

Nur so als Idee: Ich habe das bei mir über die Beeinflussung der Heizkurve gelöst. Falls IPS ausfallen sollte, kann man das schnell am Regler wieder korrigieren…

Ich habe seit gestern eine Vaillant Ecotec Plus mit E-Bus im Einsatz und suche nach einer Komplett Installation von einem Nutzer um nicht das Rad neu zu erfinden.

Es gibt in den verschiedenen Beträgen eine Reihe von Code Schnipsel aber meine Erachtens keine komplette Benchmark Installation. Wäre jemand vielleicht bereit mit Hilfe des Projekt Installer (Super Produkt von Raketenschnecke) seine funktionierende Instalation zu posten oder mir per PN zukommen zu lassen ?

Das würde die Qualität meines meine Wochenendes (und der folgenden) erheblich verbessern :slight_smile:

Falls ich dummerweise doch etwas im Forum übersehen habe was meinen Vorstellungen ungefähr entspricht wäre ich für einen Tipp sehr dankbar

Hallo Axel,
die Heizkurve dürfte für mich wohl auch der richtige Parameter sein.

In der AnalyseVaillant3.xls ist unter dem VRC430 die „HC1_HeatCurve“ mit Format „uint100“ aufgeführt und als Beispiel „1,5“. Wie hast Du den Wert kodiert/dekodiert?

Gruss Klaus.

Hallo,
ich habe die Daten der Heizkurve untersucht. Die Heizkurve hat beim VCR430 die Adresse 31, das Format war mir unbekannt. Deshalb hatte ich es erst einmal mit BYTE versucht.

 
'// Adressen und Formate von Datensätzen (hinzugefügte)
 Private Const EBUS_HEIZKURVE As String = "31"                        'aus AnalyseVaillant3.xls
 Private Const EBUS_HEIZKURVE_FORMAT As String = "BYTE"    'eigentlich uint100; Bsp: 1,5

Ich habe festgestellt das zwei Byte geliefert werden. Die Formate DATA2b und DATA2c passen hier nicht. Deshalb habe ich verschiedene Heizkurvenwerte manuell eingestellt und das Ergebnis ausgelesen.

Heizkurve    Bytes     Wert
0,20         14 00      20
0,75         4B 00      75
1,00         64 00     100
1,70         A9 01     170       !!!!
2,00         C8 00     200 
3,00         2C 01     300      
4,00         90 01     400

[INFO] [SENT] 00 15 B5 09 03 0D 31 00 7D 
[INFO] 00 15 B5 09 03 0D 31 00 7D 00 02 37 00 8D 
[INFO] Regler: REGLER_HEIZKURVE=55

Mit dem Format BYTE habe ich nur Werte unter 256 lesen können, das ist ja klar. Jedenfalls war es wichtig zu wissen das die Werte durch 100 zu teilen sind. Das Low-Byte ist an erster Stelle. Das High-Byte ist mit 256 zu multiplizieren und zum Low-Byte zu addieren.

Auf den Wert 170 bin ich auf Zufall gestossen, da dieser Wert bei mit eingestellt war. Ich hatte mich zuerst gewundert das der Wert 170 aus A9 + 01 zusammengesetzt worden ist. Jedoch war schnell klar das 170 dem Hexcode AA entspricht und der beim Einlesen eine Sonderbehandlung erfährt. Dies ist hinterher beim kodieren zu beachten.

Jedenfalls habe ich durch die Tests erfahren das für mich ein Wert von 0,6 schon ausreichend ist. Die Regelung reagiert auf kurzfristige Änderungen mit einem gewissen Überschwingen, das heisst der Wert „Regler VT“ pendelt sich erst nach einigen Minuten auf seinen Wert ein. Er schwankt dabei bis um +/- 1°C. Man muss also mit Änderungen behutsam vorgehen, sollte nur jeweils kleine Änderungsschritte vornehmen und danach bis zum nächsten Änderungsschritt einige Minuten warten. Ich denke die Vorgehen kommt der Regelung entgegen.

Wie ich schon einmal sagte, ich nutze die php-Scripte von Thomas Terényi, habe sie aber für VB.NET 2010 umgeschrieben.
Gibt es schon ein Format passend für die Daten der Heizkurve?

        '-----------------------------
        '	// DATA2h dekodieren (Heizkurve)
        '-----------------------------
        If (strFormat = "DATA2h") Then
            If (strHexString.Length <> 4) Then
                EBUS_LogFehler("Daten für Format " & strFormat & " ungültig: " & strHexString)
                Return ""
            End If

            strL = strHexString.Substring(0, 2)
            strH = strHexString.Substring(2, 2)

            If strL = "AA" Then
                Return CStr(170)
            Else
                Return CStr(CInt("&H" & strL) + (CInt("&H" & strH) * 256))
            End If
        End If

Gruss Klaus

Hi Klaus,

Hast du den Post weiter oben gesehen: http://www.ip-symcon.de/forum/showpost.php?p=178406? Glaube habe dort nur ein Byte beachtet, bei mir im System mittlerweile auch schon beide. Ich komme mit dem Exporter noch nicht klar und bin beruflich extremst eingespannt. Wenn’s passt versuche ich aber was zu posten.

Wird erst wieder wirklich wichtig in der Übergangszeit. Ich kann aus Vergleichswerten des Vorjahres aber bereits sehen, dass es sich für mich lohnt. Bei mir sind die baulichen Voraussetzungen dafür gegeben, dass dynamischer zu gestalten. Ist zwar alles einigermassen gut gedämmt, aber Anbei in Holzständerkonstruktion speichert auch nichts. Wer gar keine Dämmung hat, der sollte damit richtig Geld sparen können. Mir ist mittlerweile der Komfortgewinn wichtiger, jederzeit Wärme in gewünschter Schnelligkeit erzeugen zu können. Gilt auch für WW, welches ich nur zum Baden wirklich hochdrehen lasse.

Danke & Gruß, Axel

Das uint100 Format ist mir noch nicht untergekommen, sollte aber leicht zu implementieren sein:


// Beispiel für Eingabe
$HexString = "2C01";

// High und Low Byte an die richtige Stelle tauschen
$HexString = substr($HexString, 2, 2) . substr($HexString, 0, 2);

// Dekodieren und dividieren
$Wert = hexdec($HexString) / 100;

Achtung bzgl. A9! Das ist ein spezielles Parse-Zeichen und muss gleich beim Einlesen der Nachricht dekodiert werden (siehe dazu meine Funktion EBUS_NachrichtEinlesen), weil sonst fehlt dir beim Dekodieren des Werts ein Byte.

Z.B. Nachricht: … A9 01 02 … wird zu AA 02, was bei uint100 dem Wert 6,82 entsprechen würde. Ist jetzt vielleicht kein realistischen Beispiel, aber wenn du A9 01 gleich als AA einliest, vergisst du das High-Byte (auch wenn es in dem konkreten Fall wahrscheinlich eh immer 0 sein wird).

Hallo terenyi,
der Code ist wieder einmal optimal. Das genügt zum Dekodieren. Ich habe mir die Behandlung des AA beim Einlesen und beim Nachrichten erstellen angeschaut. Die Sonderbehandlung geschieht jeweils in dieser Ebene, so dass man auf höherer Ebene frei agieren kann.
Gruss Klaus.

Hallo Axel,
da Du nur die Heizkurve im Bereich 0,2 bis 0,4 veränderst genügt ja auch ein Byte beim Einlesen. Beim Schreiben müssten es aber schon zwei Byte sein. Das Schreiben wollte ich erst heute im Laufe des Tages testen.

Im Übrigen sehe ich das auch so, in den Übergangzeiten sind die Anforderungen an die Regelung anspruchsvoller. Vor gut 10 Jahren hatte ich eine Brennwertanlage eines anderen Herstellers die ich durch deren Tastenfeld mit Anzeige (2x16 Zeichen) fernsteuern konnte. Die Tastatur war nämlich über einen I2C-Bus mit der Steuerung verbunden und dort habe ich mich dann eingeklinkt. Zusätzlich habe ich mir über das Internet die Wettervorhersagen geholt und deren Werte ausgelesen. So konnte ich dann, wenn Sonne vorhergesagt wurde, das Aufheizen des Warmwasser unterbinden um so der Energie der thermischen Kollektoren Vorrang zu geben.

So etwas möchte ich jetzt ebenfalls umsetzen. Nur war seinerzeit die Analyse des HTML-Codes etwas mühsam. Daten in leicht lesbarer Form gibt es anscheinend auch heute noch nicht.

Gruss Klaus.

Hallo,
weiss jemand wie ich auf den Wasserdruck komme?

Abfrage

[SENT] 00 08 B5 09 03 0D 02 00 03 

Antwort

00 08 B5 09 03 0D 02 00 03 00 03 30 05 00 2E
oder auch
00 08 B5 09 03 0D 02 00 03 00 03 27 05 00 B7  

Der abgelesene Wert beträgt 1,3 Bar.

Gemäss AnalyseVaillant3.xls habe ich folgende Definition:

PressureSensor	
struct		
struct {float Pressure;State SensorState}  float has a resolution of 1/1000 sensor state is "Ok,Short circuit=85,cutoff=170"

Gruss Klaus.

Ich würde sagen, analog zu voher, nur durch 1000 dividieren:


// 00 08 B5 09 03 0D 02 00 03 00 03 30 05 00 2E
$HexString = "3005"; 

// High und Low Byte an die richtige Stelle tauschen 
$HexString = substr($HexString, 2, 2) . substr($HexString, 0, 2); 

// Dekodieren und dividieren 
$Wert = hexdec($HexString) / 1000;

30 05 -> 530h -> 1328 -> 1,328

Wer sucht der findet :slight_smile: http://www.ip-symcon.de/forum/threads/20547-eBus-Manager

Das ist genau das was mir gefehlt hat. Die SW von Terenyi kann ich nur jedem empfehlen der eine Vaillant über E-Bus zum laufen bekommen will

Hallo terenyi,
das könnte schon passen. In der Tat hatte ich mit dem Format für die Heizkurve einen Wert von 13,xx. Das wirke für mich jedoch wie zufällig, da ich mit dem "sensor state is „Ok,Short circuit=85,cutoff=170“ nicht so recht etwas anfangen kann. Hinzu kommt noch, der Wert besteht aus drei Byte.

Ich habe gerade mal nachgehen, die Wasserdruckanzeige alterniert zwischen 1,5 und 1,6 Bar. Mit dem Format für die Heizkurve erhalte einen Wert von 15,5. Also wären die ersten zwei Byte durch 1000 zuteilen. Das 3. Byte stand bisher immer auf 00. Das könnte das Statusbyte sein. Vielleicht ist der Vermerk „Ok,Short circuit=85,cutoff=170“ so zu interpretieren:

Ok = 0
Short circuit=85
cutoff=170

00 08 B5 09 03 0D 02 00 03 00 03 0E 06 00 4A 
[INFO] Heizung: HEIZUNG_WASSERDRUCK=15,5

Frage an die Profis

An welchem Stecker an der Therme habt Ihr eigentlich den EBUS Adapter angeschlossen ???

Ich nutze zur Zeit den Anschluss für externe Regler. Ich habe keine externe Steuerung und fahre meine Heizung indem IPS den Mischer zum Wärmetauscher ansteuert und die Umwälzpumpe an bzw. ausschaltet. Die Therme bemerkt das Wärme benötigt wird und schaltet ein bzw. aus. Vorlauf und Heiswasser stelle ich an den Drehknöpfen an der Therme ein.

Meine IPS Installation läuft insoweit als das ich aus IPS Daten an die Therme schicken und lesen kann und das in IPS mitverfolge. Die Therme reagiert allerdings auf keine Kommandos.

Der E-BUS Manager ist erfolgreich installiert aber auch hier keine Daten bis auf die (sich auch über die Zeit wechselnde) Statusanzeige des E-BUS Managers.

Jetzt vermute ich das die Therme irgendwie auf manuell steht oder ich vielleicht den falschen Stecker nutze. Alternativ würde sich z.B. der Anschluss auf der Platine für „Diagnosis über E-BUS VRDialog“ anbieten.

Ich weiss Ihr seit hier mit der Daten Analyse beschäftigt aber ein kleiner kurzer Hinweis würde mir sehr helfen :slight_smile:

Hi BestEx, die Beschriftung auf der Anschussklemme heisst bei mir „BUS“. Der „Diagnosis über E-BUS VRDialog“ Port braucht ja RJ11 oder 45 - der ist es nicht!