Releases: akprof2000/DripIrrigation
Release list
v1.9.3 — логи отключены, освобождено 11.3 КБ
🗜️ Освобождение флеша: логи отключены полностью. 99 % → 98 % раздела приложения.
🔧 Сборка
LOG_LEVEL=LOG_LEVEL_NONE(былоLOG_LEVEL_ERROR): вырезаны последние 9 вызововLOG_Eвместе со строками форматов, реализацияlogPrintf(весьlog.cppпод#if LOG_LEVEL > LOG_LEVEL_NONE) иSerial.beginвsetup()— значит линкер выбрасывает и UART-стек.- 1 303 685 → 1 292 149 байт, экономия 11.3 КБ. Свободно 18.5 КБ из 1.31 МБ.
⚠️ Что меняется в эксплуатации
Диагностики по Serial теперь нет вообще. Отказы железа по-прежнему видны в чате — реестр неисправностей (faults.h) и отчёты бота от логгера не зависят. Для отладки на стенде вернуть LOG_LEVEL_DEBUG в log.h и пересобрать.
📌 Про место всерьёз
11 КБ — это отсрочка, а не решение: раздел всё ещё занят на 98 %. Радикальный вариант — схема разделов min_spiffs (1.96 МБ под приложение с сохранением OTA, те же байты дадут ~65 %). Она не применяется через OTA: смена таблицы разделов требует однократной прошивки по кабелю.
📦 OTA
DripIrrigation.ino.bin можно сразу отправить боту.
v1.9.2 — замер потока на капельных расходах
💧 Датчик потока не показывал расход при капельном поливе: пороги замера были рассчитаны на «шланговые» скорости. Добавлена диагностика самого датчика.
🐞 Исправления
- замер потока на капельных расходах: окно замера длилось 30 с при пороге значимости
FM_MIN_PULSES = 40импульсов. При 450 имп/л это означало отсечку на 0.18 л/мин суммарно по всем каналам — то есть любой настоящий капельный полив (0.05–0.1 л/мин на канал) уходил в ветку «почти нет потока — пустой бак/сухой ход», и контроль засора фильтра не работал вовсе. Окно увеличено до 120 с, порог снижен до 10 импульсов — отсечка стала 0.011 л/мин. - ложная стабилизация потока: подынтервал ожидания 20 с при капельном расходе давал ~7 импульсов, шаг квантования ~14 % — больше порога
FM_SETTLE_STABLE_PCT(10 %), и детектор «поток перестал падать» срабатывал на шуме округления. Подынтервал увеличен до 60 с.
✨ Новые возможности
- 🩺 диагностика датчика потока в
/WaterFlow: время с последнего импульса, мгновенная скорость (по интервалу между двумя последними импульсами, без ожидания окна) в л/мин и мл/с, калибровочный коэффициент и число открытых клапанов. Явное сообщение «импульсов не было ни разу», если крыльчатка не вращалась с момента включения.
⚠️ Если импульсов нет вовсе
Дело в датчике, а не в прошивке: YF-S201 (450 имп/л) рассчитан на 1–30 л/мин и на капельных расходах физически не страгивается. Нужен YF-S402 (980 имп/л, от 0.3 л/мин) или лепестковый датчик; коэффициент правится в FLOW_PULSES_PER_LITER (objects.h).
📦 OTA
DripIrrigation.ino.bin можно сразу отправить боту. Флеш: 99 % от 1.31 МБ (схема разделов по умолчанию).
v1.9.1 — фикс зацикливания OTA
🔁 Исправлено зацикливание OTA — устройство обновлялось по кругу, скачивая один и тот же файл.
🐞 Почему это происходило
Telegram удаляет сообщение из очереди только когда бот запросит следующий пакет с бо́льшим offset. Две причины сложились:
.gz-OTA перезагружался мгновенно — подтверждения серверу не отправлялось, и после старта прилетало то же сообщение с прошивкой. (Штатный.bin-OTA библиотеки этого избегает: он ждёт следующегоgetUpdatesи только потом перезагружается.)skipUpdates()при старте очередь не чистит — по API Telegram отрицательный offset возвращает последний апдейт, то есть ровно то сообщение с файлом, которое и вызвало перезагрузку.
✨ Как исправлено
- Позиция очереди сохраняется в EEPROM (следующий ожидаемый
update_id) и восстанавливается при старте — переживает перезагрузку и даже пропадание питания посреди обновления. - Позиция фиксируется до начала прошивки — и для
.bin, и для.gz, и перед перезагрузкой из меню. - Перед рестартом после
.gz-OTA дополнительно вызываетсяtickManual()— подтверждает очередь серверу немедленно.
Защита получилась двухуровневой: сервер подтверждается сразу, а если связь оборвётся — правильная позиция восстановится из EEPROM.
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.30 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.81 МБ | сжатый OTA |
Собрано в GitHub Actions для ESP32 Dev Module (
esp32:esp32:esp32), схема разделов по умолчанию.
Полный список — в CHANGELOG.md.
v1.9.0 — аварийный режим при неисправном железе
🩺 Аппаратные ошибки больше не вешают систему молча — неисправность приходит в чат, а бот переходит в аварийный режим.
🐞 Что было сломано
Отсутствие RTC или SD-карты вешало прошивку в бесконечном while ещё до старта loop(): бот не поднимался, сообщений не было, и понять причину можно было, только подключившись к устройству кабелем.
✨ Как теперь
- Неблокирующая инициализация RTC, SD-карты и платы клапанов (PCF8574): несколько попыток, и загрузка продолжается в любом случае.
- Отчёт в чат со списком неисправностей и пояснением последствий. Если в момент старта связи не было — отчёт уйдёт позже, как только связь появится.
- Аварийный режим бота: обычный интерфейс скрыт, на любую команду показывается отчёт и единственная кнопка «Перезагрузка» — починив контакт, систему можно поднять прямо из чата.
- Безопасное гашение нагрузок: насос, дренаж и залив бака выключаются напрямую по пинам (не через возможно мёртвый PCF8574); клапаны закрываются, только если расширитель отвечает.
- Полив останавливается — работать с неисправным оборудованием опасно. Бот и watchdog при этом продолжают жить.
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.30 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.81 МБ | сжатый OTA |
Собрано в GitHub Actions для ESP32 Dev Module (
esp32:esp32:esp32), схема разделов по умолчанию.
Полный список — в CHANGELOG.md.
v1.8.0 — токен бота в EEPROM
🔐 Токен бота переехал из прошивки в EEPROM — бинарники из этого релиза рабочие и не содержат секретов.
🐞 Что было сломано
Бинарники предыдущих релизов собирались в CI с заглушкой PUT-YOUR-BOT-TOKEN-HERE вместо токена (он компилировался внутрь образа). После такой прошивки устройство не выходило на связь, OTA становился недоступен — восстановление только по проводу. Релизы v1.6.0–v1.7.2 помечены соответствующим предупреждением.
✨ Как теперь
- Токен хранится в EEPROM и вводится на странице настройки WiFi. Порядок разрешения:
EEPROM → secrets.h → портал, поэтому сборки со своимsecrets.hпродолжают работать без изменений. - Портал только для токена. Если токена нет ни в EEPROM, ни в прошивке, устройство поднимает страницу настройки исключительно для его ввода: сеть, список пользователей, калибровки и параметры полива сохраняются, после ввода работа продолжается с того же места — без сброса.
- Поле «Токен» можно оставить пустым при перенастройке WiFi — сохранённое значение не изменится.
- Без токена полив работает автономно — бот не запустится, но автоматика продолжит поливать.
📥 Как обновиться
| Ситуация | Что делать |
|---|---|
У вас прошивка со своим secrets.h |
Просто обновитесь через OTA — токен подхватится из прошивки, портал не появится |
| Прошиваете бинарник отсюда | После старта подключитесь к точке ESPCfg_DripIrrigation и введите токен от @Botfather |
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.29 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.80 МБ | сжатый OTA |
Собрано в GitHub Actions для ESP32 Dev Module (
esp32:esp32:esp32), схема разделов по умолчанию.
Полный список — в CHANGELOG.md.
v1.7.2 — имена файлов-копий и повторы OTA
⛔ НЕ ПРОШИВАЙТЕ эти бинарники
Файлы
.bin/.bin.gzв этом релизе собраны в CI с заглушкой вместо токена бота (PUT-YOUR-BOT-TOKEN-HERE). Токен компилируется внутрь прошивки, поэтому такое устройство не сможет подключиться к Telegram — бот не ответит, и OTA станет недоступен: восстановление только по проводу.Собирайте прошивку сами со своим
secrets.h— см. раздел «Установка» в README. Бинарники здесь пригодны только как проверка того, что код компилируется.
📎 Удобство вокруг OTA — по итогам обновления на боевом устройстве.
✨ Что нового
- Имена файлов-копий. Windows при повторном скачивании добавляет « (2)» перед расширением. Теперь принимаются
DripIrrigation.ino.bin (2).gzиDripIrrigation.ino (2).bin— переименовывать не нужно. Вместо точного сравнения имени проверяются префикс (защита от прошивки случайным документом) и расширение; регистр игнорируется. - Повторы скачивания
.gz— до 3 попыток с паузой. - Понятный отказ. Если имя не подошло, бот писал «Только владелец может отправлять обновления» — теперь отвечает «Это не похоже на прошивку: <имя>» и напоминает ожидаемые имена.
🔁 Про «OTA Fetch Error»
Это сообщение означает, что файл не удалось скачать — до записи во flash дело не дошло, прошивка не пострадала. Обычно причина в нехватке памяти на защищённое соединение после долгой работы (куча фрагментирована). Лечится повторной отправкой, а если повторяется — перезагрузкой системы через меню. Для .gz теперь есть автоматические повторы.
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.29 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.80 МБ | сжатый OTA |
Собрано в GitHub Actions для ESP32 Dev Module (
esp32:esp32:esp32), схема разделов по умолчанию.
Полный список — в CHANGELOG.md.
v1.7.1 — фикс .gz-OTA
⛔ НЕ ПРОШИВАЙТЕ эти бинарники
Файлы
.bin/.bin.gzв этом релизе собраны в CI с заглушкой вместо токена бота (PUT-YOUR-BOT-TOKEN-HERE). Токен компилируется внутрь прошивки, поэтому такое устройство не сможет подключиться к Telegram — бот не ответит, и OTA станет недоступен: восстановление только по проводу.Собирайте прошивку сами со своим
secrets.h— см. раздел «Установка» в README. Бинарники здесь пригодны только как проверка того, что код компилируется.
🐞 Исправление .gz-OTA из 1.7.0 — на боевом устройстве обновление не применялось.
Что было не так
Распаковка шла напрямую из сетевого потока, а StreamReader::readBytes() уменьшает счётчик остатка до фактического чтения. Если сокет отдавал меньше запрошенного (обычная пауза мобильного канала), поток рассинхронизировался и распаковка обрывалась.
Как исправлено
Обновление теперь в два этапа:
- архив скачивается на SD-карту штатным буферизованным
writeTo()библиотеки; - распаковка идёт с карты — локальное чтение не зависит от качества связи.
Временный /update.gz удаляется после обновления и при любой ошибке.
🔍 Диагностика
Если .gz всё же не применится, бот пришлёт причину: код распаковки uzlib, ошибку Update и сколько байт распаковано. В рабочей прошивке логи выключены — без этого причину не установить.
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.29 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.80 МБ | сжатый OTA |
⚠️ На устройстве сейчас 1.7.0, которая.gzещё не умеет — этот апдейт ставьте обычным.bin. Проверить.gzможно будет уже со следующего обновления.
Полный список — в CHANGELOG.md.
v1.7.0 — OTA из сжатого .gz
⛔ НЕ ПРОШИВАЙТЕ эти бинарники
Файлы
.bin/.bin.gzв этом релизе собраны в CI с заглушкой вместо токена бота (PUT-YOUR-BOT-TOKEN-HERE). Токен компилируется внутрь прошивки, поэтому такое устройство не сможет подключиться к Telegram — бот не ответит, и OTA станет недоступен: восстановление только по проводу.Собирайте прошивку сами со своим
secrets.h— см. раздел «Установка» в README. Бинарники здесь пригодны только как проверка того, что код компилируется.
🗜️ OTA теперь принимает сжатый .gz — распаковка gzip идёт прямо на ESP32, файл для отправки в ~1.6 раза меньше.
✨ Новое
- OTA из
DripIrrigation.ino.bin.gz(≈0.8 МБ вместо 1.3 МБ) — удобно по мобильному интернету. Раньше.gzформально принимался, но прошить его было нельзя: FastBot2 на ESP32 пишет байты во flash как есть, без распаковки - Потоковый распаковщик — библиотека uzlib (zlib-лицензия): gzip разбирается на лету, LZ-окно 32 КБ, выход пишется в
Updateкусками; вся прошивка в память не грузится
🛡️ Безопасность
Распаковка идёт в неактивный OTA-раздел, загрузка переключается только при валидном образе (Update.end) + сверка CRC32 из gzip-трейлера. Сбой распаковки → отказ OTA с понятным сообщением, устройство остаётся на прежней прошивке.
📦 Файлы релиза
| Файл | Размер | Для чего |
|---|---|---|
DripIrrigation.ino.bin |
1.28 МБ | классический OTA |
DripIrrigation.ino.bin.gz |
0.80 МБ | сжатый OTA (новое) |
⚠️ Путь.gz-OTA новый — перед боевым применением проверьте на стенде. Обычный.binработает как прежде.
Полный список — в CHANGELOG.md.
v1.6.0 — Версия прошивки в чате
⛔ НЕ ПРОШИВАЙТЕ эти бинарники
Файлы
.bin/.bin.gzв этом релизе собраны в CI с заглушкой вместо токена бота (PUT-YOUR-BOT-TOKEN-HERE). Токен компилируется внутрь прошивки, поэтому такое устройство не сможет подключиться к Telegram — бот не ответит, и OTA станет недоступен: восстановление только по проводу.Собирайте прошивку сами со своим
secrets.h— см. раздел «Установка» в README. Бинарники здесь пригодны только как проверка того, что код компилируется.
🏷️ Версия прошивки теперь видна в чате — при старте и в /status. Так сразу понятно, применилась ли OTA-прошивка.
✨ Новое
- Версия прошивки в чате — при запуске приходит «🚀 Система запущена! Прошивка vX.Y.Z», версия также в шапке
/status - Единая точка версии — номер вынесен в
version.h(FW_VERSION), совпадает с git-тегом релиза
Полный список — в CHANGELOG.md.
v1.5.0 — Полевой релиз
🌾 Полевой релиз: исправлены проблемы, всплывшие при реальной эксплуатации (насос не выключался, ложные тревоги о засоре, залипшая кнопка «ДАЛЕЕ»), добавлена авто-калибровка границ датчиков. Проект переехал на GitHub.
✨ Новое
- Авто-калибровка границ датчиков влажности — диапазон сам расширяется под реальные условия; разовые выбросы АЦП отсекаются подтверждением (3 замера подряд); при калибровке функция отключается
- Состояние насоса в
/status— работает ли и почему (пусковой режим / порог клапанов / дренаж) - Название культуры в диалогах калибровки — видно, какой датчик настраивается
🐞 Исправления
- Насос не выключался (таймаут переведён с unix-времени на
millis()) - Пусковой режим насоса прерывался проливом дренажа
- Ложная тревога о засоре при заполнении труб (адаптивное ожидание стабилизации)
- Кнопка «➡️ ДАЛЕЕ» не реагировала (сравнение reply-кнопок по тексту без эмодзи)
- Переполнение буфера при переименовании датчика, выходы за границы массивов
- Меню «Настройка» не открывалось после текстовых ответов
⚡ Улучшения
- Таймаут связи с Telegram 150 → 180 с (меньше ложных «связь потеряна»)
- Датчик влажности: медиана из 9 замеров
- Миграция настроек без сброса при добавлении полей в конфиг
- Полная пользовательская инструкция и SVG-схемы процессов
Полный список — в CHANGELOG.md.