86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
"""Commandes websocket_api pour exposer les recettes CookCLI au frontend.
|
|
|
|
Deux commandes :
|
|
- cookcli/recipes -> liste des recettes (depuis le coordinator, en cache)
|
|
- cookcli/recipe -> détail d'une recette (appel direct à l'API, pas de cache)
|
|
|
|
Si plusieurs serveurs CookCLI sont configurés, `entry_id` permet de préciser
|
|
lequel interroger ; sinon, le premier configuré est utilisé.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import voluptuous as vol
|
|
from homeassistant.components import websocket_api
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .api import CookCliApiError
|
|
from .const import DOMAIN
|
|
|
|
|
|
def _resolve_entry_data(hass: HomeAssistant, entry_id: str | None) -> dict | None:
|
|
entries = hass.data.get(DOMAIN, {})
|
|
if entry_id is not None:
|
|
return entries.get(entry_id)
|
|
if entries:
|
|
return next(iter(entries.values()))
|
|
return None
|
|
|
|
|
|
@websocket_api.websocket_command(
|
|
{
|
|
vol.Required("type"): "cookcli/recipes",
|
|
vol.Optional("entry_id"): str,
|
|
}
|
|
)
|
|
@websocket_api.async_response
|
|
async def ws_list_recipes(
|
|
hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict
|
|
) -> None:
|
|
entry_data = _resolve_entry_data(hass, msg.get("entry_id"))
|
|
if entry_data is None:
|
|
connection.send_error(msg["id"], "not_found", "Aucune intégration CookCLI configurée")
|
|
return
|
|
|
|
coordinator = entry_data["coordinator"]
|
|
connection.send_result(
|
|
msg["id"],
|
|
{
|
|
"recipes": [
|
|
{"path": r.path, "name": r.name} for r in coordinator.data or []
|
|
]
|
|
},
|
|
)
|
|
|
|
|
|
@websocket_api.websocket_command(
|
|
{
|
|
vol.Required("type"): "cookcli/recipe",
|
|
vol.Required("path"): str,
|
|
vol.Optional("entry_id"): str,
|
|
}
|
|
)
|
|
@websocket_api.async_response
|
|
async def ws_get_recipe(
|
|
hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict
|
|
) -> None:
|
|
entry_data = _resolve_entry_data(hass, msg.get("entry_id"))
|
|
if entry_data is None:
|
|
connection.send_error(msg["id"], "not_found", "Aucune intégration CookCLI configurée")
|
|
return
|
|
|
|
client = entry_data["client"]
|
|
try:
|
|
recipe = await client.async_get_recipe(msg["path"])
|
|
except CookCliApiError as err:
|
|
connection.send_error(msg["id"], "cannot_connect", str(err))
|
|
return
|
|
|
|
connection.send_result(msg["id"], recipe)
|
|
|
|
|
|
def async_setup_websocket_api(hass: HomeAssistant) -> None:
|
|
"""Enregistre les commandes websocket. À appeler une seule fois."""
|
|
websocket_api.async_register_command(hass, ws_list_recipes)
|
|
websocket_api.async_register_command(hass, ws_get_recipe)
|