Doch, rrd4j kann sehr wohl mit
.previousState umgehen, definitiv. Und das hat auch schon mit openHAB1 funktioniert, hab ich selbst genutzt.
MapDB nutzt Dir aber nichts (hab ich auch so geschrieben...), weil MapDB nur den aktuellen Wert persistiert, nicht den letzten.
Wenn Du auf einen anderen als den Default Persistence Service zugreifen willst, musst Du diesen in der Konfiguration explizit anführen.
Deine Rule wird nicht korrekt funktionieren, denn die Abbruchbedingung bezieht sich auf die aktuelle Leistung, nicht auf die zuletzt anliegende Leistung. Wenn also der letzte gemessene Wert meinetwegen -1000 ist
und der nächste gemessene Wert eine Minute später 1 ist, dann wird die Minute mit 60.000 Ws nicht gezählt.
Ich muss vielleicht auch noch mal darauf hinweisen, dass es einen fundamentalen Unterschied zwischen
.previousState und
previousState gibt.
Ersteres ist Teil der Persistence und steht nur zur Verfügung, wenn das Item mit einer passenden Persistence versehen ist.
Letzteres ist eine implizite Variable, die in jeder Rule zur Verfügung steht, die mit
changed getriggert wurde.
Ersteres enthält ein
HistoricItem, man muss also noch entscheiden, ob man
.state oder
.getTimestamp geliefert bekommen möchte (den Zeitpunkt zu dem der Wert gespeichert wurde) Außerdem muss man entscheiden, ob man die letzte
Aktualisierung oder die letzte
Wertänderung sehen möchte.
Letzteres stellt immer den letzten vom aktuellen Wert verschiedenen Status dar (eben weil die Rule ja auf
changed getriggert hat)
Die Abstände zwischen zwei Messwerten kannst Du aber durchaus bestimmen, indem Du Dir Zeitstempel merkst und die Differenz bildest.
Ob Du einen Wert in einer Number Variablen speicherst und dort addierst oder das über ein Item erledigst, ist egal.
In beiden Fällen wirst Du durch die Verwendung von kWh statt Ws Genauigkeit einbüßen.
Mindestens müsstest Du also
totalNegativeEnergyKWh als
Double definieren (das gilt aber auch für
energyDiffKWh)
Hier:
hast Du Dich vertan, denn
currentEnergyValue und
lastEnergyValue enthalten keine Energiemenge, sondern die aktuelle und die zuletzt gemessene Leistung. Du darfst da keine Differenz bilden. Aber den Wert musst Du auch nicht über eine globale Variable bestimmen, wie oben erklärt kannst Du dafür die implizite Variable
previousState verwenden, die funktioniert selbst wenn gar keine Persistence im System installiert ist.