Zeit akkumulieren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Zeit akkumulieren

Beitrag 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?
Zuletzt geändert von shuo am 28. Jun 2020 14:52, insgesamt 1-mal geändert.

Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

Re: Zeit akkumulieren

Beitrag von Heavy-Dee »

ErsteFrage:
Von was 80%?

Gesendet von meinem SM-A405FN mit Tapatalk

openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Re: Zeit akkumulieren

Beitrag von shuo »

Ich verstehe die Frage nicht ganz....Na vom Wert Value.

Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

Re: Zeit akkumulieren

Beitrag von Heavy-Dee »

Woher kommt der Wert Value.
Ist das eine Zeitangabe ... in Std od. Min?


Gesendet von meinem SM-A405FN mit Tapatalk

openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Re: Zeit akkumulieren

Beitrag 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 ....

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Zeit akkumulieren

Beitrag 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.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Re: Zeit akkumulieren

Beitrag von shuo »

Klasse Udo! Genuaso sowas hatte ich gesucht und wäre im Leben darauf gekommen. Werde ich gleich testen und Rückmeldung geben.

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Re: Zeit akkumulieren

Beitrag 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?

Benutzeravatar
peter-pan
Beiträge: 2773
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Zeit akkumulieren

Beitrag von peter-pan »

Hast du es schon mal mit "now.toInstant().toEpochMilli()" anstelle von "now.millis" probiert ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

shuo
Beiträge: 181
Registriert: 1. Sep 2018 18:24
Answers: 0

Re: Zeit akkumulieren

Beitrag 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!

Antworten