Fehler beim laden einer Rules DAtei

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Markus_JE
Beiträge: 139
Registriert: 6. Okt 2019 13:20
Answers: 0

Fehler beim laden einer Rules DAtei

Beitrag von Markus_JE »

Hallo zusammen,

ich bekommen beim laden einer rules datei immer den Fehler im Logging:
DSL model 'Abfall.rules' has errors, therefore ignoring it: [13,42]: no viable alternative at input ')' [14,43]: no viable alternative at input ')'

Ich verwende openhab 5.1.3 auf eine Raspberry.
Ich komme einfach nicht dahinter wo openhab genau ein Problem hat bzw. was ich ändern kann. Anbei meine Regel:

Code: Alles auswählen

rule "Abfall ICS verarbeiten"
when
    Item Abfall_ICS_Rohdaten changed
then
    val raw = Abfall_ICS_Rohdaten.state.toString
    if (raw === null || raw.trim.isEmpty) return

    val lines = raw.split("\n")

    val today = (now.toLocalDate.toString).replaceAll("-", "")
    val tomorrow = (now.plusDays(1).toLocalDate.toString).replaceAll("-", "")

    var heuteList = newArrayList[String]()
    var morgenList = newArrayList[String]()

    var currentDate = ""
    var currentSummary = ""

    for (line : lines) {

        if (line.startsWith("DTSTART")) {
            currentDate = line.substring(line.indexOf(":") + 1, line.indexOf(":") + 9)
        }

        if (line.startsWith("SUMMARY")) {
            currentSummary = line.substring(line.indexOf(":") + 1)
        }

        if (line.startsWith("END:VEVENT")) {
            if (currentDate == today) {
                heuteList.add(currentSummary)
            }
            if (currentDate == tomorrow) {
                morgenList.add(currentSummary)
            }
            currentDate = ""
            currentSummary = ""
        }
    }

    // Heute
    var h1 = if (heuteList.size > 0) heuteList.get(0) else ""
    var h2 = if (heuteList.size > 1) heuteList.get(1) else ""
    var h3 = if (heuteList.size > 2) heuteList.get(2) else ""
    var h4 = if (heuteList.size > 3) heuteList.get(3) else ""
    var h5 = if (heuteList.size > 4) heuteList.get(4) else ""

    Abfall_Heute_1.postUpdate(h1)
    Abfall_Heute_2.postUpdate(h2)
    Abfall_Heute_3.postUpdate(h3)
    Abfall_Heute_4.postUpdate(h4)
    Abfall_Heute_5.postUpdate(h5)

    // Morgen
    var m1 = if (morgenList.size > 0) morgenList.get(0) else ""
    var m2 = if (morgenList.size > 1) morgenList.get(1) else ""
    var m3 = if (morgenList.size > 2) morgenList.get(2) else ""
    var m4 = if (morgenList.size > 3) morgenList.get(3) else ""
    var m5 = if (morgenList.size > 4) morgenList.get(4) else ""

    Abfall_Morgen_1.postUpdate(m1)
    Abfall_Morgen_2.postUpdate(m2)
    Abfall_Morgen_3.postUpdate(m3)
    Abfall_Morgen_4.postUpdate(m4)
    Abfall_Morgen_5.postUpdate(m5)
end


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

Re: Fehler beim laden einer Rules DAtei

Beitrag von nw378 »

Die Fehlermeldung bezieht sich auf die Linien 13 und 14, dort sind die Klammern um (now....) falsch.

Korrekt müsste es so sein:

Code: Alles auswählen

val today = now.toLocalDate.toString.replaceAll("-", "")
val tomorrow = now.plusDays(1).toLocalDate.toString.replaceAll("-", "")
Was mir dann noch aufgefallen ist:

hinter return muss ein ;
also:

Code: Alles auswählen

return;
Und das Escapen des Zeilenwechsels kann manchmal zicken, evtl muss du es doppelt escapen \\n oder auch umschiffen:

Code: Alles auswählen

.replaceAll('\\n','#').split('#');
Edit:

openHAB hat das icalender Binding https://www.openhab.org/addons/bindings/icalendar/, damit lassen sich ganz bequem aus .ics Dateien die Einträge verarbeiten, mit Titel, Datum, etc.

Für einen Müllkalender zum Beispiel so:

Code: Alles auswählen

// --- Aktuelles Jahr ---
Bridge icalendar:calendar:abfall1 "Müllkalender (dieses Jahr)" @ "Stadt" [
    url = "http://localhost:8080/static/abfalla.ics",
    refreshTime = 60
] 
    Thing icalendar:eventfilter:blau1  "Müllkalender: Papierabfuhr (aktuell)" (icalendar:calendar:abfall1 ) [ maxEvents = 1, datetimeUnit = "DAY", datetimeStart = 0, datetimeEnd = 365, datetimeRound = true, textEventField = "SUMMARY", textEventValue = "Papier", textValueType = "TEXT", refreshTime = 60 ]
    Thing icalendar:eventfilter:grau1  "Müllkalender: Restmüll (aktuell)"     (icalendar:calendar:abfall1 ) [ maxEvents = 1, datetimeUnit = "DAY", datetimeStart = 0, datetimeEnd = 365, datetimeRound = true, textEventField = "SUMMARY", textEventValue = "Rest",   textValueType = "TEXT", refreshTime = 60 ]
    Thing icalendar:eventfilter:gelb1  "Müllkalender: Gelbe Tonne (aktuell)"  (icalendar:calendar:abfall1 ) [ maxEvents = 1, datetimeUnit = "DAY", datetimeStart = 0, datetimeEnd = 365, datetimeRound = true, textEventField = "SUMMARY", textEventValue = "Gelb",   textValueType = "TEXT", refreshTime = 60 ]
    Thing icalendar:eventfilter:gruen1 "Müllkalender: Biotonne (aktuell)"     (icalendar:calendar:abfall1 ) [ maxEvents = 1, datetimeUnit = "DAY", datetimeStart = 0, datetimeEnd = 365, datetimeRound = true, textEventField = "SUMMARY", textEventValue = "Bio",    textValueType = "TEXT", refreshTime = 60 ]

.items:

Code: Alles auswählen

// 🗓️ Abholtermine pro Tonne (Farben & Instanzen)
DateTime Abfall_Termin1_grau    (gTrash, gAbfall_alleTermine)   {channel="icalendar:eventfilter:grau1:result_0#begin"}
DateTime Abfall_Termin1_blau    (gTrash, gAbfall_alleTermine)   {channel="icalendar:eventfilter:blau1:result_0#begin"}
DateTime Abfall_Termin1_gelb    (gTrash, gAbfall_alleTermine)   {channel="icalendar:eventfilter:gelb1:result_0#begin"}
DateTime Abfall_Termin1_gruen   (gTrash, gAbfall_alleTermine)   {channel="icalendar:eventfilter:gruen1:result_0#begin"}
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