Разговоры с кроватью, про Яндекс Алису и умный дом Home Assistant

В прошлой статье мы с вами добавляли голосовое управление кофеварке Jura. Но это была лишь тренировка в ожидании по-настоящему космического устройства — умной кровати Ergomotion от Аскона.

Пролог

У моей жены есть суперсила. Почти в любом магазине она выберет самую дорогую вещь из предложенных, не обращая внимания на ценники. Когда пришло время менять кровать — её внимание остановилось на спальной системе Ergomotion. Моей задачей было — определить, что вещь не только красивая, но и функциональная.

Из изучения сайтов и инструкций становится понятно, что основания Ergomotion обычно имеют:

  • двигатели изменения положения головы и ног

  • двигатели массажа головы и ног

  • радиопульт

  • подсветку и модуль bluetooth (в старшей модели)

основание Ergomotion 633 вид снизу (с) Аскона

основание Ergomotion 633 вид снизу © Аскона

Конечно, я сразу же стал искать возможные варианты подключения устройства к умному дому:

  1. Беспроводной пульт, скорее всего, работал на частоте 2.4ГГц и проприетарном протоколе, поэтому как возможный способ интеграции не рассматривался.

  2. Bluetooth-модуль имел шансы расковырять протокол. Но шёл только в комплекте со старшей моделью кровати, а она не устраивала по дизайну из-за лишних массивных бортов.

  3. Совсем недавно Олег (Sprut) анонсировал разработку Zigbee-модуля к этим кроватям. Модуль должен поддерживать весь модельный ряд и выглядел вполне рабочим вариантом интеграции.

Через несколько дней, на мероприятии Sprut.party 2023, мне удалось пообщаться с представителем компании Аскона. Каково было мое удивление, что он, ни на секунду не задумываясь, согласился прислать мне Bluetooth-модуль для экспериментов, без каких-либо гарантий на успешный результат.

Забегая на месяц вперёд, отмечу, что модуль пришёл в пятницу вечером, а в воскресенье вечером на моём Telegram-канале уже было видео голосового управления кроватью.

Лично у меня вызывает восхищение и глубокое уважение, когда в компании находится человек, готовый сотрудничать с представителем open source. Потому что для некоторых брендов вся связь с сообществом заканчивается на »отправить новое устройство какому-нибудь тиктокеру или проплаченному техноблогеру». В конечном счёте такие решения отражают истинное отношении компании к своим пользователям. Ничего личного, просто бизнес.

В итоге, нами была заказана младшая модель основания — Ergomotion 450.

Мобильные приложения

В Google Play у разработчика Ergomotion есть 30 (тридцать) приложений, и в большинство из них встроена функция управления кроватью.

Ergomotion в Google Play

Ergomotion в Google Play

Видимо, каждый раз получая на выходе дешёвую поделку с уродливым интерфейсом, компания заказывала разработку нового приложения у новой команды.

Ergomotion в Android

Ergomotion в Android

В таком подходе есть и плюс — все возможные bluetooth-команды для управления кроватью находятся за считаные минуты.

Примерно за пару часов весь протокол был как на ладони. Почему так долго? Да потому что, мобильные приложения совершенно не обрабатывают текущее состояние кровати. Его пришлось добывать экспериментальным путём, и там есть много интересного:

  • текущая позиция моторов головы и ног, в каких-то своих условных единицах

  • находятся ли моторы головы и ног в движении, довольно полезный флаг

  • выбранные уровни массажа головы и ног, от 1 до 6

  • установленный таймер массажа — 10, 20 или 30 минут

  • оставшееся количество секунд таймера, обновляется несколько раз в секунду

  • состояние подсветки, даже на кроватях, где её нет

Интеграция Home Assistant

Обязательным требованием к интеграции было последующее управление через Яндекс Алису. Поэтому я целый день подбирал, на каких базовых устройствах реализовать управление кроватью. В итоге остановился на:

  • двух шторах (cover) для управления позицией головы и ног

  • двух вентиляторах (fan) для управления массажем головы и ног

  • лампочке (light) для управления сценами (быстрыми позициями) кровати

  • и бинарном сенсоре состояния bluetooth-подключения

Home Assistant устройство

Home Assistant устройство

Имея на руках позицию и флаг активности мотора, удалось реализовать установку точного положения головы и ног. Компонент сам будет удерживать нужные кнопки, пока моторы не достигнут желаемых позиций. Это гораздо удобнее, чем делать тоже самое вручную через беспроводной пульт.

А ещё можно сохранить своё любимое положение для быстрого доступа, как в дорогих автомобилях.

Home Assistant объекты

Home Assistant объекты

Забавный факт. В старшей модели кровати массажем головы и ног управляют четыре кнопки на пульте (вверх и вниз для каждой части тела). В младшей — есть только две кнопки вверх. Но через bluetooth-модуль поддерживаются все четыре кнопки.

Компонент сам будет переключать скорости, пока не достигнет заданной через интерфейс Home Assistant.

из инструкции к пульту (с) Аскона

из инструкции к пульту © Аскона

В массаже, кроме скорости, можно установить режим. Он соответствует таймеру в 10, 20 и 30 минут. По умолчанию он всегда выставляется в 10 минут.

В лампочке, через эффекты, можно задать быстрые позиции кровати. Также лампочка считается включенной, если кровать приподнята. А если её выключить — кровать вернётся в исходное положение. Быстро и удобно.

Основной сложностью было эмулировать нажатия кнопок трёх разных типов:

  • нажал и держишь — изменение позиции головы и ног, тут очень важно постоянно слать нажатую кнопку без пауз, иначе движение будет дёрганным

  • нажал и отпустил (несколько раз) — смена скорости массажа (по очереди), тут очень важно отпускать кнопку, или скорость меняться не будет

  • нажал на долю секунды и отпустил — выбор предустановленной позиции головы и ног, тут очень важно задержаться в нажатом положении, или команда не выполнится

Также пришлось заложить логику определения и запоминания максимальной позиции моторов головы и ног. Ведь они отличаются даже на одинаковых моделях кроватей.

Ссылка на компонент Home Assistant — Ergomotion.

Управление голосом

На этом этапе будет понятно, почему были выбраны штора, вентилятор и лампочка.

В отличии от умной кофеварки, здесь удалось обойтись без Яндекс.Диалогов. Что заметно упрощает настройку и использование, но уменьшает гибкость в доступных голосовых командах.

Яндекс Умный Дом

Яндекс Умный Дом

Штора отзывается на команды «подними» и «опусти». Назвав шторы «голова» и «ноги», можно говорить Алисе:

Вентилятор отзывается на команды «включи» и «выключи». А также имеет разные скорости и режимы работы. Назвав вентиляторы «массаж головы» и «массаж ног», можно говорить Алисе:

  • включи массаж головы

  • установи высокий режим для массажа головы

  • включи следующий режим на массаже головы

  • установи программу два для массажа головы

Программы 1, 2 и 3 у вентилятора, это значения таймера 10, 20 и 30 минут соответственно. Не очень очевидно, но тут особо вариантов не было.

Лампочка имеет режимы «ночь», «кино», «отдых». Назвав лампочку «кровать», можно говорить Алисе:

Выключение лампочки (или в нашем случае кровати) аналогично команде «включи режим ночь на кровати». Можно пользоваться любой из них.

На скриншоте выше видно, что лампочка изображена как выключатель. Это сделано намеренно, чтоб кровать не отзывалась на команду «включи свет в спальне». При этом режимы, которые есть только у лампочек, за ней сохраняются. Пример настройки интеграции Yandex Smart Home:

yandex_smart_home:
  entity_config:
    light.ergomotion_scene:
      type: devices.types.switch
      modes:
        scene:
          night: [ 'flat' ]      # Ночь
          reading: [ 'lounge' ]  # Чтение
          movie: [ 'tv' ]        # Кино
          rest: [ 'zerog' ]      # Отдых

One more thing…

Железный профиль в основании кровати отлично подходит для установки подсветки во всю его длину. У меня как раз была в запасе старая лента Sonoff L1 на пять метров.

Но просто подсветка скучно. Веселее, когда она работает синхронно с голосом Алисы и повторяет подсветку колонки Яндекса. Три года назад я показывал, как это можно сделать с помощью компонента YandexStation:

К сожалению, API ленты Sonoff гораздо хуже, чем у устройств Yeelight (на видео выше):

  • лента не поддерживает локальное управление, поэтому команды выполняются с некоторой задержкой

  • лента не поддерживает параметр transition, с помощью которого цвет или яркость могут меняться плавно в течении некоторого времени

Поэтому пришлось реализовывать transition вручную в компоненте SonoffLAN. Анимация получилась немного дёрганной, но лучше чем ничего. Результат можно посмотреть на видео в начале статьи.

Код автоматизации Home Assistant

automation:
  - alias: Alice to LISTENING
    trigger:
      platform: state
      entity_id: media_player.yandex_station_mini2
      attribute: alice_state
      to: LISTENING
    action:
      - service: scene.create
        data:
          scene_id: before_alice
          snapshot_entities: light.sonoff_l1
      - repeat:
          while:
            - condition: template
              value_template: "{{ state_attr(trigger.entity_id, 'alice_state') != 'IDLE' }}"
          sequence:            
            - repeat:
                while:
                  - condition: template
                    value_template: "{{ state_attr(trigger.entity_id, 'alice_state') == 'LISTENING' }}"
                sequence:
                  - service: light.turn_on
                    data:
                      entity_id: light.sonoff_l1
                      rgb_color: "{{ [103, 57, 204] if repeat.index%2 else [36, 36, 255] }}"
                      brightness: 255
                      transition: 1
                  - delay: '00:00:01'
            - repeat:
                while:
                  - condition: template
                    value_template: "{{ state_attr(trigger.entity_id, 'alice_state') in ['BUSY', 'SPEAKING'] }}"
                sequence:
                  - service: light.turn_on
                    data:
                      entity_id: light.sonoff_l1
                      rgb_color: [103, 57, 204]
                      brightness: "{{ 100 if repeat.index%2 else 255 }}"
                      transition: 1
                  - delay: '00:00:01'
      - service: scene.turn_on
        data:
          entity_id: scene.before_alice

Подобную автоматизацию для колонок с Алисой несложно переделать в другую популярную функцию — »приглушать звук ТВ, когда разговариваешь с колонкой». Функция много лет есть в устройствах Chromecast и колонках Google Home, но официально в колонки Яндекса пока не попала.

Yet another thing…

Недавно я выпустил новую сборку портативной версии Home Assistant под Windows — HassWP. Она позволяет легко попробовать эту платформу без необходимости покупать и настраивать отдельный сервер, или изучать и разворачивать ПО для виртуализации.

В эту сборку уже встроены компоненты для управления кофеварками Jura и кроватями Ergomotion. До использования важно ознакомиться с тонкостями выбора стабильного bluetooth-адаптера в статье про кофеварку.

В комплекте HassWP нет компонента для интеграции с умным домом Яндекса — Yandex Smart Home, но его несложно установить. Компонент поддерживает лёгкую и быструю настройку на базе собственного навыка умного дома — Yaha Cloud, без необходимости публичного HTTPS-доступа к серверу Home Assistant.

Теперь, при желании, сотрудники Асконы могут установить Яндекс браузер и настроить голосовое управление кроватями на рабочем ноутбуке продавца. Получая при этом бонусы с продаж без каких-либо материальных вложений. Такой вот он open source.

Эпилог

Если кто-то в каждой новости видит рекламу — кровать я покупал за полную стоимость из своих кровных.

Года три назад я выпрашивал скидки у компании Coolkit на устройства Sonoff для развития компонента SonoffLAN. Тогда мне не дали даже жалких 5%. Сегодня они готовы прислать любые свои устройства без ограничений абсолютно бесплатно. Предложением я ни разу не воспользовался. Просто понимаю, что теперь не найду даже времени распаковать посылки, и они будут пылиться в кабинете, раздражая жену.

Как обычно, эти и другие полезные интеграции для Home Assistant можно найти на GitHub. А за новостями проектов — следить на канале в Telegram.

© Habrahabr.ru