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.
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.
@JarvistronHomeBot • en línea
{
"action": "call_service",
"domain": "light",
"service": "turn_off",
"service_data": {
"entity_id": "light.luz_salon"
}
}
```json {...} ```
HomeAssistantClient: 200 OK
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.
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.
Sistema estricto de control de acceso por telegram_user_id. Solo los miembros autorizados de la familia pueden interactuar o emitir órdenes.
Jarvistron consulta en tiempo real los estados de Home Assistant (light.*, switch.*, sensor.*) para responder con conocimiento exacto del hogar.
Mantiene un búfer de los últimos 20 mensajes por usuario. Entiende pronombres y órdenes encadenadas: "¿El salón está encendido? Pues apágalo".
El modelo genera bloques estructurados {"action": "call_service", ...} que son validados y enviados con seguridad a la REST API de Home Assistant.
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.
Cada interacción atraviesa un pipeline asíncrono con validación de seguridad, enriquecimiento de contexto y parseo sintáctico.
Recepción del mensaje vía python-telegram-bot. Verificación instantánea en WHITELIST.
Llamada /api/states. Se filtran hasta 60 entidades clave (luces, clima, switches) con sus nombres amigables.
Prompt estructurado con memoria (últimos 10 turnos) + estados. Ollama decide si responde texto o emite bloque de acción JSON.
Llamada POST a /api/services/{domain}/{service} y confirmación natural de vuelta al usuario en Telegram.
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", {}) )
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"
docker compose up -d
Ver logs:
docker compose logs -f
# URL y Token de Acceso de Larga Duración de Home Assistant HA_URL=http://192.168.1.76:8123 HA_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... # Instancia local de Ollama (ej: en el host o servidor local) OLLAMA_URL=http://192.168.1.56:11434 OLLAMA_MODEL=llama3.2 # Token del Bot de Telegram (obtenido con @BotFather) TELEGRAM_TOKEN=123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ # IDs numéricos de Telegram autorizados (separados por coma) WHITELIST=12345678,87654321
# 1. Clonar o navegar al directorio cd /mnt/projects/jarvistron # 2. Instalar dependencias requeridas (python-telegram-bot, httpx, python-dotenv) pip install -r requirements.txt # 3. Iniciar el bot python main.py
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.
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.
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.