Умная кофемашина это одно из самых глупых устройств на рынке. Обычно, сразу после включения, в них есть стадия автоматической промывки. И ещё одна перед выключением. Это значит, что вы не можете оставить в кофемашине кружку и приготовить напиток удалённо.
Управление таким прибором с мобильного телефона также очень неудобно. Вам нужно иметь при себе телефон, разблокировать его, найти и запустить приложение, дождаться подключения, настроить напиток. На всё это могут уйти десятки секунд.
Но, при наличии умной колонки на кухне, открывается полёт для фантазии. Особенно, когда кофемашина из списка старших моделей и умеет более десятка напитков, где каждый напиток регулируется большим набором параметров.
Возможности кофеварки
Под рукой оказалась кофемашина Jura E8 EB 15355 с возможностью приготовления и тонкой настройки 17 напитков.
Управлять устройствами этого бренда можно через дополнительный Bluetooth или Wi-Fi модуль. Для опытов была куплена Bluetooth-версия, потому что стоила дешевле.
Чтоб усложнить использование кофемашины в сторонних системах - производитель заложил в протокол нехитрое шифрование. Его нетрудно найти в сети и повторить на вашем любимом языке - один, два, три.
Из мобильного приложения под Android видно, что у бренда есть 520 различных моделей устройств с возможностью беспроводного управления. Все они описываются 68 файлами формата XML. В каждом файле есть перечень продуктов. У каждого продукта есть свой перечень параметров с описанием возможных значений.
Для нашей модели это:
Список продуктов - 15 штук, один из которых выключен настройками, а два являются двойными порциями. Непонятно, почему на сайте пишут про 17, потому что по факту получается всего 12 "уникальных" напитков.
Крепость кофе - от 1 до 10
Температура - низкая, нормальная, высокая
Количество воды - от 25 до 240 миллилитров, но границы отличаются для каждого из напитков
Bypass - дополнительное количество воды (без кофе), используется в напитках Бариста и Лунго Бариста
Количество молочной пены - в секундах (характерно для этого бренда)
Пауза молочной пены - используется в напитке Латте макиато (в три слоя - молоко, кофе, молоко)
Bluetooth Classic
Ранее я сталкивался только с технологиями Bluetooth BLE и Bluetooth Mesh.
Работа с BLE метками проста до безобразия. А управление Mesh-сетью полностью брал на себя софт шлюзов Xiaomi Multimode в рамках компонента Home Assistant - XiaomiGateway3.
Другое дело Classic версия протокола. С сервисами, характеристиками и бесконечными глюками при подключении к устройствам. Разработчики Home Assistant написали целую библиотеку, отвечающую исключительно за процесс подключения - bleak_retry_connector.
Как оказалось, не все Bluetooth адаптеры "одинаково полезны". Я убил около суток, пока понял, что проблема не в моём коде, а в дешевом noname адаптере. Он отлично находил BLE метки окружающих устройств. Но только до первой попытки подключения. После чего весь Bluetooth-стек повисал. Лечилось выдёргиванием адаптера из USB или перезагрузкой операционной системы.
На поиски рабочего адаптера ушла неделя. За это время было испробовано шесть разных моделей с локального рынка. Три удалось вернуть назад в магазин.
Удобный способ быстро проверить адаптер, это посмотреть системные сообщения Linux:
# dmesg | grep Bluetooth
[ 1285.821799] Bluetooth: hci0: CSR: Setting up dongle with HCI ver=9 rev=0001; LMP ver=9 subver=0001; manufacturer=2279
[ 1285.821832] Bluetooth: hci0: CSR: Unbranded CSR clone detected; adding workarounds and force-suspending once...
[ 1285.821846] Bluetooth: hci0: CSR: Couldn't suspend the device for our Barrot 8041a02 receive-issue workaround
[ 1285.821865] Bluetooth: hci0: HCI Delete Stored Link Key command is advertised, but not supported.
[ 1285.821876] Bluetooth: hci0: HCI Read Default Erroneous Data Reporting command is advertised, but not supported.
[ 1285.821885] Bluetooth: hci0: HCI Set Event Filter command not supported.
Эта операционная система любезно сообщает, что первые пять моделей являются дешёвой подделкой и с ними могут быть приключения.
На Baseus BA04 были большие надежды, но и он был отмечен сообщением выше. Плюсом у него были проблемы с программной перезагрузкой. Очень важная функция, на случай, если Bluetooth-стек не будет подавать признаков жизни какое-то время. В Home Assistant встроен автоматический watchdog по этому поводу.
Спасение пришло только с Buro BU-BT40С. Разработчики Home Assistant рекомендуют адаптеры на чипе CSR8510A10, как лучшие на рынке.
Интеграция Home Assistant
У меня уже есть опыт разработки пары десятков интеграций Home Assistant, поэтому добавить ещё одну не составило особого труда - Jura.
Из BLE метки от кофеварки можно узнать её модель (15355 в нашем случае) и выбрать подходящий XML файл описания продуктов. Из файла нужно собрать весь перечень возможных контролов для управления кофеваркой. Это несколько выпадающих списков, несколько ползунков от/до и кнопка запуска. Позже к ним был добавлен сенсор, отображающий статус подключения к прибору, уровень сигнала и время последнего обнаружения BLE-метки.
До выбора конкретного напитка все контролы находятся в выключенном состоянии. При выборе - активируются только те контролы, которые участвуют в напитке. Им выставляются правильные настройки и значения по умолчанию.
При изменении любого контрола, компонент Home Assistant подключается к кофемашине и поддерживает соединение на протяжении одной минуты. Это нужно, чтоб команда "приготовить кофе" могла выполнится мгновенно без ожидания времени подключения в несколько секунд.
Управление голосом
Умный дом Яндекса поддерживает только базовые функции управления кофеваркой, с выбором напитка из пяти предложенных, или запуском предустановленной "программы" цифрами от 1 до 10.
Может в этом есть смысл для "простых" кофеварок в типичных домашних условиях. Но в офисе на несколько десятков людей, хочется задействовать все возможности профессионального прибора.
Для полного контроля общения пользователя с Алисой можно использовать Платформу диалогов. У меня давно разработан на этот случай компонент - YandexDialogs. Его можно использовать автономно или в связке с другим моим компонентом для управления колонками Яндекса - YandexStation.
Писать общение с кофеваркой в Home Assistant в виде автоматизаций YAML или блоков Node-RED мне показалось довольно сложным. Поэтому я решил добавить поддержку python-скриптов. Тем более и для этого случая у меня имелся компонент - PythonScriptsPro.
Синтаксис python-скриптов я решил сделать совместимым с функциями Yandex Cloud, на которых также можно писать обработчики диалогов. По факту это просто вызов функции handler
, которой передаётся JSON запроса к диалогу и некий контекст. Функция должна вернуть JSON ответа от диалога согласно документации. В облачных функциях в контексте приходят параметры сервера, который вызвал функцию. А в компоненте - приходит объект Home Assistant, через который можно управлять устройствами, подключенными к платформе.
def make_response(event: dict, text: str, end_session=False) -> dict:
return {
"version": event["version"],
"session": event["session"],
"response": {"text": text, "end_session": end_session},
}
def handler(event: dict, context: dict) -> dict:
return make_response(event, "Ну привет!")
Обработка естественного языка
Для парсинга естественного языка в Яндекс диалогах встроен удобный инструмент - Natural Language Processing (NLP). Средствами которого можно описать все "сущности" вашего диалога, построить из них различные фразы и объединить их в "намерения".
Примеры запросов можно увидеть на скриншоте выше.
Сущности у меня получились такими:
Продукт - кофе, капучино, эспрессо и т.д.
Параметр - кофе, молоко, вода, крепость, температура
Температура - холодный, теплый, горячий
Направление - увеличить, уменьшить
Отдельно пришлось завести объединённые параметры, например:
крепче = увеличить крепость
горячее = увеличить температуру
Алиса плохо распознаёт иностранные слова, поэтому опытным путём были найдены аналоги названий напитков:
Намерения (интенты) получились такими:
coffee.product
- выбор продукта и его параметров, можно называть каждый продукт/параметр по отдельности, можно единой фразой "всё в одном"coffee.list
- список напитковcoffee.param
- изменение количества кофе, молока и воды, крепости и температурыcoffee.settings
- повторить настройки напиткаcoffee.make
- запуск
Когда напиток выбран, Алиса произносит все его характеристики.
Пример для обычного кофе:
100 миллилитров кофе крепости 5
для Бариста:
90 миллилитров кофе крепости 6 и 45 миллилитров воды
для Латте:
45 миллилитров - количество воды (с кофе)
горячего кофе - температура (для обычной температуры опускается)
крепости 8 - крепость от 1 до 10
и 22 секунды молока - количество молока (если напиток с молоком)
с паузой 30 - пауза молока (только для латте)
Правильно согласовывать слова (миллилитров и секунд) с числительными помогает ещё один мой компонент - MorphNumbers (уже шестой компонент, упомянутый в этой статье). Он основан на библиотеке pymorphy2. Его можно применять в автоматизациях Home Assistant, Node-RED, а теперь, и Диалогах.
One more thing...
Конечно на ум сразу приходит логичная идея - реализовать "пресеты" напитков с заданными настройками, чтоб пользователь мог одной быстрой фразой заказать свой любимый кофе.
Для этого есть сценарии Яндекса. Где вы говорите одну фразу, а Алиса выполняет совсем другую. Плюсом это решает проблему "активации навыка", где вместо ужасного "Алиса, открой навык Умная кофеварка", можно указать фразы "кофейку", "сделай кофе" или "крепкий Бариста для Алексея".
В фразах используется ключевое слово make, с которым навык приготовит выбранный напиток без лишних вопросов и подтверждений.
В качестве редактора быстрых фраз был выбран Google Drive. Что может быть проще? Единое и удобное место, куда имеют доступ все сотрудники офиса. Синхронизация данных запускается раз в минуту.
Яндекс, к сожалению, не даёт API для редактирования списка сценариев Алисы, но когда такие мелочи останавливали пытливый ум? Именно с помощью функционала сценариев два года назад удалось сделать поддержку всех колонок с Алисой в Home Assistant.
Эпилог
Исходный код диалога и NLP можно найти в wiki интеграции на GitHub.
Я надеюсь, это не последнее Bluetooth Classic устройство, которое удалось подружить с Алисой и Home Assistant. Следить за новостями можно в моём канале Telegram, а другие проекты - найти на GitHub.