Что это

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‑сервисов:

Сервис

Роль

rnsd

демон Reticulum — ядро сети, маршрутизация

noema_lxmf_bridge

мост LXMF ↔ MQTT, на базе фреймворка lxmfy

dashboard

Flask‑приложение, веб‑интерфейс на порту 8081

i2pd

демон I2P для анонимного туннелирования между шлюзами

nomadnet

нода децентрализованной инфосети

rbrowser

встроенный браузер для просмотра 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