Автономный AI-агент умного дома на LoRa: Ollama + Home Assistant гайд 2026 | AiManual
AiManual Logo Ai / Manual.
18 Фев 2026 Гайд

Как создать автономный AI-агент для умного дома на базе LoRa-радио: пошаговый гайд с Ollama и Home Assistant

Пошаговый гайд создания полностью автономного AI-агента для умного дома на LoRa-радио с phi4-mini и Ollama. Работа без интернета через Meshtastic.

Интернет пропал. Свет отключили. А ваш умный дом продолжает работать. Звучит как фантастика? Это реальность, которую я собрал после того, как в моем районе трижды за месяц обрывали оптоволокно. Классические Wi-Fi решения превращались в бесполезный хлам. Нужен был полностью автономный агент, работающий даже когда весь мир отключен.

LoRa (Long Range) радио - технология, которая передает данные на километры при потреблении энергии как у электронных часов. Meshtastic - open-source протокол поверх LoRa, создающий децентрализованную mesh-сеть. Ollama - инструмент для запуска локальных LLM моделей. Home Assistant - платформа для умного дома. Соединяем все это - получаем AI-агента, который думает локально и общается по радио.

Почему это работает, когда все остальное ломается

Стандартный умный дом строится на трех столпах: интернет, облачные сервисы, постоянное питание. Выбиваем один - вся система падает. LoRa-сеть работает на частотах 868/915 МГц с мощностью передачи 10-100 мВт. Батарейки хватает на месяцы. Mesh-топология означает: если один узел упал, данные найдут другой путь.

💡
Реальный кейс из 2025 года: в зоне конфликта волонтеры развернули Meshtastic-сеть для координации помощи. При полном отсутствии интернета и регулярных отключениях электричества сеть из 15 узлов работала 47 дней без остановки. Самый дальний линк - 3.2 км.

AI-компонент решает главную проблему LoRa: ограниченная пропускная способность (до 50 кбит/с). Вместо отправки сырых данных агент анализирует ситуацию локально и передает только решения: "включить обогрев", "открыть вентиляцию", "тревога: утечка газа".

Что понадобится для сборки

Компонент Модель/Версия Назначение
LoRa-радио RAK3172, LilyGO T-Beam Аппаратная часть сети
Плата управления Raspberry Pi 5 (8GB) Запуск Ollama и Home Assistant
LLM модель phi4-mini (4.2B параметров) Локальный интеллект агента
Альтернативная LLM gemma3:12b (если хватит памяти) Более мощная модель

phi4-mini выбрана не случайно. На февраль 2026 года это одна из самых эффективных 4B-моделей. Она работает на Raspberry Pi 5 с адекватной скоростью (5-7 токенов/сек), понимает контекст до 128К токенов и отлично справляется с классификацией интентов - именно то, что нужно нашему агенту.

Шаг за шагом: от железа к интеллекту

1 Подготовка LoRa-сети с Meshtastic

Сначала собираем физический канал связи. Берем две платы LilyGO T-Beam (у них уже есть GPS, что полезно для геолокации устройств). Прошиваем последнюю версию Meshtastic - на февраль 2026 это v2.3.7.

# Клонируем репозиторий Meshtastic
git clone https://github.com/meshtastic/firmware.git
cd firmware

# Устанавливаем зависимости для сборки
python3 -m pip install -r requirements.txt

# Собираем прошивку для T-Beam
pio run -e tbeam

# Прошиваем через USB
python3 -m esptool --chip esp32 --port /dev/ttyUSB0 write_flash 0x1000 .pio/build/tbeam/firmware.bin

После прошивки открываем веб-интерфейс Meshtastic по адресу http://meshtastic.local/. Настраиваем:

  • Имя узла (например, "home-base", "sensor-garden")
  • Канал связи - используем стандартный "LongFast" для баланса дальности и скорости
  • Режим работы - «Router» для базовой станции, «Client» для сенсоров

2 Установка Ollama и загрузка модели

На Raspberry Pi 5 устанавливаем Ollama - на 2026 год это версия 0.5.8 с поддержкой GPU через Vulkan для Raspberry Pi.

# Устанавливаем Ollama
curl -fsSL https://ollama.ai/install.sh | sh

# Запускаем службу
sudo systemctl enable ollama
sudo systemctl start ollama

# Загружаем phi4-mini (последняя версия на 18.02.2026)
ollama pull phi4-mini:latest

# Проверяем работу
ollama run phi4-mini "Привет! Ответь коротко."

Не пытайтесь ставить большие модели типа Llama 3.1 70B на Raspberry Pi. phi4-mini специально оптимизирована для edge-устройств. Если у вас более мощный сервер (32+ GB RAM), можно использовать gemma3:12b - она дает лучшие результаты в логических задачах.

3 Интеграция Home Assistant

Устанавливаем Home Assistant OS через Raspberry Pi Imager или вручную:

# Для Raspberry Pi 5 используем 64-битную версию
wget https://github.com/home-assistant/operating-system/releases/download/12.5/haos_rpi5-64-12.5.img.xz

# Записываем на SD-карту
xz -d haos_rpi5-64-12.5.img.xz
sudo dd if=haos_rpi5-64-12.5.img of=/dev/mmcblk0 bs=4M status=progress

После запуска Home Assistant добавляем интеграцию MQTT (Meshtastic использует MQTT для связи с внешними системами).

В файле configuration.yaml добавляем:

# MQTT интеграция для Meshtastic
mqtt:
  broker: 127.0.0.1
  port: 1883
  username: !secret mqtt_username
  password: !secret mqtt_password

# Автоматизация для обработки сообщений
automation:
  - alias: "Process LoRa messages"
    trigger:
      platform: mqtt
      topic: "msh/+/json"
    action:
      - service: python_script.process_lora_message
        data:
          payload: "{{ trigger.payload }}"

# Python скрипт для обработки
python_script:
  process_lora_message: /config/python_scripts/process_lora_message.py

4 Создаем AI-агента: мозг системы

Здесь начинается магия. Пишем Python-скрипт, который берет сырые данные с сенсоров, отправляет в phi4-mini для анализа, получает решение и выполняет его через Home Assistant.

#!/usr/bin/env python3
# /config/python_scripts/lora_ai_agent.py

import json
import requests
import paho.mqtt.client as mqtt
from datetime import datetime

# Конфигурация
OLLAMA_URL = "http://localhost:11434/api/generate"
HA_URL = "http://localhost:8123/api"
HA_TOKEN = "your_long_lived_access_token"

# Системный промпт для phi4-mini
SYSTEM_PROMPT = """Ты - AI-агент умного дома. Анализируй данные с сенсоров и принимай решения.
Доступные действия:
- Включить/выключить устройства
- Изменить температуру
- Отправить уведомление
- Активировать сценарий

Формат ответа ТОЛЬКО JSON:
{
  "action": "название_действия",
  "target": "устройство_или_зона",
  "value": "значение",
  "reason": "краткое_объяснение"
}"""

class LoRaAIAgent:
    def __init__(self):
        self.mqtt_client = mqtt.Client()
        self.mqtt_client.on_connect = self.on_connect
        self.mqtt_client.on_message = self.on_message
        
    def on_connect(self, client, userdata, flags, rc):
        print(f"Connected to MQTT with code {rc}")
        client.subscribe("msh/+/json")
        
    def on_message(self, client, userdata, msg):
        try:
            data = json.loads(msg.payload.decode())
            if "type" in data and data["type"] == "nodeinfo":
                return  # Игнорируем служебные сообщения
                
            # Анализируем данные через Ollama
            decision = self.analyze_with_ai(data)
            
            # Выполняем решение
            self.execute_decision(decision)
            
        except Exception as e:
            print(f"Error processing message: {e}")
    
    def analyze_with_ai(self, sensor_data):
        """Отправляем данные в phi4-mini для анализа"""
        prompt = f"""{SYSTEM_PROMPT}
        
        Данные с сенсоров:
        {json.dumps(sensor_data, indent=2)}
        
        Текущее время: {datetime.now().strftime('%H:%M')}
        Время года: зима
        
        Прими решение:"""
        
        payload = {
            "model": "phi4-mini",
            "prompt": prompt,
            "stream": False,
            "options": {
                "temperature": 0.3,  # Низкая температура для детерминированных решений
                "num_predict": 150
            }
        }
        
        response = requests.post(OLLAMA_URL, json=payload, timeout=30)
        response.raise_for_status()
        
        result = response.json()
        ai_response = result["response"].strip()
        
        # Извлекаем JSON из ответа (модель может добавить текст)
        start_idx = ai_response.find('{')
        end_idx = ai_response.rfind('}') + 1
        
        if start_idx != -1 and end_idx != 0:
            json_str = ai_response[start_idx:end_idx]
            return json.loads(json_str)
        else:
            return {"action": "log", "reason": "Не удалось разобрать ответ AI"}
    
    def execute_decision(self, decision):
        """Выполняем решение через Home Assistant API"""
        action = decision.get("action")
        
        headers = {
            "Authorization": f"Bearer {HA_TOKEN}",
            "Content-Type": "application/json"
        }
        
        if action == "turn_on":
            entity_id = f"switch.{decision['target']}"
            requests.post(
                f"{HA_URL}/services/switch/turn_on",
                json={"entity_id": entity_id},
                headers=headers
            )
            
        elif action == "set_temperature":
            entity_id = f"climate.{decision['target']}"
            requests.post(
                f"{HA_URL}/services/climate/set_temperature",
                json={
                    "entity_id": entity_id,
                    "temperature": float(decision["value"])
                },
                headers=headers
            )
            
        elif action == "notify":
            requests.post(
                f"{HA_URL}/services/notify/mobile_app",
                json={
                    "message": decision["reason"],
                    "title": "AI Agent Decision"
                },
                headers=headers
            )
        
        print(f"Executed: {decision}")
    
    def run(self):
        self.mqtt_client.connect("localhost", 1883, 60)
        self.mqtt_client.loop_forever()

if __name__ == "__main__":
    agent = LoRaAIAgent()
    agent.run()

Реальные сценарии работы

Система установлена. Что она может делать без интернета?

Сценарий 1: Умное отопление на дровах

В загородном доме стоит дровяной котел с электрическим контроллером. LoRa-датчик температуры в гостиной показывает +16°C. Датчик на улице: -5°C. phi4-mini анализирует:

  • Температура в доме ниже комфортной (+21°C)
  • На улице холодно, теплопотери высокие
  • Время 23:45, скоро ночь
  • Запас дров в бункере (по датчику уровня) - 60%

Решение: увеличить подачу воздуха в котел на 15%, активировать циркуляционный насос. Все команды идут по LoRa к контроллеру котла.

Сценарий 2: Охранная система

PIR-датчик движения на LoRa срабатывает в нерабочее время. Камера (локальная, запись на SD) делает снимок. Мини-компьютер рядом запуска gemma3:12b для анализа изображения (человек/животное/ложное срабатывание). Если человек - включается сирена, владельцу идет SMS через GSM-модем (работает автономно).

Ошибки, которые сломают вашу систему

1. Не тестируйте на одной плате. LoRa требует реального расстояния. Две платы в соседних комнатах через стену могут не связаться, а на улице с расстоянием 500 метров - отлично.

2. Не используйте стандартные каналы Meshtastic в городе. На 868 МГз работает куча устройств. Зайдите в веб-интерфейс, перейдите в Radio Config, смените Channel Settings - Frequency Offset. Сдвиньте на 1-2 МГц от стандартных значений.

3. Не оставляйте Ollama с default настройками. В ~/.ollama/config.json добавьте "num_parallel": 1 и "num_ctx": 4096 для phi4-mini. Иначе Raspberry Pi 5 упрется в память при первом же запросе.

Что делать, когда интернет все же есть

Автономность не означает изоляцию. Когда интернет появляется, система может:

  1. Синхронизировать логи и телеметрию с вашим сервером
  2. Загружать обновления моделей для Ollama (новые версии phi4-mini)
  3. Делать бэкап конфигурации Home Assistant
  4. Использовать более мощные облачные модели для сложного анализа, сохраняя локальную phi4-mini как fallback

Настройте в Home Assistant автоматизацию, которая при появлении интернета запускает скрипт синхронизации.

Стоимость и альтернативы

Компонент Стоимость (руб) Альтернатива
Raspberry Pi 5 8GB 12 000 Orange Pi 5 (дешевле, но сложнее с драйверами)
2x LilyGO T-Beam 8 000 RAK3172 + антенна (лучше дальность)
Датчики (температура, движение) 3 000 Самодельные на ESP32 + LoRa модуль
Итого ~23 000 Можно уложиться в 15 000 с китайскими аналогами

Для сравнения: готовые коммерческие системы автономного умного дома начинаются от 80 000 рублей и почти всегда имеют проприетарные протоколы, которые нельзя модифицировать.

Что будет дальше с такими системами

К 2027 году ожидаю появления специализированных LLM моделей для edge-устройств размером 1-2B параметров, которые будут работать даже на Raspberry Pi Zero. Производители чипов (Broadcom, Qualcomm) уже анонсировали нейропроцессоры для LoRa-устройств.

Сейчас самая слабая часть системы - энергопотребление Raspberry Pi. В режиме ожидания он все равно тянет 3-5Вт. Решение: использовать Pi только для сложных вычислений, а для постоянного мониторинга - микроконтроллеры на ESP32, которые просыпаются по таймеру, собирают данные, отправляют по LoRa и снова засыпают (потребление в сне: 10 мкА).

Если вам интересна тема полностью локальных AI-агентов, посмотрите мою статью про HomeGenie v2.0 - это другой подход к той же проблеме. А для тех, кто хочет начать с более простых решений, есть гайд по сборке локального Jarvis без радио-компонентов.

Главный урок, который я вынес: автономность - это не про отказ от технологий. Это про умный выбор технологий, которые работают когда все остальное сломалось. Ваш умный дом не должен зависеть от доброй воли интернет-провайдера. Особенно когда за окном -20°C, а в котле еще есть дрова.