Potenciando la automatización conversacional en Home Assistant con LLMs: arquitectura y aprendizaje tras desarrollar llm-homeassistant
La domótica ha avanzado a pasos agigantados en los últimos años, pero la experiencia de usuario sigue estando limitada muchas veces por interfaces rígidas o por la necesidad de conocer comandos específicos. Como entusiasta de la inteligencia artificial aplicada y usuario intensivo de Home Assistant, me propuse un reto: llevar las capacidades conversacionales de los modelos LLM (Large Language Models) al siguiente nivel dentro del ecosistema domótico, permitiendo ejecutar acciones complejas y personalizadas usando lenguaje natural.
Así nació llm-homeassistant, una integración personalizada para Home Assistant que empodera cualquier interacción conversacional con modelos de OpenAI como GPT-4, permitiendo desde ejecutar servicios, crear automatizaciones, consultar APIs externas y acceder al historial de estados… todo en español (o cualquier otro idioma soportado por el LLM) y sin scripts predefinidos.
En este post, desgloso el proceso de diseño, las decisiones técnicas clave y los desafíos enfrentados durante el desarrollo de este proyecto, compartiendo aprendizajes y posibles mejoras para el futuro.
¿Por qué hacía falta una integración así?
Aunque Home Assistant ya contaba con la integración OpenAI Conversation, su alcance era limitado:
- La interacción estaba restringida a respuestas básicas y comandos predefinidos.
- No era posible ejecutar servicios complejos, crear automatizaciones desde la conversación, o consultar datos históricos con flexibilidad.
- La integración con APIs externas u orígenes de datos web era nula.
La visión era clara: permitir a los usuarios controlar su hogar inteligente con órdenes naturales, sin preocuparse por la sintaxis ni las limitaciones del sistema.
Arquitectura: cómo conectar Home Assistant, LLMs y acciones avanzadas
Visión general
La arquitectura de llm-homeassistant se apoya en varios pilares:
- Integración nativa con Home Assistant como custom component.
- Interfaz conversacional impulsada por LLMs (OpenAI GPT-4, GPT-3.5, y compatibles).
- Uso de function calling de OpenAI para traducir intenciones en acciones concretas de Home Assistant.
- Extensión de capacidades: llamar servicios, crear automatizaciones, consultar APIs/webs externas y acceder a histórico de entidades.
El diagrama conceptual sería:
1Usuario → Home Assistant Conversation → LLM (OpenAI API) ↔ LLM-HomeAssistant Integration ↔ Home Assistant Core (servicios, automatizaciones, etc.)2 ↘3 APIs externas / web scraping
Componentes principales
- Custom Component Python para Home Assistant
Permite registrar la integración, gestionar la configuración (API Key, entidades expuestas, etc.) y actuar como puente entre el diálogo y el core de Home Assistant.
- Function calling de OpenAI
Se aprovecha la capacidad de los modelos OpenAI para llamar funciones declaradas dinámicamente por el developer (en este caso, servicios y acciones de Home Assistant). Más detalles aquí.
- Manejo de contexto y usuarios
Cada mensaje puede incluir información contextual, como el nombre del usuario, para personalizar respuestas o ejecutar acciones según permisos.
- Módulos de extensión
- Llamada a servicios: ejecutar cualquier servicio expuesto por Home Assistant.
- Creación de automatizaciones: generar triggers y acciones conversacionalmente.
- Consulta de APIs o scraping web: obtener información externa bajo demanda.
- Histórico de entidades: recuperar y resumir datos pasados.
Decisiones técnicas clave
¿Por qué Python?
Home Assistant está construido en Python, por lo que la integración debía ser natural y aprovechar las APIs y eventos del core. Además, Python facilita la manipulación de datos y la integración con APIs externas.
Function Calling vs. Prompt Engineering clásico
En lugar de depender únicamente de prompts extensos y lógica compleja del lado del LLM (lo que puede ser costoso, menos predecible y menos seguro), opté por el enfoque de function calling:
- Declarar “funciones” disponibles (ej.
call_service,create_automation,get_external_data), sus parámetros, y dejar que el LLM decida cuál invocar, rellenando los argumentos a partir del mensaje del usuario. - Esto permite controlar mejor la seguridad, la validación de entradas y dar feedback específico en caso de errores.
Seguridad y permisos
Un reto importante era evitar que cualquier usuario pudiera ejecutar acciones críticas (ej. abrir una puerta, resetear sistemas) solo con un mensaje. Por eso, la integración está pensada para:
- Respetar los permisos de usuario de Home Assistant.
- Permitir definir qué servicios y entidades son “expuestos” al LLM, minimizando riesgos.
Ejemplo de flow conversacional
Para ilustrar cómo funciona la integración, veamos un ejemplo:
- Usuario:
> “Enciende la luz del salón y baja la persiana si la temperatura pasa de 28°C.”
- LLM-HomeAssistant:
- El mensaje es enviado al LLM con información contextual sobre entidades disponibles.
- El LLM responde invocando la función create_automation con los parámetros adecuados (trigger, acciones).
- El componente valida la petición y crea la automatización vía la API de Home Assistant.
- Respuesta al usuario confirmando la creación.
Snippet de función expuesta al LLM:
1def create_automation(trigger: dict, actions: list, name: str = None):2 """Crea una automatización en Home Assistant según los parámetros recibidos."""3 # Validación de entradas4 # Llamada a la API interna para crear la automatización5 # Logging y respuesta conversacional
Principales desafíos y cómo los resolví
1. Mapeo entre lenguaje natural y entidades reales
El LLM puede inferir nombres genéricos (“luz del salón”), pero Home Assistant usa identificadores (light.salon). Para resolverlo:
- Se expone al LLM la lista de entidades disponibles y un mapeo de nombres amigables.
- En el prompt inicial se incluye un contexto JSON con las entidades expuestas.
2. Validación y robustez ante errores
Las respuestas del LLM no siempre son perfectas: pueden faltar argumentos, referirse a entidades inexistentes o intentar acciones no permitidas.
- Implementé validaciones exhaustivas antes de ejecutar cualquier acción.
- Si hay errores o ambigüedad, se responde al usuario pidiendo aclaración o informando del fallo.
3. Consulta de APIs externas y scraping
Permitir que el LLM sugiera la consulta de una API externa o página web implica riesgos de seguridad y performance.
- Solo se permite el acceso a APIs/webs predefinidas o bajo confirmación del usuario.
- Se limita el tiempo de ejecución y el tamaño de las respuestas.
4. Persistencia y resumen de histórico
Al consultar el histórico de estados de una entidad (ej. “¿Cuántas veces se abrió la puerta esta semana?”), se deben hacer queries eficientes y resumir los resultados de forma comprensible.
- Uso de las APIs internas de Home Assistant para obtener históricos.
- Procesamiento y resumen de datos antes de enviarlos al LLM para generar una respuesta “natural”.
Resultados y métricas
Aunque la integración es relativamente joven, ya hemos visto resultados muy positivos:
- Tiempo de configuración reducido: cualquier usuario puede conectar su LLM en menos de 5 minutos.
- Conversaciones naturales y poderosas: usuarios sin conocimientos técnicos pueden crear automatizaciones complejas solo hablando.
- Extensibilidad: la arquitectura permite añadir nuevas “funciones” fácilmente (¡ya hay contribuciones externas!).
- Feedback positivo: la comunidad Home Assistant ha mostrado interés y ha sugerido mejoras y nuevas features.
Aprendizajes y mejoras futuras
Lo aprendido
- El “function calling” es un game-changer para integrar LLMs con sistemas de automatización: más seguro, flexible y fácil de mantener que el prompt engineering puro.
- La seguridad nunca es suficiente: hay que validar todo, limitar el alcance y registrar acciones.
- La experiencia de usuario conversacional es adictiva cuando el sistema responde de verdad a lo que pides, no solo con respuestas “de asistente”.
Mejoras en el roadmap
- Soporte para otros LLMs (ej. modelos open source como Llama, Mistral, etc.).
- Mejor UI para exponer/ocultar entidades y definir permisos por usuario.
- Logs más detallados y métricas de uso.
- Soporte multilingüe nativo y prompts contextuales según idioma.
- Integración con otros sistemas domóticos y APIs de terceros.
Conclusión
llm-homeassistant es un paso hacia una domótica verdaderamente inteligente y accesible, donde la barrera del lenguaje desaparece y el usuario puede controlar todo su entorno solo hablando. El viaje apenas empieza, y las posibilidades que abre la integración de LLMs con el hogar conectado son inmensas.
Si quieres probarlo, contribuir o simplemente curiosear el código, pásate por el repo:
👉 https://github.com/ESJavadex/llm-homeassistant
¿Tienes ideas de mejoras, dudas técnicas o quieres compartir tu experiencia? ¡Déjame un comentario o abre un issue! 🚀
¡Hasta la próxima, y que la IA te ayude a domotizar tu vida!