Files
Home-Assistant/custom_components/amazon_order_status/sensor.py
T
2026-07-09 13:30:12 -04:00

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