Zeit stoppen in OH2 und Maximum ausgeben

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von SmartHomer »

Hallo zusammen,

gibt es in openHAB 2 eine Möglichkeit, wie ich die Zeit von einem Item stoppen kann und das Maximum des Itemwerts ausgeben kann seit dieses eingeschaltet ist?

Hintergrund ist folgender:

Ich möchte sobald ein Item sein Status von OFF nach ON ändert die Zeit messen bis dieses Item sein Status wieder von ON nach OFF ändert. Solange das Item den Status ON hat soll das Maximum des Wertes ausgegeben werden. Für das Maximum habe ich folgende Zeile programmiert:

Code: Alles auswählen

Power_1_max.postUpdate(Power_1.maximumSince(now.minusSeconds(10)))  
Folgende Fehlermeldung taucht im openHAB Log Viewer auf:

Code: Alles auswählen

[WARN ] [nce.extensions.PersistenceExtensions] - There is no default persistence service configured!
[WARN ] [nce.extensions.PersistenceExtensions] - There is no queryable persistence service registered with the id 'null'
[ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Start Lastprofilerstellung': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.postUpdate(org.eclipse.smarthome.core.items.Item,java.lang.Number) on instance: null
Letztendlich soll die bisher gemessene Zeit in der sitemap angezeigt werden können.

Danke für Rückmeldungen.

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

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von udo1toni »

Die Fehlermeldung ist ja eigentlich selbstsprechend.

Du musst für die Verwendung von historischen Daten zum einen das Item persistieren und dann entweder den Persistence Service als default Persistence setzen oder bei jedem Aufruf den Service mit angeben.
Wenn Du auf das Maximum schauen willst, brauchst Du einen Persistence Service, der mit Zahlen umgehen kann, z.B. rrd4j oder auch mysql (dazu musst Du natürlich irgendwo mysql installiert haben)

Die Einschaltzeit kannst Du einfach in einer Variablen speichern und dann die Einschaltdauer beim Ausschalten auswerten. Über die Persistence bekommst Du dann das Maximum.
items/items:

Code: Alles auswählen

Number Power_1 "Power 1" (historisch) {...}
persistence/mysql.persist

Code: Alles auswählen

//Welche Items werden in MySQL gespeichert

Strategies {
    everyMinute : "0 * * * * ?"
    default : everyChange
}
Items {
    historisch* : strategy = everyChange //alle Items, die zur Gruppe "historisch" gehören
    Power_1  : strategy = everyChange // genau das Item "Power_1"
}
rule:

Code: Alles auswählen

var power1ts = null

rule "maximum"
when
    Item Power_1 changed
then
    if ((previousState as Number) == 0)
        power1ts = now
    else if((Power_1.state as Number) == 0) {
        Power_1_Max.postUpdate(Power_1.maximumSince(power1ts))
        Power_1_Dauer.postUpdate(now-power1ts)  //Dauer in MilliSekunden
    }
end
Allerdings kannst Du auch ohne Persistence arbeiten, wenn Du tatsächlich nur am aktuellen Maximum der letzten Betriebsphase interessiert bist:
rule:

Code: Alles auswählen

var power1ts = null
var Number power1max = null

rule "maximum"
when
    Item Power_1 changed
then
    if ((previousState as Number) == 0) { //war aus
        power1ts = now
        power1max = Power_1.state as Number
    }
    else if((Power_1.state as Number) == 0) { //ist aus
        Power_1_Max.postUpdate(power1max)
        Power_1_Dauer.postUpdate(now-power1ts)  //Dauer in MilliSekunden
        power1max = 0
    }
    else {  // war und ist an
        if ((Power_1.state as Number) > power1max) 
            power1max = Power_1.state as Number
     }
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von SmartHomer »

Allerdings kannst Du auch ohne Persistence arbeiten, wenn Du tatsächlich nur am aktuellen Maximum der letzten Betriebsphase interessiert bist:
rule:
Diese Funktion reicht mir.

Ich bekomme noch eine Fehlermeldung in der Zeile:

Code: Alles auswählen

Power_1_Dauer.postUpdate(now-power1ts)  //Dauer in MilliSekunden
openHAB log Viewer sagt:

Code: Alles auswählen

2018-09-30 07:51:52.467 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'maximum': Unknown variable or command '-'; line 35, column 23, length 12
Kann ich Berechnungen innerhalb der postUpdate Methode durchführen?

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von SmartHomer »

Habe den Fehler glaub gefunden. Es muss heißen:

Code: Alles auswählen

now.millis
Wie kann ich die ausgegebenen Millisekunden in das Format HH:mm:ss umwandeln?

Ich denke das sollte mit dem SimpleDateFormat funktionieren. Ich bin bisher nur noch nicht auf die richtige Lösung gekommen.

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

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von udo1toni »

Ja, müsste eigentlich so funktionieren:

Code: Alles auswählen

// notwendige Imports
import java.text.SimpleDateFormat

// globale Variablen

// rules

// Rest der Rule lasse ich weg
...
val SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS")
Power_1_Dauer.postUpdate(df.format(now.millis - tEinzeldimmer_Ch1)) //Power_1_Dauer ist ein String Item!
Allerdings habe ich beim Rumprobieren das Problem, dass die Stunden nicht stimmen... statt 00:00:36.345 kommt da 01:00:36.345 als Anzeige raus, also eine Stunde zu viel...
Man kann natürlich die Anzeige auch von Hand berechnen:

Code: Alles auswählen

...
val Number dauer = now.millis - startzeit
val Number stunden = Math::floor(dauer / 3600000) 
dauer = dauer % 3600000
val Number minuten = Math::floor(dauer / 60000) 
dauer = dauer % 60000
val Number sekunden = Math::floor(dauer / 1000) 
val  Number millisec = dauer % 1000
var String myTime = if(stunden<10) "0" else "" + stunden.toString
myTime = myTime + if(minuten<10) ":0" else ":" + minuten.toString
myTime = myTime + if(sekunden<10) ":0" else ":" + sekunden.toString
myTime = myTime + if(millisek<10) ".00" else if (millisek<100) ".0" else "." + sekunden.toString
Power_1_Dauer.postUpdate(myTime) //auch hier sollte es ein String sein
oder so ähnlich... ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SmartHomer
Beiträge: 51
Registriert: 17. Mai 2018 09:26

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von SmartHomer »

Hast du mittlerweile bereits eine Lösung, wie die Stunde zu viel zu Stande kommt?

Bei mir kommt genau der selbe Fehler.

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

Re: Zeit stoppen in OH2 und Maximum ausgeben

Beitrag von udo1toni »

Ich hab keine Idee :(
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten