Rechnen / Arbeiten mit DateTime

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
hurra
Beiträge: 66
Registriert: 28. Aug 2019 10:52
Answers: 0

Rechnen / Arbeiten mit DateTime

Beitrag von hurra »

Hallo zusammen,

rechnen und arbeiten mit DateTime-Formaten macht mir weniger Spaß als gedacht.

Ich möchte die Zeit zwischen Sonnenauf- und untergang ausrechnen, in der Sitemap anzeigen und bei weniger als 10 Stunden einen Event auslösen.
Die Berechnung stimmt, im Log kommt der richtige Wert, aber ich verstehe nicht, warum in der Sitemap kein Wert angezeigt wird und warum die IF-Schleife nicht will. Vielleicht ist hier das Problem differenz.state? Stimmt das Format nicht?

VG
Christoph

Sitemap:

Code: Alles auswählen

Text item=Sunshine_Time
Items:

Code: Alles auswählen

DateTime         Sunshine_Time      "Sonnenschein heute"
Rule:

Code: Alles auswählen

    rule "Sonnenauf und untergang"
when
      Time cron "* 0/1 * * * ?" // zum Debug, wird später mit Sonnenaufgang getriggert
then
      val Date1= new DateTime(( Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
      val Date2 = new DateTime(( Sunset_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
      var double differenz = (Date2.millis - Date1.millis)/1000/60

      logInfo("test", "Sonnenzeit in Minuten: " + differenz)
      Sunshine_Time.postUpdate(differenz)

      if (differenz.state <= 600) {
      logInfo("test", "weniger als 10 Stunden")
      }


end

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Rechnen / Arbeiten mit DateTime

Beitrag von Tokamak »

"differenz" ist ein double-Variable. Mit ihr kannst und musst du rechnen. Der Zugriff mittels .state ist Objekten, in unserem Falle Items vorbehalten. Allerdings ist "differenz" kein Item.

Es muss daher heißen:

Code: Alles auswählen

      if (differenz <= 600) {
      logInfo("test", "weniger als 10 Stunden")
      }
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

hurra
Beiträge: 66
Registriert: 28. Aug 2019 10:52
Answers: 0

Re: Rechnen / Arbeiten mit DateTime

Beitrag von hurra »

differenz ist kein item, richtig. Wird nur innerhalb der Rule verwendet. Aber wie bringe ich dann die differenz in ein Item?

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

Re: Rechnen / Arbeiten mit DateTime

Beitrag von peter-pan »

Das mit dem Log passt so, wie Tokamak geschrieben hat. Allerdings sollte das Item wahrscheinlich vom Typ Number sein oder evtl auch String. Hab's jetzt nicht getestet. Evtl. solltest du auch noch ein Pattern/Formatter/Suffix in den Text mit aufnehmen "Sonnenschein heute [%s]"
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

heiko74
Beiträge: 14
Registriert: 5. Apr 2019 21:38
Answers: 0

Re: Rechnen / Arbeiten mit DateTime

Beitrag von heiko74 »

Hallo,

ich habe da ein etwas anderen Ansatz gewählt.
Es gibt ein Astro-Binding, das ich so konfiguriert habe:

*things:

Code: Alles auswählen

astro:sun:home  [ geolocation="xxxxx,yyyyy, zzz", interval=60]
*items

Code: Alles auswählen

Number  Astro_Sun_Daylight   "Sun Daylight  [%.0f min]" {channel="astro:sun:home:daylight#duration"}
Da habe ich die länge des Tages schon berechnet in einem item liegend.

Damit könnte man auch die rule etwas einfacher gestalten (Rule ist nicht getestet):

Code: Alles auswählen

rule "Sonnenauf und untergang"
when
	Item Astro_Sun_Daylight  changed
then
	if ((Astro_Sun_Daylight.state as Number) <= 600) {
		logInfo("test", "weniger als 10 Stunden")
	}
end
Das Item wird Nachts um 0:00 aktualisiert.

Heiko

hurra
Beiträge: 66
Registriert: 28. Aug 2019 10:52
Answers: 0

Re: Rechnen / Arbeiten mit DateTime

Beitrag von hurra »

heiko74 hat geschrieben: 5. Nov 2020 20:28 Hallo,

ich habe da ein etwas anderen Ansatz gewählt.
Es gibt ein Astro-Binding, das ich so konfiguriert habe:

*things:

Code: Alles auswählen

astro:sun:home  [ geolocation="xxxxx,yyyyy, zzz", interval=60]
*items

Code: Alles auswählen

Number  Astro_Sun_Daylight   "Sun Daylight  [%.0f min]" {channel="astro:sun:home:daylight#duration"}
Da habe ich die länge des Tages schon berechnet in einem item liegend.

Damit könnte man auch die rule etwas einfacher gestalten (Rule ist nicht getestet):

Code: Alles auswählen

rule "Sonnenauf und untergang"
when
	Item Astro_Sun_Daylight  changed
then
	if ((Astro_Sun_Daylight.state as Number) <= 600) {
		logInfo("test", "weniger als 10 Stunden")
	}
end
Das Item wird Nachts um 0:00 aktualisiert.

Heiko
na das ist ja die sauberste und eine Ressourcen sparende Lösung! Danke! Das Daylight habe ich dort noch gar nicht gesehen!

Besten Dank!!

SolarVogel
Beiträge: 2
Registriert: 22. Dez 2020 16:30
Answers: 0

Re: Rechnen / Arbeiten mit DateTime

Beitrag von SolarVogel »

Hallo,
habe eine ergänzende Frage. Das Daylight wird in Minuten angezeigt. Kann man das auch anders formatieren/anzeigen. Hätte das gerne hh:mm
Danke und Gruß
Michael

Antworten