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

Müll rausbingen iCalendar Binding

Beitrag 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"
von Pepe1907 » 4. Apr 2021 21:38
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
Gehe zur vollständigen Antwort
Zuletzt geändert von Pepe1907 am 16. Mär 2021 21:51, insgesamt 1-mal geändert.

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Müll rausbingen CalDav Binding

Beitrag 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'"))
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Müll rausbingen CalDav Binding

Beitrag 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

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

Re: Müll rausbingen CalDav Binding

Beitrag 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)
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 CalDav Binding

Beitrag 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



galaxisspatz
Beiträge: 93
Registriert: 28. Jun 2020 19:42
Answers: 1

Re: Müll rausbingen CalDav Binding

Beitrag 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
OH 4 auf dem Raspberry 3b

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

Re: Müll rausbingen CalDav Binding

Beitrag 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

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

Re: Müll rausbingen CalDav Binding

Beitrag von udo1toni »

Was ist denn das Ergebnis der Zeile logInfo("loggerName", morgen.state.toString("yyyy-MM-dd"))?
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 CalDav Binding

Beitrag 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

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

Re: Müll rausbingen CalDav Binding

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

Antworten