Seite 2 von 2

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 22. Jul 2022 19:15
von udo1toni
Also, Du schreibst bei jedem Systemstart eine Reihe Werte in die Datenbank und liest sie sofort wieder aus? Ich nehme an, es geht Dir beim dem Block "Aufzeiten zuweisen" nur um ein einmaliges initialisieren?
Jedenfalls war der vorherige Wert des Items ganz sicher NULL, wenn Du seit Systemstart nicht nochmal geschrieben hast.

Ich verstehe ehrlich gesagt auch nicht, worauf Du mit dem Code hinaus willst.

Wenn das System startet, sind alle Items erst mal mit dem Wert NULL gesetzt. Wenn Du möchtest, dass die Items den Wert vor dem Herunterfahren bekommen, so reicht es, in einer(!) der *.persist Dateien die Strategy everyChange,restoreOnStartup zu setzen.
Geht es darum, die Einstellungen wiederherzustellen, die zu einem ganz bestimmten Zeitpunkt galten, so musst Du mit historicState(<zeitstempel>).state arbeiten, wobei Du dann aber wissen musst, wann die Daten gespeichert wurden.

Allgemein wird man meist die zuletzt eingestellten Werte wiederherstellen wollen. Das geht am einfachsten über die mapDB Persistence.
Die mapDB speichert exakt den aktuellen Zustand eines Items. Beim Start von openHAB kann sie deshalb exakt den Zustand beim Herunterfahren des Systems wiederherstellen.

Dazu brauchst Du aber überhaupt keine Regel!

Der Codeeblock

Code: Alles auswählen

        gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            zw = i.previousState(true,"influxdb").state as Number
löst mit ziemlicher Sicherheit den Fehler aus, denn zu diesem Zeitpunkt hat das Item das erste Mal einen gültigen Wert. Der vorhergehende Wert ist also NULL. NULL ist keine gültige Zahl und kann also auch nicht nach Number gecastet werden.
Wenn überhaupt, so müsste der Codeblock so aussehen:

Code: Alles auswählen

        gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            if(i.previousState(true,"influxdb").state instanceof Number)
                zw = i.previousState(true,"influxdb").state as Number
            else 
                zw = 0
oder alternativ kürzer:

Code: Alles auswählen

        gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            zw = if(i.previousState(true,"influxdb").state instanceof Number) i.previousState(true,"influxdb").state as Number else 0
Der ternäre Operator x= if(a) b else c weist x in Abhängigkeit von a entweder Wert b oder c zu.

Darf ich fragen, was Du eigentlich erreichen willst? Schon allein, dass Du Auf- und Abzeiten der Rollläden in openHAB setzt, scheint mir umständlich.
Ich habe hier diverse Sonoff T1 2Ch mit denen ich Rollläden steuere. Die Auf- und Abzeiten sind dabei im Sonoff gespeichert. Die Position gebe ich in % an, 0 % = maximal offen, 100 % = maximal geschlossen. Die normalen Steuerbefehle (UP/DOWN/STOP) funktionieren ebenfalls.
Die Sonoff sind mit Tasmota geflasht, welches seit V7.irgendwas auch Rollläden steuern kann, wenn man das möchte (muss natürlich aktiviert werden). Aktuell ist wohl V12.0.2...

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 22. Jul 2022 21:07
von MISPEZI
Danke vielmals für die schnelle und umfassende Antwort.
Ich versuche mal die Punkte nacheinander zu klären:
Wenn das System startet, sind alle Items erst mal mit dem Wert NULL gesetzt. Wenn Du möchtest, dass die Items den Wert vor dem Herunterfahren bekommen, so reicht es, in einer(!) der *.persist Dateien die Strategy everyChange,restoreOnStartup zu setzen.
Genau das möchte ich! Hatte aber aus den vorausgegangenen Beiträgen geschlossen, dass ich, wenn es nicht die "Standartdatenbank" ist aus der gelesen werden soll, die DB angeben muss.
Das geht am einfachsten über die mapDB Persistence
Das werde ich mir auf jeden Fall mal genauer ansehen - Danke für den Tipp.
Dazu brauchst Du aber überhaupt keine Regel
Wenn das alleinige setzten des "restoreOnStartup" reicht hast Du natürlich recht - den Zeitversatz zum lesen der Rules habe ich mir vorhin angesehen - das sieht gut aus.
denn zu diesem Zeitpunkt hat das Item das erste Mal einen gültigen Wert. Der vorhergehende Wert ist also NULL. NULL ist keine gültige Zahl und kann also auch nicht nach Number gecastet werden.
Auch das ist mir dann klar. Allerdings stand im Log "null" und nicht "NULL". Also nicht Wert=NULL sondern gar keinen Wert = null.
Schon allein, dass Du Auf- und Abzeiten der Rollläden in openHAB setzt, scheint mir umständlich
Da hast Du recht. Es ist der Anfangsphase des Rolladenprojektes geschuldet. Der einzige Verteil ist, das alle Werte an einem Ort liegen. Ist aber auch nicht mehr stand meiner Philosophie, hab sie inzwischen auch in den ESP's. Die werden aber immer noch überschrieben, wenn OH was anderes liefert. :lol:
Ich habe hier diverse Sonoff T1 2Ch mit denen ich Rollläden steuere
Bei mir sind es selbstgelötete Platinen mit ESP8266-Chips. Sie sind mit ESPEASY geflasht und mit entsprechenden Rules versehen tun dasselbe wie die Sonoffs. 10 Stück (bald 14) bei mir und 12 bei meiner Tochter.

Also als Essenz des Ganzen: Ich werde Influxdb für die Daten nutzen, die ich in Grafan darstellen möchte und die mapDB für die Daten die wiederhergestellt werden müssen. Außerdem werde ich dafür sorgen, das die Rules erst nach den Items geladen werden gemäß https://www.openhab.org/docs/configurat ... tence.html Startup Behavior Workaround 2

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 23. Jul 2022 11:33
von udo1toni
MISPEZI hat geschrieben: 22. Jul 2022 21:07 Allerdings stand im Log "null" und nicht "NULL". Also nicht Wert=NULL sondern gar keinen Wert = null.
Typisches Missverständnis... die null an dieser Stelle hat ja nichts mit dem Item zu tun, es ist lediglich der Hinweis, dass eine Berechnung aufgrund eines fehlenden Wertes nicht möglich war.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 23. Jul 2022 15:24
von MISPEZI
Nun habe ich, glaube ich zumindest, ein neues Problem.
Ich hab folgendes zum testen gemacht:
Die MapDB installiert.
Einen Switch "MyTestSwitch" angelegt, eine mapdb.persist angelgt und den Switch dort eingtragen

Code: Alles auswählen

Strategies 
{
   everyMinute	: "0 * * * * ?"
   everyHour    : "0 0 * * * ?"
   everyDay     : "0 0 0 * * ?"
   default = everyChange
}
 
 
Items
    {
// zum Testen ob er was schreibt
        MyTestSwitch : strategy = everyChange, restoreOnStartup   
        ....
Dann per SSH auf den Pfad : "openhabian@openHABianDevice:/srv/openhab-userdata/persistence/mapdb" gestellt und geguckt was es da an Dateien gibt. Erstmal nur eine Readme.txt in der steht, dass ich an der richtigen Stelle bin.
Dann hab ich den Switch betätigt und erwartet, das sich in dem Verzeichnis was tut. Tut es aber nicht :?: und es hätte sich doch was tuen müssen, oder?

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 23. Jul 2022 18:48
von udo1toni
Nein? mapDB benutzt nur eine einzige Datei. Wichtig ist nur, dass der Zustand des Items wiederhergestellt wird. Am einfachsten schaltest Du den Schalter auf ON und beendest openHAB. Nachdem Du openHAB wieder gestartet hast, sollte der Schalter wieder auf ON stehen. Wenn Du ihn auf OFF schaltest und das ganze Spiel wiederholst, sollte der Schalter nach dem Neustart auf OFF stehen.