Persistance Problem

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

Moderatoren: Cyrelian, seppy

Antworten
kaiserdom
Beiträge: 13
Registriert: 27. Apr 2020 20:19
Answers: 0

Persistance Problem

Beitrag von kaiserdom »

Guten Tag!

Ich möchte jeden Tag um Mitternacht die Maximal-, Minimal- und Durchschittstemperatur des vergangenen Tages erfassen. Dazu erfasst ein Außenfühler per Cron-Trigger über eine einfache ECMA-Rule alle 3 Minuten die aktuelle Temperatur und weist sie per postUpdate dem Item TempOutside zu.
Gleichfalls alle 3 Minuten wird dieses Item TempOutside in eine InfluxDB-Datenbank persistiert und in einem Grafana-Diagramm angezeigt. Das funktioniert soweit problemlos, nun soll weiters - wie eingangs erwähnt - das Maximum, das Minimum und der Durchschnitt dieser Zeitreihe pro Tag errechnet werden.
Dazu ist folgendes (vereinfachtes) Skript Test4 vorgesehen:

Code: Alles auswählen

//Script Test4
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var pE = Java.type('org.openhab.core.persistence.extensions.PersistenceExtensions');
var zDT = Java.type('java.time.ZonedDateTime');

var item1 = ir.getItem('TempOutside');
var minTemp = pE.minimumSince(item1, zDT.now().minusHours(24));
var meanTemp = pE.averageSince(item1, zDT.now().minusHours(24));
var maxTemp = pE.maximumSince(item1, zDT.now().minusHours(24));

logger.info("Test4: " + meanTemp.toString());
Die Protokollausgabe funktioniert für den Mittelwert meanTemp, nicht aber für minTemp und maxTemp. Hier gibts eine Fehlermeldung

2023-03-30 18:28:51.551 [WARN ] [e.automation.internal.RuleEngineImpl] - Fail to execute action: script
java.lang.IllegalArgumentException: Cannot format given Object as a Date

und eine ellenlange Liste weiterer, mir nichtssagender Meldungen.

Merkwürdigerweise funktioniert das Skript auch für

pE.varianceSince(item1, zDT.now().minusHours(24)) und
pE.deviationSince(item1, zDT.now().minusHours(24)) korrekt, nicht aber eben für

pE.minimumSince(item1, zDT.now().minusHours(24)) und
pE.maximumSince(item1, zDT.now().minusHours(24))

Was ist hier los?
Bin für jede Hilfe dankbar!
Gruß kaiserdom

EmptySoft
Beiträge: 221
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Persistance Problem

Beitrag von EmptySoft »

Also ich verwende in der Rule ganz einfach das persisitierte item
var cellV=DalyPackCellVoltageMin.averageSince(now.minusMinutes(2))
gibt natürlich auch minusHours, oder minusDays
BYe
Harald

kaiserdom
Beiträge: 13
Registriert: 27. Apr 2020 20:19
Answers: 0

Re: Persistance Problem

Beitrag von kaiserdom »

Danke Harald,
ich habe versucht:

Code: Alles auswählen

var meanTemp1 = ir.getItem("TempOutside").averageSince(zDT.now().minusHours(24));
ergibt eine Fehlermeldung: averageSince is not a function in <eval> at line number xx
Gruß kaiserdom

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

Re: Persistance Problem

Beitrag von udo1toni »

Das Problem ist hier, dass die Datentypen etwas unerwartet sind (aber erklärbar):

averageSince -> Mittelwert (ergibt sich aus der Mittelung der Meswerte)
minimumSince -> Minimalwert (ist genau ein Messwert, eben der kleinste)
maximumSince -> Maximalwert (ist genau ein Messwert, eben der größte)
Es gibt also für die beiden letzten Berechnungen zwei interessante Werte, nämlich a) wie groß ist der Wert und b) wann ist der Wert aufgetreten.

Deshalb ist averageSince vom Typ DecimalType, aber minimumSince und maximumSince sind vom Typ historicItem. Du musst also noch ein .getState am Ende ergänzen - oder wahlweise ein .getTimestamp, wenn Dich der Zeitpunkt interessiert.
Wenn ich mich richtig erinnere, ist es dann jeweils das erste Auftreten des fraglichen Messwerts, falls im betrachteten Zeitfenster mehrfach der identische Minimal- bzw. Maximalwert auftritt.

Welchen Datentyp welche Methode liefert, ist übrigens in der offiziellen Dokumentation exakt beschrieben.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.7, LXC), mit openHABian eingerichtet

kaiserdom
Beiträge: 13
Registriert: 27. Apr 2020 20:19
Answers: 0

Re: Persistance Problem

Beitrag von kaiserdom »

Vielen Dank, das war's!

Man sollte dann dazu noch wissen, dass getState und getTimestamp Funktionen sind, man also schreiben muss
.getState() bzw. .getTimestamp().
Und vielleicht noch, dass es entsprechende Methoden gibt: .state bzw. .timestamp.

Da erheben sich für mich die brennenden Fragen
1. Wo steht so etwas? (Dokumentation)
2. Wie kann man per Skript-Befehl rauskriegen, dass minimumSince bzw. maximumSince vom Typ historicItem sind?

Gruß, kaiserdom

EmptySoft
Beiträge: 221
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Persistance Problem

Beitrag von EmptySoft »

kaiserdom hat geschrieben: 1. Apr 2023 14:34 1. Wo steht so etwas? (Dokumentation)
Das hat Udo1Toni einen Beitrag höher verlinkt ..
BYe
Harald

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

Re: Persistance Problem

Beitrag von udo1toni »

kaiserdom hat geschrieben: 1. Apr 2023 14:34 2. Wie kann man per Skript-Befehl rauskriegen, dass minimumSince bzw. maximumSince vom Typ historicItem sind?
Per Script-Befehl eher nicht.
Über LSP bekommst Du in Info aber, denn VS Code (bzw. das openHAB Plugin für VS Code) kann diese Information z.B. in Rules anzeigen.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.7, LXC), mit openHABian eingerichtet

Antworten