📌 Это третья часть цикла. Часть 1: Теория, Часть 2: Практика.


🔗 Что будем интегрировать

КомпонентНазначениеСложность
ONEmesh MQTTМост между локальной сетью и глобальной картой + уведомления в Telegram🟢 Низкая
Home AssistantСенсоры нод, device_tracker, автоматизации на сообщения из сети🟡 Средняя
УведомленияАлерты о новых нодах, потере связи, упоминаниях в чате🟢 Низкая

💡 Все примеры проверены на: HA 2026.4.2 (Docker) + Orange Pi 3B + встроенный MQTT-брокер.


🌐 Шаг 1: Настройка MQTT в Meshtastic для ONEmesh

Параметры подключения

ПараметрЗначениеПримечание
MQTT Addressmqtt.onemesh.ruСервер сообщества
UsernameonemeshПо умолчанию
PasswordonecatОбщий для всех
Root topicmsh/RU/XXXXXX = код города (список)
TLS enabledYesЕсли не работает - попробуйте No
JSON enabledYesОбязательно для Home Assistant
Uplink / DownlinkYes / NoДля мониторинга достаточно только uplink

⚠️ Важно: в прошивке 2.5+ появилась поддержка нового формата ключей шифрования (PKI). Если используете шифрование - убедитесь, что ключи синхронизированы между нодами.

Как проверить работу

  1. Включите JSON enabled в настройках MQTT
  2. Подключитесь к брокеру через mosquitto_sub или MQTT Explorer:
mosquitto_sub -h mqtt.onemesh.ru -u onemesh -P onecat \
  -t 'msh/RU/MOW/json/#' -v
  1. Вы увидите сообщения вида:
{
  "id": 452664778,
  "from": 2130636288,
  "payload": {
    "text": "Привет из локальной сети!",
    "battery_level": 87,
    "voltage": 4.12
  },
  "type": "text",
  "timestamp": 1714234567
}

📬 Шаг 2: Уведомления в Telegram через ONEmesh Bot

ONEmesh автоматически пересылает сообщения из вашей городской темы в приватный чат с ботом.

Примеры уведомлений

[26.04.2026 20:52] ONEmesh Bot: LF | qwrt (https://map.onemesh.ru/?node_id=483535916)  QWRT Pocket
20, cтaндapт. a вoт для дoмaшнeй нoды aнтeннa тpиaдa
SNR 4.75  RSSI -92  HopLimit 3
- данные от 44b4 (https://map.onemesh.ru/?node_id=49169588)
ПолеЧто означаетЗачем нужно
SNRSignal-to-Noise RatioКачество сигнала: чем выше, тем лучше
RSSIReceived Signal StrengthМощность сигнала: ближе к 0 = лучше
HopLimitОставшееся число прыжковПоказывает, насколько далеко ушло сообщение

Как настроить

  1. Найдите бота @ONEmeshBot в Telegram
  2. Отправьте /start - бот покажет инструкции
  3. Убедитесь, что ваша нода отправляет данные в MQTT с правильным root topic
  4. Готово: уведомления будут приходить автоматически

💡 Совет: если уведомления не приходят - проверьте, что OK to MQTT включено в настройках канала и нода имеет интернет-соединение.


🏠 Шаг 3: Интеграция с Home Assistant

Предварительные требования

  • Встроенный MQTT-брокер в HA (Settings → Devices & Services → MQTT)
  • Meshtastic-нода с включённым JSON enabled в MQTT
  • Доступ к configuration.yaml и возможность создавать mqtt.yaml

Шаг 3.1: Подключение MQTT в HA

# configuration.yaml
mqtt: !include mqtt.yaml
# mqtt.yaml
broker: core-mosquitto # или адрес вашего брокера
port: 1883
username: homeassistant
password: !secret mqtt_password
# Если используете внешний брокер (например, ONEmesh):
# broker: mqtt.onemesh.ru
# port: 8883
# username: onemesh
# password: onecat
# certificate: /config/certs/ca.crt  # для TLS

Шаг 3.2: Создание сенсоров для ноды

# mqtt.yaml - продолжение
sensor:
  # Батарея ноды
  - name: "Meshtastic Node Battery"
    unique_id: "meshtastic_node_battery"
    state_topic: "msh/RU/MOW/json/LongFast/!abcd1234"
    value_template: >-
      {% if value_json.from == 2130636288 and value_json.payload.battery_level is defined %}
        {{ value_json.payload.battery_level | int }}
      {% else %}
        {{ this.state }}
      {% endif %}
    unit_of_measurement: "%"
    device_class: battery

  # Напряжение
  - name: "Meshtastic Node Voltage"
    unique_id: "meshtastic_node_voltage"
    state_topic: "msh/RU/MOW/json/LongFast/!abcd1234"
    value_template: >-
      {% if value_json.from == 2130636288 and value_json.payload.voltage is defined %}
        {{ value_json.payload.voltage | float | round(2) }}
      {% else %}
        {{ this.state }}
      {% endif %}
    unit_of_measurement: "V"
    device_class: voltage

  # Канал утилизации (загрузка эфира)
  - name: "Meshtastic Channel Utilization"
    unique_id: "meshtastic_chutil"
    state_topic: "msh/RU/MOW/json/LongFast/!abcd1234"
    value_template: >-
      {% if value_json.from == 2130636288 and value_json.payload.channel_utilization is defined %}
        {{ value_json.payload.channel_utilization | float | round(1) }}
      {% else %}
        {{ this.state }}
      {% endif %}
    unit_of_measurement: "%"

🔑 Важно: замените 2130636288 на десятичный from вашей ноды (найдите в MQTT Explorer или через meshtastic --info).

Шаг 3.3: Отслеживание местоположения (device_tracker)

# automations.yaml
- alias: "Meshtastic: Update node location"
  trigger:
    platform: mqtt
    topic: "msh/RU/MOW/json/LongFast/!abcd1234"
    value_template: >-
      {% if value_json.from == 2130636288 and 
            value_json.payload.latitude_i is defined and 
            value_json.payload.longitude_i is defined %}on{% endif %}
  action:
    service: device_tracker.see
    data:
      dev_id: "meshtastic_node_1"
      gps:
        - "{{ (trigger.payload_json.payload.latitude_i | int * 1e-7) }}"
        - "{{ (trigger.payload_json.payload.longitude_i | int * 1e-7) }}"
      battery: "{{ states('sensor.meshtastic_node_battery') | default(0) }}"

💡 Meshtastic хранит координаты в формате integer * 1e7, поэтому умножаем на 1e-7 для получения реальных значений.

Шаг 3.4: Уведомления о сообщениях из сети

# automations.yaml
- alias: "Meshtastic: Notify on mention"
  trigger:
    platform: mqtt
    topic: "msh/RU/MOW/json/LongFast/!abcd1234"
    value_template: >-
      {% if value_json.type == "text" and 
            value_json.payload.text is defined and 
            "ponf" in value_json.payload.text.lower() %}on{% endif %}
  action:
    service: notify.mobile_app_your_phone
    data:
      title: "📡 Meshtastic"
      message: "Упоминание: {{ trigger.payload_json.payload.text }}"
      data:
        priority: high

🔐 Безопасность: шифрование и ключи

Что изменилось в прошивке 2.5+

ВерсияТип ключейОсобенности
< 2.5Единый PSK для каналаПростая настройка, но уязвимо при компрометации
≥ 2.5PKI + shared secretОтдельные ключи для шифрования и аутентификации

Как настроить шифрование

  1. В приложении Meshtastic: Channel → Primary → PSK
    • Включите шифрование
    • Скопируйте ключ (он же AQ== для базового канала)
  2. В настройках MQTT: Encryption enabled → Yes
  3. Убедитесь, что все ноды в сети используют одинаковый ключ

⚠️ Критично: если ключи не совпадают - сообщения будут приходить, но не расшифровываться. Проверяйте через MQTT Explorer.

Где хранить ключи

  • ✅ В secrets.yaml Home Assistant (не коммитить в Git!)
  • ✅ В менеджере паролей (Bitwarden, KeePassXC)
  • ❌ Не в публичных репозиториях, не в логах, не в скриншотах

⚠️ Частые проблемы

СимптомПричинаРешение
Сенсоры не обновляютсяНеверный from в value_templateНайдите десятичный ID ноды через meshtastic --info
Нет сообщений в TelegramНеправильный root topicПроверьте код города: msh/RU/MOW, msh/RU/SPB и т.д.
Шифрование не работаетКлючи не совпадаютСкопируйте PSK точно, без пробелов, в обе ноды
device_tracker не двигаетсяКоординаты в неверном форматеУмножайте latitude_i/longitude_i на 1e-7
HA не подключается к брокеруНеверные учётные данныеПроверьте username/password и порт (1883/8883)

Ссылки