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