96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
"""Amazon Orders sensors."""
|
|
|
|
import logging
|
|
from homeassistant.helpers.entity import Entity
|
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from datetime import datetime
|
|
from homeassistant.components.sensor import SensorEntity
|
|
from .coordinator import AmazonOrdersCoordinator
|
|
from homeassistant.util.dt import as_local
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
STATUSES = [
|
|
"Ordered",
|
|
"Shipped",
|
|
"Out for delivery",
|
|
"Delivered",
|
|
]
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: ConfigEntry,
|
|
async_add_entities,
|
|
):
|
|
"""Set up Amazon Order Status sensors."""
|
|
coordinator: AmazonOrdersCoordinator = hass.data["amazon_order_status"][entry.entry_id]
|
|
|
|
sensors = [
|
|
AmazonOrderStatusSensor(coordinator, status)
|
|
for status in STATUSES
|
|
]
|
|
sensors.append(AmazonOrdersLastUpdatedSensor(coordinator))
|
|
|
|
async_add_entities(sensors)
|
|
|
|
|
|
class AmazonOrderStatusSensor(CoordinatorEntity, Entity):
|
|
"""Sensor representing Amazon orders in a specific status."""
|
|
|
|
def __init__(self, coordinator: AmazonOrdersCoordinator, status: str):
|
|
super().__init__(coordinator)
|
|
self.status = status
|
|
self._attr_unique_id = f"amazon_order_status_{status.lower().replace(' ', '_')}"
|
|
self._attr_name = f"Amazon Orders {status}"
|
|
self._attr_icon = "mdi:package-variant"
|
|
|
|
@property
|
|
def state(self) -> int:
|
|
"""Return number of orders in this status."""
|
|
return len(self._orders_for_status())
|
|
|
|
@property
|
|
def extra_state_attributes(self):
|
|
"""Return order details for this status."""
|
|
orders = self._orders_for_status()
|
|
return {
|
|
"order_count": len(orders),
|
|
"orders": orders,
|
|
}
|
|
|
|
def _orders_for_status(self) -> list[dict]:
|
|
"""Return orders matching this sensor's status."""
|
|
if not self.coordinator.data:
|
|
return []
|
|
|
|
return [
|
|
{
|
|
"order_id": data.get("order_id"),
|
|
"subject": data.get("subject"),
|
|
"updated": data.get("updated"),
|
|
"tracking_url": data.get("tracking_url"),
|
|
}
|
|
for data in self.coordinator.data
|
|
if data.get("status") == self.status
|
|
]
|
|
|
|
|
|
class AmazonOrdersLastUpdatedSensor(CoordinatorEntity, Entity):
|
|
"""Sensor showing when Amazon orders were last updated."""
|
|
|
|
def __init__(self, coordinator: AmazonOrdersCoordinator):
|
|
super().__init__(coordinator)
|
|
self._attr_unique_id = "amazon_order_status_last_updated"
|
|
self._attr_name = "Amazon Orders Last Updated"
|
|
self._attr_icon = "mdi:clock-check-outline"
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return ISO timestamp of last successful update."""
|
|
if not getattr(self.coordinator, "last_check", None):
|
|
return None
|
|
return self.coordinator.last_check.isoformat()
|