Benutzer-Werkzeuge

Webseiten-Werkzeuge


ebus:ebusconnector

Was ist der eBus-Connector?

Die Software dient zum Auslesen und Speichern der Daten, welche über den eBus übertragen werden. Dabei können die Services in der Konfigurationsdatei frei festgelegt werden wodurch eine Anpassung an jegliche im Standard definierten oder herstellerspezifischen Datendefinitionen möglich ist. Die Festlegung der Datenspeicherung geschieht ebenfalls über die Konfigurationsdatei. Dort werden die SQL-Befehle festgelegt wodurch eine Anpassung an jegliche SQL-fähige Datenbank möglich ist.

Welche Voraussetzungen sind zum Betrieb des eBus-Connectors notwendig?

Hardware

Da der eBus zwar auf dem RS232-Protokoll basiert aber mit unterschiedlichen Pegeln arbeitet, ist ein Konverter notwendig. Dafür gibt es Schaltpläne für den Elektronik-Bastler (siehe unter EBusKonverter).

Natürlich ist dann noch ein PC zur Ausführung der Software notwendig :)

Software

Der eBus-Connector ist abWindows XP lauffähig, wobei ich Windows 7 noch nicht getestet habe, sollte aber kein Problem sein (Tester gesucht). Zum Speichern der Daten ist ein ODBC- oder OLEDB-Treiber für Windows notwendig. Dieser ist für MS-Access im Betriebssystem bereits inkludiert.

DownloadEBusConnector

Für Linux gibt es den LinuxKonnektor von Main.FrankWeis als Perl-Script zum download.

Wie wird eBus-Connector konfiguriert?

Die Konfiguration erfolgt ausschließlich über die Datei eBusConnector.ini. Dabei handelt es sich um eine Textdatei im Windows-INI Format und kann mit einem jedem beliebigem Texteditor editiert werden. (Mein Favorit ist Notepad++)

Fertige Konfigurationen

Derzeit gibt es Konfigurationsdateien für Wolf Solarregler SM1 und Kaskadenmodul KM und Speicherung in einer Access-Datei. Diese Konfiguration inklusive grafischer Auswertung ist im Downloadpaket bereits enthalten.

Für Vaillant sind Konfiguration und Datenbank im Unterverzeichnis „Vaillant“ enthalten. Diese beiden Dateien müssen ein Verzeichnis tiefer kopiert werden.

Datenbankverbindung (Gruppe [Db])

Hier wird der Datenbanktreiber angegeben. Beispiele dazu siehe www.connectionstrings.com

Beispiel für MS-Access:

Connection=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=eBus.mdb
User=
Pwd=?
Provider=MSDASQL

Beispiel für MySQL:

Connection=Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=ebus;Option=3
User=ebus
Pwd=?
Provider=MSDASQL

Schnittstellenparameter (Gruppe [eBusCom])

Hier wird die zu verwendende serielle Schnittstelle festgelegt. In diesem Beispiel Com3. Die restlichen Parameter sind auf den eBus-Standard abgestimmt und sollten keine Änderung benötigen.

ComNum=3
Baudrate=2400
FlowCtrl=0
LineCondFlags=0
RxCharWait=3000

Grundkonfiguration

Datentypen

Type Bereich Defaultwert
einfach:
char FF
signed char 80
signed int 8000
word FFFF
komplex:
bcd 0-99 FF
data1b -127-127 80
data1c 0-100 0,5FF
data2b -127,99-127,99 1/256 8000
data2c -2047,9-2047,9 1/16 8000
data2d -3276,6-3276,6 1/10 8000
spezial:
Flags Daten werden als Binärstring ausgegeben
Text( Anzahl ) Daten werden als Text umgewandelt
hex( Anzahl ) erzeugt einen Hexstring der angegebenen Anzahl Bytes als String ( z.B. „01 02 03“)
text( Anzahl ) Wandelt Daten in Text um. Wird z.B. in Service FE01 (Fehlernachricht) verwendet.
SubService Gibt an, dass der Inhalt dieses Feldes ein Subservice definiert
Analyze( Anzahl ) Dient zur Analyse von unbekannten Befehlen. Es wird der Datenblock in definierter Länge mit allen einfachen und komplexen Datentypen angezeigt. So können gültige Werte einfacher aufgespürt werden.

Grundparameter (Gruppe [eBusConnector])

Parameter Beschreibung
LogLevel Legt fest, welche Informationen geloggt werden sollen.
Kombination folgender Werte ist möglich:

LOG_ERROR 0x0001
LOG_UNDEFINED 0x0002
LOG_SQL 0x0004
LOG_INFO 0x0008
LOG_ALL_INPUT 0x0010 → erstellt „eBusIn.dat“ mit allen vom eBus gelesenen raw-Daten
LOG_CHECK 0x0020
LOG_READ 0x0040
LOG_UNSAVED 0x0080
LOG_READ_ERROR 0x0100
LOG_VALUES 0x0200 → erstellt .cvs-Dateien mit gelesenen Daten lt. Definition
ServiceDef Beschreibt in dieser Gruppe den Aufbau des Headers bis einschließlich Datenlänge
Use Gibt an, welche Befehle definiert und für die Weiterbearbeitung verwendet werden sollen. Die Definition beginnt bei der Gruppe [eBusConnector] und geht bei jedem mit „Use“ angeführten Befehl weiter. Es kann beliebig weiterverzweigt werden.

Servicedefinition (Gruppen [nnnn] oder [nnnn:ss])

Dabei gibt nnnn die Hex-Representation des Primär- und Sekundärbefehls an und ss das Subservice (welches beliebig wiederholt werden kann, da jedes Subservice wiederum Subservices enthalten kann)

Parameter Beschreibung
ServiceDef Definition der Datenstruktur ab hier in der Form Feldname=Datentype | Feldname2=Datentype2 [|...]
Check SQL-Statement, welches prüft, ob die Daten verarbeitet werden müssen. Es wird nichts bearbeitet, wenn Recordset mit 0 Datensätzen oder 1.Feld des 1.Datensatzes den Wert 0 enthält. Damit sind Prüfungen möglich in der Form von Berechnungen oder in Abhängigkeit von anderen Werten in der Db.
MinInteral Mindestzeit zwischen zwei Ausführungen Beispiele: (Werte ohne Anführungszeichen eintragen)
„80 s“ → 80 Sekunden
„1 h“ → eine Stunde
„2 d“ → 2 Tage
„1500“ → 1500 millisekunden ( 1,5 Sekunden)
„1 d 5 h 30 m“ → Kombination der Werte möglich
CheckChanges entweder „sql“, wenn der komplette erzeugte SQL-Befehl unterschiedlich sein muss oder Felder, welche unterschiedlich sein müssen. z.B.: %From%!%To%. Damit wird erreicht, dass nur geänderte Daten gespeichert werden.
CheckMode Kann den Wert AND oder OR haben. Defaultwert AND bedeutet, dass MinInterval und CheckChanges zutreffen müssen um eine Aktion durchzuführen. Bei OR wird der Satz bearbeitet, wenn entweder MinInterval erreicht oder CheckChanges zutrifft.
SUBSERVICEDEFINITION: Wird ein Feld als „SubService“ definiert, dann legt der Feldinhalt das zu verwendende SubService fest. Es muss wieder mit Use= festgelegt werden, welche Subservices bearbeitet werden sollen. Der Gruppenname für die Definition wird entsprechend erweitert (siehe Service [0503] ; In jedem SubService kann auf die Variablen der darüberliegenden Definitionen zugegriffen werden. Das gilt auch für die globalen Variablen des Headers, welche in der Gruppe [eBusConnector] definiert werden.

Wie beginnen...

Um einfach alle Daten anzuzeigen welche am eBus transportiert werden, können einfach die Use-Einträge in der Gruppe [eBusConnector] auskommentiert werden und der Eintrag LogLevel auf 0x0241 setzen.

Unknown Service 0700 read: 30 FE 07 00 09 00 80 10 43 21 FF FF 03 FF FB

Dann können die benötigten Servicedaten mit Use eingehängt und noch nicht definierte Services auf Grund der Dokumentation definiert werden (siehe Servicedefiniton). In obigem Beispiel ergibt sich folgende Definiton:

QQ 30
ZZ FE Broadcast
PB 07 Primärbefehl
SB 00 Sekundärbefehl
LL 09 Datenlänge
00 80 Außentemperatur (data2b, 1/256)
10 Sekunden (BCD)
43 Minuten (BCD)
21 Stunden (BCD)
FF Tag (BCD)
FF Monat (BCD)
03 Wochentag (BCD)
FF Jahr (BCD)
FB Prüfziffer
[eBusConnector]
Use=0700

[0700]
ServiceDef=AussenTemp=data2b | Sekunden=bcd | Minuten=bcd | Stunden=bcd | Tag=bcd | Monat=bcd | Wochentag=bcd | Jahr=bcd
; Anzeige der Daten
Sql=Select 'AussenTemp: %AussenTemp%', 'Zeit: %Stunden%:%Minuten%:%Sekunden%', 'Datum: %Tag%.%Monat%.%Jahr%', 'WochenTag: %Wochentag%'
MinInterval=1 m

Im obigen Beispiel werden keine Daten gespeichert, sondern nur angezeigt. Sollen diese Daten gespeichert werden, dann muss zuerst in der Datenbank ein entsprechendes Datenfeld dafür vorhanden sein. Ist das nicht der Fall, dann zuerst ein entsprechendes Datenfeld in der Datenbank anlegen.

eine weitere Möglichkeit ist die Verwendung der Analysefunktion:

Dazu sind die zu analysierenden Services mit dem Typ „analyze“ zu definieren und der LogLevel auf LOG_VALUES gestellt werden.

[eBusConnector]
LogLevel=0x0347

Use=0700

[0700]
ServiceDef=analyze(9)

Nun wird eine Datei mit dem Namen „0700.cvs“ erstellt welche alle möglichen Werte der verschiedenen Datentypen aller gelesenen Servicedaten enthält. Da können schon große Datenmengen zustande kommen!

Habe ich nun durch die Analyse der cvs-Datei herausgefunden (das geht sehr gut mit der grafischen Darstellung der Daten in Excel und die Verwendung der Filterfunktion) welche Daten an bestimmten Stellen enthalten sind, dann kann die Servicedefinition erweitert werden. Dadurch entstehen weniger Analysedaten.

[eBusConnector]
LogLevel=0x0347

Use=0700

[0700]
ServiceDef=AussenTemp=data2b | analyze(7)

Natürlich kann diese Funktionalität auch genutzt werden, um sämtliche gelesenen Daten welche von Interesse sind in csv-Dateien zu speichern und in anderen Programmen weiterzuverarbeiten.

Beispieldatei:

Mit dieser Datei logge ich die Daten meiner Wolf Solaranlage (SM1) und Wolf Regler (KM1) und speichere alle 20 Minuten einen Datensatz für spätere Auswertungen und grafische Darstellung.

; Datenbankanbindung
; Sollte keine Access-MDB verwendet werden, dann hier den Connectionstring eintragen
; (siehe www.connectionstrings.com)
[Db]
Connection=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=eBus.mdb
User=
Pwd=?
Provider=MSDASQL

;
; Schnittstelleneinstellungen
;
; ComNum legt fest, an welcher seriellen Schnittstelle der Konverter angeschlossen ist.
; die anderen Einstellungen sollten für eBus passen und sollten nicht geändert werden.
[eBusCom]
ComNum=3
Baudrate=2400
FlowCtrl=0
LineCondFlags=0
RxCharWait=3000

;
; Daten aus Datei einlesen
; Der Parameter CharDelay kann gesetzt werden, um das Einlesen der Daten zu verzögern. Das ist dann nützlich,
; wenn Timestamps als Keyfelder verwendet werden. Bei 0 werden die Daten ohne Verzögerung gelesen.
[eBusFile]
InputFile=eBusIn.dat
CharDelay=1

;
; Konfiguration eBUS-Connector: Services und Datenstrukturen
;
; 
; Servicedefinition:
; Parameter:
; ServiceDef= Definition der Datenstruktur in der Form Feldname=Datentype | Feldname2=Datentype2 [|...]
; Check= SQL-Statement, welches prüft, ob die Daten verarbeitet werden müssen.
; Es wird nichts bearbeitet, wenn Recordset mit 0 Datensätzen oder 1.Feld des 1.Datensatzes den Wert 0 enthält.
; Damit sind Prüfungen möglich in der Form von Berechnungen oder in Abhängigkeit von anderen Werten in der Db.
; MinInteral= Mindestzeit zwischen zwei Ausführungen
; Beispiele: (Werte ohne Anführungszeichen eintragen)
; "80 s" -> 80 Sekunden
; "1 h" -> eine Stunde

; "2 d" -> 2 Tage
; "1500" -> 1500 millisekunden ( 1,5 Sekunden)
; "1 d 5 h 30 m" -> Kombination der Werte möglich
; CheckChanges entweder "sql", wenn der komplette erzeugte SQL-Befehl unterschiedlich sein muss oder Felder,
; welche unterschiedlich sein müssen. z.B.: %From%%To%. Damit wird erreicht, dass nur geänderte Daten
; gespeichert werden.
; CheckMode= Kann den Wert AND oder OR haben. Defaultwert AND bedeutet, dass MinInterval und CheckChanges zutreffen müssen
; um eine Aktion durchzuführen. Bei OR wird der Satz bearbeitet, wenn entweder MinInterval erreicht oder
; CheckChanges zutrifft.
; 
; Use= Gibt an, welche Befehle definiert und für die Weiterbearbeitung verwendet werden sollen.
; Die Definition beginnt bei der Gruppe [eBusConnector] und geht bei jedem mit "Use" angeführten Befehl
; weiter. Es kann beliebig weiterverzweigt werden. 
;
; DATENTYPEN:
; alle in der Spezifikation beschriebenen Datentypen:
; einfach: Bereich Auflösung Defaultwert
; char FF
; signed char 80
; signed int 8000
; word FFFF
; komplex:
; bcd 0-99 FF
; data1b -127-127 80
; data1c 0-100 0,5 FF
; data2b -127,99-127,99 1/256 8000
; data2c -2047,9-2047,9 1/16  8000
; data2d -3276,6-3276,6 1/10  8000
; spezial:
;   Flags               Daten werden als Binärstring ausgegeben
;   Text( Anzahl )      Daten werden als Text umgewandelt; hex( Anzahl ) erzeugt einen Hexstring der angegebenen Anzahl Bytes als String ( z.B. "01 02 03")
; SubService Gibt an, dass der Inhalt dieses Feldes ein Subservice definiert
;
; SUBSERVICEDEFINITION:
; Wird ein Feld als "SubService" definiert, dann legt der Feldinhalt das zu verwendende SubService fest.
; Es muss wieder mit Use= festgelegt werden, welche Subservices bearbeitet werden sollen. Der Gruppenname für die
; definition wird entsprechend erweitert (siehe Service [0503]
; In jedem SubService kann auf die Variablen der darüberliegenden definitionen zugegriffen werden.
; Das gilt auch für die globalen Variablen des Headers, welche in der Gruppe [eBusConnector] definiert werden.
;
[eBusConnector]
CommType=$COMMTYPE$

; Loglevel: Kombination folgender Werte (Beginn mit 0x... für Hex-Wert, 0... für Octal)
; LOG_ERROR          0x0001        -> Fehler generell
; LOG_UNDEFINED      0x0002        -> undefinierte Services
; LOG_SQL            0x0004        -> SQL-Befehle
; LOG_INFO           0x0008        -> Info-Meldungen
; LOG_ALL_INPUT      0x0010        -> erstellt "eBusIn.dat" mit kompletten Input vom eBus
; LOG_CHECK          0x0020        -> Prüfungen für Ausführung von SQL-Befehlen
; LOG_READ           0x0040        -> gelesene Services
; LOG_UNSAVED        0x0080        -> nicht gespeicherte Services
; LOG_READ_ERROR     0x0100        -> Daten bei Lesefehler (CRC-, ACK- od. Längenfehler)
; LOG_VALUES         0x0200        -> Werte loggen (Rechenintensiv, nur für Analyse verwenden!)
LogLevel=0x0107
; Header: QQ ZZ PB SB NN
ServiceDef=From=char | To=char | Service=char | SubService=char | DataLen=char
; Standard
Use=0700
Use=0800
Use=0503
Use=0507
; Kromschröder / Wolf
Use=5017
Use=5018

[0700]
ServiceDef=AussenTemp=data2b | Sekunden=bcd | Minuten=bcd | Stunden=bcd | Tag=bcd | Monat=bcd | Wochentag=bcd | Jahr=bcd
; Anzeige der Daten
Sql=Select 'AussenTemp: %AussenTemp%', 'Zeit: %Stunden%:%Minuten%:%Sekunden%', 'Datum: %Tag%.%Monat%.%Jahr%', 'WochenTag: %Wochentag%'
MinInterval=1 m
NextWrite=B9FD4106DE9EE34000000000

[0503]
ServiceDef=Blocknummer=SubService
Use=01
Use=02

[0503:01]
ServiceDef = Statusanzeige=char | Zustand=char | Kesselleistung=char | Kesseltemp=data1c | Ruecklauftemp=char | Boilertemp=char | Aussentemp=signed char
Sql=UPDATE eBusCurrent SET SammlerTemp=%Kesseltemp%, WWTemp=%BoilerTemp%
Check=SELECT %From%=241 AND %To%=254
CheckChanges=%KesselTemp%|%BoilerTemp%
MinInterval=30 s
LastCmd=43.0|35
NextWrite=3D159805DE9EE34000000000


[0503:02]
ServiceDef = Abgastemp=data2c | BWWVorlauftemp=data1c | KesselleistungRel=data1c | GemeinsameVorlauftemp=Data1c | unused=char
Sql=SELECT %Blocknummer% AS Blocknummer, %Abgastemp% AS Abgastemp, %BWWVorlauftemp% AS BWWVorlauftemp, %KesselleistungRel% AS KesselleistungRel, %GemeinsameVorlauftemp% AS GemeinsameVorlauftemp, %unused% AS unused

[0507]
ServiceDef = StatusWaermeAnf=char | AktionVariableVerbraucher=char | Kesselsolltemp=data2c | Kesselsolldruck=data2b | Stellgrad=data1c | Brauchwassersolltemp=data1c | Brennstoffwahl=char
MinInterval=20 m
NextWrite=A4703D8AB697E34000000000


[0800]
ServiceDef = Kesselsolltemp=data2b | AussenTemp=data2b | Leistungszwang=data1b | Status=char | WWSolltemp=data2b
Sql=UPDATE eBusCurrent SET KesselSollTemp=%Kesselsolltemp%, AussenTemp=%AussenTemp%, Leistungszwang=%Leistungszwang%, StatusKessel=%Status%, WWSollTemp=%WWSolltemp%, Timst=NOW()
;Sql=INSERT INTO Kessel ( KesselSollTemp, AussenTemp, Leistungszwang, Status, WWSollTemp, Von, An, Timst ) VALUES( %Kesselsolltemp%, %AussenTemp%, %Leistungszwang%, %Status%, %WWSolltemp%, %From%, %To%, NOW() )
Check=SELECT %From%=241 AND %To%=16
MinInterval=5 m
NextWrite=1598C51DDE9EE34000000000


[5017]
ServiceDef = SolarPumpe=char | unknown1=char | KollektorTemp=data2c | WWSolarTemp=data2c
Sql=[5017:UpdateSolar]|[5017:InsertHistory]

[5017:UpdateSolar]
Sql=UPDATE eBusCurrent Set S1Pumpe=%SolarPumpe%, S1KollektorTemp=%KollektorTemp%, S1WWTemp=%WWSolarTemp%, Timst=NOW()
MinInterval=20 s
CheckMode=OR
CheckChanges=%KollektorTemp%
NextWrite=44444404DE9EE34000000000
LastCmd=-11.31

[5017:InsertHistory]
Sql=INSERT INTO eBusHistory SELECT** From eBusCurrent
MinInterval=20 m
NextWrite=CCD78D6EDE9EE34000000000


[5018]
ServiceDef = Solarleistung=data2b | ErtragTagL=word | ErtragTagH=word | SummeErtragL=word | SummeErtragH=word | SummeErtragM=word
Sql=INSERT INTO SolarErtrag( Leistung, Tagesertrag, SummeErtrag, Timst ) VALUES ( %Solarleistung%, %ErtragTagH%** 1000 + %ErtragTagL%, %SummeErtragM%** 1000000 + %SummeErtragH%** 1000 + %SummeErtragL%, NOW() )
MinInterval=1 h
CheckChanges=sql
NextWrite=C4C92455DE9EE34000000000
LastCmd=INSERT INTO SolarErtrag( Leistung, Tagesertrag, SummeErtrag, Timst ) VALUES ( 0.00, 2** 1000 + 139, 1** 1000000 + 452** 1000 + 833, NOW() )
ebus/ebusconnector.txt · Zuletzt geändert: 2016/01/11 09:16 von bernhardh