openHAB Werte speichern und laden – Persistenz einführen

Die ersten Schritte mit openHAB sind wirklich kein Hexenwerk. Schnell hat man eigene Komponenten angelernt und kann erste Erfolge feiern. Meine erste Hürde, an welcher ich einen Moment hing, war das Thema der Speicherung von Konfigurationswerten. Konkret ging es um die Anforderung dass ich gerne Werte wie Zeitpunkte oder Status über die UI ändern möchte. Diese Werte sollen sich natürlich auch nach einem Neustart des System wieder auf dem letzten Wert befinden. openHAB muss also Werte speichern und diese beim Neustart wieder laden.

die Ausgangssituation

Als eine der ersten Funktionen in meiner openHAB Installation habe ich die Automatisierung der Rolladensteuerung umgesetzt. Die Basis für diese ist eine Oberfläche in welcher ich die Steuerung global aktivieren oder deaktivieren kann. Zusätzlich benötige ich einige Werte um die Steuerung flexibel anpassen zu können. So z.B. die Uhrzeiten zu welchen die Rolläden hoch oder runter fahren sollen. Zusätzlich verfüge ich noch über einen Helligkeitssensor welcher in die Steuerung mit eingebunden ist. Bei mir sieht das wie folgt aus:

openHAB Werte speichern - Rolladensteuerung
Konfiguration der Rollandensteuerung

Nachdem ich die entsprechenden Items angelegt und in den Regeln hinterlegt habe funktionierte die Steuerung gut.

openHAB Werte speichern und Laden – das Problem

Inital ging ich erstmal davon aus, dass Werte von Items, in diesen werden die Konfigurationen nämlich gespeichert, automatisch persistent vorliegen. Nachdem ich dann allerdings meinen Raspberry PI vom Büro an seinen eigentlichen Platz brachte und neu startete waren alle Werte weg. Ich lernte schnell dass die Werte von Items nur flüchtig sind und nicht persistent vorliegen.

Der Bereich der Persistenz ist im Wiki von openHAB ganz gut beschrieben. Dennoch sind hier viel mehr Schritte notwendig als auf den ersten Blick zu sehen.

Schritt 1 – Datenspeicher anlegen

Ich habe mich dazu entschieden eine MariaDB als Datenspeicher auf dem PI anzulegen. Zum einen ist die Konfiguration recht einfach, zum anderen sind somit später alle Daten per SQL auswertbar. Kann nie schaden 🙂

Also einmal per SSH auf den Raspberry PI verbinden und folgende Kommandos ausführen:

sudo apt update #update der pakete
sudo apt install mariadb-server #installation des db-servers
sudo mysql_secure_installation #grundreinrichtung des servers

Nachdem der Server eingerichtet ist legen wir eine neue Datenbank mit einem neuen User für openHAB an:

sudo mysql -u root -p #login mit dem root-kennwort
create database openhab; #Anlage einer neuen DB 'openhab'
ceate user 'openhab'@'%' identified by 'meinkennwort'; #kennwort anpassen
grant all privileges on openhab.* to 'openhab'@'%' identified by 'meinkennwort'; #kennwort anpassen
flush privileges;

Der MariaDB Server ist nun eingerichtet und verfügt über eine leere Datenbank für openHAB. Nun müssen wir diese noch an openHAB selbst anbinden.

Schritt 2 – Datenbankbinding einrichten

Zuerst installieren wir das “JDBC Persitence MariaDB” Binding. Nachdem dies geschehen ist erscheint in den Settings von openHAB ein neuer Menüpunkt “JDBC Persistence Service” über welchen wir die Einstellungen vornehmen können:

JDBC Persistence Settings in openHAB
JDBC Persistence Settings in openHAB

Als “Database URL” hinterlegen wir einfach ‘jdbc:mariadb://localhost:3306/openhab’ wobei das ‘openhab’ nach dem letzten Slash dem Datenbanknamen entspricht, welcher im Schritt 1 angelegt wurde. Nun speichern wir noch den Usernamen und das gewählte Passwort zur Datenbank und schon ist die Verbindung zur Datenbank hergestellt.

Ich selbst habe nun auch die Standard-Persistenz auf den JDBC geändert so dass alle persistierten Daten automatisch in der angelegten MariaDB landen. Das macht es mir deutlich einfacher und sorgt dafür, dass alle Daten an einer zentralen Stelle gespeichert werden (ausser explizit anders angegeben):

JDBC als Default Persistence in openHAB
JDBC als Default Persistence in openHAB

Schritt 3 – automatisches Laden von Items per Gruppe einrichten

Um Items möglichst einfach automatisch beim Systemstart mit dem alten Wert wieder herstellen zu können bin ich den Weg einer Gruppe gegangen. Hierbei wird eine leere Gruppe angelegt. Dieser Gruppe werden alle Items im System zugeordnet, welche beim Systemstart geladen werden sollen:

Inhalt der Datei ‘jdbc.items’

Group	gRestoreOnStartup	"Restored Items on Startup"

Nun legen wir noch eine Date im Ordner ‘persistence’ ab welche das Speichern und das Laden der Daten ermöglicht.

Inhalt der Datei ‘jdbc.persist’

Strategies {
everyMinute : "0 * * * * ?"
}
Items {
*                       : strategy = everyChange
gRestoreOnStartup*      : strategy = everyChange, restoreOnStartup
}

Nach dem Speichern dieser Datei passiert folgendes. Jedes Item welches angelegt ist speichert bei jeder Änderung, seinen Status. Items, welche in der Gruppe ‘gRestoreOnStartup’ sind werden beim Systemstart mit dem zuletzt gespeichertem Wert wieder geladen.

Schritt 4 – Elemente der Gruppe zuordnen

Um nun das Laden der alten Werte beim Systemstart zu aktivieren genügt es, die gewünschten Items der Gruppe ‘gRestoreOnStartup” zuzuweisen. Dies kann entweder über die items-Datei oder über die UI erfolgen.

openHAB - Gruppe der Items zum Restore beim Systemstart

openHAB Werte speichern und Laden – Zusammenfassung

Wie immer ist es recht einfach wenn man weiß wie es geht. Mich selbst hat das Thema der automatischen Speicherung der Konfigurationswerte ein paar nerven gekostet. Ehrlicherweise muss ich allerdings gestehen dass ich einfach nur ein wenig doof war. In meinem Fall hat ein einziger Buchstabendreher dafür gesorgt, dass die Speicherung nicht funktionierte. Also achtet bitte selbst peinlich darauf dass die Datei im ‘persistence’-Verzeichnis auf jeden Fall den Namen ‘jdbc.persist’ trägt 🙂

Artikel teilen

This article was written by Thomas Schiffler

Alles was mit IT zu tun hat steht bei mir hoch im Kurs. Hierbei dreht sich vieles um Java, Python oder auch mal PHP. Unser Zuhause ist mit diversen Raspberry PIs ausgestattet mit welchen ich versuche unser Leben durch etwas Automatisierung ein wenig smarter zu gestalten. Hierbei möchte ich die Technik und die dahinter eingesetzten Tools / Frameworks verstehen und nicht einfach nur Anwenden. Ich selbst bezeichne mich als ITler aus Leidenschaft :)

Schreibe einen Kommentar

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