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.ru —
smtp.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. Копируйте, адаптируйте, прошивайте. Если что-то не заработало — пишите в комментариях, разберём.




