====== 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 ab**Windows** 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. -> [[ebus:download:ebusconnector|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 [[http://notepad-plus.sourceforge.net/de/site.htm|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,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") || |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() )