JARVISTRON v1.2

HA + Ollama + Telegram

Probar Bot
100% IA Local • Cero Cloud Dependency • Telegram Whitelist

Tu hogar inteligente, gobernado por IA Local sin fisuras.

JARVISTRON es el puente autónomo que fusiona el ecosistema de Home Assistant con el razonamiento en lenguaje natural de Ollama (Llama 3.2) y la inmediatez remota de Telegram. Privacidad radical sin enviar un solo byte a servidores de terceros.

Privacidad
0 bytes
Datos enviados a nubes externas
Motor LLM
Llama 3.2
Ollama On-Premise (Nativo)
Contenedor
<64 MB
Límite RAM garantizado
Seguridad
Whitelist
Filtrado estricto de Telegram ID
Experiencia Interactiva

Laboratorio Jarvistron en Tiempo Real

Experimenta el flujo exacto de la lógica de main.py. Envía comandos al bot de Telegram y observa cómo el estado de Home Assistant se actualiza instantáneamente en pantalla.

JV

Jarvistron Bot

@JarvistronHomeBot • en línea

Whitelist OK
JV
¡Jarvistron en línea! ¿Qué deseas hacer con tu hogar hoy?
11:38 • Entidades sincronizadas
¿Cómo está la temperatura en el salón?
11:38
JV
La temperatura actual en el salón es de 22.8 °C con una humedad relativa del 48%. El clima es bastante confortable.
11:38 • Ollama Llama 3.2
Prueba:

Entidades Home Assistant

http://192.168.1.76:8123
Luz Principal Salón
light.luz_salon
Iluminación Cocina
light.luz_cocina
sensor.temperatura
22.8 °C
Salón • Normal
sensor.humedad
48 %
Humedad interior
Modo Cine (Ambiente)
script.modo_cine
Inspector de Llamada JSON Inferencia: ~140ms
Acción detectada por Ollama:
{
  "action": "call_service",
  "domain": "light",
  "service": "turn_off",
  "service_data": {
    "entity_id": "light.luz_salon"
  }
}
Regex parser: ```json {...} ``` HomeAssistantClient: 200 OK
Por qué Jarvistron

Diseñado para la privacidad total de tu hogar

La mayoría de asistentes comerciales envían tu voz y hábitos a la nube pública. Jarvistron ejecuta el modelo en tu propia máquina local.

100% IA Local (On-Premise)

Conectado a tu propia instancia de Ollama (Llama 3.2, Mistral, Qwen). Tus conversaciones, rutinas familiares y dispositivos jamás salen de tu red local privada.

Whitelist Criptográfica

Sistema estricto de control de acceso por telegram_user_id. Solo los miembros autorizados de la familia pueden interactuar o emitir órdenes.

Context Awareness Dinámico

Jarvistron consulta en tiempo real los estados de Home Assistant (light.*, switch.*, sensor.*) para responder con conocimiento exacto del hogar.

Memoria Conversacional

Mantiene un búfer de los últimos 20 mensajes por usuario. Entiende pronombres y órdenes encadenadas: "¿El salón está encendido? Pues apágalo".

Despacho de Servicios JSON

El modelo genera bloques estructurados {"action": "call_service", ...} que son validados y enviados con seguridad a la REST API de Home Assistant.

Consumo Ultraligero (<64MB)

Construido sobre Python 3.11 asíncrono (httpx y asyncio). Diseñado para correr 24/7 en un mini-PC, NAS o Raspberry Pi sin sobrecargar recursos.

Ingeniería del Sistema

Flujo de Ejecución y Decisión

Cada interacción atraviesa un pipeline asíncrono con validación de seguridad, enriquecimiento de contexto y parseo sintáctico.

01 Seguridad

Telegram Gateway

Recepción del mensaje vía python-telegram-bot. Verificación instantánea en WHITELIST.

02 Contexto

Muestreo HA

Llamada /api/states. Se filtran hasta 60 entidades clave (luces, clima, switches) con sus nombres amigables.

03 Razonamiento

Ollama LLM

Prompt estructurado con memoria (últimos 10 turnos) + estados. Ollama decide si responde texto o emite bloque de acción JSON.

04 Ejecución

Despacho & Feedback

Llamada POST a /api/services/{domain}/{service} y confirmación natural de vuelta al usuario en Telegram.

main.py — Núcleo de Integración Asíncrona
class JarvistronBot:
    async def handle_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
        # 1. Validación estricta de Whitelist
        if not await self.is_authorized(update): return
        
        # 2. Obtención de estados simplificados desde Home Assistant
        states = await self.ha.get_states()
        simplified = [
            {"entity": s["entity_id"], "state": s["state"], "name": s.get("attributes", {}).get("friendly_name", s["entity_id"])}
            for s in states if s["entity_id"].startswith(("light.", "switch.", "script.", "sensor.temperature"))
        ][:60]

        # 3. Consulta al modelo local en Ollama con historial conversacional
        response_text = await self.ollama.chat(user_text, simplified, self.memory[user_id])

        # 4. Extracción de orden de servicio JSON
        json_match = re.search(r'```json\s*(.*?)\s*```', response_text, re.DOTALL)
        if json_match:
            action_data = json.loads(json_match.group(1).strip())
            if action_data.get("action") == "call_service":
                await self.ha.call_service(
                    action_data["domain"], action_data["service"], action_data.get("service_data", {})
                )
Puesta en Producción

Despliega Jarvistron en segundos

Listo para ejecutar vía Docker Compose con control de recursos o directamente con Python 3.11 en tu red doméstica.

services:
  jarvistron:
    build: .
    container_name: jarvistron-bot
    restart: unless-stopped
    deploy:
      resources:
        limits:
          memory: 64M      # Límite estricto para ahorro de recursos
    env_file:
      - .env
    volumes:
      - .:/app
    logging:
      driver: "json-file"
      options:
        max-size: "10mb"
        max-file: "3"
Levantar servicio: docker compose up -d Ver logs: docker compose logs -f

Preguntas Frecuentes

¿Requiere abrir puertos o configurar NAT en mi router?

No. Telegram funciona mediante un socket saliente de Long Polling (`app.run_polling()`). Esto significa que el bot hace peticiones hacia la API de Telegram, por lo que no necesitas ninguna IP pública fija, dominio dinámico ni abrir ningún puerto en el firewall de tu router.

¿Qué modelos de Ollama son compatibles?

Cualquier modelo capaz de seguir instrucciones en español y generar bloques JSON. Recomendamos especialmente llama3.2 (1B o 3B por su tremenda velocidad en CPU/GPU ligera), mistral:7b o qwen2.5:3b.

¿Cómo obtengo mi ID de usuario para la WHITELIST?

Puedes hablar con el bot oficial de Telegram @userinfobot desde tu cuenta. Te responderá con tu ID numérico único. Agrégalo al archivo .env en la variable WHITELIST.

Copiado al portapapeles