Aqara Magic Cube & ZHA: управление яркостью ламп

29 января, 2021Изменена: 3 февраля, 2021 в 09:29

У меня в использовании (на момент написания заметки) есть два ZigBee\BLE шлюза Xiaomi Gateway 3, оба интегрированы в ХА с помощью прекрасного компонента от AlexxIT.
При этом один из них уже достаточно давно работает в режиме Mi Home, а вот второй я решил попробовать использовать в режиме ZHA.


И с этого момента мне пришлось познакомиться с концепцией устройств (devices) в ХА.
Основной момент который поначалу ввел меня в ступор – отсутствие привычных мне объектов (entity), их состояний (states) и атрибутов (attribute). Т.е. всего того, что можно найти на странице developer-tools/state.
По задумке, данная модель подразумевает использование исключительно веб-интерфейса ХА для составления автоматизаций, скриптов и прочих вещей, а наличие в интерфейсе выбора возможностей устройства лежит на плечах авторов компонента, который это устройство добавляет.
Мне же больше по душе YAML, поэтому захотелось найти способ использовать именно его.
Для экспериментов я выбрал кубик Aqara (как самый бесполезный из моих устройств) и решил сделать с его использованием автоматизацию.

Смысл автоматизации состоит в изменении яркости лампы в соответствии с величиной угла, на который поворачивается кубик.
Повернул вправо на 123 градуса – увеличил яркость на 123 единицы, повернул влево на 43 – уменьшили на 43.
Все достаточно просто.

Для начала стоит посмотреть как строится автоматизация на основе объектов (или сущностей) и их состояний.

- alias: Aqara Cube Rotate
  mode: queued
  max: 5
  max_exceeded: silent
  trigger:
    platform: state
    entity_id: sensor.0x158d0005292ad9_action
    to: 'rotate'
  action:
    - service: light.turn_on
      data_template:
        entity_id: light.0x86bd7fffe616b72_light
        brightness: >-
          {{ (state_attr('light.0x86bd7fffe616b72_light', 'brightness') | int) +
          (state_attr('sensor.0x158d0005292ad9_action', 'angle') | int) }}

Все необходимые для триггера параметры можно найти в developer-tools, все коротко и ясно.

Дальше вариант с триггером по device_id.
Такой формат в принципе не предназначен для написания руками, это то, что генерит в итоге веб-интерфейс (немного измененный руками уже после).

- alias: Aqara Cube Rotate
  mode: queued
  max: 5
  max_exceeded: silent
  trigger:
    - device_id: 1b77e179c20997a9730f634809b9853d
      domain: zha
      platform: device
      type: device_rotated
      subtype: right
    - device_id: 1b77e179c20997a9730f634809b9853d
      domain: zha
      platform: device
      type: device_rotated
      subtype: left
  action:
    - service: light.turn_on
      entity_id: light.0x86bd7fffe616b72_light
      data:
        brightness: >-
          {{ (state_attr('light.0x86bd7fffe616b72_light', 'brightness') | int) +
          (trigger.event.data.args.relative_degrees | int) }}

Параметры type и subtype можно узнать в веб-интерфейсе создания автоматизации, переключив его в YAML.
Не удобно, но девайсы в целом и ZHA в частности заточены под веб.

Но, так же есть и еще один способ – триггер по событию (event):

- alias: Aqara Cube Rotate
  mode: queued
  max: 5
  max_exceeded: silent
  trigger:
    - platform: event
      event_type: zha_event
      event_data:
        device_ieee: "00:15:8d:00:05:29:2a:d9"
        command: "rotate_left"
    - platform: event
      event_type: zha_event
      event_data:
        device_ieee: "00:15:8d:00:05:29:2a:d9"
        command: "rotate_right"
  action:
    - service: light.turn_on
      entity_id: light.0x86bd7fffe616b72_light
      data:
        brightness: >-
          {{ (state_attr('light.0x86bd7fffe616b72_light', 'brightness') | int) +
          (trigger.event.data.args.relative_degrees | int) }}

Здесь все немного более интересно =)
В случае с ZHA, найти необходимые эвенты и посмотреть их параметры можно на странице developer-tools/event, подписавшись на zha_event:

После нажатия на кнопку подписаться, ниже начнут появляться события, которые создают устройства подключенные через ZHA.

Если покрутить кубик туда-сюда, будут появляться такие сообщения:

{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "00:15:8d:00:05:29:2a:d9",
        "unique_id": "00:15:8d:00:05:29:2a:d9:3:0x000c",
        "device_id": "1b77e179c20997a9730f634809b9853d",
        "endpoint_id": 3,
        "cluster_id": 12,
        "command": "rotate_left",
        "args": {
            "relative_degrees": -116.16000366210938
        }
    },
    "origin": "LOCAL",
    "time_fired": "2021-01-28T11:01:44.495696+00:00",
    "context": {
        "id": "9f1e70fbbfd7bef8ea3bf1c9b3438291",
        "parent_id": null,
        "user_id": null
    }
}
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "00:15:8d:00:05:29:2a:d9",
        "unique_id": "00:15:8d:00:05:29:2a:d9:3:0x000c",
        "device_id": "1b77e179c20997a9730f634809b9853d",
        "endpoint_id": 3,
        "cluster_id": 12,
        "command": "rotate_right",
        "args": {
            "relative_degrees": 55.959999084472656
        }
    },
    "origin": "LOCAL",
    "time_fired": "2021-01-28T11:00:29.404901+00:00",
    "context": {
        "id": "5c1be2dd60c5890b3ae42310484312b8",
        "parent_id": null,
        "user_id": null
    }
}

Здесь видны все данные которые есть в событии и на основе которых можно строить автоматизации.
В примере выше триггер срабатывает при наличии в событии определенных device_id и command, но можно использовать любые свойства и их комбинации.
В действии (action) используется атрибут relative_degrees, получить который можно через обращение к trigger.event.data.args.relative_degrees.