Seite 1 von 1

Lösung für Müllkalender

Verfasst: 8. Mai 2022 13:15
von dirkabel
Lösung für Müllkalender

Der Umzug vonOH2 zu OH3 mit meinem Müllkalender hat mir etwas Mühe bereitet, daher hier mal die Lösung.
Ich habe über die Web UI eine Kalender Bridge zu meinem Müllkalender auf dem Synology NAS angelegt, dazu vier Eventfilter mit Textsuche nach Gelber Sack, Restabfall, Bioabfall und Sperrmüll. Jeweils ein Event, Suchzeitraum 0-21, bei Sperrmüll 90 Tage, der kommt nicht so oft.
Über einen fünften Eventfilter suche ich über 90 Tage nach dem nächsten Eintrag, hier aber mit REGEX Suche nach ^((?!(Gelber Sack|Sperrmüll|Restabfall|Bioabfall)).)*$ also alle Einträge, die nicht zu den anderen vier passen.

Dann habe ich folgende Items:

Code: Alles auswählen

DateTime    date_today       "Heute [%1$td.%1$tm.%1$tY]"                 <calendar>    {channel="ntp:ntp:local:dateTime"}

DateTime    Tonne_ge_Date    "Gelber Sack [%1$tA, %1$td.%1$tm.%1$tY]"    <tgelb>       {channel="icalendar:eventfilter:abfuhr:gelberSack:result_0#begin"}
Number      Tonne_ge_Warn    "gelber Sack Warnstufe [%d]"

DateTime    Tonne_br_Date    "Bioabfall [%1$tA, %1$td.%1$tm.%1$tY]"      <tbraun>      {channel="icalendar:eventfilter:abfuhr:biomuell:result_0#begin"}
Number      Tonne_br_Warn    "braune Tonne Warnstufe [%d]"

DateTime    Tonne_sw_Date    "Restabfall [%1$tA, %1$td.%1$tm.%1$tY]"     <tgrau>       {channel="icalendar:eventfilter:abfuhr:restmuell:result_0#begin"}
Number      Tonne_sw_Warn    "Restmüll Warnstufe [%d]"

DateTime    Tonne_sp_Date    "Sperrmüll [%1$tA, %1$td.%1$tm.%1$tY]"      <tsperr>      {channel="icalendar:eventfilter:abfuhr:sperrmuell:result_0#begin"}
Number      Tonne_sp_Warn    "Sperrmüll Warnstufe [%d]"

String      Tonne_so_Typ     "Sonderentsorgung [%s]"                     <tsack>      {channel="icalendar:eventfilter:abfuhr:sondernuell:result_0#title"}
DateTime    Tonne_so_Date    "Datum [%1$tA, %1$td.%1$tm.%1$tY]"          <tsack>      {channel="icalendar:eventfilter:abfuhr:sondernuell:result_0#begin"}
Number      Tonne_so_Warn    "Sondermüll Warnstufe [%d]"
in der Sidemap:

Code: Alles auswählen

	Frame label="Müllkalender" 
	{
		Text item=Tonne_sw_Date visibility=[Tonne_sw_Warn > 1 ] valuecolor=[Tonne_sw_Warn ==3="red", Tonne_sw_Warn==2="orange", Tonne_sw_Warn==1="green", Tonne_sw_Warn==0="gray"]
		Text item=Tonne_ge_Date visibility=[Tonne_ge_Warn > 1 ] valuecolor=[Tonne_ge_Warn ==3="red", Tonne_ge_Warn==2="orange", Tonne_ge_Warn==1="green", Tonne_ge_Warn==0="gray"]
        Text item=Tonne_br_Date visibility=[Tonne_br_Warn > 1 ] valuecolor=[Tonne_br_Warn ==3="red", Tonne_br_Warn==2="orange", Tonne_br_Warn==1="green", Tonne_br_Warn==0="gray"]
		Text item=Tonne_sp_Date visibility=[Tonne_sp_Warn > 1 ] valuecolor=[Tonne_sp_Warn ==3="red", Tonne_sp_Warn==2="orange", Tonne_sp_Warn==1="green", Tonne_sp_Warn==0="gray"]
		Text item=Tonne_so_Typ  visibility=[Tonne_so_Warn > 1 ] 
		Text item=Tonne_so_Date visibility=[Tonne_so_Warn > 1 ] valuecolor=[Tonne_so_Warn ==3="red", Tonne_so_Warn==2="orange", Tonne_so_Warn==1="green", Tonne_so_Warn==0="gray"]
		Text label="kommende Abfuhrtermine" icon="tcar" 
		{
			Text item=Date	label="aktuelles Datum [%1$tA, %1$td.%1$tm.%1$tY]"
			Text item=Tonne_sw_Date visibility=[Tonne_sw_Warn > 0 ] valuecolor=[Tonne_sw_Warn ==3="red", Tonne_sw_Warn==2="orange", Tonne_sw_Warn==1="green", Tonne_sw_Warn==0="gray"]
			Text item=Tonne_ge_Date visibility=[Tonne_ge_Warn > 0 ] valuecolor=[Tonne_ge_Warn ==3="red", Tonne_ge_Warn==2="orange", Tonne_ge_Warn==1="green", Tonne_ge_Warn==0="gray"]
        	Text item=Tonne_br_Date visibility=[Tonne_br_Warn > 0 ] valuecolor=[Tonne_br_Warn ==3="red", Tonne_br_Warn==2="orange", Tonne_br_Warn==1="green", Tonne_br_Warn==0="gray"]
			Text item=Tonne_sp_Date visibility=[Tonne_sp_Warn > 0 ] valuecolor=[Tonne_sp_Warn ==3="red", Tonne_sp_Warn==2="orange", Tonne_sp_Warn==1="green", Tonne_sp_Warn==0="gray"]
			Text item=Tonne_so_Typ  visibility=[Tonne_so_Warn > 0 ]
			Text item=Tonne_so_Date visibility=[Tonne_so_Warn > 0 ] valuecolor=[Tonne_so_Warn ==3="red", Tonne_so_Warn==2="orange", Tonne_so_Warn==1="green", Tonne_so_Warn==0="gray"]
			//Text item=CalDav_Nxt
			//Text item=CalDav_Act
		}
	}	
Mit folgender rule:

Code: Alles auswählen

rule "Tonnenpruefung Datum Change"
    when
       //Item date_today changed or System started
        Time cron "*/1 * * * * ?"   // jede Sekunde
    then
        var debug = 1
        var datstring ="2022-05-16T06:00:00.000+0200 "
        var datum



        if(Tonne_ge_Date.state!=UNDEF) 
        {
            datstring = Tonne_ge_Date.state.toString // 2022-05-16T06:00:00.000+0200
            datstring = datstring.substring(0,23)    // 2022-05-16T06:00:00.000
            datstring = datstring + "Z"              // 2022-05-16T06:00:00.000Z
            //var datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault())
            datum = ZonedDateTime.parse(datstring).withZoneSameInstant(ZoneId.systemDefault())
        }
        else 
        {
            datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault()) // irgendein Datum
        }

        if (debug > 0) logWarn("caldav", "Tonnenprüfung gesartet ")

        if(Tonne_ge_Date.state==UNDEF) 
        {
            Tonne_ge_Warn.postUpdate(0) // Müllart nicht gefunden
            if (debug > 1) logWarn("caldav", "gelbe Tonne Datum nicht gefunden")
            return 
        }
        else if( (now.plusDays(0).isAfter(datum) ) && (now.minusDays(1).isBefore(datum)) )
        {
            Tonne_ge_Warn.postUpdate(3)
             if (debug > 1) logWarn("caldav", "gelbe Tonne Datum Heute")
        } 
        else if( (now.plusDays(1).isAfter(datum) ) && (now.plusDays(0).isBefore(datum)) )
        {
            Tonne_ge_Warn.postUpdate(2)
             if (debug > 1) logWarn("caldav", "gelbe Tonne Datum morgen")
        }
        else
        {
            Tonne_ge_Warn.postUpdate(1)
             if (debug > 1) logWarn("caldav", "gelbe Tonne Datum demnächst")
        }       


        if(Tonne_sw_Date.state!=UNDEF) 
        {
            datstring = Tonne_sw_Date.state.toString // 2022-05-16T06:00:00.000+0200
            datstring = datstring.substring(0,23)    // 2022-05-16T06:00:00.000
            datstring = datstring + "Z"              // 2022-05-16T06:00:00.000Z
            //var datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault())
            datum = ZonedDateTime.parse(datstring).withZoneSameInstant(ZoneId.systemDefault())
        }
        else 
        {
            datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault()) // irgendein Datum
        }

        if(Tonne_sw_Date.state==UNDEF) 
        {
            Tonne_sw_Warn.postUpdate(0) // Müllart nicht gefunden
            if (debug > 1) logWarn("caldav", "schwarze Tonne Datum nicht gefunden")
            return 
        }
        else if( (now.plusDays(0).isAfter(datum) ) && (now.minusDays(1).isBefore(datum)) )
        {
            Tonne_sw_Warn.postUpdate(3)
             if (debug > 1) logWarn("caldav", "schwarze Tonne Datum Heute")
        }  
        else  if( (now.plusDays(1).isAfter(datum) ) && (now.plusDays(0).isBefore(datum)) )
        {
            Tonne_sw_Warn.postUpdate(2)
             if (debug > 1) logWarn("caldav", "schwarze Tonne Datum morgen")
        }
        else
        {
            Tonne_sw_Warn.postUpdate(1)
             if (debug > 1) logWarn("caldav", "schwarze Tonne Datum demnächst")
        }

        if(Tonne_br_Date.state!=UNDEF) 
        {
            datstring = Tonne_br_Date.state.toString // 2022-05-16T06:00:00.000+0200
            datstring = datstring.substring(0,23)    // 2022-05-16T06:00:00.000
            datstring = datstring + "Z"              // 2022-05-16T06:00:00.000Z
            //var datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault())
            datum = ZonedDateTime.parse(datstring).withZoneSameInstant(ZoneId.systemDefault())
        }
        else 
        {
            datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault()) // irgendein Datum
        }

        if(Tonne_br_Date.state==UNDEF) 
        {
            Tonne_br_Warn.postUpdate(0) // Müllart nicht gefunden
            if (debug > 1) logWarn("caldav", "braune Tonne Datum nicht gefunden")
            return 
        }
        else if( (now.plusDays(0).isAfter(datum) ) && (now.minusDays(1).isBefore(datum)) )
        {
            Tonne_br_Warn.postUpdate(3)
             if (debug > 1) logWarn("caldav", "braune Tonne Datum Heute")
        }  
        else  if( (now.plusDays(1).isAfter(datum) ) && (now.plusDays(0).isBefore(datum)) )
        {
            Tonne_br_Warn.postUpdate(2)
             if (debug > 1) logWarn("caldav", "braune Tonne Datum morgen")
        }
        else
        {
            Tonne_br_Warn.postUpdate(1)
             if (debug > 1) logWarn("caldav", "braune Tonne Datum demnächst")
        }

        if(Tonne_sp_Date.state!=UNDEF) 
        {
            datstring = Tonne_sp_Date.state.toString // 2022-05-16T06:00:00.000+0200
            datstring = datstring.substring(0,23)    // 2022-05-16T06:00:00.000
            datstring = datstring + "Z"              // 2022-05-16T06:00:00.000Z
            //var datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault())
            datum = ZonedDateTime.parse(datstring).withZoneSameInstant(ZoneId.systemDefault())
        }
        else 
        {
            datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault()) // irgendein Datum
        }

        if(Tonne_sp_Date.state==UNDEF) 
        {
            Tonne_sp_Warn.postUpdate(0) // Müllart nicht gefunden
            if (debug > 1) logWarn("caldav", "Sperrmüll Datum nicht gefunden")
            return 
        }
        else if( (now.plusDays(0).isAfter(datum) ) && (now.minusDays(1).isBefore(datum)) )
        {
            Tonne_sp_Warn.postUpdate(3)
             if (debug > 1) logWarn("caldav", "Sperrmüll Datum Heute")
        }  
        else  if( (now.plusDays(1).isAfter(datum) ) && (now.plusDays(0).isBefore(datum)) )
        {
            Tonne_sp_Warn.postUpdate(2)
             if (debug > 1) logWarn("caldav", "Sperrmüll Datum morgen")
        }
        else
        {
            Tonne_sp_Warn.postUpdate(1)
             if (debug > 1) logWarn("caldav", "Sperrmüll Datum demnächst")
        }

        if(Tonne_so_Date.state!=UNDEF) 
        {
            datstring = Tonne_so_Date.state.toString // 2022-05-16T06:00:00.000+0200
            datstring = datstring.substring(0,23)    // 2022-05-16T06:00:00.000
            datstring = datstring + "Z"              // 2022-05-16T06:00:00.000Z
            //var datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault())
            datum = ZonedDateTime.parse(datstring).withZoneSameInstant(ZoneId.systemDefault())
        }
        else 
        {
            datum = ZonedDateTime.parse("2020-12-25T00:00:00.000Z").withZoneSameInstant(ZoneId.systemDefault()) // irgendein Datum
        }

        if(Tonne_so_Date.state==UNDEF) 
        {
            Tonne_so_Warn.postUpdate(0) // Müllart nicht gefunden
            if (debug > 1) logWarn("caldav", "Sondermüll Datum nicht gefunden")
            return 
        }
        else if( (now.plusDays(0).isAfter(datum) ) && (now.minusDays(1).isBefore(datum)) )
        {
            Tonne_so_Warn.postUpdate(3)
             if (debug > 1) logWarn("caldav", "Sondermüll Datum Heute")
        }  
        else  if( (now.plusDays(1).isAfter(datum) ) && (now.plusDays(0).isBefore(datum)) )
        {
            Tonne_so_Warn.postUpdate(2)
             if (debug > 1) logWarn("caldav", "Sondermüll Datum morgen")
        }
        else
        {
            Tonne_so_Warn.postUpdate(1)
             if (debug > 1) logWarn("caldav", "Sondermüll Datum demnächst")
        }
       end
Das OH Datumsformat ist nicht Java konform und hat sich zudem zu OH3 noch mal geändert.
Daher die leicht bekloppte Umrechnung für isAfter/isBefore.
So habe ich aber die Anzeige , wenn der Termin nahe rückt.

Dirk

EDIT 09.05.22 rules noch einmal editiert