Du wirfst da verschiedene Sprachen durcheinander.
Der Rahmen
ist die openHAB Rules DSL (domain specific language).
Das Statement
stammt aber aus einer anderen Sprache, evtl. aus der Definition eines Widgets in der Main UI (nicht ganz eindeutig...)
Du möchtest gerne auf den Status des Items zugreifen, welcher offenbar ein Datum enthält.
Die Funktion
gibt es so in der DSL auch nicht.
Mir ist nicht so ganz klar, was die Zahl 104400000 darstellen soll, aber ich nehme an, dass Du möchtest, dass die Rule Dir um 19 Uhr eine Nachricht schickt, wenn der Status des DateTime Items innerhalb des nächsten Tages liegt (das wären 104.000 Sekunden, siehe unten).
Dazu ist zunächst zu sagen, dass das Rechnen mit Datum und Uhrzeit in der DSL nicht so einfach ist wie in anderen Sprachen, das liegt darin begründet, dass ein DateTime Item den Datentyp DateTime
Type enthält, die DSL intern aber DateTime (ohne Type, das ist der Java Datentyp) verwendet. Das bedeutet, Du musst leider die Datentypen konvertieren. Ist aber eigentlich gar nicht soooo wild...
Code: Alles auswählen
rule "Abfall morgen"
when
Time cron "0 0 19 * * ?"
then
if(!(AbfallKalender_Next_Start.state instanceof DateTimeType)) // check for valid date
return; // not valid, break
val theDate = (AbfallKalender_Next_Start.state as DateTimeType).getZonedDateTime
if(theDate.toEpochSecond - now.toEpochSecond > 104000) // 29*60*60, check for tomorrow
return; // not tomorrow, break
val telegramAction = getActions("telegram","telegram:telegramBot:0815")
telegramAction.sendTelegram("Abholung morgen: " + AbfallKalender_Current_Title.state.toString)
end
Die Rule funktioniert etwas anders als Deine, aber dann doch sehr ähnlich...
Zunächst wird nach dem Triggern der Rule geprüft, ob das Item
AbfallKalender_Next_Start als Status ein gültiges Datum enthält (der Status ist vom Typ
DateTimeType). Ist das nicht der Fall (das
! bedeutet logisches NOT), so bricht die Rule ab,
mittels
return; - Achtung! Dieser Befehl ist der einzige, an dem ein Semikolon angehängt werden muss.
Die Prüfung auf den Datentyp ist wichtig, denn der Status könnte genauso gut auch
NULL oder
UNDEF enthalten. Beides würde eine nullPopinterException auslösen.
Als nächstes wird der Status in ZonedDateTime überführt (das bedeutet, die Zeitzone ist Bestandteil des Wertes)
Nun wird der Vergleich durchgeführt, ganz ähnlich wie in Deinem Code, indem vom Zielzeitpunkt (enthalten in theDate) der aktuelle Zeitpunkt (now) abgezogen wird. Das lässt sich am einfachsten erledigen, indem man mit EpochSecond rechnet. Das ist die Zeit seit dem 1.1.1970, 0:00:00 Uhr (ohne Berücksichtigung von Schaltsekunden) in Sekunden. Die Umrechnung geht einfach, weil der Datentyp DateTime die Methode
toEpochSecond bereitstellt.
Ist der Wert größer als 29 * 60 * 60, so bricht die Rule ab. (19 Uhr + 5 Stunden + 24 Stunden ergibt Übermorgen, 0:00:00 Uhr)
Falls die Rule nun immer noch läuft, sind alle Bedingungen erfüllt, um die Meldung zu verschicken, also wird eine lokale Konstante mit dem Zeiger auf die telegram Actions geladen (val ist hier essenziell, sonst meckert openHAB).
Zu guter Letzt wird die Action sendTelegram aufgerufen und im Text wird der Status des Items
AbfallKalender_Current_Title mit ausgegeben, nachdem dieser Status in einen String gewandelt wurde.
Die Konvertierung nach String ist in diesem Fall notwendig, auch wenn das Item bereits einen String bereitstellt.
Merke:
Ein Status ist kein String

auch wenn er einen enthält.
DateTime ist keine Zahl, man kann nicht einfach so DateTime voneinander abziehen.
Items werden in der DSL immer direkt angesprochen, nicht über Konstrukte wie .getItem(Itemname).
Typprüfungen durchführen...
Wenn möglich, mit Codeabbruch arbeiten (kostet weniger Zeit als die normale bedingte Verzweigung)
Alle Wertzuweisungen in Variablen oder Konstanten müssen durch deren Definition eingeleitet werden - val für Konstante, var für Variable.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet