Wann muss in Köln die Mülltonne herausgestellt werden? – Benachrichtigung über Homematic

Dieser Artikel ist leider hauptsächlich für Kölner interessant, aber für Leute mit ein wenig Programmierkenntnissen ist er vielleicht eine gute Hilfestellung. Insbesondere wenn es um die Verarbeitung von JSON-Datenstrukturen geht, da es leider in Homematic Skript keinen JSON Deserializer gibt. Ziel ist es, eine Benachrichtigung über Homematic zu bekommen, wenn am nächsten Tag eine bestimmte Mülltonne abgeholt wird. Auf die weise sollte der Termin nie wieder vergessen werden. Dazu werde ich via Skript die API der AWB Köln aufrufen und die Abfuhrtermine herunterladen und auswerten. Mir ist klar, dass das mit anderen Lösungen viel schöner geht, aber ich bin halt ein Fan davon, möglichst viel direkt auf der CCU2 zu erledigen.

In diesem Artikel gehe ich nur auf das Skript ein, welches für jede Mülltone eine Systemvariable setzt. Die Benachrichtigung überlasse ich den jeweiligen Lesern. Ein paar Ideen werde ich erwähnen, aber wenn jemand eine bessere hat, gerne in die Kommentare!

Vorraussetzung CUxD

Für dieses Skript wird zwingend der CUx Daemon benötigt. Dieser kann unter https://www.homematic-inside.de/software/item/cuxd heruntergeladen werden.

Die Installation erfolgt in der CCU2 unter Einstellungen -> Systemsteuerung -> Zusatzsoftware Installieren.

Als nächstes wird unter Einstellungen -> Systemsteuerung -> CUx-Daemon -> Geräte eine neues Gerät vom Typ CUXD-EXEC angelegt. Sollte es nicht das erste Gerät sein, muss die Seriennummer im Skript in den Einstellungen entsprechend angepasst werden.

Ermittlung des Streetcodes

Als erstes wird der streetcode eurer Straße benötigt. Hierbei handelt es sich um eine Nummer, mit der die AWB deine Straße identifiziert. Der Streetcode kann über https://www.awbkoeln.de/abfuhrkalender ermittelt werden. Das Vorgehen ist folgendermaßen:

  1. Aufruf von https://www.awbkoeln.de/abfuhrkalender mit dem Browser
  2. Eingabe der eigenen Adresse.
  3. Wenn der Kalender mit den Abholterminen erscheint, kopiert ihr am besten die URL aus der Adressleiste in einen Texteditor.
  4. Die URL sollte in etwa so aussehen (am Besipiel de Veilchenwegs)
    https://www.awbkoeln.de/abfuhrkalender/#form=%7B%22streetName%22%3A%22
    veilch%22%2C%22buildingNumber%22%3A%2220%22%2C%22buildingAddition%22
    %3A%22%22%7D&street=%7B%22street_name%22%3A%22Veilchenweg%22%2C
    %22building_number%22%3A%2220%22%2C%22building_number_plain%22%3A
    %2220%22%2C%22building_number_addition%22%3A%22%22%2C
    %22street_code%22%3A%223173%22%2C%22district%22%3A%22H
    %C3%B6henhaus%22%2C%22zipcode%22%3A%2251061%22%2C
    %22district_code%22%3A%226%22%2C%22area_code%22%3A%229%22%7D
  5. Dort findet sich die Variable street_code. Wichtig ist dass nach einem Prozent Zeichen, die nächsten beiden Zeichen ignoriert werden. In diesem Beispiel wäre der streetcode also 3173 (street_code%22%3A%223173%22).

Der soeben ermittelte streetcode und die Hausnummer muss nun in das folgende Skript kopiert werden.

Das Skript

Das Skript legt beim ersten Aufruf automatisch vier Systemvariablen, eine für jede Mülltonne, an. Es muss nur der Streetcode und die Hausnummer eingegeben werden. Das erfolgt unter den Einstellungen zwischen den Ausrufezeichen. Sollte das CUxD Device eine andere Seriennummer haben, muss das entsprechend angepasst werden.

Um das Skript einzugeben, wird ein neues Programm in der CCU2 angelegt. Als Triggerbedingung wird das Zeitmodul ausgewählt und so eingestellt:

Somit wird das Skript einmal pro Nacht aufgerufen. Ich würde es Nachts machen, da das Skript kurzzeitig die Ausführung anderer Skripte blockiert. Unbedingt aber nach Mitternacht. Nach dem Aufruf des Skriptes ist die Information gesetzt, welche Mülltonne am nächsten Tag abgeholt wird.

Als Aktion wird „Skript“ gewählt, ein Klick auf „“ öffnet den Editor, dort wird das Skript hereinkopiert und der Bereich Einstellungen im Skript angepasst. Am Ende sollte das so aussehen:

Und hier noch das Skript:

! Download der Abholtermine ueber die AWB API
! Je nachdem welche Tonne am morgigen Tag abgeholt wird, 
! wird eine entsprechende Variable gesetzt
!    -skript von technikkram.net-
! API Details: https://www.offenedaten-koeln.de/anfragen/m%C3%BCllabholungstermine-der-abfallwirtschaftsbetriebe-api
!
! Voraussetzung: CUxD muss installiert sein 
! und es muss im CUxD ein CUXD-Exec Device angelegt sein.
! Die Seriennummer muss in Zeile 18 angepasst werden, falls sie nicht 1 ist.
!
! Der Streetcode wird ueber den entsprechenden GET- Parameter unter
! https://www.awbkoeln.de/abfuhrkalender/  ermittelt.
! Er sollte eine maximal 4-stellige Zahl sein.

!EINSTELLUNGEN
string streetcode="3257";  
string hausnummer="109";
string cuxdDeviceId="CUxD.CUX2801001:1";



!_________AB HIER KEINE MODIFIKATIONEN NOTWENDIG____________

!Systemvariablen Anlegen, falls nicht vorhanden
string  svName = "Morgen_Graue_Tonne";
object  svObj  = dom.GetObject(svName);
if (!svObj)
{   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObj = dom.CreateObject(OT_VARDP);
    svObjects.Add(svObj.ID());
    svObj.Name(svName);   
    svObj.ValueType(ivtBinary);
    svObj.ValueSubType(istBool);
    svObj.ValueName1("Tonne wird morgen abgeholt");
    svObj.ValueName0("Tonne wird nicht abgeholt");    
    svObj.State(false);
    svObj.DPInfo("Information darüber ob die Tonne MORGEN abgeholt wird");
    svObj.ValueUnit("");
    dom.RTUpdate(false);
}
 
string  svName = "Morgen_Blaue_Tonne";
object  svObj  = dom.GetObject(svName);
if (!svObj)
{   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObj = dom.CreateObject(OT_VARDP);
    svObjects.Add(svObj.ID());
    svObj.Name(svName);   
    svObj.ValueType(ivtBinary);
    svObj.ValueSubType(istBool);
    svObj.ValueName1("Tonne wird morgen abgeholt");
    svObj.ValueName0("Tonne wird nicht abgeholt");    
    svObj.State(false);
    svObj.DPInfo("Information darüber ob die Tonne MORGEN abgeholt wird");
    svObj.ValueUnit("");
    dom.RTUpdate(false);
}
 
string  svName = "Morgen_Braune_Tonne";
object  svObj  = dom.GetObject(svName);
if (!svObj)
{   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObj = dom.CreateObject(OT_VARDP);
    svObjects.Add(svObj.ID());
    svObj.Name(svName);   
    svObj.ValueType(ivtBinary);
    svObj.ValueSubType(istBool);
    svObj.ValueName1("Tonne wird morgen abgeholt");
    svObj.ValueName0("Tonne wird nicht abgeholt");    
    svObj.State(false);
    svObj.DPInfo("Information darüber ob die Tonne MORGEN abgeholt wird");
    svObj.ValueUnit("");
    dom.RTUpdate(false);
}

string  svName = "Morgen_Gelbe_Tonne";
object  svObj  = dom.GetObject(svName);
if (!svObj)
{   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObj = dom.CreateObject(OT_VARDP);
    svObjects.Add(svObj.ID());
    svObj.Name(svName);   
    svObj.ValueType(ivtBinary);
    svObj.ValueSubType(istBool);
    svObj.ValueName1("Tonne wird morgen abgeholt");
    svObj.ValueName0("Tonne wird nicht abgeholt");    
    svObj.State(false);
    svObj.DPInfo("Information darüber ob die Tonne MORGEN abgeholt wird");
    svObj.ValueUnit("");
    dom.RTUpdate(false);
}

!Morgiges Datum berechnen
integer day=system.Date("%d").ToInteger();
integer month=system.Date("%m").ToInteger();
integer year=system.Date("%Y").ToInteger();
boolean schaltjahr = false;


if( ((year-2016 ) % 4 )==0 )
{
   schaltjahr = true;
}
if ((day == 31) && ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12)))
{
   if (month == 12)
   {
		month = 1;
        day = 0;
        year = year + 1;
   }
   else
   {
		day = 0;
		month = month + 1;
   }
}
if ((day == 30) && ((month == 4)|| (month == 6) || (month == 9) || (month == 11)))
{
   day = 0;
   month = month + 1;
}
if ((!schaltjahr) &&(day == 28) && (month == 2))
{
	day = 0;
	month = month + 1;
}
if ((schaltjahr) &&(day == 29) && (month == 2))
{
	day = 1;
	month = month + 1;
}
else
{
	day = day + 1;
}


!API CALL
string request="/usr/local/addons/cuxd/curl -k -G -d 'streetnumber=" # hausnummer # "&streetcode="# streetcode #"&startyear="#year.ToString()#"&endyear="#year.ToString()#"&startmonth="#month.ToString()#"&endmonth="#month.ToString()#"&form=json' https://www.awbkoeln.de/sensis/trashdate.php";
dom.GetObject(cuxdDeviceId#".CMD_SETS").State(request);
dom.GetObject(cuxdDeviceId#".CMD_QUERY_RET").State(1);
var awbresponse = dom.GetObject(cuxdDeviceId#".CMD_RETS").State();



! Check for Mülltonne
string muellEvent;
string lastMuellResultDay;
string lastMuellResultMonth;
string lastMuellResultYear;
string lastMuellResultTonne;
dom.GetObject("Morgen_Graue_Tonne").State(false);
dom.GetObject("Morgen_Blaue_Tonne").State(false);
dom.GetObject("Morgen_Braune_Tonne").State(false);
dom.GetObject("Morgen_Gelbe_Tonne").State(false);

foreach(muellEvent, awbresponse.Split("{"))
{
	if(muellEvent.Contains("day"))
	{
		
		lastMuellResultDay = muellEvent.Substr(muellEvent.Find("day") + 5,2);
		if (lastMuellResultDay.Contains(","))
		{
			lastMuellResultDay = lastMuellResultDay.Substr(0,1);
		}
		
		lastMuellResultMonth = muellEvent.Substr(muellEvent.Find("month") + 7,2);
		if (lastMuellResultMonth.Contains(","))
		{
			lastMuellResultMonth = lastMuellResultMonth.Substr(0,1);
		}
		
		lastMuellResultYear = muellEvent.Substr(muellEvent.Find("year") + 6,4);
		
		lastMuellResultTonne = muellEvent.Substr(muellEvent.Find("typ") + 6,4);
		if (lastMuellResultTonne.Contains(","))
		{
			lastMuellResultTonne = lastMuellResultTonne.Substr(0,1);
		}
		
		
		!Systemvariablen Setzen
		if((lastMuellResultDay.ToInteger() == day) && (lastMuellResultMonth.ToInteger() == month) && (lastMuellResultYear.ToInteger() == year))
		{
			if(lastMuellResultTonne.Contains("grey"))
			{
				dom.GetObject("Morgen_Graue_Tonne").State(true);
			}
			if(lastMuellResultTonne.Contains("blue"))
			{
				dom.GetObject("Morgen_Blaue_Tonne").State(true);
			}
			if(lastMuellResultTonne.Contains("brow"))
			{
				dom.GetObject("Morgen_Braune_Tonne").State(true);
			}
			if(lastMuellResultTonne.Contains("wert"))
			{
				dom.GetObject("Morgen_Gelbe_Tonne").State(true);
			}
		}
	}
}

Bevor dem Skript blind vertraut wird, sollte eine kleine Testphase eingelegt werden. Ein falscher Streetcode wäre sehr ärgerlich…

Homematic Benachrichtigung

Das Skript setzt hier nur vier Systemvariablen, es erfolgt also noch keinerlei Benachrichtigung. Da ich gerade bei Komplexeren Skripten gerne die Aufgaben voneinander trenne, empfehle ich ein zweites Programm zur Benachrichtigung anzulegen.

Die Systemvariablen heißen übrigens:

  • Morgen_Blaue_Tonne
  • Morgen_Braun_Tonne
  • Morgen_Gelb_Tonne
  • Morgen_Grau_Tonne

Beispielsweise könnte man ein Programm anlegen, welches über ein RGBW Funkmodul nach dem Öffnen der Haustür ab 17h einen RGB Streifen in der Farbe der Mülltone aufleuchten lässt, die morgen abgeholt wird. Diese muss also heute raus. Am besten bringt man den LED Streifen im Außenbereich in der Nähe der Tonnen an. Somit erfolgt die Benachrichtigung direkt beim nach hause kommen.

Alternativ könnte natürlich auch eine Meldung auf einem Wandtablet erscheinen. Das überlasse ich jedem selber. Wer noch eine gute Idee hat, gerne in die Kommentare werfen.

9 Kommentare
  1. Hartmut
    Hartmut sagte:

    Guten Morgen,

    funktioniert das Script noch?

    Habe es nach obiger Anleitung installiert, den Street_Code entsprechend rausgesucht und eingetragen, sowie das CUxD Device mit S/N eingetragen.

    Die SV werden auch angelegt, aber auch nach mehrmaligen manuellen anstossen des Programms werden die SV nicht auf „wahr“ gesetzt, obwohl die Tonne(lt. AWB Online) morgen raus müsste.

    Antworten
  2. Michael
    Michael sagte:

    Hi,
    erstmal ein frohes neues Jahr.
    Leider bin ich absoluter noob was Skripte angeht aber wie erkläre ich jetzt meinem Mediola Neo welche tonne wann genau dran ist wie sieht das Programm aus womit ich den wird ordentlich aus lesen kann.
    Danke schon mal im voraus.
    LG Micha

    Antworten
  3. Jürgen
    Jürgen sagte:

    Hallo Philipp,
    meine Frage zielt nicht direkt hin auf Dein Projekt „Ermittlung des Streetcodes“ was ich als sehr gelungen und hilfreich ansehe. Ich würde gerne von Dir wissen mit welchem Script – Editor Du das Projekt geschrieben hast. Für meine Automatisierungsprojekte wäre dies sehr hilfreich da der Editor in der CCU3 nicht wirklich hilft bei größeren Programmen.
    Beste Grüße
    Jürgen

    Antworten
  4. Michael
    Michael sagte:

    Hi,
    ich bin absolut neuling in sachen Homematic asber ich interressiere mich sehr dafür und habe ein Tablet in der Küche wo ich über Mediola Neo gerne die Tonnen angezeigt bekommen möchte welche morgen dran sind wie muss ich mein Programm dafür gestalten ? villeicht kann mir da jemand weiterhelfen.

    MFG Micha

    PS: eine Guten Rutsch euch allen

    Antworten
  5. Michael
    Michael sagte:

    Hallo, Philipp,
    leider bin ich kein Kölner, aber der Beitrag hat mich auf eine Idee gebracht:
    Die Kopplung CCU2-Lightify funktioniert nicht mehr, und ELV schreibt, sie könnten nicht helfen, weil ich Zusatzsoftware (CUxD, Mail-Addon) nutze.

    Und nun zu Idee: Kann „man“ das Skript anpassen, dass es das Lightify-Gateway ausliest und steuert?
    Leider fehlen mir total die Kenntnisse; wie gesagt, war eine Idee.
    Geht es?
    Vielen Dank und viele Grüße
    Micky

    Antworten
    • Philipp
      Philipp sagte:

      Ja, grundsätzlich sollte das gehen. Habe einen Artikel darüber wie das mit Philips Hue geht geschrieben. Ist aber sehr aufwändig und in der Benutzung unkomfortabel da die Lampen halt nicht als Gerät auftauchen.
      Ich würde dir eher empfehlen dein Problem zu lösen. Stimmt die IP? Vergibt dein Router statische IPs für ccu und lightufy Gateway? Was passiert wenn du testweise die Zusatzsoftware deinstalliert? Notfalls nen ccu reset machen…

      Antworten
      • Michael
        Michael sagte:

        Hallo, Philipp, danke für die schnelle Antwort.
        Ich möchte eigentlich ungern meine ansonsten funktionierende Installation (Raspberry mit Zusatzsoftware CUxD und Mail-Addon) gefährden.
        Seit November 2017 habe ich das Problem mit der Kopplung zwischen Lightify und der CCU2: Die CCU2 schaltet die Lightify-Komponenten nicht mehr, und als Notlösung hilft nur ein Neustarten der CCU2. Dann funktioniert es ein bis drei Tage. Ein Neustart des Lightify-Gateways oder eine Neueinbindung (nach Löschen) des Lightify-Gateways in die CCU hilft nicht.
        Vorher funktionierte die Kopplung von der CCU2 zum Lightify-Gateway ein Jahr lang problemlos. Im November 2017 hatte es ein Update des Lightify-Gateways auf die Version 1.1.3.53 gegeben (vielleicht liegt es daran?). Leider ist es mir nicht möglich, die auf dem Gateway Vorgängerversion wieder zu installieren.
        Das Gateway ist in der HomeMatic „gefunden“, die IP-Adresse ist korrekt und ist auch in der FritzBox mit statischer IP eingetragen.
        Mittlerweile habe ich von der CCU2 auf einen Raspberry Pi umgestellt; das Problem mit der Kopplung bleibt.
        Weder ELV noch OSRAM fühlen sich in der Pflicht.
        OSRAM schreibt, „dass die Verbindung zwischen LIGHTIFY und HomeMatic ohne Störungen funktioniert, jedoch die Applikation von HomeMatic das LIGHTIFY Gateway immer wieder erneut ins System hinzufügt und dabei nicht erkennt, dass das Gateway mit sämtlichen Einstellungen schon einmal hinzugefügt wurde. Dabei werden Ihnen als Nutzer in der Applikation von HomeMatic keine Leuchtmittel mehr angezeigt. Diese müssen Sie also erneut hinzufügen, um sie via HomeMatic zu steuern.“
        Und als „Lösung“ schreibt OSRAM: „Da die technischen Hintergründe in der Einbindung von LIGHTIFY in das HomeMatic System liegen, habe ich bereits entsprechende Hinweise weitergeleitet, so dass die Einbindung von LIGHTIFY über eine andere Schnittstelle passiert. Dies bedeutet auf der Seite von HomeMatic eine Umprogrammierung, die entsprechende Zeit benötigen wird.“
        Aber ELV bestreitet, dass die Ursache bei ihnen liege. SIe sagen, es liege an der Zusatzsoftware. Aber letztendlich empfiehlt ELV selbst den Einsatz von CUxD und dem Mail-Addon.
        Daher ist meine Hoffnung, dass es auch bei Lightify (wie bei Hue) über Skripte statt der Kopplung geht.
        Übrigens: Philips Hue hatte ich vor zwei Monaten auch ausprobiert. Aber schon die Kopplung war nur mit der manuellen Eingabe der IP-Adresse möglich; die HomeMatic fand die Bridge nicht selbständig. Nachdem ich die Bridge dann manuell gekoppelt hatte, fehlten die Hue-Leuchtmittel in der HomeMatic, obwohl sie an der Bridge angemeldet waren (bei Lightify waren alle am Gateway angemeldeten Lampen auch gleich in der HomeMatic). Und daher konnte ich die Leuchtmittel mit der HomeMatic auch nicht ansteuern. Die Bridge war in der HomeMatic vorhanden.
        Deswegen habe ich Hue wieder zurückgegeben, und ich würde schon gerne bei Lightify bleiben (ich habe schon fünf Leuchtmittel).
        Das Entfernen der Hue-Bridge aus der HomeMatic funktionierte übrigens auch nicht. Letztlich habe ich ein altes Backup wiedereingespielt, damit die Hue-Bridge nicht mehr in der HomeMatic ist.
        Für jede Lösung, mit der ich zuverlässig und dauerhaft meine Lightify-Leuchtmittel mit der HomeMatic ansteuern kann, wäre ich dankbar.

        Beste Grüße
        Micky

        Antworten
        • Michael
          Michael sagte:

          Hallo,
          das war nun ein sehr langer Kommentar von mir.
          Und er ist auch schon (fast) erledigt: OSRAM hat heute ein Update des Gateways angekündigt. Also hoffentlich hat es sich damit erledigt.

          Antworten
  6. Marc
    Marc sagte:

    Huhu, es Gibt auch den Abfall Kalender als Alexa Skill. Da muss man zwar nachfragen aber er funktioniert mit vielen Städten.

    Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar zu Michael Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert