initial commit

This commit is contained in:
2022-12-20 21:26:47 +01:00
commit 2962a6db69
722 changed files with 63886 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
from datetime import datetime, timedelta
from ..const.const import _LOGGER
class DaySensorData(object):
##########################################################################
# INIT
##########################################################################
def __init__(
self,
waste_data_formatted,
default_label,
):
TODAY = datetime.now().strftime("%d-%m-%Y")
self.waste_data_formatted = sorted(
waste_data_formatted, key=lambda d: d["date"]
)
self.today_date = datetime.strptime(TODAY, "%d-%m-%Y")
self.tomorrow_date = datetime.strptime(TODAY, "%d-%m-%Y") + timedelta(days=1)
self.day_after_tomorrow_date = datetime.strptime(TODAY, "%d-%m-%Y") + timedelta(
days=2
)
self.default_label = default_label
self.waste_data_today = self.__gen_day_sensor(self.today_date)
self.waste_data_tomorrow = self.__gen_day_sensor(self.tomorrow_date)
self.waste_data_dot = self.__gen_day_sensor(self.day_after_tomorrow_date)
self.data = self._gen_day_sensor_data()
##########################################################################
# GENERATE TODAY, TOMORROW, DOT SENSOR(S)
##########################################################################
# Generate sensor data per date
def __gen_day_sensor(self, date):
day = []
try:
for waste in self.waste_data_formatted:
item_date = waste["date"]
if item_date == date:
item_name = waste["type"]
day.append(item_name)
if not day:
day.append(self.default_label)
except Exception as err:
_LOGGER.error(f"Other error occurred __gen_day_sensor: {err}")
return day
# Generate sensor data for today, tomorrow, day after tomorrow
def _gen_day_sensor_data(self):
day_sensor = {}
try:
day_sensor["today"] = ", ".join(self.waste_data_today)
day_sensor["tomorrow"] = ", ".join(self.waste_data_tomorrow)
day_sensor["day_after_tomorrow"] = ", ".join(self.waste_data_dot)
except Exception as err:
_LOGGER.error(f"Other error occurred _gen_day_sensor_data: {err}")
return day_sensor
@property
def day_sensor_data(self):
return self.data

View File

@@ -0,0 +1,80 @@
def _waste_type_rename(item_name):
# DEAFVALAPP
if item_name == "gemengde plastics":
item_name = "plastic"
if item_name == "zak_blauw":
item_name = "restafval"
if item_name == "pbp":
item_name = "pmd"
if item_name == "rest":
item_name = "restafval"
if item_name == "kerstboom":
item_name = "kerstbomen"
# OPZET
if item_name == "snoeiafval":
item_name = "takken"
if item_name == "sloop":
item_name = "grofvuil"
if item_name == "groente":
item_name = "gft"
if item_name == "groente-, fruit en tuinafval":
item_name = "gft"
if item_name == "groente, fruit- en tuinafval":
item_name = "gft"
if item_name == "kca":
item_name = "chemisch"
if item_name == "tariefzak restafval":
item_name = "restafvalzakken"
if item_name == "restafvalzakken":
item_name = "restafvalzakken"
if item_name == "rest":
item_name = "restafval"
if item_name == "plastic, blik & drinkpakken overbetuwe":
item_name = "pmd"
if item_name == "papier en karton":
item_name = "papier"
if item_name == "kerstb":
item_name = "kerstboom"
# RD4
if item_name == "pruning":
item_name = "takken"
if item_name == "residual_waste":
item_name = "restafval"
if item_name == "best_bag":
item_name = "best-tas"
if item_name == "paper":
item_name = "papier"
if item_name == "christmas_trees":
item_name = "kerstbomen"
# XIMMIO
if item_name == "branches":
item_name = "takken"
if item_name == "bulklitter":
item_name = "grofvuil"
if item_name == "bulkygardenwaste":
item_name = "tuinafval"
if item_name == "glass":
item_name = "glas"
if item_name == "green":
item_name = "gft"
if item_name == "grey":
item_name = "restafval"
if item_name == "kca":
item_name = "chemisch"
if item_name == "plastic":
item_name = "plastic"
if item_name == "packages":
item_name = "pmd"
if item_name == "paper":
item_name = "papier"
if item_name == "remainder":
item_name = "restwagen"
if item_name == "textile":
item_name = "textiel"
if item_name == "tree":
item_name = "kerstbomen"
return item_name
if __name__ == "__main__":
print("Yell something at a mountain!")

View File

@@ -0,0 +1,76 @@
from datetime import datetime
from ..const.const import _LOGGER
class NextSensorData(object):
##########################################################################
# INIT
##########################################################################
def __init__(self, waste_data_after_date_selected, default_label):
self.waste_data_after_date_selected = sorted(
waste_data_after_date_selected, key=lambda d: d["date"]
)
TODAY = datetime.now().strftime("%d-%m-%Y")
self.today_date = datetime.strptime(TODAY, "%d-%m-%Y")
self.default_label = default_label
self.next_waste_date = self.__get_next_waste_date()
self.next_waste_in_days = self.__get_next_waste_in_days()
self.next_waste_type = self.__get_next_waste_type()
self.data = self._gen_next_sensor_data()
##########################################################################
# GENERATE NEXT SENSOR(S)
##########################################################################
# Generate sensor next_waste_date
def __get_next_waste_date(self):
next_waste_date = self.default_label
try:
next_waste_date = self.waste_data_after_date_selected[0]["date"]
except Exception as err:
_LOGGER.error(f"Other error occurred _get_next_waste_date: {err}")
return next_waste_date
# Generate sensor next_waste_in_days
def __get_next_waste_in_days(self):
next_waste_in_days = self.default_label
try:
next_waste_in_days = abs(self.today_date - self.next_waste_date).days # type: ignore
except Exception as err:
_LOGGER.error(f"Other error occurred _get_next_waste_in_days: {err}")
return next_waste_in_days
# Generate sensor next_waste_type
def __get_next_waste_type(self):
next_waste_type = []
try:
for waste in self.waste_data_after_date_selected:
item_date = waste["date"]
if item_date == self.next_waste_date:
item_name = waste["type"]
next_waste_type.append(item_name)
if not next_waste_type:
next_waste_type.append(self.default_label)
except Exception as err:
_LOGGER.error(f"Other error occurred _get_next_waste_type: {err}")
return next_waste_type
# Generate sensor data for custom sensors
def _gen_next_sensor_data(self):
next_sensor = {}
try:
next_sensor["next_date"] = self.next_waste_date
next_sensor["next_in_days"] = self.next_waste_in_days
next_sensor["next_type"] = ", ".join(self.next_waste_type)
except Exception as err:
_LOGGER.error(f"Other error occurred _gen_next_sensor_data: {err}")
return next_sensor
@property
def next_sensor_data(self):
return self.data

View File

@@ -0,0 +1,181 @@
from datetime import datetime, timedelta
from ..common.day_sensor_data import DaySensorData
from ..common.next_sensor_data import NextSensorData
from ..const.const import _LOGGER
# import sys
# def excepthook(type, value, traceback):
# _LOGGER.error(value)
# sys.excepthook = excepthook
class WasteDataTransformer(object):
##########################################################################
# INIT
##########################################################################
def __init__(
self,
waste_data_raw,
exclude_pickup_today,
exclude_list,
default_label,
):
self.waste_data_raw = waste_data_raw
self.exclude_pickup_today = exclude_pickup_today
self.exclude_list = exclude_list.strip().lower()
self.default_label = default_label
TODAY = datetime.now().strftime("%d-%m-%Y")
self.DATE_TODAY = datetime.strptime(TODAY, "%d-%m-%Y")
self.DATE_TOMORROW = datetime.strptime(TODAY, "%d-%m-%Y") + timedelta(days=1)
(
self._waste_data_with_today,
self._waste_data_without_today,
) = self.__structure_waste_data() # type: ignore
(
self._waste_data_provider,
self._waste_types_provider,
self._waste_data_custom,
self._waste_types_custom,
) = self.__gen_sensor_waste_data()
##########################################################################
# STRUCTURE ALL WASTE DATA IN CUSTOM FORMAT
#########################################################################
def __structure_waste_data(self):
try:
waste_data_with_today = {}
waste_data_without_today = {}
for item in self.waste_data_raw:
item_date = datetime.strptime(item["date"], "%Y-%m-%d")
item_name = item["type"].strip().lower()
if (
item_name not in self.exclude_list
and item_name not in waste_data_with_today
and item_date >= self.DATE_TODAY
):
waste_data_with_today[item_name] = item_date
for item in self.waste_data_raw:
item_date = datetime.strptime(item["date"], "%Y-%m-%d")
item_name = item["type"].strip().lower()
if (
item_name not in self.exclude_list
and item_name not in waste_data_without_today
and item_date > self.DATE_TODAY
):
waste_data_without_today[item_name] = item_date
try:
for item in self.waste_data_raw:
item_name = item["type"].strip().lower()
if item_name not in self.exclude_list:
if item_name not in waste_data_with_today.keys():
waste_data_with_today[item_name] = self.default_label
if item_name not in waste_data_without_today.keys():
waste_data_without_today[item_name] = self.default_label
except Exception as err:
_LOGGER.error(f"Other error occurred: {err}")
return waste_data_with_today, waste_data_without_today
except Exception as err:
_LOGGER.error(f"Other error occurred: {err}")
##########################################################################
# GENERATE REQUIRED DATA FOR HASS SENSORS
##########################################################################
def __gen_sensor_waste_data(self):
if self.exclude_pickup_today.casefold() in ("false", "no"):
date_selected = self.DATE_TODAY
waste_data_provider = self._waste_data_with_today
else:
date_selected = self.DATE_TOMORROW
waste_data_provider = self._waste_data_without_today
try:
waste_types_provider = sorted(
{
waste["type"]
for waste in self.waste_data_raw
if waste["type"] not in self.exclude_list
}
)
except Exception as err:
_LOGGER.error(f"Other error occurred waste_types_provider: {err}")
try:
waste_data_formatted = [
{
"type": waste["type"],
"date": datetime.strptime(waste["date"], "%Y-%m-%d"),
}
for waste in self.waste_data_raw
if waste["type"] in waste_types_provider
]
except Exception as err:
_LOGGER.error(f"Other error occurred waste_data_formatted: {err}")
days = DaySensorData(waste_data_formatted, self.default_label)
try:
waste_data_after_date_selected = list(
filter(
lambda waste: waste["date"] >= date_selected, waste_data_formatted
)
)
except Exception as err:
_LOGGER.error(f"Other error occurred waste_data_after_date_selected: {err}")
next_data = NextSensorData(waste_data_after_date_selected, self.default_label)
try:
waste_data_custom = {**next_data.next_sensor_data, **days.day_sensor_data}
except Exception as err:
_LOGGER.error(f"Other error occurred waste_data_custom: {err}")
try:
waste_types_custom = list(sorted(waste_data_custom.keys()))
except Exception as err:
_LOGGER.error(f"Other error occurred waste_types_custom: {err}")
return (
waste_data_provider,
waste_types_provider,
waste_data_custom,
waste_types_custom,
)
##########################################################################
# PROPERTIES FOR EXECUTION
##########################################################################
@property
def waste_data_with_today(self):
return self._waste_data_with_today
@property
def waste_data_without_today(self):
return self._waste_data_without_today
@property
def waste_data_provider(self):
return self._waste_data_provider
@property
def waste_types_provider(self):
return self._waste_types_provider
@property
def waste_data_custom(self):
return self._waste_data_custom
@property
def waste_types_custom(self):
return self._waste_types_custom