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