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
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
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