Müll rausbingen iCalendar Binding

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Müll rausbingen CalDav Binding

Beitrag 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

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Müll rausbingen CalDav Binding

Beitrag 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.

juschi
Beiträge: 13
Registriert: 23. Mär 2020 21:49
Answers: 0

Re: Müll rausbingen iCalendar Binding

Beitrag 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.

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Müll rausbingen iCalendar Binding

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

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Müll rausbingen iCalendar Binding

Beitrag 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

Antworten