Thanks to @rlkoshak I was able to figure this out for my use case. Here are two examples that work for me.
val day_start = (AstroSunData_Rise_StartTime.state as DateTimeType).getZonedDateTime()
val evening_start = (AstroSunData_Set_StartTime.state as DateTimeType).getZonedDateTime()
#4 Get Java Time from DateTimeType
Tested in OH3, works fine: val MyJavaTimeFromDateTimeItem = (MyDateTimeItem.state as DateTimeType).getZonedDateTime()
I had in OH 2.5 the following rule - that calculates my power consuption for one day:
rule “Strom Verbrauch Tag”
when
tem homematic_stecker_Energiezaehler_kwh received update
then
if(homematic_stecker_Energiezaehler_kwh.state instanceof Number){
Stromzaehler_Verbrauch_Tag.postUpdate(homematic_stecker_Energiezaehler_kwh.deltaSince(now.withTimeAtStartOfDay, “influxdb”) as Number)
}
Unfortunately i am not a programmer. Could someone please give me a hint on how to recreate the rule for OH3?
When rewriting my rules for OH3, I encountered a problem with the conversion between DateTimeType and Java Time: for some reason, when I convert Java Time to String, the name of my timezone is added to the string, e.g. 2021-01-01T07:00+01:00[Europe/Amsterdam]. This probably has to do with the time zone configuration of the Java environment. Obviously, this leads to problems when the string is parsed.
I also had a problem the other way around. When a DateTimeType was converted to a String, the string was missing a : in the time zone identifier:
DateTimeType to String: "2021-01-01T07:00:00.000+0100"
Java Time expects: "2021-01-01T07:00:00.000+01:00"
I was able to solve both issues by using a formatter:
val formatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
val morning_start = ZonedDateTime.now().with(LocalTime.MIDNIGHT).plusHours(7) // 7:00
// Java time to DateTimeType:
vMorning_Time.postUpdate(DateTimeType.valueOf(morning_start.format(formatter)))
// DateTimeType to Java time:
val day_start = ZonedDateTime.parse(vSunrise_Time.state.toString, formatter)
I hope this helps someone. I’d think this method is more robust in all cases, so it might be recommended to do this, even if you don’t encounter problems yet.
I’m having trouble to figure out the right syntax in OH3 for this:
if (now.isAfter((Sunset_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli) || now.isBefore((Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
Sorry for asking, but I don’t get any further allthough reading this over and ober again…
Can somebody give me a code example how to store the time (now) in a variable, and then later calculate the difference in seconds to that stored value??
Thanks,
Ingo
@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!