IoT на MikroTik — Bluetooth, LoRa и MQTT
MikroTik активно развивает направление IoT (Internet of Things), предлагая устройства со встроенной поддержкой Bluetooth Low Energy (BLE), LoRa и MQTT. Это позволяет использовать маршрутизатор не только для передачи данных, но и как IoT-шлюз — собирать информацию с датчиков, маяков, GPS-модулей и отправлять её в облачные платформы или локальные системы мониторинга. В этом руководстве подробно рассмотрим все IoT-возможности RouterOS 7.20+: сканирование BLE, работу с LoRa, интеграцию через MQTT и практические сценарии использования.
Описание
IoT-устройства MikroTik
MikroTik выпускает несколько устройств с IoT-функциональностью:
| Устройство | BLE | LoRa | GPS | Описание |
|---|---|---|---|---|
| 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, тип маяка, данные
Каждое обнаруженное устройство характеризуется параметрами:
| Параметр | Описание |
|---|---|
| address | MAC-адрес BLE-устройства |
| address-type | public или 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:
yamlmqtt: 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
yamlautomation: - 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 не подписан, или брокер другой.
Решение:
- Проверьте, что MikroTik и Home Assistant используют один MQTT-брокер
- В MQTT Explorer подпишитесь на
mikrotik/#— сообщения должны быть видны - Проверьте формат 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 с ограниченным доступом к основной сети.
┌─────────────────────────────────────┐
│ Облако / Платформа │
│ (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-антенна не подключена или закрыта металлом.
**Решение**: