From 8d3c072a4b00832d36bee68481f9559d36f0ce94 Mon Sep 17 00:00:00 2001 From: Luca Lindhorst Date: Fri, 9 Sep 2022 03:10:01 +0200 Subject: [PATCH 1/2] Added source for wermelskirchen --- README.md | 1 + .../source/wermelskirchen_de.py | 86 +++++++++++++++++++ doc/source/wermelskirchen_de.md | 42 +++++++++ info.md | 1 + 4 files changed, 130 insertions(+) create mode 100644 custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py create mode 100644 doc/source/wermelskirchen_de.md diff --git a/README.md b/README.md index eea9f27e..2dcf2ffb 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Currently the following service providers are supported: - [Stadtreinigung.Hamburg](./doc/source/stadtreinigung_hamburg.md) - [Stadtreinigung-Leipzig.de](./doc/source/stadtreinigung_leipzig_de.md) - [WAS Wolfsburg](./doc/source/was_wolfsburg_de.md) +- [Wermelskirchen](./doc/source/wermelskirchen_de.md) ### Netherlands diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py new file mode 100644 index 00000000..9bb3aa0f --- /dev/null +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py @@ -0,0 +1,86 @@ +import requests +from datetime import datetime +import urllib.parse +from waste_collection_schedule import Collection # type: ignore[attr-defined] +from waste_collection_schedule.service.ICS import ICS + +TITLE = "Abfallkalender Wermelskirchen" +DESCRIPTION = "Source for Abfallabholung Wermelskirchen, Germany" +URL = "https://www.wermelskirchen.de/rathaus/buergerservice/formulare-a-z/abfallkalender-online/" + +TEST_CASES = { + "Rathaus": {"street": "Telegrafenstraße", "house_number": "29"}, + "Krankenhaus": {"street": "Königstraße", "house_number": "100"}, + "Mehrzweckhalle": {"street": "An der Mehrzweckhalle", "house_number": "1"}, +} + +INFOS = { + "Restabfall 2-woechentlich": { + "icon": "mdi:trash-can", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + }, + "Restabfall 4-woechentlich": { + "icon": "mdi:trash-can", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + }, + "Restabfall 6-woechentlich": { + "icon": "mdi:trash-can", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + }, + "Gelber Sack": { + "icon": "mdi:recycle-variant", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/f/4/csm_GelbeTonne_24ffc276b2.png" + }, + "Papier": { + "icon": "mdi:package-variant", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/2/3/csm_Papiertonne_919ed3b5da.png" + }, + "Biotonne": { + "icon": "mdi:leaf", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/6/f/csm_Biotonne_wk_ae1b0e61aa.png" + }, + "Schadstoffsammlung": { + "icon": "mdi:bottle-tonic-skull", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/4/2/csm_sondermuell_62f5701a7b.png" + }, + "Weihnachtsbaum": { + "icon": "mdi:pine-tree", + "image": "" + }, +} + +class Source: + def __init__(self, street, house_number): + self._street = street + self._house_number = str(house_number) + self._ics = ICS() + + def fetch(self): + # the url contains the current year, but this doesn't really seems to matter at least for the ical, since the result is always the same + # still replace it for compatibility sake + now = datetime.now() + url = ( + "https://abfallkalender.citkomm.de/wermelskirchen/abfallkalender-"+ + str(now.year)+ + "/ics/FrontendIcs.html?tx_citkoabfall_abfallkalender%5Bstrasse%5D="+ + urllib.parse.quote_plus(self._street)+ + "&tx_citkoabfall_abfallkalender%5Bhausnummer%5D="+ + urllib.parse.quote_plus(self._house_number)+ + "&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B0%5D=86&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B1%5D=85&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B2%5D=84&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B3%5D=82&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B4%5D=81&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B5%5D=80&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B6%5D=79&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B7%5D=76&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B8%5D=75&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B9%5D=74" + ) + r = requests.get(url) + r.raise_for_status() + + r.encoding = "utf-8" + dates = self._ics.convert(r.text) + + entries = [] + for d in dates: + info = INFOS.get(d[1], {"icon": "mdi:trash-can", "image": ""}) + entries.append(Collection( + d[0], + d[1], + picture = info['image'], + icon = info['icon'] + )) + return entries diff --git a/doc/source/wermelskirchen_de.md b/doc/source/wermelskirchen_de.md new file mode 100644 index 00000000..a6aab9f6 --- /dev/null +++ b/doc/source/wermelskirchen_de.md @@ -0,0 +1,42 @@ +# Wermelskirchen Abfallkalender + +Support for schedules provided by [Abfallkalender Wermelskirchen](https://www.wermelskirchen.de/rathaus/buergerservice/formulare-a-z/abfallkalender-online/) located in NRW, Germany. + +## Limitations + +The used api (ics) only provides future waste collection dates. + +## Configuration via configuration.yaml + +```yaml +waste_collection_schedule: + sources: + - name: wermelskirchen_de + args: + street: Telegrafenstraße + house_number: "10" + customize: + - type: Restabfall 2-woechentlich + alias: Restabfall + show: false + - type: Restabfall 4-woechentlich + alias: Restabfall + show: true + - type: Restabfall 6-woechentlich + alias: Restabfall + show: false +``` + +### Configuration Variables + +**street**
+*(string) (required)* + +**house_number**
+*(string) (required)* + +## How to get the source arguments + +Set your street and your house number. Should they not work, check on [Abfallkalender Wermelskirchen](https://www.wermelskirchen.de/rathaus/buergerservice/formulare-a-z/abfallkalender-online/) and use the closest entries. + +Depending on your booked schedule for "Restabfall"/"Restmüll" you should set `show` in one of the types to true and the others to false. diff --git a/info.md b/info.md index 39c59c81..94b5f114 100644 --- a/info.md +++ b/info.md @@ -100,6 +100,7 @@ Currently the following service providers are supported: - [Stadtreinigung.Hamburg](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/stadtreinigung_hamburg.md) - [Stadtreinigung-Leipzig.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/stadtreinigung_leipzig_de.md) - [WAS Wolfsburg](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/was_wolfsburg_de.md) +- [Wermelskirchen](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/wermelskirchen_de.md) ### Netherlands From 4febf5b393c57b79917931999b1600f13d098e78 Mon Sep 17 00:00:00 2001 From: mampfes Date: Sat, 17 Dec 2022 14:37:41 +0100 Subject: [PATCH 2/2] use params instead of encoded url --- .../source/wermelskirchen_de.py | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py index 9bb3aa0f..1f2b4b4b 100644 --- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/wermelskirchen_de.py @@ -1,6 +1,6 @@ -import requests from datetime import datetime -import urllib.parse + +import requests from waste_collection_schedule import Collection # type: ignore[attr-defined] from waste_collection_schedule.service.ICS import ICS @@ -16,39 +16,37 @@ TEST_CASES = { INFOS = { "Restabfall 2-woechentlich": { - "icon": "mdi:trash-can", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + "icon": "mdi:trash-can", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png", }, "Restabfall 4-woechentlich": { "icon": "mdi:trash-can", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png", }, "Restabfall 6-woechentlich": { "icon": "mdi:trash-can", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png" + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/1/b/csm_Restmuell_6b2b32c774.png", }, "Gelber Sack": { - "icon": "mdi:recycle-variant", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/f/4/csm_GelbeTonne_24ffc276b2.png" + "icon": "mdi:recycle-variant", + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/f/4/csm_GelbeTonne_24ffc276b2.png", }, "Papier": { "icon": "mdi:package-variant", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/2/3/csm_Papiertonne_919ed3b5da.png" + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/2/3/csm_Papiertonne_919ed3b5da.png", }, "Biotonne": { "icon": "mdi:leaf", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/6/f/csm_Biotonne_wk_ae1b0e61aa.png" + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/6/f/csm_Biotonne_wk_ae1b0e61aa.png", }, "Schadstoffsammlung": { "icon": "mdi:bottle-tonic-skull", - "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/4/2/csm_sondermuell_62f5701a7b.png" - }, - "Weihnachtsbaum": { - "icon": "mdi:pine-tree", - "image": "" + "image": "https://abfallkalender.citkomm.de/fileadmin/_processed_/4/2/csm_sondermuell_62f5701a7b.png", }, + "Weihnachtsbaum": {"icon": "mdi:pine-tree", "image": ""}, } + class Source: def __init__(self, street, house_number): self._street = street @@ -59,16 +57,22 @@ class Source: # the url contains the current year, but this doesn't really seems to matter at least for the ical, since the result is always the same # still replace it for compatibility sake now = datetime.now() - url = ( - "https://abfallkalender.citkomm.de/wermelskirchen/abfallkalender-"+ - str(now.year)+ - "/ics/FrontendIcs.html?tx_citkoabfall_abfallkalender%5Bstrasse%5D="+ - urllib.parse.quote_plus(self._street)+ - "&tx_citkoabfall_abfallkalender%5Bhausnummer%5D="+ - urllib.parse.quote_plus(self._house_number)+ - "&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B0%5D=86&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B1%5D=85&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B2%5D=84&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B3%5D=82&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B4%5D=81&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B5%5D=80&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B6%5D=79&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B7%5D=76&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B8%5D=75&tx_citkoabfall_abfallkalender%5Babfallarten%5D%5B9%5D=74" - ) - r = requests.get(url) + url = f"https://abfallkalender.citkomm.de/wermelskirchen/abfallkalender-{str(now.year)}/ics/FrontendIcs.html" + params = { + "tx_citkoabfall_abfallkalender[strasse]": self._street, + "tx_citkoabfall_abfallkalender[hausnummer]": self._house_number, + "tx_citkoabfall_abfallkalender[abfallarten][0]": 86, + "tx_citkoabfall_abfallkalender[abfallarten][1]": 85, + "tx_citkoabfall_abfallkalender[abfallarten][2]": 84, + "tx_citkoabfall_abfallkalender[abfallarten][3]": 82, + "tx_citkoabfall_abfallkalender[abfallarten][4]": 81, + "tx_citkoabfall_abfallkalender[abfallarten][5]": 80, + "tx_citkoabfall_abfallkalender[abfallarten][6]": 79, + "tx_citkoabfall_abfallkalender[abfallarten][7]": 76, + "tx_citkoabfall_abfallkalender[abfallarten][8]": 75, + "tx_citkoabfall_abfallkalender[abfallarten][9]": 74, + } + r = requests.get(url, params=params) r.raise_for_status() r.encoding = "utf-8" @@ -76,11 +80,8 @@ class Source: entries = [] for d in dates: - info = INFOS.get(d[1], {"icon": "mdi:trash-can", "image": ""}) - entries.append(Collection( - d[0], - d[1], - picture = info['image'], - icon = info['icon'] - )) + info = INFOS.get(d[1], {"icon": "mdi:trash-can", "image": ""}) + entries.append( + Collection(d[0], d[1], picture=info["image"], icon=info["icon"]) + ) return entries