Desarrollo & IA

Cómo Integrar OpenAI en Home Assistant para Ejecutar Servicios con Voz

5 de enero de 2026
8 min

llm-homeassistant es una integración personalizada para Home Assistant que potencia las conversaciones con modelos OpenAI, permitiendo ejecutar servic...

Javier Santos

Especialista en IA & Machine Learning

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:

  1. Integración nativa con Home Assistant como custom component.
  2. Interfaz conversacional impulsada por LLMs (OpenAI GPT-4, GPT-3.5, y compatibles).
  3. Uso de function calling de OpenAI para traducir intenciones en acciones concretas de Home Assistant.
  4. Extensión de capacidades: llamar servicios, crear automatizaciones, consultar APIs/webs externas y acceder a histórico de entidades.

El diagrama conceptual sería:

code
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:

  1. Usuario:

> “Enciende la luz del salón y baja la persiana si la temperatura pasa de 28°C.”

  1. 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:

python
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 entradas
4 # Llamada a la API interna para crear la automatización
5 # 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!