Home Assistant - Yandex - GPS

13-11-2026

Введение и архитектура решения

В условиях жестких сетевых фильтров мобильных операторов («белые списки»), стандартные методы передачи координат часто полностью блокируются.

Данное решение строит отказоустойчивый канал связи. Смартфон отправляет геопозицию на легальные IP-адреса Yandex Cloud, находящиеся в белых списках операторов. Облачная функция на Python принимает пакет, очищает координаты от запятых, упаковывает их в чистый JSON и пробрасывает на домашний роутер.

Схема движения трафика:

Смартфон (GPSLogger) -> Yandex Cloud (Python) -> Роутер (ER605) -> Home Assistant (Порт 80)

Настройка домашнего маршрутизатора (TP-Link ER605)

По конфигурации сети, Home Assistant принимает входящий веб-трафик на стандартном порту 80. На роутере мы настроим перенаправление с внешнего порта 8123.

  1. Зайдите в интерфейс роутера ER605.
  2. Перейдите в раздел Transmission -> NAT -> Virtual Servers.
  3. Нажмите Add и создайте правило:
    • Interface: WAN (ваш интернет-провайдер)
    • External Port: 8123
    • Internal Port: 80
    • Internal IP: Локальный IP вашего сервера Home Assistant (например, 192.168.1.100)
    • Protocol: TCP
    • Status: Enabled
  4. Нажмите Save.

Подготовка сетевой конфигурации Home Assistant

Настройка доверенных сетей прокси теперь выполняется строго через графический интерфейс (UI) умного дома.

  1. В Home Assistant перейдите в Настройки -> Система -> Сеть.
  2. Прокрутите страницу вниз до раздела параметров HTTP / Обратный прокси (Reverse Proxy).
  3. Включите тумблер «Использовать обратный прокси» (Use X-Forwarded-For).
  4. В поле доверенных прокси (Trusted Proxies) добавьте подсети Yandex Cloud:
    • 127.0.0.1
    • ::1
    • 5.45.192.0/18
    • 77.88.0.0/18
    • 84.201.128.0/17
    • 178.154.128.0/17
  5. Нажмите Сохранить и перезапустите Home Assistant.

Создание виртуальных сущностей и шаблона трекера

Создаем современный Template-трекер, завязанный на постоянно обновляемые глобальные переменные input_number.

  1. Откройте файл configuration.yaml вашего Home Assistant.
  2. Задайте ячейки памяти для хранения координат, добавив блок:
input_number:
  phone_lat:
    name: "Phone Latitude"
    min: -90
    max: 90
    step: 0.000001
    mode: box
  phone_lon:
    name: "Phone Longitude"
    min: -180
    max: 180
    step: 0.000001
    mode: box
  1. В этот же файл configuration.yaml добавьте создание Template-компонента отслеживания:
template:
  - device_tracker:
      - name: "My New Android Phone"
        unique_id: my_new_android_phone_tracker
        latitude: "{{ states('input_number.phone_lat') | float(0) }}"
        longitude: "{{ states('input_number.phone_lon') | float(0) }}"
        icon: mdi:cellphone-gps
  1. Сохраните файл и полностью перезапустите сервер умного дома.

Безопасная генерация и настройка автоматизации Вебхука

Необходимо сгенерировать криптографический секретный идентификатор (ключ), который свяжет Яндекс и Home Assistant.

Как сгенерировать webhook_id:

В терминале компьютера (Linux/macOS) выполните команду:

openssl rand -hex 20

Вы получите строку из 40 символов без спецсимволов, например: 31bea8d52648c012646bffa8fffbcfe8aa81d6de. Скопируйте её.

Создание автоматизации:

  1. Перейдите в Настройки -> Автоматизации и сцены -> Создать автоматизацию -> Редактировать в YAML.
  2. Вставьте код, заменив ВАШ_СГЕНЕРИРОВАННЫЙ_HEX_КЛЮЧ на вашу строку из OpenSSL:
alias: "GPS: Прием координат из Яндекса"
description: ""
trigger:
  - platform: webhook
    webhook_id: ВАШ_СГЕНЕРИРОВАННЫЙ_HEX_КЛЮЧ
    allowed_methods:
      - POST
    local_only: false
condition: []
action:
  - action: input_number.set_value
    target:
      entity_id: input_number.phone_lat
    data:
      value: "{{ trigger.json.latitude | float }}"
  - action: input_number.set_value
    target:
      entity_id: input_number.phone_lon
    data:
      value: "{{ trigger.json.longitude | float }}"
mode: single
  1. Убедитесь, что тумблер «Допускать только локальные запросы» выключен (local_only: false). Нажмите Сохранить.

Развертывание бессерверной функции в Yandex Cloud

Функция принимает любые данные от телефона, заменяет локализованные запятые в координатах на математические точки и пересылает чистые float-числа в Home Assistant.

  1. Зайдите в консоль Yandex Cloud, создайте функцию ha-gps-proxy на Python 3.11.
  2. В файле index.py полностью замените код на следующий:
import json
import requests
from urllib.parse import parse_qs

# Укажите ваш домашний внешний белый IP-адрес и внешний порт роутера (8123)
HOME_HA_URL = "http://ВАШ_ВНЕШНИЙ_БЕЛЫЙ_IP:8123" 
# Сюда вставьте ваш сгенерированный секретный ключ
SECRET_WEBHOOK = "ВАШ_СГЕНЕРИРОВАННЫЙ_HEX_КЛЮЧ"

def handler(event, context):
    try:
        raw_body = event.get('body', '')
        
        try:
            body = json.loads(raw_body)
        except Exception:
            parsed = parse_qs(raw_body)
            body = {k: v for k, v in parsed.items()}
            
            if not body and '{' in raw_body:
                try:
                    body = json.loads(raw_body[raw_body.find('{'):raw_body.rfind('}')+1])
                except Exception:
                    body = {}

        lat_raw = str(body.get('latitude', body.get('lat', '0'))).replace(',', '.').strip()
        lon_raw = str(body.get('longitude', body.get('lon', '0'))).replace(',', '.').strip()
        
        latitude = float(lat_raw)
        longitude = float(lon_raw)

        if latitude == 0.0 or longitude == 0.0:
            return {'statusCode': 400, 'body': f'Cannot parse coordinates from data: {raw_body}'}

        cleaned_body = {
            "latitude": latitude,
            "longitude": longitude
        }
        
        ha_webhook_url = f"{HOME_HA_URL}/api/webhook/{SECRET_WEBHOOK}"
        response = requests.post(ha_webhook_url, json=cleaned_body, timeout=5)
        
        return {
            'statusCode': response.status_code,
            'body': f'Data forwarded. HA Response: {response.text}'
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': f'Error: {str(e)}'
        }
  1. Нажмите синюю кнопку Сохранить изменения.
  2. На вкладке Обзор включите тумблер «Публичная функция» и скопируйте «Ссылка для вызова».

Финальная настройка смартфона (GPSLogger)

Настроим приложение так, чтобы оно стабильно возвращало и слало правильный формат данных.

  1. Формат координат: В Основных настройках GPSLogger переключите формат на Десятичные градусы (Decimal Degrees) — вид простых чисел с точкой DD.DDDDDD.
  2. Источники координат: В Настройках производительности -> Источники координат обязательно активируйте галочку Сеть (Network / Базовые станции / Wi-Fi). Это защитит от обнуления полей координат внутри зданий.
  3. Параметры отправки: Перейдите в меню Пользовательский URL:
    • URL: Скопированная из интерфейса Яндекса «Ссылка для вызова» функции.
    • HTTP-метод: POST
    • HTTP-заголовки: Введите строго Content-Type: application/json.
    • Тело HTTP (шаблон JSON): Введите ультра-короткий шаблон без лишних буквенных параметров (скорости или точности):

      {
        "latitude": "%LAT",
        "longitude": "%LON"
      }
      
  4. Вернитесь на главный экран приложения, дождитесь появления цифр в полях координат и нажмите кнопку Начать запись.

Верификация и привязка к пользователю умного дома

  1. В Home Assistant перейдите в Панель разработчика -> Состояния.
  2. Введите в фильтр объектов: device_tracker.my_new_android_phone. Убедитесь, что статус изменился с unknown на home/not_home и заполнился цифрами.
  3. Перейдите в Настройки -> Люди -> [Ваше Имя].
  4. В разделе «Выберите устройства для отслеживания этого человека» выберите из списка ваш новый созданный объект device_tracker.my_new_android_phone. Нажмите Сохранить.

Решение полностью готово к автоматической фоновой работе в обход любых внешних сетевых ограничений мобильных операторов.