IvanShatrykin

<<< Back

Реализация умения «кто где» без использования белого или выделенного IP

В своей системе умного дома я столкнулся с вопросом: «Как узнать, где находится тот или иной житель дома?». Разберемся на примере. Я использую 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 к нашему скрипту и передадим данные по геолокации. Использование стандартных средств не ломает систему и мы оставляем возможность использования штатных средств геолокации.

Ну что? Начнем настройки?

  1. Заводим публичный MQTT сервер. Не реклама, но я выбрал сервер wqtt.ru, там месяц бесплатно, далее 300 рублей в год. Не великие деньги за некоторую стабильность. Можно воспользоваться другим mqtt сервером, выбор за вами.

  2. Создаем нового пользователя и запоминаем имя и пароль, они нам будут нужны дальше.

  3. Создаем мост 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
    #
    # =================================================================
  4. Перезагружаем наш mosquito сервер и на wqtt в веб интерфейсе (Websocket UI (wqtt.ru)) публикуем тестовое сообщение. Проверяем, что оно пришло на наш основной сервер MQTT в мажордомо. Если это не так, то смотрим логи mosquito.

  5. Устанавливаем OwnTrack (Приложения в Google Play – OwnTracks) на свой телефон. Заходим в настройки, выбираем тип соединения mqtt, прописываем на вкладке host имя wqtt.ru, порт и id (любое значение), а на вкладке identification логин и пароль от пользователя, которого заводили на втором шаге.

  6. OwnTrack имеет несколько режимов работы.
    Quiet mode: Ручной режим отправки данных
    Manual mode: Ручной режим отправки данных, но автоматическая отправка данных при выходе или входе в зоны (настраиваются в программе)
    Significant location change mode: Стандартный режим. Отправка данных зависит от изменения координат, если вы перемещаетесь, то чаще, если вы не двигаетесь, то реже (настраивается).
    Move mode: Режим перемещений. Можно включать, если вы сели в автомобиль и быстро перемещаетесь (интервал настраивается).

Я использую режим Significant location change mode, кроме всего выше указанного вы можете выставить свои интервалы отправки данных в режиме Move и Significant. Посмотрите в настройках программы.

  1. Кто хочет Tasker, то устанавливаем его, ставим плагин MQTT и в настройках плагина пишем строку для публикации вот так: latitude=%gllatitude&longitude=%gllongitude&altitude=%glaltitude&provider=gps&battlevel=%BATT&deviceid=5560ff04a86fd97e&accuracy=%glcoordinatesaccuracy&

Majordomo
Настройка Majordomo сводится к созданию некоторых свойств и методов у объекта User и привязке получаемых данных от MQTT.

  1. Создаем метод 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);
  2. Создаем пользователя если он еще не был создан ранее и привязываем в 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}

  3. Если вы решили использовать Tasker, то создаем метод GPS_track и свойство GPSData (не забываем выставить, чтобы при изменении вызывался метод GPS_track). В mqtt привязываем тогда данные в свойство GPSData, а сами данные будут иметь вид latitude=50.1307907&longitude=45.4155094&altitude=103.0&provider=gps&battlevel=61&deviceid=5560ff04a86fd97e&accuracy=20.0&
    код метода:
$data=$this->getProperty('GPSData');
$data = "http://адрес_вашего_мажордомо/gps.php?".$data;
getURL($data);

Проверяем работу. Заходим в GPS и видим наши данные на карте. Здесь все стандартно, описывать не буду.
В конечном итоге, если еще поковыряться, то вы можете видеть данные по локации каждого жителя своего дома, например вот в таком виде:


Но это позже.

Discuss (5) (13)

See also:
2020-10-17 Основы управления радиаторами батарей отопления для поддержания оптимальной температуры в помещении.

Камышин, Россия

На форуме: IvanSH