У нас здесь на портале уже есть схожие статьи связанные с тем, как можно и даже нужно использовать куб от "поднебесного" бренда. Я же преследовал всегда цель использовать кубик в связке Home-Assistant (в дальнейшем ХА или HA) Deconz аналогично тому, как это можно делать, используя девайс из коробки вместе с родными ПО и Mi-шлюзом.
После перехода на Deconz, я неоднократно встречал мнения и комментарии о том, что куб - это непонятное "существо", и как и для чего его использовать - пользователи не могли для себя идентифицировать. Мне всегда это было странно слышать или читать, т.к. это был один из практически первых девайсов, который был приобретен мною еще в 2017м году, наряду с другими тогдашними новичками рынка от Xiaomi. И я всегда “видел” и знал, как хочу его использовать, а главное - использовал!
По разным причинам руки не доходили до полноценной реализации автоматизаций через Deconz, хоть и материал был по этому поводу. Но сложилось так, что до недавнего времени из моих кубиков только один был подключен к Deconz’у и служил на кухне простеньким дополнительным триггером, для включения и выключения всего освещения, тряской или подбрасыванием. Ну и еще умел выключать освещение на балконе: если свет был включен - достаточно было взять кубик в руки, чтобы балконное освещение погасло. На этом все, другие экземпляры трудились через Mi-шлюзы. И да, у них никогда не было "ротейт" (rotate) автоматизаций через ХА, потому что все, что я встречал - не работало так, как мне хотелось.
Сегодня...
В конце прошлой недели на досуге я решил, что хочу полноценно использовать девайс через Deconz, и углубился в мануалы и треды обсуждений. И...? Мне удалось сделать то, чего я всегда хотел от кубика, но теперь и через Deconz. Думаю, что данная небольшая статья поможет приблизиться к использованию этого замечательного девайса в Ваших условиях, а главное, покажет простоту, с которой это реализовывается. Я пройдусь по всем ивентам (действиям), которые предоставляет данный девайс, и приведу еще раз наглядные примеры для полноты использования. Лишним это не будет в любом случае.
Итак, что умеет кубик еще разДвижение по плоскости;переворот на 90 градусов;переворот на 180 градусов;двойной тап (постукивание) по поверхности;тряска в воздухе;вращение на плоскости по часовой и против часовой стрелки;подбрасывание*;просыпание* - это когда Вы берете кубик в руки.
Первые шесть действий - это стандартный набор, который вы получаете из коробки и подключаете девайс к родному шлюзу (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 уже не будет столь непонятным и сложным во внедрении в Ваш Умный Дом.
спасибо за труд. поправьте информацию: действия кубика подбрасывание и просыпание имеются в ха и через родной михаб
Имелось ввиду невозможность этих действий в Mi Home. Но и да, читается не очевидно. Спасибо, сейчас поправлю.
Спасибо за статью познавательно . Ваши автоматизации не учитывают на какой плоскости лежит куб ? Это сильно уменьшает количество возможных команд.
Себе сделал в условие на какой грани лежит куб. как раз из упомянутой статьи. Для себя немного защитился от " дребезга" от ложных срабатываний путем повышения одного условия. Ваше условие не сложнее ?
https://sprut.ai/static/media/cache/00/14/94/5/2857131/51169/1000x_image.jpg?1581271736" alt="1000x_image.jpg?1581271736" />Не за что. Вы не внимательны, в начале статьи я упомянул прямо - что целью являлось использование кубика аналогично нативному ПО. А, что касается учитывания всех граней, это оверцинк для меня. :) И я так же в статье упомянул Стефана и его статью, в которой он приводит как раз таки примеры использование разных событий от всех граней. Рекомендую ознакомиться, если для Вас это приоритет.
Без претензий к вам , еще раз спасибо за труд я, хотел поделится наработанным опытом. В вашем случае если стремление к шлюзному варианту это сложное условия при повороте кубика ничего не дает, убрать его эффект буде тот же. Ваше условие не даст сработать автоматизации при повороте на величину из ряда приведенных . что на самом деле вероятность совпадения из списка мала. В новой версии ДЕКОНЗА это параметр "guesture:" - "жест" заменил многое , что раньше приходилось перечислять а оно у вас и так указано .
Тут у меня он лишний, другими словами его не должно быть. У меня raspbee на котором щас все крутится не выдает жест в собитиях.
По поводу "Ваше условие не даст сработать автоматизации при повороте на величину из ряда приведенных" полностью согласен. Но мне приходилось так делать, потому что поворотом хотелось пользоваться. А проблема была в том, что события от двух датчиков в кубе приходили в Home Assistant с одним идентификатором. Когда я их разделил, эта проверка стала избыточной и попросту мешающей.
А теперь через жесты вообще красота.
Я еще не проверял, конби второй у меня лежит пока без дела, но возможно жесты на нем уже нормально отображаются в событиях, на распи их к сожалению нету. :)
У меня RaspBee, жесты в ассортименте :)
Хм, интересно, а какая у Вас прошивка сейчас? И какой куб? Не зависет ли это от версии куба, ведь есть и акара, не знаю есть ли в них какаета разница. :)
Текущий мой инстанс трудится на:
Да, куб у меня aqara. Но, думаю, важна таки версия Phoscon (API)
На текущем инстансе использую аддон версии 3.9, и версия фоскона 2.05.71 от 17.11.19го. Вижу что конби2 крутится у меня на версии 2.05.72 от 12.12.19го.
Аддон 5.1, v2.05.72
Понял спасибо, еще не дошли руки до апдейта. Обновлюсь апдейтну статью. ;)
О, прямо по моим примерам. Вряд ли это просто совпадение такое.
Как-то кому-то на форуме ХА подсказывал вариант через темплейт-условия ровно в таком виде :)