Linux EIB Home Server
Dokumentation
Autoren:
Vladimir Vinarski (volodimir@users.sourceforge.net)
Jens Neumann (jneumann@users.sourceforge.net)
Stand |
Datum |
Bearbeiter |
Anlass |
0.1 |
13.03.02 |
V.Vinarskyi J. Neumann |
Erstellung |
0.2 |
16.06.03 |
J.Neumann |
Dokumentation für SourceForge |
0.3 |
01.04.04 |
V.Vinarski J.Neumann |
Ergänzungen und Korrekturen |
0.4 |
21.06.04 |
J.Neumann |
Teilweise neue Klassennamen und Anpassung der entsprechenden Abbildungen |
Beispielapplikationen
Unterstützung aller EIB-Datentypen
UPnP-Unterstützung
Windows Version
Internet-Anbindung
Handy- / SMS-Interface
BCU 1 Unterstützung
...
Der Linux EIB Home Server bietet Schnittstellen für die Steuerung und Überwachung einer EIB-Installation.
Der Europäische Installationsbus (EIB) dient der automatischen Steuerung der Funktionen in Wohn- und Zweckbauten. Der EIB trennt klar die Übertragung von elektrischer Energie und Information. Neben einem Stromnetz werden alle EIB-Sensoren und Aktoren über ein zusätzliches informationsübertragendes Netzwerk miteinander verbunden, über das der gesamte Informationsaustausch stattfindet.
Die Zuordnung zwischen Betätigungselement und Verbraucher ist über das Netzwerk programmierbar und beliebig oft veränderbar. Für den Betrieb wird kein zentrales Busmanagement benötigt. Die Verwaltung und Speicherung aller Daten erfolgt dezentralisiert in den einzelnen Busgeräten. Jedoch stehen alle Informationen des EIB-Netzes bei Bedarf an jedem Punkt lückenlos zur Verfügung, so dass eine Integration der Elektroinstallation in ein Überwachungs- und Steuerungssystem, z.B. Embassi [1], ohne zusätzliche Installationskosten möglich ist.
Der Home Server besteht im Wesentlichen aus zwei Komponenten (siehe Abbildung 1):
homedriver: Steuerung des EIB-Bus und Kommunikationsschnittstelle zwischen dem Home-Server und den EIB-Bus, d.h. den Geräten.
homeserver: Kommunikationsschnittstelle zwischen den Anwendungsprogrammen, im Folgenden auch als Clients bezeichnet, und dem homedriver. Die Anzahl der Anwendungsprogramme ist unbegrenzt.
|
Nachrichten- bzw. Informations-Verlauf:
EIB bus -> FT 1.2 Datenschnittstelle -> homedriver -> homeserver -> Clients
Client -> homeserver -> homedriver -> -> FT 1.2 Datenschnittstelle -> EIB-Bus
Bei den Clients ist prinzipiell zwischen normalen Anwendungsprogrammen und HTTP-Clients zu unterscheiden. Die Anzahl der Clients ist unbegrenzt.
Die beiden Komponenten homedriver und homeserver verwenden unterschiedliche zusätzliche Bibliotheken:
lfc: Eine Collection -Klassen Bibliothek (Strings, HashMaps, Queues, Vectoren, ...) die intern vom homedriver benutzt wird.
vector: Eine Collection-Klassen Bibliothek (String, Vector, Array, ...) die intern von homeserver benutzt wird.
ixml: XML-DOM Parser (von Intel [2])
Ein Client ist ein belibiger Prozess, der eine tcp/ip-Verbindung zum homeserver aufbaut und die in diesem Kapitel beschriebenen Befehle zum homeserver sendet.
Es gibt folgende Befehle:
„read“ um momentane Zustände von EIB-Geräten, d.h. EIB-Gruppenadressen, abzufragen.
„write“ um den Zustand von EIB-Geräten, d.h. EIB-Gruppenadressen, zu setzen.
„subscribe“ um vom Home-Server über jede Zustandsänderungen eines EIB-Gerätes, genauer einer EIB-Gruppenadresse, informiert zu werden.
„unsubscribe“ um die ständige Benachrichtigung durch den Home-Server (siehe „subscribe“-Befehl) aufzuheben.
Beispiel READ:
Ziel: Den Wert der (Geräte mit der) Gruppenadresse 2/0/2 ermitteln.
Format:
<eib type="read" path="/eib/groups/2/0/2/curvalue"/>
Antwort vom HomeServer:
<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="0"/>
(falls der momentane Wert der zugehörigen Gruppenadresse 0 beträgt.)
Fehlerantwort:
<eib state="false" path="database.value/eib/groups/2/0/2" error="$error0007"/>
Fehlerantwort bei falschem Befehl:
<eib state="false" error="instruction isn't correct"/>
Beispiel WRITE:
Ziel: Der Wert der Gruppenadresse 2/0/2 soll auf „11“ gesetzt werden., d.h. die zugehörigen Geräte entsprechend umgeschaltet.
Format:
<eib type="write" path="/eib/groups/2/0/2/curvalue" data="11">
Antwort vom HomeServer:
<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>
Fehlerantwort: siehe READ.
Beispiel SUBSCRIBE:
Ziel: Der Client möchte den Wert der Gruppenadresse 2/1/0 überwachen,d.h über alle Änderungen (der Geräte mit) dieser Gruppenadresse informiert werden.
Format:
<eib type="subscribe" path="/eib/groups/2/1/0"/>
Antwort vom Home-Server:
<eib state="true" type="subscribe" path="/eib/groups/2/1/0"/>
Anschliessend bekommt der Client alle bestellten Nachrichten.
Fehlerantwort: siehe READ.
Dieser Befehl unterstützt Platzhalter, d.h. mit
<eib type="subscribe" path="*"/>
bestellt man alle Nachrichten vom EIB-Bus, d.h. alle Gruppenadressen werden überwacht.
Antwort vom Server:
<eib state="true" type="subscribe" path="*"/>
Beispiel UNSUBSCRIBE:
Ziel: Aufhebung eines SUBSCRIBE-Befehls.
Format:
<eib type="unsubscribe" path="/eib/groups/2/1/0"/>
Antwort vom Server:
<eib state="true" type="unsubscribe" path="/eib/groups/2/1/0"/>
Auch hier werden Platzhalter unterstützt, d.h. mit
<eib type="unsubscribe" path="*"/>
bestellt man alle Nachrichten vom EIB-Bus ab.
Antwort vom Server:
<eib state="true" type="unsubscribe" path="*"/>
Bemerkungen:
Die Verbindung zum Client besteht bis der Client selber die Socketverbindung schliesst.
Der Read-Befehl wirkt gleichzeitig als SUBSCRIBE-Befehl !!!
Format des Befehles (wenn der Home-Server auf einem Rechner mit der IP-Adresse 192.168.169.33 läuft):
http://192.168.169.33:8080/eibhomeserver?instruction=<eib type="read" path="/eib/groups/2/0/2/curvalue"/>
Nach instruction= muß entweder der oben beschriebene vollständige READ- oder WRITE-Befehl (siehe voriges Kapitel) folgen. Ein HTTP-Client kann keine SUBSCRIBE- oder UNSUBSCRIBE-Befehle auszuführen!
Antwort vom HomeServer:
HTTP/1.0 200
OK
Server: Loewe HomeServer 1.0
MIME-version:
1.0
Content-type: text/html
<html><script>var answer='<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>’;</script></html>
Ein Beispiel für einen Write-Befehl:
http://192.168.169.33:8080/eibhomeserver?instruction=<eib type="write" path="/eib/groups/2/0/2/curvalue" data="11"/>
Antwort vom HomeServer:
HTTP/1.0 200
OK
Server: Loewe HomeServer 1.0
MIME-version:
1.0
Content-type: text/html
<html><script>var answer='<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>';</script></html>
Fehlerantwort:
HTTP/1.0 200
OK
Server: Loewe HomeServer 1.0
MIME-version:
1.0
Content-type: text/html
<html><script>var answer='<eib state="false" error="instruction isn't correct"/>';</script></html>
Bemerkungen:
Die Verbindung zur HTTP-Applikation wird nach der Antwort durch den Linux EIB Home Server geschlossen.
Zwischen homedriver und homeserver werden Datentelegramme folgenden Formats ausgetauscht (siehe dazu auch EIBA Handbuch [3]):
Das Telegramm besteht aus 12 oder mehr Bytes:
Byte 0(type): definiert den Typ des Telegrammes
0: EIB-Message
1: Interne Message zwischen homedriver und homeserver.
Byte 1 (total length): Gesammte Länge der Message vom 2. Byte bis zum Checksum-Byte.
Byte 2 (control field): defaultmäßig 0x9c.
Bytes 3, 4 (source address): definiert die Adresse der Quelle des Telegrammes
Bytes 5, 6 (group address): definiert die Adresse des Empfängers des Telegrammes
Bytes 7 (routing counter / length): Dieses Byte ist ein kombiniertes Feld, das aus dem Teil “routing counter” und „data length“ besteht. Defaultmäßig ist routing counter = [110] und definiert die Bits Nummer 6,5 und 4. Das Bit 7 definiert Gruppenadressierung bzw. physikalische Adressierung (1 bedeutet Gruppenadressierung). Die Bits 3, 2, 1 und 0 sind Längen- Bits und definieren die gesammte Anzahl Bytes für den übertragenden Wert. Bei length = 1 wird z.B. nur sogenannte short user data übertragen.
Byte 8 (transport control field / APCI ): defaultmäßig gleich 0, wobei die Bits 7, 6, 5, 4, 3, 2 zum transport control field gehören, die Bits 1 und 0 den Anfang des APCI definieren.
Byte 9 (APCI / short user data ): 2 Bits (Nummer 7 und 6) definieren den Rest des APCI und 6 Bits (Nummer 5, 4, 3, 2, 1, 0) das Feld short user data. Das Feld short user data wird nur dann verwendet, wenn der zu übertragen Wert mit 6 Bits dargestellt werden kann, sonst benutzt man das user data Byte (oder Bytes), welches die Nummer 10 hat (die Nummern 10, 11 hat).
Byte 10 (Bytes 10, 11, ... – user data): Definiert die zu übertragen Daten, falls diese nicht mit 6 Bits dargestelt werden können.
Abschliessendes Byte (checksum): Eine spezielle Checksumme der Bytes von Byte 2 bis zum Checksum-Byte. Es wird die Bit-Funktion (not (b0 b1 b2 ... bn) ) verwendet, wobei „“ die Bit-Operation „xor“ bedeutet.
Der homedriver leitet die Nachrichten vom homeserver auf den EIB-Bus weiter, wobei dem Telegramm zusätzliche Header der anderen OSI-Layer hinzugefügt werden. (siehe EIBA-Handbuch [3])
Der homedriver kommuniziert mit dem EIB-Bus über eine FT1.2 kompatible Datenschnittstelle. Das FT1.2 Übertragungsprotokoll basiert auf den internationalen Standards IEC 870-5-1 und 870-5-2 (DIN 19244) (siehe EIBA Handbuch [3]). Der Anschluß der Schnittstelle an den PC erfolgt über die serielle Schnittstelle, der Anschluß an den EIB-Bus über eine sogenannte „Bus-Access-Unit“ (BAU) vom Typ 2 (siehe EIBA Handbuch, Kapitel 9/4/2, [3]).
Der homedriver setzt die Datenschnittstelle in den sogenannten Busmonitor-Modus. In diesem Modus werden alle Nachrichten auf dem EIB-Bus an den homedriver weitergeleitet. Dadurch registriert der Linux EIB Home Server jede Änderung in der angeschlossenen EIB-Installation.
Jede Busmonitor-Nachricht wird vom homedriver zum homeserver weitergeleitet. Andere Nachrichten werden vom homedriver verarbeitet.
Modul / Include-File / Source-File |
Beschreibung |
homeserver/include/client.h homeserver/src/client.cpp |
Kommunikation mit den verschiedenen Klienten. Klienten sind alle Programme, die den EIB-Bus steuern wollen oder Informationen über die EIB-Installation benötigen. Lauschen nach neuen Klienten. |
homeserver/include/homeserver.h homeserver/src /datenbank.cpp |
Kommunikation des homeservers mit einer internen Datenbank. |
homeserver/include/homeserver.h homeserver/src/driver.cpp |
Kommunikation mit dem homedriver. Der homedriver stellt dem homeserver die Verbindung zum EIB-Bus zur Verfügung. |
homeserver/include/homeserver.h homeserver/src/homeserver.cpp |
Die zentrale Klasse des homeservers. Verwaltet alle Prozesse im homeserver. |
homedriver/main/eibmain.cpp |
Main-Programm des homedrivers. Kann zum Starten des homedrivers verwendet werden. Der homedriver kann aber auch als Thread in einem anderen Programm aufgerufen werden. |
homedriver/include/eibdriver.h homedriver/src/eibdriver.cpp |
Zentrale Klasse des homedrivers. Startet alle Threads und Verwaltung sowohl die Verbindung zum homeserver als auch zum EIB-Bus. |
homedriver/include/eibsocket.h homedriver/src/eibsocket.cpp |
Verbindung zum homeserver über einen Socket. |
homedriver/include/ eibconnection .h homedriver/src/eibconnection.cpp |
Serielle RS232-Verbindung zum EIB-Bus. |
homedriver/include/ eibstate .h homedriver/src/eibstate.cpp |
Status der FT1.2-Verbindung zum EIB-Bus |
homedriver/include/ eibmessage .h homedriver/src/eibmessage.cpp |
EIB-Nachrichtenformate |
homedriver/include/eibexception .h homedriver/src/eibexception.cpp |
Fehler- und Ausnahmezustände |
homedriver/include/ eibstd.h |
Verschiedene Definitionen zur Fehlerausgabe oder Nachrichtenformate oder Standard-Schnittstellen und Ports. |
Der homedriver hat zwei Aufgaben:
Er empfängt „Write“- und „Read“-Anfragen sowie „Response“-Nachrichten von dem homeserver und leitet diese an den EIB-Bus weiter
Write: Der Wert einer Gruppenadresse wird in den entsprechenden Geräten verändert.
Read: Der Wert einer Gruppenadresse wird gelesen.
Response:
Antwort auf einen Read-Befehl vom EIB-Bus. Dieser Befehl wird
momentan vom homeserver nicht unterstützt, da er für
keine Anwendung benötigt wird.
Der homedriver leitet empfangene „Busmonitor“-Nachrichten an den homeserver weiter.
Der homedriver kann als selbstandiges Programm gestartet werden oder in einem anderen Programm aufgerufen werden:
Selbstandiges
Programm: Dazu kompiliert man die Datei eibmain.cpp und erhält
ein ausführbares Programm. Beim Start können mehrere
Parameter angegeben werden. Syntax:
homedriver
[–d device] [–p portnumber] [–f inputfile outputfile]
device:
Gibt die serielle Schnittstelle zum EIB-bus an, z.B.
/dev/ttyS4
portnumber:
Gibt den Port für die Socketverbindung zum homeserver
an.
inputfile, outputfile: Für Simulationszwecke kann aus
bzw. in eine Datei gelesen bzw. geschrieben werden. Dieser Modus ist
sinnvoll, wenn kein EIB-Anschluß zur Verfügung steht. Die
Dateien müssen existieren. An einem reinen Simulationsmodus
ohne Dateien wird gearbeitet. Die Option –f darf nicht mit –d
angegeben werden.
Alle Parameter sind optional.
Ohne
Parameter gelten die Defaultwerte:
device:
/dev/ttyS0
portnumber: 8083
Aufruf
von anderem Programm: Dazu instanziiert man ein Objekt des
homedriver durch Aufruf der statischen Methode:
EibDriver::createInstance(
int portNumber, char* inputDevice, char* outputDevice, bool
simulation)
portnumber: Gibt den Port für die
Socketverbindung zum homeserver an.
inputDevice: Gibt die
serielle Schnittstelle zum EIB-bus an, z.B. /dev/ttyS1,
oder eine Eingabedatei.
outputDevice: Gibt die serielle
Schnittstelle zum EIB-bus an, z.B. /dev/ttyS1,
oder eine Ausgabedatei.
simulation: True für Simulation,
d.h. input/outputDevice sind Dateien. False für Realbetrieb,
d.h input/ouputdevice gibt die gleiche serielle Schnittstelle an.
Das Klassendiagramm in Abbildung 2 zeigt die Klassen des Moduls homedriver und die Beziehungen der einzelnen Klassen zueinander. Bis auf die beiden Klassen EibReceiveMessage und EibSendMessage, die die zu versendenden und empfangenen EIBNachrichten repräsentieren, sind alle anderen Klassen als Singleton realisiert. Aus diesem Grund entspricht das Klassendiagramm nahezu dem Objektdiagramm.
Der homedriver kommuniziert mit dem homeserver über einen Socket. Die Standardeinstellung für den Port ist 8083. Der Socket wird in der Klasse EibDriverSocket realisiert, von der ein Objekt instanziiert wird.
Ein Thread schreibt Nachrichten in den Socket und ein anderer Thread liest Nachrichten von dem Socket. Alle Nachrichten werden in zwei Nachrichtenschlangen gehalten, die durch die Klasse lfcdllist der LFC realisiert sind. Auf den EIB-Bus zu versendende Nachrichten werden durch die Klasse EibSendMessage implementiert und empfangene Nachrichten durch die Klasse EibReceiveMessage.
Der homedriver kommuniziert mit dem EIB-Bus über die serielle Schnittstelle. Während der Initialisierungsphase des Systems wird die FT1.2 Datenschnittstelle durch entsprechende Nachrichten in den Busmonitormodus geschaltet. Anschließend empfängt der homedriver sämliche Nachrichten, die auf dem EIB-Bus gesendet werden. Er quittiert jede Nachricht mit einem Acknowledge. Die Verbindung zum EIB-Bus wird durch die Klasse EibConnection repräsentiert. Der Zustand der Verbindung wird durch eine Klasse beschrieben, die sich von der abstrakten Basisklasse EibState ableitet.
Abbildung 2: Die Klassen des homedrivers und deren Assoziationen.
Momentan gibt es die Verbindungszustände
EibStateReady: Nachrichten können empfangen und versendet werden.
EibStateSent: Es ist ein Write- oder Response-Befehl (siehe in Kapitel 5.1) an die BAU versendet worden. Es kann keine weitere Nachricht versendet werden. Der homedriver wartet auf das Acknowledge der BAU. Wenn das Acknowledge empfangen wird, kehrt der homedriver in den State EibStateReady zurück. Wird innerhalb von 200ms kein Acknowledge empfangen, wird die Nachricht bis zu dreimal wiederholt. Nach vier erfolglosen Versuchen wird die gesamte Verbindung neu initialisiert.
EibStateRequest: Es ist ein Read-Befehl (siehe in Kapitel 5.1) an die BAU versendet worden. Es kann keine weitere Nachricht versendet werden. Der homedriver wartet auf das Acknowledge der BAU. Wird innerhalb einer bestimmten Zeit kein Acknowledge empfangen, wird die Nachricht bis zu dreimal wiederholt. Nach vier erfolglosen Versuchen wird die gesamte Verbindung neu initialisiert.
EibStateWait: Ein Acknowledge für einen Read-Befehl wurde empfangen. Der homedriver wartet auf eine Response von einem Gerät. Es kann keine weitere Nachricht versendet werden. Wenn die Response empfangen wird oder nach einem bestimmten TimeOut (siehe EIBA Handbuch [3]), kehrt der homedriver in den State EibStateReady zurück.
Von allen empfangenen Busmonitor-Nachrichten wird der FT1.2-Protokoll-Rahmen, das Status-Byte und der TimeStamp entfernt und die Nachricht an den homeserver weitergeleitet. Vorher werden Wiederholungen aussortiert. Das Nachrichtenformat ist in Kapitel beschriebenen.
Die Methoden der Klasse EibDriver sind in Abbildung 3 dargestellt.
Abbildung 3: Die Treiber-Klasse
Die Methoden der Klasse EibConnection sind in Abbildung 4 dargestellt.
Abbildung 4: Die Verbindungsklasse
Die Methoden der Klasse EibState, und die zugehörige Vererbungshierarchie ist in Abbildung 5 dargestellt.
Abbildung 5: Vererbungshierarchie der Zustands-Klassen.
Die Methoden der Klasse EibSocket sind in Abbildung 6 dargestellt.
Abbildung 6: Die Socketklasse
Die Klasse EibMessage und die davon abgeleiteten Klassen sind in Abbildung 7 dargestellt.
Abbildung 7: Vererbungshierarchie der Nachrichten-Klassen.
Die Klasse EibException und die davon abgeleiteten Klassen sind in Abbildung 8 dargestellt.
Abbildung 8: Exceptions des homedrivers.
In dem Modul homedriver gibt es bis auf main() keine Funktionen, die nicht „Klassenmember-Methoden“ sind. Die Beschreibung der Klassenmember-Methoden“ findet man bei den jeweiligen Klassen.
Der homedriver lässt sich von außen entweder
über die Methode run() der Klasse EibDriver
oder über die Main-Routine in der Datei eibmain.cpp
starten. Die Dokumentation der Klassen bzw. Methoden findet man im Quellcode.
Der homeserver hat zwei Aufgaben:
Er kommuniziert über TCP/IP bzw. HTTP mit Applikationen (siehe Abschnitt 5.1.1)
Er kommuniziert mit dem homedriver (siehe voriger Abschnitt 5.1.2)
Er verwaltet die Datenbank mit den Gruppenadressen und aktuellen Werten.
Der homeserver speichert die aktuellen Werte der Gruppenadresse in einer XML-Datenbank. Die Datenbank wird in einer Datei (Defaultname:eibdb.xml) abgelegt. In diese Datei müssen bei der Installation des Servers einmalig die Daten der EIB-Installation eingetragen werden. Während des Betriebs werden die Werte der konfigurierten Gruppenadressen ständig in der Datenbank aktualisiert und die Datei eibdb.xml gelegentlich synchronisiert.
Die Synchronisationsintervalle können beim Start mit dem Parameter
-s
<Anzahl in Sekunden>
angegeben werden ( Deafult: -s
300, d.h. Synchronisation alle 5 Minuten, falls überhaupt
Änderungen vorliegen. Keine Synchronisation durch -s
0).
Syntax:
homeserver -dr driver-host -db database -dp driver-port -ap applications-port -wp http-port -s synctimeout
Beschreibung der Parameter:
driverhost: IP-Addresse oder Name des Rechners, auf dem der homedriver läuft (homedriver und homeserver können auf unterschiedlichen Rechnern gestartet werden.)
driver-port: IP-Port des homedrivers.
database: Name der Datenbank-Datei
applications-port: Port für TCP/IP-Anwendungen
http-port:Port für HTTP-Anwendungen
synctimeout: Synchronisations-Intervall der Datenbank (siehe oben)
Default-Werte:
driverhost: localhost
driver-port: 8083
database: eibdb.xml
applications-port: 8081
http-port: 8080
synctimeout: 300 (in sec)
Das Klassendiagramm in Abbildung 9 zeigt die Klassen des Moduls homeserver und die Beziehungen der einzelnen Klassen zueinander.
Die Methoden der Klasse HomeServer sind in Abbildung 10 dargestellt.
Die Methoden der Klasse DatenBank sind in Abbildung 11 dargestellt.
Abbildung 11: Die Klasse DatenBank.
Die Methoden der Klasse Driver sind in Abbildung 12 dargestellt.
Abbildung 12: Die Klasse Driver.
Die Methoden der Klasse DriverMessages sind in Abbildung 13 dargestellt.
Abbildung 13: Die Klasse DriverMessages.
Die Methoden der Klasse Client sind in Abbildung 14 dargestellt.
Abbildung 14: Die Klasse Client.
Die Methoden der Klasse ClientMessages sind in Abbildung 15 dargestellt.
Abbildung 15: Die Klasse ClientMessages
Die Methoden der Klasse Interest sind in Abbildung 16 dargestellt.
Abbildung 16: Die Klasse Interest.
Die Methoden der Klasse PathData sind in Abbildung 17 dargestellt.
Abbildung 17: Die Klasse PathData.
Die Methoden der Klasse Instruction sind in Abbildung 18 dargestellt.
Abbildung 18 Die Klasse Instruction.
BMBF-Leitprojekt „Eletronische Multimediale Bedienassistenz“ (Embassi) www.embassi.de
Intel: The Universal Plug and Play (UPnP) SDK for Linux, http://sourceforge.net/projects/upnp/
EIB Association: www.eiba.org