DSL-Rule - Period.between -Fehlermeldung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
peter-pan
Beiträge: 2865
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

DSL-Rule - Period.between -Fehlermeldung

Beitrag 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 ?
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.3 openhabian
(Test openHAB 5.2.0-SNAPSHOT - Build #5306)

Benutzeravatar
udo1toni
Beiträge: 15678
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag 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. :)
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Benutzeravatar
peter-pan
Beiträge: 2865
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.3 openhabian
(Test openHAB 5.2.0-SNAPSHOT - Build #5306)

nw378
Beiträge: 365
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag 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)
openHAB 5.1.3 @ RPi 5 / M.2 SSD - openhabian/Debian 13.3 (trixie) - InfluxDB2 und Grafana @ Synology Docker - KNX, Viessmann vcontrol, u.v.m.

Benutzeravatar
peter-pan
Beiträge: 2865
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag von peter-pan »

nw378 hat geschrieben: Heute 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
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.3 openhabian
(Test openHAB 5.2.0-SNAPSHOT - Build #5306)

nw378
Beiträge: 365
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag 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)
openHAB 5.1.3 @ RPi 5 / M.2 SSD - openhabian/Debian 13.3 (trixie) - InfluxDB2 und Grafana @ Synology Docker - KNX, Viessmann vcontrol, u.v.m.

Antworten