Датчик влажности отправляет данные в Telegram. Метеостанция — тоже в Telegram. GPS-трекер — туда же. Камера-ловушка — угадайте куда. Через месяц ваш Telegram — это стена из цифр, графиков нет, истории нет, сравнить нечего. Вы собрали пять крутых DIY-устройств, но данные разбросаны по чатам и не работают вместе.
Grafana решает эту проблему. Это бесплатный open-source инструмент для визуализации данных: графики, шкалы, карты, таблицы — всё на одном экране. Открываете браузер на телефоне — и видите: температура на поле, влажность почвы на трёх участках, маршрут трактора за сегодня, последнее фото с камеры-ловушки. Красиво, информативно и бесплатно.
Что понадобится
Raspberry Pi 4 (2 ГБ ОЗУ или больше) — 5 500–7 000 ₽. Это мини-компьютер, который будет работать 24/7 на ферме как сервер. Потребляет 5 Вт — как ночник. В месяц электричества на 25 ₽.
MicroSD-карта 32 ГБ — 400–600 ₽. Сюда ставим операционную систему и базу данных.
Блок питания USB-C 5V 3A — 500 ₽ (часто идёт в комплекте с Raspberry Pi).
Ethernet-кабель или Wi-Fi — подключение к роутеру. Ethernet надёжнее.
Итого: 6 500–8 000 ₽ за полноценный сервер мониторинга. Для сравнения: подписка на облачные IoT-платформы (ThingsBoard Cloud, Blynk Pro) — от 1 500 ₽/месяц. Raspberry Pi окупается за 4–5 месяцев.
Архитектура: как всё связано
Схема простая:
- ESP32-датчики (метеостанция, влажность, весы, GPS) → отправляют данные по Wi-Fi
- InfluxDB (база данных временных рядов) → хранит все измерения с метками времени
- Grafana (визуализация) → читает данные из InfluxDB и рисует графики
Всё крутится на одном Raspberry Pi. InfluxDB хранит данные, Grafana показывает. ESP32 отправляют HTTP-запросы напрямую на Raspberry Pi — никаких облаков, всё в локальной сети.
Шаг 1: Установка Raspberry Pi OS
Скачайте Raspberry Pi Imager на компьютер. Вставьте microSD-карту, выберите «Raspberry Pi OS Lite (64-bit)» — без графического интерфейса, он не нужен. В настройках Imager задайте:
- Имя хоста:
farm-server - Логин/пароль:
pi/ ваш пароль - Wi-Fi: SSID и пароль вашей сети (если не будете use Ethernet)
- SSH: включить
Записали. Вставили в Raspberry Pi. Подключили питание и Ethernet. Через минуту найдите его в сети: ping farm-server.local. Подключитесь по SSH:
ssh pi@farm-server.local
Шаг 2: Установка InfluxDB
InfluxDB — специализированная база для временных рядов. В отличие от PostgreSQL или MySQL, она оптимизирована для хранения миллионов точек вида «время → значение». Идеально для датчиков.
# Добавляем репозиторий InfluxDB
curl -s https://repos.influxdata.com/influxdata-archive.key | \
gpg --dearmor | sudo tee /usr/share/keyrings/influxdb-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/influxdb-archive-keyring.gpg] \
https://repos.influxdata.com/debian stable main" | \
sudo tee /etc/apt/sources.list.d/influxdb.list
# Устанавливаем InfluxDB 2.x
sudo apt update && sudo apt install -y influxdb2
# Запускаем
sudo systemctl enable influxdb
sudo systemctl start influxdb
Откройте в браузере: http://farm-server.local:8086. Первый запуск — мастер настройки:
- Organization:
farm - Bucket:
sensors(сюда будут падать данные с датчиков) - Retention: 365 дней (хранить данные год — потом автоудаление)
Запишите API-токен — он понадобится для записи данных с ESP32 и для подключения Grafana.
Шаг 3: Установка Grafana
# Добавляем репозиторий Grafana
sudo apt install -y apt-transport-https software-properties-common
curl -s https://apt.grafana.com/gpg.key | \
gpg --dearmor | sudo tee /usr/share/keyrings/grafana-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/grafana-archive-keyring.gpg] \
https://apt.grafana.com stable main" | \
sudo tee /etc/apt/sources.list.d/grafana.list
# Устанавливаем
sudo apt update && sudo apt install -y grafana
# Запускаем
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
Grafana доступна на http://farm-server.local:3000. Логин по умолчанию: admin / admin. При первом входе — сменить пароль.
Шаг 4: Подключаем InfluxDB к Grafana
В Grafana: Configuration → Data Sources → Add data source → InfluxDB.
- Query Language:
Flux - URL:
http://localhost:8086 - Organization:
farm - Token: ваш API-токен из InfluxDB
- Default Bucket:
sensors
Нажимаем «Save & Test». Зелёная галочка — всё работает.
Шаг 5: Настраиваем ESP32 на отправку данных
Все наши DIY-устройства из прошлых статей отправляли данные в Telegram. Теперь добавим параллельную отправку в InfluxDB. Не вместо Telegram — в дополнение. Telegram остаётся для алертов, InfluxDB — для истории и графиков.
Вот универсальная функция для ESP32 (Arduino IDE):
#include <WiFi.h>
#include <HTTPClient.h>
// Настройки InfluxDB
const char* INFLUX_URL = "http://farm-server.local:8086";
const char* INFLUX_TOKEN = "ВАШ_ТОКЕН";
const char* INFLUX_ORG = "farm";
const char* INFLUX_BUCKET = "sensors";
void sendToInflux(String measurement, String tags,
String field, float value) {
HTTPClient http;
String url = String(INFLUX_URL)
+ "/api/v2/write?org=" + INFLUX_ORG
+ "&bucket=" + INFLUX_BUCKET
+ "&precision=s";
// InfluxDB Line Protocol:
// measurement,tag=value field=value timestamp
String body = measurement + "," + tags
+ " " + field + "=" + String(value, 2);
http.begin(url);
http.addHeader("Authorization",
"Token " + String(INFLUX_TOKEN));
http.addHeader("Content-Type", "text/plain");
int code = http.POST(body);
if (code == 204) {
Serial.println("InfluxDB: OK");
} else {
Serial.printf("InfluxDB error: %d\n", code);
}
http.end();
}
Использование из каждого устройства:
// Метеостанция
sendToInflux("weather", "location=field_1",
"temperature", 24.5);
sendToInflux("weather", "location=field_1",
"humidity", 67.2);
sendToInflux("weather", "location=field_1",
"pressure", 1013.25);
// Датчик влажности почвы
sendToInflux("soil", "location=field_1,depth=20cm",
"moisture", 42.0);
// Весы на приёмке
sendToInflux("harvest", "crop=wheat,field=field_2",
"weight_kg", 1250.0);
// GPS-трекер
sendToInflux("gps", "vehicle=tractor_1",
"latitude", 51.6720);
sendToInflux("gps", "vehicle=tractor_1",
"longitude", 39.2104);
sendToInflux("gps", "vehicle=tractor_1",
"speed_kmh", 12.5);
Обратите внимание на теги: location, crop, vehicle. Это позволяет фильтровать данные в Grafana: «покажи влажность только на поле 1» или «маршрут трактора 2 за вчера».
Шаг 6: Создаём дашборд
В Grafana: Dashboards → New Dashboard. Добавляем панели:
Панель 1: Температура и влажность воздуха
Тип: Time series (график). Flux-запрос:
from(bucket: "sensors")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "weather")
|> filter(fn: (r) => r._field == "temperature"
or r._field == "humidity")
|> aggregateWindow(every: 10m, fn: mean)
Результат: плавная кривая температуры и влажности за последние сутки. Две оси Y: левая — °C, правая — %. Красиво и информативно. Сразу видно: днём +28°C, ночью +14°C, влажность обратно пропорциональна.
Панель 2: Влажность почвы по участкам
Тип: Gauge (полукруглая шкала). Отдельная шкала для каждого датчика. Цвета: зелёный (>40%), жёлтый (20–40%), красный (<20%). Один взгляд — и понятно, где нужен полив.
Панель 3: Приёмка урожая сегодня
Тип: Stat (одно большое число). Сумма всех взвешиваний за день. Показывает: «Принято сегодня: 14 780 кг». Рядом — график по часам: когда приёмка была активной, когда простой.
Панель 4: Маршрут техники
Для GPS-данных установите плагин Geomap (встроен в Grafana 9+). Запрос:
from(bucket: "sensors")
|> range(start: -12h)
|> filter(fn: (r) => r._measurement == "gps")
|> filter(fn: (r) => r.vehicle == "tractor_1")
|> pivot(rowKey: ["_time"],
columnKey: ["_field"],
valueColumn: "_value")
На карте — линия маршрута трактора, цветом по скорости (зелёный — движение, красный — стоит). Видно: трактор 3 часа стоял у дороги — почему?
Панель 5: Камера-ловушка
Если камера отправляет фото на HTTP-эндпоинт Raspberry Pi (простой Node.js-скрипт, принимающий JPG), можно показать последнее фото прямо в Grafana через панель Dynamic Image (плагин). Но чаще оставляют фото в Telegram, а в Grafana показывают только статистику срабатываний: «Камера 1: 3 срабатывания за ночь».
Алерты: Grafana предупреждает
Grafana умеет не только показывать, но и кричать. Настройка алертов:
- Влажность почвы < 25% → уведомление в Telegram: «Поле 1: влажность критическая, нужен полив»
- Температура < 0°C → «Заморозок! Температура −2°C на метеостанции field_1»
- GPS: скорость = 0 больше 2 часов → «Трактор 1 остановился на координатах 51.67, 39.21»
- Нет данных от датчика > 1 час → «Датчик soil_field_2 молчит — проверьте питание»
Подключение Telegram как канала уведомлений: Alerting → Contact points → New → Telegram. Указываете BOT_TOKEN и CHAT_ID — тот же бот, который уже используется для отправки фото с камеры-ловушки.
Мобильный доступ
Grafana — веб-приложение. Открывается в любом браузере на телефоне. Но по умолчанию доступна только в локальной сети (на ферме). Для доступа из города — два варианта:
Вариант 1: VPN. Установите WireGuard на Raspberry Pi. Бесплатно. На телефоне — приложение WireGuard. Подключаетесь к VPN — и видите Grafana как будто вы на ферме. Безопасно: данные зашифрованы.
Вариант 2: Cloudflare Tunnel. Бесплатный сервис. Устанавливаете cloudflared на Raspberry Pi, регистрируете домен (farm.ваш-домен.ru) — и Grafana доступна через интернет с HTTPS. Не нужен белый IP, не нужен проброс портов.
# Установка cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 \
-o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
# Авторизация
cloudflared tunnel login
# Создание туннеля
cloudflared tunnel create farm
cloudflared tunnel route dns farm grafana.мой-домен.ru
# Конфиг: /etc/cloudflared/config.yml
# tunnel: ID-вашего-туннеля
# credentials-file: /root/.cloudflared/TUNNEL-ID.json
# ingress:
# - hostname: grafana.мой-домен.ru
# service: http://localhost:3000
# - service: http_status:404
Рекомендую Cloudflare Tunnel — проще, надёжнее, не зависит от NAT провайдера.
Что хранить и как долго
MicroSD на 32 ГБ хватает для хранения данных с 10–15 датчиков за 2–3 года. Но SD-карты не вечные — они изнашиваются при постоянной записи. Рекомендации:
- Используйте карту класса A2 (Samsung EVO Plus, SanDisk Extreme) — они рассчитаны на частую запись
- Настройте InfluxDB retention policy: сырые данные хранить 30 дней, агрегированные (среднее за час) — 2 года. Это сокращает объём в 60 раз
- Раз в месяц делайте бэкап:
influx backup /home/pi/backups/→ копируйте на USB-флешку или в облако
Для серьёзного использования (>20 датчиков, >3 года) — замените SD на USB SSD (120 ГБ за 1 200 ₽). Подключаете к Raspberry Pi, переносите корневую FS на SSD — и забываете про износ.
Готовые шаблоны дашбордов
Не обязательно рисовать всё с нуля. На grafana.com/grafana/dashboards — тысячи бесплатных шаблонов. Ищите по тегам: IoT, weather station, agriculture, sensors. Импортируете JSON — и дашборд готов. Останется только подправить имена measurement и tags под свои.
Например, шаблон «Weather Station» (ID 14376) — красивый дашборд с температурой, влажностью, давлением и графиком ветра. Импорт: Dashboards → Import → вставить ID → Load.
Сколько это стоит в итоге
- Raspberry Pi 4 (2 ГБ): 5 500–7 000 ₽
- MicroSD 32 ГБ: 400–600 ₽
- Блок питания: 500 ₽
- Корпус (по желанию): 300–800 ₽
- InfluxDB: бесплатно (open-source)
- Grafana: бесплатно (open-source)
- Cloudflare Tunnel: бесплатно
Итого: 6 700–8 900 ₽ единоразово. Ежемесячных расходов — 25 ₽ электричества.
Для сравнения: коммерческие IoT-платформы с визуализацией — от 18 000 ₽/год (Blynk Pro) до 60 000 ₽/год (ThingsBoard Professional). А облачная Grafana Cloud на бесплатном тарифе ограничена 10 000 метрик и 14 днями хранения — для фермы мало.
Продвинутые панели: считаем деньги
Grafana умеет не только показывать температуру. С помощью Flux-запросов можно считать бизнес-метрики прямо в дашборде:
Расход ГСМ: если GPS-трекер фиксирует пробег, а вы знаете расход трактора (25 л/моточас), Grafana посчитает:
from(bucket: "sensors")
|> range(start: -30d)
|> filter(fn: (r) =>
r._measurement == "gps"
and r.vehicle == "tractor_1"
and r._field == "engine_hours")
|> difference()
|> map(fn: (r) => ({r with
_value: r._value * 25.0 * 65.0}))
// 25 л/час × 65 ₽/литр = расход в рублях
Результат — панель «ГСМ за месяц: 47 500 ₽». Разбивка по дням: видно, когда техника работала, когда простаивала.
Эффективность полива: сравниваем влажность почвы до и после полива. Если влажность растёт на 5% вместо ожидаемых 15% — утечка, засор форсунки или неправильная норма. Grafana покажет аномалию цветом: ожидаемый рост — зелёный, недополив — красный.
Тепловая карта активности: плагин Heatmap показывает, в какие часы суток происходят события. Камера-ловушка срабатывала чаще всего с 2:00 до 4:00 — значит, кабаны приходят именно тогда. Приёмка урожая — пик с 10:00 до 14:00, потом простой до 16:00 — может, пересмотреть график водителей?
Типичные ошибки при настройке
ESP32 не находит Raspberry Pi по имени. mDNS (farm-server.local) работает не во всех сетях. Решение: используйте статический IP. В роутере зарезервируйте IP для Raspberry Pi (например, 192.168.1.100) — и в коде ESP32 пишите IP напрямую.
Данные приходят, но график пустой. Проверьте часовые пояса. ESP32 отправляет timestamp в UTC, а вы смотрите по московскому. В Grafana: настройки дашборда → Timezone → выберите Europe/Moscow. В InfluxDB: precision=s — секунды, не миллисекунды.
Grafana тормозит на Raspberry Pi. По умолчанию Grafana рендерит графики в браузере — нагрузка на Pi минимальная. Но если открыть 20 панелей одновременно, Flux-запросы могут грузить InfluxDB. Решение: ограничьте период по умолчанию (последние 24 часа вместо 7 дней), используйте aggregateWindow для снижения количества точек.
SD-карта умерла через 3 месяца. Дешёвые карты (класс C10 без маркировки A1/A2) не выдерживают постоянную запись. InfluxDB пишет на диск каждые 10 секунд. Замените на A2-карту или USB SSD.
При перезагрузке данные пропадают. InfluxDB хранит данные на диске — они не пропадут. Но если Raspberry Pi выключили некорректно (выдернули питание), может повредиться файловая система. Решение: используйте read-only root или добавьте UPS (бесперебойник для Raspberry Pi — 800 ₽, держит 15 минут, достаточно для корректного shutdown).
Масштабирование: от одной фермы к нескольким
Если у вас несколько площадок (поле + ферма + склад на разных адресах), каждая со своим Raspberry Pi — можно настроить централизованный сбор. Вариант: арендуйте VPS за 300 ₽/месяц (Firstbyte, Timeweb), поставьте InfluxDB + Grafana там. Все ESP32 отправляют данные через интернет на VPS. Один дашборд — все площадки.
Безопасность: обязательно включите HTTPS (Let's Encrypt — бесплатно) и авторизацию в InfluxDB. API-токен в коде ESP32 должен иметь минимальные права: только запись в конкретный bucket.
Что получаем в результате
Одна ссылка в браузере телефона — и перед вами всё хозяйство:
- Погода на поле (не из Яндекса, а реальная — с вашего датчика)
- Влажность почвы на каждом участке — шкалы с цветовой индикацией
- Сколько тонн приняли сегодня — одно число, крупно
- Где сейчас трактор — точка на карте
- Сколько раз сработала камера-ловушка — график за неделю
- Алерты: если что-то не так — Telegram пришлёт
Это не фантастика из статей про «умное сельское хозяйство». Это Raspberry Pi за 7 000 ₽, бесплатный софт и пара вечеров настройки. Данные с датчиков, которые вы уже собрали в прошлых статьях цикла, наконец-то работают вместе.
Системы вроде ТерраКвант делают то же самое «из коробки» — с поддержкой, обновлениями и без возни с Linux. Но если вам нравится контролировать каждый байт своих данных и не зависеть от облаков — Grafana на своём сервере не имеет равных.




