Grafana-дашборд для фермы: все датчики на одном экране за 7 000 ₽

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

Метеостанция, влажность почвы, весы, GPS-трекер, камера — всё в одном дашборде. Raspberry Pi + InfluxDB + Grafana: ставим за вечер, смотрим с телефона.

Grafana-дашборд для фермы: все датчики на одном экране за 7 000 ₽

Датчик влажности отправляет данные в 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 на своём сервере не имеет равных.

Источник: Фермозавр

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

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

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

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