LastUpdate eines Items in einer JS Rule ermitteln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Scooter_0807
Beiträge: 23
Registriert: 9. Apr 2021 21:44
Answers: 0
Wohnort: Fehmarn

LastUpdate eines Items in einer JS Rule ermitteln

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

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: LastUpdate eines Items in einer JS Rule ermitteln

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

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

Re: LastUpdate eines Items in einer JS Rule ermitteln

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

Scooter_0807
Beiträge: 23
Registriert: 9. Apr 2021 21:44
Answers: 0
Wohnort: Fehmarn

Re: LastUpdate eines Items in einer JS Rule ermitteln

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

Taifun2300
Beiträge: 19
Registriert: 27. Dez 2022 09:19
Answers: 0

Re: LastUpdate eines Items in einer JS Rule ermitteln

Beitrag von Taifun2300 »

Hallo,

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

LG
openHAB 4.0.3 im Docker auf Debian 11, Anbindung an Raspmatic, Hue, FHEM, Fritzbox, Buderus KM200, Worx, Bilnk, Alexa

Antworten