Seite 1 von 1

Persistance Problem

Verfasst: 30. Mär 2023 23:00
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

Re: Persistance Problem

Verfasst: 31. Mär 2023 10:16
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

Re: Persistance Problem

Verfasst: 31. Mär 2023 11:00
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

Re: Persistance Problem

Verfasst: 31. Mär 2023 14:36
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.

Re: Persistance Problem

Verfasst: 1. Apr 2023 14:34
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

Re: Persistance Problem

Verfasst: 1. Apr 2023 15:21
von EmptySoft
kaiserdom hat geschrieben: 1. Apr 2023 14:34 1. Wo steht so etwas? (Dokumentation)
Das hat Udo1Toni einen Beitrag höher verlinkt ..

Re: Persistance Problem

Verfasst: 1. Apr 2023 17:42
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.