Telegram и WhatsApp заблокированы: 5 рабочих альтернатив для IoT-проектов на ферме

Фермозавр·12 апреля 2026 г.·13 мин чтения

Telegram заблокирован — алерты с теплицы не приходят. Разбираем пять российских каналов уведомлений с рабочим кодом для ESP32 и Node.js: VK Bot API, email, Web Push, ntfy и мультиканальная отправка.

Telegram и WhatsApp заблокированы: 5 рабочих альтернатив для IoT-проектов на ферме

Telegram заблокирован. WhatsApp — тоже. Signal, Viber — с перебоями. Если вы строили систему уведомлений для фермы на Telegram Bot API — она перестала работать. ESP32 отправляет сообщение, получает таймаут, и вы узнаёте о заморозке в теплице только утром по замёрзшей рассаде. Знакомо? В этой статье разбираем, чем заменить заблокированные мессенджеры в DIY-проектах для фермы: от VK Bot API до веб-пушей и email-алертов. С рабочим кодом, который можно скопировать и запустить за вечер.

Что случилось и почему это критично для фермера

В 2026 году Роскомнадзор заблокировал Telegram и WhatsApp на территории России. Технически это означает, что DNS-запросы к api.telegram.org и web.whatsapp.com не резолвятся, а IP-адреса серверов попали в реестр блокировок. Для обычного пользователя это неудобство. Для ESP32 в теплице — это полная потеря канала уведомлений.

Проблема не в том, что мессенджер не открывается на телефоне. Проблема в IoT-устройствах: микроконтроллеры не умеют поднимать туннели (им не хватает памяти и вычислительной мощности), а прокси-серверы требуют обслуживания. Значит, нужен канал доставки уведомлений, который работает без блокировок.

Хорошая новость: российские альтернативы не просто «работают» — некоторые из них по возможностям API не уступают Telegram. Разберём пять вариантов — от самого функционального до самого простого.

Вариант 1: VK Bot API — полноценная замена Telegram-бота

ВКонтакте — самая очевидная замена. 100 миллионов активных пользователей, мобильные приложения на всех платформах, push-уведомления работают мгновенно. И главное — развитый Bot API, который позволяет отправлять сообщения, картинки, кнопки и даже карусели.

Шаг 1: Создаём сообщество

Бот ВКонтакте — это не отдельная сущность, а сообщество (группа). Именно от имени сообщества бот отправляет сообщения.

  • Заходим на vk.com/groups, нажимаем «Создать сообщество»
  • Тип — любой (группа по интересам подойдёт). Название: «Моя ферма — алерты» или как удобно
  • Заходим в Управление → Сообщения, включаем сообщения сообщества
  • Там же: Настройки для бота → Возможности ботов — включаем

Шаг 2: Получаем ключ доступа (токен)

  • Управление → Работа с API → Создать ключ
  • Отмечаем права: Разрешить приложению отправлять сообщения
  • Копируем токен — строка вида vk1.a.abc123...

Шаг 3: Узнаём свой VK ID

Нужен числовой ID пользователя, которому бот будет писать. Самый простой способ — открыть vk.com/dev и вызвать метод users.get. Или просто зайти на свою страницу ВК — в адресной строке будет vk.com/id123456789, нужны цифры после «id».

Важно: чтобы бот мог написать пользователю первым, пользователь должен сначала написать сообщество. Откройте страницу своего сообщества и отправьте ему любое сообщение — после этого бот сможет отправлять алерты.

Шаг 4: Код на ESP32 — замена Telegram на VK

Если у вас уже стоит метеостанция из нашей прошлой статьи, нужно заменить одну функцию — sendTelegram() на sendVK(). Всё остальное (датчик, пороги, логика алертов) остаётся без изменений.

#include <WiFi.h>
#include <HTTPClient.h>

// === НАСТРОЙКИ VK === //
const char* VK_TOKEN = "vk1.a.ваш-токен-сообщества";
const char* VK_USER_ID = "123456789";  // ваш числовой VK ID

void sendVK(String message) {
  if (WiFi.status() != WL_CONNECTED) return;

  HTTPClient http;
  // random_id нужен VK для защиты от дубликатов
  long randomId = random(100000, 999999999);

  String url = "https://api.vk.ru/method/messages.send"
    "?access_token=" + String(VK_TOKEN) +
    "&user_id=" + String(VK_USER_ID) +
    "&random_id=" + String(randomId) +
    "&message=" + urlEncode(message) +
    "&v=5.199";

  http.begin(url);
  int code = http.GET();
  if (code != 200) {
    Serial.println("VK error: " + String(code));
  }
  http.end();
}

// URL-кодирование кириллицы
String urlEncode(String str) {
  String encoded = "";
  for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    if (isAlphaNumeric(c) || c == '-' || c == '_' || c == '.' || c == '~') {
      encoded += c;
    } else {
      encoded += "%" + String((uint8_t)c, HEX);
    }
  }
  return encoded;
}

Вызов остаётся тем же — вместо sendTelegram("🌡 Температура ниже 5°C!") пишем sendVK("🌡 Температура ниже 5°C!"). Эмодзи ВКонтакте поддерживает.

VK Bot API на Node.js (для сервера)

Если у вас Raspberry Pi или любой сервер на Linux, и вы хотите отправлять алерты из Node.js-скрипта (например, из системы мониторинга на InfluxDB + Grafana, или из LoRa-шлюза), вот готовый модуль:

// vk-notify.mjs — модуль отправки уведомлений через VK
const VK_TOKEN = process.env.VK_TOKEN;     // токен сообщества
const VK_USER_ID = process.env.VK_USER_ID; // числовой ID получателя

export async function sendVKMessage(text) {
  const randomId = Math.floor(Math.random() * 1e9);
  const params = new URLSearchParams({
    access_token: VK_TOKEN,
    user_id: VK_USER_ID,
    random_id: String(randomId),
    message: text,
    v: '5.199',
  });

  const res = await fetch(
    'https://api.vk.ru/method/messages.send?' + params.toString()
  );
  const data = await res.json();

  if (data.error) {
    console.error('VK API error:', data.error.error_msg);
    return false;
  }
  return true;
}

// Пример использования:
// await sendVKMessage('🌡 Теплица №3: температура 2°C, порог 5°C');

Запуск: VK_TOKEN="vk1.a.xxx" VK_USER_ID="123456" node vk-notify.mjs

Отправка в групповой чат VK

Если вы хотите, чтобы алерты видели несколько человек (бригадир, агроном, владелец), используйте беседу (групповой чат). В параметре peer_id передайте ID беседы — это 2000000000 + номер беседы. Номер беседы можно найти в URL беседы ВКонтакте.

Лимиты VK Bot API

  • 20 запросов в секунду на один токен. Для фермерских алертов — с огромным запасом
  • Бесплатно — никаких платных тарифов, ограничений по количеству сообщений в месяц нет
  • Поддержка: вложения (фото, документы), клавиатура с кнопками, карусели

Вариант 2: Email-алерты — работает всегда и везде

Email — самый надёжный канал. Не блокируется, не зависит от мессенджеров, приходит на любой телефон. Единственный минус — задержка: письмо может прийти через 5–30 секунд, а не мгновенно. Для алерта «в теплице заморозки» — приемлемо. Для алерта «корова сломала забор» — уже на грани.

Через SMTP (Яндекс Почта, Mail.ru)

Для отправки email нужен SMTP-сервер. Бесплатные варианты:

  • Яндекс Почтаsmtp.yandex.ru, порт 465 (SSL). Нужен пароль приложения
  • Mail.rusmtp.mail.ru, порт 465 (SSL). Тоже пароль приложения

Пароль приложения — это отдельный пароль, который создаётся в настройках почтового ящика для сторонних програм. В Яндексе: Настройки → Безопасность → Пароли приложений.

ESP32: отправка email

На ESP32 для email используется библиотека ESP-Mail-Client. Установите через Arduino IDE: Tools → Manage Libraries, ищите «ESP Mail Client».

#include <ESP_Mail_Client.h>

// === НАСТРОЙКИ ПОЧТЫ === //
#define SMTP_HOST "smtp.yandex.ru"
#define SMTP_PORT 465
#define SENDER_EMAIL "ferma-alerts@yandex.ru"
#define SENDER_PASSWORD "пароль-приложения"
#define RECIPIENT_EMAIL "vasya@mail.ru"

SMTPSession smtp;

void sendEmail(String subject, String body) {
  smtp.debug(0); // 0 = без отладки, 1 = подробно

  Session_Config config;
  config.server.host_name = SMTP_HOST;
  config.server.port = SMTP_PORT;
  config.login.email = SENDER_EMAIL;
  config.login.password = SENDER_PASSWORD;
  config.login.user_domain = "";

  SMTP_Message message;
  message.sender.name = "Ферма Алерт";
  message.sender.email = SENDER_EMAIL;
  message.subject = subject.c_str();
  message.addRecipient("Фермер", RECIPIENT_EMAIL);
  message.text.content = body.c_str();

  if (!smtp.connect(&config)) {
    Serial.println("SMTP connect failed");
    return;
  }
  if (!MailClient.sendMail(&smtp, &message)) {
    Serial.println("Email send failed: " + smtp.errorReason());
  }
  smtp.closeSession();
}

// Вызов:
// sendEmail("⚠️ Теплица: заморозки!", "Температура: 2.3°C\nПорог: 5°C");

Node.js: email через Nodemailer

На сервере (Raspberry Pi, VPS) используем Nodemailer — проверенную библиотеку для Node.js:

// email-notify.mjs
import nodemailer from 'nodemailer';

const transporter = nodemailer.createTransport({
  host: 'smtp.yandex.ru',
  port: 465,
  secure: true,
  auth: {
    user: process.env.SMTP_USER, // ferma-alerts@yandex.ru
    pass: process.env.SMTP_PASS, // пароль приложения
  },
});

export async function sendEmailAlert(subject, text) {
  await transporter.sendMail({
    from: '"Ферма Алерт" <ferma-alerts@yandex.ru>',
    to: 'vasya@mail.ru, brigadir@mail.ru',
    subject,
    text,
  });
}

// npm install nodemailer
// Пример:
// await sendEmailAlert('🌡 Заморозки в теплице №3', 'Температура 2°C, порог 5°C');

Плюс email: можно отправлять нескольким получателям через запятую, прикладывать файлы (логи, графики), форматировать HTML-письма. И никогда не заблокируют.

Вариант 3: VK Callback API — бот, который принимает команды

Варианты 1 и 2 — это «пуш» от устройства к человеку. Но иногда нужна обратная связь: спросить у бота текущую температуру, включить полив удалённо, получить график за сутки. Для этого нужен полноценный бот, который слушает входящие сообщения.

VK предлагает два способа получения событий: Callback API (VK сам отправляет HTTP-запросы на ваш сервер) и Long Poll (ваш скрипт периодически запрашивает обновления). Long Poll проще в настройке и не требует белого IP — идеально для Raspberry Pi за NAT.

Node.js: бот с Long Poll

// vk-farm-bot.mjs — бот с командами
const VK_TOKEN = process.env.VK_TOKEN;
const API = 'https://api.vk.ru/method/';

async function vkApi(method, params = {}) {
  params.access_token = VK_TOKEN;
  params.v = '5.199';
  const res = await fetch(API + method + '?' + new URLSearchParams(params));
  const data = await res.json();
  if (data.error) throw new Error(data.error.error_msg);
  return data.response;
}

async function sendMessage(peerId, text) {
  await vkApi('messages.send', {
    peer_id: peerId,
    message: text,
    random_id: Math.floor(Math.random() * 1e9),
  });
}

// Получение обновлений через Long Poll
async function startLongPoll() {
  const lp = await vkApi('groups.getLongPollServer', { group_id: process.env.VK_GROUP_ID });
  let { server, key, ts } = lp;

  console.log('🤖 Бот запущен, слушаю сообщения...');

  while (true) {
    try {
      const res = await fetch(`${server}?act=a_check&key=${key}&ts=${ts}&wait=25`);
      const data = await res.json();

      if (data.failed) {
        // Переподключение
        const lp2 = await vkApi('groups.getLongPollServer', { group_id: process.env.VK_GROUP_ID });
        server = lp2.server; key = lp2.key; ts = lp2.ts;
        continue;
      }

      ts = data.ts;

      for (const update of data.updates) {
        if (update.type === 'message_new') {
          const msg = update.object.message;
          const text = msg.text.toLowerCase().trim();
          const peerId = msg.peer_id;

          if (text === 'температура' || text === '/temp') {
            // Здесь читаем данные из InfluxDB или файла
            await sendMessage(peerId, '🌡 Теплица №1: 24.5°C, влажность 68%');
          } else if (text === 'полив вкл' || text === '/water_on') {
            // Здесь отправляем команду на ESP32 через MQTT
            await sendMessage(peerId, '💧 Полив включён');
          } else if (text === 'полив выкл' || text === '/water_off') {
            await sendMessage(peerId, '🚫 Полив выключен');
          } else if (text === 'помощь' || text === '/help') {
            await sendMessage(peerId,
              '📋 Команды:\n' +
              '• температура — текущие показания\n' +
              '• полив вкл / полив выкл — управление\n' +
              '• помощь — это сообщение'
            );
          } else {
            await sendMessage(peerId, 'Не понял команду. Напишите "помощь" для списка.');
          }
        }
      }
    } catch (err) {
      console.error('Long Poll error:', err.message);
      // Переждём 5 секунд и попробуем снова
      await new Promise(r => setTimeout(r, 5000));
    }
  }
}

startLongPoll();

Запуск: VK_TOKEN="vk1.a.xxx" VK_GROUP_ID="12345" node vk-farm-bot.mjs

Этот бот работает на Raspberry Pi, не требует белого IP, не требует домена и SSL-сертификата. Пишете ему «температура» — получаете ответ. Можно добавить любые команды: статус всех датчиков, последние алерты, управление реле.

Вариант 4: Web Push уведомления — без мессенджеров вообще

Самый независимый вариант. Push-уведомления приходят прямо в браузер — Chrome, Firefox, Safari. Не нужен ни один мессенджер. Работает даже когда браузер закрыт (на Android и на десктопе). Минус — нужен HTTPS-домен для отправки.

Если у вас уже есть сайт или веб-дашборд для фермы (например, Grafana на Raspberry Pi), добавить push-уведомления — дело на час.

Серверная часть (Node.js)

// push-server.mjs — сервер web push уведомлений
import webpush from 'web-push';
import { readFileSync, writeFileSync, existsSync } from 'fs';

// Генерируем VAPID-ключи один раз:
// npx web-push generate-vapid-keys
const VAPID_PUBLIC = process.env.VAPID_PUBLIC;
const VAPID_PRIVATE = process.env.VAPID_PRIVATE;

webpush.setVapidDetails(
  'mailto:admin@ferma.ru',
  VAPID_PUBLIC,
  VAPID_PRIVATE
);

// Подписки хранятся в файле (для прототипа)
const SUBS_FILE = './push-subscriptions.json';
function loadSubs() {
  if (!existsSync(SUBS_FILE)) return [];
  return JSON.parse(readFileSync(SUBS_FILE, 'utf-8'));
}
function saveSubs(subs) {
  writeFileSync(SUBS_FILE, JSON.stringify(subs, null, 2));
}

// Отправка пуша всем подписчикам
export async function sendPush(title, body) {
  const subs = loadSubs();
  const payload = JSON.stringify({ title, body, icon: '/icon-192.png' });

  for (const sub of subs) {
    try {
      await webpush.sendNotification(sub, payload);
    } catch (err) {
      if (err.statusCode === 410) {
        // Подписка истекла — удаляем
        const filtered = subs.filter(s => s.endpoint !== sub.endpoint);
        saveSubs(filtered);
      }
    }
  }
}

// npm install web-push
// Пример: await sendPush('⚠️ Заморозки', 'Теплица №1: 2°C');

Клиентская часть (Service Worker)

На вашем сайте или дашборде добавьте кнопку «Подписаться на уведомления». При подписке браузер генерирует уникальный ключ, который отправляется на сервер и сохраняется.

// В HTML страничке дашборда:
async function subscribePush() {
  const reg = await navigator.serviceWorker.register('/sw.js');
  const sub = await reg.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'ваш_VAPID_PUBLIC_ключ',
  });

  // Отправляем подписку на сервер
  await fetch('/api/push/subscribe', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(sub),
  });

  alert('✅ Подписка оформлена!');
}
// sw.js — Service Worker
self.addEventListener('push', (event) => {
  const data = event.data.json();
  event.waitUntil(
    self.registration.showNotification(data.title, {
      body: data.body,
      icon: data.icon || '/icon-192.png',
      badge: '/badge-72.png',
      vibrate: [200, 100, 200],
    })
  );
});

Push-уведомления — идеальный вариант, если вы уже строите веб-дашборд. Не зависят от мессенджеров, работают на Android без установки приложений. На iOS Safari поддерживает Web Push с версии 16.4.

Вариант 5: Простой HTTP-webhook на телефон

Самый минималистичный вариант для тех, кто не хочет регистрировать ботов и ставить серверы. Идея: ESP32 отправляет HTTP-запрос на бесплатный сервис, а тот пробрасывает уведомление на телефон.

Ntfy — бесплатные push без регистрации

ntfy.sh — open-source сервис push-уведомлений. Не требует регистрации, не требует токенов. Просто отправляете POST-запрос — и уведомление приходит на телефон. Серверы находятся в Европе, но сервис до сих пор доступен из России.

// ESP32: отправка через ntfy
void sendNtfy(String message) {
  if (WiFi.status() != WL_CONNECTED) return;
  HTTPClient http;
  http.begin("https://ntfy.sh/моя-ферма-секретный-топик");
  http.addHeader("Content-Type", "text/plain");
  http.addHeader("Title", "Алерт с фермы");
  http.addHeader("Priority", "high");
  http.addHeader("Tags", "warning");
  http.POST(message);
  http.end();
}

На телефоне: установите приложение ntfy (есть в Google Play и F-Droid), подпишитесь на топик моя-ферма-секретный-топик. Всё. Уведомления будут приходить как push.

Важно: топик — это как канал. Кто знает название — может подписаться. Используйте длинное случайное имя типа ferma-vasya-7f3a9b2e. Если нужна приватность — разверните свой ntfy-сервер на Raspberry Pi (там Docker-образ на 30 МБ).

Можно ли поднять ntfy локально?

# На Raspberry Pi или любом Linux-сервере:
docker run -d \
  --name ntfy \
  -p 8080:80 \
  -v /opt/ntfy/cache:/var/cache/ntfy \
  binwiederhier/ntfy serve

# ESP32 отправляет на http://192.168.1.100:8080/my-topic
# Телефон подписывается на http://192.168.1.100:8080/my-topic

Локальный ntfy работает без интернета (в пределах домашней сети). Push на телефон в этом случае не придёт, но приложение ntfy покажет уведомление при следующем подключении к домашнему Wi-Fi. Для ферм с нестабильным интернетом — вполне рабочий вариант.

Универсальное решение: мультиканальная отправка

Самый надёжный подход — отправлять алерт сразу по нескольким каналам. Если Email не дошёл — дойдёт VK. Если VK заглючил — придёт push. На ESP32 это выглядит просто:

void sendAlert(String message) {
  sendVK(message);      // VK сообщество
  sendEmail(            // Email
    "⚠️ Алерт с фермы",
    message.c_str()
  );
  sendNtfy(message);    // Push через ntfy
}

// В основном цикле:
if (temperature < TEMP_MIN && !alertSent) {
  String msg = "🌡 Температура: " + String(temperature, 1) + "°C\n"
    + "Порог: " + String(TEMP_MIN, 1) + "°C\n"
    + "⚠️ Возможна заморозка!";
  sendAlert(msg);
  alertSent = true;
}

На сервере (Node.js) — аналогично:

// multi-notify.mjs — мультиканальная отправка
import { sendVKMessage } from './vk-notify.mjs';
import { sendEmailAlert } from './email-notify.mjs';
import { sendPush } from './push-server.mjs';

export async function sendAlert(title, body) {
  const results = await Promise.allSettled([
    sendVKMessage(`${title}\n${body}`),
    sendEmailAlert(title, body),
    sendPush(title, body),
  ]);

  // Логируем, что удалось, что нет
  results.forEach((r, i) => {
    const channels = ['VK', 'Email', 'Push'];
    if (r.status === 'rejected') {
      console.error(`${channels[i]} failed:`, r.reason.message);
    }
  });
}

Сравнительная таблица

  • VK Bot API — мгновенная доставка, кнопки и карусели, бесплатно, нужна регистрация сообщества. Идеально для замены Telegram в полном объёме
  • Email (SMTP) — задержка 5–30 сек, бесплатно, работает всегда и везде, можно перехватить на любом телефоне. Лучший резервный канал
  • Web Push — мгновенно, бесплатно, нужен HTTPS-домен, работает в Chrome/Firefox/Safari. Идеально если есть свой дашборд
  • ntfy.sh — мгновенно, бесплатно, без регистрации, можно развернуть локально. Самый быстрый старт
  • VK Long Poll бот — двухсторонняя связь (команды!), не нужен белый IP, не нужен домен. Для управления фермой из мессенджера

Миграция с Telegram за 15 минут

Если у вас уже работает система из наших предыдущих статей (метеостанция, датчик почвы, камера-ловушка, GPS-трекер), миграция сводится к замене одной функции:

  • Было: sendTelegram(message) → Стало: sendVK(message) (или sendAlert(message) для мультиканала)
  • Перепрошивка ESP32 — подключаете кабелем, загружаете новый скетч, 30 секунд
  • На сервере — меняете один import и переменные окружения

Если устройство в поле и физический доступ затруднён — в следующих статьях покажем OTA-обновление (прошивка через Wi-Fi без кабеля). Но для начала проще подъехать с ноутбуком.

Что дальше

Мы продолжаем серию «Клуб самоделкиных». В ближайших выпусках:

  • OTA-прошивка ESP32 — обновление кода по Wi-Fi без поездки в поле
  • MQTT + VK бот — управление десятком устройств через единый хаб сообщений
  • Дашборд на Nuxt — свой веб-интерфейс для фермы вместо Grafana, с push-уведомлениями

Блокировки приходят и уходят, а данные с полей нужны каждый день. VK Bot API + Email + Web Push — это три российских канала, которые работают прямо сейчас, бесплатно, с рабочими примерами кода для ESP32 и Node.js. Копируйте, адаптируйте, прошивайте. Если что-то не заработало — пишите в комментариях, разберём.

💬 Комментарии

Чтобы оставить комментарий, войдите или зарегистрируйтесь

Загрузка комментариев...

Похожие статьи