mikrotik-wiki.ru
Главная
Загрузка...

IoT на MikroTik — Bluetooth, LoRa и MQTT

RouterOS 7.xIoT12 мин30 мар. 2026 г.
TelegramVK

MikroTik активно развивает направление IoT (Internet of Things), предлагая устройства со встроенной поддержкой Bluetooth Low Energy (BLE), LoRa и MQTT. Это позволяет использовать маршрутизатор не только для передачи данных, но и как IoT-шлюз — собирать информацию с датчиков, маяков, GPS-модулей и отправлять её в облачные платформы или локальные системы мониторинга. В этом руководстве подробно рассмотрим все IoT-возможности RouterOS 7.20+: сканирование BLE, работу с LoRa, интеграцию через MQTT и практические сценарии использования.

Описание

IoT-устройства MikroTik

MikroTik выпускает несколько устройств с IoT-функциональностью:

УстройствоBLELoRaGPSОписание
KNOT (RB924iR-2nD-BT5&BG77)ДаНетДа (LTE)Компактный IoT-шлюз с BLE и LTE
TG-BT5-INДаНетНетBLE-тег для трекинга и мониторинга
TG-BT5-OUTДаНетНетУличный BLE-тег (IP65)
hAP ax²ДаНетНетДомашний роутер с BLE
hAP ax³ДаНетНетПродвинутый домашний роутер с BLE
hAP be³ MediaДаНетНетIoT-хаб с BLE и Thread
LORA8 kitНетДаНетLoRa-шлюз (8 каналов)
LORA2 kitНетДаНетLoRa-шлюз (2 канала)
LtAPДаДа (опц.)ДаМобильный шлюз с LTE/GPS/LoRa

Ключевое преимущество подхода MikroTik — IoT-функции интегрированы в RouterOS, а значит, не нужен отдельный шлюз. Маршрутизатор одновременно обеспечивает сетевую связность и собирает IoT-данные.

Стек IoT-протоколов

code
┌─────────────────────────────────────┐
│         Облако / Платформа          │
│  (Home Assistant, Grafana, AWS IoT) │
└──────────────┬──────────────────────┘
               │ MQTT / HTTP / WebSocket
┌──────────────┴──────────────────────┐
│        MikroTik (IoT Gateway)       │
│  RouterOS: /iot/bluetooth, /iot/mqtt│
└──┬──────────────┬───────────────────┘
   │ BLE          │ LoRa (868/915 MHz)
┌──┴───┐    ┌─────┴─────┐
│Датчики│    │LoRa-ноды  │
│Маяки  │    │Счётчики   │
└───────┘    └───────────┘

Настройка

Bluetooth Low Energy (BLE)

BLE — энергоэффективный беспроводной протокол ближнего действия (до 50-100 м). MikroTik использует BLE для двух основных задач: сканирование (приём данных от BLE-устройств) и advertising (трансляция собственных маяков).

Сканирование BLE-устройств

BLE-сканирование позволяет обнаруживать все BLE-устройства в радиусе действия и читать их данные (advertisement packets).

[admin@MikroTik] >
# Проверяем наличие BLE-интерфейса
/iot/bluetooth print

# Запускаем BLE-сканирование
/iot/bluetooth/scanners add name=scanner1 interface=bt1 \
  filter-type=or filter-policy=accept

# Запускаем сканер
/iot/bluetooth/scanners/start scanner1

# Просматриваем обнаруженные устройства
/iot/bluetooth/scanners/advertisements print
# Увидим MAC-адреса, RSSI, тип маяка, данные

Каждое обнаруженное устройство характеризуется параметрами:

ПараметрОписание
addressMAC-адрес BLE-устройства
address-typepublic или random
rssiУровень сигнала (dBm), чем ближе к 0 — тем сильнее
ad-structuresДанные advertisement-пакета в hex
epochВремя обнаружения

Типы BLE-маяков

iBeacon (Apple) — маяки с UUID, Major и Minor. Используются для indoor-навигации и presence detection:

[admin@MikroTik] >
# Фильтр только для iBeacon
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-uuid="FDA50693-A4E2-4FB1-AFCF-C0BFEC878DC7"

Eddystone (Google) — маяки с поддержкой URL, UID и TLM (телеметрия: температура батареи, напряжение):

[admin@MikroTik] >
# Фильтр для Eddystone
# Eddystone Service UUID: 0xFEAA
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-service-uuid=FEAA

Ruuvi Tag — популярный BLE-датчик температуры, влажности, давления и ускорения. Данные передаются в формате RAWv2:

[admin@MikroTik] >
# Фильтр для Ruuvi (Manufacturer ID: 0x0499)
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-manufacturer-id=0x0499

Advertising (трансляция BLE-маяков)

MikroTik может не только сканировать, но и транслировать собственные BLE-маяки:

[admin@MikroTik] >
# Создаём iBeacon-маяк
/iot/bluetooth/advertisers add name=my-beacon interface=bt1 \
  ad-structures="02:01:06:1A:FF:4C:00:02:15:FDA50693:A4E24FB1:AFCFC0BF:EC878DC7:00:01:00:01:C5"

# Запускаем трансляцию
/iot/bluetooth/advertisers/start my-beacon

Это позволяет использовать MikroTik как iBeacon для систем indoor-навигации или presence detection.

Сценарий: подсчёт посетителей (presence detection)

Сценарий: в торговом центре установлены MikroTik с BLE. Роутер сканирует BLE-устройства (смартфоны с включённым Bluetooth) и считает уникальные MAC-адреса:

[admin@MikroTik] >
# Скрипт подсчёта уникальных BLE-устройств за последние 5 минут
/system/script add name=ble-count-visitors source={
  :local count 0
  :local threshold (-70)
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find] do={
    :local rssi [/iot/bluetooth/scanners/advertisements get $adv rssi]
    :if ($rssi > $threshold) do={
      :set count ($count + 1)
    }
  }
  :log info "BLE visitors nearby: $count"
  # Отправка в MQTT (см. раздел MQTT)
  /iot/mqtt/publish broker=mqtt1 topic="mikrotik/visitors" \
    message="{\"count\":$count,\"timestamp\":\"$[/system/clock/print as-value]\"}"
}

# Запускаем по расписанию каждые 5 минут
/system/scheduler add name=visitor-count interval=5m \
  on-event="/system/script/run ble-count-visitors"

Важно: рандомизация MAC-адресов в современных смартфонах (iOS 14+, Android 10+) усложняет точный подсчёт. Результат будет приблизительным.

Сценарий: мониторинг температуры (Ruuvi Tag)

Ruuvi Tag — BLE-датчик, передающий температуру, влажность и давление. MikroTik может читать эти данные и отправлять в систему мониторинга:

[admin@MikroTik] >
# Скрипт чтения данных Ruuvi Tag
/system/script add name=ruuvi-read source={
  :local ruuviMac "AA:BB:CC:DD:EE:FF"
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find \
    where address=$ruuviMac] do={
    :local data [/iot/bluetooth/scanners/advertisements get $adv ad-structures]
    # Парсинг RAWv2 формата Ruuvi
    # Температура: байты 3-4 (signed, 0.005 градуса)
    # Влажность: байты 5-6 (0.0025%)
    # Давление: байты 7-8 (Pa + 50000)
    :log info "Ruuvi data: $data"
    # Полный парсинг требует скриптовой обработки hex-данных
  }
}

/system/scheduler add name=ruuvi-monitor interval=1m \
  on-event="/system/script/run ruuvi-read"

LoRa (Long Range)

LoRa — технология передачи данных на большие расстояния (до 15 км) при малом энергопотреблении. Работает на нелицензируемых частотах: 868 МГц (Европа/Россия) или 915 МГц (США).

LoRa-устройства MikroTik

MikroTik предлагает LoRa-шлюзы, работающие по стандарту LoRaWAN:

  • LORA8 kit — 8-канальный шлюз для production-деплоя
  • LORA2 kit — 2-канальный шлюз для тестирования и небольших проектов
  • LtAP — мобильный шлюз (LTE + LoRa + GPS)

Настройка LoRa-шлюза

[admin@MikroTik] >
# Проверяем наличие LoRa-интерфейса
/iot/lora print

# Настраиваем LoRa-шлюз
/iot/lora set 0 antenna-gain=3 channel-plan=eu868 \
  disabled=no forward-crc-disabled=no forward-crc-error=no \
  forward-crc-valid=yes name=lora1 network=private

# Настраиваем серверы (Packet Forwarder → Network Server)
/iot/lora/servers add name=chirpstack address=192.168.88.100 \
  down-port=1700 up-port=1700 protocol=UDP

Интеграция с ChirpStack

ChirpStack — открытый LoRaWAN Network Server. Устанавливается на сервер в вашей сети или в контейнер на MikroTik:

[admin@MikroTik] >
# Привязываем LoRa-шлюз к ChirpStack
/iot/lora/servers set 0 address=192.168.88.100 \
  up-port=1700 down-port=1700

# В ChirpStack добавляем шлюз по его Gateway EUI
/iot/lora print
# Копируем gateway-id (EUI) и добавляем в ChirpStack Dashboard

Интеграция с The Things Network (TTN)

[admin@MikroTik] >
# Подключаем LoRa-шлюз к TTN
/iot/lora/servers add name=ttn \
  address=eu1.cloud.thethings.network \
  up-port=1700 down-port=1700 protocol=UDP

Зарегистрируйте шлюз в консоли TTN (console.thethingsnetwork.org) с указанием Gateway EUI.

Сценарии LoRa

  • Умное земледелие — датчики влажности почвы на полях, передача данных на LoRa-шлюз
  • Мониторинг зданий — датчики протечек, задымления, температуры
  • Трекинг активов — GPS-трекеры на транспорте, передающие координаты через LoRa
  • Умные счётчики — показания электричества и воды через LoRaWAN

MQTT (Message Queuing Telemetry Transport)

MQTT — лёгкий протокол обмена сообщениями, стандарт де-факто для IoT. RouterOS 7 имеет встроенный MQTT-клиент (publisher), позволяющий отправлять данные на любой MQTT-брокер.

Настройка MQTT-брокера

Для работы нужен MQTT-брокер. Популярные варианты:

  • Mosquitto — лёгкий, можно запустить в контейнере на MikroTik
  • EMQX — высокопроизводительный, для enterprise
  • Home Assistant — имеет встроенный брокер (Mosquitto add-on)
  • HiveMQ Cloud — облачный брокер (бесплатный тариф)

Настройка MQTT на MikroTik

[admin@MikroTik] >
# Добавляем MQTT-брокер
/iot/mqtt/brokers add name=mqtt1 address=192.168.88.100 port=1883 \
  client-id="mikrotik-router" username=mikrotik password=SecurePass123

# Для TLS-соединения (рекомендуется)
/iot/mqtt/brokers add name=mqtt-tls address=192.168.88.100 port=8883 \
  client-id="mikrotik-router" username=mikrotik password=SecurePass123 \
  ssl=yes

# Проверяем подключение
/iot/mqtt/brokers print
# connected: yes

Публикация данных в MQTT

[admin@MikroTik] >
# Публикация простого сообщения
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/status" \
  message="online"

# Публикация JSON с данными маршрутизатора
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/system" \
  message="{\"uptime\":\"$[/system/resource get uptime]\",\"cpu\":$[/system/resource get cpu-load],\"memory-free\":$[/system/resource get free-memory]}"

Скрипт периодической отправки телеметрии

[admin@MikroTik] >
/system/script add name=mqtt-telemetry source={
  :local cpuLoad [/system/resource get cpu-load]
  :local freeMemory [/system/resource get free-memory]
  :local totalMemory [/system/resource get total-memory]
  :local uptime [/system/resource get uptime]
  :local voltage ""
  :do {
    :set voltage [/system/health get 0 voltage]
  } on-error={
    :set voltage "N/A"
  }

  :local payload \
    "{\"cpu_load\":$cpuLoad,\"free_memory\":$freeMemory,\"total_memory\":$totalMemory,\"uptime\":\"$uptime\",\"voltage\":\"$voltage\"}"

  /iot/mqtt/publish broker=mqtt1 topic="mikrotik/telemetry" \
    message=$payload
}

/system/scheduler add name=mqtt-telemetry-schedule interval=1m \
  on-event="/system/script/run mqtt-telemetry"

Скрипт отправки BLE-данных через MQTT

Объединяем BLE-сканирование с MQTT для создания полноценного IoT-пайплайна:

[admin@MikroTik] >
/system/script add name=ble-to-mqtt source={
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find] do={
    :local mac [/iot/bluetooth/scanners/advertisements get $adv address]
    :local rssi [/iot/bluetooth/scanners/advertisements get $adv rssi]
    :local data [/iot/bluetooth/scanners/advertisements get $adv ad-structures]

    :local payload \
      "{\"mac\":\"$mac\",\"rssi\":$rssi,\"data\":\"$data\"}"

    /iot/mqtt/publish broker=mqtt1 \
      topic="mikrotik/ble/$mac" message=$payload
  }
}

/system/scheduler add name=ble-mqtt-schedule interval=30s \
  on-event="/system/script/run ble-to-mqtt"

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

Home Assistant — популярная open-source платформа для умного дома. MikroTik интегрируется через MQTT:

Настройка на стороне Home Assistant

В configuration.yaml Home Assistant:

yaml
mqtt:
  sensor:
    - name: "MikroTik CPU Load"
      state_topic: "mikrotik/telemetry"
      value_template: "{{ value_json.cpu_load }}"
      unit_of_measurement: "%"
    - name: "MikroTik Free Memory"
      state_topic: "mikrotik/telemetry"
      value_template: "{{ value_json.free_memory }}"
      unit_of_measurement: "B"
    - name: "BLE Visitors"
      state_topic: "mikrotik/visitors"
      value_template: "{{ value_json.count }}"

Автоматизация в Home Assistant

yaml
automation:
  - alias: "MikroTik High CPU Alert"
    trigger:
      platform: mqtt
      topic: "mikrotik/telemetry"
    condition:
      condition: template
      value_template: "{{ trigger.payload_json.cpu_load > 80 }}"
    action:
      service: notify.telegram
      data:
        message: "MikroTik CPU загружен на {{ trigger.payload_json.cpu_load }}%"

GPS

Некоторые устройства MikroTik (KNOT, LtAP) имеют встроенный GPS-модуль:

[admin@MikroTik] >
# Проверяем наличие GPS
/system/gps print

# Включаем GPS
/system/gps set enabled=yes channel=0 coordinate-format=dd

# Читаем координаты
/system/gps/monitor
# latitude: 55.751244
# longitude: 37.618423
# altitude: 156.3
# speed: 0.0
# satellites: 8
# valid: yes

Отправка GPS-координат через MQTT

[admin@MikroTik] >
/system/script add name=gps-to-mqtt source={
  :local gps [/system/gps/monitor once as-value]
  :local lat ($gps->"latitude")
  :local lon ($gps->"longitude")
  :local speed ($gps->"speed")
  :local satellites ($gps->"satellites")
  :local valid ($gps->"valid")

  :if ($valid = true) do={
    :local payload \
      "{\"lat\":$lat,\"lon\":$lon,\"speed\":$speed,\"satellites\":$satellites}"
    /iot/mqtt/publish broker=mqtt1 topic="mikrotik/gps" \
      message=$payload
  }
}

/system/scheduler add name=gps-mqtt-schedule interval=10s \
  on-event="/system/script/run gps-to-mqtt"

Отправка данных в Telegram

Для уведомлений можно отправлять IoT-данные напрямую в Telegram через webhook:

[admin@MikroTik] >
/system/script add name=iot-telegram-alert source={
  :local botToken "123456:ABC-DEF..."
  :local chatId "-100123456789"

  :local cpuLoad [/system/resource get cpu-load]
  :local visitors 0
  # Подсчёт BLE-устройств с RSSI > -70
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find] do={
    :local rssi [/iot/bluetooth/scanners/advertisements get $adv rssi]
    :if ($rssi > -70) do={
      :set visitors ($visitors + 1)
    }
  }

  :local message "MikroTik IoT Report:\nCPU: $cpuLoad%\nBLE visitors: $visitors"

  /tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage" \
    http-method=post http-data="chat_id=$chatId&text=$message" \
    output=none
}

Проверка

Проверка BLE

[admin@MikroTik] >
# Статус BLE-интерфейса
/iot/bluetooth print
# Должен показать: name="bt1" type="BLE"

# Статус сканера
/iot/bluetooth/scanners print
# state: running

# Обнаруженные устройства
/iot/bluetooth/scanners/advertisements print
# Должен показать список устройств с MAC, RSSI, данными

# Количество обнаруженных устройств
/iot/bluetooth/scanners/advertisements print count-only

Проверка LoRa

[admin@MikroTik] >
# Статус LoRa-интерфейса
/iot/lora print
# disabled: no, channel-plan: eu868

# Статус серверов
/iot/lora/servers print
# Проверяем, что сервер добавлен и статус active

# Полученные пакеты (если есть LoRa-устройства поблизости)
/iot/lora print stats

Проверка MQTT

[admin@MikroTik] >
# Статус MQTT-брокера
/iot/mqtt/brokers print
# connected: yes — брокер подключён

# Тестовая публикация
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/test" \
  message="Hello from MikroTik"

# На стороне брокера (mosquitto_sub или MQTT Explorer):
# Подписаться на mikrotik/# и убедиться, что сообщения приходят

Проверка GPS

[admin@MikroTik] >
# Мониторинг GPS в реальном времени
/system/gps/monitor
# valid: yes — GPS-фиксация получена
# satellites: 8+ — достаточное количество спутников

Типичные ошибки

1. BLE-сканер не обнаруживает устройства

Причина: BLE-интерфейс отключён, сканер не запущен, или устройства вне зоны действия.

Решение:

[admin@MikroTik] >
# Проверяем, что BLE-интерфейс включён
/iot/bluetooth print
# Если disabled: yes
/iot/bluetooth set bt1 disabled=no

# Проверяем, что сканер запущен
/iot/bluetooth/scanners print
# Если state: idle — запускаем
/iot/bluetooth/scanners/start scanner1

# Убеждаемся, что BLE-устройство рядом (в пределах 10-30 м)
# BLE имеет ограниченный радиус, стены сильно ослабляют сигнал

2. MQTT-брокер не подключается — "connection refused"

Причина: неверный адрес, порт, логин/пароль, или firewall блокирует соединение.

Решение:

[admin@MikroTik] >
# Проверяем доступность брокера
/ping 192.168.88.100 count=3
/tool/fetch url="http://192.168.88.100:1883" mode=http
# Ошибка HTTP — нормально, важно что TCP-соединение устанавливается

# Проверяем параметры подключения
/iot/mqtt/brokers print detail
# address, port, username, password — всё верно?

# Проверяем firewall на стороне брокера
# Mosquitto по умолчанию слушает на 1883 (TCP)

# Для TLS — проверяем порт 8883 и наличие сертификата
/iot/mqtt/brokers set mqtt1 ssl=no
# Если без TLS работает — проблема в сертификатах

3. LoRa-шлюз не получает пакеты

Причина: неправильный channel-plan, антенна не подключена, или LoRa-устройства настроены на другую частоту.

Решение:

[admin@MikroTik] >
# Проверяем channel-plan (для России/Европы — eu868)
/iot/lora print
# channel-plan: eu868

# Убеждаемся, что антенна подключена
# LoRa без антенны практически не работает!

# Проверяем, что LoRa-устройства настроены на ту же частотную зону
# и зарегистрированы в Network Server (ChirpStack/TTN)

4. MQTT-сообщения не приходят в Home Assistant

Причина: неверный topic, Home Assistant не подписан, или брокер другой.

Решение:

  1. Проверьте, что MikroTik и Home Assistant используют один MQTT-брокер
  2. В MQTT Explorer подпишитесь на mikrotik/# — сообщения должны быть видны
  3. Проверьте формат JSON — Home Assistant не распарсит невалидный JSON:
[admin@MikroTik] >
# Тестовое сообщение с валидным JSON
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/test" \
  message="{\"test\":\"hello\",\"value\":42}"

5. BLE-данные Ruuvi Tag не парсятся

Причина: скриптовый парсинг hex-данных в RouterOS сложен и подвержен ошибкам.

Решение: отправляйте сырые hex-данные через MQTT и парсите их на стороне Home Assistant или Node-RED:

[admin@MikroTik] >
# Отправляем сырые данные, парсинг — на стороне получателя
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/ruuvi/raw" \
  message="{\"mac\":\"$mac\",\"raw\":\"$data\"}"

В Node-RED или Home Assistant используйте готовые библиотеки для парсинга Ruuvi RAWv2.

6. Скрипт с MQTT-публикацией завершается с ошибкой

Причина: MQTT-брокер отключился, или скрипт слишком часто вызывается и не успевает отработать.

Решение:

[admin@MikroTik] >
# Оберните публикацию в :do { } on-error={}
/system/script add name=safe-mqtt-publish source={
  :do {
    /iot/mqtt/publish broker=mqtt1 topic="mikrotik/data" \
      message="{\"status\":\"ok\"}"
  } on-error={
    :log warning "MQTT publish failed — broker disconnected?"
  }
}

# Увеличьте интервал scheduler, если скрипт не успевает
/system/scheduler set mqtt-telemetry-schedule interval=2m

7. GPS не получает фиксацию (valid: no)

Причина: устройство находится внутри здания, GPS-антенна не подключена или закрыта металлом.

Решение:

[admin@MikroTik] >
# Проверяем статус GPS
/system/gps/monitor
# valid: no, satellites: 0 — нет связи со спутниками

# GPS требует прямой видимости неба
# Переместите устройство к окну или установите внешнюю GPS-антенну

# Проверяем, что GPS включён
/system/gps print
# enabled: yes

Рекомендации по архитектуре IoT на MikroTik

  • BLE — используйте для indoor-сценариев: мониторинг помещений, presence detection, трекинг активов в здании. Радиус действия 10-50 м.
  • LoRa — используйте для outdoor-сценариев: мониторинг территории, сельское хозяйство, умный город. Радиус действия до 15 км.
  • MQTT — основной транспорт для передачи IoT-данных. Всегда используйте TLS для защиты.
  • Скрипты — минимизируйте нагрузку: не запускайте скрипты чаще чем раз в 30 секунд на маломощных устройствах.
  • Разделение сетей — IoT-устройства должны находиться в отдельном VLAN с ограниченным доступом к основной сети.
[admin@MikroTik] >
┌─────────────────────────────────────┐
│         Облако / Платформа          │
│  (Home Assistant, Grafana, AWS IoT) │
└──────────────┬──────────────────────┘
               │ MQTT / HTTP / WebSocket
┌──────────────┴──────────────────────┐
│        MikroTik (IoT Gateway)       │
│  RouterOS: /iot/bluetooth, /iot/mqtt│
└──┬──────────────┬───────────────────┘
   │ BLE          │ LoRa (868/915 MHz)
┌──┴───┐    ┌─────┴─────┐
│Датчики│    │LoRa-ноды  │
│Маяки  │    │Счётчики   │
└───────┘    └───────────┘
# Проверяем наличие BLE-интерфейса
/iot/bluetooth print

# Запускаем BLE-сканирование
/iot/bluetooth/scanners add name=scanner1 interface=bt1 \
  filter-type=or filter-policy=accept

# Запускаем сканер
/iot/bluetooth/scanners/start scanner1

# Просматриваем обнаруженные устройства
/iot/bluetooth/scanners/advertisements print
# Увидим MAC-адреса, RSSI, тип маяка, данные
# Фильтр только для iBeacon
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-uuid="FDA50693-A4E2-4FB1-AFCF-C0BFEC878DC7"
# Фильтр для Eddystone
# Eddystone Service UUID: 0xFEAA
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-service-uuid=FEAA
# Фильтр для Ruuvi (Manufacturer ID: 0x0499)
/iot/bluetooth/scanners set scanner1 \
  filter-type=or filter-manufacturer-id=0x0499
# Создаём iBeacon-маяк
/iot/bluetooth/advertisers add name=my-beacon interface=bt1 \
  ad-structures="02:01:06:1A:FF:4C:00:02:15:FDA50693:A4E24FB1:AFCFC0BF:EC878DC7:00:01:00:01:C5"

# Запускаем трансляцию
/iot/bluetooth/advertisers/start my-beacon
# Скрипт подсчёта уникальных BLE-устройств за последние 5 минут
/system/script add name=ble-count-visitors source={
  :local count 0
  :local threshold (-70)
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find] do={
    :local rssi [/iot/bluetooth/scanners/advertisements get $adv rssi]
    :if ($rssi > $threshold) do={
      :set count ($count + 1)
    }
  }
  :log info "BLE visitors nearby: $count"
  # Отправка в MQTT (см. раздел MQTT)
  /iot/mqtt/publish broker=mqtt1 topic="mikrotik/visitors" \
    message="{\"count\":$count,\"timestamp\":\"$[/system/clock/print as-value]\"}"
}

# Запускаем по расписанию каждые 5 минут
/system/scheduler add name=visitor-count interval=5m \
  on-event="/system/script/run ble-count-visitors"
# Скрипт чтения данных Ruuvi Tag
/system/script add name=ruuvi-read source={
  :local ruuviMac "AA:BB:CC:DD:EE:FF"
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find \
    where address=$ruuviMac] do={
    :local data [/iot/bluetooth/scanners/advertisements get $adv ad-structures]
    # Парсинг RAWv2 формата Ruuvi
    # Температура: байты 3-4 (signed, 0.005 градуса)
    # Влажность: байты 5-6 (0.0025%)
    # Давление: байты 7-8 (Pa + 50000)
    :log info "Ruuvi data: $data"
    # Полный парсинг требует скриптовой обработки hex-данных
  }
}

/system/scheduler add name=ruuvi-monitor interval=1m \
  on-event="/system/script/run ruuvi-read"
# Проверяем наличие LoRa-интерфейса
/iot/lora print

# Настраиваем LoRa-шлюз
/iot/lora set 0 antenna-gain=3 channel-plan=eu868 \
  disabled=no forward-crc-disabled=no forward-crc-error=no \
  forward-crc-valid=yes name=lora1 network=private

# Настраиваем серверы (Packet Forwarder → Network Server)
/iot/lora/servers add name=chirpstack address=192.168.88.100 \
  down-port=1700 up-port=1700 protocol=UDP
# Привязываем LoRa-шлюз к ChirpStack
/iot/lora/servers set 0 address=192.168.88.100 \
  up-port=1700 down-port=1700

# В ChirpStack добавляем шлюз по его Gateway EUI
/iot/lora print
# Копируем gateway-id (EUI) и добавляем в ChirpStack Dashboard
# Подключаем LoRa-шлюз к TTN
/iot/lora/servers add name=ttn \
  address=eu1.cloud.thethings.network \
  up-port=1700 down-port=1700 protocol=UDP
# Добавляем MQTT-брокер
/iot/mqtt/brokers add name=mqtt1 address=192.168.88.100 port=1883 \
  client-id="mikrotik-router" username=mikrotik password=SecurePass123

# Для TLS-соединения (рекомендуется)
/iot/mqtt/brokers add name=mqtt-tls address=192.168.88.100 port=8883 \
  client-id="mikrotik-router" username=mikrotik password=SecurePass123 \
  ssl=yes

# Проверяем подключение
/iot/mqtt/brokers print
# connected: yes
# Публикация простого сообщения
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/status" \
  message="online"

# Публикация JSON с данными маршрутизатора
/iot/mqtt/publish broker=mqtt1 topic="mikrotik/system" \
  message="{\"uptime\":\"$[/system/resource get uptime]\",\"cpu\":$[/system/resource get cpu-load],\"memory-free\":$[/system/resource get free-memory]}"
/system/script add name=mqtt-telemetry source={
  :local cpuLoad [/system/resource get cpu-load]
  :local freeMemory [/system/resource get free-memory]
  :local totalMemory [/system/resource get total-memory]
  :local uptime [/system/resource get uptime]
  :local voltage ""
  :do {
    :set voltage [/system/health get 0 voltage]
  } on-error={
    :set voltage "N/A"
  }

  :local payload \
    "{\"cpu_load\":$cpuLoad,\"free_memory\":$freeMemory,\"total_memory\":$totalMemory,\"uptime\":\"$uptime\",\"voltage\":\"$voltage\"}"

  /iot/mqtt/publish broker=mqtt1 topic="mikrotik/telemetry" \
    message=$payload
}

/system/scheduler add name=mqtt-telemetry-schedule interval=1m \
  on-event="/system/script/run mqtt-telemetry"
/system/script add name=ble-to-mqtt source={
  :foreach adv in=[/iot/bluetooth/scanners/advertisements find] do={
    :local mac [/iot/bluetooth/scanners/advertisements get $adv address]
    :local rssi [/iot/bluetooth/scanners/advertisements get $adv rssi]
    :local data [/iot/bluetooth/scanners/advertisements get $adv ad-structures]

    :local payload \
      "{\"mac\":\"$mac\",\"rssi\":$rssi,\"data\":\"$data\"}"

    /iot/mqtt/publish broker=mqtt1 \
      topic="mikrotik/ble/$mac" message=$payload
  }
}

/system/scheduler add name=ble-mqtt-schedule interval=30s \
  on-event="/system/script/run ble-to-mqtt"
##### Автоматизация в Home Assistant
#### GPS

Некоторые устройства MikroTik (KNOT, LtAP) имеют встроенный GPS-модуль:
##### Отправка GPS-координат через MQTT
#### Отправка данных в Telegram

Для уведомлений можно отправлять IoT-данные напрямую в Telegram через webhook:
### Проверка

#### Проверка BLE
#### Проверка LoRa
#### Проверка MQTT
#### Проверка GPS
### Типичные ошибки

#### 1. BLE-сканер не обнаруживает устройства

**Причина**: BLE-интерфейс отключён, сканер не запущен, или устройства вне зоны действия.

**Решение**:
#### 2. MQTT-брокер не подключается — "connection refused"

**Причина**: неверный адрес, порт, логин/пароль, или firewall блокирует соединение.

**Решение**:
#### 3. LoRa-шлюз не получает пакеты

**Причина**: неправильный channel-plan, антенна не подключена, или LoRa-устройства настроены на другую частоту.

**Решение**:
#### 4. MQTT-сообщения не приходят в Home Assistant

**Причина**: неверный topic, Home Assistant не подписан, или брокер другой.

**Решение**:

1. Проверьте, что MikroTik и Home Assistant используют один MQTT-брокер
2. В MQTT Explorer подпишитесь на `mikrotik/#` — сообщения должны быть видны
3. Проверьте формат JSON — Home Assistant не распарсит невалидный JSON:
#### 5. BLE-данные Ruuvi Tag не парсятся

**Причина**: скриптовый парсинг hex-данных в RouterOS сложен и подвержен ошибкам.

**Решение**: отправляйте сырые hex-данные через MQTT и парсите их на стороне Home Assistant или Node-RED:
В Node-RED или Home Assistant используйте готовые библиотеки для парсинга Ruuvi RAWv2.

#### 6. Скрипт с MQTT-публикацией завершается с ошибкой

**Причина**: MQTT-брокер отключился, или скрипт слишком часто вызывается и не успевает отработать.

**Решение**:
#### 7. GPS не получает фиксацию (valid: no)

**Причина**: устройство находится внутри здания, GPS-антенна не подключена или закрыта металлом.

**Решение**:
IoT / IoT на MikroTik — Bluetooth, LoRa и MQTT