Seite 1 von 2

Zeit akkumulieren

Verfasst: 28. Jun 2020 14:40
von shuo
Hallo zusammen,

Ich würde gerne eine Rule programmieren, die mir die Dauer (akkumuliert) ausgibt, wenn ein Item einen bestimmten Wert übersteigt.

Also in Pseuocode:

Code: Alles auswählen

rule "Berechnung der Dauer über 80%"
when 
	Item Value changed
then
	if ( Value.state > 80){
		akkumliere die Zeit über 80
	}

end
Hat jemand eine Idee wie ich das umsetzen kann?

Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 14:43
von Heavy-Dee
ErsteFrage:
Von was 80%?

Gesendet von meinem SM-A405FN mit Tapatalk


Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 14:52
von shuo
Ich verstehe die Frage nicht ganz....Na vom Wert Value.

Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 15:04
von Heavy-Dee
Woher kommt der Wert Value.
Ist das eine Zeitangabe ... in Std od. Min?


Gesendet von meinem SM-A405FN mit Tapatalk


Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 15:09
von shuo
Achso. Nein. Das ist ein Number - Wert.

Was ich also möchte ist wie eine Stoppuhr. Wenn der Wert größer als 80 ist dann stoppe die Zeit ....

Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 15:33
von udo1toni
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.

Re: Zeit akkumulieren

Verfasst: 28. Jun 2020 21:31
von shuo
Klasse Udo! Genuaso sowas hatte ich gesucht und wäre im Leben darauf gekommen. Werde ich gleich testen und Rückmeldung geben.

Re: Zeit akkumulieren

Verfasst: 20. Mai 2021 10:02
von shuo
Hi Udo. Eigentlich hatte Dein Code mal funktioniert. Nach Umstellung auf Openhab 3.0 bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

The method or field millis is undefined for the type ZonedDateTime(org.eclipse.xtext.diagnostics.Diagnostic.Linking)
Die vollständige Rule:

Code: Alles auswählen

rule "Calculation of time over 80% Load"
when 
    Item Symo_Inverterdatachannelpac changed
then
    if(previousState <= 8000 && newState > 8000) {
        lStart = now.millis
     } else if(previousState > 8000 && newState <= 8000) {
        val Long millis = now.millis -lStart
        var Integer iSeconds = 0
        if(Symo_Inverterdatachannelduration.state instanceof Number) iSeconds = (Symo_Inverterdatachannelduration.state as Number).intValue
        iSeconds = iSeconds + (millis/1000).intValue
        Symo_Inverterdatachannelduration.postUpdate(iSeconds)
     }
end
Hat sich hier etwas geändert?

Re: Zeit akkumulieren

Verfasst: 20. Mai 2021 11:01
von peter-pan
Hast du es schon mal mit "now.toInstant().toEpochMilli()" anstelle von "now.millis" probiert ?

Re: Zeit akkumulieren

Verfasst: 20. Mai 2021 14:18
von shuo
peter-pan hat geschrieben: 20. Mai 2021 11:01 Hast du es schon mal mit "now.toInstant().toEpochMilli()" anstelle von "now.millis" probiert ?
super! funktionert. danke!