В своей системе умного дома я столкнулся с вопросом: «Как узнать, где находится тот или иной житель дома?». Разберемся на примере. Я использую raspberry 3B+ и официальный готовый образ системы без проброса портов.
На самом деле в MD (мажордомо) есть стандартные средства для этого, но для реализации необходим белый IP и проброс портов к серверу MD. Я считаю, что торчащий наружу интерфейс умного дома – не самый лучший вариант ввиду необходимости сильно позаботиться о своей безопасности. Обязательно найдется какой-нибудь умник взломает ваш сервер и будет очень неприятно, когда ночью у вас откроется дверь, окно, изменится температура в доме или еще чего.
Мой пытливый мозг разобрался с тем, как MD стандартно принимает данные GPS навигации и обрабатывает их в системе.
Дело происходит примерно так.
Есть «скрипт» gps.php который находится в корневом каталоге вашей системы. Этот «скрипт» принимает значения от стандартного приложения Majordroid с данными по навигации:
$rec['LAT'] = $_REQUEST['latitude']; широта
$rec['LON'] = $_REQUEST['longitude']; долгота
$rec['ALT'] = round($_REQUEST['altitude'], 2); высота над уровнем моря
$rec['PROVIDER'] = $_REQUEST['provider']; не используется, я передаю gps
$rec['SPEED'] = round($_REQUEST['speed'], 2); текущая скорость
$rec['BATTLEVEL'] = $_REQUEST['battlevel']; уровень заряда батареи устройства
$rec['CHARGING'] = (int)$_REQUEST['charging']; 1 на зарядке, 0 от батарейки
$rec['DEVICEID'] = $_REQUEST['deviceid']; ID устройства
Теперь нужно подумать, как передать скрипту такие данные. Я долго размышлял, проводил эксперименты и пришел в следующему решению. Заводим внешний, публичный MQTT сервер, создаем мост с локального MQTT сервера до него, а на публичный сервер публикуем данные по навигации с помощью Tasker-а или OwnTrack.
Последний мне понравился своей стабильностью и бесплатностью. Tasker же может запросто выдать ошибку соединения с MQTT и перестать публиковать данные. OwnTrack ведет себя очень корректно и еще имеет открытые исходники, которые можно поправить под себя, если что. В общем, мы получим эти данные в наш MQTT и дернем нужный url к нашему скрипту и передадим данные по геолокации. Использование стандартных средств не ломает систему и мы оставляем возможность использования штатных средств геолокации.
Ну что? Начнем настройки?
Заводим публичный MQTT сервер. Не реклама, но я выбрал сервер wqtt.ru, там месяц бесплатно, далее 300 рублей в год. Не великие деньги за некоторую стабильность. Можно воспользоваться другим mqtt сервером, выбор за вами.
Создаем нового пользователя и запоминаем имя и пароль, они нам будут нужны дальше.
Создаем мост bridge на своем сервере mosquito к новому mqtt серверу. Для этого заходим в папку etc/mosquito/conf.d и создаем файл с названием bridge1.conf и содержимым:
# =================================================================
# Bridge to cloudmqtt
# =================================================================
#
connection cloudmqtt
address wqtt.ru:8888
#где 8888 ваш порт для подключения к серверу wqtt (порт смотрите у себя в личном кабинете)
try_private false
notifications false
start_type automatic
remote_username *****
#где ***** имя пользователя, которое вы создали в настройках на wqtt
remote_password *****
#где ***** пароль
# направление работы моста, both - двунаправленное (получать и отправлять)
#topic # both
topic # in
#указывает, что на сервер ничего не отправляем, только принимаем данные
#topic # out
#
# =================================================================
Перезагружаем наш mosquito сервер и на wqtt в веб интерфейсе (Websocket UI (wqtt.ru)) публикуем тестовое сообщение. Проверяем, что оно пришло на наш основной сервер MQTT в мажордомо. Если это не так, то смотрим логи mosquito.
Устанавливаем OwnTrack (Приложения в Google Play – OwnTracks) на свой телефон. Заходим в настройки, выбираем тип соединения mqtt, прописываем на вкладке host имя wqtt.ru, порт и id (любое значение), а на вкладке identification логин и пароль от пользователя, которого заводили на втором шаге.
Я использую режим Significant location change mode, кроме всего выше указанного вы можете выставить свои интервалы отправки данных в режиме Move и Significant. Посмотрите в настройках программы.
Majordomo
Настройка Majordomo сводится к созданию некоторых свойств и методов у объекта User и привязке получаемых данных от MQTT.
Создаем метод GPS_track_OwnTrack в котором прописываем код ниже и свойство GPSOwnTrack (выбираем, чтобы при изменении свойства вызывался наш метод
GPS_track_OwnTrack). Вот мой код:
$data=$this->getProperty('GPSOwnTrack');
$obj = json_decode( $data );
$lat = $obj->lat;
$batt = $obj->batt;
$lon = $obj->lon;
$acc = $obj->acc;
$alt = $obj->alt;
$vel = $obj->vel;
$data = "latitude=".$lat."&longitude=".$lon."&altitude=".$alt."&provider=gps&battlevel=".$batt."&deviceid=здесь_впишите_уникальное значение&accuracy=".$acc."&speed=".$vel."$";
$data = "http://адрес_вашего_мажордомо/gps.php?".$data;
getURL($data);
Создаем пользователя если он еще не был создан ранее и привязываем в MQTT модуле к свойству GPSOwnTrack данные по геолокации, которые мы получаем. Обратите внимание, что нужно привязать сырые данные вида {"type": "location","acc": 14,"alt": 103,"batt": 48,"conn": "w","lat": 50.1308109,"lon": 45.4154278,"t": "p","tid": "ic","tst": 1606488512,"vac": 2,"vel": 0}
$data=$this->getProperty('GPSData');
$data = "http://адрес_вашего_мажордомо/gps.php?".$data;
getURL($data);
Проверяем работу. Заходим в GPS и видим наши данные на карте. Здесь все стандартно, описывать не буду.
В конечном итоге, если еще поковыряться, то вы можете видеть данные по локации каждого жителя своего дома, например вот в таком виде:
Но это позже.
Камышин, Россия
На форуме: IvanSH