Seite 1 von 2

Müll rausbingen iCalendar Binding

Verfasst: 12. Mär 2021 20:28
von Pepe1907
Hallo ihr Lieben,
da bin ich mal wieder mit einem neuen Problem wo ich Hilfe bräuchte.
Hätte gerne eine Benachrichtig wenn für morgen ein Kalender Eintrag existiert.

muell.rules

Code: Alles auswählen

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

val String Dateiname = "Kalender.rules"

rule "Kalender heute"
when
    Time cron "30 36 19 * * ?"
then
    Thread::sleep(3000) //Wait for 3 seconds to let Kalender_AktuellesEvent_Start update

    if (CalDav_Date.state.toString == "UNDEF" ) { return } //Stopp if there is no current event

    var kalender_heute = CalDav_Date.getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType).zonedDateTime.getZone).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'"))
    
    if (kalender_heute.toString == now.toString("yyyy-MM-dd'T'")) {
        logInfo("Rule triggered", CalDav_Date.state + CalDav_Termin.state)
        sendNotification("XXX", "Heute: " + CalDav_Termin.state)
    }

end

rule "Kalender morgen"
when
    Time cron "0 24 20 * * ?"
then
    Thread::sleep(3000) //Wait for 3 seconds to let Kalender_AktuellesEvent_Start update

    if (CalDav_Termin1.state.toString == "UNDEF" ) { return } //Stopp if there is no current event
    
    var kalender_morgen = CalDav_Date1.getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType).zonedDateTime.getZone).format(DateTimeFormatter.plusDays(1).ofPattern("yyyy-MM-dd'T'"))
    
    if  
        (kalender_morgen.toString == now.toString("yyyy-MM-dd'T'")) {
        logInfo("Rule triggered", CalDav_Date1.state + CalDav_Termin1.state)
        sendNotification("XXX", "Morgen: " + CalDav_Termin1.state)
    }

end
rule "Kalender heute2"
when
    Time cron "0 39 19 * * ?"
then
    Thread::sleep(3000) //Wait for 3 seconds to let Kalender_AktuellesEvent_Start update

    if (CalDav_Termin1.state.toString == "UNDEF" ) { return } //Stopp if there is no current event

    var kalender_morgen = CalDav_Date1.getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType).zonedDateTime.getZone).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'"))
    

    if (kalender_morgen.toString == now.toString("yyyy-MM-dd'T'")) {
        logInfo("Rule triggered", CalDav_Date1.stae + CalDav_Termin1.state)
        sendNotification("XXX", "Morgen: " + CalDav_Termin1.state)
    }

end
Es geht nur um "Kalender morgen"
Erhalte nur folgende Fehlermeldung

Code: Alles auswählen

[ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Kalender morgen': The name 'DateTimeFormatter' cannot be resolved to an item or type;
Komischerweise funktioniert es bei "Kalender heute"

Re: Müll rausbingen CalDav Binding

Verfasst: 12. Mär 2021 21:37
von int5749
Sehr komplexer String.
Für mich wird an der falschen Stelle der Tag addiert

Probier doch mal

Code: Alles auswählen

var kalender_morgen = CalDav_Date1.getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType.plusDays(1)).zonedDateTime.getZone).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'"))

Re: Müll rausbingen CalDav Binding

Verfasst: 12. Mär 2021 21:49
von Pepe1907
int5749 hat geschrieben: 12. Mär 2021 21:37 Sehr komplexer String.
Für mich wird an der falschen Stelle der Tag addiert

Probier doch mal

Code: Alles auswählen

var kalender_morgen = CalDav_Date1.getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType.plusDays(1)).zonedDateTime.getZone).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'"))
Leider noch nicht

Code: Alles auswählen

[ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Kalender morgen': An error occurred during the script execution: null

Re: Müll rausbingen CalDav Binding

Verfasst: 13. Mär 2021 14:52
von udo1toni
Welche Version von openHAB verwendest Du? (keiner der imports sollte unter OH2 nötig sein; unter OH2 funktioniert joda nicht mehr)
Warum drei Rules?
Warum wartest Du zu Beginn der Rules drei Sekunden? (sinnvoller wäre es, die Rule drei Sekunden später zu starten)

Re: Müll rausbingen CalDav Binding

Verfasst: 13. Mär 2021 15:09
von Pepe1907
udo1toni hat geschrieben:Welche Version von openHAB verwendest Du? (keiner der imports sollte unter OH2 nötig sein; unter OH2 funktioniert joda nicht mehr)
Warum drei Rules?
Warum wartest Du zu Beginn der Rules drei Sekunden? (sinnvoller wäre es, die Rule drei Sekunden später zu starten)
Ich verwende OH2.5.12.
Wie alles neue kopiere ich mir die Regeln aus dem Netz raus und Wandel die dann so um dass die zu meinen Anforderungen passen.
Das ist für mich wieder komplettes Neuland mit datumsvergleich.
Eigentlich brauche ich die 3 Sekunden gar nicht könnte also auch raus [emoji16]


Gesendet von meinem SM-G981B mit Tapatalk



Re: Müll rausbingen CalDav Binding

Verfasst: 13. Mär 2021 22:44
von galaxisspatz
Hallo Pepe2007
ich habe es so gelöst

Code: Alles auswählen

rule "Müll Nachrichten"
when
	Time is noon
then
	var DateTime Abholung_diff = parse(MullNextStart.state.toString)
	val Abholung = Math::round((Abholung_diff.millis - now.millis) / (86400000.0))
    val Testvariable = 0

    if((Abholung as Number) == (Testvariable as Number)) {
        val telegramAction = getActions("telegram","telegram:*************")
        telegramAction.sendTelegram("Morgen wird Müll abgeholt. " + MullNextTitle.state)
        logInfo("RULES", "Diff: " + Abholung + " Tage. Telegram send")
    }
    
end
wenn Morgen der Müll abgeholt wird bekomme Mittag einen Tag vorher eine Nachricht via Telegram

Gruß
Olaf

Re: Müll rausbingen CalDav Binding

Verfasst: 14. Mär 2021 22:07
von Pepe1907
Leider hilft es mir nicht weiter.
Rule

Code: Alles auswählen

rule "Kalender morgen"
when
    Time cron "30 3 22 * * ?"
then
   

    if (CalDav_Termin1.state.toString == "UNDEF" ) { return } //Stopp if there is no current event
    val now = ZonedDateTime::now
    morgen.postUpdate(new DateTimeType(now.plusDays(1))) 
    logInfo("loggerName", morgen.state.toString("yyyy-MM-dd"))   
    if  
        (CalDav_Date1.state.toString("yyyy-MM-dd") == morgen.state.toString("yyyy-MM-dd")) {
        logInfo("Rule triggered", CalDav_Date1.state + CalDav_Termin1.state)
        sendNotification("XXX", "Morgen: " + CalDav_Termin1.state)
    }

end
Logfile

Code: Alles auswählen

2021-03-14 22:03:34.355 [vent.ItemStateChangedEvent] - morgen changed from 2021-03-15T22:02:24.308+0100 to 2021-03-15T22:03:34.344+0100
Doch Leider schmeißt er mir keine Benachrichtigung raus obwohl der nächste Termin der 15-03-2021 ist und ich beide Items gleich formatiere

Re: Müll rausbingen CalDav Binding

Verfasst: 16. Mär 2021 04:21
von udo1toni
Was ist denn das Ergebnis der Zeile logInfo("loggerName", morgen.state.toString("yyyy-MM-dd"))?

Re: Müll rausbingen CalDav Binding

Verfasst: 16. Mär 2021 17:37
von Pepe1907
udo1toni hat geschrieben: 16. Mär 2021 04:21 Was ist denn das Ergebnis der Zeile logInfo("loggerName", morgen.state.toString("yyyy-MM-dd"))?
Da haut er mir das raus

Code: Alles auswählen

2021-03-16 17:34:24.364 [INFO ] [se.smarthome.model.script.loggerName] - 2021-03-17T17:34:24.354+0100
Lasse ich aber in der Rule beide abfragen

Code: Alles auswählen

 logInfo("loggerName", morgen.state.toString("yyyy-MM-dd"))
    logInfo("loggerName", CalDav_Date1.state.toString("yyyy-MM-dd"))
schmeißt er mir das raus

Code: Alles auswählen

2021-03-16 17:34:54.362 [INFO ] [se.smarthome.model.script.loggerName] - 2021-03-17T17:34:24.354+0100

2021-03-16 17:34:54.368 [INFO ] [se.smarthome.model.script.loggerName] - 2021-03-17T00:00:00.000+0100
scheint mir als würde er die Formatierung nicht richtig durchführen

Re: Müll rausbingen CalDav Binding

Verfasst: 16. Mär 2021 18:56
von juschi
Ich hab bei mir sowas ähnliches auch mal umgesetzt. Hab da noch einen anderen Ansatz, falls du mit deinem nicht weiter kommst.

Code: Alles auswählen

rule	"Abfallkalender Erinnerung"
when	Time cron "0 0 0/1 1/1 * ? *"
then	
		val Number time_abfall_1 = (calendar_abfall_next0_time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
		val Number time_abfall_2 = (calendar_abfall_next1_time.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)
		var String abfall_1
		var String abfall_2
		var String farbe_1
		var String farbe_2
		
		if (time_diff_1 < 14 && now.getHour == 20) {
			sendCommand(abfall_erinnerung, ON)
			sendCommand(gateway_unten_flur_light, ON)
			if (calendar_abfall_next0_name.state.toString.contains("Altpapier") ) 	{ farbe_1 = "233,97,100" abfall_1 = "Altpapier"}
			if (calendar_abfall_next0_name.state.toString.contains("Gelber Sack") ) { farbe_1 = "62,100,50" abfall_1 = "Gelber Sack"}
			if (calendar_abfall_next0_name.state.toString.contains("Restmüll") ) 	{ farbe_1 = "6,98,100" abfall_1 = "Restmüll"}
					
				if (time_diff_2 < 14) {
					if (calendar_abfall_next1_name.state.toString.contains("Altpapier") ) 	{ farbe_2 = "233,97,100" abfall_2 = "Altpapier"}
					if (calendar_abfall_next1_name.state.toString.contains("Gelber Sack") ) { farbe_2 = "62,100,50" abfall_2 = "Gelber Sack"}
					if (calendar_abfall_next1_name.state.toString.contains("Restmüll") ) 	{ farbe_2 = "6,98,100" abfall_2 = "Restmüll"}
					postUpdate(abfall_erinnerung_text, abfall_1 + " und " + abfall_2)
					sendBroadcastNotification("Abfall Erinnerung: " + abfall_1 + " und " + abfall_2 + " wird abgeholt")
					echo_unten_kueche_tts.sendCommand("Morgen wird " + abfall_1 + " und " + abfall_2 + " abgeholt")
					while (abfall_erinnerung.state == ON) {
						sendCommand(gateway_unten_flur_color, farbe_1)
						Thread::sleep(5000)
						sendCommand(gateway_unten_flur_color, farbe_2)
						Thread::sleep(5000) }}
				else {
					postUpdate(abfall_erinnerung_text, abfall_1) 
					sendBroadcastNotification("Abfall Erinnerung: " + abfall_1 + " wird abgeholt")
					echo_unten_kueche_tts.sendCommand("Morgen wird " + abfall_1 + " abgeholt")
					sendCommand(gateway_unten_flur_color, farbe_1) }}
end
Ist etwas umständlich, aber funktioniert so weit ganz gut :D

Noch zur Erklärung:
Teilweise werden bei uns 2 verschiede Abfallbehälter am gleichen Tag abgeholt. Spaßeshalber soll dann das Licht in den Farben blinken ...

time_diff bedeutet die Zeit zwischen der Uhrzeit der Müllabholung und der aktuellen Zeit. Ich prüfe dann noch ob der Abfall in den nächsten 14 Stunden abgeholt wird. Das ist dann etwas abhängig von dem Zeitpunkt zum auslösen der Regel. Theoretisch würde es in meiner Regel reichen die Regel um 8 Uhr auszuführen.