Skip to content

Commit

Permalink
Add ahk_heidekreis
Browse files Browse the repository at this point in the history
  • Loading branch information
ReneNulschDE authored and 5ila5 committed Jul 17, 2024
1 parent fb306ed commit 7329c16
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,7 @@ Waste collection schedules in the following formats and countries are supported.
- [Abfallwirtschaftszweckverband Wartburgkreis (AZV)](/doc/source/hausmuell_info.md) / azv-wak-ea.de
- [Abfallzweckverband Rhein-Mosel-Eifel (Landkreis Mayen-Koblenz)](/doc/source/abfall_io.md) / azv-rme.de
- [AHE Ennepe-Ruhr-Kreis](/doc/source/ahe_de.md) / ahe.de
- [AHK Heidekreis](/doc/source/ahk_heidekreis_de.md) / ahk-heidekreis.de
- [ALBA Berlin](/doc/source/abfall_io.md) / berlin.alba.info
- [ALBA Braunschweig](/doc/ics/alba_bs_de.md) / alba-bs.de
- [ALF Lahn-Fulda](/doc/source/app_abfallplus_de.md) / Abfall+ App: abfallhr
Expand Down
5 changes: 5 additions & 0 deletions custom_components/waste_collection_schedule/sources.json
Original file line number Diff line number Diff line change
Expand Up @@ -3062,6 +3062,11 @@
"module": "ahe_de",
"default_params": {}
},
{
"title": "AHK Heidekreis",
"module": "ahk_heidekreis_de",
"default_params": {}
},
{
"title": "ALBA Berlin",
"module": "abfall_io",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import json
import logging
from datetime import datetime, timedelta, timezone

import requests
from waste_collection_schedule import Collection # type: ignore[attr-defined]
from waste_collection_schedule.service.ICS import ICS

_LOGGER = logging.getLogger(__name__)

TITLE = "AHK Heidekreis"
DESCRIPTION = "Source for Abfallwirtschaft Heidekreis."
URL = "https://www.ahk-heidekreis.de/"
TEST_CASES = {
"Munster - Wagnerstr. 10-18": {
"city": "Munster",
"postcode": "29633",
"street": "Wagnerstr.",
"house_number": "10-18",
},
"Fallingbostel - Konrad-Zuse-Str. 4": {
"city": "Fallingbostel/Bad Fallingbostel",
"postcode": 29683,
"street": "Konrad-Zuse-Str.",
"house_number": 4,
},
}


class Source:
def __init__(self, city, postcode, street, house_number):
self._city = city
self._postcode = str(postcode)
self._street = street
self._house_number = str(house_number)
self._ics = ICS()

def fetch(self):
params = {
"PartialName": self._street,
}

# get list of streets and house numbers
r = requests.get(
"https://ahkwebapi.heidekreis.de/api/QMasterData/QStreetByPartialName",
params=params,
)

data = json.loads(r.text)
if len(data) == 0:
raise Exception(f"street not found: {self._street}")

street_entry = next(
(
item
for item in data
if item["name"] == self._street
and item["plz"] == self._postcode
and item["place"] == self._city
),
None,
)

if street_entry is None:
raise Exception(f"street not found: {self._street}")

params = {"StreetId": street_entry["id"]}
r = requests.get(
"https://ahkwebapi.heidekreis.de/api/QMasterData/QHouseNrEkal",
params=params,
)
r.raise_for_status()

data = json.loads(r.text)
if len(data) == 0:
raise Exception(f"No house_number not found: {self._street}")

house_number_entry = next(
(
item
for item in data
if f"{item["houseNr"]}{item["houseNrAdd"]}" == self._house_number
),
None,
)

if house_number_entry is None:
raise Exception(f"house_number not found: {self._house_number}")

# get ics file
params = {
"von": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]
+ "Z",
"bis": (datetime.now(timezone.utc) + timedelta(days=365)).strftime(
"%Y-%m-%dT%H:%M:%S.%f"
)[:-3]
+ "Z",
"benachrichtigungVorJederAbholung": False,
"abholbenachrichtigungTageVorher": 1,
"abholbenachrichtigungUhrzeit": {
"ticks": 28800000,
"sekunden": 28800,
"minuten": 480,
"stunden": 8,
},
"benachrichtigungNächsterKalender": False,
"kalenderBenachrichtigungTageVorEnde": 3,
"kalenderbenachrichtigungUhrzeit": {
"ticks": 28800000,
"sekunden": 28800,
"minuten": 480,
"stunden": 8,
},
}
headers = {"content-type": "application/json"}

r = requests.post(
f"https://ahkwebapi.heidekreis.de/api/object/{house_number_entry["idObject"]}/QDisposalScheduler/asIcal",
data=json.dumps(params),
headers=headers,
)
dates = self._ics.convert(r.text)

entries = []
for d in dates:
_LOGGER.info("%s - %s", d[0], d[1])
entries.append(Collection(d[0], d[1].removesuffix(", ")))
return entries
53 changes: 53 additions & 0 deletions doc/source/ahk_heidekreis_de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# AHK Heidekreis

Support for schedules provided by [ahk-heidekreis.de](https://www.ahk-heidekreis.de/).

## Configuration via configuration.yaml

```yaml
waste_collection_schedule:
sources:
- name: ahk_heidekreis_de
args:
city: CITY
postcode: POSTCODE
street: STREET
house_number: HOUSE_NUMBER
```
### Configuration Variables
**city**
_(string) (required)_
**postcode**
_(string) (required)_
**street**
_(string) (required)_
**house_number**
_(string) (required)_
## Example
```yaml
waste_collection_schedule:
sources:
- name: ahk_heidekreis_de
args:
city: Munster
postcode: 29633
street: Wagnerstr.
house_number: "10-18"
- name: ahk_heidekreis_de
args:
city: Fallingbostel/Bad Fallingbostel
postcode: "29683"
street: Konrad-Zuse-Str.
house_number: "4"
```
## How to get the source argument
Find the parameter of your address using [https://www.ahk-heidekreis.de/fuer-privatkunden/abfuhrzeiten.html](https://www.ahk-heidekreis.de/fuer-privatkunden/abfuhrzeiten.html), click on "Entsorgungskalender", use the address lookup and write them exactly like on the web page.
2 changes: 1 addition & 1 deletion info.md

Large diffs are not rendered by default.

0 comments on commit 7329c16

Please sign in to comment.