DateTime comparision... please help, I don't get it

  • Platform information:
    • Raspi4
    • openhabian
    • Java Runtime Environment: the one that came with the image
    • openHAB version: 3.01
  • Issue of the topic: I need to do time comparisions within Rules in Java and feel really lost :frowning:

I try to figure out how to perform a simple task in Java - tried 1000 things, read through the Forum but end up with failiures over and over again. Maybe someone can give me the right hint what I’m doing wrong.

I read through all the Time conversion options and tried many of them, but again I mostly get errors.

maybe someone can help when I put the piece of code here in its actual state:


var LocalDateTime = Java.type(“java.time.LocalDateTime”);
var logger = Java.type(‘org.slf4j.LoggerFactory’).getLogger(‘org.openhab.rule.’ + ctx.ruleUID);
var ScriptExecution = Java.type(“org.openhab.core.model.script.actions.ScriptExecution”);

var Jetzt;
var ZeitSonnenaufgang;

ZeitSonnenaufgang = itemRegistry.getItem(‘LokaleSonnendaten_Daylight_Start’).getState();
Jetzt = LocalDateTime.now();


now I want to know if the sun is already up, something like

//pseudocode//

if Jetzt > ZeitSonnenaufgang
do something

//end pseudo //

It seems so simple.

I tried many things but get conversion errors, most of the typeconversions in the forum here don’t work for me and I have no idea anymore why? Am I missing some Installations/libraries or such?

I’m not a Java programmer and not really familiar with it, but try to learn the hard way :slight_smile:
Any help would be highly appreciated.

Perhaps first we should clear up what rules language you are working in (it’s not pure Java) 
 ECMA script, perhaps?

yes, working with the OH3 UI, no other IDE so far. ECMA it is


Actually with a very stupid workaround with string comparision it works, but this can’t be the solution:

###SNIP

var LocalDateTime = Java.type(“java.time.LocalDateTime”);
var logger = Java.type(‘org.slf4j.LoggerFactory’).getLogger(‘org.openhab.rule.’ + ctx.ruleUID);
var ScriptExecution = Java.type(“org.openhab.core.model.script.actions.ScriptExecution”);

var Jetzt;
var ZeitSonnenaufgang;
var ZeitSonnenuntergang;
var strJetzt;
var strZeitSonnenaufgang;
var strZeitSonnenuntergang;
var comp1;
var comp2;

ZeitSonnenaufgang = itemRegistry.getItem(‘LokaleSonnendaten_Daylight_Start’).getState();
ZeitSonnenuntergang = itemRegistry.getItem(‘LokaleSonnendaten_Daylight_End’).getState();
Jetzt = LocalDateTime.now();

strJetzt = Jetzt.toString();
strZeitSonnenaufgang = ZeitSonnenaufgang.toString();
strZeitSonnenuntergang = ZeitSonnenuntergang.toString();

logger.info(strZeitSonnenaufgang); //DateTimeType
logger.info(strZeitSonnenuntergang); //DateTimeType
logger.info(strJetzt); //JavaTime

comp1 = strZeitSonnenaufgang.localeCompare(strJetzt);
comp2 = strZeitSonnenuntergang.localeCompare(strJetzt);

logger.info(comp1);
logger.info(comp2);

if (comp1 > 0 && comp2 < 0){
logger.info(“Day”);
}
else{
logger.info(“Night”);
}

####SNAP

I’m sure someone has a way more elegant solution than this :slight_smile:
Cheers
Peter

Here’s what I use:

items:

DateTime    Wecker_NestHub
DateTime    Wecker_Android

rule:

val Wecker_Android_Zeit = new DateTime(Wecker_Android.state.toString)
val Wecker_NestHub_Zeit = new DateTime(Wecker_NestHub.state.toString)
if ( Wecker_Android_Zeit.isAfter(Wecker_NestHub_Zeit)){
    //do something
}

so for your case try:

if (now.isAfter(new DateTime(LokaleSonnendaten_Daylight_Start.state.toString))){
    //do something
}

I just tried this with one of my items and got no syntax errors. This should work for you

Thanks Felix,

Thanks :slight_smile:
I tried it, but:

var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);

logger.info("Logging geht")
if (now.isAfter(new DateTime(LokaleSonnendaten_Daylight_End.state.toString))){
logger.info("If Geht");
}
logger.info("Script durch");

Log:

2021-03-06 19:30:15.156 [INFO ] [org.openhab.rule.TestForum          ] - Logging geht

2021-03-06 19:30:15.164 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'TestForum' failed: ReferenceError: "now" is not defined in <eval> at line number 4

It seems to me that some basics are missing. Any ideas?

Cheers
Peter

Unfortunately, that was a DSL language example.
You don’t get just “now” in ECMA script, looks like some clues here

Yeah, seems to work correctly now. But comments are still welcome as I, as a java-honk, don’t know much about best practices in programming JS :slight_smile:
Thanks for your answers!


var LocalDateTime   = Java.type("java.time.LocalDateTime");
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");


var Jetzt = new Date(new Date());
var ZeitSonnenaufgang = new Date(items["LokaleSonnendaten_Daylight_Start"]);
var ZeitSonnenuntergang= new Date(items["LokaleSonnendaten_Daylight_End"]);

logger.info('Aufgang:   ' + ZeitSonnenaufgang);  
logger.info('Untergang: ' + ZeitSonnenuntergang);
logger.info('Jetzt:     ' + Jetzt);              

if (Jetzt > ZeitSonnenaufgang && Jetzt < ZeitSonnenuntergang){
  logger.info("Tag");
}
else {
  logger.info("Nacht");
}