139 lines
5.3 KiB
Python
139 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
from datetime import date, datetime, timedelta
|
|
import hashlib
|
|
|
|
from homeassistant.helpers.entity import Entity
|
|
from homeassistant.util import Throttle
|
|
|
|
from .const.const import (
|
|
_LOGGER,
|
|
ATTR_DAYS_UNTIL_COLLECTION_DATE,
|
|
ATTR_IS_COLLECTION_DATE_DAY_AFTER_TOMORROW,
|
|
ATTR_IS_COLLECTION_DATE_TODAY,
|
|
ATTR_IS_COLLECTION_DATE_TOMORROW,
|
|
ATTR_LAST_UPDATE,
|
|
ATTR_YEAR_MONTH_DAY_DATE,
|
|
CONF_DEFAULT_LABEL,
|
|
CONF_EXCLUDE_PICKUP_TODAY,
|
|
CONF_ID,
|
|
CONF_POSTAL_CODE,
|
|
CONF_STREET_NUMBER,
|
|
CONF_SUFFIX,
|
|
MIN_TIME_BETWEEN_UPDATES,
|
|
PARALLEL_UPDATES,
|
|
SENSOR_ICON,
|
|
SENSOR_PREFIX,
|
|
)
|
|
|
|
|
|
class ProviderSensor(Entity):
|
|
def __init__(self, hass, waste_type, fetch_data, config):
|
|
self.hass = hass
|
|
self.waste_type = waste_type
|
|
self.fetch_data = fetch_data
|
|
self.config = config
|
|
self._id_name = self.config.get(CONF_ID)
|
|
self._default_label = self.config.get(CONF_DEFAULT_LABEL)
|
|
self._exclude_pickup_today = self.config.get(CONF_EXCLUDE_PICKUP_TODAY)
|
|
self._name = (
|
|
SENSOR_PREFIX
|
|
+ (self._id_name + " " if len(self._id_name) > 0 else "")
|
|
+ self.waste_type
|
|
)
|
|
self._icon = SENSOR_ICON
|
|
self._state = self.config.get(CONF_DEFAULT_LABEL)
|
|
self._last_update = None
|
|
self._days_until_collection_date = None
|
|
self._is_collection_date_today = False
|
|
self._is_collection_date_tomorrow = False
|
|
self._is_collection_date_day_after_tomorrow = False
|
|
self._year_month_day_date = None
|
|
self._unique_id = hashlib.sha1(
|
|
f"{self.waste_type}{self.config.get(CONF_ID)}{self.config.get(CONF_POSTAL_CODE)}{self.config.get(CONF_STREET_NUMBER)}{self.config.get(CONF_SUFFIX,'')}".encode(
|
|
"utf-8"
|
|
)
|
|
).hexdigest()
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
@property
|
|
def unique_id(self):
|
|
return self._unique_id
|
|
|
|
@property
|
|
def icon(self):
|
|
return self._icon
|
|
|
|
@property
|
|
def state(self):
|
|
return self._state
|
|
|
|
@property
|
|
def extra_state_attributes(self):
|
|
return {
|
|
ATTR_LAST_UPDATE: self._last_update,
|
|
ATTR_DAYS_UNTIL_COLLECTION_DATE: self._days_until_collection_date,
|
|
ATTR_IS_COLLECTION_DATE_TODAY: self._is_collection_date_today,
|
|
ATTR_IS_COLLECTION_DATE_TOMORROW: self._is_collection_date_tomorrow,
|
|
ATTR_IS_COLLECTION_DATE_DAY_AFTER_TOMORROW: self._is_collection_date_day_after_tomorrow,
|
|
ATTR_YEAR_MONTH_DAY_DATE: self._year_month_day_date,
|
|
}
|
|
|
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
|
async def async_update(self):
|
|
await self.hass.async_add_executor_job(self.fetch_data.update)
|
|
|
|
if self._exclude_pickup_today.casefold() in ("false", "no"):
|
|
waste_data_provider = self.fetch_data.waste_data_with_today
|
|
else:
|
|
waste_data_provider = self.fetch_data.waste_data_without_today
|
|
|
|
try:
|
|
if not waste_data_provider or self.waste_type not in waste_data_provider:
|
|
raise (ValueError)
|
|
# Add attribute, set the last updated status of the sensor
|
|
self._last_update = datetime.now().strftime("%d-%m-%Y %H:%M")
|
|
|
|
if isinstance(waste_data_provider[self.waste_type], datetime):
|
|
_LOGGER.debug(
|
|
f"Generating state via AfvalwijzerCustomSensor for = {self.waste_type} with value {waste_data_provider[self.waste_type].date()}"
|
|
)
|
|
# Add the US date format
|
|
collection_date_us = waste_data_provider[self.waste_type].date()
|
|
self._year_month_day_date = str(collection_date_us)
|
|
|
|
# Add the days until the collection date
|
|
delta = collection_date_us - date.today()
|
|
self._days_until_collection_date = delta.days
|
|
|
|
# Check if the collection days are in today, tomorrow and/or the day after tomorrow
|
|
self._is_collection_date_today = date.today() == collection_date_us
|
|
self._is_collection_date_tomorrow = (
|
|
date.today() + timedelta(days=1) == collection_date_us
|
|
)
|
|
self._is_collection_date_day_after_tomorrow = (
|
|
date.today() + timedelta(days=2) == collection_date_us
|
|
)
|
|
|
|
# Add the NL date format as default state
|
|
self._state = datetime.strftime(
|
|
waste_data_provider[self.waste_type].date(), "%d-%m-%Y"
|
|
)
|
|
else:
|
|
_LOGGER.debug(
|
|
f"Generating state via AfvalwijzerCustomSensor for = {self.waste_type} with value {waste_data_provider[self.waste_type]}"
|
|
)
|
|
# Add non-date as default state
|
|
self._state = str(waste_data_provider[self.waste_type])
|
|
except ValueError:
|
|
_LOGGER.debug("ValueError AfvalwijzerProviderSensor - unable to set value!")
|
|
self._state = self._default_label
|
|
self._days_until_collection_date = None
|
|
self._year_month_day_date = None
|
|
self._is_collection_date_today = False
|
|
self._is_collection_date_tomorrow = False
|
|
self._is_collection_date_day_after_tomorrow = False
|
|
self._last_update = datetime.now().strftime("%d-%m-%Y %H:%M")
|