Как перестать мониторить погодные приложения: настраиваем утренний брифинг в Telegram через n8n и бесплатный API Open-Meteo.

1. Введение и боль

Каждое утро среднестатистического человека начинается с одинакового ритуала: разблокировать смартфон, открыть погодное приложение или зайти на сайт прогноза, продраться сквозь рекламные баннеры, всплывающие видео и нерелевантные виджеты. Стандартные погодные приложения грешат перегруженным интерфейсом: чтобы узнать банальную вещь - надевать ли сегодня теплую куртку и брать ли зонт, - приходится скроллить несколько экранов с ультрафиолетовыми индексами, фазами луны и анимацией облаков.

Вторая проблема - готовые погодные боты в Telegram. Большинство публичных решений либо заброшены авторами, либо требуют платную подписку за отправку уведомлений по расписанию, либо раз в неделю начинают заваливать чат партнерской рекламой сомнительных каналов. При этом кастомизировать вывод под себя невозможно: нельзя убрать лишние параметры или вывести конкретно те метрики, которые важны именно вам (например, порывы ветра и снежный покров).

Мне требовалось простое, надежное и автономное решение: строго по расписанию каждое утро получать в Telegram лаконичное, структурированное сообщение со всеми критическими параметрами на день. Никаких лишних действий, никаких сторонних подписок и чужой рекламы — только чистые данные из надежного источника, работающие на собственном сервере.

Как перестать мониторить погодные приложения: настраиваем утренний брифинг в Telegram через n8n и бесплатный API Open-Meteo.

2. Архитектура решения

Сценарий реализован на базе платформы автоматизации n8n. Воркфлоу намеренно спроектирован линейным и легковесным - он состоит всего из четырех последовательных узлов:

[Schedule Trigger] ➔ [HTTP Request] ➔ [Edit Fields] ➔ [Send a text message]

Как перестать мониторить погодные приложения: настраиваем утренний брифинг в Telegram через n8n и бесплатный API Open-Meteo.

Стек технологий:

  • Платформа оркестрации: n8n (self-hosted).
  • Источник данных: Open-Meteo Forecast API - открытый погодный сервис с бесплатным доступом без необходимости выпуска API-токенов.
  • Транспорт доставки: Telegram Bot API (официальная нода Telegram в n8n).

Принцип движения данных:

  1. Триггер времени (Schedule Trigger): активирует сценарий каждое утро по расписанию.
  2. Запрос к источнику (HTTP Request): отправляет GET-запрос к API Open-Meteo с точными географическими координатами (широта и долгота) нужной локации и перечнем запрашиваемых параметров на текущий день.
  3. Парсинг и трансформация (Edit Fields): извлекает массивы значений из ответа API и преобразует их в плоский, типизированный объект с понятными ключами (температура, ощущаемая температура, осадки, ветер).
  4. Формирование и отправка (Send a text message): собирает HTML-шаблон с эмодзи-разметкой и отправляет готовый пост в целевой диалог или канал через метод sendMessage

3. Разбор «под капотом» и грабли

Входные данные и формирование запроса

В качестве источника был выбран Open-Meteo. В отличие от OpenWeatherMap или Яндекс Погоды, он не требует регистрации, авторизационных ключей и кредитных карт для базовых персональных сценариев.

Параметры GET-запроса в узле HTTP Request:

https://api.open-meteo.com/v1/forecast?latitude=51.5074&longitude=-0.1278&daily=temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,rain_sum,showers_sum,precipitation_sum,snowfall_sum,precipitation_hours,wind_speed_10m_max,wind_gusts_10m_max&timezone=auto

В параметрах запроса передаются точные координаты, флаг timezone=auto для корректного расчета временных зон и список необходимых агрегаций за день (daily).

Логика преобразования данных

Сервер возвращает JSON, где внутри блока daily лежат массивы значений по дням недели. Так как прогноз нужен именно на текущие сутки, в ноде Edit Fields (тип n8n-nodes-base.set) мы забираем нулевой индекс каждого массива ([0]):

  • Region: ={{ $json.timezone }}
  • Today_weather: ={{ $json.daily.time[0] }}
  • temp_max: ={{ $json.daily.temperature_2m_max[0] }}
  • temp_min: ={{ $json.daily.temperature_2m_min[0] }}
  • feels_like_min: ={{ $json.daily.apparent_temperature_min[0] }}
  • feels_like_max: ={{ $json.daily.apparent_temperature_max[0] }}
  • windy_speed_10m_max: ={{ $json.daily.wind_speed_10m_max[0] }}
  • wind_gusts: ={{ $json.daily.wind_gusts_10m_max[0] }}
  • rain_sum: ={{ $json.daily.rain_sum[0] }}
  • snowfall_sum: ={{ $json.daily.snowfall_sum[0] }}
  • precipitation: ={{ $json.daily.precipitation_hours[0] }}

Такой подход нормализует контекст: финальная нода Telegram не перегружается длинными выражениями вроде $json.daily.apparent_temperature_max[0], а оперирует чистыми переменными.

Шаблонизация сообщения

В ноде Send a text message включен режим parse_mode: HTML. Это позволяет структурировать текст списками, жирным начертанием и курсивом, делая сообщение удобным для быстрого сканирования глазами:

HTML🔔 Прогноз погоды на сегодня 📍 [Ваш Город] | 📅 {{ $json.Today_weather }}🌡 Температура воздуха: • 🏙 Днём: {{ $json.temp_max }}°C • 🌃 Ночью: {{ $json.temp_min }}°C 🧥 По ощущениям: • От {{ $json.feels_like_min }}°C до {{ $json.feels_like_max }}°C 🍃 Ветер: • Скорость: {{ $json.windy_speed_10m_max }} км/ч (порывы до {{ $json.wind_gusts }} км/ч) 🌧 Осадки: • Дождь: {{ $json.rain_sum }} мм • Снег: {{ $json.snowfall_sum }} см • Осадки продлятся: {{ $json.precipitation }} ч Хорошего и продуктивного дня! 😊

Узкие места и обработка краевых случаев

  1. Часовые пояса сервера и крона: Частая ошибка при настройке Schedule Trigger - несовпадение системного времени контейнера/хоста и реального часового пояса пользователя. Если таймзона n8n настроена на UTC, триггер на 7:00 или 8:00 утра сработает со сдвигом. В настройках инстанса важно прописать переменную окружения GENERIC_TIMEZONE, либо учитывать смещение вручную.
  2. Параметр timezone=auto в API: Без явного указания часового пояса в Open-Meteo сервис отдаст метрики по Гринвичу, из-за чего дневные максимумы и минимумы могут сместиться на предыдущие или следующие сутки. Параметр timezone=auto автоматически привязывает суточные отрезки к координатам.
  3. HTML-экранирование: Если в названиях населенных пунктов или кастомных строках встретятся символы < или >, Telegram вернет ошибку парсинга сообщения. Для статического шаблона с числами из API эта проблема исключена, так как числовые поля не содержат спецсимволов HTML.

4. Итоги и экономика

  • Скорость выполнения пайплайна: от момента старта триггера до получения сообщения в Telegram проходит около 350–500 мс. Задержка обусловлена исключительно сетевым round-trip запроса к Open-Meteo и Telegram Bot API.
  • Стоимость инфраструктуры: 0 рублей дополнительных затрат. Open-Meteo полностью бесплатен для некоммерческих объемов, Telegram API бесплатен, а сам воркфлоу потребляет минимальное количество ресурсов и работает на уже имеющемся self-hosted сервере.
  • Экономия времени: ликвидировано утреннее зависание в погодных сервисах. Вся картина дня - от ветра до снега - доступна за 5 секунд чтения экрана блокировки смартфона.

5. Заключение

Автоматизация не обязательно должна быть громоздкой: связка из 4 нод без единой строчки бэкенд-кода полностью закрывает ежедневную бытовую задачу.

Готовый JSON-шаблон сценария для импорта в n8n с инструкцией опубликовал в репозитории на GitHub

Другие готовые JSON-шаблоны публикую в Telegram-канале Build > Запуск (@tanaka_dev).

✅ Забирайте, импортируйте в один клик и настраивайте утреннюю сводку под свой город.

22