Home-Assistant integration of 'Abfall.IO' waste collection dates & schedule


#6

Hi together,

iam very happy that the snippet helped you.

Iam going to adapt your change to my code, thanks :slight_smile:
Cheers
Tom


#7

i create the display text in the component and save it as an attribute:

class AbfallSensor(Entity):

    def __init__(self, data, sensor_type):
        self.data = data
        self.type = sensor_type
        self._name = SENSOR_PREFIX + SENSOR_TYPES[self.type][0]
        self._unit = SENSOR_TYPES[self.type][1]
        self._icon = SENSOR_TYPES[self.type][2]
        self._state = None
        self._attributes = {}
    @property
    def name(self):
        return self._name

    @property
    def icon(self):
        return self._icon

    @property
    def state(self):
        return self._state

    @property
    def unit_of_measurement(self):
        return self._unit

    @property
    def device_state_attributes(self):
        """Return attributes for the sensor."""
        return self._attributes

    def update(self):
        self.data.update()
        abfallData = self.data.data

        try:
            if self.type == 'gelbersack':
                self._state = abfallData.get("gelberSack")

            elif self.type == 'restabfall':
                self._state = abfallData.get("restAbfall")

            elif self.type == 'papiertonne':
                self._state = abfallData.get("papierTonne")

            elif self.type == 'biotonne':
                self._state = abfallData.get("bioTonne")

            elif self.type == 'problemstoffmobil':
                self._state = abfallData.get("problemStoffMobil")

            if self._state is not None:
                weekdays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
                self._attributes['days'] = (self._state.date() - datetime.now().date()).days
                self._attributes['display_text'] = self._state.strftime('{}, %d.%m.%Y (in {} Tagen)').format(weekdays[self._state.weekday()],self._attributes['days'])                         

        except ValueError:
            self._state = None                      

Then I only need one template sensor in the configuration.

- platform: template
  sensors:
    gelbersack_text:
      value_template: "{{states.sensor.waste_gelber_sack.attributes.display_text}}"
    biotonne_text:
      value_template: "{{states.sensor.waste_bio_tonne.attributes.display_text}}"   
    papiertonne_text:
      value_template: "{{states.sensor.waste_papier_tonne.attributes.display_text}}"
    problemstoffmobil_text:
      value_template: "{{states.sensor.waste_problemstoffmobil.attributes.display_text}}"
    restmuell_text:
      value_template: "{{states.sensor.waste_rest_mull.attributes.display_text}}"

#8

Thanks a lot for the additional help.

For Landkreis Böblingen (lrabb) I pubished the script under:


Just adjust line 66 and 67 to your


#9

Wow, that are major improvements. Is it OK if i adapt my script with your changes and update the snippet on my blog? I would of course link back to this thread here.

Thanks and cheers
Tom


#10

Yes, of course it’s okay.


#11

Great, thanks!

I changed my blog post and also added my notification configuration (i get one day before pick up an Telegram notification to bring the rubbish out).

Changed blog post should be online in few minutes…

Cheers
Tom


#12

Hi together,

thanks for the nice write up! Was interested in a way to track garbage collection for my place and managed to setup the component. Still, I am currently struggling with getting the right IDs for my location.

Could someone give me a hnit on how to get them, as I was not able to extract them from either Homepage or App. Or did I miss some point in the instruction?

Thanks in advance!


#13

Hi,

from which city are you? Can you give me the link where the “Abfallkalender” can get generated for your city. I try to generate the right ID’s for you.

Cheers
Tom


#14

Hi Tom,

thanks for your offer. It would be the following site: https://www.wuerzburg.de/themen/umwelt-verkehr/vorsorge-entsorgung/abfallkalender/index.html
But if I got the right impression, they are using a different API to generate the calendar. So it seems I will have to do some work on my own :wink:

Regards,
Nils


#15

Hi Nils,

you are right, it seems they use something proprietary. But as far as I see its fairly simple to extract the data from them. If you open the Developer Tools in Google Chrome on the page, and then select the correct values, you get an Ajax request to this URL (I took random data):

https://www.wuerzburg.de/themen/umwelt-verkehr/vorsorge-entsorgung/abfallkalender/index.html?_func=evList&_mod=events&ev[start]=2018-12-24&ev[end]=2019-02-03&ev[cat]=&ev[subcat]=&ev[addr]=19939&ev[search]=&_y=2019&_m=01&recon=p6ehg218vh6hks4rdi9illmi98&_dc=1546369043376

If you open the URL you get the data without further manipulation.

Cheers
Tom


#16

I uploaded a small update to reflect an issue with “in 1 Tagen” which is incorrect.
The code now adds heute/today, morgen/tomorrow or “in X Tagen”/“in X days”


#17

Is it possible to read the dates from a pdf or a ics export file?


#18

you dont need to, you just need to replace the “pdf” or “ics” in the request URL with “csv”.


#19

I have to use an other site for collecting the dates and there is only the possibility to get the dates as pdf / ics.

Example:
https://www.awigo.de/index.php?eID=awigoCalendar&calendar[method]=getPDFfile&calendar[locationID]=648892001&calendar[cityID]=5337001&calendar[address_full_street]=Heideweg%202&calendar[address_full_cityplz]=Belm%20(49191)


#20

I tried to manipulate the URL and it seems you cant get CSV files with this service.

I think its quite hard to parse PDF’s. I reckon its easier you parse the ICS file. But you need to write a custom parser for this.

Sorry I cant help you here.


#21

Thanks, no problem. I already implemented a solution for my waste collection (via google calendar). Working fine but an addon with collecting data from a web url is much better than manually adding the ics to the calendar.
When I have some time I am going to parse the ICS file…


#22

Hi Tom,

I came to the same conclusion and was able to adapt the component to use the json I recieved via the Ajax request. Component is working fine now.

Thanks for the help,
Nils


#23

I had a strange bug. The order of the columns in the response no longer matches the payload. Therefore I had wrong data. I fixed it by saving the index from the first line in a dictionary.
If someone else has the same problem:

        rowCounter = 0
        columns = None
        gelberSack = []
        restAbfall = []
        papierTonne = []
        bioTonne = []
        problemStoffMobil = []
        
        for row in reader:
            if rowCounter == 0:
                columns = {k:row.index(k) for k in row}
            else:
                if (row[columns["Biotonne"]] != ""):
                    bioTonne.append(datetime.strptime(row[columns["Biotonne"]], "%d.%m.%Y"))

                if (row[columns["Restmülltonne"]] != ""):
                    restAbfall.append(datetime.strptime(row[columns["Restmülltonne"]], "%d.%m.%Y"))

                if (row[columns["Papiertonne"]] != ""):
                    papierTonne.append(datetime.strptime(row[columns["Papiertonne"]], "%d.%m.%Y"))

                if (row[columns["Gelber Sack"]] != ""):
                    gelberSack.append(datetime.strptime(row[columns["Gelber Sack"]], "%d.%m.%Y"))

                if (row[columns["Problemstoffmobil"]] != ""):
                    problemStoffMobil.append(datetime.strptime(row[columns["Problemstoffmobil"]], "%d.%m.%Y"))                        

            rowCounter = rowCounter + 1

#24

Thanks for publishing this. I changed the code at home with your recommendation. Just in case the change the order of values in Landshut too :slight_smile: works like a charm.

if its okay, i publish the changed code on my blog.

cheers
Tom


#25

Of course :slight_smile: