ioBroker Find my Mobile
Скрипт расчёта расстояния до мобильного телефона
Сделано на основании информации отсюда и уважаемого автора Александра @cahek2202 Скрипт, который получает координаты с мобилы и на основании координат считает расстояния до заданных точек. И потом реагирует как нужно.
Расстояние с гугл/яндекс карт не совпадает с расчётным. хз как на картах считается расстояние. Имейте ввиду.
//данный блок лучше убрать в global секцию --- начало блока
//Координаты дома и важных мест
var long_дом = xx . xxxxxxxxxxxxxx ;
var alt_дом = xx . xxxxxxxxxxxxxx ;
var long_офис = xx . xxxxxxxxxxxxxx ;
var alt_офис = xx . xxxxxxxxxxxxxx ;
var long_школа = xx . xxxxxxxxxxxxxx ;
var alt_школа = xx . xxxxxxxxxxxxxx ;
//Мобила один - расстояния до объектов – ID 43a43eff узнаётся после получения первой посылки с мобилы
createState ( ' javascript.0.GPSLogger.43a43eff.доДома ' );
createState ( ' javascript.0.GPSLogger.43a43eff.доОфиса ' );
createState ( ' javascript.0.GPSLogger.43a43eff.доШколы ' );
//Мобила два - расстояния до объектов – ID 47fff2aa узнаётся после получения первой посылки с мобилы
createState ( ' javascript.0.GPSLogger.47fff2aa.доДома ' );
createState ( ' javascript.0.GPSLogger.47fff2aa.доОфиса ' );
createState ( ' javascript.0.GPSLogger.47fff2aa.доШколы ' );
//Переменные в MQTT для работы скриптов автовключения света при приближении к дому
createState ( ' javascript.0.MyHome.ЛюдиДома ' ); //флаг присутствия людей дома
createState ( ' javascript.0.MyHome.ProjON ' ); //флаг включения прожекторов
//данный блок лучше убрать в global секцию --- конец блока
//Сам скрипт
//Скрипт получения координат с мобильнх телефонов
//слушаем порт 8090 и получаем с него по POST запросу данные
var http = require ( ' http ' );
var server = http . createServer (). listen ( 8090 );
var userA ;
server . on ( ' request ' , function ( req , res ) {
res . writeHead ( 200 );
if ( req . method == ' POST ' ) {
var body = '' ;
}
req . on ( ' data ' , function ( data ) {
body += data ;
console . log ( body );
});
req . on ( ' end ' , function () {
temp = body . split ( ' & ' );
var obj = {};
res . write ( ' hi ' );
res . end ();
for ( var key in temp ) {
temp2 = temp [ key ]. split ( ' = ' );
var objkey = temp2 [ 0 ];
var objval = temp2 [ 1 ];
obj [ objkey ] = objval ;
}
if ( getState ( ' javascript.0.GPSLogger. ' + obj . deviceid + ' .deviceid ' ). val ) {
for ( var param in obj ) {
setState ( ' javascript.0.GPSLogger. ' + obj . deviceid + ' . ' + param , obj [ param ], true );
}
} else {
for ( param in obj ) {
createState ( ' GPSLogger. ' + obj . deviceid + ' . ' + param , obj [ param ]);
}
}
});
});
//Реагируем на изменение координат всех мобил, которые шлют данные
on ({ id : /^javascript \. 0 \. GPSLogger.* \. latitude$/ , change : " any " }, function ( obj ) {
var value = obj . state . val ;
var oldValue = obj . oldState . val ;
var numberA = obj . id . substring ( 31 , 23 );
//Блок необходимый для places. Если places не используется, блок можно удалить.
//получаем ID мобилы
//соотносим имя из plces.0 и ID мобилы из скрипта
if ( numberA == ' 43a43eff ' ) { userA = ' ИмяЧеловека1 ' ; }
else if ( numberA == ' 47fff2aa ' ) { userA = ' ИмяЧеловека2 ' ; }
//Записываем данные в объекты places
sendTo ( " places.0 " , {
user : userA ,
latitude : value ,
longitude : getState ( ' javascript.0.GPSLogger. ' + numberA + ' .longitude ' ). val ,
timestamp : getDateObject ( getState ( ' javascript.0.GPSLogger. ' + numberA + ' .latitude ' ). ts ). getTime ()
});
//Конец блока для places
Сергей Фролов , [ 24.12 . 18 00 : 35 ]
//Берём записанные в mqtt свежие координаты
var long_target = getState ( ' javascript.0.GPSLogger. ' + numberA + ' .latitude ' ). val ;
var alt_target = getState ( ' javascript.0.GPSLogger. ' + numberA + ' .longitude ' ). val ;
//Cчитаем расстояние в метрах от мобилы до каждого объекта. Записываем в mqtt
setState ( ' javascript.0.GPSLogger. ' + numberA + ' .доДома ' , ( 6371 * 1000 * Math . acos ( Math . sin ( Math . PI * alt_дом / 180 ) * Math . sin ( Math . PI * alt_target / 180 ) + Math . cos ( Math . PI * alt_дом / 180 ) * Math . cos ( Math . PI * alt_target / 180 ) * Math . cos ( Math . PI * ( long_дом - long_target ) / 180 ))). toFixed ());
setState ( ' javascript.0.GPSLogger. ' + numberA + ' .доОфиса ' , ( 6371 * 1000 * Math . acos ( Math . sin ( Math . PI * alt_офис / 180 ) * Math . sin ( Math . PI * alt_target / 180 ) + Math . cos ( Math . PI * alt_офис / 180 ) * Math . cos ( Math . PI * alt_target / 180 ) * Math . cos ( Math . PI * ( long_офис - long_target ) / 180 ))). toFixed ());
setState ( ' javascript.0.GPSLogger. ' + numberA + ' .доШколы ' , ( 6371 * 1000 * Math . acos ( Math . sin ( Math . PI * alt_школа / 180 ) * Math . sin ( Math . PI * alt_target / 180 ) + Math . cos ( Math . PI * alt_школа / 180 ) * Math . cos ( Math . PI * alt_target / 180 ) * Math . cos ( Math . PI * ( long_школа - long_target ) / 180 ))). toFixed ());
//Отправить в телеграмм расстояния до объектов в метрах. Нужно для отладки.
//SendToTelegram(userA +' до дома '+ (6371*1000*Math.acos(Math.sin(Math.PI*alt_дом/180)*Math.sin(Math.PI*alt_target/180)+Math.cos(Math.PI*alt_дом/180)*Math.cos(Math.PI*alt_target/180)*Math.cos(Math.PI*(long_дом-long_target)/180))).toFixed(), getState('telegram.0.communicate.requestChatId').val);
//SendToTelegram(userA +' до офиса '+ (6371*1000*Math.acos(Math.sin(Math.PI*alt_офис/180)*Math.sin(Math.PI*alt_target/180)+Math.cos(Math.PI*alt_офис/180)*Math.cos(Math.PI*alt_target/180)*Math.cos(Math.PI*(long_офис-long_target)/180))).toFixed(), getState('telegram.0.communicate.requestChatId').val);
//SendToTelegram(userA +' до школы ' + (6371*1000*Math.acos(Math.sin(Math.PI*alt_школа/180)*Math.sin(Math.PI*alt_target/180)+Math.cos(Math.PI*alt_школа/180)*Math.cos(Math.PI*alt_target/180)*Math.cos(Math.PI*(long_школа-long_target)/180))).toFixed(), getState('telegram.0.communicate.requestChatId').val);
//Блок проверки
//Выключить весь свет, когда расстояния до мобил больше 400 метров и дома кто то был
if (( getState ( ' javascript.0.MyHome.ЛюдиДома ' ). val ) && ( getState ( ' javascript.0.GPSLogger.43a70ef7.доДома ' ). val > 400 ) && ( getState ( ' javascript.0.GPSLogger.477182ff.доДома ' ). val > 400 )) {
setState ( ' javascript.0.MyHome.ЛюдиДома ' , false );
setState ( ' javascript.0.MyHome.ProjON ' , false );
Управление_Светом ( ' мы уехали ' ); }
//Включить весь свет, когда расстояния до мобил меньше 400 метров и дома никого нет
if ( ! ( getState ( ' javascript.0.MyHome.ProjON ' ). val ) && (( getState ( ' javascript.0.GPSLogger.43a70ef7.доДома ' ). val < 400 ) || ( getState ( ' javascript.0.GPSLogger.477182ff.доДома ' ). val < 400 ))) {
setState ( ' javascript.0.MyHome.ЛюдиДома ' , true );
setState ( ' javascript.0.MyHome.ProjON ' , true );
Управление_Светом ( ' мы приехали ' ); }
//Включить прожекторы при приближении к дому ближе 1000 метров
if ( ! ( getState ( ' javascript.0.MyHome.ProjON ' ). val ) && (( getState ( ' javascript.0.GPSLogger.43a70ef7.доДома ' ). val < 1000 ) || ( getState ( ' javascript.0.GPSLogger.477182ff.доДома ' ). val < 1000 ))) {
setState ( ' javascript.0.MyHome.ProjON ' , true );
Управление_Светом ( ' включи все прожекторы ' ); }
});
Comments