core/homeassistant/components/ridwell/sensor.py

88 lines
2.8 KiB
Python
Raw Normal View History

2021-10-30 14:27:48 +00:00
"""Support for Ridwell sensors."""
from __future__ import annotations
from collections.abc import Mapping
from datetime import date
2021-10-30 14:27:48 +00:00
from typing import Any
from aioridwell.model import RidwellAccount
2021-10-30 14:27:48 +00:00
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
)
2021-10-30 14:27:48 +00:00
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
2021-10-30 14:27:48 +00:00
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN, SENSOR_TYPE_NEXT_PICKUP
from .coordinator import RidwellDataUpdateCoordinator
from .entity import RidwellEntity
2021-10-30 14:27:48 +00:00
ATTR_CATEGORY = "category"
ATTR_PICKUP_STATE = "pickup_state"
ATTR_PICKUP_TYPES = "pickup_types"
ATTR_QUANTITY = "quantity"
SENSOR_DESCRIPTION = SensorEntityDescription(
key=SENSOR_TYPE_NEXT_PICKUP,
name="Next Ridwell pickup",
device_class=SensorDeviceClass.DATE,
)
2021-10-30 14:27:48 +00:00
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up Ridwell sensors based on a config entry."""
coordinator: RidwellDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
2021-10-30 14:27:48 +00:00
async_add_entities(
RidwellSensor(coordinator, account, SENSOR_DESCRIPTION)
for account in coordinator.accounts.values()
2021-10-30 14:27:48 +00:00
)
class RidwellSensor(RidwellEntity, SensorEntity):
2021-10-30 14:27:48 +00:00
"""Define a Ridwell pickup sensor."""
def __init__(
self,
coordinator: RidwellDataUpdateCoordinator,
account: RidwellAccount,
description: SensorEntityDescription,
2021-10-30 14:27:48 +00:00
) -> None:
"""Initialize."""
super().__init__(coordinator, account)
2021-10-30 14:27:48 +00:00
self._attr_unique_id = f"{account.account_id}_{description.key}"
self.entity_description = description
2021-10-30 14:27:48 +00:00
@property
def extra_state_attributes(self) -> Mapping[str, Any]:
"""Return entity specific state attributes."""
attrs: dict[str, Any] = {
ATTR_PICKUP_TYPES: {},
ATTR_PICKUP_STATE: self.next_pickup_event.state.value,
2021-10-30 14:27:48 +00:00
}
for pickup in self.next_pickup_event.pickups:
2021-10-30 14:27:48 +00:00
if pickup.name not in attrs[ATTR_PICKUP_TYPES]:
attrs[ATTR_PICKUP_TYPES][pickup.name] = {
2021-12-18 23:26:37 +00:00
ATTR_CATEGORY: pickup.category.value,
2021-10-30 14:27:48 +00:00
ATTR_QUANTITY: pickup.quantity,
}
else:
# Ridwell's API will return distinct objects, even if they have the
# same name (e.g. two pickups of Latex Paint will show up as two
# objects) so, we sum the quantities:
attrs[ATTR_PICKUP_TYPES][pickup.name][ATTR_QUANTITY] += pickup.quantity
2021-10-30 14:27:48 +00:00
return attrs
@property
def native_value(self) -> date:
2021-10-30 14:27:48 +00:00
"""Return the value reported by the sensor."""
return self.next_pickup_event.pickup_date