Блог

Проброс USB-порта Mikrotik c CC2531 к контроллеру на macOS

Предисловие

Когда я попытался запустить связку zigbee2mqtt+mosquitto на macOS, то столкнулся с рядом нюансов системы:

  • docker не может внутрь контейнера отдавать блочные устройства, потому что в macOS они в свои и linux их использовать не умеет
  • сама macOS "балуется" юсб-портами, когда отключает экран(без перехода в спящий режим), что приводит к отвалу стика. Причину и способ лечения я так и не смог найти.

Таким образом, все подобие умного дома периодически превращается в тыкву и намекает, что надо купить Raspberry Pi, поставить на него флешку с линуксом, воткнуть в розетку и все. Но iMac у меня включен всегда, и я не рассчитывал на такой поворот.

В этот момент внимание на себя обратил Mikrotik в коридоре, который тоже включен постоянно и особо по жизни не напрягается. Вспомнив о наличии штатной возможности предоставления доступа к usb-порту по сети, я принял решение поискать счастья с такой схемой.

Вцелом принцип такой:

Вставить стик в роутер и настроить доступ к порту по сетиВ macOS(в самой системе или внутри контейнера) создается виртуальное устройство, которым zigbee2mqtt общается как с железным свистком в порту компьютераНастраивается автозапуск и разводятся каналы zigbee и wi-fi на частоте 2,4Ггц

Этот алгоритм справедлив как для win, так и для *nix, а вместо роутера можно использовать ESPшку. У меня же MikroTik и Mac и я про них расскажу.

На роутере

Сама возможность удаленного доступа к устройствам на Mikrotik как-то не сильно всплывает на форумах и статьях, но она есть "из коробки" и работает стабильно.

Адрес роутера в сети у меня 192.168.88.1.

В веб-интерфейсе или winbox System - Ports должен появиться usb порт, который настраивается вот так:

Параметры работы с устройством
Настройки удаленного доступа. Я ограничил доступ только из локальной сети, а порт выбрал 4040

На компьютере

Для создания виртуального устройства и соединения с портом MikroTik используется программа socat(бесплатна, ставится через homebrew).

brew install socat

Создать папку vusb в каталоге zigbee2mqtt:

mkdir /usr/local/lib/node_modules/zigbee2mqtt/vusb/

Проверить запуск:

/usr/local/bin/socat -d -d pty,raw,echo=0,link=/usr/local/lib/node_modules/zigbee2mqtt/vusb/zigbee_cc2530 tcp-connect:192.168.88.1:4040,reuseaddr

Если все хорошо, то на экране появится похожая картинка:

В настройках zigbee2mqtt указать:

serial: port: /usr/local/zigbee2mqtt/vusb/zigbee_cc2530

Донастройка и автозапуск

Для автозапуска socat я использую системного демона Launchctl, что позволяет его запускать при загрузке до входа пользователя.

Создать в папке /Library/LaunchDaemons/ файл homebrew.mxcl.socat.plist с содержимым:

sudo nano /Library/LaunchDaemons/homebrew.mxcl.socat.plist

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"\> <plist version="1.0"> <dict> <key>Label</key> <string>homebrew.mxcl.socat</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/socat</string> <string>-d</string> <string>-d</string> <string>pty,raw,echo=0,link=/usr/local/lib/node_modules/zigbee2mqtt/vusb/zigbee_cc2530</string> <string>tcp-connect:192.168.88.1:4040,reuseaddr</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StartInterval</key> <integer>30</integer> </dict> </plist>

Загрузить plist в перечень загружаемых демонов и запустить его прямо сейчас:

launchctl load /Library/LaunchDaemons/homebrew.mxcl.socat.plist

Остановить сервис и не загружать его больше при старте:

launchctl unload /Library/LaunchDaemons/homebrew.mxcl.socat.plist

Для того, чтобы качество связи не хромало, надо разнести по разным каналам сеть wi-fi роутера и канал CC2531 или вовсе отключить на роутере 2,4Ггц, если клиентов 80211n дома не живет и в гости не ожидается.

Вот картинка с ресурса где изображены пересечения каналов zigbee и wi-fi

У меня wi-fi живет на 6 канале, zigbee на дефолтном 11. Проблем с качеством связи обоих сетей не замечаю.

Конец

Вцелом, это костыль, который усложняет систему. и его использование вместо классических подходов должно быть по-хорошему оправдано внятными причинами. Ими могут стать занятые, неисправные или отсутствующие usb-порты, а может и желание разместить сервисы УД в облаке.

Настройка для Raspberry и ESP на иностранном языке найдется тут

А мое железо и ПО, на котором работает все сегодня такое:

iMac 21,5 + macOS Catalina 10.15.1

MikroTik hapAC + RouterOS v6.45.6

Удачи!


Решение безусловно оригинальное, но на маке докер прекрасно работает с USB через docker-machine

Интересен сценарий, когда Zigbee USB Stick воткнут в домашний роутер, а zigbee2mqtt работает не на домашней малинке, а где-нибудь в облаке. Есть же вариант еще с usbip. Интересно, насколько он рабочий при таком сценарии?

идея пушка. нынешняя версия z2m может работать по tcp без socat. настраиваете проброс на микроте, в конфиге z2m: tcp://: и вуаля. Как со стабильностью не знаю, подключил вторым инстансом z2m и добавил тестовое устройство, посмотрим.

Вернуться назад
Вернуться назад