Files
hassos_config/custom_components/afvalwijzer/sensor_provider.py
2022-12-20 21:26:47 +01:00

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")