Allgemein

Einige Grundprinzipien des EIB-Busses

In  einem Eib-System gibt es Sensoren ("Schalter") und Aktoren ("Relais") die jeweils eine physi­kalische Adresse besitzen. Sie werden durch Gruppen­adressen zu Gruppen verbunden. Jeder Sensor kann genau eine Gruppe ansprechen aber jeder Aktor kann auf mehrere Gruppen hören.
rleibd benutzt zur Zeit nur Gruppen­adres­sierung.
Sie haben z.B. einen Schalter für das Licht im Wohn­zimmer und ein Relais, das dann tatsächlich Netz­spannung an die Lampe legt. Sie program­mieren nun den Schalter mit der ETS-Software daß er Gruppe 1.0.1 sendet und den Aktor daß er auf Gruppe 1.0.1 hört. Wenn Sie nun den Schalter betätigen sendet er den Wert (0=aus, 1=ein) für diese Gruppe und das Relais tut daraufhin seinen Dienst.
Bei manchen Geräten beein­flusst mehr als eine Gruppe seinen Wert. Ein Dimmer beispiels­weise kann auf eine bestimmte Hellig­keit (in %) gesetzt werden, er kann ein oder ausge­schaltet werden oder er kann heller oder dunkler gestellt werden. Es ist schwierig, den Hellig­keits­wert durch Ver­folgung der Tele­gramme zu ermit­teln. Ein­facher ist es, den Dimmer ein­fach danach zu fragen.
Wenn Sie Ihre KNX/EIB-Instal­lation planen ist es nützlich, Ihre Gruppenadressen zu strukturieren. So sollten Sie z.B. eine Haupt­gruppe (1.x.x) für Beleuch­tung, eine für Fenster, eine für Heizung usw. ver­wenden. Benut­zen Sie die mittlere Gruppe (x.1.x) für jedes Stock­werk (0=Keller, 1=Erdgeschoß etc.) und schließlich die niederste Gruppe für das einzelne Gerät. Damit erleich­tern Sie sich später die Erklärung von Tele­grammen und das eventuelle Filtern.

Installation und Konfiguration

Laden Sie das Paket herunter und ent­packen Sie es in ein leeres Verzeichnis. Zusätzlich benötigen Sie die fol­genden Pakete auf Ihrem System:

  1. Gnu-C++ compiler um rleibd zu bauen
  2. den eib driver von der  Tu-Wien
  3. den Apache Webserver um die Erge­bnis­se anzuzeigen
  4. mod_php
  5. Perl und  perlcgi
  6. die mxml-Bibliothek (gibt es  hier)

Installieren Sie den Eib-Treiber gemäß den Anweisungen der TU Wien. Testen Sie ihn mit dem "eibdump"-Tool (auch von TU Wien). Im Moment ist eibdump nur in einem der älteren Pakete enthalten (für Kernel 2.2 oder so). Wenn Sie es nicht finden, suchen Sie dort. /dev/eib[0123] müssen exis­tieren und funk­tionieren bevor Sie weiter­machen. Ver­linken sie /dev/eib auf das in Ihrem System benutzte eib-device.
Kopieren Sie das Beispiel-CGI-Script in Ihr cgi-bin-Verzeich­nis und passen Sie die Eib-Adressen Ihrer Installation an.
Passen Sie die eibdef.xml-Datei Ihrer Instal­lation an. Tippen Sie "make". rleibd sollte sich ohne Fehler kompi­lieren lassen (Schande auf mich falls nicht ;-)). Alles was jetzt noch schief­läuft liegt an Ihnen. Beheben Sie die Fehler und Ihr System wird funk­tionieren.

Betrieb

Werte abfragen

EIB-Werte werden über http-ähnliche requests auf port 1215 abgerufen. Z.B. lesen Sie die Gruppe 1.2.3 indem Sie eine Anfor­derung "GET /eib/grp/1.2.3" senden. Der Portserver antwortet mit dem Wert in Klar­text, d.h. "on" oder "off" für einen Schalter, "open" oder "close" für ein Fenster, "25%" für einen Prozent­wert u.s.w.. Zur Zeit gibt es keine Möglich­keit (und keine Not­wendigkeit) den binären Wert abzu­fragen.

Werte senden

Um einen Wert zu senden fügen Sie einfach ein "?val=..." am Ende Ihres Requests hinzu. Es erfolgt keine weitere Prüfung. Der Port­server sucht nur nach dem "val=" und benutzt alles danach als Wert. Im Moment können Sie nur nu­merische Werte senden (d.h. "0" und "1" statt "off" und "on") und Prozent­werte. Ein even­tuelles "%" wird ignoriert. Der Wert wird einfach an atoi() über­geben und das Ergeb­nis gesendet.

Wenn Sie das mit Ihrem Browser testen müssen Sie möglicher­weise den "strg-Refresh"-Button (strg-F5 bei IE und Firefox) betätigen oder ihren Browser­cache löschen damit die Anfrage wir­klich gesendet wird.

Der Askerthread

Der Asker­thread fragt alle Werte in regel­mäßigen Inter­vallen (15s) ab. Damit können fehlende "invalidate"-Argumente und Inkon­sistenzen zwischen dem tat­sächlichen Zustand des Systems und seinem Abbild im Speicher gefunden und behoben werden. Der Thread geht alle Gruppen im XML-File durch, die gesamte Zeit für einen Asker-Lauf beträgt demnach 15s mal die Anzahl der Gruppen. Nur bei Gruppen mit dem "ask"-Tag wird auch wirk­lich gefragt. Achten Sie darauf, nicht auf Zentral­funk­tionen zu fragen sonst werden alle Ihre Lichter in diesem Moment erlöschen.
Wenn Sie keine "ask"-Tags einge­tragen haben wird auch nichts passieren, ich empfehle aber, mindes­tens für jede Gruppe, die nur einen Aktor betrifft, einen ask-Tag einzu­tragen.
Wenn sich der empfangene Wert von dem im Speicher unter­scheidet werden Sie einen Syslog-Eintrag bekommen sofern sie nicht das "nomismatch"-Tag verwenden. Dies kann sehr selten passieren aufgrund einer Race-Bedingung (wenn sich der Zustand des Aktors gerade in dem Moment ändert in dem der Asker­thread danach fragt) aber es _wird_ z.B. bei Temperatur­werten passieren wenn sie nicht das "nomismatch"-Tag verwenden.
Wenn Sie z.B. 100 Gruppen definiert haben (was für ein Einfamilien­haus typisch sein dürfte) wird der Asker­thread also etwa 25 Minuten für einen voll­ständigen Lauf benötigen.
Die allererste Asker-Runde wird in 1s-Inter­vallen durch­geführt um den Aufbau der internen Daten­basis zu beschleu­nigen.

Interne Funktion

rleibd startet drei Threads, einer hört auf dem Eib-Bus und einer auf dem Netzwerk (Port 1215) zur Kommu­nikation mit dem Benutzer. Wenn Ihr Browser das CGI-Script aufruft holt dieses die Daten von Port 1215, for­matiert sie und sendet sie an den Browser.
Der dritte ist der oben erwähnte Asker­thread, der den Zustand Ihrer Instal­lation und deren Abbild im Speicher syn­chronisiert.

Beschreibung einiger Funktionen

rcvThread

läuft in einer Endlos­schleife und empfängt Tele­gramme vom Eib-Bus. Interessante Daten werden im grpClass-Vektor gespeichert von wo sie der Klient abholt. Die BAU muß im Link­layer sein um Tele­gramme zu emp­fangen.

portserv

läuft eben­falls in einer Endlos­schleife und lauscht auf Port 1215 nach Benutzer­anfor­derungen.
Anforderungen können zum Testen auch mit einem Standard-HTTP-Browser gemacht werden unter der URL "eib/grp/x.y.z". Das voll­ständige HTTP-Protokoll stört dabei nicht, portserv sucht jedoch lediglich nach dem Schlüssel­wort "GET" gefolgt von der URL. Die Antwort ist der formatierte Wert als Klar­text. Werfen Sie einen Blick auf das Bei­spiel­script um zu sehen wie es funk­tioniert. Wenn der angefor­derte Wert "unknown" ist wird auf dem Bus danach gefragt. Da dies eine Pause (200ms) erfor­dert kann dies für die Seite eine lange Zeit bis zur Dar­stellung bedeuten. Das heißt auch, daß Sie keine Seiten erstellen sollten, die viele Werte ent­halten, nach denen nicht gefragt werden kann.
Hinweis: Fragen und Antwort (vom Bus) bekommen ist ein asyn­chroner Pro­zess und es ist nicht garan­tiert, daß der Wert nach 200ms emp­fangen wurde. Meist funk­tioniert es, aber bei hoher Bus­last kann eine zweite Anfor­derung nötig werden.
Falls sie keinen Wert für eine Grup­pe bekommen, über­prüfen Sie, ob das "lesen"-Flag für diese Gruppe (und nur für diese) in der ETS-Software gesetzt ist.

getBauBytes

liest Daten vom internen Speicher der BAU (ram oder eeprom). Hinweis: Das funk­tioniert nur zuver­lässig wenn sich die BAU nicht im Link­layer befindet da sich sonst un­erwar­tete Tele­gramme mit den emp­fangenen Daten ver­mischen können.

bauSetRcvTable

Diese Funktion setzt die Länge der Empfangstabelle auf "0". Die BAU wird daraufhin alle Telegramme im Link­layer empfangen. Um unnötige Eeprom-Schreib­zugiffe zu vermeiden wird getBauBytes auf­gerufen um fest­zustel­len, ob ein Schreib­zugriff tat­sächlich nötig ist. Das ist normaler­weise der Fall, wenn Sie zuvor die ETS-Software benutzt haben.

bauToLinkLayer

schaltet die BAU in den Linklayer. In dieser Betriebs­art empfängt die BAU alle Tele­gramme, die an Adressen in ihrer Receive-Table gerichtet sind (oder schlicht alle Tele­gramme, wenn die Receive-Table leer ist). rcvThread erwartet diese Betriebs­art.

bauReset

führt einen BAU-Reset durch. Die BAU empfängt danach keine Tele­gramme mehr. Das pas­siert wenn rleibd normal beendet wird.

Signale

rleibd fängt das SIGUSR1-Signal ab und schreibt dann das stats.xml. Sie können das in einem Cron-Script benutzen um den Verlust an Statistik-Daten zu begren­zen wenn ihre Maschine (oder rleibd) abstürzt. Ich mache dies einmal pro Nacht.

Zukünftige Erweiterungen

Ich plane bereits folgende Erweiterungen für die Zukunft:

Support

Ich habe rleibd in meiner Freizeit entwickelt ohne dafür einen Cent zu bekommen. Bitte ver­stehen Sie daher, daß ich nicht viel Zeit inves­tieren kann um an Ihrem System mit­zuwirken. Wenn Sie es ver­sucht haben und es funk­tioniert nicht, ver­suchen Sie es bitte nochmal. Ich habe Monate gebraucht nur um den Eib-Treiber zum laufen zu bringen. Wenn Sie es bereits noch­mal versucht haben, senden Sie mir eine Mail, ich werde tun, was meine Zeit erlaubt um Ihnen zu helfen.
Ich werde auch eine FAQ erstellen sobald ich genug Fragen dafür habe :-). Bitte sehen Sie dort zuerst nach.

Benutzen Sie rleibd?

Wenn Sie ihn benutzen wäre ich sehr an Ihrem Feedback interessiert (auch wenn es sich auf ein 'ich benutze ihn') beschränkt. Haben Sie keine Angst mich zu kontaktieren auch wenn Sie dann damit rechnen müssen, dass ich zurück­schreibe... Ich mag es, mit Leuten aus der ganzen Welt in Kontakt zu kommen.