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

Теперь таймеры и продукты можно было: добавлять, удалять, редактировать, без перепрошивки.

WEB UI ESP32
WEB UI ESP32

Контейнеры для хранения продуктов

Дальше проект неожиданно получил бытовое продолжение. Женщина в доме решила пересыпать крупы, макароны и другие продукты в красивые контейнеры. Выглядеть стало действительно лучше. Но появилась новая проблема: срок годности оставался на заводской упаковке. На контейнерах никакой информации уже не было. Тогда появилась идея: раз уж 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 — как локальный сервер хранения данных.