Seite 2 von 2

Re: Müll rausbingen CalDav Binding

Verfasst: 16. Mär 2021 21:40
von Pepe1907
Danke für diesen guten Ansatz habe es gleich ausprobiert.
Leider klappt es noch nicht.

Code: Alles auswählen

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

Code: Alles auswählen


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

Re: Müll rausbingen CalDav Binding

Verfasst: 16. Mär 2021 21:48
von Pepe1907
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.

Re: Müll rausbingen iCalendar Binding

Verfasst: 28. Mär 2021 23:02
von juschi
Mh komisch,

teilweise kannst du das undef noch unterbinden mit if ( XXX.state != UNDEF) {}. Falls es für den Tag keinen Eintrag gibt.

Dass ist noch meine Things Datei:

Code: Alles auswählen

Bridge icalendar:calendar:abfall			"Abfall"		[ url="LINK", refreshTime=4320 ]
Thing  icalendar:eventfilter:abfall			"Abholung"		( icalendar:calendar:abfall ) [ maxEvents=6, refreshTime=60, datetimeUnit="DAY", datetimeStart=1, datetimeRound=true, textValueType="Abfall" ]
Und die Items:

Code: Alles auswählen

Switch 		abfall_erinnerung					"Abfall Morgen rausstellen"							<calendar>
String 		abfall_erinnerung_text				"Abfall: [%s]"										<calendar>
String   	calendar_abfall_next0_name			"Abfall: [%s]"                 						<calendar> { channel="icalendar:eventfilter:abfall:result_0#title" }
DateTime   	calendar_abfall_next0_time			"Abfall am: [%1$tA, %1$td.%1$tm]"                  	<calendar> { channel="icalendar:eventfilter:abfall:result_0#begin" }
String   	calendar_abfall_next1_name			"Abfall: [%s]"                 						<calendar> { channel="icalendar:eventfilter:abfall:result_1#title" }
DateTime   	calendar_abfall_next1_time			"Abfall am: [%1$tA, %1$td.%1$tm]"                  	<calendar> { channel="icalendar:eventfilter:abfall:result_1#begin" }
Damit haben die Einträge immer einen Wert und sind eigentlich nie UNDEF bei mir.

Re: Müll rausbingen iCalendar Binding

Verfasst: 29. Mär 2021 06:42
von udo1toni
Statt zu prüfen, ob der Status nicht UNDEF ist (was nicht hinreichend ist!) wäre es besser, den Operator instanceof zu verwenden:

Code: Alles auswählen

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:

Code: Alles auswählen

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

Re: Müll rausbingen iCalendar Binding

Verfasst: 4. Apr 2021 21:38
von Pepe1907
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

if (days_between == 0){
logInfo("Rule triggered", CalDav_Date.state.toString +" " +CalDav_Termin1.state.toString)
sendNotification("email@adresse.de", "Morgen: " + CalDav_Termin1.state)
}
if (days_between > 7 && days_between >= 1 && CalDav_Termin1.state.toString.contains(Geburtstag)){
logInfo("Rule triggered", CalDav_Date.state.toString +" " +CalDav_Termin1.state.toString)
sendNotification("email@adresse.de", "Nur noch "+ muell_tage.state + " Tage bis" + CalDav_Termin1.state)

}

end