mirror of
https://github.com/sascha-hemi/hacs_waste_collection_schedule.git
synced 2026-03-21 04:06:03 +01:00
#427: added support for infeo.at and tested with customer bogenschuetz-entsorgung.de
This commit is contained in:
@@ -99,6 +99,7 @@ Currently the following service providers are supported:
|
||||
- [AWBKoeln.de](./doc/source/awbkoeln_de.md)
|
||||
- [AWIDO-online.de](./doc/source/awido_de.md)
|
||||
- [Berlin-Recycling.de](./doc/source/berlin_recycling_de.md)
|
||||
- [Bogenschuetz-Entsorgung.de](./doc/source/infeo_at.md)
|
||||
- [BSR.de / Berliner Stadtreinigungsbetriebe](./doc/source/bsr_de.md)
|
||||
- [C-Trace.de](./doc/source/c_trace_de.md)
|
||||
- [Cochem-Zell](./doc/source/cochem_zell_online_de.md)
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
import json
|
||||
import logging
|
||||
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 = "INFEO"
|
||||
DESCRIPTION = "Source for INFEO waste collection."
|
||||
URL = "https://www.infeo.at/"
|
||||
TEST_CASES = {"Bogenschütz": {"customer": "bogenschütz", "zone": "Dettenhausen"}}
|
||||
|
||||
|
||||
class Source:
|
||||
def __init__(self, customer, zone):
|
||||
self._customer = customer
|
||||
self._zone = zone
|
||||
self._ics = ICS()
|
||||
|
||||
def fetch(self):
|
||||
baseUrl = f"https://services.infeo.at/awm/api/{self._customer}/wastecalendar"
|
||||
issueUrl = "https://github.com/mampfes/hacs_waste_collection_schedule/issues/new"
|
||||
|
||||
params = {
|
||||
"showUnpublishedCalendars": "false",
|
||||
}
|
||||
|
||||
# get the available published calendar years
|
||||
url = f"{baseUrl}/calendars"
|
||||
response = requests.get(url, params=params)
|
||||
|
||||
# data validation
|
||||
if(response.status_code != 200):
|
||||
_LOGGER.error(f"problems during api calendar year access, please file an issue at {issueUrl} and mention @dm82m and add this: {response.text}")
|
||||
return []
|
||||
|
||||
response = response.json()
|
||||
if len(response) <= 0:
|
||||
_LOGGER.error(f"no calendars found, please file an issue at {issueUrl} and mention @dm82m")
|
||||
return []
|
||||
|
||||
entries = []
|
||||
|
||||
# loop over each calendar year entry and extract data
|
||||
for calendarYear in response:
|
||||
calendarYearId = calendarYear["id"]
|
||||
calendarYearName = calendarYear["name"]
|
||||
|
||||
params = {
|
||||
"calendarId": calendarYearId,
|
||||
}
|
||||
|
||||
# get available zones for calendar year
|
||||
url = f"{baseUrl}/zones"
|
||||
response = requests.get(url, params=params)
|
||||
|
||||
# data validation
|
||||
if(response.status_code != 200):
|
||||
_LOGGER.error(f"problems during api zones for calendar year access, please file an issue at {issueUrl} and mention @dm82m and add this: {response.text}")
|
||||
return []
|
||||
|
||||
response = response.json()
|
||||
if len(response) <= 0:
|
||||
_LOGGER.warning(f"no zones found for calendar year {calendarYearName}, continuing with next calendar year ...")
|
||||
continue
|
||||
|
||||
zoneId = 0
|
||||
|
||||
# try to find the configured and matching zone
|
||||
for zone in response:
|
||||
if self._zone in zone["name"]:
|
||||
zoneId = zone["id"]
|
||||
|
||||
if zoneId == 0:
|
||||
_LOGGER.warning(f"zone '{self._zone}' not found in calendar year {calendarYearName}, continuing with next calendar year ...")
|
||||
continue
|
||||
|
||||
params = {
|
||||
"calendarId": calendarYearId,
|
||||
"zoneId": zoneId,
|
||||
"outputType": "ical",
|
||||
}
|
||||
|
||||
# get ical data for year and zone
|
||||
url = f"{baseUrl}/v2/export"
|
||||
response = requests.get(url, params=params)
|
||||
|
||||
# data validation
|
||||
if(response.status_code != 200):
|
||||
_LOGGER.error(f"problems during api ical data for zone in calendar year, please file an issue at {issueUrl} and mention @dm82m and add this: {response.text}")
|
||||
return []
|
||||
|
||||
dates = self._ics.convert(response.text)
|
||||
|
||||
for d in dates:
|
||||
entries.append(Collection(d[0], d[1]))
|
||||
|
||||
# validate that we processed some data and show an error if not
|
||||
if len(entries) <= 0:
|
||||
_LOGGER.error(f"we were not able to get any waste entries for you! please file an issue at {issueUrl} and mention @dm82m and add this zone: '{self._zone}'")
|
||||
|
||||
return entries
|
||||
54
doc/source/infeo_at.md
Normal file
54
doc/source/infeo_at.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# INFEO based services
|
||||
|
||||
INFEO is a platform for waste schedules, which has several German, Austrian and Swiss cities and districts as customers. The homepage of the company is https://www.infeo.at/.
|
||||
|
||||
## Configuration via configuration.yaml
|
||||
|
||||
```yaml
|
||||
waste_collection_schedule:
|
||||
sources:
|
||||
- name: infeo_at
|
||||
args:
|
||||
customer: CUSTOMER
|
||||
zone: ZONE
|
||||
```
|
||||
|
||||
### Configuration Variables
|
||||
|
||||
**customer**<br>
|
||||
*(string) (required)*
|
||||
|
||||
**zone**<br>
|
||||
*(string) (required)*
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
waste_collection_schedule:
|
||||
sources:
|
||||
- name: infeo_at
|
||||
args:
|
||||
customer: bogenschütz
|
||||
zone: "Rottenburg (Bezirk 2; Baisingen; Ergenzingen)"
|
||||
```
|
||||
|
||||
## How to get the source arguments
|
||||
|
||||
### customer
|
||||
|
||||
Approved list of customers (2022-11-13):
|
||||
|
||||
- `bogenschütz`: Bogenschuetz-Entsorgung.de
|
||||
|
||||
If your provider is also using infeo.at you can just try to use the name of your provider as customer. If you have any troubles please file an issue [here](https://github.com/mampfes/hacs_waste_collection_schedule/issues/new) and mention `@dm82m`.
|
||||
|
||||
### zone
|
||||
|
||||
#### Bogenschuetz-Entsorgung.de
|
||||
- Go to your calendar at `https://www.bogenschuetz-entsorgung.de/images/wastecal/index-zone.html`.
|
||||
- Leave the year as it is and select the zone of your choice.
|
||||
- Copy the whole zone name and put it into `zone` of your configuration.
|
||||
|
||||
### city, street, house number
|
||||
|
||||
This is currently not implemented, as it is not needed for customer `bogenschütz`. If you need it, don't hesitate to file an issue [here](https://github.com/mampfes/hacs_waste_collection_schedule/issues/new) and mention `@dm82m`.
|
||||
1
info.md
1
info.md
@@ -85,6 +85,7 @@ Currently the following service providers are supported:
|
||||
- [AWBKoeln.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/awbkoeln_de.md)
|
||||
- [AWIDO-online.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/awido_de.md)
|
||||
- [Berlin-Recycling.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/berlin_recycling_de.md)
|
||||
- [Bogenschuetz-Entsorgung.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/infeo_at.md)
|
||||
- [BSR.de / Berliner Stadtreinigungsbetriebe](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/bsr_de.md)
|
||||
- [C-Trace.de](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/c_trace_de.md)
|
||||
- [Cochem-Zell](https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/cochem_zell_online_de.md)
|
||||
|
||||
Reference in New Issue
Block a user