Изначально я просто хотел разобраться: как работать с ESP32, как выводить информацию на OLED-дисплей, как организовать управление через энкодер. Так появилась идея кухонного таймера.
Первая версия — таймер для кухни
Мне хотелось сделать максимально простой и удобный сценарий:
-
подошёл к кухне;
-
выбрал продукт;
-
нажал кнопку;
-
ждёшь сигнал окончания.
Причём не просто таймер “на 10 минут”, а уже готовые пресеты.
Например:
-
Barilla №3;
-
Barilla №5;
-
Гречка;
-
Яйца;
То есть:
-
закинул макароны;
-
выбрал нужный пресет;
-
ESP32 сама знает нужное время.
Первая версия устройства выглядела примерно так:

Железо:
-
ESP32
-
OLED SSD1306
-
энкодер
-
пищалка
Очень быстро стало неудобно
Поначалу все таймеры были просто захардкожены в прошивке:
addSlot("Макароны", "Barilla №3", "", 7);addSlot("Макароны", "Barilla №5", "", 8);
Но быстро выяснилось, что:
-
добавлять новые продукты неудобно;
-
менять время приготовления неудобно;
-
каждый раз приходится перепрошивать ESP32.
Тогда появилась первая “взрослая” идея:
хранить всё в JSON и редактировать через Web UI.
LittleFS и Web UI
ESP32 получила:
-
файловую систему LittleFS;
-
JSON-базу;
-
встроенный Web UI.
Теперь таймеры и продукты можно было: добавлять, удалять, редактировать, без перепрошивки.
Контейнеры для хранения продуктов
Дальше проект неожиданно получил бытовое продолжение. Женщина в доме решила пересыпать крупы, макароны и другие продукты в красивые контейнеры. Выглядеть стало действительно лучше. Но появилась новая проблема: срок годности оставался на заводской упаковке. На контейнерах никакой информации уже не было. Тогда появилась идея: раз уж ESP32 уже умеет хранить JSON и показывать информацию на OLED — почему бы не добавить список продуктов со сроками годности?
Продукты и сроки годности
Так в проекте появился второй раздел:
-
название продукта;
-
срок годности;
-
уведомления о приближении окончания срока хранения.
Экран простаивал без пользы
Спустя время стало понятно:
в режиме ожидания OLED просто ничего полезного не показывает.
Тогда был добавлен скринсейвер с часами.
ESP32 начала синхронизировать время через NTP и отображать, в простое.

Но и этого оказалось мало
Интеграция с посудомойкой
Ранее я уже делал отдельный проект, как превратить обычную посудомойку в “умную”.
Wemos d1 в Посудомойку
Она начала отправлять в MQTT:
-
работает ли мойка;
-
сколько минут осталось до конца цикла.
И тут появилась идея: раз OLED уже висит рядом с посудомойкой, почему бы не показывать остаток мойки прямо на нём?
Так ESP32 начала отображать:
Это оказалось неожиданно удобно:
-
не нужно открывать Home Assistant;
-
не нужно смотреть на телефон;
-
остаток мойки видно сразу с кухни.
Логика работы скрин сейвера:
-
Активируется только если не запущен таймер или не крутил энкодер хотя бы 1 минуту
-
Если работает посудомойка — показывает остаточное время мытья посуды
-
Иначе показывает текущее время
-
Если есть уведомления пускаем снизу бегущей строкой
Домашняя аптечка
Позже во время разбора старой аптечки появилась ещё одна идея.
Если система уже умеет:
-
хранить продукты;
-
отслеживать сроки годности;
-
показывать уведомления;
то почему бы не добавить лекарства?
Так появился отдельный medicines.json:
{ "medicines": [ { "name": "Парацетамол", "expiry": "2028-01-01", "purpose": ["простуда", "температура"] } ]}
Home Assistant как полноценный интерфейс
В какой-то момент стало понятно, что база лекарств начинает разрастаться.
Сам Web UI на ESP32 работал нормально и отлично подходил для:
-
первоначальной настройки;
-
загрузки JSON;
-
резервных копий;
-
редактирования базы.
Но искать лекарства в большом списке становилось неудобно.
-
длинный список;
-
много категорий;
-
похожие названия;
-
отсутствие поиска.
Тогда интерфейс для аптечки был перенесён в Home Assistant.
При этом сама архитектура осталась прежней:
ESP32 по-прежнему хранит всю базу локально в LittleFS.
Home Assistant используется только как красивый frontend.
В новом интерфейсе появились:
-
поиск;
-
категории;
-
фильтры;
-
сортировка по сроку годности;
-
адаптация под мобильные устройства;
-
тёмная и светлая тема.
Домашняя аптечка, главная страница
Причём данные продолжают храниться на ESP32 и синхронизируются через MQTT. Получилась довольно необычная архитектура:
Home Assistant UI ↓ MQTT ↓ESP32 ←→ LittleFS
То есть Home Assistant здесь выступает скорее как UI-приложение, а сама ESP32 — как локальный сервер хранения данных.
ссылка на оригинал статьи https://habr.com/ru/articles/1040536/