Aqara cube + deCONZ. А что же он реально может?

12 декабря 2019, 16:34

Многие из тех у кого есть даже не предполагают, что он может. Сколько команд он поддерживает? Многие скажут, что 6. Стандартное постукивание, передвижение, повороты. Именно это и может куб подключенный к шлюзу Xiaomi. А что же может куб подключенный к HA  через Conbee стик или zigbee2mqtt. Поскольку у меня Conbee 2 стик, то про это я и расскажу.

Итак, мы добавили кубик в deCONZ. Не буду на этом останавливаться. Процедура стандартная и много раз описанная. Но, почему-то новых выключателей в HA не добавилось и все что мы видим это уровень заряда батареи у куба. После недолгих поисков и вопросов нам объясняют что, триггерами для автоматизаций будут deconz_event, которые будут передаваться в HA  при любом действии с кубом. И вот здесь оказывается, что таких event на самом деле не 6... и не 10... а около сорока. Кому интересно то можете посмотреть ролик DrZzs, где все популярно объяснено. И вот тут начинается самое интересное. Нормальный человек скажет: "Зачем мне столько? Я и половины не запомню!". И будет прав. Поэтому уже сделали компонент, который "кастрирует" кубик до привычного состояния  и 6 функций против 40. Я же пошел другим путем и начал рассуждать логически. Кроме двух независимых функций: подбрасывание кубика (event: 7008) и тряска кубика (event: 7007) есть еще 6 функций для КАЖДОЙ грани (event: Х00Х)плюс вращение по часовой стрелке и против.  

И вот тут первое разочарование.  Поскольку, при вращении кубик меняет ID и имеет значения только больше или меньше 0, в зависимости от того, в какую сторону крутить, то эту функцию можно прикрутить только к одной автоматизации. К примеру яркость лампы или громкость плеера. А хотелось большего. Вот если бы можно было и вращение на разных гранях привязать к разным автоматизациям.  И я нашел такое решение. Простое и оригинальное. Но скажу сразу, чтобы использование куба стало приятной процедурой сначала пришлось подумать над логикой и поработать в Photoshop. Кто не может в нем, можете использовать Illustrator, Corel, Painter или детские фломастеры и акварельные краски на худой конец (но за результат я не отвечаю).

Итак, чтобы использовать вращение на каждой грани нам нужен condition для каждой грани и брать мы его будем из input_select.cubemode который сначала и создадим. Для этого в файле input_select.yaml  добавляем наши варианты для кубика

cubemode:
  name: Cube Mode
  options:
    - None
    - Sony TV
    - Mi box
    - Lights
  initial: None 
  icon: mdi:cube-outline

Если же у вас такого фала нет, то создаем его в папке с configuration.yaml, не забыв добавить в него:

input_select: !include input_select.yaml

Сразу поясню. Сейчас у меня задействовано только три грани: свет, телевизор и mi box в спальне. Mode "None" я предусмотрел для того, чтобы можно было "отключать" куб и избежать ложных срабатываний. Ваши возможности ограничены только вашими фантазиями и количеством граней у кубика. После этого делаем автоматизации для выбора соответствующего mode. Для себя я решил, что движение slide (event: x000) на определенной грани будет активировать автоматизации для этой грани, а shake (event: 7007), будет сбрасывать все моды (None). Для этого в файле automations.yaml добавляем следующие автоматизации:

- alias: Xiaomi Cube - None
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 7007
  action:
     service: input_select.select_option
     data_template:
      entity_id: input_select.cubemode
      option: None

- alias: Xiaomi Cube - Cube Mode Sony TV
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 2000
  action:
     service: input_select.select_option
     data_template:
      entity_id: input_select.cubemode
      option: Sony TV

Автоматизации для остальных граней такие же как для Sony TV. Меняется только event  в соответствии с гранью, которую вы выбрали. 

А вот теперь начинается самое интересное. В вас должен проснуться фантазер и по возможности художник. Ибо запомнить все движения куба без визуальной помощи просто невозможно. Немного погуглив я нашел фотобумагу для принтера с клейкой  основой для печати стикеров. Одного листа 10х15 хватает на весь кубик. Пришлось вспоминать молодость и Photoshop.  Мой совет: сначала рисуете, потом пишете код. Вы должны нарисовать все так, чтобы вам было удобно и главное интуитивно понятно.  Вот мой вариант. Пока только две грани. На самом деле рисовать мне гораздо сложнее, чем писать автоматизации. И дело не в умении, а в дурацком перфекционизме.

И только после того как наклейка заняла свое место на кубе можно отлавливать event и делать для них автоматизации.  От себя дополню, что на любой грани двойной удар Double Tap (event: x00x) я назначил на включение (выключение) , чтобы не путаться и у этих триггеров нет условия, поскольку они не повторяются и довольно сложно неправильно стучать кубом. Но это уже на ваше усмотрение. Дальше примеры некоторых автоматизаций. Я выделил самые сложные. 

Включение (выключение) телевизора Sony (для него отведена грань 2) двойной удар:
- alias: Включение телевизора
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 2002
  action:
    - service_template: >
          {% if is_state('media_player.sony_bravia_tv' , 'off') %} 
            media_player.turn_on
          {% else %}
            media_player.turn_off
          {% endif %}
      entity_id: media_player.sony_bravia_tv

Выключение звука телевизора и его обратное включение (переворачиваю кубик, а потом возвращаю обратно)

- alias: Sone TV mute on
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 5002
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Sony TV' 
  action:
     service: media_player.volume_mute
     data:
        entity_id: media_player.sony_bravia_tv
        is_volume_muted: "true"

- alias: Sone TV mute off
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 2005
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Sony TV' 
  action:
     service: media_player.volume_mute
     data:
        entity_id: media_player.sony_bravia_tv
        is_volume_muted: "false"

Громкость телевизора состоит из автоматизации

- alias: Громкость телевизора
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: switch_30
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Sony TV'   
  action:
    service_template: script.tv_volume_{{ 'up' if trigger.event.data.event | int > 0 else 'down' }}

которая запускает скрипты

  tv_volume_up:
    alias: Громкость телевизора UP
    sequence:
      - service: media_player.volume_set
        entity_id: media_player.sony_bravia_tv
        data_template:
          volume_level: '{{ states.media_player.sony_bravia_tv.attributes.volume_level + 0.05 }}'

  tv_volume_down:
    alias: Громкость телевизора DOWN
    sequence:
      - service: media_player.volume_set
        entity_id: media_player.sony_bravia_tv
        data_template:
          volume_level: '{{ states.media_player.sony_bravia_tv.attributes.volume_level - 0.05 }}'

А вотпример автоматизации, для листания избранных каналов

- alias: Sone TV chanel +
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 3002
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Sony TV' 
  action:
     service: media_player.select_source
     data_template:
        entity_id: media_player.sony_bravia_tv
        source: >
            {% if states.media_player.sony_bravia_tv.attributes.source == "Канал 1" %} Канал 2
            {% elif states.media_player.sony_bravia_tv.attributes.source == "Канал 2" %} Канал 3
            {% elif states.media_player.sony_bravia_tv.attributes.source == "Канал 3" %} Канал 4
            {% elif states.media_player.sony_bravia_tv.attributes.source == "Канал 4" %} Канал 5
            {% elif states.media_player.sony_bravia_tv.attributes.source == "Канал 5" %} Канал 1
            {%- else -%}
            {% endif %}  

То же самое и с гранью которая отвечает за свет (у меня это грань 3). Регулировка яркости у меня раздельно для каждого прикроватного светильника, поскольку если работать с группой, то он будет включать второй светильник, ели он выключен, а так будет регулироваться только включенные светильники

- alias: Светильники в спальне яркость Куб
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: switch_30
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Lights'   
  action:
    - service: light.turn_on  
      data_template:
        entity_id: light.lamp_nataliya
        brightness: >
          {%if trigger.event.data.event  | float < 0 and states.light.lamp_nataliya.attributes.brightness | float > 31 %} 
          {{states.light.lamp_nataliya.attributes.brightness| int - 30}}
          {% else %}
          {{states.light.lamp_nataliya.attributes.brightness| int + 30}}
          {%endif %}
    - service: light.turn_on  
      data_template:
        entity_id: light.lamp_stephan
        brightness: >
          {%if trigger.event.data.event  | float < 0 and states.light.lamp_stephan.attributes.brightness | float > 31 %} 
          {{states.light.lamp_stephan.attributes.brightness| int - 30}}
          {% else %}
          {{states.light.lamp_stephan.attributes.brightness| int + 30}}
          {%endif %}

На перевороты кубика на различные грани назначены все возможные варианты освещения. И тут все просто. Как пример:

- alias: Светильник Степан включение Куб
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 1003
  condition:
      - condition: state
        entity_id: input_select.cubemode
        state: 'Lights'   
  action:
    - service_template: >
        {% if is_state('light.lamp_stephan','off') %}
          light.turn_on
        {% else %}
          light.turn_off
        {% endif %}
      data:
        entity_id: light.lamp_stephan

Еще на одной грани у меня Mi box. Но думаю, это уже лишнее. Я просто хотел показать, на что способен Aqara cube при правильном подходе. В настоящее время у меня около 20 команд на трех гранях. Еще три ждут своей очереди. Есть куда расти.

P.S. Ну и напоследок. В чате меня упрекали, что в темноте я ничего не найду и не сделаю..... 

  good_natt:
    alias: Good natt
    sequence:
      - service: androidtv.adb_command
        data:
          entity_id: media_player.mi_box_4
          command: HOME
      - delay:
          seconds: 3
      - service: media_player.turn_off
        entity_id: media_player.sony_bravia_tv
      - delay:
          seconds: 2
      - service: light.turn_off
        entity_id: light.bedroom
      - service: automation.turn_on
        entity_id: automation.temperaturnyi_rezhim_noch

Это скрипт, который запускается подбрасыванием кубика

- alias: Good Natt
  id: cubetest01
  trigger:
    platform: event
    event_type: deconz_event
    event_data:
      id: mi_magic_cube
      event: 7008
  action:
     service: script.good_natt

После этого я кладу куб на прикроватную тумбочку гранью Lights вверх. И если мне вдруг придется вставать среди ночи, я нащупаю куб и.... правильно, постучу им пару раз. 

P.P.S Это моя первая статься, поэтому прошу ногами не бить. С удовольствием выслушаю все замечания и предложения. Работа продолжается.


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

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Дмитрий Батюшин (ReD)
    Дмитрий Батюшин (ReD) 2 месяца назад

    Классная идея. Было-бы хорошо приложить эскизы. 

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

    Мой эскиз. Не законченный, но если ждать законченный то это надолго :)
    https://yadi.sk/i/oTiGSLyEaaml...

  3. Евгений Лузин (EvLuz)
    Евгений Лузин (EvLuz) 2 месяца назад

    Молодца, я хоть и писал про этот куб на портале, что событий много, и в Node Red его задвинул, и наклейки все собирался напечатать, но так до прямой реализации у меня не дошло. А у тебя дело сдвинулось и тем более в ХА.

    Но событий я у него насчитал 51. Точно больше чем около сорока.


    • Stephan Fonderat (Fonderat)
      Stephan Fonderat (Fonderat) 2 месяца назад

      Я еще пересчитал... Получилось 46 вроде. Но это без condition. А с ними из количество не ограничено. 

      • Евгений Лузин (EvLuz)
        Евгений Лузин (EvLuz) 2 месяца назад

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

        • Stephan Fonderat (Fonderat)
          Stephan Fonderat (Fonderat) отредактировано 2 месяца назад

          Естественно. Можно задать с десяток condition и для каждой использовать максимальное количество action. Но тогда использование куба превратится в ад. Нужна золотая середина. Должно быть удобно

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

    Очень круто, спасибо за статью) Таким образом кубик становится действительно универсальным пультом.

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

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

    • Stephan Fonderat (Fonderat)
      Stephan Fonderat (Fonderat) 2 месяца назад

      Ну это очень сложно. Я смотрел на светящиеся фломастеры... Но думаю, на долго их хватать не будет

  6. Stephan Fonderat (Fonderat)
    Stephan Fonderat (Fonderat) 2 месяца назад

    Пока верстался номер...

    Немного подумав, пришёл к выводу, что если мне нужно встать ночью или рано утром, то стучать кубком, когда все спят, не комильфо. Единственный вариант, который доступен в темноте, это движение slide, которое уже занято. Но нет ничего невозможного. Первое движение slide активирует режим light. Второе включает мой светильник при минимальной яркости. Опробовано утром. Работает тихо 😉


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

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

Ноотехника

+375 17 233-25-45
Промокод:
Sprut
Размер скидки:
10%
Действует у всех официальных представителей. Для применение необходимо указать в поле комментария или при звонке менеджеру.

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

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

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

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.
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
30 августа 2019, 07:28
Несколько нетривиальных способов использования датчика открытия окон/дверей от Xiaomi/Aqara.