import logging from homeassistant_api import Client, HomeassistantAPIError from cookbook.connectors.connector import Connector from cookbook.models import ShoppingListEntry, HomeAssistantConfig, Space class HomeAssistant(Connector): _config: HomeAssistantConfig def __init__(self, config: HomeAssistantConfig): self._config = config self._logger = logging.getLogger("connector.HomeAssistant") async def on_shopping_list_entry_created(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None: if not self._config.on_shopping_list_entry_created_enabled: return item, description = _format_shopping_list_entry(shopping_list_entry) async with Client(self._config.url, self._config.token, use_async=True) as client: try: todo_domain = await client.async_get_domain('todo') await todo_domain.add_item(entity_id=self._config.todo_entity, item=item) except HomeassistantAPIError as err: self._logger.warning(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}") async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None: if not self._config.on_shopping_list_entry_updated_enabled: return pass async def on_shopping_list_entry_deleted(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None: if not self._config.on_shopping_list_entry_deleted_enabled: return item, description = _format_shopping_list_entry(shopping_list_entry) async with Client(self._config.url, self._config.token, use_async=True) as client: try: todo_domain = await client.async_get_domain('todo') await todo_domain.remove_item(entity_id=self._config.todo_entity, item=item) except HomeassistantAPIError as err: self._logger.warning(f"[HomeAssistant {self._config.name}] Received an exception from the api: {err=}, {type(err)=}") def _format_shopping_list_entry(shopping_list_entry: ShoppingListEntry): item = shopping_list_entry.food.name if shopping_list_entry.amount > 0: if shopping_list_entry.unit and shopping_list_entry.unit.base_unit and len(shopping_list_entry.unit.base_unit) > 0: item += f" ({shopping_list_entry.amount} {shopping_list_entry.unit.base_unit})" elif shopping_list_entry.unit and shopping_list_entry.unit.name and len(shopping_list_entry.unit.name) > 0: item += f" ({shopping_list_entry.amount} {shopping_list_entry.unit.name})" else: item += f" ({shopping_list_entry.amount})" description = "Imported by TandoorRecipes" if shopping_list_entry.created_by.first_name and len(shopping_list_entry.created_by.first_name) > 0: description += f", created by {shopping_list_entry.created_by.first_name}" else: description += f", created by {shopping_list_entry.created_by.username}" return item, description