Android의 자동화 DSL의 기본 개념에 관한 개요입니다.
자동화 구성요소
자동화는 일반적으로 다음 순서로 평가되는 기본 구성요소로 구성됩니다.
- 시작 조건 - 특성 변경과 같이 자동화를 활성화하는 초기 조건을 정의합니다. 자동화에는 시작 조건이 있어야 합니다.
- 조건 - 자동화가 활성화된 후 평가할 추가 제약 조건입니다. 자동화의 작업이 진행되려면 조건의 표현식이
true
로 평가되어야 합니다. - 작업: 모든 조건이 충족될 때 실행되는 명령어 또는 상태 업데이트입니다.
예를 들어 일몰과 일출 사이에 방의 TV가 켜지면 방의 조명을 어둡게 하는 자동화가 있을 수 있습니다. 이 예에서는 다음과 같이 정의됩니다.
- Starter - TV가 켜졌습니다. 이는 TV 특성의 상태가 변경된 것입니다.
- 조건: TV가 있는 홈의 현재 시간이 평가됩니다.
- 작동 — TV와 같은 방에 있는 조명이 어두워집니다.
방에 있는 TV가 켜지면 자동화가 활성화되지만, '시간이 일몰과 일출 사이'라는 조건이 충족되는 경우에만 자동화가 실행됩니다.
기본 구조 외에도 Home API의 자동화에는 개발자와 사용자가 자동화를 식별하는 데 사용할 수 있는 name, description과 같은 메타데이터도 포함됩니다.
노드
Home API에서 자동화의 논리적 구조는 노드로 구성됩니다. 노드는 항목 동작이나 실행 흐름을 나타내는 추상적이고 재사용 가능한 단위입니다. 각 노드에는 입력 변수와 다른 노드에서 사용할 수 있는 출력 변수가 있을 수 있습니다.
노드 | 노드 유형 | Kotlin 구현 | 설명 |
---|---|---|---|
Starter | 행동 |
StarterNodeDsl
|
특성의 상태 (속성)가 변경되면 자동화를 시작합니다. |
StateReader | 행동 |
StateReaderNodeDsl
|
특성 속성을 읽고 조건 노드에서 사용할 값을 캡처할 수 있습니다. |
작업 | 행동 |
ActionNodeDsl
|
특성 명령어를 호출합니다. |
순차 | 실행 흐름 |
SequentialFlow
|
중첩된 작업 노드를 순서대로 실행합니다. 이는 기본 실행 동작입니다. |
Parallel | 실행 흐름 |
ParallelFlow
|
중첩된 작업 노드를 병렬로 실행합니다. |
조건 | 실행 흐름 |
ConditionNodeDsl
|
논리 표현식 평가에 따라 실행 흐름을 조건부로 변경합니다. 조건은 시작 조건과 연결되거나 (시작 조건별 조건) 전역적일 수 있습니다 (모든 시작 조건에 적용). |
선택 | 실행 흐름 |
SelectFlow
|
두 개 이상의 시작 조건이 자동화를 활성화할 수 있습니다. |
표현식 | 값 |
Expression
|
특성의 속성 값, 상수 또는 리터럴 값일 수 있으며 목록, 숫자, 불리언 또는 문자열로 평가되어야 합니다. |
행동 노드
시작 조건 및 작업과 같은 노드는 동작 노드입니다. 시작 조건은 기기 속성 변경에 따라 자동화를 활성화합니다. 작업은 기기 명령어를 실행하거나 속성을 업데이트합니다.
동작 노드는 일반적으로 기기 특성과 출력 특성 상태에 연결되어 다른 노드에서 입력으로 사용됩니다.
실행 흐름 노드
일부 노드는 순차 및 병렬과 같은 실행 흐름을 나타냅니다. 이러한 각 노드에는 자동화를 정의하는 동작 노드가 포함됩니다.
예를 들어 순차 흐름에는 순차적으로 실행되는 노드가 포함될 수 있습니다. 일반적으로 시작 조건, 조건, 작업이 이에 해당합니다.
병렬 흐름에는 동시에 실행되는 여러 작업 노드가 있을 수 있습니다. 예를 들어 여러 조명을 동시에 켤 수 있습니다. 병렬 흐름을 따르는 노드는 병렬 흐름의 모든 브랜치가 완료될 때까지 실행되지 않습니다.
또 다른 유형의 실행 흐름은 표현식 평가에 따라 실행 흐름을 변경할 수 있는 조건 흐름입니다.
예를 들어 밤인지 여부에 따라 작업을 실행하는 자동화가 있을 수 있습니다. 조건 노드는 시간을 확인한 다음 평가에 따라 적절한 실행 경로를 따릅니다.
흐름 선택은 자동화를 활성화할 수 있는 스타터가 두 개 이상인 경우에 유용합니다. select
흐름에 두 개 이상의 시작 조건을 포함하면 시작 조건 중 하나가 자동화를 활성화할 수 있습니다.
예를 들어 온도가 특정 기준을 초과하거나 밝기가 기준을 초과하는 경우 일몰 시 블라인드를 내리는 자동화를 작성할 수 있습니다. 세 가지 별도의 스타터가 각 시나리오를 처리하며 이 세 가지 모두 select
흐름으로 래핑됩니다.
중첩된 흐름
복잡한 자동화에서는 실행 흐름 노드를 중첩할 수도 있습니다. 예를 들어 병렬 흐름을 실행하는 순차적 흐름이 있을 수 있습니다.
DSL 노드는 다음 표에 설명된 제약 조건에 따라 특정 요구사항을 충족하기 위해 다양한 방식으로 중첩되고 결합될 수 있습니다. 빌더 열은 Kotlin 타입 세이프 빌더 문서로 연결되며, 여기에는 각 노드 유형에서 사용할 수 있는 항목이 자세히 설명되어 있습니다.
노드 | 다음 노드 유형과 데이터를 포함할 수 있습니다. | 다음 노드 유형 중 하나에 있어야 합니다. |
---|---|---|
Starter | 표현식 | 선택, 순차 |
ManualStarter | 선택, 순차 | |
StateReader | 표현식 (일반적으로 특성 속성 값으로 구성됨) | 작업, 조건 |
작업 | 명령어, 항목, 표현식 | Parallel, Select, Sequential |
순차 | Parallel, Select, Sequential | |
Parallel | 작업 | 순차형 |
조건 | 표현식 | Parallel, Sequential |
선택 | 조건, 순차, 시작 조건, ManualStarter | 순차적이며 흐름의 첫 번째 노드여야 합니다. |
자동화 DSL
Home API에서 자동화는 자동화 DSL(도메인 특정 언어)을 사용하여 정의됩니다. 자동화 DSL은 Kotlin 유형 안전 빌더를 사용하여 Kotlin DSL (도메인별 언어)로 구현되며 자동화 템플릿을 정의하도록 특별히 설계되었습니다.
자동화가 컴파일되면 Kotlin 유형 안전 빌더가 Kotlin 데이터 클래스를 생성하고, 이 클래스는 프로토콜 버퍼 JSON으로 직렬화됩니다. 이 JSON은 Google의 자동화 서비스에 대한 호출을 만드는 데 사용됩니다.
자동화 DSL은 자동화 빌드 프로세스를 간소화하고 능률화합니다. 기기 API에 나온 Matter 표준 특성 및 smart home 특성의 동일한 데이터 모델을 기본적으로 사용합니다.
또한 자동화 DSL은 사용자의 집에 있는 특정 기기 인스턴스가 아닌 추상 기기 유형 측면에서 자동화의 로직을 정의합니다. 이를 통해 개발자는 런타임에 실제 기기 인스턴스와 기타 중요한 매개변수 값을 지정하는 데 사용할 수 있는 입력 매개변수를 제공할 수 있습니다.
DSL 구문은 Kotlin과 유사하고 유형 안전성도 동일하지만, 자동화 DSL로 작성된 자동화는 순수 Kotlin으로 작성된 동일한 자동화보다 더 간단하고 간결합니다.
예
다음은 자동화 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
로 변경됨) device2
을 켜는 on()
명령어를 전송합니다.
자동화는 sequential
노드를 사용하며, 이는 노드가 순차적으로 실행됨을 나타냅니다.
sequential
노드 내에는 starter
, condition
, action
과 같은 동작 노드가 있습니다. starter
노드의 출력은 condition
노드에서 사용할 변수에 할당됩니다.