Can anyone give me a hint so I can do conversion #4?
I’ve tried to use datetime parser to convert a datetimetype to a Java time, but it won’t work.
I want to use now.isAfter(item state).
Example (works in OH 2.5.x):
val morning=new DateTime(Morning_Time.state.toString)
val day=new DateTime(Day_Time.state.toString)
var curr=""
if (now.isAfter(morning) && now.isBefore(day)) { curr="Morning"}
Because now is in OH3 Java time, this won’t work anymore.
I’ve tried to change it to this:
val morning=ZonedDateTime.parse(Morning_Time.state.toString, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
val day=ZonedDateTime.parse(Day_Time.state.toString, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
var curr=""
if (now.isAfter(morning) && now.isBefore(day)) { curr="Morning"}
But I get the error that it can’t be parse correctly.
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