Allgemein
Einige Grundprinzipien des EIB-Busses
In einem Eib-System gibt es Sensoren (Schalter
) und Aktoren
(Relais
) die jeweils eine physikalische Adresse besitzen. Sie werden
durch Gruppenadressen zu Gruppen verbunden. Jeder Sensor kann genau eine
Gruppe ansprechen aber jeder Aktor kann auf mehrere Gruppen hören.
rleibd benutzt zur Zeit nur Gruppenadressierung.
Sie haben z.B. einen Schalter für das Licht im Wohnzimmer und ein Relais,
das dann tatsächlich Netzspannung an die Lampe legt. Sie programmieren
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 beeinflusst mehr als eine Gruppe seinen Wert. Ein
Dimmer beispielsweise kann auf eine bestimmte Helligkeit (in %) gesetzt
werden, er kann ein oder ausgeschaltet werden oder er kann heller oder
dunkler gestellt werden. Es ist schwierig, den Helligkeitswert durch
Verfolgung der Telegramme zu ermitteln. Einfacher ist es, den Dimmer
einfach danach zu fragen.
Wenn Sie Ihre KNX/EIB-
Installation und Konfiguration
Laden Sie das Paket herunter und entpacken Sie es in ein leeres Verzeichnis. Zusätzlich benötigen Sie die folgenden Pakete auf Ihrem System:
- Gnu-C++ Compiler um rleibd zu bauen
- den Eib-Treiber von der Tu-Wien
- den Apache Webserver um die Ergebnisse anzuzeigen
- mod_php
- Perl und perlcgi
- 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
existieren und funktionieren bevor Sie weitermachen. Verlinken
sie /dev/eib auf das in Ihrem System benutzte eib-device.
Kopieren Sie das Beispiel-
Passen Sie die eibdef.xml-make
.
rleibd sollte sich ohne Fehler kompilieren lassen (Schande auf mich falls
nicht ;-)). Alles was jetzt noch schiefläuft liegt an Ihnen. Beheben Sie
die Fehler und Ihr System wird funktionieren.
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 Anforderung
GET /eib/grp/1.2.3
senden. Der Portserver antwortet mit dem Wert in
Klartext, d.h. on
oder off
für einen Schalter, open
oder close
für ein Fenster, 25%
für einen Prozentwert u.s.w.. Zur Zeit gibt es
keine Möglichkeit (und keine Notwendigkeit) den binären Wert abzufragen.
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 Portserver
sucht nur nach dem val=
und benutzt alles danach als Wert. Im Moment
können Sie nur numerische Werte senden (d.h. 0
und 1
statt off
und
on
) und Prozentwerte. Ein eventuelles %
wird ignoriert. Der Wert wird
einfach an atoi() übergeben und das Ergebnis gesendet.
- Für einen binären Wert: alles was von
0
verschieden ist setzt den Wert (natürlich sollten Sie nur0
und1
verwenden) - Für einen Prozentwert: nur Werte zwischen 0 und 100 bewirken eine Änderung. Bruchteile werden ignoriert. Nur der ganzzahlige Anteil wird verwendet.
- Der Portserver antwortet immer mit
Ok
. - Der Zustand der Gruppe wird auf
unbekannt
gesetzt, der Server wird also danach fragen, wenn der Wert das nächste mal benötigt wird.
Wenn Sie das mit Ihrem Browser testen müssen Sie möglicherweise
den strg-
-
Der Askerthread
Der Askerthread fragt alle Werte in regelmäßigen Intervallen (15s)
ab. Damit können fehlende invalidate
-ask
-Tag wird auch
wirklich gefragt. Achten Sie darauf, nicht auf Zentralfunktionen zu
fragen sonst werden alle Ihre Lichter in diesem Moment erlöschen.
Wenn Sie keine ask
-
Wenn sich der empfangene Wert von dem im Speicher unterscheidet werden
Sie einen Syslog-nomismatch
-nomismatch
-
Wenn Sie z.B. 100 Gruppen definiert haben (was für ein Einfamilienhaus
typisch sein dürfte) wird der Askerthread also etwa 25 Minuten für einen
vollständigen Lauf benötigen.
Die allererste Asker-
Interne Funktion
rleibd startet drei Threads, einer hört auf dem Eib-
Der dritte ist der oben erwähnte Askerthread, der den Zustand Ihrer
Installation und deren Abbild im Speicher synchronisiert.
Beschreibung einiger Funktionen
rcvThread
läuft in einer Endlosschleife und empfängt Telegramme vom Eib-Bus. Interessante Daten werden im grpClass-Vektor gespeichert von wo sie der Klient abholt. Die BAU muß im Linklayer sein um Telegramme zu empfangen.
portserv
läuft ebenfalls in einer Endlosschleife und lauscht auf Port 1215 nach Benutzeranforderungen.
Anforderungen können zum Testen auch mit einem Standard-HTTP-Browser
gemacht werden unter der URL eib/grp/x.y.z
. Das vollständige
HTTP-Protokoll stört dabei nicht, portserv sucht jedoch lediglich nach
dem Schlüsselwort GET
gefolgt von der URL. Die Antwort ist der
formatierte Wert als Klartext. Werfen Sie einen Blick auf das
Beispielskript um zu sehen wie es funktioniert. Wenn der angeforderte
Wert unknown
ist wird auf dem Bus danach gefragt. Da dies eine Pause
(200 ms) erfordert kann dies für die Seite eine lange Zeit bis zur
Darstellung bedeuten. Das heißt auch, daß Sie keine Seiten erstellen
sollten, die viele Werte enthalten, nach denen nicht gefragt werden
kann.
Hinweis: Fragen und Antwort (vom Bus) bekommen ist ein asynchroner Prozess und es ist nicht garantiert, daß der Wert nach 200ms empfangen wurde. Meist funktioniert es, aber bei hoher Buslast kann eine zweite Anforderung nötig werden.
Falls sie keinen Wert für eine Gruppe bekommen, überprüfen Sie, ob das
lesen
-
getBauBytes
liest Daten vom internen Speicher der BAU (ram oder eeprom).
Hinweis: Das funktioniert nur zuverlässig wenn sich die BAU nicht im
Linklayer befindet da sich sonst unerwartete Telegramme mit den
empfangenen Daten vermischen können.
bauSetRcvTable
Diese Funktion setzt die Länge der Empfangstabelle auf 0
. Die BAU
wird daraufhin alle Telegramme im Linklayer empfangen. Um unnötige
Eeprom-Schreibzugiffe zu vermeiden wird getBauBytes aufgerufen um
festzustellen, ob ein Schreibzugriff tatsächlich nötig ist. Das ist
normalerweise der Fall, wenn Sie zuvor die ETS-
bauToLinkLayer
schaltet die BAU in den Linklayer. In dieser Betriebsart empfängt
die BAU alle Telegramme, die an Adressen in ihrer Receive-Table gerichtet
sind (oder schlicht alle Telegramme, wenn die Receive-
bauReset
führt einen BAU-
Signale
rleibd fängt das SIGUSR1-
Zukünftige Erweiterungen
Ich plane bereits folgende Erweiterungen für die Zukunft:
- Bedingungen in Skripten. Sie können z.B. das Licht im Schlafzimmer flackern lassen wenn noch Fenster offen sind.
- Insertable Triggers. Sie können Trigger im laufenden Betrieb einfügen und löschen wenn sie nicht mehr benötigt werden.
Support
Ich habe rleibd in meiner Freizeit entwickelt ohne dafür einen Cent zu
bekommen. Bitte verstehen Sie daher, daß ich nicht viel Zeit
investieren kann um an Ihrem System mitzuwirken. Wenn Sie es versucht
haben und es funktioniert nicht, versuchen Sie es bitte nochmal. Ich
habe Monate gebraucht nur um den Eib-
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ückschreibe... Ich mag es, mit
Leuten aus der ganzen Welt in Kontakt zu kommen.