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

94 lines
3.0 KiB
Python

"""Amazon Order Status integration."""
import logging
from datetime import timedelta
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.helpers import config_validation as cv
from .const import DOMAIN, SERVICE_PURGE_ORDER, ATTR_ORDER_ID
from .coordinator import AmazonOrdersCoordinator
_LOGGER = logging.getLogger(__name__)
PLATFORMS = ["sensor"]
DEFAULT_UPDATE_INTERVAL = 5 # minutes
PURGE_ORDER_SCHEMA = vol.Schema(
{vol.Optional(ATTR_ORDER_ID, default=""): cv.string}
)
async def _handle_purge_order(hass: HomeAssistant, call: ServiceCall) -> None:
"""Remove a specific order from tracking."""
order_id = (call.data.get(ATTR_ORDER_ID) or "").strip()
if not order_id:
_LOGGER.warning(
"purge_order called with empty order_id. "
"If using a dashboard button, call script.purge_amazon_order instead so the order ID is read when you tap."
)
return
domain_data = hass.data.get(DOMAIN) or {}
removed = False
for key, value in domain_data.items():
if isinstance(value, AmazonOrdersCoordinator):
if await value.async_purge_order(order_id):
removed = True
if not removed:
_LOGGER.warning("Order %s not found or already purged", order_id)
def _make_purge_order_handler(hass: HomeAssistant):
"""Return an async service handler that closes over hass."""
async def handler(call: ServiceCall) -> None:
await _handle_purge_order(hass, call)
return handler
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Amazon Order Status from a config entry."""
# Create the coordinator
coordinator = AmazonOrdersCoordinator(hass, entry)
await coordinator.async_config_entry_first_refresh()
# Ensure DOMAIN dict exists
hass.data.setdefault(DOMAIN, {})
# Store coordinator under a fixed key for options_flow
hass.data[DOMAIN]["coordinator"] = coordinator
# Also store by entry_id for platform setup
hass.data[DOMAIN][entry.entry_id] = coordinator
# Register purge_order service (idempotent if multiple entries)
if not hass.services.has_service(DOMAIN, SERVICE_PURGE_ORDER):
hass.services.async_register(
DOMAIN,
SERVICE_PURGE_ORDER,
_make_purge_order_handler(hass),
schema=PURGE_ORDER_SCHEMA,
)
# Forward entry setups (sensors)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
# Unload platforms
await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
# Remove coordinator references
if DOMAIN in hass.data:
if "coordinator" in hass.data[DOMAIN]:
hass.data[DOMAIN].pop("coordinator")
if entry.entry_id in hass.data[DOMAIN]:
hass.data[DOMAIN].pop(entry.entry_id)
return True