Почему домашний бар перестал быть просто набором бутылок и что можно пересмотреть с 2020 года в данном устройстве, с чем идти дальше
Александр Котов, Евгений Рычков

Наливатор в действии
Людей уже так давно подсадили на кофе, что даже пришельцами-червями из Людей в Черном никого не удивишь. Наш организм пропитан этим экстрактом кофейных семян настолько, что в голове уже кипят совершенно нереальные ежедневные мысли и инсайты.
Сразу учитывая пару отзывов о статье поясню: это не обзор чужого аппарата, а пересмотр функционала нашего, берущего истоки от далекого 2019 года, с учетом пересмотра. В этой статье код приведен во второй части, уровень статьи указан "Простой" потому, что мы ищем заинтересованных в проекте и не хотим погружаться в объяснение велосипедов, хочется поговорить на сравнительно высоком уровне с позиции архитектуры и вопроса "А Зачем это вообще?". Но немного кода затронем во второй части материала.
Просто не охота выкладывать и сливать все козыри, а о приборе подробных расширенных статей до настоящего момента не было (были обзорные новостные выжимки и офлайн-встречи, на которых устройство использовалось), прямо хочется рассказать о личном опыте, о том, что было в процессе разработки и к чему мы пришли в итоге. Заранее сорри за специфичный, возможно, юмор в статье, но так в моменте показалось интереснее написать для разнообразия.
Текст, очевидно, не сгенерированный, хотя llm используется также с целью пересмотра полученных результатов и их дополнения. Часть сгенерированного текста мы оставили в виду его полной корректности и по результату его полного пересмотра. Несколько изображений сгенерировано LLM, но остальные - это фото из личного архива авторов, которые вы больше нигде не найдете (кроме как в нашем сообществе), на них показано именно наше устройство.

Инопланетные Черви из фильма «Люди наливают по-черному», которых нет в Наливаторе
Мы измеряем утро эспрессо, рабочий день американо, а вечер крафтовым рафом, хотя есть еще люди, посасывающие бутылочки в барах или за телевизором по вечерам, в которых не совсем кофе.
Кофемашины стали идеальными: точные, быстрые, бесшумные.

Но в этой эффективности потерялось главное, ради чего мы вообще собираемся за столом. Ритуал. Общение. Тот самый момент, когда кто-то поднимает бокал, говорит пару слов, и комната на секунду становится теплее.

То самое теплое, старое и доброе застолье
Мы решили вернуть это в быт. И создали устройство, которое не про кофе. Оно навряд ли заменит Вам вашу подружку-кофемашину, но даст в жизни действительно что-то новое кроме очередных кофейных эмоций. Устройство не просто молча и нудно наливает с важным выражением датчиков стаканов, а разговаривает, предлагает тосты и превращает домашнее распитие или встречу друзей в событие с особой, оригинальной, атмосферой. У него есть несколько названий, одно из них – «Наливатор».

Наливатор в полностью собранном состоянии, готовый к транспортировке
Мы сделали устройство, которое наливает напитки, которые часто бывают очень полезными и являются своего рода лекарствами, в стаканы и стопки. Но его главная задача не в том, чтобы заменить руку, а в том, чтобы вернуть голос моменту.
Пока у нас есть свободная рука, мы можем многое. Главное – правильно осознавать эти возможности и воплощать в жизнь действительно стоящие дела. А устройство тем временем говорит. Предлагает тосты. Поминает тех, кто сегодня за столом. И превращает простое наполнение бокала в начало разговора, задавая темы и поводы для действительно важного и дружественного разговора.

Наливатор, готовый к транспортировке, фанерный чехол снят
На фотографиях выше видно, что в собранном состоянии Наливатор – это коробочка, которую можно брать с собой за ручку. Внутри находится само устройство с возможностью разливать напитки, набор стаканов на специальной подставке, кабель USB-B, напряжения питания и тока с которого полностью хватает для полного функционирования аппарата.
Как может выглядеть такое устройство розлива напитков? Какой функционал интереснее в нем реализовать, к чему пришли лично мы? На какой компонентной базе делать устройство и на каких решениях остановиться? Какой функционал закладывать в такой девайс?
С развитием больших языковых моделей стали интересны сразу 2 направления для пересмотра проекта Наливатор:
1) разработка функционала устройства и проработка как кода, так и идей по улучшению прибора с использованием облачных LLM (Qwen, Gigachat и так далее);
2) создание собственных датасетов с правильной структуризацией и разметкой, с помощью которых можно дорабатывать процесс розлива напитков и сопутствующий функционал, использовать не только пороговые устройства и заранее запраграмированные действия, но и нейросетевые решения в устройстве Наливатор (Алкобот).
Что это такое на самом деле
Перед вами отчасти – автомат, частично – робот-бариста. Это голосовой компаньон для кухни и гостиной, который произносит тосты, шутит, играет с участниками события с наливом напитков (рулетка), непосредственно последовательно наливает напиток в стаканы, которые размещаются на оптических датчиках устройства.

Кстати, те, кто обсуждали на просторах Yout**a, простите за мой французский, проект Гайвера и его модификации, на самом деле говорили уже о готовом проекте, с которым мы победили на конкурсе. В целом его то и охота сегодня освежить и имеет смысл поднять вопрос снова. На Йоу-тюбе с тех пор мы увидели много интересных видео, где повторяют проект, только чаще вспоминают Гайвера, а не Технофею.
За рождение устройства отдельное спасибо Котову Александру (общий процесс сборки и изготовления деталей), Николаю Топоркову (программа с реализацией базового функционала, который уже имелся в более ранних образцах наливающих устройств) и Евгению Рычкову (разработка ПО Наливатора и поддержка по проектированию устройства).

1 место на конкурсе Робопром online, май 2020
Что логично – мы ведем во многом менее медийную жизнь и больше уделяем больше времени встречам и житейскому, победам в грантах, на хакатонах и на соревнованиях. На видео сейчас появляется все больше и больше подобных устройств, некоторые гики подключают их к Алисе, что показывает, что тема актуальна и сегодня не только в наших головах, но просто инерция с 18-20 годов только сейчас начинает приводить не к единичным образцам, а к популяризированным способам собрать подобные устройства.
Инженеры и любители собирали версии поливаторов и ранее, мы не начинали совсем с нуля и не претендуем на полное первенство. Однако в статье приведено именно оригинальное устройство, с учетом полного пересмотра того, что уже было доступно в начале 2020 года.
Так, с 2023 года по сети уже начинают гулять видео, очень похожие на нашу разработку. И это здорово, это сподвигло нас вспомнить саму электронную начинку проекта и подумать, а что же дальше.
Видео по работе нашего устройства доступно было в нескольких местах, но в итоге мы его выложили и на канал Технофеи: https://www.youtube.com/watch?v=V7uvGUtdySE
Интерес представляет и функция смешивания напитков, ведь точность в мл в проекте задается тумблером и процесс налива происходит довольно точно, но либо надо вручную перекидывать шланг между бутылками для создания коктейля, либо надо просто поставить 3-4 системы налива (3-4 насоса и отдельные шланги), каждая из которых будет наливать по определенной программе, либо система смешивания вообще должна быть до Наливатора.

Можно указать количество мл, по сколько наливать в каждую стопку, которая стоит на приборе
То есть не то чтобы проект совсем актуален из-за этого, но сегодня самое время задаться подобными вопросами и разрулить их уже на трезвую голову, простите.
Вижн VS реальное устройство
Вы подключаете устройство к системе подачи напитков, говорите, кто сегодня в гостях или какое у вас настроение, а он:
распознаёт предпочтения и ограничения;
подбирает напиток и температуру;
произносит тост, историю или лёгкую шутку, сгенерированную контекстно-зависимым ИИ;
отмеряет и наливает с точностью профессионала, но без суеты;
анализирует дозы и предупреждает о последствиях, предлагает, когда стоит остановиться, чтобы оставаться в определенном состоянии.

Звучит как игрушка? До первого вечера. Когда устройство запоминает, что ваш отец любит не слишком сухой джин, предлагает тост «За здоровье тех, кто далеко» перед видеозвонком с родственниками, и подстраивает крепость в градусах под прогноз погоды, гаджет перестаёт быть техникой. Он становится соучастником.
В умном доме, когда Вы не купили в ипотеку под большой процент маленькую студию в Замкадье Москвы, а взяли относительно хорошее и просторное жилье, интерес становится особо примечательным. Ведь В маленькой квартире Вам нужно придумать, где рядом с кофе-машиной поставить этот агрегат и где он вообще должен стоять.
Но в большом доме Вы можете поставить многую уже давно разработанную за Вас электронику: расставить роботы-пылесосы, подключить телевизор к голосовому ассистенту, включать и выключать свет через умные розетки или реле, монтировать две роборуки над кухонным столиком для готовки… Но поставить умный подоконник, где выращиваются микрозелень и ягоды, установить полностью Вашего голосового локального ассистента на базе LLM 27b, поставить Наливатор для скрашивания вечеров Вы так просто уже не сможете – это, как правило, до сих пор продукты DIY-деятельности, только созревающие для массового рынка.

Вижн мейкера DIY против его реальных возможностей в плане своих квадратных метров
Процесс создания коктейлей дома и приготовления домашних напитков… Каким он должен быть? Как разбить функционал устройств, либо же все реализовывать в одном девайсе? Например, один прибор будет смешивать, а второй эпично наливать, произнося тосты? Или как это может выглядеть?
Если Вы сидите с женой – атмосфера одна. Если с коллегами по военной кафедре – совсем другая. С девушкой, с которой только познакомились – можно им «втирать про военку», но завтра свои не поймут, что за информацию ты вчера проболтал непонятно кому. Нужны другие тосты и шутки.
Следовательно, устройство должно быть максимально кастомизируемым, его "мозг" хорошо бы масштабировать вплоть до подключения вместо базового объявляющего тосты робота локального голосового ассистента.

Вариант установить дома робота-бармена, а не автомат из фанеры с точной и автоматизированной дозировкой
Актуальна и возможность сборки и анализа больших данных, и вариабельности в процессе диалога. Но при этом сложную систему запускать труднее, поэтому в одном устройстве мы решили как минимум и функцию розлива напитков делать, и возможность произносить тосты и шутить.
Если ты один, то с данным устройством ты уже не один, оно с самого начала разговаривает с тобой. коммерческий голосовой ассистент не подходит, так как нужно устройство, которому можно спокойно «сливать» свои секреты, и если лень дойти до бармена в клубе, устройство должно быть явно не крысой в данных вопросах.
Что дальше? Смешивание, коктейли или экосистема?
Логичный вопрос: зачем останавливаться на наливке? Конечно, следующий шаг это автоматическое смешивание, работа с сиропами, биттерами, газацией и лёд-генератором.

Смешивание напитков - отдельный вопрос
Но мы видим в этом уже отдельное устройство. Наливатор оснащен именно трубкой, по которой мини-насосом качается напиток прямо в стаканы по разработанным методикам и программам, из которых можно выбрать предпочтительную.
Наливатор, таким образом, – это первоначальный шаг, за которым следует дальнейшая разработка экосистемы вокруг заданной темы. Он – часть экосистемы домашнего гостеприимства. В ближайшем горизонте:
Умные картриджи и подписки с сезонными ингредиентами, готовыми пропорциями и проверенными рецептами от барменов.
Контекстная адаптация: интеграция с календарём, погодой, музыкой и даже умным светом. Дождь за окном? Предложит глинтвейн, приглушит свет, включит джаз.
Социальный слой: обмен тостами, сохранение «фирменных» фраз семьи, гостевые профили, возможность отправить голосовое поздравление, которое «Наливатор» произнесёт за вас.
Безопасность и контроль: автоматический учёт потребления, мягкие напоминания, возможность ограничить крепость (в градусах) для конкретных профилей.
Так, Евгений любит пить коньяк без колы. А Алина пить без колы не может вообще. В идеале Наливатор должен угодить обоим и учесть вкусы и предпочтения всех остальных в собравшейся компании, а не заставлять человека думать во время очередного тоста. Liberté, égalité, fraternité.
Выпить за что-либо дома станет проще и интереснее не потому, что устройство делает это за вас, а потому, что оно убирает барьеры: не нужно гуглить пропорции, придумывать тост в последний момент или бояться, что гости заскучают. Оно создаёт атмосферу, в которой разговор завязывается сам.
Форм-фактор и физические ограничения
Устройство сравнительно компактное: менее ~220 × 170 × 140 мм. Пять посадочных мест под стаканы расположены в полукруг с шагом ~42 мм.
Тубинг и дозирующая головка укладываются в один модуль над основным блоком с LCD-дисплеем.

Наливающая головка устройства
Плата управления и блок питания изолированы от зоны пролива.
Акустика вынесена с тыльной стороны (с возможностью добавить фазоинвертор объёмом ~80 см³ для сохранения разборчивости речи без увеличения корпуса).
Устройство питается от 5В через USB-B-разъем, имеется тумблер включения.

Тыльная сторона устройства с разъемом питания, тумплером включения и отверстиями, за которыми расположен динамик
Совет: лучше сразу проектируйте лазерную гравировку, мы делали два образца с гравировкой и без нее, по факту без шуток прямо на корпусе и надписей, где питание, а где включение, скучновато. А с ними появляется больше мотивации все это собирать и улучшать.
Железо: что стоит на столе сегодня и что будет завтра
Микроконтроллер
Сейчас: Arduino Uno (ATmega328P, 16 МГц, 2 КБ SRAM, 32 КБ Flash). Всё работает на голом C++, без ОС. Прерывания по таймеру для опроса датчиков, аппаратный PWM для мотора, lookup-таблицы для тостов.
План: ESP32-S3 (dual-core Xtensa, Wi-Fi + BLE, 8 МБ PSRAM, 16 МБ Flash). Переход даст FreeRTOS, аппаратный I2S, криптографию, OTA и возможность запускать квантованные NLP-модели без облака. Для LLM вообще план - это отдельный компьютер вида MacMini с подключением по локальной сети.
Дозирующий привод
Для точной подачи алкоголя мы отказались от дешёвых пластиковых мини-помп в пользу металлического мотор-редуктора с оптическим энкодером:
Тип: JGA25-370 12V (или аналог Pololu 150:1 HP Micro Metal Gearmotor) с металлическими шестернями, ресурс >10 000 циклов.
Управление: Закрытый контур PID по сигналам энкодера. Это даёт повторяемость ±0.3 мл на порцию, компенсацию износа шланга и вязкости жидкости.
Механика: Мотор вращает каллиброванную перистальтическую головку с медицинским силиконовым рукавом (пищевой допуск, быстрая замена). Альтернатива под разработку: винтовой микро-дозатор с тефлоновым поршнем для нулевого dead-volume. Подойдет относительно любой сервопривод с небольшим крутящим моментам, такой как, например, mg995.
Как совет: можете не привинчивать некоторое время после разработки намертво сервопривод, чтобы иметь возможность не в программе, а руками поменять угол поворота, если вдруг льет мимо стакана. Мы рассчитывали на то, что можно использовать далеко не только стопки, хотя на них делали упор. Вам стоит понять, что все четко отрегулировано и центрировано, затем уже можете и закрутить.
Оптическое распознавание тары
Вместо весовых ячеек (которые занимают место и чувствительны к вибрациям) мы используем массив из 5 щелевых оптопар:
Датчики: OPB704 (щелевой, 3 мм зазор) или TCRT5000 в отражательном режиме с опциональной ИК-подсветкой.
Обвязка: Аппаратный RC-фильтр + компаратор (LM393) для чистого цифрового сигнала. Программно – программный debouncing (50 мс) и мажоритарная фильтрация для защиты от бликов и пыли.
Логика: При обнаружении объекта в слоте контроллер блокирует дозирование в соседних каналах, активирует насос и ведёт отсчёт объёма по энкодеру.
Вот готовый, неблокирующий скетч для одного оптического датчика. Он реализует 50 мс дребезг + мажоритарную фильтрацию (3 стабильных цикла подряд), не мешает работе PID-мотора и энкодера, и легко масштабируется на 5 каналов.
#include <Arduino.h> // === НАСТРОЙКИ === constexpr unsigned long DEBOUNCE_MS = 50; constexpr uint8_t STABLE_CYCLES = 3; constexpr unsigned long READ_MS = 10; struct Sensor { uint8_t pin; bool activeHigh, enabled; bool raw, confirmed, last; unsigned long t; uint8_t cnt; }; // === КОНФИГ ДАТЧИКОВ === Sensor sensors[] = { {2, true, true, false, false, false, 0, 0}, // SLOT_1 // {3, true, true, false, false, false, 0, 0}, // SLOT_2 — раскомментируйте при необходимости }; constexpr uint8_t CNT = sizeof(sensors)/sizeof(sensors[0]); // === ОБРАБОТКА СОБЫТИЯ === void onGlass(uint8_t id, bool present) { Serial.print(millis()); Serial.print(" ["); Serial.print(id); Serial.print("] "); Serial.println(present ? "GLASS IN" : "GLASS OUT"); // Ваша логика: мотор, энкодер, помпа... } // === ИНИЦИАЛИЗАЦИЯ === void setup() { Serial.begin(115200); for (auto& s : sensors) if (s.enabled) { pinMode(s.pin, INPUT); s.raw = s.confirmed = s.last = (digitalRead(s.pin) == s.activeHigh); s.cnt = STABLE_CYCLES; s.t = millis(); } } // === ГЛАВНЫЙ ЦИКЛ === void loop() { unsigned long now = millis(); for (uint8_t i = 0; i < CNT; i++) { Sensor& s = sensors[i]; if (!s.enabled || now - s.t < READ_MS) continue; s.t = now; bool raw = (digitalRead(s.pin) == s.activeHigh); if (raw != s.raw) { s.raw = raw; s.t = now; s.cnt = 0; continue; } if (now - s.t < DEBOUNCE_MS) continue; if (raw == s.confirmed) { if (s.cnt < STABLE_CYCLES) s.cnt++; } else s.cnt = 0; if (s.cnt >= STABLE_CYCLES && s.confirmed != raw) { s.last = s.confirmed; s.confirmed = raw; onGlass(i, raw); } } // Ваша неблокирующая логика: PID, энкодер, и т.д. }
Аудиотракт (динамик)
Голос – критичная часть UX. Мы не ставим пьезо-пищалки и не тянем Bluetooth-колонку. Решение:
ЦАП: MAX98357A (I2S + Class D, 3.2 Вт, 8 Ω/4 Ω поддержка). Подключается напрямую к ESP32-S3 (или через сдвиговый регистр на Uno для прототипа). Но мы использовали DF-Player.
Динамик: 32 мм полнодиапазонный неодимовый драйвер (например, CUI Devices CMS-23114-SP или аналог PUI Audio ASD-3228). Диапазон 300 Гц – 5 кГц оптимизирован под разборчивость речи.
Корпус: Акустически изолированная тыльная камера с внутренним демпфированием. Уровень звукового давления ~85 дБ на 1 м – достаточно для кухни, не перекрывает музыку.
Как записать и воспроизвести фразы
Хранить аудио прямо в памяти Arduino Uno (32 КБ Flash, 2 КБ SRAM) непрактично: даже сжатый 8-битный PCM при 8 кГц занимает ~8 КБ/секунду. Три-пять фраз уже съедят всю память, а прошивка перестанет компилироваться. Поэтому на этапе прототипа используется внешнее хранение + аппаратный декодер.
Ниже проверенное решение, которое не грузит процессор, не конфликтует с PID мотора и оптическими датчиками, и легко интегрируется в вашу архитектуру.
🔧 Схема подключения (DFPlayer Mini + microSD)
DFPlayer Pin | Arduino Uno | Примечание |
VCC | 5V | Стабильное питание |
GND | GND | Общая земля |
TX | Pin 10 |
|
RX | Pin 11 | ⚠️ Через резистор 1 кОм (5V→3.3V level shift) |
SPK_1/SPK_2 | Динамик 3–5 Вт, 8 Ω | Не подключайте к усилителю без аттенюатора |
BUSY | Pin 12 | Опционально: LOW = играет, HIGH = стоп |
📌 Почему DFPlayer, а не прямая игра с SD?
Uno не имеет DMA и аппаратного I2S. Программный декодинг (TMRpcm и аналоги) создаёт джиттер, конфликтует с analogWrite() мотора и съедает 60–80% CPU. DFPlayer берёт декодирование на себя, Arduino лишь отправляет UART-команды. CPU нагрузка <2%.
SD:/
└── mp3/
├── 0001.mp3 → "Привет, вечер начинается"
├── 0002.mp3 → "За тех, кто рядом"
├── 0003.mp3 → "Пора закусить"
└── 0004.mp3 → "За то, что проснулись"
/** * DFPlayer Mini Controller v1.0 * • Неблокирующее воспроизведение через пин BUSY * • Команды: toast1..toast4 через Serial * • Легко интегрируется с датчиками / PID / MQTT */ #include <Arduino.h> #include <SoftwareSerial.h> #include <DFRobotDFPlayerMini.h> // === ⚙️ НАСТРОЙКИ === constexpr uint8_t DF_RX = 10, DF_TX = 11, BUSY_PIN = 12; constexpr uint8_t VOLUME = 20; // 0..30 constexpr uint16_t TRACK_TOAST[] = {1,2,3,4}; // Номера треков в папке mp3/ constexpr uint8_t TRACK_COUNT = sizeof(TRACK_TOAST)/sizeof(TRACK_TOAST[0]); SoftwareSerial dfSerial(DF_RX, DF_TX); DFRobotDFPlayerMini df; // === 📦 СОСТОЯНИЕ === bool isPlayingNow = false; // === 🎯 API === void playToast(uint8_t id) { if (id == 0 || id > TRACK_COUNT) return; Serial.print(F("▶ Play #")); Serial.println(id); df.playMp3FolderTrack(TRACK_TOAST[id-1]); isPlayingNow = true; } inline bool isBusy() { return digitalRead(BUSY_PIN) == LOW; } // === ⚡ ИНИЦИАЛИЗАЦИЯ === void setup() { Serial.begin(115200); pinMode(BUSY_PIN, INPUT_PULLUP); dfSerial.begin(9600); if (!df.begin(dfSerial)) { Serial.println(F("❌ DFPlayer not found! Check TX resistor (1k) & wiring.")); while (true) delay(1000); } df.setTimeOut(500); df.volume(VOLUME); df.EQ(DFPLAYER_EQ_NORMAL); df.outputDevice(DFPLAYER_DEVICE_SD); delay(800); // Ждём инициализацию SD Serial.println(F("✅ Ready. Send: toast1, toast2, ...")); } // === 🔄 ГЛАВНЫЙ ЦИКЛ === void loop() { // 1. Обработка Serial-команд (для отладки / управления) if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (!isPlayingNow && !isBusy()) { if (cmd.startsWith("toast")) { uint8_t n = cmd.substring(5).toInt(); if (n >= 1 && n <= TRACK_COUNT) playToast(n); } } } // 2. Проверка окончания трека (неблокирующая) if (isPlayingNow && !isBusy()) { isPlayingNow = false; Serial.println(F("✓ Track finished")); // Здесь можно: запустить следующий трек / уведомить систему / сбросить флаг } // 3. 🎯 ИНТЕГРАЦИЯ: пример с оптическим датчиком // if (glassDetected && !isPlayingNow && !isBusy()) { // playToast(2); // "За тех, кто рядом" // } delay(10); // Минимальный yield для SoftwareSerial }
Чем Наливатор из Технофеи от Александра Конопацкого и Евгения Рычкова отличается от других устройств?
На полках и в Kickstarter уже давно появлялись «умные диспенсеры», автоматические бармены и голосовые помощники для кухни. К слову сказать, и наше решение берет корни из середины 2019 года. Но другие устройства для налива напитков объединяет один подход: утилитарность. Они решают задачу быстро, точно, без участия человека. Это инструменты.
Наш проект идёт от обратного. Мы не заменяем общение, а усиливаем его. Вот ключевые отличия:
Существующие решения | Наш подход |
Фокус на автоматизации и точности дозирования | Фокус на ритуале, настроении и социальной динамике |
Голосовые команды в формате «налей 50 мл виски» | Контекстный диалог, генерация тостов, адаптация под гостей и ситуацию |
Закрытые системы с фиксированными напитками | Открытая экосистема: рецепты, ингредиенты, подписки, пользовательские сценарии |
Одноразовое использование (вечеринка → уборка) | Долгосрочная память профилей, семейные традиции, накопление «культурного кода» |
Проще говоря: пока другие стремятся сделать так, чтобы вам не приходилось думать, мы стремимся сделать так, чтобы вам хотелось говорить и снова принять эдакий чай Five O'Clock, то есть завести интересную и правильную традицию, где устройство позволит Вам знать меру и, в то же время, не заскучать.

Робот-бармен или возможное визуальное восприятие бармена после нескольких стаканов лекарства
Это про культуру, а не про железо
«Наливатор» не заменит бармена в клубе и не отнимет утренний капучино у тех, кто любит его готовить сам. Он решает другую задачу: возвращает в цифровую эпоху то, что алгоритмы часто выхолащивают, человечность момента.
В будущем экосистема может включаться в доставку ингредиентов, интеграцию с ресторанными картами, AR-сценарии для вечеринок или даже терапевтические режимы для мягкого социального раскрепощения. Но ядро останется прежним: простой, тёплый, узнаваемый ритуал. За столом должно быть место разговору. А тост пусть подскажет машина.
Мы не против кофе. Мы просто считаем, что жизнь не должна сводиться лишь к утреннему ритуалу у стойки. Жизнь – это более разнообразная штука. Тем не менее, проект называется не Рич.

Интерфейс для живого взаимодействия с Наливатором. В меню есть разные виды Рулетки
Почему это важно для гиков
Мы могли бы сделать ещё один диспенсер с мобильным приложением и Wi-Fi, подключив его по API к одной из готовых LLM-сетей. Но пока нам была интереснее задача: как встроить социальный интеллект в бытовое устройство, не превратив его в шпиона в облаке.
Это вызов:
Запустить NLP-модель на 240 MHz с 16 MB RAM.
Распознавать речь и конкретные команды не только для налива напитков, но для локального контроля развития событий в процессе праздника или дружественного общения.
Обучить RL-агент контролировать темп вечера, не будучи навязчивым (сейчас просто перебираются заранее записанные в память шутки и фразы).
Сгенерировать уместный и полностью нестандартный и не заданный ранее тост без отправки голоса в облако.
Дать открытый API, но не открыть уязвимости.
Если вы тоже считаете, что умный дом должен быть умным, а не просто подключённым — давайте обсуждать. Мы думаем над тем, чтобы выложить проект в GitHub, предоставить документацию API и готовность принимать pull requests, и Ваш комментарий или интерес может послужить триггером.
А если таки подключить к локальной сети умного дома?
Несмотря на множество таких устройств, собранных гиками и выложенными в Интернет путем, в частности, видеосъемки, люди повторяют друг за другом почти один и тот же функционал, но мало кто заходит чуть дальше в область использования LLM, сборки данных в локальной сети для дообучения и дописания программы на их основе.
Устройство гиги и мейкеры представляют в виде «все готово, используйте», а дальнейшая доработка вроде и предполагается, но крайне неочевидно. Настолько, что именно про решения вида «домашняя инфраструктура с агрегацией больших данных» конкретной речи пока в рамках свободно доступного в Интернете материала не идет.
Сценарии, которые могут работать на практике
Интересно сделать прошивку не для всех, а как в современных ассистентах: ты запускаешь перед очередным мероприятием в кругу друзей сценарий, которого и придерживается твой робот-бармен.
«Вечер с друзьями» Наливатор получает от Home Assistant событие
scene.evening_guests→ активирует гостевой профиль → включает мягкий контроль темпа → при наливании в третью стопку предлагает тост «За тех, кто рядом» → через 20 минут мягко намекает на закуску.«Утро после» По расписанию или по голосовой команде «режим восстановления» устройство переключается на безалкогольную линию: вода с лимоном, имбирный сироп, электролит. Тосты меняются на поддерживающие: «За то, что проснулись».
«Синхрон с музыкой» Через MQTT подписка на статус Spotify/MPD. Когда трек меняется на медленный — наливатор предлагает выдержанный напиток и тост в тон. Быстрый бит — лёгкий аперитив или пауза.
«Родительский контроль» Профиль
teenимеет жёсткие лимиты: только безалкогольные линии, фиксированный объём, тосты без упоминания алкоголя. Активация — по отпечатку (опциональный модуль) или пин-коду.
Представьте, что ваше устройство — это официант в баре, а умный дом — это вы, сидящий за столиком.
HTTPS — как звонить официанту каждый раз
Вы: *набираете номер* → «Алло, налей 50 мл виски!» Официант: «Принято» → наливает → вешает трубку
Как это работает технически:
Вы отправляете запрос (HTTP POST) → устройство отвечает → соединение закрывается
Каждый раз — новый «звонок», с рукопожатием, заголовками, авторизацией
Устройство молчит, пока его не спросят
Плюсы HTTPS:
✅ Знакомый протокол, легко отлаживать через браузер
✅ Хорошо для разовых команд: «включи свет», «открой замок»
Минусы для «Наливатора»:
❌ Тяжёлый: каждый запрос — это ~500–2000 байт «воздуха» (заголовки, SSL)
❌ Медленный: установление соединения = 200–500 мс задержки
❌ Неудобно для «устройство → вы»: если наливатор хочет сказать «закончился виски», ему нужно ждать, пока вы спросите
❌ Жрёт батарею: каждый раз «будить» радиомодуль для нового соединения
📻 MQTT — как рация с подпиской на каналы
Вы: говорите в рацию на канале "кухня/команда" → "налей 50 мл виски" Наливатор: слушает канал "кухня/команда" → услышал → налил → сказал в канал "кухня/статус" → "готово, осталось 200 мл"
Как это работает технически:
Устройство один раз подключается к брокеру (серверу-посреднику) и подписывается на нужные «каналы» (топики)
Команды и статусы летают как короткие записки:
topic: nalivator/kitchen/pour,payload: {"ml":50}Устройство может само публиковать события: «стакан поставили», «жидкость кончилась»
Плюсы MQTT для «Наливатора»:
✅ Лёгкий: заголовок сообщения — всего 2 байта! Полезная нагрузка — только ваши данные
✅ Быстрый: соединение постоянное, задержка ~10–50 мс
✅ Двусторонний: устройство само сообщает о событиях, не нужно его «опрашивать»
✅ Надёжный: есть уровни доставки (QoS 0/1/2) — можно гарантировать, что команда «налей» не потеряется
✅ Масштабируемый: один брокер может обслуживать 10, 100, 1000 устройств без перегрузки
Как может выглядеть протокол взаимодействия с устройством:
Взаимодействие с наливатором строится на обмене короткими JSON-сообщениями по MQTT. Каждый топик решает конкретную задачу: `nalivator/kitchen/status` → `{"online": true, "firmware": "0.4.2"}` Статус устройства: отправляется при подключении к брокеру, подтверждая готовность к работе и текущую версию прошивки. `nalivator/kitchen/glass/3` → `{"present": true, "type": "shot", "volume_ml": 45}` Детекция тары: публикуется в момент постановки стакана на третий слот, фиксируя его наличие, тип и запрошенный объём. `nalivator/kitchen/pour/start` → `{"user": "evgeniy", "drink": "whiskey", "toast_id": 12}` Запуск розлива: инициирует налив для конкретного пользователя, указывая напиток и сценарий тоста. `nalivator/kitchen/alert` → `{"type": "low_liquid", "channel": 2}` Системное оповещение: сигнализирует о нестандартной ситуации, например, о критическом остатке жидкости во втором канале.
В качестве сервера может использоваться решение https://iot.tfeya.ru, однако оно «заточено» под сбор данных с датчиков и визуализацию этих данных. На локальном сервере, однако, может храниться информация вида «цифровой двойник» пользователя. Так, Наливатор может понимать, сколько рюмок и сколько мл выпил Вася и по результату получить информацию степени удовлетворения и дальнейшей способности Васи передвигаться. Аналогично для Пети. И устройство может предлагать конкретную развлекательную программу для Васи и Пети.
Хотя в базовом варианте им вполне хватит возможности выбирать количество мл и просто наливать по ситуации… Но все технологии работают почти так, что можно было и «не заморачиваться». Кажется, что у нас есть инженерная задача, мы ее решаем. Но на самом деле золотой век по Аристотелю уже давно дал нам аналогичные инструменты без «замудрений».
Например, что цветы можно поливать не через насос или помпу, а просто опустив один конец тряпки в воду, а второй - в грунт с растением. И здесь аналогично: мы можем бороться за то, чтобы из класса «Жигули» устройство Наливатора дальше двигалось в класс «Мерс». То есть чтобы было комфортно пользоваться, а решение стало по настоящему красивым и современным, реально привлекательным не для 1-2 гиков, но для целого рынка умного дома.
Таким образом, переход Наливатора из разряда домашних устройств с окончательно написанной программой в категорию умных систем, где решения принимаются не только в самом устройстве, но и на основе команд в сети умного дома, разумно провести с использованием MQTT-интерфейса в рамках локальной сети.
Не важно, что именно сейчас заложено в Наливаторе, но правильно предполагать, что поверх MQTT-интерфейса в устройстве подразумевается свой набор JSON-инструкций и команд. Немного поразмышляем в этом направлении, что это может дать.
🎛️ Сценарий 1: «Вечер с друзьями»
Запуск сценария
(mqtt)
TOPIC: nalivator/kitchen_01/cmd/mode/set QoS: 1 | Retain: false PAYLOAD: { "mode": "evening_guests", "profile": "guest", "pace_control": true, "pace_window_sec": 1200, "max_pour_ml": 50 }
Подтверждение и активация
(mqtt)
TOPIC: nalivator/kitchen_01/state/mode QoS: 1 | Retain: true PAYLOAD: { "active": true, "mode": "evening_guests", "profile": "guest", "pace_remaining_sec": 1200, "alcohol_enabled": true, "toast_style": "casual" }
Событие налива в 3-ю стопку + тост
(mqtt)
TOPIC: nalivator/kitchen_01/events/pour QoS: 0 | Retain: false PAYLOAD: { "slot": 3, "user": "alex", "volume_ml": 45, "toast_id": "toast_nearby", "toast_text": "За тех, кто рядом", "pace_compliant": true, "ts": 1715543400 }
Устройство само публикует команду на воспроизведение тоста:
(mqtt)
TOPIC: nalivator/kitchen_01/cmd/tts/play PAYLOAD: {"text": "За тех, кто рядом", "voice": "local_ru", "volume": 0.65}
Напоминание о закуске (через 20 мин)
(mqtt)
TOPIC: nalivator/kitchen_01/cmd/tts/play PAYLOAD: {"text": "За тех, кто рядом", "voice": "local_ru", "volume": 0.65}
🌅 Сценарий 2: «Утро после»
Переключение режима
(mqtt)
TOPIC: nalivator/kitchen_01/cmd/mode/set PAYLOAD: { "mode": "recovery", "profile": "default", "line_override": ["water_lemon", "ginger_syrup", "electrolyte"], "alcohol_disabled": true, "toast_context": "supportive" }
Состояние линий и контекста
(mqtt)
TOPIC: nalivator/kitchen_01/state/lines QoS: 1 | Retain: true PAYLOAD: { "1": "water_lemon", "2": "ginger_syrup", "3": "electrolyte", "4": null, "5": null }
(mqtt)
TOPIC: nalivator/kitchen_01/state/mode PAYLOAD: { "active": true, "mode": "recovery", "alcohol_disabled": true, "toast_context": "supportive", "next_toast_hint": "За то, что проснулись. И за чай, который уже кипятится." }
🎵 Сценарий 3: «Синхрон с музыкой»
Подписка на состояние плеера (публикуется HA или MPD-бриджем)
(mqtt)
TOPIC: music/livingroom/state PAYLOAD: { "player": "spotify", "bpm": 74, "genre": "indie_folk", "mood": "calm", "ts": 1715543520 }
Устройство обрабатывает и публикует рекомендацию
(mqtt)
TOPIC: nalivator/kitchen_01/state/recommendation QoS: 1 | Retain: true PAYLOAD: { "source": "music_sync", "suggested_drink": "aged_rum", "suggested_toast_theme": "contemplative", "reason": "bpm<80 & mood=calm", "auto_apply": false }
При наливании в событие добавляется контекст
(mqtt)
TOPIC: nalivator/kitchen_01/events/pour PAYLOAD: { "slot": 1, "user": "evgeniy", "volume_ml": 40, "context_music": {"bpm": 74, "track_id": "spotify:track:4uLU6hMCjMI75M1A2tKUQC"}, "toast_id": "toast_quiet_evening" }
📦 Хранение предпочтений и агрегация на локальном брокере
1. Профили как retained-конфиг
Все пользовательские профили хранятся в брокере с retain=true. Устройство при старте подписывается на nalivator/kitchen_01/config/profiles/# и загружает их в SPIFFS/LittleFS.
(mqtt)
TOPIC: nalivator/kitchen_01/config/profiles/guest PAYLOAD: { "pace_window_sec": 1200, "max_pour_ml": 50, "toast_style": "casual", "allowed_lines": [1,2,3], "toast_templates": ["toast_nearby", "toast_weekend", "toast_funny"] }
2. Агрегация данных
Mosquitto persistence:
persistence true+persistence_file mosquitto.db. Сохраняет retained-топики и историю между перезагрузками.Долгосрочное хранение: Подписка брокера или стороннего демона (например,
mqtt2influxdbилиtelegraf) наnalivator/kitchen_01/events/#иhistory/.Пример телеграфа:
(toml)
[[inputs.mqtt_consumer]] servers = ["tcp://localhost:1883"] topics = ["nalivator/kitchen_01/events/pour", "nalivator/kitchen_01/events/alert"] data_format = "json"
3. Синхронизация предпочтений
При изменении профиля через HA или мобильный интерфейс публикуется:
(mqtt)
TOPIC: nalivator/kitchen_01/config/sync PAYLOAD: {"action": "pull_profiles", "request_id": "req_01"}
Устройство отвечает:
(mqtt)
TOPIC: nalivator/kitchen_01/state/sync_ack PAYLOAD: {"status": "ok", "loaded_profiles": ["guest", "teen", "default"], "ts": 1715544000}
⚙️ Инженерные нюансы для ESP32/Arduino
Параметр | Рекомендация |
QoS |
|
Retain |
|
Парсинг JSON |
|
Таймауты | Подписка на |
Безопасность | Mosquitto ACL: |
Валидация | На устройстве проверяйте |
Громкость ответов на устройстве также может регулироваться исходя из картины шума в помещении (шумный разговор, музыка или же подозрительная тишина).
Резюмируем
За домашним столом должно быть место смеху, воспоминаниям и тому самому «выпьем за…». И теперь за этим не нужно идти в бар или судорожно подбирать слова в телефоне. Миру нужно больше интересных устройств.
Речь идет о таких устройствах, которые позволят отвлечь наших друзей по СНГ от громких сториз в Инст**ме (простите за мой французский) с высокочастотного динамика на телефоне и дадут им новый путь по церемониям распития сладких напитков и приема действительно полезных и правильных лекарств с инструкцией от самого Бендера внутри. Ибо, как завещал Омар Хайам: «Все есть яд и все есть лекарство, зависит от дозы».

За радости жизни!
Всё уже здесь. На вашей кухне. Говорит. Наливает и шутит. Мигает многими цветами радуги.
Александр Котов, Евгений Рычков
