Suche

openHAB: Die Welt der Dinge in der Hand

Persistence-Support

Um IoT-Services in die Lage zu versetzen, automatische Aktionen (Meldungen, Warnungen, Erinnerungen) auszuführen, müssen sie von unterschiedlichsten Datenproduzenten mit Nutzdaten wie Temperatur-, Verbrauchs- oder Ertragsdaten versorgt werden. openHAB bietet hierfür den Persistence-Support an. Mit ihm können Item-Zustände über einen Zeitraum in Zeitreihen abgespeichert werden. openHAB ist dabei nicht auf einen Speicherort beschränkt. Es können vielmehr beliebig viele Speicherorte wie relationale, objektorientierte und Round-Robin-Datenbanken (RRD) sowie Cloud-basierte IoT-Services und einfache Logfiles unabhängig voneinander bedient werden. Während sich einige der genannten Optionen dazu anbieten, historische Zustände abzufragen und in Regeln zu verwenden, sind andere, wie etwa die IoT-Services, eher für den Datenexport geeignet.

Jede dieser unterschiedlichen Optionen ist ein Persistence-Service. Konzeptionell beschreibt solch ein Service, zu welcher Zeit welche Items abgespeichert bzw. exportiert werden sollen. Dafür werden so genannte Strategies konfiguriert, die konzeptionell den Triggern in openHAB Rules entsprechen. Es ist also möglich, den Status eines Items bei jeder Änderung, jeder Aktualisierung (ohne dass eine Veränderung vorliegen muss) oder nach einem festen zeitlichen Muster, definierbar durch eine Cron-Expression, abzuspeichern.

Für jeden installierten Persistence-Service gibt es eine Konfigurationsdatei im Ordner <openhabhome>/configurations/persistence, deren Name dem zu konfigurierenden Persistence-Service entspricht. Nach bewährter Methode wurde dafür mit Xtext eine eigene DSL kreiert, um eine möglichst gute Adaption des Konzepts durch die Konfiguration zu ermöglichen. Generell ist eine solche Datei aus den Sektionen Strategies und Items aufgebaut, die wie folgt aussehen können:

Strategies {
     : ""
     : ""
    ...
    default = , 
}

Aus Komfortgründen gibt es schon eine Reihe vorgefertigter Strategien, die nicht in der Strategies-Sektion aufgelistet werden müssen. Dies sind:

  • everyChange – speichert einen Status, wenn er sich ändert
  • everyUpdate – speichert einen Status, wenn er aktualisiert wird (unabhängig davon, ob sich der zugrunde liegende Status geändert hat)
  • restoreOnStartup – überschreibt den Item-Status mit dem zuletzt gespeicherten Wert, wenn der Status beim Systemstart undefiniert ist. Das ist insbesondere bei virtuellen Items (wie „Anwesenheit“) sinnvoll, da deren Status nicht von anderer Stelle abgefragt werden kann.

Die Items-Sektion kann wie folgt ausgestaltet werden:

Items {
     [-> ""] [: strategy = , , ...]
     [-> ""] [: strategy = , , ...]
    ...
}

<itemlist> kann dabei eine durch Kommata gegliederte Liste sein, in der folgende Optionen erlaubt sind:

  • * – alle Items werden erfasst
  • <itemname> – ein einzelnes Item wird erfasst (GroupItems sind hier ebenfalls erlaubt, wobei tatsächlich der Status der Gruppe und nicht der seiner Mitglieder erfasst wird)
  • <groupname>* – alle Mitglieder dieser Gruppe werden erfasst, nicht aber die Gruppe selbst.

Zu jeder Item-Konfiguration kann ein (optionaler) Alias konfiguriert werden. Dieser dient zum Beispiel zur Auswahl einer speziellen Tabelle oder der Feed-ID eines IoT-Service. Ebenfalls optional ist die Angabe der Speicherstrategie. Fehlt die Angabe, ziehen die als default markierten Strategien der Sektion Strategies. Eine gültige Konfiguration für den IoT-Service Open.Sen.Se [6] könnte aussehen wie in Listing 1 (Abb. 1).

Listing 1
// Strategien haben einen Namen und eine Definition. Sie werden in der Sektion 
// "Items" referenziert
Strategies {
    everyHour : "0 0 * * * ?"
    everyDay  : "0 0 0 * * ?"

    // wenn für ein Item keine Strategie spezifiziert wurde, findet die
    // unten aufgeführte default-Strategie Anwendung
    default = everyChange
}

Items {
    // Speichere den aktuellen Wasserverbrauch unter dem Alias '4711'

    // bei jeder Änderung und zusätzlich jede Stunde. Stelle den Wert 
    // beim Systemstart her. 
    Wasserverbrauch -> 4711 : strategy = everyChange,everyHour,restoreOnStartup
}

Abb. 1: Anzeige des Wasserbrauchs in Open.Sen.Se [4]
Kommentare

Schreibe einen Kommentar

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