Концепции Android DSL

Это обзор основных концепций Automation DSL на Android.

Компоненты автоматизации

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

  1. Стартер — определяет начальные условия, которые активируют автоматизацию, например, изменение признака. Автоматизация должна иметь стартер.
  2. Условие — любые дополнительные ограничения для оценки после активации автоматизации. Выражение в условии должно быть оценено как true , чтобы действия автоматизации могли быть продолжены.
  3. Действие — команды или обновления состояния, которые выполняются при выполнении всех условий.

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

  1. Стартер — телевизор был включен, что является изменением состояния характеристики телевизора.
  2. Условие — оценивается текущее время для дома, в котором находится телевизор.
  3. Действие — Свет в той же комнате, где находится телевизор, приглушен.

Автоматизация активируется при включении телевизора в комнате, но автоматизация выполняется только в том случае, если выполняется условие «время между закатом и восходом солнца».

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

Узлы

В API Home логическая структура автоматизации состоит из узлов . Узлы — это абстрактные, повторно используемые единицы, которые представляют поведение сущностей или потоки выполнения. Каждый узел может иметь входные переменные, а также выходные переменные, которые могут использоваться другими узлами.

Таблица: Типы узлов автоматизации
Узел Тип узла Реализация Котлина Описание
Стартер Поведенческий StarterNodeDsl Запускает автоматизацию при изменении состояния признака (любого атрибута).
StateReader Поведенческий StateReaderNodeDsl Считывает атрибут признака и позволяет зафиксировать его значение для использования в узлах условий.
Действие Поведенческий ActionNodeDsl Вызывает команды свойств.
Последовательный Поток исполнения SequentialFlow Выполняет вложенные узлы действий в последовательности. Это поведение выполнения по умолчанию.
Параллельный Поток исполнения ParallelFlow Параллельно выполняет вложенные узлы действий.
Состояние Поток исполнения ConditionNodeDsl Условно изменять поток выполнения на основе оценок логических выражений. Условия могут быть связаны со стартером (условия, специфичные для стартера) или быть глобальными (применяться ко всем стартерам).
Выбирать Поток исполнения SelectFlow Позволяет активировать автоматику более чем одному пускателю.
Выражение Ценить Expression Может быть значением атрибута признака, константой или литеральным значением и должно иметь вид списка, числа, логического значения или строки.

Поведенческие узлы

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

Поведенческие узлы обычно привязаны к характеристикам устройства и выходным состояниям характеристик для использования в качестве входных данных в других узлах.

Узлы потока выполнения

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

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

Последовательные потоки выполнения
Рисунок 1: Последовательный поток автоматизации

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

Параллельные потоки выполнения
Рисунок 2: Параллельный поток автоматизации

Другим типом потока выполнения является поток условий , который может изменять поток выполнения на основе оценки выражения.

Например, возможно, у вас есть автоматизация, которая выполняет действие в зависимости от того, наступила ли ночь. Узел условия проверяет время суток, а затем следует соответствующему пути выполнения на основе этой оценки.

Состояние потока
Рисунок 3: Поток состояний

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

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

Выберите поток
Рисунок 4: Выберите поток

Вложенные потоки

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

Вложенные потоки выполнения
Рисунок 5: Вложенные потоки выполнения

Узлы DSL могут быть вложены и объединены различными способами для удовлетворения ваших конкретных потребностей в соответствии с ограничениями, указанными в следующей таблице. Столбец Builder ссылается на документацию по типобезопасному строителю Kotlin, в которой подробно описано, что разрешено использовать в каждом типе узла.

Таблица: Как можно комбинировать узлы
Узел Может содержать следующий тип узла и данные Должен находиться в пределах одного из следующих типов узлов
Стартер Выражение Выбрать, Последовательный
Ручнойстартер Выбрать, Последовательный
StateReader Выражение (обычно состоит из значения атрибута признака) Действие, Состояние
Действие Команда, Сущность, Выражение Параллельный, Избирательный, Последовательный
Последовательный Параллельный, Избирательный, Последовательный
Параллельный Действие Последовательный
Состояние Выражение Параллельный, Последовательный
Выбирать Состояние, Последовательный, Стартер, Ручной Стартер Последовательный и должен быть первым узлом в потоке.

Автоматизация DSL

В API Home автоматизации определяются с помощью Automation DSL (Domain-Specific Language). Automation DSL реализован как Kotlin DSL (Domain-Specific Language) , с использованием типобезопасных конструкторов Kotlin и специально разработан для определения шаблонов автоматизации.

При компиляции автоматизации типобезопасные конструкторы Kotlin генерируют классы данных Kotlin, которые затем сериализуются в буфер протокола JSON, который используется для выполнения вызовов служб автоматизации Google.

Automation DSL упрощает и оптимизирует процесс автоматизации зданий. Он изначально использует ту же модель данных стандартных черт Matter и черт smart home которые представлены в Device API.

Automation DSL также определяет логику автоматизации в терминах абстрактных типов устройств, в отличие от конкретных экземпляров устройств, расположенных в доме пользователя. Он позволяет разработчику предоставлять входные параметры, которые могут использоваться во время выполнения для указания фактических экземпляров устройств, а также других важных значений параметров.

Синтаксис DSL похож на синтаксис Kotlin и столь же типобезопасен, но автоматизация, написанная на Automation DSL, проще и лаконичнее, чем та же автоматизация, написанная на чистом Kotlin.

Пример

Ниже приведен пример автоматизации, включающей устройство, написанный с использованием Automation DSL:

val automation = automation {
  name = "MyFirstAutomation"
  description = "If light1 is on, turn on light2."
  isActive = true
  sequential {
    val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
    condition() { expression = onOffTrait.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

Эта автоматизация очень проста: когда device1 (светильник) включается (атрибут onOff меняется на true ), отправляется команда on() для включения device2 .

Автоматизация использует sequential узел, что означает, что ее узлы будут работать в последовательном порядке.

В sequential узле находятся поведенческие узлы, такие как starter , condition и action . Выход starter узла назначается переменной для использования в узле condition .