Недавно приобрел новый роутер с WiFi6 взамен своему старому микротику, который даже не умел 5G. Не то, чтобы микротик плохо работал, но захотелось обновиться. Роутер нравится, покрытие сети и скорость улучшились, например ESP, которая находится в самой дальней от роутера точке перестала отваливаться. Живу в двушке, 63 м2, роутер стоит примерно посередине. Работает в режиме точки доступа, так как в качестве входа из Интернет использую Cisco ASA5505.
На микротике отлично работал штатный devicetracker. На присутствие или отсутствие жильцов квартиры завязаны автоматизации по свету, музыке и безопасности. Но на xiaomi штатный devicetracker не заработал. Я расстроился и стал мониторить тему на openwrt.org, но прогресса по портированию прошивки пока нет.
Вышел из ситуации с помощью linux bash и MQTT Device Tracker
Данный способ будет работать на любом роутере с линуксом на борту и доступом по ssh (или телнет).
Для начала необходимо получить доступ к ssh. По состоянию 06.08.2020 в крайней прошивке 1.0.336 такая возможность есть.
Настройка роутера вне темы данной статьи, IP у роутера 10.5.254.11/24.
Любым браузером логинимся в роутер. Попадаем на следующий адрес:
http://10.5.254.11/cgi-bin/luci/;stok=45dcadc532a5h2f99a365dde74512384/web/home#router
Нас интересует набор символов после stok= до /web (выглядит примерно так 45dcadc532a5h2f99a365dde74512384), это токен, меняется от сессии к сессии. Для получения доступа по SSH переходим последовательно по следующим адресам (меняем токен и IP на свои):
http://10.5.254.11/cgi-bin/luci/;stok=<TOKEN>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h;nvram set ssh_en=1; nvram commit; http://10.5.254.11/cgi-bin/luci/;stok=<TOKEN>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h;sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; http://10.5.254.11/cgi-bin/luci/;stok=<TOKEN>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h;/etc/init.d/dropbear start; http://10.5.254.11/cgi-bin/luci/;stok=<TOKEN>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h; echo -e 'admin\nadmin' | passwd root;
Можно логиниться в роутер по ssh, логин root, пароль admin. Пароль рекомендую поменять командой passwd.
Для захода с сервера HA на ssh роутера без пароля генерируем ключ и вписываем его в файл с ключами ssh на роутере (за сервис ssh ответственен демон dropbear).
На сервере из под пользователя, с правами которого будем запускать скрипт даем команды:
ssh-keygen ssh root@10.5.254.11 "tee -a /etc/dropbear/authorized_keys" < /home/USER/.ssh/id_rsa.pub
Не забываем поменять адрес роутера и имя пользователя. Вторая команда запросит пароль на роутер.
После этого можно заходить ssh root@10.5.254.11 без пароля.
У роутера несколько беспроводных сетевых интерфейсов, нас интересуют два wl0 и wl1. Один отвечает за сеть 5g, второй за сеть 2,4g. Лично мне, надо отслеживать 3 устройства (телефоны), их мак адреса я знаю, одно работает по 2,4g и 2 работают по 5g.
На сервере с HA пишим скрипт:
#!/bin/bash kira_present=`ssh root@10.5.254.11 'iwinfo wl1 assoclist' | grep -ic 90:2B:D2:09:73:0E` /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ПАРОЛЬ_ОТ_MQTT -m $kira_present -t location/kira oleg_present=`ssh root@10.5.254.11 'iwinfo wl0 assoclist' | grep -ic C0:EE:FB:09:A5:31` /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ПАРОЛЬ_ОТ_MQTT -m $oleg_present -t location/oleg irina_present=`ssh root@10.5.254.11 'iwinfo wl0 assoclist' | grep -ic 94:65:2D:28:C2:13` /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ПАРОЛЬ_ОТ_MQTT -m $irina_present -t location/irina exit 0
У меня за MQTT отвечает mosquito.
Скрипт стартую с помощью cron каждые 2 минуты. Для этого запускаем команду:
crontab -e
Вписываем строку и сохраняем:
*/2 * * * * /местонахождениескрипта
В Home Assistant в configuration.yaml добавляем следующее:
device_tracker: - platform: mqtt devices: kira_honor_mqtt: 'location/kira' oleg_op6_mqtt: 'location/oleg' irina_op3_mqtt: 'location/irina' qos: 1 payload_home: '1' payload_not_home: '0' source_type: router
Работает так:
Команда
iwinfo wl1 assoclist | grep -ic 90:2B:D2:09:73:0E
Выводит список устройств подключенных к сети и грепом ищется соответствие с мак адресом, если есть соответствие, то при наличии ключа -с в команде grep выводится количество строк с совпадениями, но так как мак адреса уникальны (если вы их сами не меняли на одинаковые для каких-то своих целей), в выводе будет или 1 при наличии устройства или 0 при отсутствии, что и указано в конфиге в HA:
payload_home: '1'
payload_not_home: '0'
Если обновить прошивку роутера доступ к ssh слетит, так что пока не убежусь что в новой прошивке есть возможность получить доступ по ssh обновляться не буду.
Redmi AX5, думаю, по той же схеме ?
Да, там также ssh можно получить, даже номер прошивки такой же
Да, я по такой схеме регион менял. Через SSH