Potenciando la automatización conversacional en Home Assistant con LLMs: arquitectura y aprendizaje tras desarrollar llm-homeassistant
TL;DR - Resumen Rápido
- Integración gratuita que conecta OpenAI GPT-4 con Home Assistant
- Controla tu casa con voz natural: "Enciende las luces del salón cuando llegue a casa"
- Crea automatizaciones conversando - Sin escribir YAML manualmente
- Function calling para acciones seguras y controladas
- Código disponible: GitHub
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-4o, 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! 🚀
Preguntas Frecuentes (FAQ)
¿Cuánto cuesta usar OpenAI con Home Assistant?
Costes típicos por modelo:
| Modelo | Coste por 1K tokens | Coste típico mensual |
|---|---|---|
| GPT-4o | $0.005 | $1-5 |
| GPT-4 | $0.03 | $5-15 |
| GPT-4o Turbo | $0.0005 | $0.10-0.50 |
¿Qué comandos de voz puedo usar?
Ejemplos que funcionan:
Control básico:
- "Enciende todas las luces del piso de arriba"
- "Baja la persiana del dormitorio al 50%"
- "¿Está encendida la calefacción?"
Automatizaciones:
- "Si no hay nadie en casa después de las 22:00, apaga todo"
- "Cuando abra la puerta del garaje, enciende la luz exterior"
- "Crea un modo cine que baje las persianas y atenúe las luces"
Consultas:
- "¿Cuánto consumió la lavadora esta semana?"
- "¿Cuántas veces se abrió la puerta principal hoy?"
¿Es seguro dar acceso a OpenAI a mi casa?
La integración incluye múltiples capas de seguridad:
- Permisos granulares - Define qué entidades exponer al LLM
- Validación de acciones - Todas las peticiones se validan antes de ejecutar
- Logs de auditoría - Registro de todas las acciones ejecutadas
- Sin acceso a datos sensibles - Las credenciales nunca se envían a OpenAI
¿Puedo usar otros modelos además de OpenAI?
Actualmente la integración está optimizada para OpenAI, pero hay planes de soporte para:
- Modelos locales: Llama 3, Mistral (via Ollama)
- Claude de Anthropic
- Gemini de Google
¿Cómo se compara con el asistente nativo de Home Assistant?
| Característica | Asistente Nativo | llm-homeassistant |
|---|---|---|
| Comandos predefinidos | ✅ | ✅ |
| Lenguaje natural flexible | ❌ | ✅ |
| Crear automatizaciones por voz | ❌ | ✅ |
| Consultar histórico | ❌ | ✅ |
| APIs externas | ❌ | ✅ |
| Offline | ✅ | ❌ |
¿Funciona en español?
Sí, funciona perfectamente en español y en cualquier idioma soportado por GPT-4. Puedes:
- Dar comandos en español
- Recibir respuestas en español
- Mezclar idiomas si lo prefieres
¿Qué pasa si el LLM entiende mal mi comando?
El sistema incluye protecciones:
- Confirmación para acciones críticas (cerraduras, alarmas)
- Preview de automatizaciones antes de activarlas
- Undo/rollback para revertir cambios recientes
- Clarificación - El LLM pregunta si hay ambigüedad
Recursos Adicionales
- Código fuente en GitHub
- Mi canal de YouTube - Tutoriales de IA aplicada
- La Escuela de IA - Comunidad gratuita
Posts Relacionados sobre Home Assistant
- Cómo Usar Claude Code en Home Assistant - Automatiza con Claude CLI
- Integrar Cámaras EZVIZ Localmente - Streaming sin nube
- Automatizar Backups de Home Assistant - Protege tu configuración
- Marketplace de Plugins Claude Code - Valida YAML automáticamente
¿Has creado automatizaciones interesantes con LLM en Home Assistant? Comparte tu experiencia en los comentarios o contribuye al proyecto en GitHub.