Home-Assistant + Deconz и Xiaomi Magic Cube: "нативное" использование

09 февраля 2020, 17:04

У нас здесь на портале уже есть схожие статьи связанные с тем, как можно и даже нужно использовать куб от "поднебесного" бренда. Я же преследовал всегда цель использовать кубик в связке Home-Assistant (в дальнейшем ХА или HA) + Deconz аналогично тому, как это можно делать, используя девайс из коробки вместе с родными ПО и Mi-шлюзом.

После перехода на Deconz, я неоднократно встречал мнения и комментарии о том, что куб - это непонятное "существо", и как и для чего его использовать - пользователи не могли для себя идентифицировать. Мне всегда это было странно слышать или читать, т.к. это был один из практически первых девайсов, который был приобретен мною еще в 2017м году, наряду с другими тогдашними новичками рынка от Xiaomi. И я всегда “видел” и знал, как хочу его использовать, а главное - использовал!

По разным причинам руки не доходили до полноценной реализации автоматизаций через Deconz, хоть и материал был по этому поводу. Но сложилось так, что до недавнего времени из моих кубиков только один был подключен к Deconz’у и служил на кухне простеньким дополнительным триггером, для включения и выключения всего освещения, тряской или подбрасыванием. Ну и еще умел выключать освещение на балконе: если свет был включен - достаточно было взять кубик в руки, чтобы балконное освещение погасло. На этом все, другие экземпляры трудились через Mi-шлюзы. И да, у них никогда не было "ротейт" (rotate) автоматизаций через ХА, потому что все, что я встречал - не работало так, как мне хотелось.

Сегодня...

В конце прошлой недели на досуге я решил, что хочу полноценно использовать девайс через Deconz, и углубился в мануалы и треды обсуждений. И...? Мне удалось сделать то, чего я всегда хотел от кубика, но теперь и через Deconz. Думаю, что данная небольшая статья поможет приблизиться к использованию этого замечательного девайса в Ваших условиях, а главное, покажет простоту, с которой это реализовывается. Я пройдусь по всем ивентам (действиям), которые предоставляет данный девайс, и приведу еще раз наглядные примеры для полноты использования. Лишним это не будет в любом случае.

Итак, что умеет кубик еще раз
  1. Движение по плоскости;
  2. переворот на 90 градусов;
  3. переворот на 180 градусов;
  4. двойной тап (постукивание) по поверхности;
  5. тряска в воздухе;
  6. вращение на плоскости по часовой и против часовой стрелки;
  7. подбрасывание*;
  8. просыпание* - это когда Вы берете кубик в руки.

  • Первые шесть действий - это стандартный набор, который вы получаете из коробки и подключаете девайс к родному шлюзу (Mi).
  • * Со звездочкой пункты 7 и 8 - это дополнительные действия, которые недоступны через родные ПО и Mi-шлюз, и являются бонусом для пользователей сторонних шлюзов/стиков (Deconz или z2m aka Zigbee2MQTT).

Практическое применение

Итак, давайте остановимся на шаге, когда у Вас кубик уже сопряжен с Deconz’ом, и Вы начинаете писать автоматизации под него. Стандартные “безболезненные” ивенеты от кубика. Под этими словами мы будем понимать такие действия, как тряска, подброс и просыпание. Именно эти действия кубика в Deconz’е выступают всегда с одними и теми же значениями в событиях, которые передает служба deconz_event в ХА.

Теперь давайте рабочими примерами закрепим эти автоматизации.

Тряска

## shake - ceiling on/off with normal mode and ambilight
- alias: hall_mi_cube_shake_turn_on_ceiling
  initial_state: true
  trigger: 
  - platform: event
    event_type: deconz_event
    event_data:
      id: hall_mi_cube #имя_вашего_кубика
      event: 7007
  condition:
   - condition: state
     entity_id: light.yeelight_hall_ceiling
     state: 'off'
  action:
  - service: yeelight.set_mode
    data_template:
      entity_id: light.yeelight_hall_ceiling
      mode: normal

Все просто - у нас есть ивент с цифрами 7007, который и отвечает за это действие. Выше приведена автоматизация, которая включает люстру с заданными параметрами, если она была выключена. Обратный сценарий автоматизации есть и для включенного положения люстры.

Подброс

## fall - off all hall lights
- alias: hall_mi_cube_fall_turn_off_all_lights
  initial_state: true
  trigger: 
     platform: event
     event_type: deconz_event
     event_data:
       id: hall_mi_cube #имя_вашего_кубика
       event: 7008
  action:
    - service: light.turn_off
      entity_id:
        - light.yeelight_hall_ceiling
        - light.yeelight_hall_ceiling_ambilight
        - light.yeelight_strip2_cornice_hall
        - light.yeelight_ikea_table_lamp_bulb1_3
        - light.yeelight_ikea_floor_lamp_bulb2_1
        - light.yeelight_ikea_floor_lamp_bulb1_1
        - light.yeelight_ikea_floor_lamp_bulb1_2
        - light.philips_floorlamp_small_light
        - light.gateway_light_340076900065

Здесь все очень просто - опять ивент, но уже с номером 7008. Я сильно не заморачивался с этим действием и, как видно, подбросив кубик в воздух, автоматизация просто пройдется по ряду светильников и выключит их вне зависимости, кто из них был включен.

Просыпание

## wake - off balcony if on
- alias: hall_mi_cube_wake_balcony_off
  initial_state: true
  trigger:
     platform: event
     event_type: deconz_event
     event_data:
       id: hall_mi_cube #имя_вашего_кубика
       event: 7000
  condition:
   - condition: state
     entity_id: light.balcony
     state: 'on'
  action:
  - service: light.turn_off
    entity_id: light.balcony

И третье действие, которое всегда имеет одно и тоже событие в нашей службе Deconz - 7000. Выше я рассказывал, что на кухне у меня, при включенном освещении на балконе, "просыпание" кубика выключает три лампы Aqara Е27. Так вот в зале кубик делает действия, аналогично кухонному экземпляру.

Теперь нестандартные ивенты, так сказать “проблемные” - это те действия кубика, после которых мы получаем абсолютно разные значение в deconz_event. И если Вы новичок в ХА, и сталкиваетесь с этим впервые, у Вас могут возникнуть трудности в понимании, как сделать универсальнее, нежели писать по 10 одинаковых автоматизаций на все события, которые прилетают, например, с переворачивания кубика на 90 градусов. В таком случае, каждый переворот кубика на любую из плоскостей будет отдавать свое уникальное значение. Вот этот вопрос мы и постараемся решить ниже.

    Кстати, немного отвлекаясь от темы. Рядом на портале Вы можете найти замечательное решение от Stephan Fonderat и его статьи, где автор приводит практические примеры использования именно этого “болезненного” аспекта с кучей ивентов от кубика в Deconz’е, при одинаковых действиях. Рекомендую к ознакомлению “духовитым духом” практиков!

Итак, “наши проблемные события”

Изюминкой станет последний пункт с вращением кубика. Я долго шел к практической реализации и получению в итоге того, что мне было нужно.

Немножко о том, что будет происходить ниже. Т.к. кубик отдает разные события при одном и том же действии, и чтобы не писать тонны автоматизаций, дублирующие одна другую, но с разными ивентами, мы будем использовать темплейты, которые будут выступать у нас в каждой автоматизации в качестве условия (condition в ХА) при выполнении действий автоматизации. Таким образом, мы получаем универсальную автоматизацию, которая включает в себя все события от кубика от определенного действия с ним, и добиваемся работы девайса “как из коробки”.

Начнем с автоматизации на движение кубика по плоскости - когда Вы двигаете его по столу, например.

Движение на плоскости

## slide - on/off ikea desklamp
- alias: hall_mi_cube_slide_turn_on_ikea_desk
  initial_state: true
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: hall_mi_cube #имя_вашего_кубика
  condition:
   - condition: template
     value_template: >
      {% set valid_events = [1000, 2000, 3000, 4000, 5000, 6000] %}
      {{ trigger.event.data.event in valid_events }}
   - condition: state
     entity_id: light.yeelight_ikea_table_lamp_bulb1_3
     state: 'off'
  action:
    - service: light.turn_on
      entity_id: light.yeelight_ikea_table_lamp_bulb1_3
Выше пример автоматизации для движения кубика по плоскости. Теперь давайте немного разберем это, поскольку дальше все будет аналогично данному примеру. Первым и главным отличием от предыдущих трех примеров является наличие условия в виде шаблона (темплейта). В данном шаблоне мы перечисляем "валидные" т.е. правильные события от данного действия кубика, которые мы получаем по его движению на любой из плоскотей.

Все шесть плоскостей кубика, при его движении, отдают следующие события: 1000, 2000, 3000, 4000, 5000 и 6000. Аналогично, дальше мы будем получать столько же событий с разных сторон кубика, в зависимости от действий.

Теперь само условие:

  condition:
   - condition: template
     value_template: >
      {% set valid_events = [1000, 2000, 3000, 4000, 5000, 6000] %} #здесь мы указываем валидные события от службы deconz_event
      {{ trigger.event.data.event in valid_events }} #и соответственно отслеживаем этот список при исполнении действия

Переворот на 90 градусов

## flip90 - on/off floorlamp
- alias: hall_mi_cube_flip90_turn_on_floorlamp
  initial_state: true
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: hall_mi_cube
  condition:
   - condition: template
     value_template: >
      {% set valid_events = [1002, 1003, 1004, 1005, 2001, 2003, 2004, 2006, 3001, 3002, 3005, 3006, 4001, 4002, 4005, 4006, 5001, 5003, 5004, 5006, 6002, 6003, 6004, 6005] %}
      {{ trigger.event.data.event in valid_events }}
   - condition: state
     entity_id: light.yeelight_ikea_floor_lamp_bulb2_1
     state: 'off'
   - condition: state
     entity_id: light.yeelight_ikea_floor_lamp_bulb1_1
     state: 'off'
   - condition: state
     entity_id: light.yeelight_ikea_floor_lamp_bulb1_2
     state: 'off'
   - condition: state
     entity_id: light.philips_floorlamp_small_light
     state: 'off'
  action:
    - service: light.turn_on
      entity_id:
        - light.yeelight_ikea_floor_lamp_bulb1_1
        - light.yeelight_ikea_floor_lamp_bulb1_2
        - light.yeelight_ikea_floor_lamp_bulb2_1
        - light.philips_floorlamp_small_light

Переворот на 180 градусов

## flip180 - on/off cornice
- alias: hall_mi_cube_flip180_turn_on_cornice
  initial_state: true
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: hall_mi_cube
  condition:
   - condition: template
     value_template: >
      {% set valid_events = [1006, 2005, 3004, 4003, 5002, 6001] %}
      {{ trigger.event.data.event in valid_events }}
   - condition: state
     entity_id: light.yeelight_strip2_cornice_hall
     state: 'off'
  action:
    - service: light.turn_on
      entity_id: light.yeelight_strip2_cornice_hall

Двойной тап (постукивание) по поверхности

## double tap - on/off ceiling ambilight
- alias: hall_mi_cube_double_tap_turn_on_ceiling_ambilight
  initial_state: true
  trigger: 
  - platform: event
    event_type: deconz_event
    event_data:
      id: hall_mi_cube
  condition:
   - condition: state
     entity_id: light.yeelight_hall_ceiling_ambilight
     state: 'off'
   - condition: template
     value_template: >
      {% set valid_events = [1001, 2002, 3003, 4004, 5005, 6006] %}
      {{ trigger.event.data.event in valid_events }}
  action:
  - service: light.turn_on
    entity_id: light.yeelight_hall_ceiling_ambilight

Вращение на плоскости по часовой и против часовой стрелки

И, наконец, одно из самых важных (для меня) действий “магического” кубика - это вращение на плоскости по часовой и против часовой стрелки.

Почему я говорю - важное для меня? Потому что примеров использования такого действия масса, и оно довольно ярко отличается от предыдущих возможностей девайса. Здесь мы можем контролировать, например, яркость освещения простым вращением кубика, или управлять умным приводом штор от Xiaomi, задвигая и отодвигая их настолько, насколько захочется. :)

Я же использую данное действие кубика для регулировки громкости (абсолютно не важно какой - это уже зависит от Вашей фантазии). И, как я говорил в начале статьи, все предыдущие вариации, которые я встречал, либо реализовывал самостоятельно, мне не нравились - я не чувствовал того эффекта от “кручения” кубика, как например, это было через Mi Home. Из-за чего явно ощущалась неполноценность сего девайса в Deconz’е.

Недавно я еще раз сел за перенос всех своих кубов на Deconz. Переписав и обновив все свои автоматизации, я подошел к действию "вращения". Результат был неудовлетворительный на выходе, мне опять не нравилось, как работает вращение. После очередных попыток, я зашел в тупик, результат был тот же, что и раньше…

Глядя на свои попытки и шаблоны автоматизаций, размером с лист А4, меня посетила замечательная мысль. А что, если при вращении кубика по часовой - отслеживать по  шаблону в условиях, который мы разобрали выше, все значения, кроме уже ВСЕХ известных? Другими словами, у нас будет список со всеми известными событиями, которые кубик отдает службе с 1-го 7-й пункты возможностей девайса, кроме 8-го (вращения на плоскости). Ведь когда кубик крутится по часовой, значения абсолютно не похожи на все предыдущие, которые мы уже знаем, а против часовой - все ровно точно также, только еще и с минусом.

Несколько шаблонов были неудачными, после чего я изложил идею и рваный пример условия Николаю Васильчуку - этот крутой дядька уже давным давно известен в наших кругах как Гуру, и что стоит только его проект по автоматизации домофона, рекомендую! (Шатаут Коль!).

Николай, обработав мои мысли и обрывистые “кондишены”, вернул мне уже готовый рабочий вариант условия под эти две автоматизации с кубиком. И что я имею в итоге:

Как видно из видео, кубик рулит громкостью Google Mini.

Теперь тот самый пример автоматизации:

- alias: hall_mi_cube_google_mini_volume_up
  initial_state: true
  trigger:
     platform: event
     event_type: deconz_event
     event_data:
       id: hall_mi_cube #имя_вашего_кубика
       gesture: 7
  condition:
   - condition: template
     value_template: >
      {% set list = [7000, 1000, 2000, 3000, 4000, 5000, 6000, 1006, 2005, 3004, 4003, 5002, 6001, 1002, 1003, 1004, 1005, 2001, 2003, 2004, 2006, 3001, 3002, 3005, 3006, 4001, 4002, 4005, 4006, 5001, 5003, 5004, 5006, 6002, 6003, 6004, 6005, 1001, 2002, 3003, 4004, 5005, 6006, 7007, 7008] %}
      {{ trigger.event.data.event > 0 and trigger.event.data.event not in list }}
   - condition: numeric_state
     entity_id: sensor.load_158d1231835afe
     below: 30
  action:
    - service: media_player.volume_up
      entity_id: media_player.google_mini_hall


- alias: hall_mi_cube_google_mini_volume_down
  initial_state: true
  trigger:
     platform: event
     event_type: deconz_event
     event_data:
       id: hall_mi_cube #имя_вашего_кубика
       gesture: 8
  condition:
    - condition: template
      value_template: >
        {% set list = [7000, 1000, 2000, 3000, 4000, 5000, 6000, 1006, 2005, 3004, 4003, 5002, 6001, 1002, 1003, 1004, 1005, 2001, 2003, 2004, 2006, 3001, 3002, 3005, 3006, 4001, 4002, 4005, 4006, 5001, 5003, 5004, 5006, 6002, 6003, 6004, 6005, 1001, 2002, 3003, 4004, 5005, 6006, 7007, 7008] %}
        {{ trigger.event.data.event < 0 and trigger.event.data.event not in list }}
    - condition: numeric_state
      entity_id: sensor.load_158d1231835afe
      below: 30
  action:
    - service: media_player.volume_down
      entity_id: media_player.google_mini_hall

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

Спасибо за внимание! Надеюсь после прочтения этого творения, “магический” кубик от Xiaomi уже не будет столь непонятным и сложным во внедрении в Ваш Умный Дом.


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @Soprut

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Gülahmet Müslim (axyskus)
    Gülahmet Müslim (axyskus) месяц назад

    спасибо за труд. поправьте информацию: действия кубика подбрасывание и просыпание имеются в ха и через родной михаб

    • Anton Stolov (soulassassino)
      Anton Stolov (soulassassino) месяц назад

      Имелось ввиду невозможность этих действий в Mi Home. Но и да, читается не очевидно. Спасибо, сейчас поправлю.

  2. (gvasiliy)
    (gvasiliy) месяц назад

    Спасибо за статью познавательно . Ваши автоматизации не учитывают на какой плоскости лежит куб ? Это сильно уменьшает количество возможных команд.

    Себе сделал в условие на какой грани лежит куб. как раз из упомянутой статьи. Для себя немного защитился от " дребезга" от ложных срабатываний путем повышения одного условия. Ваше условие не сложнее ?

    1000x_image.jpg?1581271736
    • Anton Stolov (soulassassino)
      Anton Stolov (soulassassino) месяц назад

      Не за что. Вы не внимательны, в начале статьи я упомянул прямо - что целью являлось использование кубика аналогично нативному ПО. А, что касается учитывания всех граней, это оверцинк для меня. :) И я так же в статье упомянул Стефана и его статью, в которой он приводит как раз таки примеры использование разных событий от всех граней. Рекомендую ознакомиться, если для Вас это приоритет.

  3. (gvasiliy)
    (gvasiliy) месяц назад

    Без претензий к вам , еще раз спасибо за труд я, хотел поделится наработанным опытом. В вашем случае если стремление к шлюзному варианту  это сложное условия при повороте кубика ничего не дает, убрать его эффект буде тот же. Ваше условие не даст сработать автоматизации при повороте на величину из ряда приведенных . что на самом деле вероятность совпадения из списка мала. В новой версии ДЕКОНЗА это параметр "guesture:"  - "жест" заменил многое , что раньше приходилось перечислять а оно у вас и так указано .

    gesture: 8
            {% set list = [7000, 1000, 2000, 3000, 4000, 5000, 6000, 1006, 2005, 3004, 4003, 5002, 6001, 1002, 1003, 1004, 1005, 2001, 2003, 2004, 2006, 3001, 3002, 3005, 3006, 4001, 4002, 4005, 4006, 5001, 5003, 5004, 5006, 6002, 6003, 6004, 6005, 1001, 2002, 3003, 4004, 5005, 6006, 7007, 7008] %}
            {{ trigger.event.data.event < 0 and trigger.event.data.event not in list }}
    • Anton Stolov (soulassassino)
      Anton Stolov (soulassassino) месяц назад

      Тут у меня он лишний, другими словами его не должно быть. У меня raspbee на котором щас все крутится не выдает жест в собитиях.

    • Роман Елизаров (FantomNotaBene)

      По поводу "Ваше условие не даст сработать автоматизации при повороте на величину из ряда приведенных" полностью согласен. Но мне приходилось так делать, потому что поворотом хотелось пользоваться. А проблема была в том, что события от двух датчиков в кубе приходили в Home Assistant с одним идентификатором. Когда я их разделил, эта проверка стала избыточной и попросту мешающей.

      А теперь через жесты вообще красота.

      • Anton Stolov (soulassassino)
        Anton Stolov (soulassassino) месяц назад

        Я еще не проверял, конби второй у меня лежит пока без дела, но возможно жесты на нем уже нормально отображаются в событиях, на распи их к сожалению нету. :)

        • Роман Елизаров (FantomNotaBene)

          У меня RaspBee, жесты в ассортименте :)

          • Anton Stolov (soulassassino)
            Anton Stolov (soulassassino) месяц назад

            Хм, интересно, а какая у Вас прошивка сейчас? И какой куб? Не зависет ли это от версии куба, ведь есть и акара, не знаю есть ли в них какаета разница. :)

            Текущий мой инстанс трудится на:

            GW firmware version: 0x26330500
  4. Роман Елизаров (FantomNotaBene)

    О, прямо по моим примерам. Вряд ли это просто совпадение такое.

    Как-то кому-то на форуме ХА подсказывал вариант через темплейт-условия ровно в таком виде :)

К списку статей

Скидки для сообщества

Интернет-магазин yourhomekit.ru

+7 914 550-51-11
Промокод:
SPRUT-BLG
Размер скидки:
8%
Cамый большой ассортимент в России аксессуаров Apple HomeKit

LifeControl

+7 495 240-81-01
Промокод:
sprut10
Размер скидки:
10%
На весь ассортимент Lifecontrol

Похожие статьи

09 ноября 2018, 20:54
Кейс создания умного дома без каких либо прокладок в виде Raspberry pi
17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома
15 ноября 2018, 09:42
Способы автоматизации механических ворот
15 ноября 2018, 13:11
Xiaomi Mi Remote 360 добавляем Apple HomeKit
15 июня 2018, 12:13
Охранная система в гараж на ESP8266 с интеграцией в Apple HomeKit
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
19 марта 2019, 22:19
Обзор долгожданного 2х канального zigbee реле от Aqara, сравнение с конкурентами и небольшой тест на Deconz, Mi Hub и Aqara Hub.
30 августа 2019, 07:28
Несколько нетривиальных способов использования датчика открытия окон/дверей от Xiaomi/Aqara.
27 августа 2018, 10:14
Интегрируем ХА в HomeKit