Vergangene Tage seit bestimmtem Datum berechnen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
joernsch
Beiträge: 16
Registriert: 13. Jan 2021 10:12
Answers: 0

Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von joernsch »

Hallo zusammen,

in OH3 möchte ich innerhalb einer rule (ausgelöst durch einen Trigger) die Tage bestimmen, die seit einem bestimmten (selbst gewähltem Datum) vergangen sind. Das Ergebnis wird per Direktnachricht dann versandt, das Versenden von Nachrichten klappt problemlos, nur finde ich nicht den richtigen Weg um die vergangenen Tage zu berechnen und bitte hier um Hilfe.
Der grundlegende Code sieht so aus:

Code: Alles auswählen

rule "Vergangene Tage berechnen"

when
	//Trigger
then
	//Berechnung der vergangenen Tage, bspw. seit dem 10.10.2020
	
	val telegramAction = getActions("telegram","telegram:telegramBot:bot0910")
    	telegramAction.sendTelegram("Tage vergangen: "+ /*Ergebnisausgabe*/)
end
Trigger ist kein Problem, den habe ich über einen Testswitch realisiert. Lediglich die Berechnung der Tage bereitet mir Kopfzerbrechen :? :? :?
Vielen Dank für jede Hilfe!

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von int5749 »

Schau doch mal hier, ob dies hilft => Days between Dates
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von udo1toni »

In OH3 gibt es kein Joda Time mehr, sondern java.time.
Du suchst nach einer Länge (im Sinne von Dauer), also einer Duration. Die passende Funktion dürfte dann between sein.
Leider habe ich mich noch nicht weiter mit dem Thema beschäftigt, so dass ich Dir auch nicht genau sagen kann, wie die Funktion aufzurufen ist, aber es dürfte etwas in dieser Richtung sein:

Code: Alles auswählen

val Duration d = Duration.between(zeit1,zeit2)
wobei zeit1 und zeit2 natürlich gültige javatime Zeitstempel sein müssen - in welcher Form auch immer. Falls sich der Typ der beiden Zeitstempel unterscheidet, wird der zweite Zeitstempel vor dem Vergleich in den gleichen Typ gewandelt wie der erste Zeitstempel-
Duration dürfte in Sekunden zurückgegeben werden, muss dann also noch durch 86400 geteilt werden, um auf volle Tage zu kommen. Die beiden Zeitstempel enthalten auch die Uhrzeit, das muss man natürlich bei der Berechnung beachten (beispielsweise, indem man jeweils Mitternacht als Zeitpunkt nimmt).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von Anbeku »

Um in Anlehnung auf udo1tonis Lösung direkt auf die Anzahl der Tage zu kommen sollte folgendes funktionieren:

Code: Alles auswählen

val long days = Duration.between(zeit1,zeit2).toDays()

Ansgar
Beiträge: 1
Registriert: 26. Jul 2021 20:27
Answers: 0

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von Ansgar »

Hallo zusammen
Gibt es zu diesem Thema irgendwo eine gute Einführung?
Mir ist z.b. nicht klar, wie ein java Zeitstempel auszusehen hat!?

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von peter-pan »

Ansgar hat geschrieben: 10. Dez 2021 23:21 Mir ist z.b. nicht klar, wie ein java Zeitstempel auszusehen hat!?
Eigentlich verstehe ich das jetzt auch nicht ganz, aber ich bin auch eher der Frager.

Aus meiner Sicht ist ein Zeitstempel "Datum und/oder Uhrzeit" zu einem bestimmten Zeitpunkt. Die einfachste Form ist "now()":

Code: Alles auswählen

var vJetzt = now()
        logInfo("Jetzt", "Jetzt ist es {}", vJetzt)
oder

Code: Alles auswählen

var vJetzt1 = LocalDateTime.now()
        logInfo("Jetzt", "Jetzt ist es {}", vJetzt1)
Log:

Code: Alles auswählen

2021-12-11 12:11:26.768 [INFO ] [org.openhab.core.model.script.Jetzt ] - Jetzt ist es 2021-12-11T12:11:26.766448+01:00[Europe/Berlin]
2021-12-11 12:11:26.774 [INFO ] [org.openhab.core.model.script.Jetzt1] - Jetzt ist es 2021-12-11T12:11:26.772441
Edit - Nachtrag : Ich habe noch zwei Möglichkeiten für einen Unix-Zeitstempel gefunden.

Code -Snippets:

Code: Alles auswählen

var vUnixTimeSecond = Instant.now().getEpochSecond();
        logInfo("Jetzt", "UnixTime (Epoch)Sekunden {}", vUnixTimeSecond)

var vUnixTimeMilli = Instant.now().toEpochMilli();
        logInfo("Jetzt", "UnixTime (Epoch)Milli-Sekunden {}", vUnixTimeMilli)
  
Log:

Code: Alles auswählen

2021-12-11 14:35:26.977 [INFO ] [org.openhab.core.model.script.Jetzt ] - UnixTime (Epoch)Sekunden 1639229726
2021-12-11 14:35:26.982 [INFO ] [org.openhab.core.model.script.Jetzt ] - UnixTime (Epoch)Milli-Sekunden 1639229726980
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von mad-mike »

Moin.

Habe jetzt schon einiges versucht, nur ich komme damit nicht klar...
Möchte eigentlich nur Tage Zählen, von Start Datum 03. Feb. 2022.

Und dies Möchte ich in ein Item (laufzeit) schreiben...

Trigger sollte Every Day 6 uhr sein...

Könnte mir jemand einen helfen??

Danke und gruss
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von udo1toni »

Code: Alles auswählen

val LocalDateTime start = new LocalDateTime(2022,2,3,6,0,0) // 06:00:00 am 03.02.2022
val Long days = Duration.between(start,ZonedDateTime.now()).toDays()
days ist eine Ganzzahl, also am 4. Februar um 05:59:59 liefert die Funktion dann 0, eine Sekunde später 1.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von mad-mike »

Danke für deine Antwort.

Könntest du dir das mal ansehen:

Code: Alles auswählen

rule "Laufzeit"

when
    Time cron "0 0 6 * * ? *"
then
    var day = LocalDate.parse("2022-02-03").atStartOfDay();
    var long days = Duration.between(day, now).toDays();
    Laufzeit.postUpdate(days)                                              
end
Habe im Item "Laufzeit" eine 2.00

Das ist das, woran ich mich versucht habe, bevor ich deine Antwort gelesen habe...


Danke und Gruss


Edit:
Habe im Item "Laufzeit" eine 2.00

konnte ich mit : %.0f auf 2 setzen.

Einstellung Item Pattern
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Vergangene Tage seit bestimmtem Datum berechnen

Beitrag von udo1toni »

ja, das geht auch. Da Laufzeit ja ein Number Item ist, nutzt es Float zur internen Darstellung, daher die Nachkommastellen. Lästig, aber kann man ja über die Formatierung korrigieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten