NOEMA RNSGate Lite: как я собрал mesh‑шлюз на Reticulum с интеграцией Home Assistant и локальным AI

Что это
NOEMA RNSGate Lite — открытый шлюз для сети Reticulum (Mark Qvist, MIT). В одном проекте это:
узел mesh‑сети Reticulum поверх LoRa, TCP/IP и I2P;
мост LXMF ↔ MQTT для управления умным домом через Home Assistant;
встроенный P2P‑чат с шифрованием;
нода Nomadnet — децентрализованной «сети без DNS и серверов»;
веб‑дашборд для управления всем этим без SSH;
с недавних пор — команда
/ask, которая дёргает локальную LLM (llama.cpp) прямо из LXMF‑чата, без интернета.
Всё это ставится одной командой на любой Linux — от Orange Pi Zero до виртуалки на Proxmox. Исходники и документация (на русском и английском) — на GitHub, лендинг — noema‑rns‑gate.github.io.
Дальше — зачем это было нужно и как оно устроено внутри.
С чего началось
У меня дома давно крутится Home Assistant — свет, отопление, датчики, всё как положено. Проблема появилась не с автоматизацией, а со связью: когда пропадает электричество (а в последнее время это не редкость), пропадает и Wi‑Fi роутер, и сотовая связь — базовые станции без света тоже не работают. В такой момент управлять домом и просто оставаться на связи с близкими становится нечем.
Готовые mesh‑решения вроде Meshtastic я пробовал, но хотелось не просто «рацию с чатом», а полноценный узел сети, который можно встроить в уже существующую инфраструктуру — с шифрованием из коробки, гибкой маршрутизацией и, что важнее всего, возможностью дотянуться до Home Assistant напрямую по радио, без интернета.
Так и родился NOEMA RNSGate — сначала просто скрипт, который слушал LXMF и дёргал MQTT, потом обвязка автообновлений, потом веб‑дашборд, чтобы не лезть в SSH каждый раз, когда что‑то надо поправить. За несколько месяцев набралось достаточно, чтобы выложить в открытый доступ.
Почему Reticulum, а не Meshtastic
Meshtastic отлично решает задачу «чат по радио между людьми» — простой протокол, масса готовых плат, огромное community. Но у меня была другая задача: не просто переписываться, а построить узел сети, который одинаково хорошо работает и по LoRa, и по TCP/IP, и через анонимные туннели I2P — и при этом отдаёт сообщения во внешние системы вроде Home Assistant.
Reticulum устроен именно так с самого начала: криптография — не надстройка, а часть протокола; транспорт абстрагирован (LoRa, Wi‑Fi, TCP, I2P — для сети это просто разные интерфейсы, а не разные сети); есть готовый протокол сообщений LXMF со store‑and‑forward доставкой. Это ближе к «построить свою инфраструктуру связи», чем «поставить рацию с приложением».
Плюс — вокруг Reticulum уже сложилась своя экосистема: NomadNet, LXMF‑клиенты (Sideband, CrossTalk), фреймворк для ботов lxmfy. Не пришлось изобретать велосипед там, где можно было опереться на готовое и просто собрать всё вместе в удобный для управления шлюз.
Архитектура
Шлюз состоит из нескольких независимых systemd‑сервисов:
Сервис | Роль |
|---|---|
| демон Reticulum — ядро сети, маршрутизация |
| мост LXMF ↔ MQTT, на базе фреймворка lxmfy |
| Flask‑приложение, веб‑интерфейс на порту 8081 |
| демон I2P для анонимного туннелирования между шлюзами |
| нода децентрализованной инфосети |
| встроенный браузер для просмотра Nomadnet‑страниц |
LXMF Bridge → MQTT → Home Assistant
Основная рабочая связка. Любой LXMF‑клиент (Sideband, CrossTalk) отправляет сообщение на адрес шлюза — оно публикуется в MQTT‑топик message/lxmf/receive, откуда его подхватывает автоматизация в Home Assistant:
alias: LXMF Light Control
trigger:
- platform: mqtt
topic: message/lxmf/receive
condition:
- condition: template
value_template: "{{ 'свет вкл' in trigger.payload_json.content | lower }}"
action:
- service: light.turn_on
target:
entity_id: light.living_room
Отправляешь «свет вкл» с телефона по LoRa — свет включается. Без интернета, без сотовой связи.
Access Control и дедупликация
При активной mesh‑сети с несколькими маршрутами одно и то же сообщение может прилететь несколько раз (разные пути через разные узлы). Оба тракта (Bridge и встроенный чат) хранят hash каждого сообщения в памяти 1 час и молча отбрасывают повторы — иначе автоматизация в HA срабатывала бы по два раза.
Отдельно — whitelist по LXMF‑адресам с rate limiting, чтобы кто угодно из mesh‑сети не мог спамить командами на твой шлюз.
Локальный AI
Последнее добавление — команда /ask. Bridge обращается к любому OpenAI‑совместимому /completion‑эндпоинту (у меня — llama-server на отдельной машине с видеокартой) и присылает ответ отдельным LXMF‑сообщением:
[llm]
enabled = 1
url = http://IP:PORT/completion
max_tokens = 256
system_prompt = You are a helpful assistant reachable over a Reticulum mesh. Keep answers short.
Запрос идёт в отдельном потоке, чтобы не блокировать обработку остальных сообщений пока модель генерирует ответ (это может занимать десятки секунд на слабом железе).
Веб‑дашборд
Все действия — без SSH, через браузер: мониторинг сервисов и mesh‑топологии, редактор конфигов Reticulum (включая визуальную форму для добавления интерфейсов), логи в реальном времени, бэкап/восстановление всех identity‑ключей одним архивом, обновление из GitHub в один клик.
Интерфейс двуязычный (RU/EN), с переключателем в шапке.
Установка
git clone https://github.com/e2ret/NOEMA-RNSGate-Lite.git
cd NOEMA-RNSGate-Lite && sudo bash install.sh
Требования: Debian/Ubuntu, Python 3.10+, root. Работает на Orange Pi, Raspberry Pi, старом ноутбуке, VM на Proxmox — везде одинаково.
Что дальше
В ближайших планах — двуязычная документация уже готова, дальше хочется довести до ума мониторинг качества LoRa‑канала (сейчас телеметрия есть, но хочется более понятной визуализации для настройки антенны), и разобраться с интеграцией дополнительных радио‑каналов помимо LoRa — благо архитектура Reticulum это в принципе позволяет, было бы время. Команда /ask с локальным AI — тоже только начало: дальше можно добавить контекст (историю переписки, данные с датчиков Home Assistant) прямо в промпт, чтобы ассистент отвечал не абстрактно, а с пониманием текущего состояния дома.
Если у кого‑то из читателей есть свой Reticulum‑узел или идеи — welcome в issues на GitHub или в Telegram, буду рад обратной связи.
Исходники: github.com/e2ret/NOEMA‑RNSGate‑Lite Обсуждение: Telegram