Allgemein

Einige Grundprinzipien des EIB-Busses

In  ei­nem Eib-Sys­tem gibt es Sen­so­ren (Schal­ter) und Ak­to­ren (Re­lais) die je­weils ei­ne phy­si­ka­li­sche Adres­se be­sit­zen. Sie wer­den durch Grup­pen­adres­sen zu Grup­pen ver­bun­den. Jeder Sen­sor kann ge­nau ei­ne Grup­pe an­spre­chen aber je­der Ak­tor kann auf meh­re­re Grup­pen hö­ren.
rleibd be­nutzt zur Zeit nur Grup­pen­adres­sie­rung.
Sie ha­ben z.B. ei­nen Schal­ter für das Licht im Wohn­zim­mer und ein Re­lais, das dann tat­säch­­lich Netz­span­nung an die Lam­pe legt. Sie pro­gram­mie­ren nun den Schal­ter mit der ETS-Soft­ware daß er Grup­pe 1.0.1 sen­det und den Ak­tor daß er auf Grup­pe 1.0.1 hört. Wenn Sie nun den Schal­ter be­tä­ti­gen sen­det er den Wert (0=aus, 1=ein) für die­se Grup­pe und das Re­lais tut da­r­auf­hin sei­nen Dienst.
Bei man­chen Ge­rä­ten be­ein­flusst mehr als ei­ne Grup­pe sei­nen Wert. Ein Dim­mer bei­spiels­wei­se kann auf ei­ne be­stimm­te Hel­lig­keit (in %) ge­setzt wer­den, er kann ein oder aus­ge­schal­tet wer­den oder er kann hel­ler oder dunk­ler ge­stellt wer­den. Es ist schwie­rig, den Hel­lig­keits­wert durch Ver­fol­gung der Te­le­gram­me zu er­mit­teln. Ein­fa­cher ist es, den Dim­mer ein­fach da­nach zu fra­gen.
Wenn Sie Ih­re KNX/EIB-In­stal­la­tion pla­nen ist es nütz­lich, Ih­re Grup­pen­adres­sen zu struk­tu­rie­ren. So soll­ten Sie z.B. ei­ne Haupt­grup­pe (1.x.x) für Be­leuch­tung, ei­ne für Fens­ter, ei­ne für Hei­zung usw. ver­wen­den. Be­nut­zen Sie die mitt­le­re Grup­pe (x.1.x) für je­des Stock­werk (0=Kel­ler, 1=Erd­ge­schoß etc.) und schließ­lich die nie­ders­te Grup­pe für das ein­zel­ne Gerät. Da­mit er­leich­tern Sie sich spä­ter die Er­klä­rung von Te­le­gram­men und das even­tu­el­le Fil­tern.

In­stal­la­tion und Kon­fi­gu­ra­tion

La­den Sie das Pa­ket he­r­un­ter und ent­pa­cken Sie es in ein lee­res Ver­zeich­nis. Zu­sätz­lich be­nö­ti­gen Sie die fol­gen­den Pa­ke­te auf Ihrem Sys­tem:

  1. Gnu-C++ Com­pi­ler um rleibd zu bau­en
  2. den Eib-Trei­ber von der  Tu-Wien
  3. den Apa­che Web­ser­ver um die Er­geb­nis­se an­zu­zei­gen
  4. mod_php
  5. Perl und  perlcgi
  6. die MXML-Bi­blio­thek (gibt es  hier)

In­stal­lie­ren Sie den Eib-Trei­ber ge­mäß den An­wei­sun­gen der TU Wien. Testen Sie ihn mit dem eibdump-Tool (auch von TU Wien). Im Mo­ment ist eibdump nur in ei­nem der äl­te­ren Pa­ke­te ent­hal­ten (für Ker­nel 2.2 oder so). Wenn Sie es nicht fin­den, su­chen Sie dort. /dev/eib[0123] müs­sen exis­tie­ren und funk­tio­nie­ren be­vor Sie wei­ter­ma­chen. Ver­lin­ken sie /dev/eib auf das in Ihrem Sys­tem be­nutz­te eib-device.
Ko­pie­ren Sie das Bei­spiel-CGI-Skript in Ihr cgi-bin-Ver­zeich­nis und pas­sen Sie die Eib-Adres­sen Ihrer In­stal­la­tion an.
Pas­sen Sie die eibdef.xml-Da­tei Ihrer In­stal­la­tion an. Tip­pen Sie make. rleibd soll­te sich oh­ne Feh­ler kom­pi­lie­ren las­sen (Schan­de auf mich falls nicht ;-)). Alles was jetzt noch schief­läuft liegt an Ihnen. Be­he­ben Sie die Feh­ler und Ihr Sys­tem wird funk­tio­nie­ren.

Betrieb

Werte abfragen

EIB-Wer­te wer­den über http-ähn­li­che Re­quests auf Port 1215 ab­ge­ru­fen. Z.B. le­sen Sie die Grup­pe 1.2.3 in­dem Sie ei­ne An­for­de­rung GET /eib/grp/1.2.3 sen­den. Der Port­ser­ver ant­wor­tet mit dem Wert in Klar­text, d.h. on oder off für ei­nen Schal­ter, open oder close für ein Fens­ter, 25% für ei­nen Pro­zent­wert u.s.w.. Zur Zeit gibt es kei­ne Mög­lich­keit (und kei­ne Not­wen­dig­keit) den bi­nä­ren Wert ab­zu­fra­gen.

Werte senden

Um ei­nen Wert zu sen­den fü­gen Sie ein­fach ein ?val=... am En­de Ihres Re­quests hin­zu. Es er­folgt kei­ne wei­te­re Prü­fung. Der Port­ser­ver sucht nur nach dem val= und be­nutzt al­les da­nach als Wert. Im Mo­ment kön­nen Sie nur nu­me­ri­sche Wer­te sen­den (d.h. 0 und 1 statt off und on) und Pro­zent­wer­te. Ein even­tu­el­les % wird igno­riert. Der Wert wird ein­fach an atoi() über­ge­ben und das Er­geb­nis ge­sen­det.

Wenn Sie das mit Ihrem Brow­ser tes­ten müs­sen Sie mög­li­cher­wei­se den strg-Re­fresh-But­ton (strg-F5 bei IE und Fire­fox) be­tä­ti­gen oder ih­ren Brow­ser­cache lö­schen da­mit die An­fra­ge wirk­lich ge­sen­det wird.

Der As­ker­thread

Der As­ker­thread fragt al­le Wer­te in re­gel­mä­ßi­gen In­ter­val­len (15s) ab. Da­mit kön­nen feh­len­de invalidate-Ar­gu­men­te und In­kon­sis­ten­zen zwi­schen dem tat­säch­­li­chen Zu­stand des Sys­tems und sei­nem Ab­bild im Spei­cher ge­fun­den und be­ho­ben wer­den. Der Thread geht al­le Grup­pen im XML-File durch, die ge­sam­te Zeit für ei­nen Asker-Lauf be­trägt dem­nach 15 s mal die An­zahl der Grup­pen. Nur bei Grup­pen mit dem ask-Tag wird auch wirk­lich ge­fragt. Achten Sie da­r­auf, nicht auf Zen­tral­funk­tio­nen zu fra­gen sonst wer­den al­le Ih­re Lich­ter in die­sem Mo­ment er­lö­schen.
Wenn Sie kei­ne ask-Tags ein­ge­tra­gen ha­ben wird auch nichts pas­sie­ren, ich emp­feh­le aber, min­des­tens für je­de Grup­pe, die nur ei­nen Ak­tor be­trifft, ei­nen ask-Tag ein­zu­tra­gen.
Wenn sich der emp­fan­ge­ne Wert von dem im Spei­cher un­ter­schei­det wer­den Sie ei­nen Syslog-Ein­trag be­kom­men so­fern sie nicht das nomismatch-Tag ver­wen­den. Dies kann sehr sel­ten pas­sie­ren auf­grund ei­ner Race-Be­din­gung (wenn sich der Zu­stand des Aktors ge­ra­de in dem Mo­ment än­dert in dem der As­ker­thread da­nach fragt) aber es _wird_ z.B. bei Tem­pe­ra­tur­wer­ten pas­sie­ren wenn sie nicht das nomismatch-Tag ver­wen­den.
Wenn Sie z.B. 100 Grup­pen de­fi­niert ha­ben (was für ein Ein­fa­mi­li­en­haus ty­pisch sein dürf­te) wird der As­ker­thread al­so et­wa 25 Mi­nu­ten für ei­nen voll­stän­di­gen Lauf be­nö­ti­gen.
Die al­ler­ers­te Asker-Runde wird in 1 s-In­ter­val­len durch­ge­führt um den Auf­bau der in­ter­nen Da­ten­ba­sis zu be­schleu­ni­gen.

In­ter­ne Funk­tion

rleibd star­tet drei Threads, ei­ner hört auf dem Eib-Bus und ei­ner auf dem Netz­werk (Port 1215) zur Kom­mu­ni­ka­tion mit dem Be­nut­zer. Wenn Ihr Brow­ser das CGI-Skript auf­ruft holt die­ses die Da­ten von Port 1215, for­ma­tiert sie und sen­det sie an den Brow­ser.
Der drit­te ist der oben er­wähn­te As­ker­thread, der den Zu­stand Ihrer In­stal­la­tion und de­ren Ab­bild im Spei­cher syn­chro­ni­siert.

Beschreibung einiger Funktionen

rcvThread

läuft in ei­ner End­los­schlei­fe und emp­fängt Te­le­gram­me vom Eib-Bus. In­te­res­san­te Da­ten wer­den im grpClass-Vek­tor ge­spei­chert von wo sie der Kli­ent ab­holt. Die BAU muß im Link­layer sein um Te­le­gram­me zu emp­fan­gen.

portserv

läuft eben­falls in ei­ner End­los­schlei­fe und lauscht auf Port 1215 nach Be­nutz­er­an­for­de­run­gen.

An­for­de­run­gen kön­nen zum Testen auch mit ei­nem Stan­dard-HTTP-Brow­ser ge­macht wer­den un­ter der URL eib/grp/x.y.z. Das voll­stän­di­ge HTTP-Pro­to­koll stört da­bei nicht, portserv sucht je­doch le­dig­lich nach dem Schlüs­sel­wort GET ge­folgt von der URL. Die Ant­wort ist der for­ma­tier­te Wert als Klar­text. Werfen Sie ei­nen Blick auf das Bei­spiel­skript um zu se­hen wie es funk­tio­niert. Wenn der an­ge­for­der­te Wert unknown ist wird auf dem Bus da­nach ge­fragt. Da dies ei­ne Pause (200 ms) er­for­dert kann dies für die Sei­te ei­ne lan­ge Zeit bis zur Dar­stel­lung be­deu­ten. Das heißt auch, daß Sie kei­ne Sei­ten er­stel­len soll­ten, die vie­le Wer­te ent­hal­ten, nach de­nen nicht ge­fragt wer­den kann.

Hin­weis: Fra­gen und Ant­wort (vom Bus) be­kom­men ist ein a­syn­chro­ner Pro­zess und es ist nicht ga­ran­tiert, daß der Wert nach 200ms emp­fan­gen wur­de. Meist funk­tio­niert es, aber bei ho­her Bus­last kann ei­ne zwei­te An­for­de­rung nö­tig wer­den.

Falls sie kei­nen Wert für ei­ne Grup­pe be­kom­men, über­prü­fen Sie, ob das le­sen-Flag für die­se Grup­pe (und nur für die­se) in der ETS-Soft­ware ge­setzt ist.

getBauBytes

liest Da­ten vom in­ter­nen Spei­cher der BAU (ram oder eeprom). Hin­weis: Das funk­tio­niert nur zu­ver­läs­sig wenn sich die BAU nicht im Link­layer be­fin­det da sich sonst un­er­war­te­te Te­le­gram­me mit den emp­fang­en­en Da­ten ver­mi­schen kön­nen.

bauSetRcvTable

Die­se Funk­tion setzt die Län­ge der Emp­fangs­ta­bel­le auf 0. Die BAU wird da­r­auf­hin al­le Te­le­gram­me im Link­layer emp­fan­gen. Um un­nö­ti­ge Eeprom-Schreib­zu­gif­fe zu ver­mei­den wird getBauBytes auf­ge­ru­fen um fest­zu­stel­len, ob ein Schreib­zu­griff tat­säch­­lich nö­tig ist. Das ist nor­ma­ler­wei­se der Fall, wenn Sie zu­vor die ETS-Soft­ware be­nutzt ha­ben.

bauToLinkLayer

schal­tet die BAU in den Link­layer. In die­ser Be­triebs­art emp­fängt die BAU al­le Te­le­gram­me, die an Adres­sen in ih­rer Re­ceive-Table ge­rich­tet sind (oder schlicht al­le Te­le­gram­me, wenn die Re­ceive-Table leer ist). rcvThread er­war­tet die­se Be­triebs­art.

bauReset

führt ei­nen BAU-Re­set durch. Die BAU emp­fängt da­nach kei­ne Te­le­gram­me mehr. Das pas­siert wenn rleibd nor­mal be­en­det wird.

Signale

rleibd fängt das SIGUSR1-Si­gnal ab und schreibt dann das stats.xml. Sie kön­nen das in ei­nem Cron-Skript be­nut­zen um den Ver­lust an Sta­tis­tik-Da­ten zu be­gren­zen wenn ih­re Ma­schi­ne (oder rleibd) ab­stürzt. Ich ma­che dies ein­mal pro Nacht.

Zukünftige Erweiterungen

Ich pla­ne be­reits fol­gen­de Er­wei­te­run­gen für die Zu­kunft:

Sup­port

Ich ha­be rleibd in mei­ner Frei­zeit ent­wi­ckelt oh­ne da­für ei­nen Cent zu be­kom­men. Bitte ver­ste­hen Sie da­her, daß ich nicht viel Zeit in­ves­tie­ren kann um an Ihrem Sys­tem mit­zu­wir­ken. Wenn Sie es ver­sucht ha­ben und es funk­tio­niert nicht, ver­su­chen Sie es bit­te noch­mal. Ich ha­be Mo­na­te ge­braucht nur um den Eib-Trei­ber zum lau­fen zu brin­gen. Wenn Sie es be­reits noch­mal ver­sucht ha­ben, sen­den Sie mir ei­ne Mail, ich wer­de tun, was mei­ne Zeit er­laubt um Ihnen zu hel­fen.
Ich wer­de auch ei­ne FAQ er­stel­len so­bald ich ge­nug Fra­gen da­für ha­be :-). Bitte se­hen Sie dort zu­erst nach.

Benutzen Sie rleibd?

Wenn Sie ihn be­nut­zen wä­re ich sehr an Ihrem Feed­back in­ter­es­siert (auch wenn es sich auf ein ich be­nut­ze ihn) be­schränkt. Haben Sie kei­ne Angst mich zu kon­tak­tie­ren auch wenn Sie dann da­mit rech­nen müs­sen, dass ich zu­rück­schrei­be... Ich mag es, mit Leu­ten aus der gan­zen Welt in Kon­takt zu kom­men.