Seite 1 von 2

DSL-Rule - Period.between -Fehlermeldung

Verfasst: 15. Apr 2026 11:45
von peter-pan
Ich habe eine Regel, die in meinem Produktionssystem (OH 5.1.3) funktioniert.
In meinem Testsystem (openHAB 5.2.0-SNAPSHOT - Build #5306) wird mir aber eine Fehlermeldung ausgegeben.

Code: Alles auswählen

2026-04-15 11:18:18.434 [WARN ] [el.core.internal.ModelRepositoryImpl] - DSL model 'test25_datum_testen.rules' has errors, therefore ignoring it: [27,19]: no viable alternative at input 'between'
.rules

Code: Alles auswählen

rule "Datum testen"
  when
    Item Dummy_11 changed to ON
  then
//       var day_1 = (OneCall_ObservationTime.state.toString).toString//("dd")
//       var day_2 = (OneCall_ObservationTime.state).plusDays(1).plusHours(6)//.toString("yyMMddHHmm")
//       logInfo ("Datum testen", "day1 ist {} und day2 ist {} day 3 ist {}", day_2)
//       var day0 = (OneCall_ObservationTime.state.toString).toString("yyMMdd")
//       var day1 = (OneCall_ObservationTime.state.toString).plusDays(1).toString("yyMMdd")
//       var day2 = (OneCall_ObservationTime.state.toString).plusDays(2).toString("yyMMdd")
//       var day3 = (OneCall_ObservationTime.state).plusDays(2)
//        logInfo ("Datum testen", "day0 ist {} day1 ist {} day2 ist {} day3 ist {} day4 ist {} day5 ist {}", day0, day1, day2,day3)
//  if (now.isBefore(day3)) {
//        logInfo ("Datum testen", "now {} is before day3 {}",now)
//    }
//  if (now.isBefore(OneCall_Current_Sunset.state)) {
//        logInfo ("Datum testen", "now {} is before Sunset {}",now, OneCall_Current_Sunset.state.toString)
//    }
//  if (now.isAfter(day3)) {
//        logInfo ("Datum testen", "now is after  day3 {}")
//    }

var LocalDate endofCentury = LocalDate.of(2014, 01, 01)
var LocalDate just = LocalDate.now()

var diff = Period.between(endofCentury, just)
// var Duration diff1 =  Duration.between(endofCentury, just)
logInfo("datediff", "diff between  Years: {}  Months: {} Days: {}", diff.getYears, diff.getMonths, diff.getDays)
// logInfo("datediff1", "diff between  Duration: {}  ", diff1)
end
Besagte Zeile 27 ist:

Code: Alles auswählen

var diff = Period.between(endofCentury, just)
Habe bisher den Grund nicht finden können. Muss man evtl. eine Funktion importieren ? Wenn ja, welche ?

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 15. Apr 2026 23:19
von udo1toni
Du könntest einfach die komplette Klasse angeben:

Code: Alles auswählen

var diff = java.time.Period.between(endofCentury, just)
Die Klasse java.time wird - aus welchem Grund auch immer - nicht vollständig importiert, der einfache Workaround ist dann, die Klasse mit anzugeben.

Ungetestet. :)

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 16. Apr 2026 18:03
von peter-pan
udo1toni hat geschrieben: 15. Apr 2026 23:19 Du könntest einfach die komplette Klasse angeben:
Hallo Udo,
Danke für den Tipp, aber irgenwie scheint das ".between" nicht mehr akzeptabel.

Fehler:

Code: Alles auswählen

2026-04-16 17:48:00.367 [WARN ] [el.core.internal.ModelRepositoryImpl] - DSL model 'datum_testen_2.rules' has errors, therefore ignoring it: [10,29]: no viable alternative at input 'between'
 
.rules - (abgespeckt)

Code: Alles auswählen

rule "Datum testen_2"
  when
    Item Dummy_12 changed to ON
  then

var LocalDate endofCentury = LocalDate.of(2014, 01, 01)
var LocalDate just = LocalDate.now()

    //var diff = Period.between(endofCentury, just)
var diff = java.time.Period.between(endofCentury, just)
   // var Duration diff1 =  Duration.between(endofCentury, just)
logInfo("datediff", "diff between  Years: {}  Months: {} Days: {}", diff.getYears, diff.getMonths, diff.getDays)
  // logInfo("datediff1", "diff between  Duration: {}  ", diff1)

end

Ich habe auch an anderer Stelle (Rules) Fehlermeldungen bekommen, die sich auch auf Vergleiche beziehen.

Beispiel:

Code: Alles auswählen

2026-04-16 17:48:05.158 [WARN ] [el.core.internal.ModelRepositoryImpl] - DSL model 'test_weihnachtzeit.rules' has errors, therefore ignoring it: [54,46]: no viable alternative at input '<='
[54,49]: extraneous input '2029' expecting ')'
Diese Rules laufen aber in Version OH5.1.3 ganz normal.

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 17. Apr 2026 07:55
von nw378
So setze ich between ein:

Code: Alles auswählen

        val heute   = now.toLocalDate
        val abholTag = (abfallItem.state as DateTimeType)
                   .getZonedDateTime(ZoneId.systemDefault)
                   .toLocalDate

        val delta = ChronoUnit.DAYS.between(heute, abholTag)

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 17. Apr 2026 12:32
von peter-pan
nw378 hat geschrieben: 17. Apr 2026 07:55 So setze ich between ein:
Danke für deinen Tipp.
Ich hab ihn ausprobiert ..... und was soll ich sagen; die gleiche Fehlermeldung. ;)

Code: Alles auswählen

2026-04-17 12:19:29.056 [WARN ] [el.core.internal.ModelRepositoryImpl] - DSL model 'datum_testen_2.rules' has errors, therefore ignoring it: [12,32]: no viable alternative at input 'between'
[16,31]: no viable alternative at input 'between'
Die Meldung in VSC ist:

Code: Alles auswählen

[{
	"resource": "/p:/rules/datum_testen_2.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Syntax",
	"severity": 8,
	"message": "no viable alternative at input 'between'",
	"startLineNumber": 12,
	"startColumn": 32,
	"endLineNumber": 12,
	"endColumn": 39,
	"modelVersionId": 4,
	"origin": "extHost1"
},{
	"resource": "/p:/rules/datum_testen_2.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Syntax",
	"severity": 8,
	"message": "no viable alternative at input 'between'",
	"startLineNumber": 16,
	"startColumn": 31,
	"endLineNumber": 16,
	"endColumn": 38,
	"modelVersionId": 4,
	"origin": "extHost1"
},{
	"resource": "/p:/rules/datum_testen_2.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Linking",
	"severity": 8,
	"message": "The method or field getYears is undefined for the type long",
	"startLineNumber": 20,
	"startColumn": 77,
	"endLineNumber": 20,
	"endColumn": 85,
	"modelVersionId": 4,
	"origin": "extHost1"
},{
	"resource": "/p:/rules/datum_testen_2.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Linking",
	"severity": 8,
	"message": "The method or field getMonths is undefined for the type long",
	"startLineNumber": 20,
	"startColumn": 93,
	"endLineNumber": 20,
	"endColumn": 102,
	"modelVersionId": 4,
	"origin": "extHost1"
},{
	"resource": "/p:/rules/datum_testen_2.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Linking",
	"severity": 8,
	"message": "The method or field getDays is undefined for the type long",
	"startLineNumber": 20,
	"startColumn": 110,
	"endLineNumber": 20,
	"endColumn": 117,
	"modelVersionId": 4,
	"origin": "extHost1"
}]
Ich hab mich gefragt, was ausser der OH-Version noch anders ist. Dann ist mir eingefallen, dass ich auf dem Test-Rechner nicht mehr die "Temurin"-Version von Java habe sondern wieder den "Standard-OpenJDK habe.

Code: Alles auswählen

                          _   _     _     ____   _
  ___   ___   ___   ___  | | | |   / \   | __ ) (_)  ____   ___
 / _ \ / _ \ / _ \ / _ \ | |_| |  / _ \  |  _ \ | | / _  \ / _ \
| (_) | (_) |  __/| | | ||  _  | / ___ \ | |_) )| || (_) || | | |
 \___/|  __/ \___/|_| |_||_| |_|/_/   \_\|____/ |_| \__|_||_| | |
      |_|                  openHAB 5.1.3 - Release Build

Looking for a place to get started? Check out 'sudo openhabian-config' and the
documentation at https://www.openhab.org/docs/installation/openhabian.html
The openHAB dashboard can be reached at http://raspi58:8080
To interact with openHAB on the command line, execute: 'openhab-cli --help'

ohab@raspi58:~ $ java -version
openjdk version "21.0.10" 2026-01-20 LTS
OpenJDK Runtime Environment Temurin-21.0.10+7 (build 21.0.10+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.10+7 (build 21.0.10+7-LTS, mixed mode, sharing)
ohab@raspi58:~ $




---------------------------------------------------------------------------
                          _   _     _     ____   _
  ___   ___   ___   ___  | | | |   / \   | __ ) (_)  ____   ___
 / _ \ / _ \ / _ \ / _ \ | |_| |  / _ \  |  _ \ | | / _  \ / _ \
| (_) | (_) |  __/| | | ||  _  | / ___ \ | |_) )| || (_) || | | |
 \___/|  __/ \___/|_| |_||_| |_|/_/   \_\|____/ |_| \__|_||_| | |
      |_|                  openHAB 5.2.0-SNAPSHOT - Build #5306

Looking for a place to get started? Check out 'sudo openhabian-config' and the
documentation at https://www.openhab.org/docs/installation/openhabian.html
The openHAB dashboard can be reached at http://pi5:8080
To interact with openHAB on the command line, execute: 'openhab-cli --help'

ohab@pi5:~ $ java -version
openjdk version "21.0.10" 2026-01-20
OpenJDK Runtime Environment (build 21.0.10+7-Debian-1)
OpenJDK 64-Bit Server VM (build 21.0.10+7-Debian-1, mixed mode, sharing)
ohab@pi5:~ 


-----------------------------------------------------------------------
Könnte das evtl. der Grund sein ?

Der Rule-Code sieht so aus:
.rules

Code: Alles auswählen

rule "Datum testen_3"
  when
    Item Dummy_12 changed to ON
  then

// var LocalDate endofCentury = LocalDate.of(2014, 01, 01)
// var LocalDate just = LocalDate.now()
   val heute   = now.toLocalDate
   val abholTag = (garbage_currwaste_Begin.state as DateTimeType)
              .getZonedDateTime(ZoneId.systemDefault)
              .toLocalDate
   val delta = ChronoUnit.DAYS.between(heute, abholTag)


//var diff = Period.between(endofCentury, just)
  var diff = java.time.Period.between(abholTag, heute)
// var Duration diff1 =  Duration.between(endofCentury, just)
logInfo("datediff", "diff between  Years: {}  Months: {} Days: {}", diff.getYears, diff.getMonths, diff.getDays)

logInfo("datediff", "Delta zwischen  Years: {}  Months: {} Days: {}", delta.getYears, delta.getMonths, delta.getDays)

// logInfo("datediff1", "diff between  Duration: {}  ", diff1)

end

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 17. Apr 2026 14:30
von nw378
Ob es an der Java Version liegt, kann ich dir nicht beantworten, würde aber vermuten: nein.

bei mir läuft das so auf OH 5.1.3 und seit gestern auch mit 5.1.4 mit Temurin Java21. Die Milestone-Version 5.2 habe ich noch nicht angetestet.

Was du auch versuchen könntest, ist ein

Code: Alles auswählen

import java.time.temporal.ChronoUnit
ganz oben in der rules-Datei, vor der ersten rule "..."

Oder - ähnlich wie Udos Ansatz:

Code: Alles auswählen

val delta = java.time.temporal.ChronoUnit.DAYS.between(heute, abholTag)

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 17. Apr 2026 20:02
von peter-pan
Der neue Versuch hat leider auch nicht geklappt:
.rules

Code: Alles auswählen

import java.time.temporal.ChronoUnit

rule "Datum testen_test"
  when
//    Item Dummy_blind changed to "100"
    Item Dummy_11 changed to ON
     
  then

//    var LocalDate endofCentury = LocalDate.of(2000, 01, 01)
//    var LocalDate just = LocalDate.now()
//
//    var diff = Period.between(endofCentury, just)
//    // var Duration diff1 =  Duration.between(endofCentury, just)
//   logInfo("datediff", "diff between  Years: {}  Months: {} Days: {} - diff ist {}", diff.getYears, diff.getMonths, diff.getDays, diff)

    // logInfo("datediff1", "diff between  Duration: {}  ", diff1)

   val heute   = now.toLocalDate
   val abholTag = (garbage_currwaste_Begin.state as DateTimeType)
              .getZonedDateTime(ZoneId.systemDefault)
              .toLocalDate
   val delta = ChronoUnit.DAYS.between(heute, abholTag)
   logInfo("datediff", "diff between  Years: {}  Months: {} Days: {} - diff ist {}", delta)

end
Fehlermeldung:

Code: Alles auswählen

2026-04-17 19:57:09.859 [WARN ] [el.core.internal.ModelRepositoryImpl] - DSL model 'test_datum_test.rules' has errors, therefore ignoring it: [23,32]: no viable alternative at input 'between'

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 18. Apr 2026 07:54
von nw378
Dann noch zwei Ideen:

a) garbage_currwaste_Begin ist zum Zeitpunkt der rule-Ausführung mit einem Datum gefüllt?

a) Probier einmal

Code: Alles auswählen

val delta = ChronoUnit::DAYS.between(heute, abholTag)
Wenn das nicht hilft, würde ich denn Fall mal im engl. Forum im OH 5.2 Thread schildern, vllt. liegt ja ein Bug in dem Snapshot vor.
Wie gesagt, mit 5.1.4 funktioniert das, auch ohne import und Ohrenbrechen.

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 19. Apr 2026 12:37
von peter-pan
nw378 hat geschrieben: 18. Apr 2026 07:54 Dann noch zwei Ideen:
Danke dir für die Tipps. Hat aber leider nicht geklappt.
nw378 hat geschrieben: 18. Apr 2026 07:54 a) garbage_currwaste_Begin ist zum Zeitpunkt der rule-Ausführung mit einem Datum gefüllt?
geprüft - Datum gefüllt
b) Probier einmal
val delta = ChronoUnit::DAYS.between(heute, abholTag)
Immer noch Fehlermeldung
Werde mal schauen, was passiert, wenn ich auf OH5.1.4 upgrade und ansonsten werde ich mal im internationalen Forum fragen, ob sich was in Richtung OH5.2 etwas verändert hat.

Danke - Peter

Re: DSL-Rule - Period.between -Fehlermeldung

Verfasst: 19. Apr 2026 18:04
von udo1toni
Ich habe gerade die Antwort von Lolodomo im englischen Forum gelesen... Upsi... Konflikt von (neuen) reservierten Schlüsselworten...

Wird also gefixt werden...