DateTime Conversion (openHAB 3.x)

Something like this (?):
Post current time to item
My_Item.postUpdate(new DateTimeType())

Get Epoch from Item:
val Number item_millis = (My_Item.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli

Get Now Epoch:
val Number now_millis = now.toInstant.toEpochMilli

Difference in Minutes:
var Number diff = (now_millis - item_millis)/60000


@dakoeli: This works for my setup very well! This is exactly what I needed in order to sum up my “uptime firing unit” for calculation of my energy consumption!

Thank you very much!

Thanks a lot!!!

I still don’t get it to work. I have made a TestRule which I trigger by Hand:

//val DateTimeType Epoche = now.toInstant()
val DateTimeType Epoche = now.toInstant()
logInfo("TestTrigger", "Epoche 2: " + Epoche)

createTimer(now.plusSeconds(3 )) [|
    val DateTimeType Spaeter = now.toInstant()
logInfo("TestTrigger", "Spaeter 4: " + Spaeter)
    val DateTimeType Differenz = Duration.between (Spaeter, Epoche)
logInfo("TestTrigger", "Differenz 5: " + Differenz)

// Here I need to convert from "DateTimeType" to a kind of Number. I want the time Difference in Millisecond or seconds......

This is working so far. I can calculate timedifferences between 2 given times. I get as result:

Differenz 5: PT-3.003164S

which is fine. Now I need this as Number, e.g. “3000” .
So how can the DateTimeType be converted to a Number???

Thanks again,

I would try the following

val Number millis_spaeter = Spaeter.getZonedDateTime.toInstant.toEpochMilli
val Number millis_epoche = Epoche.getZonedDateTime.toInstant.toEpochMilli

For rule internal internal calculations I would recommend to stay with the Java 11 classes like “ZonedDateTime” or “LocalDateTime”. The DateTimeType I would only use if I want to populate an Openhab Item with it.

(from the javadoc DateTimeType (openHAB Core 3.1.0-SNAPSHOT API))

@ljsquare You are right, thanks. I looked up the code of DateTimeType , and it turns out it’s only a thin wrapper around ZonedDateTime. So there is an easy conversion between the two, without the need for any String parsing or formatting.

I’ve rewritten my rule as follows:

  val morning_start = // 7:00

  // Java time to DateTimeType:
  vMorning_Time.postUpdate(new DateTimeType(morning_start)) 

  // DateTimeType to Java time:
  val day_start = (vSunrise_Time.state as DateTimeType).getZonedDateTime()

Much cleaner and less error prone.

@anfaenger May I suggest to rewrite section #3 of your start post, as follows?

#3 Get DateTimeType from Java Time

DateTimeType has a conventient constructor method that accepts Java java.time.LocalDateTime objects. So getting a DateTimeType if you have a java.time.LocalDateTime is as easy as:

val LocalDateTime myLocalDateTime = new LocalDateTime();
val DateTimeType myDateTimeType = new DateTimeType(myLocalDateTime);

Sorry for “hijacking” that chat, but I do not come any further.
My Rules for measuring “working times per day” don’t work under OH3 any more. (And I spent a Day now not getting them to work)
I have A switch which can be On or Off. I need to store the time when the switch goes high, and when it went back to low again. Then subtrated it and transfered the result to an Integer (Seconds).
Seconds = MakeSeconds(TimeNow - TimeBefore)

Maybe you can tell me how to do that OH3 conform?
Thanks in advance,

@bartkummel Thank you for this hint!
I was not yet familiar with the LocalDateTime class.
Can you have a look at my rewrite? I hope I didn’t mess things up.
I’m still on openHAB 2.4 with my system and therefor can’t test it.

Variant B can be rewritten as follows:

val DateTimeType myDateTimeTypeFromJavaTime = new DateTimeType(myJavaTime.toLocalDateTime())

The “timestamp” variant can be removed, it is not different from “variant B”.

I use a DateTime Item and switched to the MainUI website and configuration. For me it is not clear how to format the DateTime Code in the UI like this
Is there some Metadata config needed or do I have to format it in the UI?

Have you tried #12?

Ok, then I always have to use a second Item?
With the textual configuration I had the chance to directly format DateTime and illustrate it at the sitemap. Is that still possible?

Do you mean item like this?

DateTime MyDateTimeItem       "Date[%1$tA %1$td.%1$tm.%1$tY   %1$tH:%1$tM]" 

Yes, exactly. I do not know how to do that in the UI.
I guess maybe with Metadata?

I am just realizing that I have probably misunderstood.
You are probably switching from textual confiuration to another option.
Unfortunately, I can not help.

@bartkummel Thanks! I’m working on it.

Duration is the perfect class for it and you don’t have to stick to DateTimeType. Here is a good explanation for it java.time.Duration.

In your case you’d just have to add .getSeconds() that is

val Differenz = Duration.between (Spaeter, Epoche).toSeconds()

1 Like

Thank you, I will try that later…


i need help. Since over 2 hours i want to transform an PY Script vom OH2 to OH3.

I have use before the joda time argument.
Now i only want reschedule a timer. Before i write:

But i dont became a valid code. Im confused, what import statement is necessary and how i can use the NOW Stratement in Jython.