94 lines
3.0 KiB
Python
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
|