DSL-Rule - Period.between -Fehlermeldung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
peter-pan
Beiträge: 2866
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: 2866
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: 367
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: 2866
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: Gestern 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: 367
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.

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

Re: DSL-Rule - Period.between -Fehlermeldung

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

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

Re: DSL-Rule - Period.between -Fehlermeldung

Beitrag 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.
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