rule "Kalender Erinnerung"
when
Time cron "0 34 21 * * ?"
then
val Number time_abfall_1 = (CalDav_Date.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
val Number time_abfall_2 = (CalDav_Date1.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
val Number time_now = now.toInstant.toEpochMilli
var Number time_diff_1 = (time_abfall_1 - time_now)/(60000*60)
var Number time_diff_2 = (time_abfall_2 - time_now)/(60000*60)
if (time_diff_1 < 14) {
if (CalDav_Termin.state.toString.contains("Papiertonne") ) {
sendNotification("XXX", "Morgen wird Altpapier abegholt")
}
if (CalDav_Termin.state.toString.contains("Gelber Sack") ) {
sendNotification("XXX", "Morgen wird der Hausmüll abegholt")}
}
if (time_diff_2 < 14) {
if (CalDav_Termin1.state.toString.contains("Altpapier") ) {
sendNotification("XXX", "Morgen wird Altpapier abegholt")
}
if (CalDav_Termin1.state.toString.contains("Test") ) {
sendNotification("XXX", "Test hat angeschlagen")
}
if (CalDav_Termin1.state.toString.contains("Gelber Sack") ) {
sendNotification("XXX", "Morgen wird der Hausmüll abegholt")}
}
if (CalDav_Termin.state.toString.contains("Geburtstag") && time_diff_1 < 168){
sendNotification("XXX", CalDav_Date.state + CalDav_Termin.state)
}
if (CalDav_Termin1.state.toString.contains("Geburtstag") && time_diff_1 < 168){
sendNotification("XXX", CalDav_Date1.state + CalDav_Termin1.state)
}
end
Error during the execution of rule 'Kalender Erinnerung': Could not cast UNDEF to org.eclipse.smarthome.core.library.types.DateTimeType; line 66, column 31, length 33
Das Problem ist glaube ich das ich das iCalendar Binding verwende welches keinen Eintrag für CalDav_Date hat, wenn es für den heutigen Tag keinen Eintrag gibt.
val Number time_abfall_1 = if(CalDav_Date.state instanceof DateTimeType) (CalDav_Date.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli else 0
val Number time_abfall_2 = if(CalDav_Date1.state instanceof DateTimeType) (CalDav_Date1.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli else 0
In diesem Fall ist der ternäre Operator super, denn die Konstante muss außerhalb des Vergleichs definiert werden.
Alternativ könnte man auch aus dem val ein var machen, die Variable zunächst mit 0 initialisieren und anschließend, nur für den Fall, dass der Status einen gültigen Wert enthält, diesen in die Variable übernehmen:
var Number time_abfall_1 = 0
var Number time_abfall_2 = 0
if(CalDav_Date.state instanceof DateTimeType)
time_abfall_1 = (CalDav_Date.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
if(CalDav_Date1.state instanceof DateTimeType)
time_abfall_2 = (CalDav_Date1.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.9 - 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
So vielen Lieben Dank für eure guten und konstruktiven Ansätze.
Habe es jedoch jetzt anders gelöst und wollte es für die Nachwelt festhalten.
Denke das ist der leichteste Weg.#
Hier die Regel :
import org.openhab.model.script.actions.Timer
import org.joda.datetime.DateTime
import org.joda.time.format.DateTimeFormat
import org.joda.time.format.DateTimeFormatter
import org.openhab.library.types.DateTimeType
import java.time.ZonedDateTime
import java.time.temporal.ChronoUnit
rule "Kalender nächster Eintrag"
when
Time cron "0 0 18 * * ?"
then
val date_2 = CalDav_Date1.getStateAs(DateTimeType).zonedDateTime
val date_1 = Date.getStateAs(DateTimeType).zonedDateTime
val days_between = date_1.until(date_2, ChronoUnit.DAYS)
muell_tage.postUpdate(days_between + 1 )
if (CalDav_Date1.state == "UNDEF" ) { return } //Stopp if there is no current event