Изначально я просто хотел разобраться: как работать с 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 — как локальный сервер хранения данных.
