eBus Connector

Hallo zusammen!

Ich habe für mich einen eBus Connector entwickelt und dachte, ich stelle den mal hier rein - vielleicht kann den ja auch wer anderer brauchen.

Der eBus Connector funktioniert ähnlich zum eBus Adapter von Brownson (siehe hier), ist aber als externes Programm und nicht als IPS-Modul realisiert. Als IPS-Modul wäre zwar architektonisch schöner, ich habe nur leider kein Delphi und es hat als Nebeneffekt auch den Vorteil, dass das Programm so einerseits nicht für jede neue IPS-Version neu kompiliert werden muss und andererseits bei Bedarf auch unabhängig von IPS verwendet werden kann.

Mit dem eBus Connector können eBus Nachrichten über einen (virtuellen) COM-Port gelesen und synchronisiert geschrieben werden. Der Datenaustausch zwischen IPS und dem eBus Connector erfolgt via UDP. Ich habe hardwareseitig den „eBus-Koppler Ethernet“ von E-Service Online in Verwendung, welcher diesen virtuellen COM-Port zur Verfügung stellt und mit dem physischen eBus verbindet.

Hier die Details zum eBus Connector:

Funktionen

Lesen

[ul]
[li] Der eBus Connector liest die Daten vom COM-Port und fügt sie selbstständig zu vollständigen Nachrichten (jeweils abgeschlossen mit „AA“) zusammen.[/li][li] Sobald eine komplette Nachricht empfangen wurde, sendet der eBus Connector diese als UDP-Paket (als Hex-String) and den eingestellten Empfänger (z.B. IPS) weiter, wo die Nachricht dann verarbeitet werden kann.[/li][li] Leere Nachrichten bzw. Auto-SYN-Zeichen werden gefiltert und nicht weitergeleitet.[/li][li] Die Nachrichten werden so weitergeleitet, wie sie empfangen wurden, d.h. kein CRC-Check, keine Dekodierung oder Interpretation der Inhalte usw. - das bleibt der „Applikationsschicht“ (z.B. einem IPS-Skript) überlassen.[/li][li] Nachrichten die kürzer sind, als die Minimallänge von 6 Bytes (und daher definitiv ungültig sind) werden ignoriert und nicht weitergeleitet.[/li][/ul]
Schreiben

[ul]
[li] Der eBus Connector lauscht am eingestellten UDP-Port auf eingehende Pakete (bestehend aus jeweils einem Hex-String).[/li][li] Sobald ein UDP-Paket (z.B. kommend von IPS) mit einer Nachricht empfangen wurde, wird diese in eine Warteschlange gestellt.[/li][li] Sobald am eBus ein SYN-Zeichen empfangen wurde, wird die nächste wartende ausgehende Nachricht über den COM-Port auf den eBus geschrieben.[/li][li] Dadurch ist ein synchronisiertes Schreiben möglich, das Kollisionen vermeidet.[/li][li] Wie beim Lesen werden die Nachrichten 1:1 so auf den eBus geschrieben, wie sie an den eBus Connector gesendet wurden, d.h. auch hier keine CRC-Berechnung usw. (das muss ebenfalls schon vorher in der Applikationsschicht geschehen).[/li][li] Der eBus Connector lauscht während des Schreibens auf den Bus auf die selbst gesendeten Bytes. Sollten die empfangen Bytes nicht mit den gesendeten Bytes übereinstimmen, wurde eine Kollision erkannt und das Senden wird abgebrochen. Dadurch werden weitere Kollisonen vermieden. In diesem Zusammenhang empfiehlt es sich, eigene Nachrichten mit der Absenderadresse FFh zu verschicken (niedrigste Priorität am Bus und daher minimierte Gefahr, die anderen Teilnehmer am Bus durch Kollisionen „zu stören“).[/li][li] Konnte eine Nachricht auf Grund einer Kollision nicht gesendet werden, wird sie bei der nächsten Gelegeneheit automatisch erneut verschickt. Dies stellt sicher, dass die an den eBus Connector übergegebenen Nachrichten auch tatsächlich erfolgreich versendet werden.[/li][li] NEU: Da manche Leute anscheinend Probleme damit haben, kann die zuvor genannte „listen while sending“ Funktion auch abgeschaltet werden (Nachrichten werden als Ganzes versendet, ohne auf Kollisionen zu achten). Dafür bei der Konsolen-Applikation einfach den entsprechenden Switch (-lws) weglassen bzw. das Registry-File für den Windows-Service entsprechend anpassen.[/li][li] NEU: Zu Testzwecken kann die Zeit, die zum Versenden von einzelnen Nachrichten benötigt wird, in der Konsole angezeigt werden. Dafür bei der Konsolen-Applikation einfach den entsprechenden Switch (-sw) hinzufügen.[/li][/ul]
Einsatzweise

[ul]
[li] Konsolen-Applikation: Der eBus Connector kann in der Konsole ausgeführt werden, wo auch alle empfangenen und gesendeten Daten mitprotokolliert und angezeigt werden. Die nötigen Parameter werden über die Kommandozeile übergeben.[/li][li] Windows-Service: Der eBus Connector kann im Hintergrund als Windows Service ausgeführt werden. Meldungen werden ins Event-Log (Anwendungs-Log) geschrieben, jedoch nur Status- und Fehlermeldungen und nicht alle empfangenen und gesendeten Daten. Die nötigen Parameter sind in der Registry gespeichert.[/li][/ul]
Konsolen-Applikation

Der Aufruf der Konsolen-Applikation erfolgt folgendermaßen:

eBusConnectorConsole <SerialPort> <LocalUDPPort> <Host> <RemoteUDPPort> <-lws> <-sw>

Die Parameter sind:

[ul]
[li] SerialPort: Der COM-Port über den mit dem eBus kommuniziert wird.[/li][li] LocalUDPPort: Der UDP-Port an dem der eBus Connector nach zu sendenden eBus Nachrichten lauscht.[/li][li] Host: Der Host bzw. die IP-Adresse an den der eBus Connector empfangene eBus Nachrichten weiterleitet.[/li][li] RemoteUDPPort: Der zugehörige UDP-Port für das Weiterleiten von empfangenen eBus Nachrichten.[/li][li] -lws: Aktiviert die „listen while sending“ Funktion (optional).[/li][li] -sw: Aktiviert die Stopwatch-Funktion (optional).[/li][/ul]
Ein Aufruf könnte beispielsweise so aussehen:

eBusConnectorConsole COM10 8812 192.168.0.1 8813 -lws

Die Applikation läuft dann so lange, bis der Benutzer RETURN drückt.

Windows Service

Konfiguration

Als Erstes muss die Datei eBusConnector.reg bearbeitet werden, um dort die Einstellungen (unten fett markiert) gemäß der eigenen Wünsche anzupassen.


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\eBusConnector]

; The name of the serial port used to communicate with the eBus
"SerialPort"="[b]COM10[/b]"

; The local UDP port to listen on for commands
"LocalUDPPort"="[b]8812[/b]"

; The remote host to send the results to
"RemoteHost"="[b]192.168.0.1[/b]"

; The remote UDP port to send the results to
"RemoteUDPPort"="[b]8813[/b]"

; Enable (1) or disable (0) the listen while sending function
"ListenWhileSending"=dword:[b]1[/b]

; Uncomment to enable delayed autostart to allow the virtual serial port service to start first
; "DelayedAutoStart"=dword:1

Installation

Danach muss der eigentliche Dienst installiert werden. Dies kann mit dem mitgelieferten Batch-Skript gemacht werden:

"Install Service.bat"

Die Installation muss mit Admin-Rechten ausgeführt werden!

Das Skript macht nichts anderes, als den Dienst mittels InstallUtil.exe aus dem .NET-Framework zu installieren

C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe eBusConnectorService.exe

danach die Einstellungen in die Registry zu schreiben

regedit /s eBusConnector.reg

danach den Dienst vom Virtual Serial Port Service abhängig zu machen (diese Zeile entfernen bzw. anpassen, sollte kein bzw. ein anderslautender Dienst dafür verwendet werden)

sc config eBusConnector depend=sec_service

und letztendlich den Dienst zu starten

net start eBusConnector

Der Dienst ist dann standardmäßig auf verzögerten automatischen Start eingestellt.

De-Installation

Der Dienst kann bei Bedarf wieder per Batch-Skript deinstalliert werden:

"Uninstall Service.bat"

Dieses Skript verwendet wiederum InstallUtil.exe zum Deinstallieren:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -U eBusConnectorService.exe

IPS-Konfiguration

Um den eBus Connector in IPS zu verwenden, müssen lediglich ein UDP Socket und eine zugehörige Register Variable angelegt und mit den entsprechenden Port-Nummern konfiguriert werden.

UDP Socket.png

Die vom eBus gelesen Daten können dann im Ziel-Skript der Register Variable verarbeitet werden:

$eBusMessage = $_IPS['VALUE'];

Um Daten auf den eBus zu schreiben, müssen sie einfach über den UDP Socket gesendet werden:

USCK_SendText(36211, "10 08 B5 12 02 00 00 CA");

Anbei befinden sich sowohl das fertig kompilierte Tool, als auch dessen Source-Code (C# für .NET 2.0, geschrieben mit Visual Studio 2005).

Falls wer dieses Tool gebrauchen kann, freue ich mich über Feedback!

Viel Spaß damit und noch einen guten Rutsch!

eBus Connector v1.3 Source.zip (13 KB)

eBus Connector v1.3.zip (11.9 KB)

Hi terenyi,

großartig - genau was ich gesucht habe! Hab’s bereits angetestet, bis jetzt funkioniert alles wie gewünscht.

Danke G gruß, Axel

Hi terenyi,

ich bekomme jetzt lesend alls in IPS - und das ohne mein Log sekündlich zuzumüllen. Tolle Arbeit!

Ich kann aber noch nicht senden - bekomme immer „:slight_smile: :ALID MESSAGE: ? :heart:“. Kannst du mal ein Beispiel für eine beliebige Message + CRC-Berechnung durchgeben?

Danke & Gruß, Axel

Hallo!

Der eBus Connector macht keine CRC-Checks oder dergleichen, sondern prüft nur den via UDP empfangenen Hex-String (ASCII) auf formale Korrektheit. „INVALID MESSAGE“ kommt dann, wenn die Anzahl der Zeichen (nachdem alle Leerzeichen rausgelöscht wurden) im String ungerade ist (da zwei Zeichen pro Byte erwartet werden, d.h. ggf. sind führende Nullen nötig, also z.B. „0A“ und nicht nur „A“) oder wenn ein anderes Zeichen als 0-9 oder A-F vorkommt.

Ein funktionierender String ist z.B. wie im Beispiel oben:

USCK_SendText(36211, „10 08 B5 12 02 00 00 CA“);

Wenn das immer noch nicht funktioniert, dann könnte es vielleicht ein Problem mit der Zeichenkodierung im String sein?

Grüße!

Danke - so geht’s. Stelle gerade alle meine Skripte um. Tolle Sache!

Freut mich zu hören, dass es funktioniert!

Moin terenyi,

dein Controller läuft bei mir seit ein Paar Tagen sorgenfrei.

Jetzt habe ich Appetit auf mehr und folgende Feature Requests:

  • eBus Messages vor Weitergabe per UDP an IPS auf Korrecktheit prüfen (CRC)
  • Sendepuffer für B509 (wenn kein ACK mit 00 00 00, dann x-mal erneut senden)
  • CRC an zu Sendende Messages hängen

Meinst du, das liesse sich realisieren?

Danke & Gruß, Axel

Hallo!

All diese Dinge habe ich bereits implementiert, jedoch als IPS-Skripte. Ich bin fast fertig und werde meine Skripte demnächst posten. Hier aber schon mal ein Preview, wo du dann die gewünschten Funktionen findest, sobald ich alles hochgeladen habe:

eBusManager.php --> EBUS_NachrichtEinlesen($HexString)

Macht die ganze Dekodierung (Nachricht in Teile zerlegen, CRC prüfen, A9 dekodieren usw.). Probier dann z.B. mal

print_r(EBUS_NachrichtEinlesen("10 08 B5 11 01 01 89 00 09 5E 50 00 80 FF 88 01 00 FF C1 00"));

dann siehst du, wie es funktioniert.

eBusSender.php → EBUS_ReglerWertSetzen($Adresse, $Wert)

Schaut nicht nur, ob der Befehl zum Setzen bestätigt wurde, sondern setzt den Wert, wartet kurz, liest ihn wieder aus und prüft, ob es zusammenpasst. Wenn nicht, wird es x Mal neu versucht.

eBusManager.php → EBUS_NachrichtErstellen($QQ, $ZZ, $PB, $SB, $Daten)

Erstellt die Nachricht anhand der gegebenen Parameter (zählt die Datenbytes, berechnet den CRC, kodiert A9 usw.). Mit

print EBUS_NachrichtErstellen("00", "15", "B5", "09", "0D 80 00");

solltes du sehen, was es macht.

Bin gespannt!

Zur Info:

Ich habe jetzt eine neue Version 1.1 hochgeladen (im ersten Post). Zum Update einfach Service bzw. Konsolen-Tool stoppen, EXE-Dateien ersetzen und Service / Konsolen-Tool neu starten.

In der alten Version hatte ich nach einem SYN zuerst die empfangene Nachricht weitergeleitet und dann erst die Sende-Warteschlange abgearbeitet, wodurch aber Zeit verloren geht, in der eventuell schon jemand anderer zu senden beginnt, wodurch es zu einer Kollision kommen kann.

Ich habe das jetzt umgedreht, sodass zuerst gesendet wird. Ich habe die neue Version zwar erst kurz am Laufen, aber es scheint so, als ob die Fehlerrate ziemlich nach unten gegangen ist.

Hi terenyi,

installiert, läuft und bringt bessere Ergebnisse :slight_smile:

Danke & Gruß, Axel

Wow … jetzt brauche in aber ganz schnell einen eBus Adapter. :slight_smile:
Klasse Arbeit !!!

Vielen Dank !!! Mein eBus Adapter „rockt“ jetzt mit den Daten von meiner Wolf Gastherme.
Absolut geniales Tool und super Beschreibung. In nur wenigen Minuten konnte ich alles Erfolgreich einstellen.

Jetzt muß ich nur noch das Protokoll irgendwie verstehen. :confused:

Och, hat mich nur ein Jahr beschäftigt. Durchbruch kam, als jemand den Adapter und Software des Herstellers mit USBalyzer belauscht hatte, dann konnte man sich ganz schnell einReim drauf machen. Ich finde sowas macht spaß :slight_smile:

Du hast nicht zufällig eine Wolf Gastherme??? :wink:

Da ich ja auch ein Bedienterminal auf dem eBus habe war meine Idee dort die gewünschten Werte abzufragen und mit dem USB Adapter die Anfrage als auch Antwort von der Therme zu loggen.
Sollte so doch funktionieren … oder? Bin für jeden Tipp dankbar.

Hi mr_cg, ich habe eine Vaillant. Dein Ansatz klingt aber gut - wir haben am Ende mit dem Original-Adapter von Vaillant auch nichts anderes gemacht…

Viel Glück!

Sollte (mit etwas Mühe) prinzipiell für alle Daten funktionieren, die zwischen Therme und Regeler ausgetauscht werden. Interessanter wird es, wenn man Daten auslesen will, die nur am Regler gespeichert sind und normal nicht über den Bus geschickt werden.

Habe gerade den eBus Connector auf v1.2 upgedated (siehe erster Post). Die Neuerungen:

[ul]
[li] Empfangen: Nachrichten die kürzer sind, als die Minimallänge von 6 Bytes (und daher definitiv ungültig sind) werden ignoriert und nicht weitergeleitet.
[/li][li] Senden: Der eBus Connector lauscht während des Schreibens auf den Bus auf die selbst gesendeten Bytes. Sollten die empfangen Bytes nicht mit den gesendeten Bytes übereinstimmen, wurde eine Kollision erkannt und das Senden wird abgebrochen. Dadurch werden weitere Kollisonen vermieden. In diesem Zusammenhang empfiehlt es sich, eigene Nachrichten mit der Absenderadresse FFh zu verschicken (niedrigste Priorität am Bus und daher minimierte Gefahr, die anderen Teilnehmer am Bus durch Kollisionen „zu stören“).
[/li][li] Senden: Konnte eine Nachricht auf Grund einer Kollision nicht gesendet werden, wird sie bei der nächsten Gelegeneheit automatisch erneut verschickt. Dies stellt sicher, dass die an den eBus Connector übergegebenen Nachrichten auch tatsächlich erfolgreich versendet werden.
[/li][li] Installer: Der Starttyp des Diensts wurde von „Automatisch (Verzögert)“ auf „Automatisch“ geändert, dafür wurde der Dienst vom Virtual Serial Port Service abhängig gemacht, um sicherzustellen, dass dieser läuft, bevor der eBus Connector gestartet wird.
[/li][/ul]

Durch diese Neuerungen ist das Versenden von Daten verlässlicher und die Fehlerrate beim Empfangen konnte bei mir halbiert werden.

@terenyi

Schönes Tool, herzlichen Dank. Ich habe nach einigem Nachdenken das ganze installieren können (Bin etwas aus der Übung mit UDP, virtueller COM etc.)
Im Moment nutze ich die Konsole. Ich habe zwar das Registry entsprechend angepasst und die install routine für den Service als Administrator laufen lassen, konnte aber den Dienst trotz reboot nachher nicht finden (Der müsste doch unter Dienste mit dem Namen „Ebusconnect“ gelistet werden oder ?)

Wird ein Logfile bei der Installation des Services erzeugt ? und wo finde ich das ?

Ja, der Dienst müsste in der Services-Konsole (services.msc) unter „eBus Connector“ in der Liste sein. Dafür muss man dort lediglich Refresh drücken, ein Neustart ist nicht notwendig.

Bei der Installation werden einerseits Meldungen in die Konsole ausgegeben, andererseits sollte es im gleichen Verzeichnis dann die Log-Files geben (.InstallLog und .InstallState).