Seite 1 von 1

LastUpdate eines Items in einer JS Rule ermitteln

Verfasst: 21. Jul 2024 11:45
von Scooter_0807
Hallo zusammen,

Ich möchte den Zeitstempel des letzten Updates auf einem Item ermitteln.
Hintergrund sind ein paar Timingprobleme mit einer alten Fritzbox, die aber nicht auf OH zurückzuführen sind. Deshalb darf ich bestimmte Aktivitäten erst starten, wenn das letzte Update eine vorbestimmte Zeit zurückliegt. Soweit zum Grund.

Meine Rules sind in Javascript formuliert, das OH Release ist openHAB 4.2.0 und das ganze läuft auf einem PI3.
Als Persistenz verwende ich rrd4j.

Mein Testitem heißt "HK_Nachtabsenkung_Hamburg".
Dieses hat als "Direct Parent Groups" nur die Persistenz Gruppen "gruppe_persistenz_laden" und "gruppe_persistenz_on_update". Diese Gruppen folgendermaßen definiert:

Code: Alles auswählen

Strategies {
        everyMinute : "0 * * * * ?"
}

Items {
        gruppe_persistenz_laden*        :       strategy = restoreOnStartup
        gruppe_persistenz_speichern*    :       strategy = everyMinute
        gruppe_persistenz_on_update*    :       strategy = everyUpdate
        gruppe_persistenz_on_change*    :       strategy = everyChange
}

Jetzt möchte ich in einer Rule abfrage, wann das Item das letzte Mal ein Update erfahren hat.
Dazu habe ich erst folgenden Ansatz:

Code: Alles auswählen

var item_Name = 'HK_Nachtabsenkung_Hamburg';
test = items.getItem(item_Name).lastUpdate;
Als Ergebnis erhalte ich "undefined".
Ich habe auch in den Dokus nicht mehr dazu gefunden.

Danach habe ich einen anderen Ansatz gefahren:

Code: Alles auswählen

// Bibliothek für das Auslesen des letzten Updates eines Items aus der Persistenz-Datenbank
// https://community.openhab.org/t/oh3-ecma-get-lastupdate-time-of-an-item/114068/5
var PersistenceExtensions = Java.type("org.openhab.core.persistence.extensions.PersistenceExtensions");
var PERSISTENCE_NAME = 'rrd4j';      // Systemname des Persistenz-Service
lastUpdate_Nachtabsenkung_time = parseInt(PersistenceExtensions.lastUpdate(items.getItem(item_Name), PERSISTENCE_NAME).toInstant());
Hier erhalte ich nun einen Zeitstempel.

Allerdings zählt dieser Zeitstempel hoch, obwohl das Item nicht verändert wird, also weder ein Update, noch ein Change erfährt.

Hier ein Auszug aus dem Log:

Code: Alles auswählen

2024-07-21 11:39:46.319 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554740000
2024-07-21 11:40:00.932 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554740000
2024-07-21 11:40:15.928 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554800000
2024-07-21 11:40:30.921 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554800000
2024-07-21 11:40:45.928 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554800000
2024-07-21 11:41:00.919 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554800000
2024-07-21 11:41:15.923 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554860000
2024-07-21 11:41:30.919 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554860000
2024-07-21 11:41:45.925 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554860000
2024-07-21 11:42:00.907 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554860000
2024-07-21 11:42:15.929 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554920000
2024-07-21 11:42:30.921 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554920000
2024-07-21 11:42:45.928 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554920000
2024-07-21 11:43:00.921 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554920000
2024-07-21 11:43:15.928 [INFO ] [org.openhab.rule.ModifyExpire       ] - TestruleLetzte Änderung war am....................... : 1721554980000
Der Zeitstempel des LastUpdate wird offensichtlich 1x pro Minute hochgezählt.

Hat einer von Euch eine Idee wo mein Fehler liegt oder wie ich in JS den Zeitstempel des letzten Update korrekt auslesen kann?

Vielen Dank im Voraus!

Re: LastUpdate eines Items in einer JS Rule ermitteln

Verfasst: 21. Jul 2024 13:35
von Harka
Moin,
kann ich mit rrd4j reproduzieren. Das wird mit strategy = everyMinute zusammenhängen (zwingend erforderlich). Wenn Du keine andere Datenbank in der Hinterhand hast sehe ich aber einen anderen Lösungsansatz. Mit

Code: Alles auswählen

if (items.getItem('Bewegung_1').persistence.changedSince(time.ZonedDateTime.now().minusMinutes(5), 'rrd4j')) {
}
kannst Du abfragen ob das Item innerhalb eines bestimmten Zeitraums (hier 5 min) geändert wurde.

Re: LastUpdate eines Items in einer JS Rule ermitteln

Verfasst: 22. Jul 2024 22:13
von udo1toni
Mein Tipp wäre, auf mapDB auszuweichen. .lastUpdate("mapdb") sollte den Zeitstempel des letzten Updates liefern, so wie er in der Datenbank festgehalten ist. Da mapdb immer nur den letzten Wert des Items hält, benötigt der zusätzliche Dienst nicht viel Platz oder Leistung.

Eine weitere Option wäre ein DateTime Item zu verwenden, welches Du mittels "profile": "system:timestamp-update" (Zeitstempel bei Aktualisierung) mit dem Channel verlinkst. Das DateTime Item kannst Du dann in Deiner Rule auswerten - unabhängig von irgendwelchen Persistences.

Re: LastUpdate eines Items in einer JS Rule ermitteln

Verfasst: 17. Aug 2024 10:24
von Scooter_0807
Hallo Harka, hallo udo1toni,
ich habe beide Vorschläge getestet.
Ich habe testweise mal auf eine Datenbank gewechselt, in dem Fall MongoDB aber mit test = items.getItem(item_Name).lastUpdate; gab es keine Änderung.
Der Vorschlag mit "(items.getItem('Bewegung_1').persistence.changedSince(time.ZonedDateTime.now().minusMinutes(5), 'rrd4j')" bringt leider immer "false", egal welche Einstellung.

Letztlich bin ich zu der Lösung von udo1toni gegangen und habe ein Time Item verlinkt und werte das in der Rule aus. Das funktioniert seit einigen Tagen sehr zuverlässig.

Vielen Dank an Euch beide für Eure Mühe!

Re: LastUpdate eines Items in einer JS Rule ermitteln

Verfasst: 2. Sep 2024 08:16
von Taifun2300
Hallo,

und auch von mir Danke an Udo ...
Vorschlag 2 ist perfekt!

LG