Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Функция отправки карты с точкой местонаходжения объекта (maps.yandex API)

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    703

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    5.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

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

Scheduled Pinned Locked Moved ioBroker скрипты
2 Posts 1 Posters 2.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    Haba
    wrote on last edited by
    #1

    Использую такой вариант определения местонахождения телефона (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
    0
    • H Offline
      H Offline
      Haba
      wrote on last edited by
      #2

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

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

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

      ! ```
      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
      0

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      Support us

      ioBroker
      Community Adapters
      Donate

      542

      Online

      32.7k

      Users

      82.6k

      Topics

      1.3m

      Posts
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
      ioBroker Community 2014-2025
      logo
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • Home
      • Recent
      • Tags
      • Unread 0
      • Categories
      • Unreplied
      • Popular
      • GitHub
      • Docu
      • Hilfe