Seite 1 von 1

kann persistence nicht einrichten

Verfasst: 23. Jan 2025 18:41
von rebell21
ich habe versucht, die Temperaturdaten dauerhaft in eine Mariadb zu speichern. Ich habe die JDBC Mariadb als Persistence Add on installiert.
Dann einen JDBC Treiber in der Verzeichnis $OPENHAB_HOME/addons kopiert. Dann die default persistence von RRD4j auf JDBC MariaDB umgeschaltet
Trotzdem sehe ich im frontail log jede Menge Fehlermeldungen der Form

Code: Alles auswählen



2025-01-23 18:35:38.552 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.554 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.557 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'HeizungViessmann_Outside_Temperature'

2025-01-23 18:35:38.559 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.561 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.562 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'HeizungViessmann_Outside_Temperature'

2025-01-23 18:35:38.564 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.567 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!

2025-01-23 18:35:38.569 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'HeizungViessmann_Outside_Temperature'



Ich habe mariadb-java-client-3.5.1.jar im Verzeichnis $OPENHAB_HOME/addons und den service neu gestartet. Außerdem gibt es eine Datei jdbc.persist in /etc/openhab/persistence

Wo muss ich welchen JDBC Treiber hinkopieren ?

Anmerkung : die default RRD4j persistence (konfiguriert mit rr4j.persist) funktioniert. Ich kann den Zeitverlauf von Temmperaturen sehen.

Re: kann persistence nicht einrichten

Verfasst: 24. Jan 2025 18:54
von udo1toni
Was denn für ein Treiber? Du musst nichts extra einrichten!

Du musst MariaDB (den Server) installieren (irgendwo), in MariaDB eine Datenbank für openHAB anlegen, mit einem passenden User, der volle Rechte auf diese Datenbank hat, dann in openHAB das JDBC-MariaDB Addon installieren und konfigurieren (User, Passwort, Datenbankname, IP-Adresse und Port unter denen MariaDB erreichbar ist).

MariaDB lässt default nur localhost Zugriffe auf die Engine zu, falls MariaDB also auf einem anderen Rechner läuft als openHAB, musst Du außerdem noch die Konfiguration von MariaDB anpassen.

Re: kann persistence nicht einrichten

Verfasst: 25. Jan 2025 00:02
von rebell21
das habe ich so gemacht
1. mariadb installiert und Datenbank openhab mit create database openhab erzeugt

2. user openhab mit create user 'openhab'@'%' identified by 'password';

3. grant all privileges on openhab.* to 'openhab' @'%'

4. flush privileges;

5. mit "mysql -u openhab -p -h x.x.x.x" kann openhab erfolgreich connecten von remote

6. JDBC persistenz installiert in openhab und konfiguriert mit "jdbc:mariadb://x.x.x.x:3306/openhab" und user/password

7. default persistence auf JDBC umgeschaltet

8. Datei jdbc.persist in /etc/openhab/persistence angelegt

Diese funktioniert auch, immerhin will openhab das dort genannte item 'Temperatur_Terrasse_Actual_Temperature' in der mariadb speichern.


geht aber nicht. In frontail sehe ich die Fehlermeldung

Code: Alles auswählen


2025-01-24 23:57:22.217 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.218 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.218 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'Temperatur_Terrasse_Actual_Temperature'
2025-01-24 23:57:22.218 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.218 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.218 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'Temperatur_Terrasse_Actual_Temperature'
2025-01-24 23:57:22.218 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.219 [WARN ] [persistence.jdbc.internal.JdbcMapper] - JDBC::openConnection: no driver available!
2025-01-24 23:57:22.219 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: database not connected, query aborted for item 'Temperatur_Terrasse_Actual_Temperature'

Wo muss ich den fehlenden jdbc-Treiber herholen und wo dann hinkopieren ?
Was muss ich noch konfigurieren ? Neustart des openhab services ?

Re: kann persistence nicht einrichten

Verfasst: 25. Jan 2025 00:17
von rebell21
funktioniert !!!

nach einem Neustart des Services tauchen jetzt in der Datenbank items auf und eine Tabelle Namens "item0001". Dort sind Werte
Danke geht !!!

Re: kann persistence nicht einrichten

Verfasst: 25. Jan 2025 10:38
von rebell21
es funktioniert. Aber : Ich kann die Zeitintervalle nicht korrekt einstellen. Im Moment speichert openhab die Werte jede Sekunde. Ich versuche eine andere strategy zu definieren.

Aber openhab lehnt meine cron Strings als fehlerhaft ab. Ich versuche eine Speicherung jede Minute und habe dafür den CRON String "* * * * *" als strategy definiert (unix kompatibel)

Code: Alles auswählen


Strategies {
       every30Seconds:     "*/5 * * * * ? *"
       everyMinute:  "* * * * *"
}

Das quittiert openhab mit folgender Fehlermeldung.

Code: Alles auswählen


2025-01-25 10:29:56.195 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'jdbc.persist'

2025-01-25 10:29:56.206 [ERROR] [ore.common.registry.AbstractProvider] - Could not inform the listener 'org.openhab.core.persistence.internal.PersistenceServiceConfigurationRegistryImpl@21f932c0' about the 'UPDATED' event!: Invalid cron expression, too little fields. 6 or 7 (with year) expected but was: '* * * * *'

Welchen Cron String erwartet openhab für "jede Minute"

Re: kann persistence nicht einrichten

Verfasst: 25. Jan 2025 13:24
von udo1toni
Ja, da hat openHAB Recht, die Cron Ausdrücke sind falsch. :)

Der wichtigste Punkt hier: openHAB nutzt Quartz cron. Im Unterschied zum "normalen" cron, welches z.B. im GNU/Linux System eingesetzt wird, ist Quartz cron sekundengenau.
Und weil es sekundengenau ist, muss man die Sekunden auch angeben :)
Der Aufbau des Quratz cron Ausdrucks ähnelt in weiten Teilen dem des normalen cron Ausdruck, mit zwei wesentlichen Unterschieden, nämlich eben der Sekunde und dann noch dem ?.

Code: Alles auswählen

Strategies {
//                    s    m h D M W Y
    every30Seconds:  "5/30 * * * * ? *"
       everyMinute:  "2    * * ? * *"
// s - Sekunde
// m - Minute
// h - Stunde
// D - Tag (des Monats)
// M - Monat
// W - Wochentag
// Y - Jahr (optional, kann entfallen)
// * - Wert egal
// ? - Wert egal (entweder Tag oder Wochentag, muss verpflichtend exakt einmal vorkommen!
}
Es gibt noch diverse weitere Funktionen, mit denen man z.B. gezielt den letzten Tag des Monat, den 3. Montag im Monat usw. ansprechen kann, die schenke ich mir hier mal.
Der cron Ausdruck "every30Seconds" löst alle 30 Sekunden aus, und zwar in Sekunde 5 und 35 (natürlich kannst Du hier auch eine 0 rein schreiben, geht nur darum, zu erklären, wie was zusammenhängt). Der cron Ausdruck "everyMinute" löst einmal pro Minute aus, und zwar zur 2. Sekunde der Minute.
Es ist übrigens durchaus eine gute Strategie, cron Ausdrücke zu verteilen, also nicht drölfzig Time Ereignisse zur vollen Minute zu starten.
Noch mal zum ?: Wie geschrieben ist dieses verpflichtend in jedem cron Ausdruck anzugeben, entweder als Wochentag oder als Tag des Monats. Man kann also keine cron Rule schreiben, die nur am Freitag dem 13. auslöst :)
Als Feldtrenner dient das Leerzeichen, wobei mehrere aufeinander folgende Leerzeichen als ein Leerzeichen betrachtet werden (siehe everyMinute)
Als Werte sind für das jeweilige Feld passende Zahlen erlaubt, man kann Wertebereiche angeben (z.B. 1-12), mehrere diskrete Werte (5,20,35,50), oder auch eine Kombination aus beidem (0-5,17-39), wichtig ist nur, dass kein Leerzeichen verwendet wird :) denn das ist ja der Feldtrenner.
Im Fall des Monats und des Wochentags sind zusätzlich noch die englischen Abkürzungen erlaubt.
Die Wochentage sind von 1=MON -> Montag bis 7=SUN -> Sonntag nummeriert. Will man also etwas Samstag bis Dienstag geschehen lassen, wäre der korrekte Ausdruck 1-2,6-7, nicht 6-2 (und natürlich könnte man auch ebenso gut 1,2,6,7 schreiben)

Re: kann persistence nicht einrichten

Verfasst: 25. Jan 2025 14:28
von rebell21
super danke, nun funktioniert es. Ich war vom Unix Cron ausgegangen