Это обзор основных концепций Automation DSL на Android.
Компоненты автоматизации
Автоматизация состоит из следующих основных компонентов, которые обычно оцениваются в следующем порядке:
- Стартер — определяет начальные условия, которые активируют автоматизацию, например, изменение признака. Автоматизация должна иметь стартер.
- Условие — любые дополнительные ограничения для оценки после активации автоматизации. Выражение в условии должно быть оценено как
true
, чтобы действия автоматизации могли быть продолжены. - Действие — команды или обновления состояния, которые выполняются при выполнении всех условий.
Например, возможно, у вас есть автоматизация, которая приглушает свет в комнате, когда телевизор в этой комнате включен между закатом и восходом солнца. В этом примере:
- Стартер — телевизор был включен, что является изменением состояния характеристики телевизора.
- Условие — оценивается текущее время для дома, в котором находится телевизор.
- Действие — Свет в той же комнате, где находится телевизор, приглушен.
Автоматизация активируется при включении телевизора в комнате, но автоматизация выполняется только в том случае, если выполняется условие «время между закатом и восходом солнца».
Помимо базовой структуры, автоматизации в API Home также содержат метаданные, такие как имя и описание , которые могут использоваться для их идентификации разработчиками и пользователями.
Узлы
В API Home логическая структура автоматизации состоит из узлов . Узлы — это абстрактные, повторно используемые единицы, которые представляют поведение сущностей или потоки выполнения. Каждый узел может иметь входные переменные, а также выходные переменные, которые могут использоваться другими узлами.
Узел | Тип узла | Реализация Котлина | Описание |
---|---|---|---|
Стартер | Поведенческий | StarterNodeDsl | Запускает автоматизацию при изменении состояния признака (любого атрибута). |
StateReader | Поведенческий | StateReaderNodeDsl | Считывает атрибут признака и позволяет зафиксировать его значение для использования в узлах условий. |
Действие | Поведенческий | ActionNodeDsl | Вызывает команды свойств. |
Последовательный | Поток исполнения | SequentialFlow | Выполняет вложенные узлы действий в последовательности. Это поведение выполнения по умолчанию. |
Параллельный | Поток исполнения | ParallelFlow | Параллельно выполняет вложенные узлы действий. |
Состояние | Поток исполнения | ConditionNodeDsl | Условно изменять поток выполнения на основе оценок логических выражений. Условия могут быть связаны со стартером (условия, специфичные для стартера) или быть глобальными (применяться ко всем стартерам). |
Выбирать | Поток исполнения | SelectFlow | Позволяет активировать автоматику более чем одному пускателю. |
Выражение | Ценить | Expression | Может быть значением атрибута признака, константой или литеральным значением и должно иметь вид списка, числа, логического значения или строки. |
Поведенческие узлы
Такие узлы, как стартеры и действия, являются поведенческими узлами. Стартеры активируют автоматизацию на основе изменений атрибутов устройства. Действия выдают команды устройству или обновляют атрибуты.
Поведенческие узлы обычно привязаны к характеристикам устройства и выходным состояниям характеристик для использования в качестве входных данных в других узлах.
Узлы потока выполнения
Некоторые узлы представляют собой потоки выполнения, такие как последовательные и параллельные. Каждый из этих узлов содержит поведенческие узлы, которые определяют автоматизацию.
Например, последовательный поток может содержать узлы, которые выполняются в последовательном порядке. Обычно это стартер, условие и действие.
Параллельный поток может иметь несколько узлов действий, выполняемых одновременно, например, включение нескольких лампочек одновременно. Узлы, следующие за параллельным потоком, не будут выполняться, пока не завершатся все ветви параллельного потока.
Другим типом потока выполнения является поток условий , который может изменять поток выполнения на основе оценки выражения.
Например, возможно, у вас есть автоматизация, которая выполняет действие в зависимости от того, наступила ли ночь. Узел условия проверяет время суток, а затем следует соответствующему пути выполнения на основе этой оценки.
Поток выбора полезен, когда вы хотите иметь более одного стартера, который может активировать вашу автоматизацию. Когда вы включаете два или более стартера в поток select
, любой из стартеров может активировать автоматизацию.
Например, вы можете написать автоматизацию, которая опускает жалюзи на закате, если температура поднимается выше определенного порога или если яркость превышает порог. Три отдельных стартера обрабатывают каждый из этих сценариев, и все три будут обернуты в поток select
.
Вложенные потоки
В сложных автоматизациях узлы потока выполнения также могут быть вложенными. Например, у вас может быть последовательный поток, который выполняет параллельный поток.
Узлы 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
.