EMS-Bus

EMS steht für "Energie-Management-System" und ist eine Bus-Kommunikation für Heizungssysteme. Mein Buderus-Gas-Brennwertgerät Logamax plus verfügt über eine EMSplus-Schnittstelle (zweite Generation EMS-Bus) und kommuniziert darüber mit der Bedieneinheit Logamatic RC300. Ich wollte die Daten, die in der RC300 dargestellt sind, in mein SmartHome-Projekt einbinden.

Der EMS-Bus ist auf vielen Seiten ganz gut beschrieben, manchmal aber auch etwas verwirrend. Vor allem habe ich kein (einfaches) Python-Script gefunden, um die Informationen vom EMS-Bus beispielhaft auslesen zu können. Daher beschreibe ich hier kurz meinen Aufbau mit einem Raspberry Pi.

Der EMS-Bus ist ein serieller Zwei-Leiter-Bus und versorgt die daran angeschlossenen Geräte auch mit Spannung. Die Spannungspegel liegen bei mir zwischen 10 (low) und 15 VDC (high). Zum Anschluss an einen Raspi benötigt man also einen Pegelwandler. Hierfür findet man viele Anleitungen, die mir teilweise relativ kompliziert erschienen. Ich habe für meinen ersten Prototyp einen sehr einfachen Aufbau nach folgenden Anleitung gewählt: Junkers HT-Bus Heatronic 3 Schnittstelle. Im Beitrag von IngoF ist ein Schaltplan mit Komperator LM393N dargestellt. Ich verwende das IC LM339. Außerdem nutze ich im Moment nur das RX-Signal, da ich vom EMS-Bus lediglich lesen möchte, und (noch) nicht darauf schreiben (TX). Ansonsten ist der Aufbau identisch. Diese Schaltung wandelt den Pegel vom EMS-Bus (im Bild oben) in ein sauberes 5-Volt-Pegelsignal um (im Bild unten). Dazu habe ich die beiden EMS-Bus-Signalleitungen einfach parallel zu den anderen EMS-Geräten (in meinem Fall lediglich Logamatic RC300) direkt am Brennwertgerät angeschlossen.

Oszi-Darstellung EMS-Bussignal


Mit diesem auf 5-Volt-Pegel gewandelten Signal gehe ich dann direkt auf den RXD-Pin (GPIO 15, PIN 10) des Raspi. Mein erster Prototyp an einem Raspberry Pi B+ sah dann so aus:

erster Prototyp EMS-Bus mit Pegelwandler am Raspberry Pi


Der zweie Prototyp auf einer kleinen Platine sieht im Moment so aus und ist an einen Raspberry Pi A+ (mit WLAN) angeschlossen:

zweiter Prototyp EMS-Bus mit Pegelwandler am Raspberry Pi


Mit diesem simplen Aufbau kann nun der EMS-Bus ausgelesen werden. Das EMS-Telegramm ist auf dieser Seite gut beschrieben: EMS-Telegramm

Basierend auf dieser EMS-Telegramm-Beschreibung habe ich den Python-Code readEMS.py zum Auslesen des EMS-Bus erstellt. Damit erhält man dann zum Beispiel folgende Ausgabe (eine Zahl ist ein hex-Byte OHNE 0x, weil das aus meiner Sicht besser lesbar ist):

Ausgabe Python-Code readEMS.py


Das Python-Script wertet (die mir bekannten) Botschaften aus und stellt die Werte mit Beschreibung unterhalb der Botschaft dar. Zu jeder Botschaft werden im Verzeichnis /var/www/html/ XML-Dateien erstellt, die dann von einem beliebigen Rechner in Netzwerk ausgewertet werden können. Die Datei UBAMonitorFast.xml sieht zum Beispiel so aus:
<EMSRaspi>
 <UBAMonitorFast>
  <data name="timestamp" value="2017-09-11 23:22:55" valueunit="YYYY-MM-DD hh:mm:ss"/>
  <data name="T_feed_set" value="29" valueunit="degC"/>
  <data name="T_feed_act" value="25.4" valueunit="degC"/>
  <data name="P_heater_max" value="100" valueunit="%"/>
  <data name="P_heater_act" value="0" valueunit="%"/>
  <data info="Gasarmatur EIN/AUS" name="Valve_gas" value="0" valueunit="on/off"/>
  <data info="Geblaese EIN/AUS" name="Blower" value="0" valueunit="on/off"/>
  <data info="Zuendung EIN/AUS" name="Ignition" value="0" valueunit="on/off"/>
  <data info="Kesselkreispumpe EIN/AUS" name="Pump_heater" value="1" valueunit="on/off"/>
  <data info="3-Wege-Ventil auf Warmwasser" name="Valve_WW" value="0" valueunit="on/off"/>
  <data info="Zirkulation EIN/AUS" name="Circulation" value="0" valueunit="on/off"/>
  <data name="I_flame" value="0.0" valueunit="10-6 Amp"/>
  <data name="T_intake_air" value="2124.8" valueunit="degC"/>
 </UBAMonitorFast>
</EMSRaspi>

Dieser Python-Code ist ein erster Schritt und wird sicher noch erweitert werden. Einige Parameter sind noch nicht OK, zum Beispiel die Ansauglufttemperatur. Die meisten Parameter sind aber stimmig und werden auch auch auf der Bedieneinheit Logamatic RC300 so dargestellt. Via erstellter XML-Dateien frage ich die Daten von einem anderen Raspberry Pi ab und speichere alles in einer MySQL-Datenbank.

Auf meinem EMS-Bus kommen viele Botschaften, die aus meiner Sicht keinen Sinn ergeben. Am häufigsten kommmt die Hex-Zeichenfolge 0x89 00 09 00, zweit-häufigste Hex-Zeichenfolge ist 0x90 00 10 00. Code-Mitschnitte anderer EMS-Botschaften in diversen Foren zeigen dieselben Zeichenfolgen, werden aber nicht näher erläutert. Irgendeinen Sinn scheint das also zu haben.

Der komplette Zahlensalat wird von dem Python-Script in der Datei out.dat abgelegt. Bekannte Botschaften werden ausgefiltert, mit einem Zeitstempel versehen und als bekannte Botschaft rausgeschrieben. Alle unbekannte Zeichenfolgen werden einfach rausgeschrieben. Um den Überblick nicht zu verlieren werden Zeichenfolge 0x89 00 09 00 als Punkt und die Zeichenfolge 0x90 00 10 00 als Komma geschrieben. Mit dieser Datei kann man versuchen, die unbekannten Botschaften auf dem Bus zu entziffern.

Unregelmäßig dazwischen kommen Zeichenfolgen mit zwei Byte, wobei das zweite Byte immer 0x00 ist. Das erste Byte scheint ein Zähler zu sein, der bei 0x8A (dezimal 138) startet und (häufig, aber nicht immer) bis 0xEF (dezimal 239) hochzählt, um dann wieder bei 0x8A neu zu starten. Häufig werden einzelne Werte dazwischen übersprungen. Auch diesen Sinn habe ich noch nicht verstanden.