Введение и архитектура решения
В условиях жестких сетевых фильтров мобильных операторов («белые списки»), стандартные методы передачи координат часто полностью блокируются.
Данное решение строит отказоустойчивый канал связи. Смартфон отправляет геопозицию на легальные IP-адреса Yandex Cloud, находящиеся в белых списках операторов. Облачная функция на Python принимает пакет, очищает координаты от запятых, упаковывает их в чистый JSON и пробрасывает на домашний роутер.
Схема движения трафика:
Смартфон (GPSLogger) -> Yandex Cloud (Python) -> Роутер (ER605) -> Home Assistant (Порт 80)
Настройка домашнего маршрутизатора (TP-Link ER605)
По конфигурации сети, Home Assistant принимает входящий веб-трафик на стандартном порту 80. На роутере мы настроим перенаправление с внешнего порта 8123.
- Зайдите в интерфейс роутера ER605.
- Перейдите в раздел Transmission -> NAT -> Virtual Servers.
- Нажмите Add и создайте правило:
- Interface: WAN (ваш интернет-провайдер)
- External Port:
8123 - Internal Port:
80 - Internal IP: Локальный IP вашего сервера Home Assistant (например,
192.168.1.100) - Protocol: TCP
- Status: Enabled
- Нажмите Save.
Подготовка сетевой конфигурации Home Assistant
Настройка доверенных сетей прокси теперь выполняется строго через графический интерфейс (UI) умного дома.
- В Home Assistant перейдите в Настройки -> Система -> Сеть.
- Прокрутите страницу вниз до раздела параметров HTTP / Обратный прокси (Reverse Proxy).
- Включите тумблер «Использовать обратный прокси» (
Use X-Forwarded-For). - В поле доверенных прокси (
Trusted Proxies) добавьте подсети Yandex Cloud:127.0.0.1::15.45.192.0/1877.88.0.0/1884.201.128.0/17178.154.128.0/17
- Нажмите Сохранить и перезапустите Home Assistant.
Создание виртуальных сущностей и шаблона трекера
Создаем современный Template-трекер, завязанный на постоянно обновляемые глобальные переменные input_number.
- Откройте файл
configuration.yamlвашего Home Assistant. - Задайте ячейки памяти для хранения координат, добавив блок:
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
- В этот же файл
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
- Сохраните файл и полностью перезапустите сервер умного дома.
Безопасная генерация и настройка автоматизации Вебхука
Необходимо сгенерировать криптографический секретный идентификатор (ключ), который свяжет Яндекс и Home Assistant.
Как сгенерировать webhook_id:
В терминале компьютера (Linux/macOS) выполните команду:
openssl rand -hex 20
Вы получите строку из 40 символов без спецсимволов, например: 31bea8d52648c012646bffa8fffbcfe8aa81d6de. Скопируйте её.
Создание автоматизации:
- Перейдите в Настройки -> Автоматизации и сцены -> Создать автоматизацию -> Редактировать в YAML.
- Вставьте код, заменив
ВАШ_СГЕНЕРИРОВАННЫЙ_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
- Убедитесь, что тумблер «Допускать только локальные запросы» выключен (
local_only: false). Нажмите Сохранить.
Развертывание бессерверной функции в Yandex Cloud
Функция принимает любые данные от телефона, заменяет локализованные запятые в координатах на математические точки и пересылает чистые float-числа в Home Assistant.
- Зайдите в консоль Yandex Cloud, создайте функцию
ha-gps-proxyна Python 3.11. - В файле
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)}'
}
- Нажмите синюю кнопку Сохранить изменения.
- На вкладке Обзор включите тумблер «Публичная функция» и скопируйте «Ссылка для вызова».
Финальная настройка смартфона (GPSLogger)
Настроим приложение так, чтобы оно стабильно возвращало и слало правильный формат данных.
- Формат координат: В Основных настройках GPSLogger переключите формат на Десятичные градусы (Decimal Degrees) — вид простых чисел с точкой
DD.DDDDDD. - Источники координат: В Настройках производительности -> Источники координат обязательно активируйте галочку Сеть (Network / Базовые станции / Wi-Fi). Это защитит от обнуления полей координат внутри зданий.
- Параметры отправки: Перейдите в меню Пользовательский URL:
- URL: Скопированная из интерфейса Яндекса «Ссылка для вызова» функции.
- HTTP-метод:
POST - HTTP-заголовки: Введите строго
Content-Type: application/json. -
Тело HTTP (шаблон JSON): Введите ультра-короткий шаблон без лишних буквенных параметров (скорости или точности):
{ "latitude": "%LAT", "longitude": "%LON" }
- Вернитесь на главный экран приложения, дождитесь появления цифр в полях координат и нажмите кнопку Начать запись.
Верификация и привязка к пользователю умного дома
- В Home Assistant перейдите в Панель разработчика -> Состояния.
- Введите в фильтр объектов:
device_tracker.my_new_android_phone. Убедитесь, что статус изменился сunknownнаhome/not_homeи заполнился цифрами. - Перейдите в Настройки -> Люди -> [Ваше Имя].
- В разделе «Выберите устройства для отслеживания этого человека» выберите из списка ваш новый созданный объект
device_tracker.my_new_android_phone. Нажмите Сохранить.
Решение полностью готово к автоматической фоновой работе в обход любых внешних сетевых ограничений мобильных операторов.