Du kannst Watt nicht als Kilowattstunden aufaddieren, das sind nun mal unterschiedliche Größen.
Du könntest bei jeder Änderung bestimmen, wie lange die letzte Änderung her ist und z.B. für diese Zeit den gemessenen Wert multipliziert mit der Zeit in Sekunden als Wattsekunden aufaddieren.
Je nachdem, die die Leistung gemessen und geliefert wird, kann das auch funktionieren, darauf wetten würde ich nicht.
Aber ein Versuch:
Code: Alles auswählen
rule "Zähle Ws wenn negativ"
when
Leistung changed
then
if(!(previousState instanceof Number)) // letzter(!) Wert ungültig?
return;
if(Leistung.previousState(true).timestamp === null) // Zeitstempel von letztem Wert nicht vorhanden?
return;
val nWatt = (previousState as Number).floatValue
if(nWatt >= 0) // Wert positiv oder 0?
return;
var nSum = 0.0
if(Energie.state instanceof Number) { // gültige Summe?
nSum = (Energie.state as Number).floatValue // dann Summe in Variable übernehmen
val dtTS = (Leistung.previousState(true).timestamp as DateTimeType).getZonedDateTime() // Zeitpunkt letzte Änderung
val nSec = ((now().toInstant.toEpochMilli - dtTS.toInstant.toEpochMilli) / 1000).floatValue // Sekunden seit letzter Änderung
val nWs = nWatt * nSec
nSum = nSum - nWs // nWs ist negativ
Energie.postUpdate(nSum)
end
Zu beachten: Die Rule triggert bei Wertänderung des Items (d.h., die bisherige Leistung hat sich geändert). Zu diesem Zeitpunkt können wir also die
vergangene(!) Leistung aufaddieren (nicht die aktuelle!).
Deshalb prüft die Rule, ob der
vorherige Wert eine gültige Zahl ist und bricht die Rule ab, falls das nicht der Fall ist.
Handelt es sich um eine gültige Zahl, interessiert uns, wann dieser Wert gesetzt wurde, also der Zeitstempel der letzten Änderung (das ist der Parameter
true, false würde den Zeitstempel der letzten
Aktualisierung liefern).
Leider kann auch der Zeitstempel ungültig sein, also prüfen wir, ob wir einen Wert ungleich null bekommen (man könnte auch explizit auf
instanceof DateTimeType prüfen).
Wird kein gültiger Zeitstempel geliefert, muss die Messung verworfen werden, also Abbruch der Rule.
Nun steht also fest, dass wir einen gültigen Messwert haben und auch einen passenden Zeitstempel dazu. Aber handelt es sich um einen negativen Messwert? Das lässt sich erst nach Übernahme des vorherigen Wertes in eine lokale Konstante sicher feststellen

und falls der Wert nicht negativ ist, kann die Rule wiederum abgebrochen werden.
Zu guter Letzt müssen wir uns noch die aktuelle Summe aus dem Item holen, welches die Ws (Watt * Sekunde) enthält. Wird hier kein gültiger Wert geliefert, geht die Rule davon aus, dass der Zählerstand 0 ist.
Ansonsten wird die aktuelle Summe in eine lokale Variable übernommen.
Nun wird noch die Differenz zwischen aktueller Zeit und dem Zeitstempel gebildet (in Sekunden), sowie das Produkt aus dem letzten Messwert und der Differenz. Dieser Wert wird abschließend von der Summe abgezogen

denn da die Leistung ja negativ ist, ist auch das Produkt negativ und muss also abgezogen werden, um einen positiven Wert zu erhalten.
Das Ergebnis der Rechnung wird in das Summenitem übernommen.
Allein an der Anzahl der Prüfungen vor der Berechnung kann man schon sehen, was da alles schief gehen kann

und ob die Leistung nun wirklich über den gesamten Zeitraum zwischen zwei unterschiedlichen Messwerten konstant war, ist nur eine Mutmaßung, aber ich habe ja schon weiter oben darauf hingewiesen, dass wir vermutlich kein belastbares Ergebnis erhalten werden.
Du kannst den Wert auch in kWh berechnen, dann musst Du halt die Watt durch 1000 teilen und die Sekunden durch 3600 teilen. Allerdings solltest Du dann unbedingt überall Double (.doubleValue) als Zahlenformat wählen. Ich möchte dringend die Einheit Ws empfehlen, auch im Hinblick auf ein hoffentlich bald erfolgendes Upgrade auf openHAB4

wo Du Dir die Ws einfach als kWh anzeigen lassen kannst (oder als Joule, Kalorie, wie auch immer es beliebt). Notfalls kannst Du bis zum Upgrade in einem zweiten Item die Ws in kWh speichern, jedoch ohne die Genauigkeit des Wertes zu verlieren. Die Rule wird alle paar Sekunden triggern, die dann addierte Energiemenge ist so klein, dass kWh hier vermutlich schlicht zu ungenau wird, denn das interne Format des Items kannst Du nicht beeinflussen.