Home, Smart Home - JAXenter
Heimautomatisierung mit OSGi

Home, Smart Home

Kai Kreuzer

Items werden der Runtime durch ItemProvider als OSGi-Service bereitgestellt. So können dynamisch zur Laufzeit Änderungen vorgenommen und Items hinzugefügt oder entfernt werden. Dennoch ist es in den meisten Fällen sinnvoll, Items statisch zu definieren, denn verbaute Schalter oder Sensoren ändern sich nicht so oft. Hierzu bietet openHAB einen ItemProvider, der Dateien mit einer einfachen Syntax einliest. Diese Syntax ist als Xtext-Grammatik definiert, wodurch komfortable Editoren im openHAB-Designer zur Verfügung stehen. Ein einfaches Beispiel für eine solche Datei zeigt Listing 1.

Listing 1

/* Gruppen */
Group   Licht
Group   Bad   "Bad"

/* Badezimmer */
Switch        Licht_Bad_Decke   "Deckenlicht"                    (Bad, Licht)
Switch        Licht_Bad_Spiegel "Spiegellicht"                   (Bad, Licht)
Number        Temperatur_Bad    "Temperatur [%.1f °C]"     (Bad)
Switch        Heizung_Bad       "Heizung"               (Bad)
Rollershutter Rollladen_Bad     "Rollladen"                      (Bad)
Contact       Fenster_Bad       "Fenster [%s]"                   (Bad)

/* Wetter */
Number        Aussentemperatur  "Außentemperatur [%.1f °C]"      
Number        Wind              "Windgeschwindigkeit [%.1f m/s]" 
Number        Helligkeit        "Helligkeit [%.0f Lux]"          

/* Status */
Switch        Anwesend                                           
User Interface

Sind die Items dem System bekannt, kann darauf aufbauend ein User Interface erstellt werden. Zur Zeit bietet openHAB hier eine Webapplikation, die durch CSS und JavaScript eine iPhone-App nachbildet [6], aber gegenüber einer nativen App den Vorteil hat, dass sie auch problemlos auf anderen Mobilplattformen wie Android und WebOS oder auch auf PCs mit WebKit-basierten Browsern wie Safari und Chrome funktioniert. Diese Webapplikation registriert sich als OSGi HttpService und wird durch den in der openHAB Runtime integrierten Jetty HTTP Server verfügbar gemacht. Hierbei wird die Möglichkeit genutzt, Jetty in Form von OSGi Bundles auf Equinox zu betreiben [7]. Das hat den Vorteil, dass Jetty nicht als getrennter Prozess gestartet werden muss, sondern integraler (aber dennoch optional abschaltbarer) Bestandteil der openHAB Runtime ist. Selbstverständlich lässt er sich entsprechend den eigenen Bedürfnissen frei konfigurieren, also z. B. für sicheren Zugriff über TLS/SSL, Authentifizierung via LDAP etc.

Um den Aufwand für die Erstellung und Pflege des User Interface gering zu halten, setzt openHAB auf einen deklarativen Ansatz: In einer eigenen Xtext-Grammatik werden so genannte Sitemaps erstellt, die den Seiteninhalt sowie eine einfache Navigationsstruktur durch Verschachtelung beschreiben. Eine Seite ist dabei aus einer Liste von Widgets aufgebaut, die mit Items assoziiert werden. Item-Gruppen verlinken automatisch zu einer dynamisch erstellten Unterseite, so muss z. B. für die Items des Bads im Beispiel keine explizite Konfiguration vorgenommen werden, wie man in Listing 2 und am Ergebnis in Abbildung 2 sieht.

Listing 2

sitemap mein_haus label="Mein Haus" {
  Frame {
    Group item=Bad icon="bath"
  }
  Frame label="Status" {
    Switch item=Anwesend
  }
  Frame label="Wetter" {
    Text item=Aussentemperatur
    Text item=Wind
    Text item=Helligkeit
  }
}

Abb. 2: Das User InterfaceAbb. 2: Das User Interface (Vergrößern)

Hardware-Bindings

Wir haben gesehen, wie wir alle Geräte modellieren und für diese ein User Interface erstellen können. Interessant wird es aber erst, wenn wir auch reale Hardware daran anschließen. Für diesen Zweck gibt es die so genannten Bindings. Ein Binding ist üblicherweise ein optional verfügbares OSGi Bundle für eine konkrete Hardware bzw. für ein Interface oder Protokoll. Ein solches Binding verbindet sich mit dem Event Bus und „übersetzt“ die Kommandos und Statusupdates zwischen diesem Bus und der Hardware. Eine spezielle Konfiguration sagt dem Binding, für welche Items es diese Übersetzung vornehmen soll. Beispiele für existierende Bindings sind folgende:

  • KNX (vormals EIB): Über ein KNX-IP-Gateway (oder dem Softwareäquivalent eibd [10]) werden Bus Events als KNX-Telegramme weitergegeben und umgekehrt. Das ermöglicht insbesondere die Anbindung von Hauselektrik, sofern diese mit einem KNX-Bus ausgeführt ist.
  • 1-Wire: 1-Wire [11] ist ein beliebtes System, um kostengünstig Messwerte (z. B. Temperatur, Feuchtigkeit etc.) zu erfassen.
  • RS-232: Dieses Binding ermöglicht es ganz allgemein, Hardware anzubinden, die über eine serielle Schnittstelle kommuniziert. Dabei werden sowohl binäre Schalt-Items (Signalisierungen auf RS-232) als auch String Items (übertragene Daten) unterstützt. Anwendungsfälle sind z. B. RFID-Leser, steuerbare AV-Receiver u. Ä.
  • Bluetooth: Sind Bluetooth-Geräte in der Nähe, können Schaltvorgänge ausgelöst werden (z. B. als Präsenzerkennung). Auch die Liste aller Bluetooth-Geräte in Reichweite ist auswertbar.
  • Wake-on-LAN: Hiermit können Geräte im lokalen Netzwerk gestartet werden, z. B. ein NAS beim Betreten des Hauses.
  • HTTP: Dieses Binding bietet zweierlei Funktionalität: Zum einen können openHAB-Kommandos Zugriffe auf URLs auslösen, um z. B. Geräte mit Webinterface anzusteuern. Zum anderen kann per Web-Scraping Information aus dem Web für ein openHAB Item genutzt werden. So können beispielsweise Wetterdaten von einer Website ausgewertet werden.
  • Kommandozeile: Das Schweizer-Messer-Binding ermöglicht es, beliebige Kommandos auf der Kommandozeile des Host-Rechners abzusetzen; zu beachten ist jedoch, dass mit der Nutzung dieses Bindings die Plattformunabhängigkeit aufgegeben wird.

Die Binding-Konfiguration kann flexibel per OSGi-Service vorgenommen werden. In den meisten Fällen lässt sich das aber auch komfortabler über die Items-Definitionsdatei erledigen. Hierfür ergänzt man die Item-Definition um die notwendigen Informationen. Zum Beispiel koppelt man den Schalter ANWESEND an sein Handy mit Switch Anwesend { bluetooth=“EC9B5BC453E6″} oder an einen Taster mit Statusrückmeldung am KNX-Bus mit Switch Anwesend { knx=“2/4/31+0/4/31″}. Man hat auf diese Weise jederzeit die Möglichkeit, angeschlossene Hardware auszutauschen oder umzukonfigurieren, ohne dass es eine Auswirkung auf das definierte User Interface oder die Automatisierungsregel hat. Für Hardware, die bisher noch nicht von openHAB unterstützt wird, lässt sich leicht ein eigenes Binding Bundle implementieren und der Runtime hinzufügen.

Geschrieben von
Kai Kreuzer
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.