MikroTik для умного дома — presence detection
MikroTik для умного дома — presence detection и автоматизация
MikroTik-маршрутизатор — не только сетевое оборудование, но и мощный инструмент автоматизации умного дома. Он видит все устройства в сети, знает, когда смартфон подключается к Wi-Fi (значит, владелец дома), умеет отправлять HTTP-запросы и MQTT-сообщения. В этом руководстве разберём, как превратить MikroTik в центр автоматизации: определение присутствия по Wi-Fi, управление устройствами через MQTT и webhooks, изоляция IoT-устройств в VLAN, интеграция с Home Assistant и полный пример настройки умного дома.
Описание
MikroTik как центр умного дома
Традиционный подход к умному дому предполагает отдельные хабы для каждого протокола: Zigbee-координатор, Z-Wave-контроллер, Wi-Fi-роутер, платформу автоматизации (Home Assistant). MikroTik позволяет объединить несколько ролей в одном устройстве:
| Функция | Традиционный подход | MikroTik |
|---|---|---|
| Wi-Fi | Роутер | Встроенный |
| Presence detection | Отдельная система | Скрипты на RouterOS |
| IoT-шлюз (BLE/Thread) | Отдельный хаб | Встроенный (hAP be³) |
| MQTT-клиент | Отдельный сервис | Встроенный /iot/mqtt |
| Сетевая изоляция IoT | Ручная настройка VLAN | Полный контроль VLAN/firewall |
| Мониторинг устройств | The Dude / Zabbix | Встроенный + интеграция |
Конечно, MikroTik не заменяет полноценную платформу (Home Assistant, openHAB), но дополняет её, предоставляя сетевой уровень автоматизации.
Архитектура умного дома на MikroTik
code┌─────────────────────────────────────────────┐ │ Интернет │ └──────────────┬──────────────────────────────┘ │ ┌──────────────┴──────────────────────────────┐ │ MikroTik (hAP ax³ / hAP be³) │ │ ┌─────────────────────────────────────────┐ │ │ │ Wi-Fi: presence detection │ │ │ │ VLAN 10: основная сеть (ПК, телефоны) │ │ │ │ VLAN 20: IoT-устройства │ │ │ │ VLAN 30: гостевая сеть │ │ │ │ MQTT: уведомления и управление │ │ │ │ Scripts: автоматизация │ │ │ └─────────────────────────────────────────┘ │ └───┬──────────────┬───────────────┬──────────┘ │ VLAN 10 │ VLAN 20 │ VLAN 30 ┌───┴───┐ ┌─────┴─────┐ ┌────┴────┐ │ ПК, │ │ Умные │ │ Гости │ │ Тел. │ │ устройства│ │ │ └───────┘ └───────────┘ └─────────┘ │ MQTT ┌──────┴──────┐ │Home Assistant│ └─────────────┘
Настройка
Presence detection через Wi-Fi
Presence detection — определение присутствия человека дома по факту подключения его смартфона к Wi-Fi. Это базовый сценарий умного дома: включить свет при приходе, выключить при уходе, поставить на охрану и т.д.
Метод 1: Мониторинг DHCP Lease
Когда смартфон подключается к Wi-Fi, он получает IP-адрес через DHCP. MikroTik может отслеживать DHCP lease и реагировать на появление/исчезновение устройства:
[admin@MikroTik] ># Просмотр текущих DHCP-аренд /ip/dhcp-server/lease print where status=bound # Ищем MAC-адрес смартфона # Фиксируем MAC-адрес нужного устройства # iPhone: AA:BB:CC:11:22:33 # Android: DD:EE:FF:44:55:66
Метод 2: Мониторинг Wireless Registration Table
Более точный метод — мониторинг таблицы подключённых Wi-Fi-клиентов. Устройство появляется в таблице при подключении и исчезает при отключении:
[admin@MikroTik] ># Для Wi-Fi (wifiwave2 / wifi в RouterOS 7.20+) /interface/wifi/registration-table print # Показывает все подключённые Wi-Fi-клиенты с MAC-адресами # Для устаревшего wireless /interface/wireless/registration-table print
Скрипт presence detection
Создадим скрипт, который проверяет наличие смартфона в Wi-Fi-сети и выполняет действия:
[admin@MikroTik] ># Глобальные переменные для хранения состояния :global presenceState "unknown" /system/script add name=presence-detection source={ :global presenceState # MAC-адреса смартфонов жильцов :local phones {"AA:BB:CC:11:22:33";"DD:EE:FF:44:55:66"} :local anyoneHome false :foreach phone in=$phones do={ # Проверяем в Wi-Fi registration table :local found [/interface/wifi/registration-table find where mac-address=$phone] :if ([:len $found] > 0) do={ :set anyoneHome true } } # Логика смены состояния :if ($anyoneHome && $presenceState != "home") do={ :set presenceState "home" :log info "PRESENCE: Someone arrived home" # Действие: включить свет (MQTT) :do { /iot/mqtt/publish broker=mqtt1 \ topic="home/arrival" message="{\"status\":\"home\"}" } on-error={:log warning "MQTT publish failed"} # Действие: отправить webhook в Home Assistant :do { /tool/fetch url="http://192.168.88.50:8123/api/webhook/person-arrived" \ http-method=post output=none } on-error={:log warning "Webhook failed"} } :if (!$anyoneHome && $presenceState != "away") do={ :set presenceState "away" :log info "PRESENCE: Everyone left" # Действие: выключить свет :do { /iot/mqtt/publish broker=mqtt1 \ topic="home/departure" message="{\"status\":\"away\"}" } on-error={:log warning "MQTT publish failed"} # Действие: webhook — режим «ушёл» :do { /tool/fetch url="http://192.168.88.50:8123/api/webhook/person-left" \ http-method=post output=none } on-error={:log warning "Webhook failed"} } } # Запуск скрипта каждые 30 секунд /system/scheduler add name=presence-check interval=30s \ on-event="/system/script/run presence-detection"
Важно о рандомизации MAC: iOS 14+ и Android 10+ по умолчанию используют случайный MAC для каждой Wi-Fi-сети. Чтобы presence detection работал надёжно:
- На iPhone: Настройки → Wi-Fi → (i) рядом с сетью → выключить «Частный адрес Wi-Fi»
- На Android: Настройки → Wi-Fi → выбрать сеть → Privacy → Use device MAC
[admin@MikroTik] ># Альтернатива: привязываем статический DHCP lease по реальному MAC /ip/dhcp-server/lease add address=192.168.88.10 \ mac-address=AA:BB:CC:11:22:33 comment="iPhone - Иван" \ server=dhcp-home
Улучшенный presence detection с задержкой
Смартфон может кратковременно отключаться от Wi-Fi (экономия энергии, переключение между 2.4/5 ГГц). Добавим задержку перед сменой статуса на "away":
routeros:global presenceState "unknown" :global lastSeenTime 0 /system/script add name=presence-detection-v2 source={ :global presenceState :global lastSeenTime :local phones {"AA:BB:CC:11:22:33";"DD:EE:FF:44:55:66"} :local anyoneHome false :local awayDelay 300 # Задержка 300 секунд (5 минут) перед статусом "away" :foreach phone in=$phones do={ :local found [/interface/wifi/registration-table find where mac-address=$phone] :if ([:len $found] > 0) do={ :set anyoneHome true } } :local currentTime [:tonum [/system/clock get time]] :if ($anyoneHome) do={ :set lastSeenTime $currentTime :if ($presenceState != "home") do={ :set presenceState "home" :log info "PRESENCE: Arrived home" /iot/mqtt/publish broker=mqtt1 topic="home/presence" \ message="{\"status\":\"home\"}" } } else={ :local elapsed ($currentTime - $lastSeenTime) :if ($elapsed > $awayDelay && $presenceState != "away") do={ :set presenceState "away" :log info "PRESENCE: Left home (after 5 min delay)" /iot/mqtt/publish broker=mqtt1 topic="home/presence" \ message="{\"status\":\"away\"}" } } }
VLAN для IoT-устройств
IoT-устройства (умные лампы, розетки, камеры) часто имеют уязвимости и не обновляются. Размещение их в отдельном VLAN защищает основную сеть:
[admin@MikroTik] ># Создаём VLAN для IoT /interface/vlan add interface=bridge name=vlan20-iot vlan-id=20 # IP-адрес для IoT-сети /ip/address add address=192.168.20.1/24 interface=vlan20-iot # DHCP-сервер для IoT /ip/pool add name=pool-iot ranges=192.168.20.10-192.168.20.254 /ip/dhcp-server add name=dhcp-iot interface=vlan20-iot \ address-pool=pool-iot disabled=no /ip/dhcp-server/network add address=192.168.20.0/24 \ gateway=192.168.20.1 dns-server=192.168.20.1 # Отдельный SSID для IoT-устройств /interface/wifi/security add name=sec-iot \ authentication-types=wpa2-psk,wpa3-psk \ passphrase="IoTSecurePassword123" /interface/wifi add name=wifi-iot master-interface=wifi1 \ configuration.ssid="Home-IoT" \ security=sec-iot # VLAN-tagging для IoT SSID /interface/bridge/vlan add bridge=bridge tagged=bridge,wifi-iot vlan-ids=20 /interface/bridge/port set [find interface=wifi-iot] pvid=20
Firewall для IoT-устройств
Ключевой принцип: IoT-устройства могут выходить в интернет (для обновлений и облака), но не могут обращаться к устройствам в основной сети:
[admin@MikroTik] ># Разрешаем IoT → Интернет /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ out-interface=ether1 action=accept \ comment="IoT to Internet" # Разрешаем IoT → MQTT-брокер (Home Assistant) /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ dst-address=192.168.88.50 dst-port=1883,8883 protocol=tcp \ action=accept comment="IoT to MQTT broker" # Разрешаем established/related от основной сети к IoT # (чтобы можно было управлять IoT-устройствами из приложений) /ip/firewall/filter add chain=forward src-address=192.168.88.0/24 \ dst-address=192.168.20.0/24 action=accept \ comment="LAN to IoT (management)" # Блокируем IoT → основная сеть /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ dst-address=192.168.88.0/24 action=drop \ comment="Block IoT to LAN" # Блокируем IoT → маршрутизатор (кроме DNS и DHCP) /ip/firewall/filter add chain=input src-address=192.168.20.0/24 \ protocol=udp dst-port=53,67 action=accept \ comment="IoT DNS and DHCP" /ip/firewall/filter add chain=input src-address=192.168.20.0/24 \ action=drop comment="Block IoT to router" # NAT для IoT /ip/firewall/nat add chain=srcnat src-address=192.168.20.0/24 \ out-interface=ether1 action=masquerade \ comment="NAT for IoT VLAN"
QoS для IoT-устройств
IoT-трафик обычно невелик по объёму, но критичен по времени (команды управления). Настроим приоритеты:
[admin@MikroTik] ># Маркировка IoT-трафика /ip/firewall/mangle add chain=forward src-address=192.168.20.0/24 \ action=mark-packet new-packet-mark=iot-traffic passthrough=yes \ comment="Mark IoT traffic" # Очередь для IoT (гарантированная полоса, низкий приоритет для bulk) /queue/simple add name=iot-queue target=192.168.20.0/24 \ max-limit=10M/10M limit-at=2M/2M priority=6/6 \ comment="IoT bandwidth limit"
IoT-устройства не должны потреблять много трафика. Если устройство генерирует аномальный трафик — это может быть признаком компрометации.
Интеграция с Home Assistant
Home Assistant — самая популярная open-source платформа для умного дома. MikroTik интегрируется несколькими способами:
Способ 1: MQTT
Самый гибкий способ. MikroTik публикует данные в MQTT, Home Assistant подписывается:
[admin@MikroTik] ># Настройка MQTT-брокера на MikroTik /iot/mqtt/brokers add name=ha-mqtt address=192.168.88.50 port=1883 \ client-id="mikrotik-home" username=mqtt password=MqttSecure123 # Скрипт: отправка данных о подключённых устройствах /system/script add name=ha-device-count source={ :local wifiCount [/interface/wifi/registration-table print count-only] :local dhcpCount [/ip/dhcp-server/lease print count-only where status=bound] /iot/mqtt/publish broker=ha-mqtt \ topic="mikrotik/network/stats" \ message="{\"wifi_clients\":$wifiCount,\"dhcp_leases\":$dhcpCount}" } /system/scheduler add name=ha-stats interval=1m \ on-event="/system/script/run ha-device-count"
В Home Assistant configuration.yaml:
yamlmqtt: sensor: - name: "MikroTik Wi-Fi Clients" state_topic: "mikrotik/network/stats" value_template: "{{ value_json.wifi_clients }}" icon: mdi:wifi - name: "MikroTik DHCP Leases" state_topic: "mikrotik/network/stats" value_template: "{{ value_json.dhcp_leases }}" icon: mdi:lan binary_sensor: - name: "Someone Home" state_topic: "home/presence" value_template: "{{ value_json.status }}" payload_on: "home" payload_off: "away" device_class: presence
Способ 2: REST API MikroTik
Home Assistant может напрямую запрашивать данные с MikroTik через REST API:
[admin@MikroTik] ># Убедитесь, что REST API включён /ip/service set api-ssl disabled=no port=8729 # Создайте пользователя для Home Assistant /user add name=homeassistant password=HASecure123 group=read
В Home Assistant configuration.yaml:
yamlrest: - resource: "https://192.168.88.1/rest/interface/wifi/registration-table" verify_ssl: false authentication: basic username: homeassistant password: HASecure123 scan_interval: 30 sensor: - name: "MikroTik WiFi Clients" value_template: "{{ value_json | length }}"
Способ 3: Webhook из MikroTik в Home Assistant
MikroTik отправляет webhook при событиях, Home Assistant реагирует автоматизацией:
[admin@MikroTik] ># Webhook при подключении нового устройства к Wi-Fi /system/script add name=new-device-alert source={ :local wifiClients [/interface/wifi/registration-table find] :foreach client in=$wifiClients do={ :local mac [/interface/wifi/registration-table get $client mac-address] :local known [/ip/dhcp-server/lease find where mac-address=$mac comment~"known"] :if ([:len $known] = 0) do={ # Неизвестное устройство — отправляем alert /tool/fetch url="http://192.168.88.50:8123/api/webhook/unknown-device" \ http-method=post \ http-data="{\"mac\":\"$mac\"}" \ http-header-field="Content-Type: application/json" \ output=none } } }
Мониторинг IoT-устройств
Netwatch для мониторинга доступности
[admin@MikroTik] ># Мониторим ключевые IoT-устройства /tool/netwatch add host=192.168.20.10 interval=60s \ comment="Smart Hub" \ up-script="" \ down-script={ /log warning "Smart Hub is DOWN" /tool/fetch url="https://api.telegram.org/bot123:ABC/sendMessage" \ http-method=post \ http-data="chat_id=-100123&text=Smart Hub offline!" \ output=none } /tool/netwatch add host=192.168.20.20 interval=60s \ comment="IP Camera" \ down-script={ /log warning "IP Camera is DOWN" }
Скрипт мониторинга аномального трафика IoT
[admin@MikroTik] >/system/script add name=iot-traffic-monitor source={ :local threshold 50000000 # 50 МБ — аномальный порог для IoT за 5 минут :foreach i in=[/interface/bridge/host find where on-interface~"wifi-iot"] do={ :local mac [/interface/bridge/host get $i mac-address] # Проверяем трафик через queue или torch } # Упрощённый вариант: проверка общего трафика IoT VLAN :local rxBytes [/interface get vlan20-iot rx-byte] :if ($rxBytes > $threshold) do={ :log warning "IoT VLAN: anomalous traffic detected ($rxBytes bytes)" /iot/mqtt/publish broker=ha-mqtt topic="mikrotik/security/alert" \ message="{\"type\":\"iot_anomaly\",\"bytes\":$rxBytes}" } } /system/scheduler add name=iot-monitor interval=5m \ on-event="/system/script/run iot-traffic-monitor"
Безопасность IoT
WPA3 для IoT-сети
[admin@MikroTik] ># Используем WPA3 для IoT SSID (если устройства поддерживают) /interface/wifi/security set sec-iot \ authentication-types=wpa3-psk \ passphrase="IoTSecurePassword123" # Если часть устройств не поддерживает WPA3 — используем transitional mode /interface/wifi/security set sec-iot \ authentication-types=wpa2-psk,wpa3-psk \ passphrase="IoTSecurePassword123"
Ограничение доступа по MAC
[admin@MikroTik] ># Access List для IoT SSID — только известные устройства /interface/wifi/access-list add mac-address=11:22:33:44:55:66 \ interface=wifi-iot action=accept comment="Smart Light" /interface/wifi/access-list add mac-address=77:88:99:AA:BB:CC \ interface=wifi-iot action=accept comment="Smart Plug" # Запрет всех остальных /interface/wifi/access-list add interface=wifi-iot action=reject \ comment="Block unknown IoT devices"
Автоматическое обновление DNS-блокировок
Многие IoT-устройства отправляют телеметрию производителю. Блокируем нежелательные домены:
[admin@MikroTik] ># Блокировка телеметрии IoT через DNS /ip/dns/static add name="data.miio.com" type=A address=0.0.0.0 \ comment="Block Xiaomi telemetry" /ip/dns/static add name="ot.io.mi.com" type=A address=0.0.0.0 \ comment="Block Xiaomi OTA telemetry" /ip/dns/static add name="tracking.miui.com" type=A address=0.0.0.0 \ comment="Block MIUI tracking"
Пример: полная настройка умного дома на MikroTik
Итоговая конфигурация для дома с hAP ax³, Home Assistant и IoT-устройствами:
[admin@MikroTik] ># === 1. VLAN для IoT === /interface/vlan add interface=bridge name=vlan20-iot vlan-id=20 /ip/address add address=192.168.20.1/24 interface=vlan20-iot /ip/pool add name=pool-iot ranges=192.168.20.10-192.168.20.254 /ip/dhcp-server add name=dhcp-iot interface=vlan20-iot \ address-pool=pool-iot disabled=no /ip/dhcp-server/network add address=192.168.20.0/24 \ gateway=192.168.20.1 dns-server=192.168.20.1 # === 2. Wi-Fi для IoT === /interface/wifi/security add name=sec-iot \ authentication-types=wpa2-psk,wpa3-psk \ passphrase="IoTSecurePassword123" /interface/wifi add name=wifi-iot master-interface=wifi1 \ configuration.ssid="Home-IoT" security=sec-iot /interface/bridge/vlan add bridge=bridge tagged=bridge,wifi-iot vlan-ids=20 # === 3. Firewall для IoT === /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ out-interface=ether1 action=accept comment="IoT to Internet" /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ dst-address=192.168.88.50 dst-port=1883 protocol=tcp \ action=accept comment="IoT to MQTT" /ip/firewall/filter add chain=forward src-address=192.168.88.0/24 \ dst-address=192.168.20.0/24 action=accept comment="LAN to IoT" /ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \ dst-address=192.168.88.0/24 action=drop comment="Block IoT to LAN" # === 4. NAT для IoT === /ip/firewall/nat add chain=srcnat src-address=192.168.20.0/24 \ out-interface=ether1 action=masquerade # === 5. MQTT === /iot/mqtt/brokers add name=ha-mqtt address=192.168.88.50 port=1883 \ client-id="mikrotik" username=mqtt password=MqttSecure123 # === 6. Presence detection === :global presenceState "unknown" :global lastSeenTime 0 # (скрипт presence-detection-v2 — см. выше) /system/scheduler add name=presence-check interval=30s \ on-event="/system/script/run presence-detection-v2" # === 7. Мониторинг === /tool/netwatch add host=192.168.88.50 interval=60s \ comment="Home Assistant" \ down-script={/log error "Home Assistant is DOWN"} /tool/netwatch add host=192.168.20.10 interval=60s \ comment="Smart Hub" \ down-script={/log warning "Smart Hub is DOWN"}
Проверка
Проверка presence detection
[admin@MikroTik] ># Проверяем, что смартфон виден в Wi-Fi /interface/wifi/registration-table print # Ищем MAC-адрес смартфона # Проверяем глобальную переменную состояния :put $presenceState # home или away # Проверяем логи /log print where message~"PRESENCE" # PRESENCE: Someone arrived home # PRESENCE: Everyone left
Проверка VLAN изоляции
[admin@MikroTik] ># С IoT-устройства (192.168.20.x) пытаемся достучаться до LAN # Должно быть заблокировано: /ping 192.168.88.1 src-address=192.168.20.1 # timeout (если firewall настроен правильно — ICMP от IoT к роутеру заблокирован) # Проверяем, что IoT имеет доступ в интернет /ping 8.8.8.8 src-address=192.168.20.1 # Должен пинговаться # Проверяем firewall counters /ip/firewall/filter print stats where comment~"IoT" # Смотрим счётчики пакетов — правила срабатывают
Проверка MQTT-интеграции
[admin@MikroTik] ># Статус подключения к брокеру /iot/mqtt/brokers print # connected: yes # Тестовая публикация /iot/mqtt/publish broker=ha-mqtt topic="mikrotik/test" \ message="{\"test\":\"hello\"}" # В Home Assistant → Developer Tools → MQTT → Listen: # Подписаться на mikrotik/# — сообщение должно появиться
Проверка мониторинга
[admin@MikroTik] ># Статус netwatch /tool/netwatch print # Проверяем status: up для всех устройств # Если устройство недоступно # status: down, since: <время>
Типичные ошибки
1. Presence detection срабатывает ложно — статус "away" при нахождении дома
Причина: смартфон отключается от Wi-Fi для экономии энергии (sleep mode), или рандомизация MAC.
Решение:
[admin@MikroTik] ># Увеличьте задержку перед статусом "away" # В скрипте presence-detection-v2 измените awayDelay: :local awayDelay 600 # 10 минут вместо 5 # Отключите рандомизацию MAC на смартфоне: # iPhone: Настройки → Wi-Fi → (i) → Частный адрес Wi-Fi: выкл # Android: Настройки → Wi-Fi → сеть → Privacy → Use device MAC # Или используйте статический DHCP lease для привязки /ip/dhcp-server/lease add address=192.168.88.10 \ mac-address=AA:BB:CC:11:22:33 comment="iPhone"
2. IoT-устройства не подключаются к отдельному SSID
Причина: многие дешёвые IoT-устройства поддерживают только 2.4 ГГц и не работают с WPA3.
Решение:
[admin@MikroTik] ># IoT SSID только на 2.4 ГГц /interface/wifi set wifi-iot \ configuration.ssid="Home-IoT" \ channel.band=2ghz-ax # Используем WPA2-PSK (без WPA3) /interface/wifi/security set sec-iot \ authentication-types=wpa2-psk \ passphrase="IoTSecurePassword123"
3. Home Assistant не получает MQTT-сообщения от MikroTik
Причина: разные MQTT-брокеры, firewall блокирует, неверный topic.
Решение:
[admin@MikroTik] ># Проверяем, что MikroTik подключён к тому же брокеру /iot/mqtt/brokers print # address: 192.168.88.50, port: 1883, connected: yes # Проверяем firewall — не блокируется ли порт 1883 /ip/firewall/filter print where dst-port=1883 # Тестируем через MQTT Explorer или mosquitto_sub: # mosquitto_sub -h 192.168.88.50 -t "mikrotik/#" -v # Должны видеть сообщения от MikroTik
4. IoT-устройства из VLAN не обнаруживаются в приложении
Причина: приложение управления и IoT-устройство находятся в разных VLAN (подсетях). Многие IoT-приложения используют mDNS/SSDP для обнаружения, которые не проходят между VLAN.
Решение:
[admin@MikroTik] ># Вариант 1: Разрешить multicast между VLAN (mDNS relay) # RouterOS не имеет встроенного mDNS relay # Используйте контейнер с avahi-daemon или mdns-reflector # Вариант 2: Для первоначальной настройки подключите телефон к IoT SSID # После настройки устройства управление обычно идёт через облако # Вариант 3: На время настройки временно разрешите трафик между VLAN /ip/firewall/filter add chain=forward src-address=192.168.88.0/24 \ dst-address=192.168.20.0/24 action=accept \ comment="TEMP: setup IoT devices" # После настройки удалите это правило или отключите
5. Скрипт presence detection нагружает CPU
Причина: слишком частый запуск скрипта или сложная логика.
Решение:
[admin@MikroTik] ># Увеличьте интервал с 30 секунд до 1 минуты /system/scheduler set presence-check interval=1m # Проверяем нагрузку CPU /system/resource print # Если cpu-load постоянно > 50% — упрощайте скрипты # Оптимизация: проверяйте только один MAC (основной смартфон) # вместо перебора массива
6. Webhook из MikroTik в Home Assistant — ошибка "connection refused"
Причина: Home Assistant недоступен, неверный IP/порт, или firewall блокирует.
Решение:
[admin@MikroTik] ># Проверяем доступность Home Assistant /ping 192.168.88.50 count=3 /tool/fetch url="http://192.168.88.50:8123" mode=http # Проверяем, что webhook настроен в Home Assistant # В automations.yaml должен быть trigger: webhook с соответствующим ID # Проверяем, что MikroTik может делать HTTP-запросы /tool/fetch url="http://httpbin.org/get" mode=http
Рекомендации по безопасности умного дома
- Регулярно обновляйте прошивки всех IoT-устройств
- Сильные пароли для Wi-Fi IoT-сети (минимум 16 символов)
- VLAN-изоляция обязательна — IoT-устройства не должны иметь доступа к основной сети
- Мониторинг трафика — аномальный трафик от IoT может указывать на компрометацию
- Минимум облачных зависимостей — предпочитайте локальное управление (Home Assistant + MQTT)
- Бэкап конфигурации MikroTik — все скрипты, firewall-правила, VLAN-настройки
┌─────────────────────────────────────────────┐
│ Интернет │
└──────────────┬──────────────────────────────┘
│
┌──────────────┴──────────────────────────────┐
│ MikroTik (hAP ax³ / hAP be³) │
│ ┌─────────────────────────────────────────┐ │
│ │ Wi-Fi: presence detection │ │
│ │ VLAN 10: основная сеть (ПК, телефоны) │ │
│ │ VLAN 20: IoT-устройства │ │
│ │ VLAN 30: гостевая сеть │ │
│ │ MQTT: уведомления и управление │ │
│ │ Scripts: автоматизация │ │
│ └─────────────────────────────────────────┘ │
└───┬──────────────┬───────────────┬──────────┘
│ VLAN 10 │ VLAN 20 │ VLAN 30
┌───┴───┐ ┌─────┴─────┐ ┌────┴────┐
│ ПК, │ │ Умные │ │ Гости │
│ Тел. │ │ устройства│ │ │
└───────┘ └───────────┘ └─────────┘
│ MQTT
┌──────┴──────┐
│Home Assistant│
└─────────────┘
# Просмотр текущих DHCP-аренд
/ip/dhcp-server/lease print where status=bound
# Ищем MAC-адрес смартфона
# Фиксируем MAC-адрес нужного устройства
# iPhone: AA:BB:CC:11:22:33
# Android: DD:EE:FF:44:55:66
# Для Wi-Fi (wifiwave2 / wifi в RouterOS 7.20+)
/interface/wifi/registration-table print
# Показывает все подключённые Wi-Fi-клиенты с MAC-адресами
# Для устаревшего wireless
/interface/wireless/registration-table print
# Глобальные переменные для хранения состояния
:global presenceState "unknown"
/system/script add name=presence-detection source={
:global presenceState
# MAC-адреса смартфонов жильцов
:local phones {"AA:BB:CC:11:22:33";"DD:EE:FF:44:55:66"}
:local anyoneHome false
:foreach phone in=$phones do={
# Проверяем в Wi-Fi registration table
:local found [/interface/wifi/registration-table find where mac-address=$phone]
:if ([:len $found] > 0) do={
:set anyoneHome true
}
}
# Логика смены состояния
:if ($anyoneHome && $presenceState != "home") do={
:set presenceState "home"
:log info "PRESENCE: Someone arrived home"
# Действие: включить свет (MQTT)
:do {
/iot/mqtt/publish broker=mqtt1 \
topic="home/arrival" message="{\"status\":\"home\"}"
} on-error={:log warning "MQTT publish failed"}
# Действие: отправить webhook в Home Assistant
:do {
/tool/fetch url="http://192.168.88.50:8123/api/webhook/person-arrived" \
http-method=post output=none
} on-error={:log warning "Webhook failed"}
}
:if (!$anyoneHome && $presenceState != "away") do={
:set presenceState "away"
:log info "PRESENCE: Everyone left"
# Действие: выключить свет
:do {
/iot/mqtt/publish broker=mqtt1 \
topic="home/departure" message="{\"status\":\"away\"}"
} on-error={:log warning "MQTT publish failed"}
# Действие: webhook — режим «ушёл»
:do {
/tool/fetch url="http://192.168.88.50:8123/api/webhook/person-left" \
http-method=post output=none
} on-error={:log warning "Webhook failed"}
}
}
# Запуск скрипта каждые 30 секунд
/system/scheduler add name=presence-check interval=30s \
on-event="/system/script/run presence-detection"
# Альтернатива: привязываем статический DHCP lease по реальному MAC
/ip/dhcp-server/lease add address=192.168.88.10 \
mac-address=AA:BB:CC:11:22:33 comment="iPhone - Иван" \
server=dhcp-home
:global presenceState "unknown"
:global lastSeenTime 0
/system/script add name=presence-detection-v2 source={
:global presenceState
:global lastSeenTime
:local phones {"AA:BB:CC:11:22:33";"DD:EE:FF:44:55:66"}
:local anyoneHome false
:local awayDelay 300
# Задержка 300 секунд (5 минут) перед статусом "away"
:foreach phone in=$phones do={
:local found [/interface/wifi/registration-table find where mac-address=$phone]
:if ([:len $found] > 0) do={
:set anyoneHome true
}
}
:local currentTime [:tonum [/system/clock get time]]
:if ($anyoneHome) do={
:set lastSeenTime $currentTime
:if ($presenceState != "home") do={
:set presenceState "home"
:log info "PRESENCE: Arrived home"
/iot/mqtt/publish broker=mqtt1 topic="home/presence" \
message="{\"status\":\"home\"}"
}
} else={
:local elapsed ($currentTime - $lastSeenTime)
:if ($elapsed > $awayDelay && $presenceState != "away") do={
:set presenceState "away"
:log info "PRESENCE: Left home (after 5 min delay)"
/iot/mqtt/publish broker=mqtt1 topic="home/presence" \
message="{\"status\":\"away\"}"
}
}
}
# Создаём VLAN для IoT
/interface/vlan add interface=bridge name=vlan20-iot vlan-id=20
# IP-адрес для IoT-сети
/ip/address add address=192.168.20.1/24 interface=vlan20-iot
# DHCP-сервер для IoT
/ip/pool add name=pool-iot ranges=192.168.20.10-192.168.20.254
/ip/dhcp-server add name=dhcp-iot interface=vlan20-iot \
address-pool=pool-iot disabled=no
/ip/dhcp-server/network add address=192.168.20.0/24 \
gateway=192.168.20.1 dns-server=192.168.20.1
# Отдельный SSID для IoT-устройств
/interface/wifi/security add name=sec-iot \
authentication-types=wpa2-psk,wpa3-psk \
passphrase="IoTSecurePassword123"
/interface/wifi add name=wifi-iot master-interface=wifi1 \
configuration.ssid="Home-IoT" \
security=sec-iot
# VLAN-tagging для IoT SSID
/interface/bridge/vlan add bridge=bridge tagged=bridge,wifi-iot vlan-ids=20
/interface/bridge/port set [find interface=wifi-iot] pvid=20
# Разрешаем IoT → Интернет
/ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \
out-interface=ether1 action=accept \
comment="IoT to Internet"
# Разрешаем IoT → MQTT-брокер (Home Assistant)
/ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \
dst-address=192.168.88.50 dst-port=1883,8883 protocol=tcp \
action=accept comment="IoT to MQTT broker"
# Разрешаем established/related от основной сети к IoT
# (чтобы можно было управлять IoT-устройствами из приложений)
/ip/firewall/filter add chain=forward src-address=192.168.88.0/24 \
dst-address=192.168.20.0/24 action=accept \
comment="LAN to IoT (management)"
# Блокируем IoT → основная сеть
/ip/firewall/filter add chain=forward src-address=192.168.20.0/24 \
dst-address=192.168.88.0/24 action=drop \
comment="Block IoT to LAN"
# Блокируем IoT → маршрутизатор (кроме DNS и DHCP)
/ip/firewall/filter add chain=input src-address=192.168.20.0/24 \
protocol=udp dst-port=53,67 action=accept \
comment="IoT DNS and DHCP"
/ip/firewall/filter add chain=input src-address=192.168.20.0/24 \
action=drop comment="Block IoT to router"
# NAT для IoT
/ip/firewall/nat add chain=srcnat src-address=192.168.20.0/24 \
out-interface=ether1 action=masquerade \
comment="NAT for IoT VLAN"
# Маркировка IoT-трафика
/ip/firewall/mangle add chain=forward src-address=192.168.20.0/24 \
action=mark-packet new-packet-mark=iot-traffic passthrough=yes \
comment="Mark IoT traffic"
# Очередь для IoT (гарантированная полоса, низкий приоритет для bulk)
/queue/simple add name=iot-queue target=192.168.20.0/24 \
max-limit=10M/10M limit-at=2M/2M priority=6/6 \
comment="IoT bandwidth limit"
# Настройка MQTT-брокера на MikroTik
/iot/mqtt/brokers add name=ha-mqtt address=192.168.88.50 port=1883 \
client-id="mikrotik-home" username=mqtt password=MqttSecure123
# Скрипт: отправка данных о подключённых устройствах
/system/script add name=ha-device-count source={
:local wifiCount [/interface/wifi/registration-table print count-only]
:local dhcpCount [/ip/dhcp-server/lease print count-only where status=bound]
/iot/mqtt/publish broker=ha-mqtt \
topic="mikrotik/network/stats" \
message="{\"wifi_clients\":$wifiCount,\"dhcp_leases\":$dhcpCount}"
}
/system/scheduler add name=ha-stats interval=1m \
on-event="/system/script/run ha-device-count"
##### Способ 2: REST API MikroTik
Home Assistant может напрямую запрашивать данные с MikroTik через REST API:
В Home Assistant `configuration.yaml`:
##### Способ 3: Webhook из MikroTik в Home Assistant
MikroTik отправляет webhook при событиях, Home Assistant реагирует автоматизацией:
#### Мониторинг IoT-устройств
##### Netwatch для мониторинга доступности
##### Скрипт мониторинга аномального трафика IoT
#### Безопасность IoT
##### WPA3 для IoT-сети
##### Ограничение доступа по MAC
##### Автоматическое обновление DNS-блокировок
Многие IoT-устройства отправляют телеметрию производителю. Блокируем нежелательные домены:
#### Пример: полная настройка умного дома на MikroTik
Итоговая конфигурация для дома с hAP ax³, Home Assistant и IoT-устройствами:
### Проверка
#### Проверка presence detection
#### Проверка VLAN изоляции
#### Проверка MQTT-интеграции
#### Проверка мониторинга
### Типичные ошибки
#### 1. Presence detection срабатывает ложно — статус "away" при нахождении дома
**Причина**: смартфон отключается от Wi-Fi для экономии энергии (sleep mode), или рандомизация MAC.
**Решение**:
#### 2. IoT-устройства не подключаются к отдельному SSID
**Причина**: многие дешёвые IoT-устройства поддерживают только 2.4 ГГц и не работают с WPA3.
**Решение**:
#### 3. Home Assistant не получает MQTT-сообщения от MikroTik
**Причина**: разные MQTT-брокеры, firewall блокирует, неверный topic.
**Решение**:
#### 4. IoT-устройства из VLAN не обнаруживаются в приложении
**Причина**: приложение управления и IoT-устройство находятся в разных VLAN (подсетях). Многие IoT-приложения используют mDNS/SSDP для обнаружения, которые не проходят между VLAN.
**Решение**:
#### 5. Скрипт presence detection нагружает CPU
**Причина**: слишком частый запуск скрипта или сложная логика.
**Решение**:
#### 6. Webhook из MikroTik в Home Assistant — ошибка "connection refused"
**Причина**: Home Assistant недоступен, неверный IP/порт, или firewall блокирует.
**Решение**: