Реализация мониторинга теплиц через мобильное IoT-приложение
Тепличное хозяйство на 10 гектаров потеряло 80% урожая томатов из-за того, что мобильное приложение не показало отказ нагревателя ночью. Диспетчер увидел оповещение только утром — к тому моменту температура упала до 5°C. Как избежать таких сценариев? Наше мобильное IoT-приложение решает эту задачу через надежный стек MQTT, критических алертов и автоматического управления. За 7 лет работы мы запустили более 20 проектов в агросекторе, и каждый требовал индивидуальной архитектуры.
Теплица — замкнутая среда, в которой каждый параметр влияет на урожайность. Колебания температуры даже на 2°C могут снизить урожайность на 10-15%. Влажность, CO₂, освещённость, влажность почвы, pH и EC питательного раствора — все эти величины необходимо отслеживать в реальном времени. В отличие от открытого поля, в теплице хорошая связность (Wi-Fi, Zigbee), но жёсткие требования к надёжности: критическое падение температуры ночью или отказ увлажнителя могут уничтожить урожай за несколько часов.
Мы используем промышленные датчики с интерфейсами I²C, UART и SDI-12, подключаемые к ESP32. Данные публикуются в MQTT-брокер с QoS 1, что гарантирует доставку без дублирования. Мобильное приложение подписывается на соответствующие топики и отображает актуальную информацию на дашборде. Для управления климатом используются команды на реле через MQTT. Наша компетенция — полный цикл разработки приложения для теплицы.
Какие датчики и протоколы используем?
Стандартный набор для одной секции теплицы:
- Температура/влажность воздуха: SHT40 (I²C), DHT22 (One-Wire) — на узлах на основе ESP32
- CO₂: MH-Z19B (UART) или SenseAir S8 (Modbus)
- Освещённость: VEML7700 (I²C), люкс и фотосинтетически активная радиация (PAR)
- Почвенная влажность: TEROS 12 (SDI-12)
- EC/pH питательного раствора: Atlas Scientific EZO-EC и EZO-pH (I²C UART)
Узлы на ESP32 с прошивкой на ESPHome или Tasmota публикуют данные в MQTT. Home Assistant или кастомный MQTT-брокер (Mosquitto) агрегирует. Мобильное приложение — через REST API или WebSocket на бэкенде.
Почему MQTT лучше HTTP для IoT?
MQTT обеспечивает асимметричный push с минимальной задержкой. В отличие от HTTP polling, нагрузка на сеть в 10–15 раз ниже. Для теплиц с 50+ секциями это критично: каждое устройство отправляет данные раз в 30 секунд. MQTT QoS 1 гарантирует доставку без дублирования. Мы используем его для всех сценариев реального времени.
Подробнее о протоколе можно прочитать в Wikipedia.
Сравнение MQTT и HTTP для IoT:
| Критерий | MQTT | HTTP |
|---|---|---|
| Модель | Publish-Subscribe | Request-Response |
| Задержка | <10 мс (push) | >100 мс (polling) |
| Нагрузка на сеть | Низкая (persistent connection) | Высокая (каждый запрос) |
| Гарантия доставки | 3 уровня QoS | N/A (нужны ретраи) |
| Масштабирование | Топики, автоматическая балансировка | Ограничено сервером |
Реальное время через MQTT на Android
class GreenhouseMonitorService : Service(), MqttCallbackExtended {
private lateinit var mqttClient: MqttAndroidClient
private val sectionData = ConcurrentHashMap<String, GreenhouseSectionState>()
fun startMonitoring(sections: List<String>) {
sections.forEach { sectionId ->
mqttClient.subscribe("greenhouse/$sectionId/+", 1)
}
}
override fun messageArrived(topic: String, message: MqttMessage) {
val parts = topic.split("/")
val sectionId = parts[1]
val parameter = parts[2]
val value = String(message.payload).toDoubleOrNull() ?: return
val current = sectionData.getOrPut(sectionId) { GreenhouseSectionState(sectionId) }
val updated = when (parameter) {
"temperature" -> current.copy(temperatureC = value)
"humidity" -> current.copy(humidityPercent = value)
"co2" -> current.copy(co2Ppm = value.toInt())
"light_lux" -> current.copy(lightLux = value.toInt())
"soil_moisture" -> current.copy(soilMoistureVwc = value)
"ec" -> current.copy(nutrientEc = value)
"ph" -> current.copy(nutrientPh = value)
else -> current
}
sectionData[sectionId] = updated
broadcastUpdate(updated)
}
}
Дашборд секций и пороговые значения
Для теплицы с несколькими секциями — горизонтальный PageView или TabBar с дашбордом каждой секции. На каждой карточке секции — цветовые индикаторы параметров: зелёный (норма), жёлтый (внимание), красный (критично).
Пороговые диапазоны для томатов как пример:
| Параметр | Критично мало | Норма | Критично много |
|---|---|---|---|
| Температура ночь | < 12°C | 15-18°C | > 25°C |
| Температура день | < 18°C | 22-28°C | > 35°C |
| Влажность | < 50% | 65-80% | > 90% |
| CO₂ | < 400 ppm | 800-1200 ppm | > 1500 ppm |
| EC раствора | < 1.5 | 2.0-3.5 | > 5.0 |
| pH раствора | < 5.5 | 5.8-6.5 | > 7.0 |
Конфигурацию порогов хранит бэкенд, мобильное приложение скачивает при старте и кеширует в SharedPreferences.
Как управлять климатом из приложения?
Управление климатом — ключевая функция автоматизации теплицы. Форточки, обогреватели, увлажнители, CO₂-генераторы управляются из приложения. MQTT команды на реле:
Future<void> setVentilation(String sectionId, bool open) async {
_mqttClient.publishMessage(
'greenhouse/$sectionId/vent/command',
MqttQos.exactlyOnce,
(MqttClientPayloadBuilder()..addString(open ? 'OPEN' : 'CLOSE')).payload!,
);
}
Для автоматических сценариев (открыть форточку если температура > 28°C) логика может быть и на бэкенде (Node-RED, Home Assistant automation), и в самом приложении как локальное правило.
Как настроить критические алерты?
Критические алерты для теплицы — это не просто уведомление. Температура ниже нуля ночью — значит нагреватель отказал, нужно немедленное действие.
На Android: FCM с PRIORITY_HIGH + Foreground Service с Wake Lock для надёжного получения в ночном режиме. На iOS: Critical Alerts через entitlement com.apple.developer.usernotifications.critical-alerts — воспроизводятся на полной громкости независимо от режима Не беспокоить.
Дополнительно — звонок через Twilio Voice API для нескольких ответственных по эскалации, если алерт не подтверждён за 10 минут.
Что даёт журнал событий и отчёты?
Агроном смотрит не только текущие данные, но и историю: когда включался обогреватель, когда открывались форточки, какова температура была в 2 ночи. Журнал событий с фильтрацией по типу и периоду — важная функция.
Экспорт отчётов в Excel/CSV — требование большинства промышленных клиентов для документирования условий выращивания. Формируется на бэкенде, мобильное приложение скачивает и открывает через Share Sheet (iOS) или FileProvider (Android).
Процесс разработки
Мы работаем по следующему плану:
- Аналитика: изучаем ваши теплицы, датчики, сценарии. Готовим архитектурную документацию.
- Проектирование: прототип UI/UX, спецификация API и MQTT топиков.
- Реализация: пишем код приложения (iOS/Android), бэкенда и прошивок ESP32.
- Тестирование: интеграционное тестирование с вашими датчиками, нагрузочное тестирование.
- Деплой: загрузка в App Store и Google Play, настройка MQTT-брокера, пусконаладка.
- Поддержка: 3 месяца технической поддержки после запуска, обучение вашей команды.
Пример конфигурации MQTT топиков: каждая секция теплицы использует иерархию топиков — greenhouse/{sectionId}/temperature, greenhouse/{sectionId}/humidity, greenhouse/{sectionId}/co2, greenhouse/{sectionId}/vent/command, greenhouse/{sectionId}/heater/status. Это упрощает фильтрацию на стороне приложения и бэкенда.
Что входит в разработку
Мы предоставляем полный пакет:
- Архитектурная документация (диаграммы, спецификация API)
- Исходный код приложения (iOS/Android) и бэкенда
- Настройка MQTT-брокера и интеграция с датчиками
- Загрузка в App Store и Google Play (аккаунты ваши)
- Техническая поддержка 3 месяца после запуска
- Обучение вашей команды работе с системой
Сроки и гарантия
Базовая версия с мониторингом и уведомлениями — от 5 недель. Многосекционная теплица с полным журналированием и экспортом — до 3 месяцев. Стоимость рассчитывается индивидуально. На весь код предоставляем 12 месяцев гарантии. Закажите разработку — свяжитесь с нами для оценки вашего проекта.
Оценим проект бесплатно — напишите нам, и мы подготовим коммерческое предложение в течение 2 дней.







