Умный дом сообщает геолокацию домочадцев по данным со смартфонов.
Если есть мысли как оптимизировать улучшить код, пишите в теме.
Работает в связке с дополнением GPS-трекер.
На смартфонах пользователей каждые 5 минут данные отправляет на сервер Majordomo приложение Tasker .
backup.xml:
Код: Выделить всё
<TaskerData sr="" dvi="1" tv="5.5.bf2">
<Profile sr="prof5" ve="2">
<cdate>1558354268194</cdate>
<edate>1558354582100</edate>
<id>5</id>
<mid0>3</mid0>
<nme>Sync5min</nme>
<Time sr="con0">
<fh>-1</fh>
<fm>-1</fm>
<rep>2</rep>
<repval>5</repval>
<th>-1</th>
<tm>-1</tm>
</Time>
</Profile>
<Project sr="proj0" ve="2">
<cdate>1559129981374</cdate>
<mdate>1559130966340</mdate>
<name>Base</name>
<pids>5,4</pids>
<tids>3,2</tids>
<Img sr="icon" ve="2">
<nme>mw_action_home</nme>
</Img>
</Project>
<Task sr="task3">
<cdate>1558353566729</cdate>
<edate>1559131146614</edate>
<id>3</id>
<nme>GPS</nme>
<pri>6</pri>
<Action sr="act0" ve="7">
<code>902</code>
<Int sr="arg0" val="2"/>
<Int sr="arg1" val="100"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
</Action>
<Action sr="act1" ve="7">
<code>590</code>
<Str sr="arg0" ve="3">%LOC</Str>
<Str sr="arg1" ve="3">,</Str>
<Int sr="arg2" val="0"/>
</Action>
<Action sr="act2" ve="7">
<code>118</code>
<Str sr="arg0" ve="3">%MajorServer</Str>
<Str sr="arg1" ve="3">gps.php</Str>
<Str sr="arg2" ve="3">latitude=%LOC1
longitude=%LOC2
altitude=%LOCALT
provider=%TNET
speed=%LOCSPD
battlevel=%BATT
deviceid=%IDTEL
accuracy=%LOCACC</Str>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Int sr="arg5" val="10"/>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="0"/>
</Action>
</Task>
</TaskerData>
Код: Выделить всё
//склонение слов
function morpher_inflect($name, $padej = 0) {
//[0]Им. п, [1]Род. п, [2]Дат. п, [3]Вин. п, [4]Тв. п, [5]Пред. п
//$url = "http://morphos.io/api/inflect-geographical-name?name=" . urlencode($name) . "&_format=xml";
$url = "http://morphos.io/api/inflect-name?name=" . urlencode($name) . "&_format=xml";
$data_file = file_get_contents($url);
$xml = simplexml_load_string($data_file);
$res = $xml->{'cases'}->{'item'}[$padej];
return $res;
}
//геокодер получает адрес по координатам
function Getgeocode($lon, $lat) {
$api_key = "***********************************"; //yandex API KEY
$data_file="http://geocode-maps.yandex.ru/1.x/?apikey=" . $api_key . "&geocode=E" . $lon . ",N" . $lat;
$xml = simplexml_load_file($data_file);
$res = $xml->{'GeoObjectCollection'}->{'featureMember'}[0]->{'GeoObject'}->{'metaDataProperty'}->{'GeocoderMetaData'}->{'AddressDetails'}->{'Country'}->{'AddressLine'};
if (!$res) $res = "Не определено";
return $res;
}
Код: Выделить всё
if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];
$objects = getObjectsByClass("Users");
foreach($objects as $obj) {
callMethod($obj['TITLE'] . ".SetLocation");
$fio = gg($obj['TITLE'] . ".fullName");
$name_arr = explode(" ", $fio);
$name = $name_arr[0]; //получаем имя
$seen = gg($obj['TITLE'] . ".seenAt"); //замечен в...
if ($seen) {
$msg = "Местонахождение ";
if ($i) $msg = "— "; //сокращение
$old_seen_arr = getHistory($obj['TITLE'] . ".seenAt", strtotime("-60 minute")); //получаем массив истории
echo "<p>";
print_r($old_seen_arr);
echo "</p>";
$old_seen = $old_seen_arr[0]['VALUE']; //получаем из итории
if ($old_seen == $seen) {
$still = "по-прежнему ";
} else {
$still = "";
}
$ret = $msg . morpher_inflect($name, 1) . ": " . $still . $seen;
} else {
$msg = "Приблизительное местонахождение ";
$location = gg($obj['TITLE'] . ".Location");
if ($i) $msg = "— "; //сокращение
$ret = $msg . morpher_inflect($name, 1) . ": " . $location;
}
$ismoving = gg($obj['TITLE'] . ".isMoving"); //в движении...
$speed = gg($obj['TITLE'] . ".SpeedKmH"); //скорость передвижения
if (intval($ismoving) && $speed >= 5) {
$ret .= ". Скорость передвижения: " . round($speed) . " Км/ч";
}
if ($still == "") {
$distance = gg($obj['TITLE'] . ".HomeDistanceKm");
if ($distance >= 1) {
$ret .= ". Удаленность от Квартиры: " . round($distance) . " Км";
}
}
$new_ts = date_timestamp_get(date_create()); //текущий таймштамп
$get_ts = gg($obj['TITLE'] . ".CoordinatesUpdatedTimestamp"); //таймштамп полученных данных с GPS
$dif_ts = $new_ts - $get_ts;
if (round($dif_ts / 60) >= 15 && round($dif_ts / 60) < 60) { //если смартфон не передает данные в диапазоне от 15 до 60 минут
$ret .= ". Данные GPS получены " . round($dif_ts / 60) . " мин. назад";
}
if (round($dif_ts / 60) >= 60) { //если смартфон не передает данные более 60 минут
$ret .= ". Данные GPS получены более " . date("H:i", mktime(0, 0, $dif_ts)) . " назад";
}
say($ret, $level);
echo "<br>" . $ret;
$i++;
}
(У меня в авто лежат старые сматрфоны в качестве gps-трекеров)Приблизительное местонахождение Николая: Беларусь, Минск, Октябрьский район, микрорайон Чкаловский. Удаленность от Квартиры: 5 Км
— Натальи: по-прежнему Квартира в Минске
— Галины: по-прежнему Дом в Шарковщине
— Даниила: Квартира в Минске. Данные GPS получены более 01:53 назад
— Авт+о-Тойота-Приуса: Беларусь, Минск, улица Казинца. Скорость передвижения: 56 Км/ч
— Авт+о-Бмв-Е36: Квартира в Минске. Данные GPS получены более 03:43 назад
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.