Eine SQL-Datenbank für openhab2

Irgendwie traue ich der openhab2-mapdb-Impementierung nicht so ganz, denn manchmal gehen manche Item-States irgendwie einfach verloren. Daher habe ich mich entschlossen, einen kleinen SQL-Server auf meinem Raspberry laufen zu lassen.

Installation und Konfiguration mysql/mariaDB  und phpmyadmin

Als Software wird nun mariaDB(bei vielen Linux-Distributionen der Nachfolger von mysql) benötigt. Um auch später in die Datenbank schauen zu können wird phpmyadmin installiert.

apt-get install mysql-server phpmyadmin

Während der Installationsroutine wählen wir einmal apache als Webserver, lassen wir das phpmyadmin-Paket gleich die Datenbank konfigurieren und wählen ein Passwort für den Zugriff. Nach der Installation ist phpmyadmin über <Serveradresse>/phpmyadmin/ aufrufbar.

Problem an der Sache ist aber, dass in mariadb-Logik der root-Benutzer des Betriebssystems sich ohne Passwort sofort als root-Benutzer der SQL-Serverinstallation anmelden kann. Ein Login via Usernamen+Passwort ist nur begrenzt möglich, es muss die Installation etwas verändert werden. Dies bringt aber oft andre Probleme mit sich, daher erachte ich es als beste Lösung, einen zweiten Benutzer „admin“ mit Root-Privilegien zu nutzen. Für alles was dann passiert am System kann dieser anstelle des root-Nutzers verwendet werden, z.B. auch für den späteren Login in phpmyadmin.

Um diesen Benutzer einzurichten muss als root-Benutzer in der Shell auf mariadb zugegriffen werden und der Benutzer muss mit entsprechenden Rechten angelegt werden. Im Beispiel hat der Nutzer „admin“ dann das Passwort „raspberry“:

> mysql
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'raspberry'; GRANT ALL PRIVILEGES ON . TO 'admin'@'localhost' WITH GRANT OPTION; CREATE USER 'admin'@'%' IDENTIFIED BY 'raspberry'; GRANT ALL PRIVILEGES ON . TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
exit

Nun kann man sich mit dem Benutzer einfach per phpmyadmin einloggen und die Datenbankadministration starten.

Datenbank für openHAB2 vorbereiten

Nun muss ein Benutzer und eine Datenbank für openhab angelegt werden. Dies kann entweder über phpmyadmin oder nochmal via Shell passieren. Im Beispiel wird wieder als root-Benutzer ein Benutzer „openhab“ mit dem Passwort „raspberry“ angelegt, der dann Zugriff auf eine neu erstellte Datenbank „openhab“ erhält:

> mysql
CREATE DATABASE openhab;
CREATE USER 'openhab'@'localhost' IDENTIFIED BY 'raspberry';
GRANT ALL PRIVILEGES ON openhab.* TO 'openhab'@'localhost';
FLUSH PRIVILEGES;
exit

openHAB2 für SQL-Zugriff (mariadb) konfigurieren

In der PaperUI installieren wir nun das JDBC-Persistence Add-On für MariaDB.

Sobald es installiert wurde erzeugt openHAB2 eine Datei /etc/openhab2/services/jdbc.cfg in welcher wir dann wie folgt den Datenbankzugriff konfigurieren. 3306 ist dabei der Standard-Port von MySQL / mariaDB.

url=jdbc:mariadb://localhost:3306/openhab
user=openhab
password=raspberry

Im Logfile openhab.log quitiert uns das erfolgreiche Einstellen der Verbindung folgender Logeintrag:

[INFO ] [persistence.jdbc.internal.JdbcMapper] – JDBC::openConnection: Driver is available::Yank setupDataSource

Damit wird dann auch gleich die Tabelle „items“ angelegt in der Datenbank und die Infrastruktur steht damit. Nun müssen wir eine persistence-Datei anlegen, welche OpenHAB2 dann auch sagt, wohin er die Items schreiben soll. Diese Datei muss lauten /etc/openhab2/jdbc.persist und folgenden Inhalt haben:

Strategies {
  default = everyChange
}
Items {
* : strategy = everyChange, restoreOnStartup
}

Diese Strategie speichert die Zustände aller Items nun in der Datenbank. Mit Speichern dieser Konfigurationsdatei wird sofort begonnen, die Items in die Tabelle items zu schreiben. Jedes Item bekommt darin eine fortlaufende Nummer.
Anschließend legt openHAB2 automatisch für jedes Item eine eigene Tabelle an mit Namen item<NR> wobei <NR> die aus der Tabelle items ersichtliche laufende Nummer ist, vierstellig mit führenden Nullen. Scheinbar ist dann die Anzahl der Items auch auf 9999 limitiert.

Je Item werden in der dazugehörigen Tabelle ab jetzt je Item-Stauts-Veränderung neue Einträge mit Zeitstempel in der Datenbank erzeugt. Jedes Licht an / aus erzeugt so eine Datenzeile. Ob man das braucht und ob man evtl nur bestimmte Items loggen will bleibt letztlich jedem selbst überlassen. Wahrscheinlich ist es aber sinnvoll, von Zeit zu Zeit alte Item-States wegzuschmeissen. Wen interessiert denn am Ende noch, wann konkret vor 2 Jahren das Wohnzimmerlicht an- und wieder Ausgeschalten wurde?

Zum Thema Persistence gibt’s hier weiteren Lesestoff: https://www.openhab.org/docs/configuration/persistence.html

Alte mapDB-Persistence deinstallieren

Als letzter Schritt bleibt mir nun, die MapDB-Persistence zu deinstallieren via PaperUI, denn diese brauche ich nicht mehr und das Logging soll ja schließlich nur noch in der SQL-Datenbank erfolgen.

openHAB2 neustarten

Da ich feststellen musste, dass scheinbar nicht für jedes item eine Tabelle angelegt wurde bzw. nicht jedes Item in der items-Tabelle erfasst wurde, sollte ein Neustart von openhab aufräumen und den gewünschten Zielzustand herstellen:

service openhab2 restart

2 Antworten auf „Eine SQL-Datenbank für openhab2“

  1. Hallo, mich interessiert das Projekt mit dem SQL Server auf dem RBPI3. Ich kämpfe seit einigen Tagen, dass die Statuse der MQTT Geräte aktuell angezeigt werden. Leider ist das scheinbar ohne Datenbank nur beschränkt möglich.

    Nun stehe ich bei der Installation bereits an, denn nach der Installation kam ein Fehler dass die FireMotD nicht updatebar ist. Das habe ich dann manuell nachgeholt und die Installation der Mysql nochmal erledigt. Ich kann mich mit dem vergebenen Passwort das bei der Installation eingegeben wurde weder auf der Weboberfläche noch in der Console anmelden.
    [14:37:50] openhabian@openHABianPi:~$ sudo mysql
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    Your MariaDB connection id is 6
    Server version: 10.1.37-MariaDB-0+deb9u1 Raspbian 9.0

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type ‚help;‘ or ‚\h‘ for help. Type ‚\c‘ to clear the current input statement.

    MariaDB [(none)]> CREATE USER ‚admin’@’localhost‘ IDENTIFIED BY ‚raspberry‘;
    ERROR 1396 (HY000): Operation CREATE USER failed for ‚admin’@’localhost‘
    MariaDB [(none)]>
    Sobald ich eine Zeile für den neuen Benutzer eingebe erscheint dieser Fehler.
    Bitte um Hilfe!
    vielen herzlichen Dank im Voraus!
    Karl-Heinz

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.