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");
}