Сделано на основании информации отсюда viewtopic.php?t=17435 и уважаемого автора Александра @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
//Берём записанные в 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);
Управление_Светом('включи все прожекторы'); }
});
#скрипт #телеграмм #расстояние #координаты #gps #гео #геолокация #определение #координаты