Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Функция отправки карты с точкой местонаходжения объекта (maps.yandex API)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Функция отправки карты с точкой местонаходжения объекта (maps.yandex API)

    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Haba last edited by

      Использую такой вариант определения местонахождения телефона (Andriod)

      1. ставим программу, которая будет в фоне отправлять текущие координаты с заданной периодичностью.

      Например tasker или как я использую Automagic Premium.

      ! ![](</s><URL url=)<link_text text="http://forum.iobroker.net/download/file ... af07e44eab">http://forum.iobroker.net/download/file.php?mode=view&id=15314&sid=66e7bf179150e8d0b12699af07e44eab</link_text>" /> ~~т.е. get запросом каждые 5 минут отправляем на IoBroker координкаты телефона на драйвер Simple API (должен быть запущен и настроен) в объект location.roman, который создали скриптом (см. ниже).

      2. Отправляем в телеграмм ссылку на картинку с координатами заданного объекта через драйвер JS

      3. Вторым сообщением отправляем определенный адрес местонахождения объекта и дату последнего обновления координат.

      Используется бесплатный https://tech.yandex.ru/maps/mapsapi/

      переменная tag это объект с координатами вида "25.22498,25.21571"

      createState('location.roman');
      
      function GPSsendMap(tag) {
          var location = tag.val.split(',');
          sendTo('telegram', {
              user: user,
              text : "https://static-maps.yandex.ru/1.x/?size=450,450&z=16&z=13&l=map&pt="+ location[1] + "," + location[0] +",flag"
          });
      
          geocode(location[1] + "," + location[0], 
              function(addr) {
                  sendTo('telegram.0', {
                          user : user,
                          text: "Адрес: " + addr + "\nОбновлено " + formatDate (tag.ts, "JJJJ.MM.TT SS:mm:ss"), 
                      });
              }, function (error) {
                  log (error);
              });
      }
      
      function geocode(coordinates, okCallback, errorCallback) {
          var addr = "Адрес не найден!";
          request ('https://geocode-maps.yandex.ru/1.x/?format=json&results=1&geocode=' + coordinates, function (error, response, body) {
          // Получаем ответ
              if (!error && response.statusCode === 200) {
                  // Парсим данные
                  var obj = JSON.parse(body);
                  addr = getKeyArray(obj,"AddressLine");
                  return okCallback(addr);
              } else {
                  return errorCallback(error);
              }
          });
      }
      
      function getKeyArray(obj, keyName) {
          var result = [];
          for (var attr in obj) {
              if (obj[attr] && typeof obj[attr] === 'object') {
                  result = result.concat(getKeyArray(obj[attr], keyName));
              }
              if (attr === keyName) {
                  result.push(obj[attr]);
              }
          }
          return result;
      }
      
      

      Функции можно вызывать например по нажатию кнопки или любому другому событию~~ 1160_gps.jpg
      1160_gps2.jpg

      1 Reply Last reply Reply Quote 0
      • H
        Haba last edited by

        Продолжение темы в сторону контроля локаций.

        Ниже пример для трех человек. Каждому задается имя, индивидуальные зоны контроля на вход/выход, радиусы зон и т.п.

        вставляем скрипт:

        ! ```
        createState('location.user1'); createState('location.user2'); createState('location.user3'); ! var radius = 0.0014; /* 71,24035723 км = 1 град 1 км = 0,014036987 град 0,1 км = 0,001403699 град 0,05 км = 0,000701849 град */ ! // массив текущих локаций var currentLocations = { "user1" : "", "user2" : "", "user3" : "" }; ! // массив локаций для сравнения с текущими координатами var locations = { "user1" : { name : "Марфуша", // имя человека text : ["вошла в локацию ","вышла из локации "], // действие событие location : [ // локации: имя, координаты центра. Дополнительно можно задать другой радиус и действия/события для определенной локации {name : "Дом", coord : "45.225003,39.215152"}, {name : "Бассейн", coord : "45.235450,39.218855"}, {name : "Школа", coord : "45.22203,39.22134"} ] }, "user2" : { name : "Маша", text : ["вошла в локацию ","вышла из локации "], location : [ {name : "Дом", coord : "45.225003,39.215152"}, {name : "Работа", coord : "45.22203,39.22134"} ] }, "user3" : { name : "Иван", text : ["вошел в локацию ","вышел из локации "], location : [ {name : "Дому", coord : "45.225003,39.215152", radius : 0.014036987*5, text : ["подъезжает к ",""]}, // контроль зоны с радиусом 5 км и только на въезд {name : "Дом", coord : "45.225003,39.215152"}, {name : "Работа", coord : "45.04984,38.97755"} ] } }; ! on({id: /^javascript\.0\.location\./, change: 'any'}, function (gps) { //log (gps.id); var name = gps.id.substr(22); // парсим имя //log(name); var txt = ""; var current; //log("Текущее положение: " + currentLocations[name]); for (var i = 0; i < locations[name].location.length; ++i) { //log( "Локация: " + locations[name].location[i].name + " Координаты: " + locations[name].location[i].coord); var rad = radius; if (locations[name].location[i].radius !== undefined) rad = locations[name].location[i].radius; // присваиваем альтернативный радиус, если есть current = locationRegion(getState("javascript.0.location." + name), locations[name].location[i].coord, rad); var locName = locations[name].location[i].name; var action = locations[name].text[0]; if (typeof (locations[name].location[i].text) !== 'undefined') action = locations[name].location[i].text[0]; // присваиваем альтернативное действие, если есть if (current && (currentLocations[name] !== locName)) { if (action !== "") txt = locations[name].name + " " + action + locName; currentLocations[name] = locName; } action = locations[name].text[1]; if (typeof (locations[name].location[i].text) !== 'undefined') action = locations[name].location[i].text[1]; // присваиваем альтернативное действие, если есть if (!current && (currentLocations[name] === locations[name].location[i].name)) { if (action !== "") txt = locations[name].name + " " + action + locName; currentLocations[name] = ""; } //log ("txt: " + txt); } if (txt !=="") sendTelegram(txt); }); ! //определяем нахожение точки в заданной локации с радиусом function locationRegion(coordinate, location, radius) { var h; var result = false; // точка в локации: true - да, false - нет var coord = coordinate.val.split(','); var loc = location.split(','); h = Math.sqrt(Math.pow((parseFloat(coord[1])-parseFloat(loc[1])),2) + Math.pow((parseFloat(coord[0])-parseFloat(loc[0])),2)); //log("Гипотенуза равна = " + h); if (h > radius) { log("Точка не принадлежит кругу.\n"); result = false; } else { log("Точка принадлежит кругу.\n"); result = true; } return result; }
        ! результат примерно такой:
        1160_1.png [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

        1 Reply Last reply Reply Quote 0
        • First post
          Last post

        Support us

        ioBroker
        Community Adapters
        Donate

        455
        Online

        31.7k
        Users

        79.9k
        Topics

        1.3m
        Posts

        1
        2
        1817
        Loading More Posts
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes
        Reply
        • Reply as topic
        Log in to reply
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
        The ioBroker Community 2014-2023
        logo