Spielt ja keine Rolle, was das für ein Wert ist. Du musst halt bei jeder Änderung schauen, ob der Wert über oder unter dem Grenzwert ist und entsprechend die virtuelle Stoppuhr starten oder stoppen. Da es keine echte Stoppuhr in openHAB gibt, ist die gewöhnliche Vorgehensweise, beim Überschreiten des Grenzwerts die Startzeit zu merken (mittels lStart = now.millis, wobei lStart als globale Variable im Format Long angelegt sein muss). Wenn der Grenzwert unterschritten wird, ziehst Du den Startwert vom aktuellen Wert ab: val Long millis = now.millis - lStart.
Nun hast Du in der lokalen Konstanten millis die Anzahl Millisekunden, die der Wert überschritten war. Um irgendwo zu summieren, nutzt Du am besten ein Number Item und zählst dort die Sekunden (also (millis/1000).intValue) Sieht dann so aus:
Code: Alles auswählen
var Long lStart = null
rule "Berechnung der Dauer über 80%"
when
Item Value changed
then
if(previousState <= 80 && newState > 80) {
lStart = now.millis
} else if(previousState > 80 && newState <= 80) {
val Long millis = now.millis -lStart
var Integer iSeconds = 0
if(Dauer.state instanceof Number) iSeconds = (Dauer.state as Number).intValue
iSeconds = iSeconds + (millis/1000).intValue
Dauer.postUpdate(iSeconds)
}
end
Wenn Dauer noch nicht initialisiert wurde, nimmt die Rule 0 als Startwert, ansonsten zählt sie das Number Item hoch.
Vorteil dieser Variante: der Wert wird nur bei Wertänderung geprüft und nur bei Unterschreiten des Grenzwerts aktualisiert.
Nachteil: Der aktuelle Wert wird erst nach Unterschreiten des Grenzwerts sichtbar.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet